本帖最后由 skyzhishui 于 2020-1-7 23:37 编辑
PS:目前这个项目已经停止更新,改用较为完善的插件形式接入,详见:https://bbs.hassbian.com/thread-8307-1-1.html
--------------------------------------------------------------------------------
去年家里装修准备折腾一下智能家居的东东,当时被lifesmart家的中央空调智控器的支持和流光开关的颜值吸引,陆续续续买了很多他们家的配件。同时也接触到了hass平台,在网上找了一些教程看得云里雾里,一直没能入门。前段时间发现lifesmart也有自己的开放平台了,但是因为对home assistant还处于半入门状态,目前采用了一个曲线办法将lifesmart接入hass,可以实现一些简单的交互。过程比较曲折,在这里分享一下,当做抛砖引玉吧。
一、申请lifesmart开发者账号并添加应用
通过lifesmart开放平台http://www.ilifesmart.com/open申请账号,并添加应用。
随便填一填就可以,大概一到两周,可以申请下来,得到appkey和apptoken。
二、对lifesmart的api接口进行封装
其实就是.netcore写了一个webapi对lifesmart的api接口进行二次封装(不怎么会python),接受设备状态变动事件,更新设备状态缓存。最初写这个的目的是为了对接domoticz,这里hass也能用。
需要部署一下环境,我把服务打包成了docker镜像:skyzhishui/moguhomeapi:v0.0.1
部署时需另外准备一套mysql数据库用于存放用户token和设备列表之类的,启动容器的一般配置:
docker run -itd \
--name=homeapi \
-e TZ=Asia/Shanghai \
-e MYSQL_HOST=<mysql数据库ip> \
-e MYSQL_USER=<mysql数据库用户名> \
-e MYSQL_PWD=<mysql数据库用户密码> \
-e MYSQL_DATABASE=<mysql数据库名> \
-e HOME_URL=<认证回调url格式:http://服务器ip:服务端口/api/home> \
-e APP_KEY=<申请到的appkey> \
-e APP_TOKEN=<申请到的apptoken> \
-e MY_TOKEN=<可以自定义> \
-p 5000:5000 \
--restart unless-stopped \
skyzhishui/moguhomeapi:v0.0.1
启动后会自动建这几张表
第一次使用前需要进行初始化,在浏览器访问http://服务器ip:5000/api/init,会跳转到lifesmart的应用授权界面,这里登陆你的lifesmart用户名和密码就可以。
点击登陆后会自动跳转到之前设置的回调url+参数,如果url无法打开,可以把url的地址部分改成服务器的内网ip:端口再访问。页面返回ok则表示已经初始化成功,完成后最好重启一下容器。
三、hass的对接
做了几个最基础的环境感应器和开关的栗子
环境感应器选用RESTful Sensor,参考的官方范例,<>中的内容改成你自己的。me、idx值和说明可以在mysql中的devices表和官方设备属性文档中查询到。
sensor
- platform: rest
name: room_sensors
resource: http://<api服务器ip:端口>/api/getjson?me=<设备me属性>&mytoken=<MY_TOKEN>
json_attributes:
- T
- V
- Z
- H
value_template: 'OK'
- platform: template
sensors:
room_temperature:
friendly_name: '室内温度'
value_template: '{{ states.sensor.room_sensors.attributes["T"]["v"] }}'
device_class: temperature
unit_of_measurement: '°C'
room_humidity:
friendly_name: '室内湿度'
value_template: '{{ states.sensor.room_sensors.attributes["H"]["v"] }}'
device_class: humidity
unit_of_measurement: '%'
room_illuminance:
friendly_name: '室内光照'
value_template: '{{ states.sensor.room_sensors.attributes["Z"]["v"] }}'
device_class: illuminance
unit_of_measurement: 'lux'
room_battery:
friendly_name: '感应器电量'
value_template: '{{ states.sensor.room_sensors.attributes["V"]["v"] }}'
device_class: battery
unit_of_measurement: '%'
大概是这个样子。
开关使用的Command line Switch实现,基于官方范例
switche
platform: command_line
switches:
light_xuanguan:
friendly_name: '玄关灯'
command_on: 'curl -k "http://<api服务器ip:端口>/api/set?me=<设备me属性>&idx=<设备idx属性>&type=0x81&val=1&mytoken=<MY_TOKEN>"'
command_off: 'curl -k "http://<api服务器ip:端口>/api/set?me=<设备me属性>&idx=<设备idx属性>&type=0x80&val=0&mytoken=<MY_TOKEN>"'
command_state: 'curl -k --silent "http://<api服务器ip:端口>/api/getinfo?me=<设备me属性>&idx=<设备idx属性>&mytoken=<MY_TOKEN>"'
value_template: '{{ (value_json.type%2) == 1 }}'
因为开关的状态更新是通过lifesmart的event来实现,有时候更新会没那么及时,待优化。
附一个电动窗帘的配置,使用是command line cover,不过只能实现开关,还没学会hass怎么弄按照百分比开关窗帘。
cover
- platform: command_line
covers:
keting_cover:
friendly_name: '客厅窗纱'
command_open: 'curl -k "http://<api服务器ip:端口>/api/set?me=<设备me属性>&idx=P2&type=0xCF&val=100&mytoken=<MY_TOKEN>"'
command_close: 'curl -k "http://<api服务器ip:端口>/api/set?me=<设备me属性>&idx=P2&type=0xCF&val=0&mytoken=<MY_TOKEN>"'
command_stop: 'curl -k "http://<api服务器ip:端口>/api/set?me=<设备me属性>&idx=P2&type=0xCE&val=0x80&mytoken=<MY_TOKEN>"'
command_state: 'curl -k --silent "http://<api服务器ip:端口>/api/getinfo?me=<设备me属性>&idx=P1&mytoken=<MY_TOKEN>"'
value_template: "{{ value_json.val }}"
上面是我目前把lifesmart接入到hass中的思路,算比较笨的办法,比较熟悉python的大神可以自己写插件,期待分享。
|