跳转到内容

Modbus Controller Select

modbus_controller Select 平台允许您从 Modbus 寄存器创建一个 Select。

  • address (必填, int): Select 第一个或唯一寄存器的起始地址 (可以是十进制或十六进制)。注意,仅支持保持寄存器。

  • optionsmap (必填, Map[str, int]): 提供从此 Select 的选项(str)到 Modbus 寄存器值(int)以及反向映射。所有选项和 所有值必须唯一。

  • value_type (可选): Modbus 数据的数据类型。默认为 U_WORD。

    • U_WORD(来自 1 个寄存器的无符号 16 位整数 = 16bit)
    • S_WORD(来自 1 个寄存器的有符号 16 位整数 = 16bit)
    • U_DWORD(来自 2 个寄存器的无符号 32 位整数 = 32bit)
    • S_DWORD(来自 2 个寄存器的有符号 32 位整数 = 32bit)
    • U_DWORD_R(来自 2 个寄存器的无符号 32 位整数,低字在前)
    • S_DWORD_R(来自 2 个寄存器的有符号 32 位整数,低字在前)
    • U_QWORD(来自 4 个寄存器的无符号 64 位整数 = 64bit)
    • S_QWORD(来自 4 个寄存器的有符号 64 位整数 = 64bit)
    • U_QWORD_R(来自 4 个寄存器的无符号 64 位整数,低字在前)
    • U_QWORD_R(来自 4 个寄存器的有符号 64 位整数,低字在前)
  • register_count (可选): 此 Select 使用的寄存器数量。仅在 不常见的响应编码或需要 优化 Modbus 通信 时才需要。覆盖由 value_type 确定的默认值。

  • skip_updates (可选, int): 默认情况下,modbus_controller 的所有传感器会一起更新。对于变化不频繁的数据点,可以跳过更新。值为 5 表示仅每 6 次更新周期更新一次此传感器范围。注意:modbus_controller 按地址范围对组件进行分组以减少事务数量。所有具有相同起始地址的组件将在一次请求中更新。skip_updates 适用于 同一范围中的所有 组件。

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

  • lambda (可选, lambda): 在每个更新间隔评估 以获取 select 当前选项的 Lambda。

    传入 lambda 的参数

    • x (int64_t ): Modbus 数据的解析整数值。

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

    • item (ModbusSelect*const ): 传感器对象本身。

    lambda 可能的返回值:

    • return <std::string>; 此 Select 的新选项。
    • return {}; 使用默认映射(参见 optionsmap )。
  • write_lambda (可选, lambda): 在 Sensor 每次更新时 评估的 Lambda,在新值写入 Modbus 寄存器之前。

  • use_write_multiple (可选, boolean): 默认情况下,如果只设置一个寄存器,Modbus 命令 功能码 6 (Preset Single Registers) 用于设置保持寄存器。如果您的设备仅支持 功能码 16 (Preset Multiple Registers),请将此选项设置为 true。

  • optimistic (可选, boolean): 是否以乐观模式运行 - 在此模式下, 发送到 Modbus Select 的任何命令都会立即更新报告的状态。默认 为 false。

  • Select 中的所有其他选项。

# 示例
lambda: |-
ESP_LOGD("Reg1000", "Received value %lld", x);
ESP_LOGD("Reg1000", "Parsed from bytes 0x%x;0x%x", data[item->offset], data[item->offset + 1]);
if (x > 3) {
return std::string("Three");
}
  • x (const std::string& ): 要为此 Select 设置的选项值。

  • value (int64_t ): 使用 optionsmap 对 x 的映射值。

  • payload (std::vector<uint16_t> &payload): 空的 payload 向量。lambda 可以添加 16 位原始 Modbus 寄存器字,这些字将发送到 Modbus 设备。

  • item (ModbusSelect*const ): 传感器对象本身。

lambda 可能的返回值:

  • return <int64_t>; 应写入已配置的 Modbus 寄存器的值。如果向 payload 写了数据,则忽略此值。
  • return {}; 跳过更新寄存器。
# 示例
write_lambda: |-
ESP_LOGD("Reg1000", "Set option to %s (%lld)", x.c_str(), value);
// 复用来自 optionsmap 的默认选项值
if (value == 0) {
return value;
}
// 返回自定义选项值
if (x == "One") {
return 2;
}
// 写入 payload
if (x == "Two") {
payload.push_back(0x0001);
return 0; // 任意值均可
}
// 忽略更新
return {};
# 示例配置条目
select:
- platform: modbus_controller
name: "Modbus Select Register 1000"
address: 1000
value_type: U_WORD
optionsmap:
"Zero": 0
"One": 1
"Two": 2
"Three": 3