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

本文详细介绍了如何通过S0脉冲模块连接水表,使用NodeMCU和Arduino代码读取数据,并利用InfluxDB时序数据库进行数据存储、可视化图表展示以及设置用水量超限警报的完整技术方案。

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

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

上周他们来安装了新水表,当时我不在家。回家后我发现了以下物品:

他们还留下了包装,让我得以猜测模块型号。在我看来,这像是 Wehrle 公司的“Ringkolben-Patronenzähler MODULARISRTK-OPX”,如这份数据手册所示。我不完全确定是 S0 版本还是 M-Bus 版本,但一位朋友告诉我,这肯定是 S0 版本,因为 M-Bus 版本要贵得多。于是,我就按此进行。

连接 S0 模块

基本上,水表内部有一个光耦(光电耦合器),在我的案例中由内部电池供电。每流过水表一升水,上面所示的两根电线就会短接一小段时间(例如 100 毫秒)。最简单的情况下,可以只使用一个上拉电阻到 5V,但这可能会带来问题。最好使用 2 个电阻和 2 个电容来稳定脉冲并防止电磁干扰等不良影响。由于我学习这些知识的年代太过久远,我请了一位经常设计电路的朋友帮忙,他画出了这个图:

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

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

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

如图所示,我使用了旧的 PC 电源连接器来连接水表,以便轻松断开连接。到目前为止硬件成本不到 1 欧元——当然,家里需要已经有了一些工具(例如电烙铁)。

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

将信号接入我的网络

家里有几个 Raspberry Pi,起初我考虑使用一个,但这对我的需求来说有点大材小用,因为我本来就打算在家庭服务器的容器中进行可视化和警报。我选择了类似 Arduino 但更便宜的东西。

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

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

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

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

然后是启动时执行一次的代码,我们在这里连接到 WiFi 并附加中断。

最后,我们需要中断调用的代码——它只是为每一升水发送一条 InfluxDB 格式的 UDP 消息,剩下的就交给 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 欧元,否则可以在 Raspberry PI(约 30 欧元)上运行,每月花 1-2 欧元租用虚拟服务器,或者使用你 NAS 的容器功能。

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