#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

2017-08-02 16:30:00 38点赞 375收藏 59评论

Overview

此事缘起于在美帝买了Amazon Echo,想着回来可以在家里多说英语,给儿子一些熏陶,也是个大玩具,说不定人家会爱上呢。后来想着整天对Alexa吼这吼那的,如果能唤他帮咱开空调,开电视,开灯,那就不用整天操心遥控器了吗。尤其,整天盯着遥控器的主,拎着遥控器一摇一摆就走了,然后撒着欢儿跑回来,遥控器就不知道丢哪儿了。

首先查到的是BroadLink配件,这其实是一个WiFi转红外+射频的配件。我买的是

BroadLink博联智能家居红外射频智能遥控开关家电万能遥控器RMPro179元BroadLink博联智能家居红外射频智能遥控开关家电万能遥控器天猫精选去购买


通过其自带的学习模式,可以学习任何一个遥控器的遥控码。配合Broadlink自家的app就已经可以实现遥控器电子化了。Broadlink有安卓上有两个app:

- e-control

- IHC只有play store上有

不够完美的是仍然需要掏出个手机,翻找app,一堆乱点。这不是我想要的。继续百度,Google,如果要整合Amazon Echo——下文简称Alexa以图方便,有以下几种方案:

1. 本身是智能化家居,并且厂家有对应的Skill,enable该Skill即可,好处是各种原生的设置,例如:空调设几度,灯开什么颜色

2. 集成BroadLink,让Alexa操作BroadLink,此方案仍然有多种子方案:
1) Android + Broadlink RM Plugin + Alexa
2) Domoticz/Home Assistant + HA-Bridge + Alexa
3) Domoticz + python plugin + controlicz + Alexa
4) Broadlink原生skill + Alexa

3. Domoticz/Home Assistant + HomeBridge + Siri

其中Domoticz和Home Assistant均为Home Automation System,网上两者都有很多人实践,各有优劣。在参考链接中专门对5种不同的系统进行了比较。因为我有Synology NAS,又可以原生集成,所以毫不犹豫选择了Domoticz。充分发挥NAS 7*24小时不下线的优势,实现智能家庭网关。针对第二点中的后3个(2-4)方案全部进行了实现。后面会一一列述。最终方案架构如下图:

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


Domoticz into Synology

这个超级简单。有官方支持Domoticz for Synology NAS。选择Domoticz for Synology DSM 6.1 with Python Plugin Beta。python plugin系统很重要,后面会用到。 下载的是.spk文件,这是Synology DSM系统的安装包。直接在Package Center中选择Manual Install即可。安装成功后如下图。

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


其他依赖包

Domoticz的python插件系统依赖于Python3
broadlink-http-rest server依赖于Python2
HA-Bridge Server依赖于 Java8
最好再装上git,方便checkout GitHub上的开源项目
所以这四个包都得安装,如下图

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


Broadlink into Domoticz

Domoticz Broadlink Python Plugin + Controlicz

这是本篇中最糟心的部分,陷阱无数。后面专录踩坑记录。
Domoticz Broadlink plugin和broadlink-http-rest均是基于python-broadlink。所以要先安装python-broadlink。

安装python-broadlink

在很多文章中python-broadlink都是用pip来安装,例如pip3 install broadlink。但是由于broadlink基于pycrypto,而安装pycrypto的时候会要在本地进行编译。Synology NAS上显然没有编译环境(GCC and etc.)。所以安装会失败。但是根据作者的描述,最新的python-broadlink并不基于pycrypto了,因为pycrypto已经被弃坑了。最新的python-broadlink基于pyaes库来实现加解密。所以正确的步骤是:

- 确保使用python3

- git clone python-broadlink

- 切到python-broadlink目录,python setup.py install

- python -m pip install pyaes因为Synology上无法安装pip3,这是变通的方法。使用python get-pip.py安装的仍然是pip2

安装Domoticz Python Plugin

参考链接3是插件作者提供的Domoiticz wiki页,不过全文基于Windows,参考其中others章节,仍然很好用。步骤如下:

下载plugin files

Domoticz的插件目录在/usr/local/domoticz/var/plugins/BroadlinkRM2/,拷贝插件文件到该目录,包括:

