跳转到内容

Modbus 控制器文本传感器

modbus_controller 传感器平台从 modbus_controller 组件创建文本传感器,并需要配置 Modbus 控制器

  • register_type (必需): modbus 寄存器的类型。

    • coil: 线圈是 1 位寄存器(开/关值),用于控制离散输出。它们可以被读取和/或写入。将使用 Modbus 功能码 1(读取线圈状态)
    • discrete_input: 离散输入寄存器(只读线圈)类似于线圈,但只能被读取。将使用 Modbus 功能码 2(读取输入状态)
    • holding: 保持寄存器 - 保持寄存器是最通用的 16 位寄存器。它们可以被读取和/或写入。将使用 Modbus 功能码 3(读取保持寄存器)
    • read: 读取输入寄存器 - 寄存器是用于输入的 16 位寄存器,只能被读取。将使用 Modbus 功能码 4(读取输入寄存器)
  • address (必需, int): 范围内第一个寄存器的起始地址(可以是十进制或十六进制)。

  • skip_updates (可选, int): 默认情况下,modbus_controller 的所有传感器会一起更新。对于不经常变化的数据点,可以跳过更新。值为 5 表示此传感器范围仅在每 6 次更新周期中更新一次

  • register_count (可选, int): 单个命令中此读取请求应跨越或跳过的连续寄存器数量。默认为 1。有关更多详细信息,请参阅优化 modbus 通信

  • response_size (必需): 响应的字节数。

  • raw_encode (可选, 枚举): 如果响应是二进制的,则无法直接发布。由于文本传感器只发布字符串,可以对二进制数据进行编码。默认为 ANSI。可能的编码有:

    • NONE: 不编码数据。
    • HEXBYTES: 2 字节十六进制字符串。0x2011 将发送为 “2011”。
    • COMMA: 以逗号分隔的字节整数值。0x2011 将发送为 “32,17”。
    • ANSI: 每个字节被视为 ANSI 字符。所有控制字符将被忽略。

NOTE

从 2024.7 版本开始,默认编码为 ANSI。因此,现在所有控制字符都会被忽略。如果您需要接收所有字符,请使用 NONE 编码。

  • force_new_range (可选, boolean): 如果可能,具有连续地址的传感器会被组合在一起并在一个范围内请求。设置 force_new_range: true 会在该地址强制开始一个新范围。

  • custom_command (可选, 字节列表): modbus 命令的原始字节。这允许使用非标准命令。如果使用 custom_command,则不能使用 addressregister_type。 custom command 必须包含所有必需的字节,包括 modbus 设备地址。CRC 会自动计算并附加到命令后面。 请参阅使用 custom_command 了解如何使用 custom_command

  • lambda (可选, lambda): 每个更新间隔评估一次的 lambda,用于获取传感器的新值。它在根据 raw_encode 编码之后被调用。

    传递给 lambda 的参数

    • x (std:string): 根据 raw_encode 解析后的 modbus 数据值

    • data (std::vector<uint8_t>): 包含此传感器完整原始 modbus 响应字节的向量 注意: 由于响应包含同一范围内所有寄存器的数据,您必须使用 data[item->offset] 来获取传感器的第一个响应字节。

    • item (指向 SensorItem 派生对象的常量指针): 传感器对象本身。

    lambda 的可能返回值:

    • return <std::string>; 传感器的新值。
    • return {}; 使用解析后的值作为状态(与 return x; 相同)。
  • offset (可选, int): 相对于起始地址的字节偏移(仅在不常见的响应编码中需要)。如果一个命令中写入多个寄存器,此值用于找到此数据点相对于起始地址的开始位置。组件根据偏移和值类型的大小计算范围的大小。偏移值取决于寄存器类型。

  • 所有选项来自文本传感器

text_sensor:
- platform: modbus_controller
modbus_controller_id: modbus_device
id: reg_1002_text
bitmask: 0
register_type: holding
address: 1002
raw_encode: HEXBYTES
name: Register 1002 (Text)
lambda: |-
uint16_t value = modbus_controller::word_from_hex_str(x, 0);
switch (value) {
case 1: return std::string("ready");
case 2: return std::string("EV is present");
case 3: return std::string("charging");
case 4: return std::string("charging with ventilation");
default: return std::string("Unknown");
}
return x;