modbus 是一种用于控制 PLC(可编程逻辑控制器)和 RTU(远程终端单元)的通信协议。

集成严格遵守 协议规范,使用 pymodbus 进行协议实现。

modbus 集成支持所有遵守 modbus 标准的设备。与设备的通信可以是串行 (rs-485)、TCP 或 UDP 连接。 Modbus 集成允许多个通信通道,例如与一个或多个 TCP 连接相结合的串行端口连接。

配置 Modbus 通讯

配置与 modbus 设备的 modbus 通信。这是建立对设备的访问权限所需的一般设置。

Modbus 集成允许您使用多个连接,每个连接具有多个传感器等。

modbus集成提供了许多参数来帮助与"困难"设备进行通信,这些参数与通信类型无关。

要启用此集成,请将其添加到您的"configuration.yaml"文件中。 :::tip 更改配置后需要重启 Home Assistant。 :::

delay:
  description: "连接建立后,发送消息前的延迟时间(秒)。
  某些 Modbus 设备在连接建立后通常需要 1-2 秒的延迟来准备通信。
  如果设备在连接后不响应消息,请尝试此参数。
  **注意:** 仅影响第一条消息。"
  required: false
  default: 0
  type: integer
message_wait_milliseconds:
  description: "请求之间等待的时间(以毫秒为单位)。"
  required: false
  default: 30 表示串行连接,0 表示所有其他连接。
  type: integer
name:
  description: "该中心的名称。必须是唯一的。"
  required: true
  type: string
timeout:
  description: "等待响应时超时(以秒为单位)。"
  required: false
  default: 5
  type: integer
type:
  description: "modbus 类型。"
  required: true
  type: list
  keys:
    tcp:
      description: "与套接字成帧器的 TCP/IP 连接,与支持以太网的设备一起使用。"
    udp:
      description: "与套接字成帧器的UDP连接,很少使用。"
    rtuovertcp:
      description: "与 rtu 成帧器的 TCP/IP 连接,在连接到 modbus 转发器时使用。"
    serial:
      description: "与 RTU 成帧器串行连接,与 TTY 端口或 USB rs485 转换器一起使用。"

配置 TCP 连接

type: tcp 是必需的。用于直接提供 TCP/IP 接口的设备。

host:
  description: "您的 modbus 设备的 IP 地址或名称,例如 `192.168.1.1`。"
  required: true
  type: string
port:
  description: "用于通信的网络端口。"
  required: true
  type: integer

示例:典型的 TCP 配置

# Example yaml: typical tcp connection
modbus:
  - name: modbus_hub
    type: tcp
    host: IP_ADDRESS
    port: 502

示例:完整的 tcp 配置

# Example yaml: full tcp connection
modbus:
  - name: modbus_hub
    type: tcp
    host: IP_ADDRESS
    port: 502

    delay: 0
    message_wait_milliseconds: 30
    timeout: 5

配置TCP-RTU连接

type: rtuovertcp 是必需的。用于直接提供 TCP/IP 接口的设备。

这通常在与 modbus 转发器通信时使用,该设备 向上有一个 TCP/IP 连接,向下有一个或多个串行连接。

host:
  description: "您的 modbus 设备的 IP 地址或名称,例如 `192.168.1.1`。"
  required: true
  type: string
port:
  description: "用于通信的网络端口。"
  required: true
  type: integer

示例:典型的 TCP-RTU 配置

# Example yaml: typical tcp-rtu connection
modbus:
  - name: modbus_hub
    type: rtuovertcp
    host: IP_ADDRESS
    port: 502

示例:完整 TCP-RTU 配置

# Example yaml: full tcp-rtu connection
modbus:
  - name: modbus_hub
    type: rtuovertcp
    host: IP_ADDRESS
    port: 502

    delay: 0
    message_wait_milliseconds: 30
    timeout: 5

配置 UDP 连接

type: udp 是必需的。这很少使用,并且仅用于非常特殊的配置。

host:
  description: "您的 modbus 设备的 IP 地址或名称,例如 `192.168.1.1`。"
  required: true
  type: string
port:
  description: "用于通信的网络端口。"
  required: true
  type: integer

示例:典型的 udp 配置

# Example yaml: typical udp connection
modbus:
  - name: modbus_hub
    type: udp
    host: IP_ADDRESS
    port: 502

示例:完整的 UDP 配置

# Example yaml: full udp connection
modbus:
  - name: modbus_hub
    type: udp
    host: IP_ADDRESS
    port: 502

    delay: 0
    message_wait_milliseconds: 30
    timeout: 5

配置串行连接

type: serial 是必需的。这用于提供串行 rs485 接口的设备。

物理接口通常是 USB 串行 RS485 转换器或连接到串行端口的 RS232-RS485。

baudrate:
  description: "串行连接的速度,更高的速度提供更好的性能。"
  required: true
  type: integer
bytesize:
  description: "每个字节的数据大小(以位为单位)。"
  required: true
  type: list
  keys:
    "5":
      description: "5 位数据,很少使用。"
    "6":
      description: "6 位数据,很少使用。"
    "7":
      description: "7 位数据,用于非常旧的设备。"
    "8":
      description: "8 位数据,标准。"
method:
  description: "连接 Modbus 的方法。"
  required: true
  type: list
  keys:
    rtu:
      description: "二进制数据传输,前面是从机 ID,后面是 crc,标准。"
    ascii:
      description: "ASCII 数据传输,前面是从机 ID,后面是 crc,用于少数设备。"
parity:
  description: "数据字节的奇偶校验。"
  required: true
  type: list
  keys:
    E:
      description: "偶校验位。"
    O:
      description: "奇数奇偶校验位。"
    N:
      description: "没有奇偶校验位,标准。"
port:
  description: "Modbus 设备连接到 Home Assistant 主机的串行端口或 USB 设备。"
  required: true
  type: string