- plugin.py ——插件的主文件

- plugin_send.py

- plugin_http.py

- plugin_http.sh


这里需要注意不是/usr/local/domoticz/plugins/BroadlinkRM2/,虽然这个目录底下有example目录还有其他插件的目录,但当我把插件文件放在该目录下时,会出现插件未加载的情况。

在Synology DSM的Package Center中重启Domoticz。注意后面每次修改plugin都需要重启Domoticz。
至此安装就成功了,直接在Domoticz中添加BroadLink设备如图。

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

添加Broadlink Hardware

按照插件作者的步骤,下面应该可以添加Hardware,并可以Discover Broadlink设备,添加Hardware如下图:

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

导入易控(e-control)设备

参考链接3中也有详细描述。在User Guide->Inside Domoticz->xxx - import。可能作者使用的是非多字节语言,在处理导入文件时,若含有中文字,会出现失败的情况。参见踩坑记录中的解决方法。
另外还有一点要注意的是,在点击WebStart以后,Domoticz会开启一个运行于9000的web服务器,用以上传易控的设备文件(jsonButton, jsonIrCode, jsonSubIr)。要注意NAS的Firewall配置。

Controlicz

在搜索到的文章中鲜有提及。我也是在偶然的翻阅中发现了这个Alexa Skill。使用Controlicz就可以不用通过HA-Bridge来曲线救国了。但实际使用中发现还是各有利弊。后文讲完HA-Bridge章节,会提到两者的优缺点。
使用Controlicz的方法是:

- 使用Alexa的账号来注册Controlicz

- Alexa app上enable skill就好了

- 对着Alexa说discover device


注意:Controlcz中要求:

- Domoticz服务必须外网可以访问,所以要配置家里的端口映射,以及DDNS,因为使用的是Synology,这个我早就已经有了

- Controlicz要求Domoticz服务运行于HTTPS协议,所以必须使能8443端口,注意NAS的Firewall配置

踩坑记录

至此,如果能完成上面所有的步骤,对Alexa说”Turn on the TV”,应该已经会有正确响应了。但遗憾的是,中间还有一些东西要做:

1. Import Error “broadlink”

明明已经安装了python-broadlink,而且在REPL中也可以正确import,但是Domoticz log中始终报错。原因是PYTHONPATH不正确。在plugin.py中已有处理:

if sys.platform.startswith('linux'):
# linux specific code here
# doesn't work even if set dist-packages => site-packages
sys.path.append(os.path.dirname(os.__file__) + '/dist-packages')
elif sys.platform.startswith('darwin'):
# mac
sys.path.append(os.path.dirname(os.__file__) + '/site-packages')
elif sys.platform.startswith('win32'):
# win specific
sys.path.append(os.path.dirname(os.__file__) + 'site-packages')

正确的broadlink库路径是/usr/local/lib/python3.5/site-packages/broadlink-0.5-py3.5.egg/broadlink/。上面linux系统的路径是dist-package。不过即便改成site-packages,依然报同样的错误。解决方法简单明了,将broadlink目录拷到plugins目录下面即可

cp -r /usr/local/lib/python3.5/site-packages/broadlink-0.5-py3.5.egg/broadlink/ /usr/local/domoticz/var/plugins/BroadlinkRM2/

2. Error Connecting to Broadlink device

有两个GitHub issue链接可以看一看:

-Error Connecting to Broadlink device #107

-lpad fix broken? #97
或许会有帮助,但对于我的问题不是正解。
Root cause是bytes使用方法不对,错误的地方在这里

# broadlink/__init__.py
160 def encrypt_pyaes(self, payload):
161 aes = pyaes.AESModeOfOperationCBC(self.key, iv = bytes(self.iv))
162 return "".join([aes.encrypt(bytes(payload[i:i+16])) for i in range(0, len(payload), 16)]) # <==== Error is here

python3中bytes返回class bytes,而python2中返回字符串,如下:

Python2
>>> type(bytes([1,2,3]))


Python3
>>> type(bytes([1,2,3]))

>>> "".join([bytes([1,2]),bytes([2,3])]) <==== You cannot cat 2 bytes class objects as string
Traceback (most recent call last):
File "", line 1, in
TypeError: sequence item 0: expected str instance, bytes found
>>> b''.join([bytes([1,2]),bytes([2,3])]) <==== This is the good way
b'x01x02x02x03'

