如何可视化水表数据并在用水过量时获得警报
在我居住的村庄,水表每五年更换一次,今年正好是第五年。我借机与市政办公室沟通,询问是否能够安装带脉冲模块的水表以便接入家庭网络。他们同意了——再次感谢!
上周他们来安装了新水表(我不在家),回家后我发现了以下设备:
他们还留下了包装,使我能够推测模块型号。看起来像是Wehrle公司的“Ringkolben-Patronenzähler MODULARISRTK-OPX”(如数据手册所示)。虽然不确定是S0还是M-Bus版本,但朋友告知M-Bus版本昂贵得多,因此我推断这是S0版本。
连接S0模块
水表配备光耦器(光电耦合器),由内置电池供电。每流过一升水,上图所示的两根线缆会短暂连接(例如100毫秒)。最简单的方法是使用5V上拉电阻,但这可能引发问题。更好的方案是使用2个电阻和2个电容来稳定脉冲并防止电磁干扰等不良影响。由于学校所学知识已久远,我请教了经常设计电路的朋友,得到了以下电路图:
他建议使用以下电阻和电容:
- R1 – 4.7kΩ
- R2 – 470Ω
- C1 – 100nF
- C2 – 10nF
我在家搭建了这个电路(图中未完全展示):
我使用了旧PC电源连接器连接水表,便于断开。硬件成本至今不足1欧元——当然家里已有一些工具(如焊铁)。
现在回到我更熟悉的领域……
将信号接入网络
我家有几个树莓派,最初考虑使用一个,但过于大材小用,因为我打算在家庭服务器的容器中进行可视化和警报。我选择了类似Arduino但更便宜的方案:NodeMCU,它具备项目所需全部功能:
- 支持中断触发的数字输入→无需轮询,避免丢失脉冲
- WiFi支持,可连接IoT网络
- 与Arduino IDE集成 成本不足5欧元。
来看看我的代码(可从此处下载)。代码第一部分导入所需库并定义变量:
- WiFi SSID和密码
- 每升水通知的主机和端口——使用InfluxDB,后续展示其简便性
- 连接水表的引脚——确保支持中断
以下是启动时执行的代码,连接WiFi并附加中断:
|
|
中断调用代码仅为每升水发送UDP消息(格式为InfluxDB),其余由InfluxDB时间序列数据库处理。
如您所见,代码非常简单——复杂部分由InfluxDB完成。
可视化与警报
当然,我可以自己编写可视化和警报程序(过去做过),但时代变了。InfluxDB及其同团队的其他项目为此类家庭项目提供了比我所能做的更好、更全面的解决方案。您将看到它是多么简单。我在Linux家庭服务器上以空LXC容器开始。容器中使用Debian 9,但InfluxDB支持所有主流发行版。
首先安装curl和apt的https支持——我的容器尽可能小:
|
|
下载InfluxDB仓库的签名密钥:
|
|
添加仓库到列表:
|
|
安装软件:
|
|
默认情况下,InfluxDB的UDP接口禁用。需修改配置文件/etc/influxdb/influxdb.conf,类似如下:
|
|
启用各项服务:
|
|
若一切正常,您应看到:
|
|
创建UDP配置的数据库:
|
|
之后在浏览器中打开http://<服务器IP>:8888,填写表单:
- 连接字符串:输入运行InfluxDB的主机名或IP,包含默认端口8086(本例为localhost/127.0.0.1)
- 连接名称:为连接字符串命名
- 用户名和密码:若未在InfluxDB启用授权,可留空
- Telegraf数据库名称:可选,默认为Telegraf
其余均可通过浏览器完成——查看我的仪表板元素配置之一(SQL代码通过点击生成)。
我的水表仪表板目前如下:
您还可以定义警报。例如,如果一小时内用水超过100升,则发送警报消息——我应知晓是否发生及是否正常。
希望您看到可视化与警报水表是多么简单。成本也非常低——如果您已有服务器,一切约5欧元;否则可在树莓派(约30欧元)、月租1-2欧元的虚拟服务器或NAS的容器功能上运行。
发布于HowTo、Linux、Networking | 1条评论
1条评论
David Simmons 2019年5月1日
这太酷了!如果您迁移到InfluxDB 2.0 Alpha,可以使用我的Arduino InfluxDB库(https://github.com/davidgs/ESP8266_Influx_DB)直接写入数据库。另请关注我的新2.0 MQTT输出!
— dg
发表评论
名称(必填)
邮箱(不会发布,必填)
网站
(支持XHTML标签)