stopbits:
  description: "数据字节的停止位。"
  required: true
  type: list
  keys:
    '1':
      description: "1 个停止位。"
    '2':
      description: "2 个停止位,标准。"

示例:典型的串行配置

# Example yaml:  typical serial connection
modbus:
  - name: modbus_hub
    type: serial
    port: /dev/ttyUSB0
    baudrate: 9600
    bytesize: 8
    method: rtu
    parity: E
    stopbits: 1

示例:完整串行配置

# Example yaml: full udp connection
modbus:
  - name: modbus_hub
    type: serial
    port: /dev/ttyUSB0
    baudrate: 9600
    bytesize: 8
    method: rtu
    parity: E
    stopbits: 1

    delay: 0
    message_wait_milliseconds: 30
    timeout: 5

配置多个连接

多种连接可以自由组合不同的通信方式:

# Example yaml: multiple tcp connections
modbus:
  - name: modbus_hub
    type: tcp
    host: IP_ADDRESS_1
    port: 2020

  - name: modbus_hub2
    type: tcp
    host: IP_ADDRESS_2
    port: 502
# Example yaml: tcp connection and serial connection
modbus:
  - name: modbus_hub
    type: tcp
    host: IP_ADDRESS_1
    port: 2020

  - name: modbus_hub2
    type: serial
    port: /dev/ttyUSB0
    baudrate: 9600
    bytesize: 8
    method: rtu
    parity: E
    stopbits: 1

配置 Modbus 实体

modbus 实体分组在每个 modbus 通信条目下方。

备注 每个 modbus 设备必须至少定义 1 个实体,否则将不会加载集成。

冲突参数请参考参数用法

所有 modbus 实体都有以下参数:

address:
  description: "线圈/寄存器的地址。请注意,这也可以以十六进制指定。例如:`0x789A`"
  required: true
  type: integer
name:
  description: "实体的名称,在实体类型中必须是唯一的。"
  required: true
  type: string
scan_interval:
  description: "更新间隔以秒为单位。
  scan_interval = 0 表示不轮询。
  实体会在启动后不久读取一次,之后按 scan_interval 读取。
  注意,重启 Home Assistant 时会恢复最后一次已知值。"
  required: false
  type: integer
  default: 15
slave:
  description: "与 `device_address` 相同"
  required: false
  type: integer
  default: 1
device_address:
  description: "设备的 ID。用于寻址 rs485 总线上的多个设备或连接到 modbus 中继器的设备。0 是广播 ID。"
  required: false
  type: integer
  default: 1
unique_id:
  description: "唯一标识该实体的 ID。
  从站将被分配 `<<unique_id>>_<<slave_index>>` 形式的 unique_id。
  如果两个实体具有相同的唯一 ID,Home Assistant 会引发异常。"
  required: false
  type: string

示例:实体分组

# Example yaml: entities grouping
modbus:
  - type: tcp
    host: IP_ADDRESS_1
    port: 2020
    name: "modbus_hub"
    binary_sensors:
      - name: binary_sensor1
        address: 100
    climates:
      - name: "Watlow F4T"
        address: 200
    covers:
      - name: Door1
        address: 300
    fans:
      - name: Fan1
        address: 400
    lights:
      - name: light1
        address: 500
    sensors:
      - name: sensor1
        address: 600
    switches:
      - name: Switch1
        address: 700

下面详细介绍不同类型的实体。

配置二进制传感器实体

Modbus 二进制传感器允许您从线圈收集数据,根据标准,线圈具有开/关状态。

通常,一个寄存器包含 16 个线圈,根据使用的请求给出不同的地址。

Register 512: Coil 1 - 16
Register 513: Coil 17 - 32

input_type: coils 将使用从 1 到 32 的地址,而 input_type: input 将使用地址 512 和 513。 因此,许多设备(尤其是较旧的设备)不与寄存器地址空间共享线圈地址空间, 并且这个 input 将从与 coil 不同的地址空间读取。该问题存在于具有以下功能的设备中: 共享地址空间,是配置实体时出现问题的常见原因。

冲突参数请参考参数用法

binary_sensors:
  description: "为此连接配置的所有二进制传感器的列表。"
  required: false
  type: map
  keys:
    device_class:
      description: "用于 UI 的 [type/class](/home-assistant/integrations/binary_sensor/#device-class)。"
      required: false
      type: string
    input_type:
      description: "请求类型 `discrete_input`、`coil`、`holding` 或 `input`"
      required: false
      default: coil
      type: string
    slave_count:
      description: "与 `virtual_count` 相同。"
      required: false
      type: integer
    virtual_count:
      description: "生成 count+1 个二进制传感器(主站 + 从站)。
      地址会自动递增。
      此参数可简化配置,并且通过单次请求替代 count+1 次请求来显著提升性能。"
      required: false
      type: integer
    unique_id:
      description: "唯一标识实体的 ID。从站将自动获得一个 <<unique_id>>_<<slave_index>> 的 unique_id。如果两个传感器具有相同的唯一 ID,Home Assistant 将引发异常。"
      required: false
      type: string

示例:典型的二进制传感器配置

# Example yaml: typical binary_sensor
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    binary_sensors:
      - name: my_relay
        address: 100
        slave: 1

示例:完整的二进制传感器配置

# Example yaml: binary_sensor with all options
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    binary_sensors:
      - name: my_relay
        address: 100
        device_class: door
        input_type: coil
        scan_interval: 15
        slave: 1
        slave_count: 0
        unique_id: my_relay

示例:多个相同的二进制传感器配置

# Example of 10 identical binary_sensor
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    binary_sensors:
      - name: my_relay
        address: 100
        slave: 1
        slave_count: 10
        unique_id: my_relay

