能源,热和水的第三部分:收音机

参赛作品


在为智能家居选择解决方案的过程中,我尝试绕过需要与外部云进行通信或拥有自己的应用程序的盒装解决方案,尤其是无法直接连接到设备的解决方案。 所有可用度量标准都简化为一个界面-zabbix,在其中组织了利益相关者警报系统。 控制旋钮在本地Web界面中实现。

以前的文章:


第一部分 (1线温度,UPS,水表...)
第二部分 (联网,gidrolock,压力传感器...)

本文中解决的任务


  • 具有zabbix警报的可扩展,灵活的漏水保护
  • 433MHz的其他设备:钟形,开门式等。
  • 我们在MQTT中推1wire

漏电保护系统


系统要求:


  • 房子周围散布着很多传感器(在我的情况下-在不同的位置有6个)
  • 传感器无电线
  • 检测到泄漏后迅速关闭
  • zabbix中的所有当前状态信息。 有警报

系统组成


  • 树莓派
  • RTL2832U USB调谐器
  • 泄漏传感器433MHz
  • 用网+ gidrolock起重机(见上一篇文章)关闭行李箱

关于铁


在上一篇文章中,我描述了使用网状网关闭供水的解决方案。 我有一个用于此解决方案的有线传感器。 如果所有可能发生泄漏的点都在大约相同的位置,则这很方便。 在我的情况下,网直接安装在高速公路的入口处,并在同一位置控制机电式自动锁式起重机(请参阅上一篇文章)。 分散的网+ gidrolock +有线传感器既昂贵又麻烦。 此外,我再也没有机会在房屋周围拖曳新电线。 在电动起重机中占用插座和呼吸是一种一般的解决方案。 预期的解决方案-我们根据分布在各个位置的无线电传感器发出的信号,使用普通公路的重叠部分。
从Internet上找到的-来自现成系统的许多不同的无线电传感器。 有些可以单独购买,我没有购买传感器控制器,以免在电路中产生其他元件。

如何捕捉433MHz? 事实证明-特定芯片组上的电视调谐器。 现在他值得一分钱(我花了300r买了Avito),像这样:

图片

我在12dbi上为其订购了单独的天线,因为当前的天线无法覆盖整个房子。

由于我试图最小化电路的控制组件,因此一直希望通过Openwrt将调谐器拧紧到我的家庭路由器中,直到那时,这才是1wire,modbus,wifi传感器/协议的智能家庭解决方案的核心,但不幸的是,我耗尽了部分资源(内置闪存驱动器上用于必要软件的空间已用完,处理器加载了某些东西-网络已经存在问题,并且我们仍然需要4k才能在线查看:),+ USB上已经挂了太多东西,这影响了数据收集的稳定性)。 决定逐步将智能家居的功能转移到外部设备-rarpberry pi(即将推出的第一个版本)中。

关于软件


在带有窗户的台式计算机上使用了具有sdr清晰度的电视调谐器(试图赶上别人的收音机和飞机谈判)后,我开始看看传感器本身是否看到了“回音”。 是的,它看起来很完美:

图片

覆盆子设置


我选择了本地树莓派。 我在Mac / Linux下的USB闪存驱动器上写入了最后一个图像:

sudo dd if=2019-07-10-raspbian-buster-lite.img of=/dev/disk2 bs=1048576 conv=sync 

引导,配置网络和ssh。

接下来-放入树莓派包rtl-sdr,rtl_433:

 sudo apt-get install cmake build-essential python-pip libusb-1.0-0-dev libusb-1.0 python-numpy git git clone https://github.com/merbanan/rtl_433.git cd rtl_433/ mkdir build cd build cmake .. make make install 

rtl_433具有内置协议,可对来自工作在433mhz范围内的不同设备的数据进行解密。

我们开始rtl_433


 rtl_433 -f 433.9e6 

我们将传感器放到水中并得到珍惜:

 time : 2019-09-17 15:04:39 model : Smoke detector GS 558 id : 16919 unit : 1 learn : 0 Raw Code : c842e1 

烟雾探测器? 好的,我们将这些传感器发出的警报中的歌曲“ Smoke on the water”放到警报中... :)
但是请认真对待-我们拥有每个传感器的编号,根据这些编号,将来我们将了解确切的位置有泄漏(无论如何我们都会关闭)。

关于泄漏传感器


图片图片图片

设置完软件部分后,我注意到当水进入触点时,带有速卖通的传感器(左图)会发出一个信号。 如果水停止闭合触点,则再加上一个信号。 这根本不适合我(预期的行为:传感器感测到水时会不断发送警报信号,因为单个信号可能会丢失)。 如果您用导线闭合触点,则会观察到类似的行为。 但是奇怪的是-如果您用手(皮肤)合上触点,则每2-3秒会发生一次警报。 在这里,我仍然有两个假设:要么中国人搞砸了电阻测量,要么传感器有其他某种操作模式,它们的行为有所不同(例如,与控制器配对),或者还有其他频率(直到我发现) )

