|
把sonoff和温湿度传感器接入homekit以后就开始研究如何把空调也完整的接入homekit(支持模式控制,温度调整),爬墙找到了很多资料,多数都是通过小米空调伴侣和博联黑豆做“桥”接入可控制温度和模式的,或者通过lirc只能控制开关无法控制模式和温度,,,然而我只是想控制个空调,,,不想破费一百大洋去买个那玩意,最终经过研究找出解决方案,电子市场购买一只红外发射二极管和一只红外接收管 共花费三块钱。
此处非常感谢@893399065的https://bbs.hassbian.com/thread-887-1-1.html帖子,在前期给予了我很大的参考。不过那个帖子里面方法只能连接到hass 无法以空调climate组件形式连接到homebridge上,进而也不能通过homekit进行控制。
关于lirc的设置和安装,空调码的录制 可参考上面的帖子。
思路:通过翻看home-assistant.io官网的components库,找到了一个叫做”MQTT HAVC“的组件,然后用俩小时时间研究了一下node.js和MQTT协议,用MQTT做桥 在树莓派上跑一个node.js的mqtt客户端去控制shell发送irsend命令,从而完整的控制空调模式和温度,由于风速等在homekit上还暂时不支持,所以也就没写进脚本内。由于是以climate组件形式接入homeassistant的,所以可以直接通过homebridge进行homekit做完整控制。这个组件目前工作在optimistic mode,so他不从mqtt客户端获取状态更改,所有操作他会记住并默认操作成功。(反正红外遥控发出去信号了也反馈不了是否执行成功了,所以这个也无所谓)
先说一下脚本大概结构,订阅mqtt的study/ac/mode/set和study/ac/temperature/set主题,分别接收模式和温度设置。
如果接收到的mqtt消息为heat/cool/auto/idle(模式选择) 那么就把对应状态写入mode0,并且irsend他们对应我所设置的空调码(这个空调码里面是带有温度信息的,根据自己的需求更改,比如heat你想打开时候默认24度 那么就把24度heat模式的空调码的控制KEY写入替代下面的“KEY_I" 以此类推
if (payload === 'heat') {
console.log(`Now Mode '${payload}'`)
mode0 = "heat";
spawn('irsend', ['SEND_ONCE', 'ac', 'KEY_I'])
}
关于温度设定,假设如果接收到的mqtt消息为17.0,那么首先会查询mode0的信息,如果mode0= heat 那么就执行heat17.0的irsend,如果mode0=cool 那么就执行cool17.0的irsend,以此类推,诸位用的时候把对应温度和状态的irsend参数写入对应的位置替代掉我的KEY和BTN,我感觉我的脚本写的蛮通俗易懂也蛮臃肿的,用了好多if elseif套着if,所以诸位应该都能看懂,,,,当然如果有哪位大神能通过我的想法精简一下我的脚本,俺也不胜感激。如果你的空调控制范围不是17~30度,那么你要根据需要增减脚本里面判断温度数值的语句。
mqtt用户名和密码改成你自己的,hostname如果不是跑在本机上的根据你的需要更改,我是用树莓派本机跑的所以就127.0.0.1
别忘记npm install mqtt
最后node aircon.js
用screen在后台开一个窗口执行,这样就不受关掉ssh窗口的影响了。
homeassistant里面添加组件
climate: - platform: mqtt name: Study modes: - off - cool - heat mode_command_topic: "study/ac/mode/set" temperature_command_topic: "study/ac/temperature/set"
但是homeassistant里面climate组件貌似不太好用,功能那么多也用不上(其实是懒,因为多一个功能就要把这个功能对应所有温度和模式的空调码录一遍) 调温度调完要等好几秒才会反馈给mqtt,所以在homeassistant里面的控制我还是使用@893399065的方式进行控制。
最后放上效果图
不过另外还有个问题想问一下有么有大神能搞定,主页那Home下面显示的简介,Bedroom空调温度能不能不让他显示在简介里面?或者把Outside的温度传感器数据放上去?有没有大神知道这个是哪里设置的问题?
|
评分
-
查看全部评分
|