ESP8266的奇妙冒险
搬了新家,终于有地方给我折腾智能家居叻。 在哼哧哼哧装上智能门锁(HomeKit),智能开关(TPLINK),智能插座(某不知名品牌)后,看着手上三个不同控制方式的智能家居配件,我不禁陷入沉思,你们这是给爷整三国演义呢?有没有办法一统天下呢...
HomeBridge
Google找到了HomeBridge,用来模拟Hub,让几乎任何设备可以接入Apple HomeKit生态。
基本原理大概是
iPhone -> HomeHub (HomePod/iPad/AppleTV都可以充当这个Hub的角色) -> HomeBridge(需要一个设备跑HomeBridge Server)-> 各种智能家居配件
HomeBridge靠各种开源HomeBridge插件来实现对智能家居配件的控制。
Note: 插件大概能分两种,一种是platform,针对平台,一种是accessory,基本就是单独支持各个单独配件。
部署HomeBridge
你需要一台设备来充当HomeBridge的Host,网上用树莓派的比较多,奈何我没买。另外一个好选择是旧安卓手机+LinuxDeploy。 LinuxDeploy基本原理就是靠chroot在安卓上实现一个类似docker的效果(当然原理不同于docker)。LinuxDeploy设置还算简单,建议参考官方文档。
HomeBridge的安装我这里就不复读了,因为官方文档写的还行 -> https://homebridge.io/
homebridge-tplink-smarthome
市场上很常见的TPLINK Kasa产品线,接入TPLINK的平台。这个HomeBridge插件的配置十分简单,因为这个插件属于Platform类型的,你甚至不需要什么配置,用TPLINK原装app配置好插座,就直接在Platforms 数组下面加入一个TplinkSmarthome 的Entry直接就能用了。原理应该是自动扫描局域网里有开特殊端口的设备(9999?)直接运行命令了(虽然听起来不太安全,但是胜在方便了)。
"platforms": [
{
"platform": "TplinkSmarthome",
"name": "TplinkSmarthome"
}
],
homebridge-tuya-web
涂鸦智能家居平台的插件,原理是模拟登陆你的账号,读取账号内所有智能家居设备添加到HomeKit。使用也很简单,在Config里输入你的账号密码就完事了。
{
"platform": "TuyaWebPlatform",
"name": "TuyaWebPlatform",
"options":
{
"username": "yjspn@gmail.com",
"password": "114514",
"countryCode": "1",
"platform": "tuya",
"pollingInterval": 20
}
}
Note :我一开始根本不知道我N年前上亚马逊捡便宜垃圾捡来的的神秘wifi插座到底是什么鬼平台的,只知道他用Smart Life这个App来配置。网上一查居然是涂鸦平台。所以所有使用Smart Life平台的都算是涂鸦的设备。
Note 2 : 涂鸦平台的iOS App有两个,一个叫Tuya Smart,一个叫Smart Life,两个App支持的智能家居配件都一样,但是数据不互通。另外千万记住一点,尽量不要使用第三方Oauth来创建账号,不然这个插件就无法用邮箱登陆(因为真实的登陆username并非你的邮箱)
用来配置的App不同,需要修改platform参数,tuya smart app对应tuya, smartlife 对应smart_life。
Tuya-convert && Tasmota
终于来到了重点。用了两天homebridge-tuya-web之后我发现这玩意实在是有点拉胯(带着整个HomeBridge一起全家齐齐整整Not responding),毕竟是多隔了一个平台,不像隔壁TPLINK的配件直接本地就能连接。那么有什么办法能绕过涂鸦的平台呢。
答案是天下苦tuya久矣,有壮士搞出了Tuya-convert,把tuya设备刷成第三方固件....因为大多数tuya平台的配件们都是基于ESP8266的,对于这个平台我们有更好的开源选择:Tasmota。当然ESP8266的第三方固件还有其他选择,Tasmota算是其中比较有名(有苦力维护)的。
Tuya-convert的基本原理是模拟tuya设备维护用的AP,在快速闪烁的配对模式中,tuya设备会默认连接到这个AP并且请求OTA升级,于是就会刷入我们指定的固件。
要使用tuya convert首先你需要能当AP用的无线网卡但是俺寻思是个网卡都行。
刷写过程也不复读了,官方指南写的很明白。
https://github.com/ct-Open-Source/tuya-convert
Tasmota 救砖
成功之后会有一个Tasmota-XXX 的AP出现,随便用点什么连上去会跳到设置界面让你连接到Wifi。在我走这一步的时候,不知道是出了什么神秘错误,保存重启之后我的智能插头直接砖了,路由器里也找不到对应设备。有可能是我密码错误之类的问题,但是事已至此,就得想想怎么救砖了。
Tasmota硬重置:
https://tasmota.github.io/docs/Device-Recovery/
- 长按40秒电源键。在我的情况下这个无效。
- Fast Power Cycle Device Recovery:断电30秒,快速开关电源6次,第七次的时候停住。
重置完成之后我们又找回了Tasmota-XXX这个AP。 设置连接信息重启后,应该能够在局域网里找到这个设备了。
快速扫一扫80端口基本就能找到了: nmap -n -Pn 192.168.50.1/24 -oG - -p80|grep 'open'
Tasmota设置
因为ESP8266有16PIN的GPIO,能玩出很多花样。不同的硬件mapping不同。因为Tasmota是一个通用固件,所以需要一些设置才能正常使用。不同设备需要不同的Template,这个也可以自己制作,但是比较幸运的是我的设备能在 Templates 里面找到:
https://github.com/arendst/Tasmota/blob/development/TEMPLATES.md
或者 https://templates.blakadder.com/ 都可以找到相关的配置文件。
找到对应的配置文件之后,打开Tasmota WebUI,Configuration -> Configure Other -> Template里面填入Template Json。选中Activate,自动重启后就可以激活对应设备的完整功能了。
Tasmota & HomeBridge Integrtaion
费了半天周折,不就是为了HomeBridge么,所以Tasmota和HomeBridge的整合应该很容易的吧?....并没有,你想多了。
Tasmota支持很多协议,最通用的应该就是MQTT,另外还有一个好使的是Web协议。
Web协议
在应用完Template之后,我们就应该能靠Tasmota的WebUI完成大多数操作了,f12一下就发现他的操作还蛮简单的(废话一个开关能复杂到哪里去...) 这里利用一个现成的插件https://github.com/Supereg/homebridge-http-switch
来简单的整合一下就能利用Tasmota的Web协议了。
{
"accessory": "HTTP-SWITCH",
"name": "master-bedroom-plug",
"switchType": "stateful",
"onUrl": "http://192.168.50.98/?m=1&o=1",
"offUrl": "http://192.168.50.98/?m=1&o=1",
"statusUrl": "http://192.168.50.98/?m=1",
"statusPattern" : "ON",
"debug" : true
},
当然这个方法的问题也很大,因为如果配件换了个IP就得重新配置,目前暂时还没有自动扫描Tasmota设备的HomeBridge的插件。而且Tasmota官方的Web协议相关信息也不多。以后我可能会做一个HomeBridge的自动扫描的Platform插件来方便这一过程。
MQTT
Tasmota官方是推荐使用MQTT协议的。注意一点,MQTT需要一个Broker。这个就把他host在HomeBridge同一个地方就好了。
设置完mosquito服务器之后,需要在Tasmota的WebUI里也设置一下相关的连接信息。
官方教程: https://tasmota.github.io/docs/MQTT/
都测试完成之后应该要能在Log里看见类似的信息
00:00:05 HTP: Web server active on master-bedroom-plug-3879 with IP address 192.168.50.98
01:35:22 MQT: Attempting connection...
01:35:27 MQT: Connect failed to 192.168.50.218:1883, rc -2. Retry in 10 sec
01:35:38 MQT: Attempting connection...
01:35:38 MQT: Connected
01:35:38 MQT: tele/master-bedroom-plug/LWT = Online (retained)
01:35:38 MQT: cmnd/master-bedroom-plug/POWER =
01:35:38 MQT: tele/master-bedroom-plug/INFO1 = {"Module":"HS108A","Version":"8.4.0(tasmota)","FallbackTopic":"cmnd/DVES_414F27_fb/","GroupTopic":"cmnd/tasmotas/"}
可以用mqtt-cli (安装方式: https://hivemq.github.io/mqtt-cli/docs/installation/packages.html) 来测试一下连通性。
mqtt pub --topic stat/master-bedroom-plug/POWER -m ON -h 192.168.50.218 -p 1883 -V 3
附上我的配置。
{
"accessory": "mqttthing",
"type": "switch",
"name": "master-bedroom-plug",
"topics":
{
"getOn": "stat/master-bedroom-plug/POWER",
"setOn": "cmnd/master-bedroom-plug/POWER"
},
"integerValue": "false",
"onValue": "ON",
"offValue": "OFF"
}