跳转到内容

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: 1
switch:
- 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"