Modbus Controller 开关
modbus_controller 开关平台从 modbus_controller 组件创建一个开关,
需要配置 Modbus Controller。
-
register_type(必填):modbus 寄存器的类型。
coil: 线圈是 1 位寄存器(开/关值),用于控制离散输出。它们可以被读取和/或写入。将使用 Modbus 功能码 1(读取线圈状态)。discrete_input: 离散输入寄存器(只读线圈)与线圈类似,但只能读取。将使用 Modbus 功能码 2(读取输入状态)。holding: 保持寄存器 - 保持寄存器是最通用的 16 位寄存器。它们可以被读取和/或写入。将使用 Modbus 功能码 3(读取保持寄存器)。read: 读取输入寄存器 - 寄存器是用于输入的 16 位寄存器,只能读取。将使用 Modbus 功能码 4(读取输入寄存器)。
-
address(必填,int):范围内第一个寄存器的起始地址(可以是十进制或十六进制)。
-
assumed_state(可选,布尔值):为此寄存器禁用更新(周期性读取命令)。默认为
false。 -
skip_updates(可选,int):默认情况下,modbus_controller 的所有传感器会一起更新。对于不经常变化的数据点,可以跳过更新。值 5 表示每 5 次更新周期才更新一次此传感器范围。注意:modbus_controller 按地址范围对组件进行分组以减少事务数量。所有具有相同起始地址的组件将在一个请求中更新。
skip_updates应用于 所有 在同一范围内的组件。 -
register_count(可选,int):此读取请求应在单个命令中跨越或跳过的连续寄存器数量。默认为 1。更多详情请参见 优化 modbus 通信。
-
use_write_multiple(可选,布尔值):默认情况下,如果只设置了一个寄存器,modbus 命令 功能码 6(预置单个寄存器) 将用于设置保持寄存器。如果你的设备仅支持 功能码 16(预置多个寄存器),请将此选项设置为
true。 -
bitmask(可选,int):一些值在响应中打包。位掩码用于确定结果为 true 还是 false。参见 位掩码。
-
lambda(可选,lambda): 在每个更新间隔评估的 lambda,用于读取开关状态。
-
write_lambda(可选,lambda):发送前调用的 lambda。 在创建 modbus 写入命令之前评估 lambda。
传入 lambda 的参数
-
x(float):要发送到 modbus 设备的浮点值
-
payload(
std::vector<uint8_t> &payload):用于 payload 的空向量。如果 payload 在 lambda 中设置,则作为自定义命令发送,必须包含 modbus 请求所需的所有字节 注意:因为响应包含同一范围内所有寄存器的数据,所以你必须使用data[item->offset]来获取传感器的第一个响应字节。 -
item(指向 Switch 派生对象的 const 指针):传感器对象本身。
lambda 的可能返回值:
return true;或return false;为传感器的新值。return <anything>;并用数据填充 payload,如果 payload 从 lambda 中添加,则这些字节将被发送。return {};在 lambda 自行处理值发送的情况下。
-
-
custom_command(可选,字节列表):modbus 命令的原始字节。这允许使用非标准命令。如果使用
custom_command,则不能使用address和register_type。 自定义数据必须包含所需的所有字节,包括 modbus 设备地址。CRC 将自动计算并附加到命令中。 参见 使用custom_command了解如何使用custom_command -
offset(可选,int):从起始地址的字节偏移(仅用于非标准响应编码)。如果在单个命令中写入多个寄存器,则此值用于相对于起始地址查找此数据点的起始位置。组件根据偏移和值类型的大小计算范围的大小。偏移的值取决于寄存器类型。对于保持输入寄存器,偏移以字节为单位。对于线圈和离散输入寄存器,第一个数据字节的最低有效位包含请求中寻址的线圈。其他线圈向该字节的高位端以及后续字节的低位到高位排列。对于寄存器,偏移是相关位的位置。要获取线圈寄存器的值,可以使用
address: 2/offset: 0或address: 0/offset 2检索 2。 -
restore_mode(可选):参见 Switch,此配置变量是继承的。此设置的默认值为
DISABLED(推荐)。DISABLED将初始状态留给硬件决定:通常状态存在于设备中,ESPHome 不需要记住它。开关前端将显示 未确定的状态,直到下次刷新时从设备获取真实状态。如果你的 ESPHome 设备重启与 modbus 设备的重启相关,请使用任何其他设置。
switch:- platform: modbus_controller modbus_controller_id: epever id: enable_load_test register_type: coil address: 2 name: "enable load test mode" bitmask: 1switch: - platform: modbus_controller modbus_controller_id: epever id: enable_load_test register_type: coil address: 2 name: "enable load test mode" write_lambda: |- ESP_LOGD("main","Modbus Switch incoming state = %f",x); // return false ; // use this to just change the value payload.push_back(0x1); // device address payload.push_back(0x5); // force single coil payload.push_back(0x00); // high byte address of the coil payload.push_back(0x6); // low byte address of the coil payload.push_back(0xFF); // ON = 0xFF00 OFF=0000 payload.push_back(0x00); return true;由于偏移不为零,读取命令是范围的一部分,将在范围更新时进行解析。 构造的写入命令使用功能码来确定写入命令。对于线圈,它是写入单个线圈。 因为写入命令只涉及一个寄存器,所以 start_address 和 offset 必须被纠正。 最终命令将是 write_single_coil 功能码 5 地址(start_address+offset)值 1 或 0
对于保持寄存器,写入命令将是 write_single_register(功能码 6(预置单个寄存器))。因为保持寄存器的偏移以字节为单位,且寄存器大小为 16 字节,所以 start_address 计算为 start_address + offset/2
switch:- platform: modbus_controller modbus_controller_id: ventilation_system name: "enable turn off" register_type: holding address: 25 bitmask: 1 entity_category: config icon: "mdi:toggle-switch"