顺便说一句,在评论中写下,也许有人在使用这些传感器,是否可以以某种方式“教导”他们不断发送有关泄漏的信号?

我将这些传感器放在一旁,在军火库中,还有一个来自rubetek的传感器(右图),并在勒罗伊购买了:GAL SHW-1005(中图)。

rubetek传感器的行为似乎完全不可预测(不可预测的反应“看到水/看不到”)。

但是Leroy行驶中的传感器准确显示了我所需要的:有水-我在空中发送垃圾邮件,没有水-我无语。 它唯一的缺点是其作用半径小于其他传感器。 但是通过为接收器购买更灵敏的天线解决了该问题。

MQTT


如何发送rtl_433输出到zabbix? 喂代理? 发送到zabbix_sender,分析过程吗? 也许通过系统日志?

在这里,您需要记住,我的zabbix在云端。 当然,无需借助扳机来堵住水。 房子的地板会一直淹没,直到他做出决定为止(如果有的话)。

好消息是rtl_433可以在MQTT上发送信息。 开箱即用。 同时,数据以json格式发送到代理。

因此,您需要:

  • 放置一个本地蚊子经纪人(在覆盆子上做)。
  • 将信息与所需主题合并到代理中,以便稍后对其进行解析。
  • 在树莓派上本地连接到代理并将命令发送到网络
  • 从将重定向到zabbix的位置连接到代理(在我的情况下,zabbix服务器也是MQTT客户端)

安装设置mosquitto MQTT:


 apt-get install mosquitto mosquitto-clients systemctl enable mosquitto systemctl start mosquitto 

我们将指示设备ID的信息发送给代理:


 rtl_433 -f 433.88e6 -F mqtt://127.0.0.1,events=/433/[id] 

在mqtt客户端中,我们将获得以下内容:

 mosquitto_sub -h 127.0.0.1 -t '#' (   ) /433/16919 {"time":"2019-09-18 11:55:29","model":"Smoke detector GS 558","id":16919,"unit":1,"learn":0,"code":"c842e1"} 

连接到代理并将命令发送到网的脚本


我草绘了一个简单的MQTT脚本客户端,该客户端允许您在配置中指定的主题出现时运行与该主题关联的脚本。 因此,当某个传感器被触发并且有关它的信息出现在空中时(例如/ 433/16919),您可以执行一些操作(在打网的情况下,发送curl请求关闭起重机,请参阅上一篇文章)。 脚本的链接位于文章的末尾。

zabbix中的重定向


我使用了现成的mqtt-zabbix解决方案。 在级别上,我们了解要在哪个项目中发送值(按ID)。

在keys.cfg中,指定:

 /433/16919,mqtt.ventilation.waterleak::hostname 

其中hostname是在Zabbix中带有项目流浪类型的主机名。

重要! 设置中的主机名应与脚本中要发送的名称相对应,项目(数据元素)的类型应适合要发送的数据(例如,对于json-文本),否则您将捕获以下形式的错误:

 2019-09-18 14:29:48,749 Got response from Zabbix: {u'info': u'processed: 0; failed: 1; total: 1; seconds spent: 0.000055', u'response': u'success'} 

而且,很难从zabbix实现更多调试(以及为什么失败)。

我们配置/etc/mqtt-zabbix/mqtt-zabbix.cfg(指定ip mqtt代理和zabbix服务器的地址)。

还有什么可以连接到433的?


是的,什么! :)

气象站传感器


修补无线泄漏传感器时,我意外地从气象站捕获了来自外部传感器的信号。 它看起来像这样:

 time : 2019-09-19 10:48:54 Protocol : 56 model : TFA pool temperature sensor Id : 182 Channel : 3 Temperature: 19.3 C Modulation: ASK Freq : 433.9 MHz RSSI : -0.1 dB SNR : 35.0 dB Noise : -35.2 dB time : 2019-09-20 10:57:29 Protocol : 12 brand : OS model : THN132N House Code: 4 Channel : 3 Battery : OK Celsius : 20.00 C Modulation: ASK Freq : 432.9 MHz RSSI : -0.2 dB SNR : 31.5 dB Noise : -31.7 dB 

因此,额外的好处是能够通过zabbix中的显示监视空中点的温度。 仅在某些房间,我无法拉长电缆。

门铃


许多无线电通话都在433mhz的相同频率范围内工作。 因此,我们可以拦截呼叫按钮的按下(甚至没有必要进行呼叫本身,只需按钮就足够了)。 怎么了 例如,通过SMS配置其他通知/发送电报/或在监视器上显示摄像机的图像。