好了修改plugin.py对应的行就可以了。

3.Domoticz import文件中有中文的问题

在Python3中,如果文件有编码问题,例如包含中文,不能通过以下方式来读取文件并解码:

with open('jsonFile') as f:
textStr = f.read() <=== Python3 will complain about the codec error here.
textStr.decode('utf8')

正确的做法应当是

with open('jsonFile', encoding='utf8'):
textStr = f.read() <=== Everything here has already been unicode.

所以修改所有plugin.py中的open语句即可。
还有一处要修改的是针对ConfigParser的编码问题。如下是我修改好的:

config = configparser.ConfigParser()
config.read(path, encoding='utf8')

现在试一试,连接,发现,导入,应该都没问题了吧。

Domoticz + broadlink-http-rest + HA-Bridge

这个方案不需要借助Broadlink的Domoticz python插件,而是利用Domoticz中的Dummy Hardware,如下图:

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居



安装HA-Bridge

HA-Bridge是将Alexa不支持的设备模拟成Alexa原生支持的Philips HUE Light。而HA-Bridge可以直接导入Domoticz中的所有设备。缺点是,他只能支持开关和调亮度的操作。
HA-Bridge是一个java的jar包,我们要将之作为service运行在Synology后台,方法参看Run as a service on Synology
其实就是运行命令nohup java -jar -Dserver.port=8085 /ha-bridge-4.5.6.jar &
注意放到Synology的计划任务里。

安装broadlink-http-rest

从GitHub上clone下broadlink-http-rest。然后和HA-Bridge一样,要以service的方式运行在后台。否则ssh连接一断开,server就退出了。命令为nohup python broadlink-http-rest/server.py &
注意要用nohup,否则serveer仍然会随着ssh断开而退出。

计划任务&防火墙

配置好防火墙:

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居8085: HA-Bridge server

8080: broadlink-http-rest server

8443: Domoticz HTTPS service

9000: Domoticz Broadlink web service

配置好计划任务

Broadlink into Domoticz

在Setup->Hardware下建立Dummy Hardware,然后点击Create Virtual Sensors,然后在Switches tab里找到刚建好的virtual sensor,点击Edit,按下图配置好On Action和Off Action。

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


Domoticz into HA-Bridge

参见参考链接2,从Configuring HA bridge开始讲如何配置Domoticz到HA-Bridge service。然后就可以直接添加Domoticz里的设备了。

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


HA-Bridge vs. Controlicz

1.General Smart Home

Controlicz可以整合Domoticz所有设备到Alexa中,譬如,如果Alexa并不原生支持该smart home设备,则可以先在家里搭建Domoticz服务器,然后通过Controlicz将之整合到Alexa中。根据Controlicz官网support列表,其并不只局限于开关设备:

#原创新人#Domoticz + BroadLink + Synology + Amazon Echo实现智能家居


2.整合Broadlink

在整合Broadlink上,两者就各有胜场了。Broadlink是通用遥控器。所以通过Broadlink导入的设备都是按钮设备,每个按钮都是一个Push Button设备,所以只有一个触发的操作。这样也合理,因为按钮只有触发,并没有开状态或者关状态。这甚至不如灯的状态多。
例如:一台电风扇的开关按钮,按一下是开,再按一下是关。如果通过Controlicz直接整合Domoticz按钮设备,则要开电风扇,要对Alexa说“Turn on the Fan”,要关则还是说“Turn on the Fan”。是不是有点奇怪。
如果是HA-Bridge,针对开关状态,就可以说“Turn on the Fan”和“Turn off the Fan”。是不是好多了。
Controlicz整合Domoticz的好处就是,Domoticz Broadlink Python plugin支持直接一次性从易控导入已定义设备,可以充分发挥易控GUI的特点,省得一个一个设备自己定义了。

Broadlink原生Skill + IHC

在整完上面那一大堆之后,我突然发现原来Alexa已经有Broadlink的原生Skill了,但要配合最新版的Broadlink IHC app使用。不过令人糟心的是这两个app的评分都低的可怜。

- IHC playstore 2.2分

