低成本打造可以接入Home Assitant万能遥控器的坎坷之路

2019-08-14 10:13:12 58点赞 461收藏 46评论

本篇内容来自#智能生活改造计划#有奖征稿活动。无论你是在智能家居改造路上遇到疑问的玩家,还是擅长折腾智能家居的大神,都欢迎参与投稿,和站内值友一起开启技术宅的幸福生活。>点击了解详情

天真的愿景

前段时间我有幸在众测活动中成功申请了一款邦先生电动晾衣机M50。这款晾衣机用起来还是很方便的,自带的无线开关采用的就是射频遥控。可惜的是这款晾衣机没有接入米家智能家居平台,让我总觉得缺了点什么。因此,我最开始是想要DIY一个可以接入HomeAssistant的,并支持天猫精灵语音控制的万能射频遥控器

然而想法是美好的,现实是残酷的。在折腾的过程中,我遇到了一个又一个问题。按照之前我折腾树莓派和Arduino的经验,道路虽然曲折但也总会成功。可是,这次由于没有足够的研究时间以及本身能力有限相关知识匮乏,使得我不能解决这些问题,且一再降低对原有目标的要求。最终,依然没有完全完成既定的目标,算是一次失败的尝试。本文的目的,一方面是记录一下折腾的过程中,相对有意义的部分。另一方面,如果读者中有过相同经验的朋友,希望能够给予相应的指导。

简单来讲,这次DIY的目的,就是用声音控制电动晾衣机升降、停止、灯光。因为我之前有过借助天猫精灵控制其他家中非智能家电的经验,因此我这次依然采用Home Assistant和天猫精灵相结合的语音控制方案。Home Assistant将运行于我的树莓派Mode 3B上。射频遥控器方面,我了解到邦先生晾衣机采用的是433MHz的射频信号。因此,我需要一对433MHz超再生高频率收发模块。射频控制器我选择了价格低廉的ESP8266开发板,自带WIFI模块的它可以很容易跟Home Assistant进行交互。按照我最初的设计,不考虑树莓派的成本的话,ESP8266开发板加上433MHz超再生高频率收发模块,价格一共才十几元。相比市面上常见的射频万能遥控器便宜多了。而实际上,事情远远没有我想的那么简单。下面,我将按照我折腾的时间顺序,讲述一下我的具体实现过程,看看我是怎么样从信心满满到坠入深渊的。

看似的美好

最初的一切都很顺利,因此我本以为这是一次很轻松的折腾之旅。

Home Assistant的安装

第一步先从简单的开始。Home Assistant的安装方法有很多,根据官方文档的推荐,Hass.io、Hassbian、Docker都是推荐的安装方式。但是,根据我个人习惯,我更喜欢在树莓派的官方系统Raspbian下,通过命令行的方式在Python虚拟环境venv中进行安装。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

树莓派的最新官方系统Raspbian Buster中已经具备了安装Home Assistant的Python环境,这就使得一切变得更为简单了。如果你安装的是其他Linux发新版,则需要运行以下命令安装相关依赖。



$ sudo apt-get install python3 python3-venv python3-pip libffi-dev libssl-dev autoconf



为了能使后面的安装避免因网络问题而失败,建议修改Python源。具体方法如下为修改配置文件



$ nano ~/.pip/pip.conf



添加以下内容



[global]

index-url = https://pypi.mirrors.ustc.edu.cn/simple/

[install]

trusted-host = pypi.mirrors.ustc.edu.cn



然后,增加一个专门运行Home Assistant的用户,用户名为homeassistant。



$ sudo useradd -rm homeassistant -G dialout,gpio,i2c



创建Home Assistant安装目录,并修改目录的用户和用户组。



$ cd /srv

$ sudo mkdir homeassistant

$ sudo chown homeassistant:homeassistant homeassistant



接着,切换到新创建的homeassistant用户,并创建安装Home Assistant的虚拟环境。



$ sudo -u homeassistant -H -s

$ cd /srv/homeassistant

$ python3 -m venv .

$ source bin/activate



在激活的虚拟环境中安装Home Assistant的Python依赖。



(homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ python3 -m pip install wheel



完成后,在此环境中安装Home Assistant。



(homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant



安装过程可能需要持续一段时间,如果一切顺利安装成功后,执行下面的命令就可以成功启动Home Assistant。



(homeassistant) $ hass



在局域网内任何一台设备上访问http://ipaddress:8123就可以看到Home Assistant的界面了。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

这种安装方法Home Assistant的配置文件存放于如下位置。



/home/homeassistant/.homeassistant



Home Assistant的版本更新频繁,如果需要更新需要执行以下命令。



$ sudo -u homeassistant -H -s

$ source /srv/homeassistant/bin/activate

$ pip3 install --upgrade homeassistant



Home Assistant的自启动,需要借助init.d创建一个新的启动脚本。



$ cd /etc/init.d/

$ nano hass-daemon



填入此链接中https://www.home-assistant.io/docs/autostart/init.d/,PYTHON VIRTUAL ENVIRONMENT的内容。然后修改脚本的可执行权限,并安装此服务到系统中。



$ sudo chmod +x /etc/init.d/hass-daemon

$ sudo service hass-daemon install



这样以来,我们重启树莓派后Home Assistant就会自动运行了。

MQTT的安装与配置

虽然我之前也经常玩Home Assistant,但是可惜的是对于MQTT也只是听闻,而从未使用过。通过这次折腾,也算是加深了我对MQTT的理解和认识。先套用网上比较流行的定义对MQTT做一个简单的解释。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路



MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议), 是一个基于客户端-服务器的消息发布/订阅的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。



以上定义可能非专业人事很难理解,我就以比较常见的小米空气监测器为例,用通俗的话解释一下MQTT在Home Assistant中的作用。小米空气监测器监测各项空气指标,我们可以在任何地方通过米家App查看到。这是因为,小米空气监测器具有WIFI联网功能,将数据传输到米家的一个”云平台”之中,我们手机客户端也可以连接到这个”云平台”之中,去读取小米空气监测器上传的数据。

上面的例子当然很好理解。假设我们DIY了一个具有联网功能的温湿度测量仪,又希望可以在Home Assistant的前端页面上看到温湿度数值。那么,是不是也需要这么一个”云平台”,肩负起局域网中在温湿度测量仪和Home Assistant间传输数据的职责。而这个局域网中的”云平台”,就是我们基于MQTT协议搭建的MQTT服务。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

MQTT协议对我们是透明的,用户并不需要知道其内部机理。我们所需要做的,只是按照固定的格式发布或订阅消息即可。当然,放到以前的话,温湿度测量仪也可以直接通过Home Assistant的API与之交互。但是这种实现方式耦合性太强,已经被官方遗弃。在Linux系统中安装MQTT服务很简单,只需要按照以下步骤即可。

Mosquitto是基于MQTT协议实现的一个Broker,也是最常用的Broker。Broker在MQTT中就相当于一个服务端,负责客户端消息的订阅和发布。Mosquitto的安装执行以下命令即可。



$ sudo apt-get install mosquitto mosquitto-clients



然后对Mosquitto进行配置



$ sudo nano /etc/mosquitto/conf.d/mqtt.conf



添加以下内容。



allow_anonymous false

password_file /etc/mosquitto/pwfile



设置MQTT服务的用户名和密码。



$ sudo mosquitto_passwd -c /etc/mosquitto/pwfile mqtt



重启后,查看并确认MQTT服务的运行状态。



$ sudo /etc/init.d/mosquitto status



打开一个终端,订阅dev/test这个主题的消息。



$ mosquitto_sub -d -u mqtt -P mqtt -t dev/test



再打开一个终端,向 dev/test这个主题发送消息。正常情况下,可以在第一个终端中收到”hello world”消息,表明MQTT服务运行正常。



0.36469919509729865nbsp; mosquitto_pub -d -u mqtt -P mqtt -t dev/test -m "hello world"



低成本打造可以接入Home Assitant万能遥控器的坎坷之路

将MQTT服务集成到Home Assistant中,需要在配置文件configuration.yaml文件中加入以下内容。



mqtt:

  broker: 192.168.x.x

  port: 1883

  username: mqtt

  password: mqtt



这样 Home Assistant就可以向MQTT服务订阅或者发布消息了。

OpenMQTTGateway的使用

通过上面的步骤,软件基础服务已经搭建完成,一切都很顺利。硬件方面,我选择了OpenMQTTGateway这个开源项目。OpenMQTTGateway是支持ESP8266, ESP32, Sonoff RF Bridge和Arduino等硬件平台的MQTT网关,相当于MQTT服务的一个客户端,可以接收来自Home Assistant的MQTT消息,并转化为由硬件发送射频信号、红外信号等的动作。有了这个项目的支持,可以少些很多代码,甚至完全不用写代码。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

根据OpenMQTTGateway项目WIKI的说明,我购买了一块ESP8266开发板NodeMCU V3,以及一块扩展版方便连线。433MHz射频收发模块选择的是XD RF 5V和FS1000A。然后按照接线图进行连线。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

完成硬件连接后,下载OpenMQTTGateway的代码并准备编译。OpenMQTTGateway项目目前采用的是基于VSCode插件platformio的项目配置。因此我们首先需要下载VSCode并在商店中搜索安装platformio插件。这个IDE环境比Arduino好用多了,真强烈推荐。只不过对中文路径支持的不好,请注意务必使用英文路径。platformio插件的安装可能会需要花一些时间,请耐心等待。安装过程中,我为了防止因为网络问题导致安装失败,进行了科学上网。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

IDE环境搭建完毕后,就把下载下来的OpenMQTTGateway工程导入到VSCode中。在导入工程的过程中,需要选择相应的开发板的型号。针对NodeMCU V3开发板,我们选择 NodeMCU 1.0(ESP-12E Module)。第一次导入工程或者新建工程的时候,会下载相应的 SDK的Framework,需要花一些时间,请耐心等待。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

OpenMQTTGateway支持的硬件很多,支持的功能也要好几种,而我们暂时只需要基于ESP8266的射频功能。完成工程的导入后,要需要对代码进行一些修改。在项目配置文件platformio.ini中,选择只编译nodemcuv2-rf平台。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

项目本来支持通过WifiManager配置网络,但是烧录进去后没能正常联网,所以我选择了ESPWifiManualSetup。在项目代码配置头文件User_config.h文件中,定义ESPWifiManualSetup 。然后。配置你需要连接的WIFI热点SSID和密码接着还要配置MQTT服务器相关的内容。



char mqtt_user[20] = "your_username"; // not compulsory only if your broker needs authentication

char mqtt_pass[30] = "your_password"; // not compulsory only if your broker needs authentication

char mqtt_server[40] = "192.168.1.17";

char mqtt_port[6] = "1883";



如果你的传感器接线用的不是项目默认的PIN,还需要在config_RF.h文件中进行相应修改。这样,项目代码的配置就基本完成了。接下来,需要对代码进行编译,只需要点击VSCode左下角的√号图标即可。编译过程需要完成对依赖库代码和项目本身代码的编译,请耐心等待。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

编译完成后,点击VSCode左下角的→号图标,就可以开始固件的烧录。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

烧写完毕,打开IDE的串口监视器断,然后点击开发板上的RST按键重启开发板,就可以在监视串口中看到相关打印了。按照正常流程,程序会首先连接指定的WIFI网络,然后向指定的MQTT服务器订阅感兴趣的消息,并等待消息的到来。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

至此,其实已经完成了大部分工作,而潜伏的危机,我却丝毫没有察觉。

坎坷的道路

上面的这一大段流程,本身也没什么难度,所以我完成的非常顺利。接下来,我的坎坷之路才刚刚开始。根据上文所述,现在代码已经跑起来了,程序在等待MQTT消息的同时,也可以接收433MHz射频信号并解析。这样就可以拿到射频码,然后通过Home Assistant控制发射射频信号了。因此,我拿来了邦先生晾衣机的遥控器,对着射频接收模块按了下去。然而,一点反应也没有。我检查了接线,没有问题,但就是串口监视器还是没有任何动静。我尝试更换开发板的PIN,并重新烧录程序,监视窗口依然无动于衷。造成这个现象的原因实在是有太多可能了,我只能一样一样的排查。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

我首先怀疑是不是射频信号编解码库RCSwitch的问题。好在OpenMQTTGateway提供了三种不同的编解码库,除了RCSwitch,还有kaku和Pilight可以选择。我修改了代码,重新烧录,分别进行尝试,还是不行。

接着,我怀疑是不是OpenMQTTGateway代码本身的问题。因此,我编译并烧录了RCSwitch的测试代码,测试代码本身的逻辑十分简单,可以排除绝大部分软件层面的干扰。但是,依然不行。

继续排查问题,难道是接收器模块的问题?还好我早就想到了这一点,所以除了XD RF 5V这个模块,我还额外购买了一块CC1101射频收发一体模块。刚好,这个模块有现成的驱动程序RCSwitch-CC1101-Driver-Lib以及测试用例。赶紧接线,编译,烧录,测试,结果依旧。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

难道是ESP8266开发板的问题么?因为这块开发板输出电压只有3.3V,而这些射频收发模块要求的电压一般是5V,因此会不会是电压不足的问题。刚好,我有Arduino开发板,可以提供5V的电压,而RCSwitch也支持Arduino。赶紧接线,编译,烧录,测试,再一次失望。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

我又通过进一步了解得知,射频编码分为滚动码、学习码、固定码。其中滚动码是经过加密的,安全性最高,学习码次之,固定码最容易解析。因此,我怀疑邦先生晾衣机的射频码是滚动码么?我特意问了客服,客服告诉我是”固定码”。我那一刻宁愿被告知是”滚动码”,或许我就甘心了。

至此,我尝试了多种方法,依然没能解析出射频信号,就别提让Home Assistant学习和控制发射了。我认为我应该只是没法解析出邦先生晾衣机的射频码。至于其他常见的射频遥控器我认为应该是没问题的。只是我没有条件测试罢了。此刻,我深刻感受到了自己相关知识的匮乏,面对这么一个基础问题而无从下手。如果具有相关经验的读者你,能够有耐心看到这一段,恳求你向我伸出援助之手。

最后的挣扎

折腾了这么久,竟然毫无结果,难道我就要这么放弃了么?我实在是心有不甘,但是射频信号问题我又没有能力去解决。干脆,降低需求偷个懒,搞个红外遥控器吧。

红外遥控配置

上面的折腾步骤都可以继续沿用,我也将继续使用OpenMQTTGateway这个项目。我所使用的红外收发模块和OpenMQTTGateway项目WIKI中推荐的有所不同。但是,只要数据引脚接线正确,理论上是一样的效果。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

相应地,在项目配置文件platformio.ini中,需要将nodemcuv2-rf修改为nodemcuv2-ir。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

然后就可以编译并烧录程序了。一切准备就绪后,拿出美的空调的遥控器按下,终于串口终端有反应了。通过查看串口日志,我们可以看到被OpenMQTTGateway解析出来的红外信号。我们需要的数据是这样的。



{"value":11730896,"bits":24,"protocol_name":"IR_COOLIX"}



有了这段数据,我们就可以控制OpenMQTTGateway发送红外信号了。下面进行以下测试,拔掉红外接收器以排除干扰,在搭建好MQTT服务机器的终端下,输入命令。



mosquitto_pub -d -u mqtt -P mqtt -t "home/OpenMQTTGateway_ESP8266_IR/commands/MQTTtoIR" -m '{"value":11730896,"bits":24,"protocol_name":"IR_COOLIX"}'



这相当于发布了一个被OpenMQTTGateway订阅的消息,OpenMQTTGateway收到这个消息后,就会按照这个数值和协议发送红外信号。实验结果,终于没有再让我失望了,空调成功开启了。

OpenMQTTGateway所使用的红外编解码库是IRremoteESP8266。这个库的作者十分勤快,代码更新很频繁,因此对大部分设备的红外遥控器都能够很好的支持。如果不幸遇到没有解析出协议的红外信号,OpenMQTTGateway还支持解析和发送Raw数据。但是ESP8266的MQTT库PubSubClient中,限制了发送消息的最大长度,可能会导致Raw数据解析和发送失败。这需要对OpenMQTTGateway本身以及PubSubClient库进行相应的修改。

得到了红外信号后,我们还需要把它配置到Home Assistant中去。需要在配置文件中,添加以下内容。



switch:

  - platform: mqtt

  name: "ac_on_off"

  command_topic: "home/OpenMQTTGateway_ESP8266_IR/commands/MQTTtoIR"

  payload_on: '{"value":11730896,"bits":24,"protocol_name":"IR_COOLIX"}'

  payload_off: '{"value":11697120,"bits":24,"protocol_name":"IR_COOLIX"}'



配置完毕后重启Home Assistant服务。然后,拿着红外发射头对准空调,在Home Assistant端按下开关。只听”滴”的一声,空调启动成功。再按一次,一声”嘀”响过后,空调关闭。我这里只是为了测试方便,将空调的红外遥控器简化成了一个开关。而其实,Home Assistant的MQTT平台,是支持空调这个设备的。当然,其他常见设备、开关、传感器也都支持。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

接入天猫精灵

虽然最初的行动计划以失败告终,不得已修改了原定目标。但是,这条路还是要硬着头皮走完的。万里长征的最后一步,就是将在Home Assistant中配置好的红外遥控器,接入天猫精灵实现语音控制。我之前写过一篇Home Assistant接入天猫精灵的原创文章,那篇文章看起来十分劝退,门槛稍高。这次,我选择了一种更为简单的方法,直接使用了瀚思彼岸论坛的改进后的天猫精灵接入服务。

首先,采用任意方法,使你的内网搭建的Home Assistant服务在公网可访问。这次不用再强制要求HTTPS访问了,门槛大大降低。我使用的是花生棒进行内网穿透

然后,在configuration.yaml里,以我上面加入Home Assistant的开关组件为例,进行如下配置。



homeassistant:

  customize:

  switch.ac_on_off:

  tmall_genie: true

  friendly_name: "空调"



接着,按照下图的步骤,生成一个长期访问令牌,保存备用。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

下面,打开天猫精灵App,点击”我家”——>”添加设备”,搜索hassmart。在结果中任意选择一个点击进入授权页面。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

在授权页面,点击”绑定平台账号”,在打开的页面中填入Home Assistant的公网地址,点击确定。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

在打开的页面中输入bbs.hassbian.com账号的注册邮箱。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

点击登录后,进入Home Assistant的登录页面,输入你的用户名和密码。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

授权成功后,还需要输入昵称和上面保存的长期访问令牌。配置无误点击确定,自动跳转到设备管理界面。此时,刷新后我们可以在设备列表中看到之前配置了tmall_genie: true的那个开关。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

为了保证天猫精灵能够自动识别这个开关,还需要在天猫精灵App中,设置它的位置或别名。

低成本打造可以接入Home Assitant万能遥控器的坎坷之路

接着,对着天猫精灵说:你好天猫,打开卧室空调,就可以测试一切是否正常了。

不改的初心

本来想搞一个射频万能遥控器,最后却搞了个红外万能遥控器。从成本上来讲,一块ESP8266开发板加上红外收发模块,价格也就20多元。确实比市面上那些万能红外遥控器要便宜不少。虽然在易用性上,DIY的产品不如成品,但好在自由度高,可以随意定制不受限制。此外,自制万能红外遥控器还能接入Home Assistant,便于扩展出更多好的玩法,例如接入天猫精灵。

然而,我家里其实已经有数个可以红外遥控的智能设备了,此次DIY的红外万能遥控器,更多的是给自己一个交代而已。虽然做了个对自己用处不大的玩意,但我仍然有着不小的收获。首先,这个折腾步骤对于有类似需求的读者或多或少是一个参考。其次,我第一次接触ESP8266开发板,使用MQTT协议,使得我增长了知识,发现了更多好玩的东西。因此,这仍是一次很有意义的尝试。

最后,生命不息,折腾不止。

展开 收起

小方 智能摄像机

小方 智能摄像机

92.33元起

NETGEAR 美国网件 Arlo 爱洛 VMS3230 无线监控系统

NETGEAR 美国网件 Arlo 爱洛 VMS3230 无线监控系统

1499元起

MIJIA 米家 小白智能摄像机

MIJIA 米家 小白智能摄像机

359元起

小蚁 智能云台摄像机 720P

小蚁 智能云台摄像机 720P

92.33元起

米家 蓝牙温湿度计

米家 蓝牙温湿度计

59元起

NETGEAR 美国网件 Orbi 奥秘 Mesh分布式路由 RBK50(双件套)

NETGEAR 美国网件 Orbi 奥秘 Mesh分布式路由 RBK50(双件套)

1399元起

MIJIA 米家 小米 空气PM2.5检测仪 霾表

MIJIA 米家 小米 空气PM2.5检测仪 霾表

299元起

ZTE 中兴 小兴看看Memo 360°全景智能监控摄像头

ZTE 中兴 小兴看看Memo 360°全景智能监控摄像头

124元起

华为智选 读写台灯 智能灯

华为智选 读写台灯 智能灯

156元起

MI 小米 升级版 米家多功能网关

MI 小米 升级版 米家多功能网关

79元起

MIJIA 米家 门窗传感器

MIJIA 米家 门窗传感器

39元起

Google Home Assistent 2017 智能语音助手

Google Home Assistent 2017 智能语音助手

暂无报价

MIJIA 米家 人体传感器

MIJIA 米家 人体传感器

54元起

MIJIA 米家 智能门锁 (碳素黑)

MIJIA 米家 智能门锁 (碳素黑)

999元起

MIJIA 米家 小米智能家庭套装礼品装

MIJIA 米家 小米智能家庭套装礼品装

319元起

LOOCK 鹿客 LSC-C01 智能猫眼

LOOCK 鹿客 LSC-C01 智能猫眼

1359元起
46评论

发表评论请 登录
  • 最新
  • 最热
评论举报

请选择举报理由

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
461
扫一下,分享更方便,购买更轻松