可视化水表使用并实现用水超量警报的技术指南

本文详细介绍了如何通过S0脉冲模块连接水表,使用NodeMCU和Arduino IDE开发数据采集程序,并通过InfluxDB实现用水数据的实时可视化与警报功能,全程硬件成本不足5欧元。

如何可视化水表数据并在用水过量时获得警报

在我居住的村庄,水表每五年更换一次,今年正好是第五年。我借机与市政办公室沟通,询问是否能够安装带脉冲模块的水表以便接入家庭网络。他们同意了——再次感谢!

上周他们来安装了新水表(我不在家),回家后我发现了以下设备:

他们还留下了包装,使我能够推测模块型号。看起来像是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并附加中断:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* host = "influxdb_server_ip";
const int port = 8086;
const int meterPin = D1; // 中断支持引脚

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("Connected to WiFi");
  attachInterrupt(digitalPinToInterrupt(meterPin), waterPulse, RISING);
}

void waterPulse() {
  String data = "water,device=meter value=1";
  Udp.beginPacket(host, port);
  Udp.write(data.c_str());
  Udp.endPacket();
}

中断调用代码仅为每升水发送UDP消息(格式为InfluxDB),其余由InfluxDB时间序列数据库处理。

如您所见,代码非常简单——复杂部分由InfluxDB完成。

可视化与警报

当然,我可以自己编写可视化和警报程序(过去做过),但时代变了。InfluxDB及其同团队的其他项目为此类家庭项目提供了比我所能做的更好、更全面的解决方案。您将看到它是多么简单。我在Linux家庭服务器上以空LXC容器开始。容器中使用Debian 9,但InfluxDB支持所有主流发行版。

首先安装curl和apt的https支持——我的容器尽可能小:

1
# apt install curl apt-transport-https

下载InfluxDB仓库的签名密钥:

1
# curl -sL https://repos.influxdata.com/influxdb.key | apt-key add -

添加仓库到列表:

1
2
# cat >> /etc/apt/sources.list
deb https://repos.influxdata.com/debian stretch stable

安装软件:

1
2
# apt update
# apt-get install influxdb chronograf kapacitor

默认情况下,InfluxDB的UDP接口禁用。需修改配置文件/etc/influxdb/influxdb.conf,类似如下:

1
2
3
4
[[udp]]
enabled = true
bind-address = ":8888"
database = "db_iot"

启用各项服务:

1
2
3
4
# systemctl enable influxdb
# systemctl start influxdb
# systemctl enable kapacitor
# systemctl start kapacitor

若一切正常,您应看到:

1
2
3
# netstat -lpn | grep 8888
tcp6 0 0 :::8888 :::* LISTEN 1505/chronograf
udp6 0 0 :::8888 :::* 1539/influxd

创建UDP配置的数据库:

1
2
3
4
5
6
# influx
Connected to http://localhost:8086 version 1.7.6
InfluxDB shell version: 1.7.6
Enter an InfluxQL query
> CREATE DATABASE db_iot
> exit

之后在浏览器中打开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标签)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计