我买了一个电话:Evology QA-688-E RU。

为了让rtl_433按钮看到呼叫按钮,您需要激活“测试”协议,例如,通过使用“ G”选项运行或指定特定的附加协议,同时我们将添加有关协议和频率的信息输出:

 rtl_433 -f 433.9e6 -G -M protocol -M level -F mqtt://127.0.0.1,events=/433/[id] & 

进入MQTT:

 {"time":"2019-09-30 10:57:00","protocol":72,"model":"RF-tech","id":0,"battery":"LOW","temperature_C":0,"button":0,"mod":"ASK","freq":433.84822,"rssi":-3.5981,"snr":33.77488,"noise":-37.373} 

在这里您可以看到id = 0。 同时,我将几台设备确定为RF-tech。 它们的id都等于0。结果,zabbix中的所有设备都显示为一项。 可以仅通过频率来准确区分哪个设备起作用。

我们将频率拉到一个独立的相关项中:mqtt.outside.doorbell.freq,带有$ .freq的JSON预处理(zabbix可以从第4版开始执行此操作)。

在此项目上,使用以下表达式触发:

 {HOME_PI:mqtt.outside.doorbell.freq.last()}>433.8 and {HOME_PI:mqtt.outside.doorbell.freq.last()}<433.81 and {HOME_PI:mqtt.outside.doorbell.freq.nodata(30)}=0 

即 如果突然在常规项目mqtt.outside.doorbell.freq(无数据)中出现一个值,并且频率在433.8和433.81之间的指定范围内,我们可以得出结论,他们正在给我们打电话(例如,复制对SMS的呼叫)。

门/窗传感器


我有来自rubetek的渗透传感器。 发送以下内容:

 {"time":"2019-09-30 14:11:28","protocol":86,"model":"Smoke detector GS 558","id":12262,"unit":16,"learn":0,"code":"e5fcd0","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:28","protocol":68,"model":"Kerui Security","id":46074,"cmd":7,"state":"close","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:21","protocol":68,"model":"Kerui Security","id":46074,"cmd":14,"state":"open","mod":"ASK","freq":433.85005,"rssi":-11.0148,"snr":25.1088,"noise":-36.1236} 

将最后一个无线电传感器添加到zabbix后,我想重做MQTT上的所有内容。 方便的分类,您可以确定主题-ah以及设备的放置和类型。 您将获得所有事件的一般广播。

1wire至MQTT


我希望一切都在MQTT中,至少对于相同类型的实现而言。 我想获得事件的一般“醚”和对这些事件做出反应的一般方法。 当然,zabbix解决了反应问题,我对此发出了警告。 但是我想使管理更加轻松,更接近系统和“以太”。

存在将传感器状态从1wire网络中继到MQTT的现成解决方案,但它们不适合我。 节点上现成的解决方案要么在其背后带有一堆依赖项,要么吃掉了整个树莓派处理器。 作者放弃了Google搜索中排名前10位的某些解决方案,而某些解决方案仅受温度传感器支持。 还有一类网关通过gpio接口收集信息。 这一切都不适合我。

我在/ mnt / 1wire中有一个装有1wire设备的伪文件系统,我想从那里获取所有必要的信息。 为此,只需在bash上制作一条简单的一行就可以了,并通过mosquitto_pub为每个传感器发送数据。 但是,会出现以下问题:启动这些脚本(从顶部开始,驱动到某种守护进程?),数据的正常表示(获取相同的json),添加新的传感器等。这种想法发展得越深,拐杖就越多。 事实证明,为该任务编写到mqtt的另一个owfs的网关更加容易。

有一个配置文件,我们需要在其中输入传感器的ID,以及我们要发布到mqtt的来自fuse.OWFS的文件。

mqtt中的输出是以下json:

 /1wire/28.0425260a0000 {"type": "DS18B20", "temperature": "30"} /1wire/28.bf16270a0000 {"type": "DS18B20", "temperature": "7.9375"} /1wire/26.da2f71010000 {"temperature": "25.2812", "IAD": "1", "CA": "0", "VAD": "0.91", "VDD": "4.59", "type": "DS2438"} /1wire/28.48b3010b0000 {"type": "DS18B20", "temperature": "40.5625"} /1wire/1d.6a9306000000 {"type": "DS2423", "counter.B": "9", "counter.A": "9219"} /1wire/28.61cc260a0000 {"type": "DS18B20", "temperature": "12.5"} 

添加到自动运行,设置轮询间隔。 问题解决了。

参考文献


github.com/merbanan/rtl_433-用于解码无线电协议的工具
github.com/kylegordon/mqtt-zabbix-Zabbix上的 MQTT
github.com/unlo/1wire2mqtt-MQTT中的 1wire,MQTT客户端,允许您在出现主题时运行脚本

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


All Articles