此配置将每 15 秒轮询一次线圈地址 100 到 110,并更新 binary_sensors:my_relaymy_relay_1my_relay_10

主设备配置(如 device_class)会自动复制到从设备。

配置气候实体

Modbus 气候平台允许您监控恒温器或加热器以及设置目标温度、HVAC 操作、HVAC 模式、摆动模式和风扇状态。

冲突参数请参考参数用法

climates:
  description: "此 modbus 实例中所有气候实体的列表。"
  required: false
  type: map
  keys:
    temperature_unit:
      description: "温度单位:C 或 F。"
      required: false
      default: C
      type: list
      keys:
        C:
          description: "摄氏度"
        F:
          description: "华氏度"
    precision:
      description: "温度的有效小数位数。"
      required: false
      type: integer
      default: 0
    temp_step:
      description: "步长目标温度。"
      required: false
      type: float
      default: 0.5
    max_temp:
      description: "目标温度的最大设定值。"
      required: false
      type: integer
      default: 35
    min_temp:
      description: "目标温度的最小设定值。"
      required: false
      type: integer
      default: 5
    count:
      description: "为了获取当前温度而需要读取的寄存器数量。
      **仅对 `data_type: custom` 和 `data_type: string` 有效**,其他数据类型会自动计算 count。"
      required: false
      type: integer
    data_type:
      description: "读取当前温度寄存器时的响应表示。"
      required: false
      default: int16
      type: list
      keys:
        custom:
          description: "用户定义格式,必须配置`structure:`和`count:`。"
        float16:
          description: "16 位有符号浮点数(1 个寄存器保存 1 个值)。"
        float32:
          description: "32 位有符号浮点数(2 个寄存器保存 1 个值)。"
        float64:
          description: "64 位有符号浮点数(4 个寄存器保存 1 个值)。"
        int:
          description: "**DEPRECATED** 会默默地转换为 `int16`"
        int16:
          description: "16 位有符号整数(1 个寄存器保存 1 个值)。"
        int32:
          description: "32 位有符号整数(2 个寄存器保存 1 个值)。"
        int64:
          description: "64 位有符号整数(4 个寄存器保存 1 个值)。"
        string:
          description: "必须配置 8 位字符集,`count:`。"
        uint:
          description: "**DEPRECATED** 会默默地转换为 `uint16`"
        uint16:
          description: "16 位无符号整数(1 个寄存器保存 1 个值)。"
        uint32:
          description: "32 位无符号整数(2 个寄存器保存 1 个值)。"
        uint64:
          description: "64 位无符号整数(4 个寄存器保存 1 个值)。"
    input_type:
      description: 当前温度的 Modbus 寄存器类型。
      required: false
      default: holding
      type: list
      keys:
        holding:
          description: "持有登记册。"
        input:
          description: "输入寄存器。"
    scale:
      description: "用于目标温度和当前温度的缩放系数(`output` = `scale` * `value` + `offset`)。不能与 `current_temp_scale` 或 `target_temp_scale` 同时使用。"
      required: false
      type: float
      default: 1
    offset:
      description: "目标温度和当前温度的最终偏移量(`output` = `scale` * `value` + `offset`)。不能与 `current_temp_offset` 或 `target_temp_offset` 同时使用。"
      required: false
      type: float
      default: 0
    current_temp_scale:
      description: "当前温度的比例因子(输出 = `current_temp_scale` * `value` + `current_temp_offset`)。不能与 `scale` 一起使用"
      required: false
      type: float
      default: 1.0
    current_temp_offset:
      description: "当前温度偏移量(`output` = `current_temp_scale` * `value` + `current_temp_offset`)。不能与 `offset` 同时使用。"
      required: false
      type: float
      default: 0.0
    target_temp_scale:
      description: "目标温度缩放系数(`output` = `target_temp_scale` * `value` + `target_temp_offset`)。不能与 `scale` 同时使用。"
      required: false
      type: float
      default: 1.0
    target_temp_offset:
      description: "目标温度偏移量(`output` = `target_temp_scale` * `value` + `target_temp_offset`)。不能与 `offset` 同时使用。"
      required: false
      type: float
      default: 0.0
    target_temp_register:
      description: "目标温度(设定点)的寄存器地址。使用列表,可以为每种可用的 HVAC 模式定义一个寄存器。该列表必须具有与 7 种可用的 HVAC 模式相对应的 7 个寄存器的固定大小,如下所示:寄存器 **1:HVAC 自动模式**;寄存器 **2:HVAC 制冷模式**;寄存器 **3:HVAC 干燥模式**;寄存器 **4:HVAC 仅风扇模式**;寄存器 **5:HVAC 加热模式**;寄存器 **6: HVAC 加热冷却模式**;寄存器 **7:HVAC 关闭模式** 可以为设备没有相关寄存器的模式设置重复的值。
      required: true
      type: [integer, list]
    target_temp_write_registers:
      description: "如果 `true` 使用 `write_registers` 作为目标温度 (`target_temp_register`),否则使用 `write_register`。"
      required: false
      type: boolean
      default: false
    structure:
      description: "如果指定了 `data_type: custom` ,则需要使用双引号引起来的 Python 结构,
      用于格式化解包值的字符串。详情请参阅 Python 文档。
      例如:`>i`。"
      required: false
      type: string
      default: ">f"
    swap:
      description: "交换字节/字的顺序,**设置目标温度时对 `custom` 和 `datatype: string`** 无效"
      required: false
      default: none
      type: list
      keys:
        byte:
          description: "交换字节 AB -> BA。"
        word:
          description: "交换字 ABCD -> CDAB,**对于数据类型无效:`int16`、`uint16`**"
        word_byte:
          description: "交换字 ABCD -> DCBA,**对于数据类型无效:`int16`、`uint16`**"
    hvac_action_register:
      description: "HVAC 操作寄存器的配置"
      required: false
      type: map
      keys:
        address:
          description: "HVAC 操作寄存器的地址。"
          required: true
          type: integer
        input_type:
          description: "寄存器类型,`holding` 或 `input`"
          required: false
          default: holding
          type: string
        values:
          description: "寄存器值和 HVAC 操作之间的映射"
          required: true
          type: map
          keys:
            action_off:
              description: "与 HVAC 关闭操作相对应的值。"
              required: false
              type: [integer, list]
            action_cooling:
              description: "与 HVAC 冷却操作相对应的值。"
              required: false
              type: [integer, list]
            action_defrosting:
              description: "与 HVAC 除霜操作相对应的值。"
              required: false
              type: [integer, list]
            action_drying:
              description: "与 HVAC 干燥操作相对应的值。"
              required: false
              type: [integer, list]
            action_fan:
              description: "与 HVAC 风扇动作相对应的值。"
              required: false
              type: [integer, list]
            action_heating:
              description: "与 HVAC 加热操作相对应的值。"
              required: false
              type: [integer, list]
            action_idle:
              description: "对应于 HVAC 空闲操作的值。"
              required: false
              type: [integer, list]
            action_preheating:
              description: "与 HVAC 预热操作相对应的值。"
              required: false
              type: [integer, list]
    hvac_mode_register:
      description: "HVAC 模式寄存器的配置"
      required: false
      type: map
      keys:
        address:
          description: "HVAC 模式寄存器的地址。"
          required: true
          type: integer
        write_registers:
          description: "设置 HVAC 模式的请求类型,如果为 true,则使用 `write_registers`,否则使用 `write_register`。
            如果为某个模式指定了多个值,则仅使用第一个值写入寄存器。"
          required: false
          type: boolean
          default: false
        values:
          description: "寄存器值和 HVAC 模式之间的映射"
          required: true
          type: map
          keys:
            state_off:
              description: "对应于 HVAC 关闭模式的值。
                如果开/关状态由不同地址和/或寄存器处理,则应在配置中省略 `state_off` 状态。"
              required: false
              type: [integer, list]
            state_heat:
              description: "与 HVAC 加热模式相对应的值。"
              required: false
              type: [integer, list]
            state_cool:
              description: "对应于 HVAC 制冷模式的值。"
              required: false
              type: [integer, list]
            state_auto:
              description: "对应于 HVAC 自动模式的值。"
              required: false
              type: [integer, list]
            state_dry:
              description: "对应于 HVAC 干燥模式的值。"
              required: false
              type: [integer, list]
            state_fan_only:
              description: "对应于仅 HVAC 风扇模式的值。"
              required: false
              type: [integer, list]
            state_heat_cool:
              description: "与 HVAC 加热/冷却模式相对应的值。"
              required: false
              type: [integer, list]
    fan_mode_register:
      description: "风扇模式寄存器的配置"
      required: false
      type: map
      keys:
        address:
          description: "风扇模式寄存器的地址。(调用 write_register 的 int,调用 write_registers 的 1 个 int 列表)"
          required: true
          type: [integer, list]
        values:
          description: "寄存器值和风扇模式之间的映射
            通常用于控制以下之一:速度、方向或开/关状态。"
          required: true
          type: map
          keys:
            state_fan_on:
              description: "与风扇开启模式相对应的值。"
              required: false
              type: integer
            state_fan_off:
              description: "与风扇关闭模式相对应的值。"
              required: false
              type: integer
            state_fan_low:
              description: "与风扇低模式对应的值。"
              required: false
              type: integer
            state_fan_medium:
              description: "与风扇中等模式相对应的值。"
              required: false
              type: integer
            state_fan_high:
              description: "与高风扇模式相对应的值。"
              required: false
              type: integer
            state_fan_auto:
              description: "与风扇自动模式对应的值。"
              required: false
              type: integer
            state_fan_top:
              description: "与 Fan Top 模式相对应的值。"
              required: false
              type: integer
            state_fan_middle:
              description: "与 Fan Middle 模式对应的值。"
              required: false
              type: integer
            state_fan_focus:
              description: "与风扇聚焦模式对应的值。"
              required: false
              type: integer
            state_fan_diffuse:
              description: "与扇形漫反射模式相对应的值。"
              required: false
              type: integer
    hvac_onoff_coil:
      description: "开/关状态的地址。
        仅当开/关状态不是通过 HVAC 模式处理时,才使用此设置。
        当从该线圈读取到 0 时,HVAC 状态设为 Off;否则由 `hvac_mode_register` 决定 HVAC 状态。
        如果未定义此线圈,默认状态为 Auto。
        当 HVAC 模式设为 Off 时,向线圈写入值 0;否则写入值 1。
        **不能与 `hvac_onoff_register` 同时使用。**"
      required: false
      type: integer
    hvac_onoff_register:
      description: "开/关状态的地址。
        当从该寄存器读取到 `hvac_off_value` 定义的值时,HVAC 状态设为 Off。
        否则,HVAC 状态由 `hvac_mode_register` 决定。
        如果未定义此寄存器,默认状态为 Auto。
        当 HVAC 模式设为 Off 时,向该寄存器写入 `hvac_off_value`;否则写入 `hvac_on_value`。
        **不能与 `hvac_onoff_coil` 同时使用。**"
      required: false
      type: integer
    hvac_on_value:
      description: "将写入 `hvac_onoff_register` 以打开 HVAC 系统的值。
        如果未指定,默认值为 1。"
      required: false
      type: integer
    hvac_off_value:
      description: "将写入 `hvac_onoff_register` 以关闭 HVAC 系统的值。
        如果未指定,默认值为 0。"
      required: false
      type: integer
    swing_mode_register:
      description: "摆动模式寄存器的配置"
      required: false
      type: map
      keys:
        address:
          description: "摆动模式寄存器的地址。(调用 write_register 的 int,调用 write_registers 的 1 个 int 列表)。 - 通过保持寄存器完成读取"
          required: true
          type: [integer, list]
        values:
          description: "寄存器值和摆动模式之间的映射"
          required: true
          type: map
          keys:
            swing_mode_state_on:
              description: "与开启摆动模式相对应的值。"
              required: false
              type: integer
            swing_mode_state_off:
              description: "与摆动模式关闭相对应的值。"
              required: false
              type: integer
            swing_mode_state_horizontal:
              description: "与水平摆动模式相对应的值。"
              required: false
              type: integer
            swing_mode_state_vertical:
              description: "对应于垂直摆动模式的值。"
              required: false
              type: integer
            swing_mode_state_both:
              description: "与 Swing 模式对应的值两者。"
              required: false
              type: integer
    hvac_onoff_register:
      description: "开/关状态的地址。
        仅当开/关状态不是通过 HVAC 模式处理时,才使用此设置。
        当从该寄存器读取到 0 时,HVAC 状态设为 Off;否则由 `hvac_mode_register` 决定 HVAC 状态。
        如果未定义此寄存器,默认状态为 Auto。
        当 HVAC 模式设为 Off 时,向该寄存器写入值 0;否则写入值 1。"
      required: false
      type: integer
    write_registers:
      description: "如果`true`使用`write_registers`来控制开/关状态(`hvac_onoff_register`),否则使用`write_register`。
      请注意,目前尚不支持通过线圈控制开/关状态。"
      required: false
      type: boolean
      default: false

