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

本文详细介绍了如何通过S0脉冲模块连接水表,使用NodeMCU采集数据,并通过InfluxDB实现实时可视化与警报功能。包含硬件电路设计、Arduino代码实现及数据库配置的全流程技术方案。

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

在我居住的村庄,水表每五年更换一次,今年正好是第五年。我借此机会与市政办公室沟通,询问是否可以获得带脉冲模块的水表,以便集成到我的家庭网络中。他们同意了——再次感谢!

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

他们还留下了包装,使我能够推测模块型号。看起来像是Wehrle公司的"Ringkolben-Patronenzähler MODULARISRTK-OPX",如这份数据表所示。我不完全确定是S0还是M-Bus版本,但朋友告诉我应该是S0版本,因为M-Bus版本贵得多,所以我选择了这个。

连接S0模块

水表基本上有一个光耦合器(光电耦合器),在我的情况下由内部电池供电。每流过一升水,上面显示的两根电线会短暂连接(例如100毫秒)。在最简单的情况下,可以使用上拉电阻到5V,但这可能会导致问题。最好使用2个电阻和2个电容来稳定脉冲并防止电磁干扰等不良影响。由于我学校学这个的时间太久了,我请了一个经常做电路的朋友帮忙,得到了这个图纸:

他告诉我使用以下电阻和电容:

  • R1 – 4.7kOhm
  • R2 – 470Ohm
  • C1 – 100nF
  • C2 – 10nF

在家,我搭建了这个电路(图片上未完全完成):

如你所见,我使用了旧的PC电源连接器来连接水表,这样可以轻松断开连接。硬件成本到目前为止不到1欧元——好吧,家里需要一些现成的东西(例如焊铁)。

现在,回到我更熟悉的领域……

将信号接入网络

我家有几个树莓派,起初我想使用一个,但对我来说这太过了,因为我想在家服务器的容器中进行可视化和警报。我选择了类似Arduino但更便宜的东西。

我选择了NodeMCU,它拥有这个项目所需的一切:

  • 带中断触发的数字输入 –> 无需轮询且不会错过脉冲
  • WiFi支持连接到我的物联网网络
  • 与Arduino IDE集成
  • 成本低于5欧元

让我们看看我的代码——你可以从这里下载。在代码的第一部分,我们导入所需的库并定义一些变量:

  • WiFi SSID和密码
  • 我们将为每升水通知的主机和端口——我们将使用InfluxDB,你会看到这有多简单
  • 我们连接水表的PIN——确保它支持中断

现在是在启动时执行一次的代码,我们连接到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
29
30
31
32
33
34
35
36
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* host = "your_InfluxDB_host";
const int port = 8086;

const int waterMeterPin = 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");
  pinMode(waterMeterPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(waterMeterPin), waterPulse, FALLING);
}

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

void loop() {
  // 空循环,所有工作由中断处理
}

最后是需要由中断调用的代码——它只是为每升水发送一个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,并确保包含InfluxDB的默认端口8086。在我的/我们的情况下,它是localhost / 127.0.0.1
  • 连接名称:为你的连接字符串输入一个名称。
  • 用户名和密码:除非你在InfluxDB中启用了授权,否则这些字段可以留空。
  • Telegraf数据库名称:可选地,为你的Telegraf数据库输入一个名称。默认名称是Telegraf。

其他所有都可以通过浏览器完成——只需看看我的仪表板元素之一的配置——SQL代码是通过点击编写的:-)。

我的水表仪表板目前看起来像这样:

你也可以定义警报。在这种情况下,如果一小时内使用超过100升水,我希望收到警报消息——我应该知道是否发生这种情况以及是否正常。

我希望你看到可视化和警报水表有多简单。它也非常便宜——如果你已经有服务器,一切大约5欧元,否则让它在树莓派上运行(约30欧元),租用虚拟服务器1-2欧元/月,或使用NAS的容器功能。

发表于HowTo, Linux, Networking | 1条评论

评论

David Simmons — 2019年5月1日
这太酷了!如果你迁移到InfluxDB 2.0 Alpha,你可以使用我的Arduino InfluxDB库从这里:https://github.com/davidgs/ESP8266_Influx_DB,你可以直接写入数据库。也请关注我的新2.0 MQTT输出!
dg


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