容器中的智能家居(Docker中的ioBroker + Zigbee)

参赛作品


一段时间以来,我使用了几种标准的Sonoff继电器来控制通过Google Home Mini发出的光线。 但是最后我想要更多。 标准功能还不够,我决定逐步使系统变得更灵活。 我选择了ioBroker。

首先,像往常一样,我查看,选择并检查了一些功能。 当基本必需品分开工作时,他开始整理。 当然,我遇到了问题。

主要困难:

  • 究竟要选择什么? 毕竟,有很多方法可以实施我们的计划。 即使在选择的解决方案中,也有很多选择...
  • 没有关于如何正确组合我选择的解决方案以及如何精确配置的现成说明。

我选择了什么,为什么选择,遇到了什么困难以及如何解决这些困难,并将对此进行讨论。

展望未来,我将描述ioBroker如何在旧笔记本电脑上的docker中启动,然后将Zigbee扔进去,以便在没有网关的情况下直接与小米传感器进行交互。 我没有给出标准的说明,只有我的“凹凸”。

由于尚未生效,因此可以更改某些内容。 因此,我将感谢您的建议和更正:)

愿望清单和我的想法


有Sonoff卷轴(在eWeLink中缠绕),某种延长线(Tuya SmartLife),带有多个传感器的Xiaomi网关(Mi Home),Google Home Mini柱。

eWeLink和SmartLife通常会在Google Home上接收,听诸如“打开桌子上的灯”之类的语音命令。 Mi Home无法启动(Google Home支持的小米设备很少)。

我放了ioBroker,接了小米网关,原则上一切正常。 一切都很漂亮,我检查了脚本,并编写了脚本(我选择了Node-Red),因此我决定对此进行所有操作。

但是,我不是专业管理员,我可以弄清楚如何进行准备,但是我不知道库和组件之类的细微之处(我不想深入研究)。 因此,让ioBroker需要nodejs有点麻烦,这是我以前没有关系的npm。 版本存在困难(例如,存储库中的标准yum放置了太旧的nodejs等)。

好吧 我开始了所有的事情,但是我内心仍然担心,尽管它起作用了,但我不知道该怎么做。 而且,例如,如果升级期间出现故障,我将不知道如何解决。 但是除了ioBroker,我还想在笔记本电脑上堆放其他系统。

例如,我将更新似乎可行的内容。 一段时间后,事实证明它工作不正常。 我们必须在一个月前回滚备份。 此外,备份不仅是该系统的备份,也是所有其他备份的备份,因为我直到最后都不知道可执行文件来自哪个系统,配置文件在哪里,数据本身在哪里...

这让我很困扰,所以我决定使用Docker。 容器中的代码。 分别存放数据,目录安装在主机上。 易于备份。

有新版本吗? 是的,即使在另一个虚拟机上,也很容易检查包含该目录中数据的新版本容器如何工作。 不同的系统不会互相干扰。 回滚某些系统的二进制文件很容易。 同样,转移到其他地方也很容易(容器中的ioBroker在Synology和单板上均可使用)。 美女!

会有更多的要求(通过Internet提供,但出于安全性而不是公开可用),它们将在选择配置时进一步影响。

安装方式


主机操作系统不是很关键,我下载了CentOS(我从旧的内存中记得,它对于所有网络任务来说都相当稳定且没有错误)。 当前版本是Cent OS 8。

放 我进行了一些基本设置,例如主机名,fail2ban(虽然主机仅在局域网中,但这只是一种习惯)。 放入Docker。 我不会在此赘述。 示例说明

现在该启动ioBroker了。 但是选择哪个网络? 主持人还是Macvlan?

首先,Macvlan希望每个容器都从路由器获取其IP地址。 但是后来他决定放弃这项冒险:

  • 当然,使用主机,您需要明确指出要转发的端口,并确保它们不与其他容器相交。 但是
  • iptables将必须在每个容器内进行配置。 包括每次重启后都带有其他参数,进行升级/更换。 在“主机”模式下,它是单点安全管理。
  • 我仍然计划不仅使它通过家庭WiFi可用。 在这种情况下,从外部访问一个主机(并在其上进行端口映射)比配置多个主机更方便。

当前选中了ZeroTier One。 仅将其安装在主机上。 当ZeroTier客户端完美运行时,通过GPRS从手机访问此主机的IP地址(不是本地的,而是由ZeroTier发出)和端口8082,将打开vis界面。

所以标准

docker run -d --name ioBroker -p 8081:8081 -p 8082:8082 -v /opt/iobroker/:/opt/iobroker/ --device=/dev/ttyACM0 --env-file /opt/ioBroker_env.list --restart=always buanet/iobroker:latest 

哎呀 出了点问题。

docker logs ioBroker显示,在最后一步中没有与外部资源的连接。 我找不到剃须刀名字。

docker exec -it ioBroker bash显示通过IP docker exec -it ioBroker bash ping操作可以正常进行,但不能按名称进行。

Google,我找到了很多有关docker如何错误地替代DNS服务器的链接,我统治/etc/docker/daemon.json,我了解dnsmasq-没有任何帮助。