示例:气候配置

# Example configuration.yaml entry
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    climates:
      - name: "Watlow F4T"
        address: 0x6BC2
        input_type: holding
        count: 1
        data_type: custom
        max_temp: 35
        min_temp: 15
        offset: 0
        precision: 1
        scale: 0.1
        max_temp: 30
        structure: ">f"
        target_temp_register: 2782
        target_temp_write_registers: true
        temp_step: 1
        temperature_unit: C

配置遮盖实体

modbus 遮盖平台允许您控制遮盖设备(例如百叶窗、卷帘或车库门)。

目前,该平台支持打开和关闭操作。您可以使用线圈或保持寄存器来控制遮盖设备。

使用 input_type: coil 的遮盖实体无法判断打开、关闭等中间状态。线圈仅存储两种状态:"0" 表示关闭,"1" 表示打开。若要检测中间状态,可选用 status_register 属性。这样您可以将命令(如打开遮盖)写入线圈,并通过寄存器读取当前状态。此外,还可以为 state_openstate_openingstate_closedstate_closing 指定值,这些值会与从 status_register 读取的值进行匹配。

如果您的遮盖设备使用 input_type: holding(默认)发送命令,它还可以读取中间状态。要调整哪个值代表什么状态,您可以微调可选状态属性,例如 state_open。这些可选状态值还用于指定写入寄存器的值。如果指定可选的 status_register 属性,则将从 status_register 而不是用于发送命令的寄存器读取状态。

