跳转到内容

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必填,整数):范围内第一个寄存器的起始地址(可以是十进制或十六进制)。

  • assumed_state可选 布尔值):禁用此寄存器的更新(定期读取命令)。默认为 false

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

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

  • use_write_multiple可选,布尔值):默认情况下,如果只设置一个寄存器,则使用 Modbus 命令 功能码 6(预置单个寄存器) 来设置保持寄存器。如果您的设备只支持 功能码 16(预置多个寄存器),请将此选项设置为 true

  • bitmask可选,整数):某些值被打包在响应中。位掩码用于确定结果是 true 还是 false。请参阅位掩码

  • lambda可选lambda): 每个更新间隔评估一次的 lambda,用于读取开关的状态。

  • write_lambda可选lambda):发送前调用的 lambda。 Lambda 在创建 modbus 写入命令之前被评估。

    传递给 lambda 的参数

    • x(浮点数):要发送到 modbus 设备的浮点值

    • payloadstd::vector<uint8_t> &payload):用于载荷的空向量。如果在 lambda 中设置了载荷,它将作为自定义命令发送,必须包含 modbus 请求所需的所有字节 注意: 由于响应包含同一范围内所有寄存器的数据,您必须使用 data[item->offset] 获取传感器的第一个响应字节。

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

    lambda 的可能返回值:

    • return true;return false; 传感器的新值。
    • return <anything>; 并用数据填充载荷,如果从 lambda 添加了载荷,则这些字节将被发送。
    • return {}; 在 lambda 自行处理值发送的情况下。
  • custom_command可选,字节列表):modbus 命令的原始字节。这允许使用非标准命令。如果使用 custom_command,则不能使用 addressregister_type。 自定义数据必须包含所有必需的字节,包括 modbus 设备地址。CRC 会自动计算并附加到命令中。 请参阅使用 custom_command了解如何使用 custom_command

  • offset可选,整数):从起始地址的字节偏移量(仅用于不常见的响应编码)。如果在一个命令中写入多个寄存器,此值用于查找此数据点相对于起始地址的开始位置。组件根据偏移量和值类型的大小计算范围的大小。偏移量的值取决于寄存器类型。对于保持输入寄存器,偏移量以字节为单位。对于线圈和离散输入寄存器,第一个数据字节的 LSB 包含请求中寻址的线圈。其他线圈从此字节的高端延续,并从低到高延续到后续字节。对于寄存器,偏移量是相关位的位置。要获取线圈寄存器的值,可以使用 address: 2 / offset: 0address: 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 ; // 使用此选项仅更改值
payload.push_back(0x1); // 设备地址
payload.push_back(0x5); // 强制单个线圈
payload.push_back(0x00); // 线圈地址高字节
payload.push_back(0x6); // 线圈地址低字节
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"