#mqtt #modbus #modbus-tcp #sungrow #tls

bin+lib modbus-mqtt

Modbus 设备与 MQTT 之间的桥梁

3 个版本 (破坏性)

0.3.0 2024年7月12日
0.2.0 2022年9月9日
0.1.0 2022年8月30日

#342 in 网络编程

Download history 124/week @ 2024-07-10 1/week @ 2024-07-17 5/week @ 2024-07-24

130 每月下载量

MIT 许可证

67KB
1.5K SLoC

ModbusMQTT

Docker Crates.io docs.rs license

Modbus 设备与 MQTT 之间的桥梁。

目前还处于早期阶段,但计划是

  • 支持自定义 Modbus 传输(Sungrow WiNet-S 已实现)
    • Modbus RTU 尚未测试,因为我没有串行 Modbus 设备,但从理论上讲应该可以工作。请告诉我
  • 支持读取输入寄存器
  • 支持读取保持寄存器
  • 支持 设置 保持寄存器
  • 支持可选自动配置 Home Assistant 实体,包括使用 MQTT Number 等为保持寄存器,允许设置值。
  • TLS MQTT 连接
  • WebSocket MQTT 连接

注意:目前不支持 MQTTv5。

安装

从源码安装

目前,使用 cargo install 是安装的最简单方法。要么在最新开发版本的签出中运行它,要么运行 cargo install modbus-mqtt 以安装最新版本。

预编译版本

如果您不想设置 Rust 工具链,您很可能在上述 GitHub Actions 标签 中找到构建的二进制文件作为构建工件。

Docker

$ docker run -it --rm bjeanes/modbus-mqtt:edge --help

标签

  • v#v#.#v#.#.# - semver 版本(major.minor.patch
  • latest - 对应于最新的 semver 标签构建
  • edge - 来自 main 的最新可构建分支,可能是不稳定的
  • *-alpine - 上面的 alpine 版本

运行中

启动二进制程序,传递给MQTT服务器的URL,包括任何凭证

$ modbus-mqtt mqtt://$MQTT_HOST[:$MQTT_PORT]/[$CUSTOM_MODBUS_TOPIC]

当前支持的协议仅为 tcp:///mqtt://,但打算支持: mqtts://ssl:///tls://ws://wss://

ModbusMQTT监控并发布的默认主题是modbus-mqtt。您可以通过更改MQTT URL的路径部分来更改此主题。

此外,您可以通过使用查询参数来更改其他MQTT选项,例如设置自定义的client_id

"mqtt://1.2.3.4/?client_id=$CUSTOM_CLIENT_ID"

有关支持的选项的完整列表,请检查MQTT客户端库的源代码

连接到Modbus设备

要连接到Modbus设备,您需要将连接详情发布到MQTT的$prefix/$connection_id/connect主题下。这些消息应该被标记为保留,这样当ModbusMQTT重启或崩溃时,它会重新连接到您的设备。

例如,一个简单的配置可能如下

// PUBLISH modbus-mqtt/solar-inverter/connect
{
  "host": "10.10.10.219",
  "proto": "tcp",
}

如果连接成功,您将看到如下消息发送到MQTT服务器

// modbus-mqtt/solar-inverter/state
"connected"

完整的连接示例

请检查examples/目录中的示例,并请随时分享您自己的示例,注明相应的供应商/设备信息。

以下JSON包含所有支持的连接配置字段,其中可选字段显示默认值。

{
  // Common fields
  "address_offset": 0, // optional
  "unit": 1,           // optional, aliased to "slave"

  // TCP:
  "proto": "tcp",
  "host": "1.2.3.4",
  "port": 502, // optional

  // RTU / Serial:
  "proto": "rtu",
  "tty": "/dev/ttyACM0",
  "data_bits": "Eight",   // optional (TODO: accept numeric and lowercase)
                          //   valid: Five, Six, Seven, Eight
  "stop_bits": "One",     // optional (TODO: accept numeric and lowercase)
                          //   valid: One, Two
  "flow_control": "None", // optional (TODO: accept lowercase)
                          //   valid: None, Software, Hardware
  "parity": "None",       // optional (TODO: accept lowercase)
                          //   valid: None, Odd, Even

  // Sungrow WiNet-S dongle
  "proto": "winet-s",
  "host": "1.2.3.4",
}

监控寄存器

$MODBUS_MQTT_TOPIC/$CONNECTION_ID/$ADDRESS发送以下负载(可选字段显示默认值)

{
  "address": 5123,          // REQUIRED

  "register_type": "input", // OPTIONAL

  "name": null,             // OPTIONAL - gives the register a name which is used in the register MQTT topics (must be a valid topic component)

  "interval": "1m",         // OPTIONAL - how often to update the registers value to MQTT
                            //   e.g.: 3s (every 3 seconds)
                            //         2m (every 2 minutes)
                            //         1h (every 1 hour)

  "swap_bytes": false,      // OPTIONAL
  "swap_words": false,      // OPTIONAL

  "type": "s16",            // OPTIONAL
                            //   valid: s8, s16, s32, s64 (signed)
                            //          u8, u16, u32, u64 (unsigned)
                            //          f32, f64          (floating point)

  "scale": 0,               // OPTIONAL - number in register will be multiplied by 10^(scale)
                            //   e.g.: to turn kW into W, you would provide scale=3
                            //         to turn W into kW, you would provide scale=-3

  "offset": 0,              // OPTIONAL - will be added to the final result (AFTER scaling)
}
寄存器缩写

在发出connect负载时,您可以可选地包含一个顶级的registers数组,包含上述寄存器模式。如果存在,这些负载将作为如果用户分别指定了每个寄存器一样,被重播到MQTT服务器。

这是指定连接的推荐方式,但寄存器被分开列出,以便它们也可以动态添加。

开发

TODO:设置类似于https://hub.docker.com/r/oitc/modbus-server的东西以进行测试

类似的项目

依赖关系

~9–23MB
~361K SLoC