快捷导航
 
低成本打造可以接入Home Assitant万能遥控器的坎坷之路
VIEW CONTENTS

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

2020-2-27 23:18| 发布者: xtyly| 查看: 144| 评论: 0
摘要: 低成本打造可以接入Home Assitant万能遥控器的坎坷之路,由乐居居会员发布在智能家居论坛的真实分享,本文是作者亲身的购买使用感受以及中立消费见解,旨为在广大网友中传播更好的消费主张。
看完喜欢想买?就在这里搜一下!想要什么搜什么:

天真的愿景

前段时间我有幸在众测活动中成功申请了一款邦先生电动晾衣机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协议,使得我增长了知识,发现了更多好玩的东西。因此,这仍是一次很有意义的尝试。

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




Tab标签:

鲜花

握手

雷人

路过

鸡蛋

最新评论

推荐快讯更多

乐居居-让生活更智能!

  • 反馈建议:153890879@qq.com
  • 客服电话:
  • 工作时间:周一到周五

云服务支持

精彩文章,快速检索

关注我们

Copyright乐居居  Powered by©  备案号:湘ICP备15009499号-1