冲突参数请参考参数用法

covers:
  description: "为此连接配置的所有遮盖实体的列表。"
  required: true
  type: map
  keys:
    device_class:
      description: "用于在前端设置图标的遮盖设备[类型/类](/home-assistant/integrations/cover/#device-class)。"
      required: false
      type: device_class
      default: None
    input_type:
      description: "遮盖寄存器类型。"
      default: holding
      required: false
      type: list
      keys:
        holding:
          description: "持有登记册。"
        input:
          description: "输入寄存器。"
    state_open:
      description: "`status_register` 或 `register` 中的值代表遮盖已打开。
        如果你的配置使用 `register` 属性,则会将此值写入保持寄存器以打开遮盖设备。"
      required: false
      default: 1
      type: integer
    state_closed:
      description: "`status_register` 或 `register` 中的值代表遮盖已关闭。
        如果你的配置使用 `register` 属性,则会将此值写入保持寄存器以关闭遮盖设备。"
      required: false
      default: 0
      type: integer
    state_opening:
      description: "`status_register` 或 `register` 中的值代表遮盖正在打开。
        请注意,你连接的 Modbus 遮盖设备也需要支持此状态。
        如果设备不报告该状态,则无法检测到此状态。"
      required: false
      default: 2
      type: integer
    state_closing:
      description: "`status_register` 或 `register` 中的值代表遮盖正在关闭。
        请注意,你连接的 Modbus 遮盖设备也需要支持此状态。
        如果设备不报告该状态,则无法检测到此状态。"
      required: false
      default: 3
      type: integer
    status_register:
      description: "寄存器地址,将从中读取所有遮盖状态。
        如果你指定了 `register` 属性但未指定 `status_register` 属性,
        则主寄存器也会用作状态寄存器。"
      required: false
      type: integer
    status_register_type:
      description: 遮盖状态寄存器类型(保持、输入),默认保持。
      required: false
      type: list
      keys:
        holding:
          description: "持有登记册。"
        input:
          description: "输入寄存器。"

示例:Modbus 遮盖

# Example configuration.yaml entry
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    covers:
      - name: Door1
        device_class: door
        input_type: coil
        address: 117
        state_open: 1
        state_opening: 2
        state_closed: 0
        state_closing: 3
        status_register: 119
        status_register_type: holding
      - name: "Door2"
        address: 118

示例:由线圈控制的 Modbus 遮盖

此示例展示了使用线圈控制的 Modbus 遮盖配置。不支持打开/关闭等中间状态。每 10 秒从 Modbus 轮询一次遮盖状态。

modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    covers:
      - name: Door1
        slave: 1
        coil: 1
        device_class: door
        scan_interval: 10
      - name: Door2
        slave: 2
        coil: 2
        device_class: door
        scan_interval: 10

