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 在 网络编程
55KB
909 行
逆变器遥测数据捕获
此程序从 Sunsynk/Deye 路由器收集数据并使其可供使用。它可以以两种方式(称为“前端”)收集数据
-
在逆变器与带有 Inteless WiFi 转换器的逆变器之间运行的路由器上运行。在这种模式下,它是一个完全被动的观察者,因此不能与逆变器的操作接口。这称为
pcap
前端。 -
通过将串行线连接到逆变器,可以对其进行交互式查询。这需要额外的硬件,但可以设置查询间隔(并且比转换器使用的 5 分钟间隔要快得多),并且可以移除转换器以获得更好的隐私和安全。在这种模式下,发送到您的逆变器的命令仅读取(而不是写入)寄存器,因此仍然相当安全。这是
modbus
前端。有关如何布线 RS485 线缆的信息,请参阅 此指南。有报告称 RS232 连接也有效。
目前还有两个“后端”,它们决定了如何处理数据。
- 将值存储在 Influxdb 数据库中(需要 Influxdb2)。
- 通过 MQTT 广播值。
这是 alpha 软件(尽管我每天都在使用它)。所有模式都可能更改。您收集的数据可能会消失,或者泄露到互联网上(但它已经以未加密的形式发送,这也是为什么这个项目一开始就工作的原因)。配置文件格式可能会更改。它可能会挂起您的路由器。
编译
- 使用以下说明安装 Rust,例如 这些说明。
- 确保您有 C 编译器和链接器,以及 libpcap 已安装。
- 运行
cargo install sunsniff
来安装二进制文件。或者,检查代码库并运行cargo build --release
。这将编译二进制文件到target/release/sunsniff
。
如果您想进行交叉编译
- 安装并设置 cross,例如使用 这些说明。
- 运行
cross build --release --target=armv7-unknown-linux-gnueabihf
(替换为您自己的目标架构)。 - 在
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_power
、inverter_power
和load_power
的偏移量。在我的逆变器上,这没有区别,但如果有其他连接,可能会给您提供更准确的数据。 - 希望修复kWh传感器以包括高32位,以便支持超过32767 kWh的值(未经测试)。
0.1.2
- 尝试在启动时连接到InfluxDB,如果不可达,则显示警告。
- 增加依赖项版本(这似乎修复了TLS的InfluxDB)。
- 改进文档。
0.1.1
添加更多字段。
0.1.0
首次发布。
依赖项
~18–34MB
~562K SLoC