#telemetry #inverter #modbus #pcap #wifi #serial #sunsynk

bin+lib sunsniff

拦截并存储 Sunsynk 逆变器的遥测数据

7 个版本

0.3.2 2023年12月25日
0.3.1 2023年10月22日
0.3.0 2023年5月13日
0.2.0 2023年3月26日
0.1.1 2022年11月13日

#546网络编程

GPL-3.0-or-later

55KB
909

逆变器遥测数据捕获

此程序从 Sunsynk/Deye 路由器收集数据并使其可供使用。它可以以两种方式(称为“前端”)收集数据

  1. 在逆变器与带有 Inteless WiFi 转换器的逆变器之间运行的路由器上运行。在这种模式下,它是一个完全被动的观察者,因此不能与逆变器的操作接口。这称为 pcap 前端。

  2. 通过将串行线连接到逆变器,可以对其进行交互式查询。这需要额外的硬件,但可以设置查询间隔(并且比转换器使用的 5 分钟间隔要快得多),并且可以移除转换器以获得更好的隐私和安全。在这种模式下,发送到您的逆变器的命令仅读取(而不是写入)寄存器,因此仍然相当安全。这是 modbus 前端。有关如何布线 RS485 线缆的信息,请参阅 此指南。有报告称 RS232 连接也有效。

目前还有两个“后端”,它们决定了如何处理数据。

  1. 将值存储在 Influxdb 数据库中(需要 Influxdb2)。
  2. 通过 MQTT 广播值。

这是 alpha 软件(尽管我每天都在使用它)。所有模式都可能更改。您收集的数据可能会消失,或者泄露到互联网上(但它已经以未加密的形式发送,这也是为什么这个项目一开始就工作的原因)。配置文件格式可能会更改。它可能会挂起您的路由器。

编译

  1. 使用以下说明安装 Rust,例如 这些说明
  2. 确保您有 C 编译器和链接器,以及 libpcap 已安装。
  3. 运行 cargo install sunsniff 来安装二进制文件。或者,检查代码库并运行 cargo build --release。这将编译二进制文件到 target/release/sunsniff

如果您想进行交叉编译

  1. 安装并设置 cross,例如使用 这些说明
  2. 运行 cross build --release --target=armv7-unknown-linux-gnueabihf(替换为您自己的目标架构)。
  3. target/<arch>/release/target 中找到二进制文件。

我遇到了问题,因为生成的二进制文件需要一个比我要针对的宿主机更新的 glibc。要构建静态二进制文件,请将环境变量 RUSTFLAGS 设置为 -C target-feature=+crt-static -lpcap。我还发现 DNS 与 glibc 不兼容,所以我最终使用了 armv7-unknown-linux-musleabihf 作为目标。

配置

配置存储在 TOML 文件中,该文件通过命令行传递。

配置一个可能的前端(不要尝试配置多个),以及至少一个后端。可以拥有多个相同后端的实例(双方括号是 TOML 语法,允许这样做)。

Pcap 前端

创建一个 [pcap] 部分。它具有以下字段

  • device(必需):要捕获的以太网设备。请注意,当前不支持 any 设备。
  • filter(可选但推荐):用于选择要检查的流量的 pcap 过滤器。如果 device 处理网络中其他设备的任何数据,则需要设置 filter 以防止其他数据被意外解释为传感器读数。
  • file(可选):如果设置为 true,则 device 被解释为 pcap 文件而不是设备。请注意,pcap 文件会全部加载到内存中,因此不应与非常大的文件一起使用。
  • timezone(必需):逆变器使用的时区名称。这用于将时间戳转换为 UTC。

我的配置如下

[pcap]
device = "br0"
filter = "src host 192.168.0.21"
timezone = "Africa/Johannesburg"

Modbus 前端

创建一个 [modbus] 部分。它具有以下字段

  • device(必需):串行设备,或 Modbus over TCP 的地址,格式为 host:port(即使使用 Modbus 默认设置,端口也是必需的)。
  • interval(必需):样本之间的时间(以秒为单位)
  • baud(可选):串行端口的波特率。默认为 9600。
  • modbus_id(可选):逆变器的 Modbus 从机号。检查逆变器的设置。默认为 1。

我的配置如下

[modbus]
device = "/dev/ttyUSB0"
baud = 9600
interval = 20

Influxdb2 后端

读数被插入到 Influxdb 2.x 存储桶中。请注意,模式 尚未最终确定

配置部分如下所示

[[influxdb2]]
host = "http://192.168.0.123:8086/"
org = "my_org"
bucket = "my_bucket"
token = "..."

实现部分非常努力地处理与Influxdb的间歇性连接,缓冲消息直到能够发送(但只存在于内存中;如果服务停止,任何挂起的消息都将丢失)。由于更新每5分钟发送一次,因此缓冲数小时或数天是非常实用的,我现在在我的家用电脑上运行Influxdb服务器,晚上会关机。

这种鲁棒性的缺点是,如果您配置错误,服务器不会因错误而停止。它将不断尝试发送,并使用越来越多的内存来缓冲传入的消息。

MQTT后端(Home Assistant)

此后端将传感器值发布到MQTT代理。主题专门设计用于与Home Assistant一起使用,并提供适当的发现信息,但这并不阻止其他用例。您需要安装一个MQTT代理(Home Assistant支持Mosquitto作为附加组件),并配置Home Assistant以使用它。典型的配置如下所示

[[mqtt]]
url = "mqtt://192.168.0.123:1883"
username = "my_username"
password = "my_password"

如果代理不需要身份验证,则可以省略用户名和密码。

不幸的是,我使用的MQTT库不支持MQTT最后一条消息,因此没有可用信息来指示服务正在运行。

支持硬件

到目前为止,我只在我的个人设置中测试过。我希望其他设备也能正常工作。如果它对您有效,请告诉我。请注意,由于它们使用不同的寄存器,因此不太可能与三相逆变器一起工作。

  • 逆变器:Sunsynk 5 kW(Sunsynk-5K-SG01LP1)
  • USB串行适配器:未标记的品牌Inteless串行适配器(它有红绿灯)。据称,Sunsynk品牌的串行适配器与此相同。

故障排除

使用env_logger进行记录,因此您可以通过设置环境变量RUST_LOG=debug来启用调试。但是,目前的记录并不多。

待办事项

  • 解释在数据包捕获中寻找什么
  • 解释缺少pcap过滤器会导致假数据

变更日志

0.3.2

  • 依赖项更新
  • 使用modbus-robust,以便在重启mbusd时进行鲁棒处理

0.3.1

  • 依赖项更新
  • 修复aarch64-linux-gnu的交叉构建

0.3

  • 添加grid_connected传感器
  • 添加程序时间块的传感器
  • 使pcap前端可选
  • 修复某些架构的pcap交叉编译

0.2

  • 添加modbus支持。
  • pv_voltage 1重命名为pv_voltage_1(空格是一个错误)。
  • 更改用于grid_powerinverter_powerload_power的偏移量。在我的逆变器上,这没有区别,但如果有其他连接,可能会给您提供更准确的数据。
  • 希望修复kWh传感器以包括高32位,以便支持超过32767 kWh的值(未经测试)。

0.1.2

  • 尝试在启动时连接到InfluxDB,如果不可达,则显示警告。
  • 增加依赖项版本(这似乎修复了TLS的InfluxDB)。
  • 改进文档。

0.1.1

添加更多字段。

0.1.0

首次发布。

依赖项

~18–34MB
~562K SLoC