示例:由线圈控制且从寄存器读取状态的 Modbus 遮盖

此示例展示了使用线圈控制的 Modbus 遮盖配置。实际遮盖状态从 status_register 读取。我们还指定了寄存器值,用于匹配正在打开、已打开、正在关闭、已关闭状态。每 10 秒从 Modbus 轮询一次遮盖状态。

modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    covers:
      - name: Door1
        slave: 1
        device_class: door
        scan_interval: 10
        coil: 1
        status_register: 1
        status_register_type: input
        state_opening: 1
        state_open: 2
        state_closing: 3
        state_closed: 4

示例:由保持寄存器控制的 Modbus 遮盖

此示例展示了使用保持寄存器控制的 Modbus 遮盖配置,并可从同一寄存器读取当前状态。我们还指定了寄存器值,用于匹配正在打开、已打开、正在关闭、已关闭状态。每 10 秒从 Modbus 轮询一次遮盖状态。

modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    covers:
      - name: Door1
        slave: 1
        device_class: door
        scan_interval: 10
        register: 1
        state_opening: 1
        state_open: 2
        state_closing: 3
        state_closed: 4

示例:由保持寄存器控制且从状态寄存器读取状态的 Modbus 遮盖

此示例展示了使用保持寄存器控制的 Modbus 遮盖配置,但状态从 status_register 读取。在本例中,我们仅指定了 state_openstate_closed 的值,其余部分使用默认值。每 10 秒从 Modbus 轮询一次遮盖状态。

modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502

    covers:
      - name: Door1
        slave: 1
        device_class: door
        scan_interval: 10
        register: 1
        status_register: 2
        register_type: holding
        state_open: 1
        state_closed: 0

配置风扇实体

modbus 风扇平台允许您控制 Modbus 线圈或寄存器。

冲突参数请参考参数用法

fans:
  description: "此 modbus 实例中所有风扇实体的列表。"
  required: true
  type: map
  keys:
    command_on:
      description: "写下打开风扇的值。"
      required: false
      default: 0x01
      type: integer
    command_off:
      description: "写入值以关闭风扇。"
      required: false
      default: 0x00
      type: integer
    write_type:
      description: 写请求的类型。
      required: false
      default: holding
      type: list
      keys:
        holding:
          description: "write_register 被调用。"
        holdings:
          description: "write_registers 被调用。"
        coil:
          description: "write_coil 被调用。"
        coils:
          description: "write_coils 被调用。"
    verify:
      description: "从 Modbus 设备读取以验证风扇。
        如果使用该项但不带属性,则使用开关寄存器的配置。
        如果省略该项,则不执行验证,但每次切换时都会设置风扇状态。"
      required: false
      type: map
      keys:
        address:
          description: "读取地址。"
          required: false
          default: 写地址
          type: integer
        delay:
          description: "写入和验证之间的延迟。"
          required: false
          default: 0
          type: integer
        input_type:
          description: 地址类型。
          required: false
          default: 与 `write_type` 相同
          type: list
          keys:
            coil:
              description: "线圈(1位继电器)。"
            discrete:
              description: "离散输入(1 位继电器)。"
            holding:
              description: "持有登记册。"
            input:
              description: "输入寄存器。"
        state_on:
          description: "风扇打开时的价值。"
          required: false
          default: 与 `command_on` 相同
          type: integer
        state_off:
          description: "风扇关闭时的价值。"
          required: false
          default: 与 `command_off` 相同
          type: integer

示例:风扇配置

# Example configuration.yaml entry
modbus:
  - type: tcp
    host: IP_ADDRESS
    port: 502
    fans:
      - name: "Fan1"
        address: 13
        write_type: coil
      - name: "Fan2"
        slave: 2
        address: 14
        write_type: coil
        verify:
      - name: "Register1"
        address: 11
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 127
            state_on: 25
            state_off: 1

配置灯光实体

modbus 轻型平台允许您控制 Modbus 线圈或寄存器。

冲突参数请参考参数用法

lights:
  description: "此 modbus 实例中所有灯光实体的列表。"
  required: true
  type: map
  keys:
    command_on:
      description: "写值来开灯。"
      required: false
      default: 0x01
      type: integer
    command_off:
      description: "写值来关灯。"
      required: false
      default: 0x00
      type: integer
    brightness_address: 
      description: "读取/写入颜色亮度的地址。"
      required: false
      default: None
      type: integer
    color_temp_address:
      description: "读取/写入色温的地址。"
      required: false
      default: None
      type: integer
    min_temp:
      description: "开尔文色温的最低水平。"
      required: false
      default: 2000
      type: integer
    max_temp:
      description: "开尔文色温的最高水平。"
      required: false
      default: 7000
      type: integer
    write_type:
      description: "写入请求的类型。"
      required: false
      default: holding
      type: list
      keys:
        holding:
          description: "write_register 被调用。"
        holdings:
          description: "write_registers 被调用。"
        coil:
          description: "write_coil 被调用。"
        coils:
          description: "write_coils 被调用。"
    verify:
      description: "从 Modbus 设备读取以验证灯光。
        如果使用该项但不带属性,则使用开关寄存器的配置。
        如果省略该项,则不执行验证,但每次切换时都会设置灯光状态。"
      required: false
      type: map
      keys:
        address:
          description: "读取地址。"
          required: false
          default: "与 `address` 相同"
          type: integer
        delay:
          description: 写入和验证之间的延迟。
          required: false
          default: 0
          type: integer
        input_type:
          description: 地址类型(保持/线圈/离散/输入)。
          required: false
          default: "与 `write_type` 相同"
          type: list
          keys:
            coil:
              description: "线圈(1位继电器)。"
            discrete:
              description: "离散输入输出(1 位继电器)。"
            holding:
              description: "持有登记册。"
            input:
              description: "输入寄存器。"
        state_on:
          description: "灯亮时的价值。"
          required: false
          default: "与 `command_on` 相同"
          type: integer
        state_off:
          description: "灯灭时的价值。"
          required: false
          default: "与 `command_off` 相同"
          type: integer