- Alexa Broadlink Skill 2.3分
从官网的example看目前只支持TV。经我实践确实如此,添加了电视和空调,Alexa却只能discover到电视,没有空调。

参考链接

5 open source home automation tools

Alex - Domoticz

Domoticz Wiki Plugins/BroadlinkRM2

#原创新人# 群晖安装broadlink-http-rest代替RMBridge_生活记录_什么值得买



展开 收起
59评论

  • 精彩
  • 最新
  • 我觉得这个可以发表篇学术论文,而不是在这啊😄

    校验提示文案

    提交
    发表论文哪敢,不过是帮人解了两个bug

    校验提示文案

    提交
    收起所有回复
  • 看不明白2. Error Connecting to Broadlink device,具体怎么修改__init__.py?

    校验提示文案

    提交
    这里不支持内嵌代码,本身用MD写的会清楚一点。修改方法是,将encrypt_pyaes函数中的“”.join改为,b“”.join。可以用Python的repl命令行试一下。

    校验提示文案

    提交
    收起所有回复
  • - git clone python-broadlink
    这个命令在putty执行么?

    校验提示文案

    提交
    是的,用putty连NAS的ssh

    校验提示文案

    提交
    返回错误:
    git: command not found

    另外,怎么确保使用python3?我看到群晖目录里有2.7和3.5!而且我用其它方式install后,反回的提示,显示安装目录/usr/local/lib/python2.7/site-packages,但在这个目录中找不到broadlink

    校验提示文案

    提交
    收起所有回复
  • 真不错 都是常见坑 解释的很详细 不过有点小错误 第三个坑正确代码少as f

    校验提示文案

    提交
    是的,谢谢斧正

    校验提示文案

    提交
    收起所有回复
  • 一脸懵逼的进来一脸懵逼的出去

    校验提示文案

    提交
    一脸懵逼的进来一脸懵逼的出去

    校验提示文案

    提交
    一脸懵逼的进来一脸懵逼的出去

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 求助一下,安装python-broadlink的时候,python setup.py install这个命令我用python3 setup.py install,使用python3来装,但是返回 Import Error:No Module named 'setuptools',这个如何处理啊?

    校验提示文案

    提交
    这个问题解决了么?

    校验提示文案

    提交
    收起所有回复
  • 楼主Error Connecting to Broadlink device这个坑是修改broadlink下的__init__.py里的161行吗,改了后还是连接错误,是否还需要改其他的

    校验提示文案

    提交
  • 一脸懵逼的进来一脸懵逼的出去

    校验提示文案

    提交
  • 一脸懵逼的进来一脸懵逼的出去

    校验提示文案

    提交
  • 先收藏了再说,万一哪天开窍了呢

    校验提示文案

    提交
  • 还是等等小米的吧,这个只能识别英文还是不符合国情啊。

    校验提示文案

    提交
  • 看了好多智能家居的帖子,有的从需求角度写,有的从手里已经买好的产品写,有的上来就买这买那,有的上来就下载这配置那。这篇,终于提到了架构和方案的选择,这才是我们需要的。

    校验提示文案

    提交
  • 最近一直在研究这个呢,不过教程写的都是小米网关附带broadlink的,lz要是早发两天我的银子就都给你了。

    校验提示文案

    提交
  • 入手群晖n年了 还是玩不转 有教程吗

    校验提示文案

    提交
  • 懵逼的节奏

    校验提示文案

    提交
  • 楼主这最后的参考链接好喜感,论文看多了吧。很棒的干货。一开始我也想买echo来着,但是总觉得在宿舍里高喊xxx太蠢了...

    校验提示文案

    提交
  • 感谢,解决了群辉domoticZ多年的老便秘问题,哦不对,多年的插件问题

    校验提示文案

    提交
    咱俩一样,别的没看,也没看懂,至少知道插件放哪了,万分感谢楼主,月初还没有碎银,回头有了过来打赏!

    校验提示文案

    提交
    收起所有回复
  • 我还以为我小时侯作文没学好 [傻笑] 看过此文,安心了 [脸红]

    校验提示文案

    提交
  • 看不懂,学不会 [大哭]

    校验提示文案

    提交
  • 棒棒 虽然我不知道你说什么。但是正有此意

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

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