想法浮出水面,突然在网络级别阻塞了某些内容。 但是容器中没有telnet或卷曲,我无法检查。 安装也不容易-yum安装不起作用。 当然,您可以在/ etc / hosts中手动指定必要的主机,但这太耗时,我最好检查其他版本。

例如,我愚蠢地在主机上停止使用防火墙,希望一切都可以打开。 但是没有

我记得仍然可以使用wget检查端口可用性。 他在集装箱里! 而且即使通过IP也无法下载任何内容。 甚至家用路由器的Web界面也无法连接。 好吧,这意味着问题绝对不在DNS中,而是在iptables中。

结果,在将docker接口添加到受信任区域后,一切工作正常:

 sudo firewall-cmd --permanent --zone=trusted --change-interface=docker0 sudo firewall-cmd --reload 

这甚至很有趣,是我在说明中的某个地方忽略了它吗?

还是我不购买CentOS 8,但别的东西没有问题(在其他操作系统中,默认情况下它没有防火墙)?

还是对每个人都如此明显,以至于他们没有写说明,我已经很长一段时间都哑巴了?

Zigbee


因此,我的ioBroker位于容器中,并且只发布了几个端口。 现在是admin 8081和vis 8082,然后将添加mqtt 1883,可能还需要一些支持Tuya的工具(我见过这样的驱动程序,但尚未弄清楚)。

las,要通过其网关与小米设备进行交互,需要多播,并且在这种复杂的配置中也是如此。 因此,我决定扔进一个USB随身碟容器。 也是正常的操作。

在命令行上,您已经看到--device=/dev/ttyACM0 。 容器中的设备出现。 在ioBroker中,我激活了标准驱动程序“适用于小米和其他设备的Zigbee”,但无法正常工作。

Google建议访问串行端口,您需要将该用户添加到拨出组中。 我进入容器,将iobroker添加到该组-这没有帮助。

我看到提示,您需要通过npm安装serialport软件包。

我不能,没有权利。 谷歌进一步。

仅Bluefox告诉某人,这需要在/opt/iobroker/node_modules/iobroker.javascript/目录中完成-我没有一个,并且我仍然没有安装权限(嗯,就是说安装开始,然后崩溃)。

最后,我意识到我需要在命令行中明确指定要放置在哪个目录中。

 npm install -g serialport --production --save --prefix "/opt/iobroker" 

它已安装,但无济于事。

我开始怀疑您仍然需要处理访问权限。 检查(当然是从容器内部):

 test -w /dev/ttyACM0 && echo success || echo failure 

成功的 即 尽管如此,码头工人正确地扔了设备。

 sudo -H -u iobroker test -w /dev/ttyACM0 && echo success || echo failure 

高飞! 失败的

容器内的bash在根目录下运行,但是iobroker用户无法访问该端口。 尽管已将其预先添加到拨出组。

ls -l /dev/ttyACM0给出

 crw-rw----. 1 root 18 166, 0 Nov 3 18:14 /dev/ttyACM0 

哈! 什么是18,而不是群组名称?

在主机上一切都正确: crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0 crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0

事实证明,在主主机上,/ etc / group dialout:x:18 ,以及容器dialout:x:20

尽管我使用该名称将用户添加到了该网上论坛,但毫无意义,数字并不相同。 因此,我创建了另一个标识符为18的组,并将用户添加到该组中:

 groupadd -g 18 serial usermod -a -G serial iobroker 

我重新启动了所有程序以获得更大的确定性。 而我的摊牌结束了:)

他平静地解开了来自小米网关的所有传感器,并将其绑定到ioBroker。

我将它们视为ioBroker本身中的对象:



可见读数:



当泄漏传感器上的触点闭合时,将接收数据。 情况正在发生变化:



在Node-Red中,信号来了。 因此,尽管正在发送电子邮件或其他内容,但语音或MP3文件仍会发送到GH Mini列:



顺便说一句,当查看对象时,一个惊喜在等待着我:



我将小米立方体转到了另一侧。 最新更改以绿色显示。
Flip90已经更改-这是可以理解的。 捕获此信号以进行控制。 但是,事实证明,仍然存在flip90_from和flip90_to-他转向哪一边。

事实证明,从理论上讲,您可以从多维数据集获得更多控制信号。 例如,如果在边缘上绘制箭头(好像是一个圆圈),则不仅可以跟踪“ 90度转弯”,还可以跟踪向哪个方向(从您自己到自己,向左或向右)。

对于flip180,它也有效。 对于其他手势,也有类似的附加信息(翻转180°时为顶侧,滑动时为顶侧,敲击时为顶侧)

并非迫切需要它。 但是在标准的Mi Home中,没有关于面孔的信息。 似乎之前通过小米网关进行连接时,我也没有看到它,我也不知道每个面孔都有一个数字。 以前,我只知道跌倒(自由跌倒)的其他动作,但是,他们被Mi Home开除(显然,他们掉落得太频繁了)。

决赛


我所需要的只是工作。 然后,您可以带来美感,编写脚本,连接Tuya,与Blynk一起启动其他项目的容器...

而且,也许可以根据您的评论重做一些事情:)

Source: https://habr.com/ru/post/zh-CN474354/


All Articles