示例:灯光配置

# Example configuration.yaml entry
modbus:
  - type: tcp
    host: IP_ADDRESS
    port: 502
    lights:
      - name: "light1"
        address: 13
        write_type: coil
      - name: "light2"
        slave: 2
        address: 14
        write_type: coil
        brightness_address: 1006
        verify:
      - name: "light3"
        slave: 2
        address: 14
        write_type: coil
        brightness_address: 1006
        color_temp_address: 2006
      - name: "light4"
        slave: 2
        address: 14
        write_type: coil
        brightness_address: 1006
        color_temp_address: 2006
        min_temp: 2500
        max_temp: 5500
        verify:
      - name: "Register1"
        address: 11
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 127
            state_on: 25
            state_off: 1

配置传感器实体

modbus 传感器允许您从 Modbus 寄存器收集数据。

冲突参数请参考参数用法

sensors:
  description: "此 modbus 实例中所有传感器的列表。"
  required: true
  type: map
  keys:
    count:
      description: "要读取的寄存器数量。
      **仅对 `data_type: custom` 和 `data_type: string` 有效**,其他数据类型会自动计算 count。"
      required: false
      type: integer
    data_type:
      description: "回应代表。"
      required: false
      default: int16
      type: list
      keys:
        custom:
          description: "用户定义格式,必须配置`structure:`和`count:`。"
        float16:
          description: "16 位有符号浮点数(1 个寄存器保存 1 个值)。"
        float32:
          description: "32 位有符号浮点数(2 个寄存器保存 1 个值)。"
        float64:
          description: "64 位有符号浮点数(4 个寄存器保存 1 个值)。"
        int:
          description: "**DEPRECATED** 会默默地转换为 `int16`"
        int16:
          description: "16 位有符号整数(1 个寄存器保存 1 个值)。"
        int32:
          description: "32 位有符号整数(2 个寄存器保存 1 个值)。"
        int64:
          description: "64 位有符号整数(4 个寄存器保存 1 个值)。"
        string:
          description: "必须配置 8 位字符集,`count:`。"
        uint:
          description: "**DEPRECATED** 会默默地转换为 `uint16`"
        uint16:
          description: "16 位无符号整数(1 个寄存器保存 1 个值)。"
        uint32:
          description: "32 位无符号整数(2 个寄存器保存 1 个值)。"
        uint64:
          description: "64 位无符号整数(4 个寄存器保存 1 个值)。"
    device_class:
      description: "用于在前端设置图标的传感器的[类型/类](/home-assistant/integrations/sensor/#device-class)。"
      required: false
      type: device_class
      default: None
    input_type:
      description: "传感器的 Modbus 寄存器类型。"
      required: false
      default: holding
      type: list
      keys:
        holding:
          description: "持有登记册。"
        input:
          description: "输入寄存器。"
    min_value:
      description: "传感器的最小允许值。如果值 < min_value --> min_value。可以是浮点数或整数"
      required: false
      type: float
    max_value:
      description: "传感器的最大允许值。如果值 > max_value --> max_value。可以是浮点数或整数"
      required: false
      type: float
    nan_value:
      description: 如果 Modbus 传感器定义了 NaN 值,则可以将该值设置为以 `0x` 开头的包含一个或多个字节(例如 `0xFFFF` 或 `0x80000000`)的十六进制字符串,或者直接提供为整数。如果触发,传感器将变为 `unknown`。请注意,`nan_value` 的十六进制到整数转换当前不遵循使用 `data_type`、`structure` 或 `swap` 参数的 home-assistants Modbus 编码。
      required: false
      type: string
    zero_suppress:
      description: 抑制接近于零的值。如果 -zero_suppress <= value <= +zero_suppress --> 0。可以是浮点数或整数
      required: false
      type: float
    offset:
      description: "最终偏移量(输出 = 比例 * 值 + 偏移量)。"
      required: false
      type: float
      default: 0
    precision:
      description: "有效小数位数。"
      required: false
      type: integer
      default: 0
    scale:
      description: "比例因子(输出 = 比例 * 值 + 偏移量)。"
      required: false
      type: float
      default: 1
    slave_count:
      description: "与 `virtual_count` 相同。"
      required: false
      type: integer
    virtual_count:
      description: "生成 x+1 传感器(主传感器 + 从传感器),允许使用单个读取消息读取多个寄存器。"
      required: false
      type: integer
    state_class:
      description: "传感器的 [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes)。"
      required: false
      type: string
    structure:
      description: "如果指定了 `data_type: custom` ,则需要使用双引号引起来的 Python 结构,
      用于格式化解包值的字符串。详情请参阅 Python 文档。
      例如:`>i`。"
      required: false
      type: string
      default: ">f"
    swap:
      description: "交换字节/字的顺序,**对 `custom` 和 `datatype: string`** 无效"
      required: false
      default: none
      type: list
      keys:
        byte:
          description: "交换字节 AB -> BA。"
        word:
          description: "交换字 ABCD -> CDAB,**对于数据类型无效:`int16`、`uint16`**"
        word_byte:
          description: "交换字 ABCD -> DCBA,**对于数据类型无效:`int16`、`uint16`**"
    unit_of_measurement:
      description: "附加价值的单位。"
      required: false
      type: string
    unique_id:
      description: 唯一标识实体的 ID。如果两个传感器具有相同的唯一 ID,Home Assistant 将引发异常。
      required: false
      type: string
Note

如果将比例或偏移指定为浮点值,则将使用双精度浮点运算来计算最终值。这可能会导致大于 2^53 的值的精度损失。

