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"); }传入 write_lambda 的参数
Section titled “传入 write_lambda 的参数”-
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