示例:传感器配置

# Example configuration.yaml entry
modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    sensors:
      - name: Sensor1
        unit_of_measurement: °C
        slave: 1
        address: 100
      - name: Sensor2
        unit_of_measurement: mg
        address: 110
        count: 2
      - name: Sensor3
        unit_of_measurement: °C
        slave: 1
        address: 120
        input_type: input
        data_type: float
        scale: 0.01
        offset: -273.16
        precision: 2

示例:传感器完整配置

具有默认扫描间隔的温度传感器示例:

modbus:
  - name: hub1
    type: tcp
    host: IP_ADDRESS
    port: 502
    sensors:
      - name: Room_1
        slave: 10
        address: 0x9A
        input_type: holding
        unit_of_measurement: °C
        state_class: measurement
        count: 1
        scale: 0.1
        offset: 0
        precision: 1
        data_type: integer

配置开关实体

modbus 开关平台允许您控制 Modbus 线圈或寄存器。

冲突参数请参考参数用法

switches:
  description: "此 modbus 实例中所有开关实体的列表。"
  required: true
  type: map
  keys:
    command_on:
      description: "写入值以打开开关。"
      required: false
      default: 0x01
      type: integer
    command_off:
      description: "写入值以关闭开关。"
      required: false
      default: 0x00
      type: integer
    write_type:
      description: 写请求的类型。
      required: false
      default: holding
      type: list
      keys:
        holding:
          description: "write_register 被调用。"
        holdings:
          description: "write_registers 被调用。"
        coil:
          description: "write_coil 被调用。"
        coils:
          description: "write_coils 被调用。"
    verify:
      description: "从 Modbus 设备读取以验证开关。
        如果使用该项但不带属性,则使用开关寄存器的配置。
        如果省略该项,则不执行验证,但每次切换时都会设置开关状态。"
      required: false
      type: map
      keys:
        address:
          description: "读取地址。"
          required: false
          default: "与 `write address` 相同"
          type: integer
        delay:
          description: "写入和验证之间的延迟。"
          required: false
          default: 0
          type: integer
        input_type:
          description: 地址类型。
          required: false
          default: 与 `write_type` 相同
          type: list
          keys:
            coil:
              description: "线圈(1位继电器)。"
            discrete:
              description: "离散输入(1 位继电器)。"
            holding:
              description: "持有登记册。"
            input:
              description: "输入寄存器。"
        state_on:
          description: "开关打开时的值。该值必须是 `integer` 或整数列表。"
          required: false
          default: "与 `command_on` 相同"
          type: [integer, list]
        state_off:
          description: "开关关闭时的值。该值必须是 `integer` 或整数列表。"
          required: false
          default: "与 `command_off` 相同"
          type: [integer, list]

示例:开关配置

# Example configuration.yaml entry
modbus:
  - type: tcp
    host: IP_ADDRESS
    port: 502
    switches:
      - name: Switch1
        address: 13
        write_type: coil
      - name: Switch2
        slave: 2
        address: 14
        write_type: coil
        verify:
      - name: Register1
        address: 11
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 127
            state_on: 25
            state_off: 1

示例:开关完整配置

# Example configuration.yaml entry
modbus:
  - type: tcp
    host: IP_ADDRESS
    port: 502
    switches:
      - name: Switch1
        address: 13
        write_type: coil
      - name: Switch2
        slave: 2
        address: 14
        write_type: coil
        verify:
      - name: Register1
        address: 11
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 127
            state_on: 25
            state_off: 1

参数使用矩阵

某些参数排除其他参数,下表显示了可以组合的参数:

数据类型:customstring*16*32*64
count
structure
slave_count
virtual_count
swap: byte
swap: word
swap: word_byte

动作

除了特定于平台的操作之外,modbus 集成还提供两种通用写入操作。

动作描述
modbus.write_register写入一个或多个寄存器
modbus.write_coil写入一个或多个线圈

描述:

属性描述
hub集线器名称(省略时默认为 modbus_hub
slave从机地址(0-255,省略时默认为 1)
address寄存器地址(例如 138)
valuewrite_register)单个值或 16 位值数组。单值将调用 modbus 功能码 0x06,数组将调用 modbus 功能码 0x10。值可能需要反向排序。例如,要设置 0x0004,可能需要设置 [4,0],这取决于 CPU 的字节顺序
statewrite_coil)单个布尔值或布尔值数组。单个布尔值将调用 modbus 功能码 0x05,数组将调用 modbus 功能码 0x0F

示例:写入一个 float32 类型寄存器

要编写 float32 数据类型寄存器,请使用网络格式,例如 10.0 == 0x41200000 (网络顺序浮点十六进制)。

action: modbus.write_register
data:
  address: <target register address>
  slave: <target slave address>
  hub: <hub name>
  value: [0x4120, 0x0000]

操作 modbus.set-temperature

动作描述
设置温度设定温度。需要传入value,这是所需的目标温度。 value 应与 data_type 属于同一类型

动作 modbus.set_hvac_mode

动作描述
设置暖通空调模式设置 HVAC 模式。需要传入 value ,这是所需的模式。 value 应是有效的 HVAC 模式。所需状态与要写入 HVAC 模式寄存器的值之间必须存在映射。如果定义了开/关寄存器,则执行此操作还将设置开/关寄存器为适当的值。

提交问题

打开问题时,请添加您当前的配置(或缩小版本),至少包含:

  • Modbus 配置线
  • 实体(传感器等)线

为了让开发者更好地定位问题,请添加 以下行到"configuration.yaml":

logger:
  default: warning
  logs:
    homeassistant.components.modbus: debug
    pymodbus: debug

并重新启动 Home Assistant,重现问题,并将日志包含在问题中。

基于 Modbus 开发

唯一推荐的方法是继承所需的实体。