Modbus
modbus
该集成严格遵循 协议规范
modbus integration集成将 Home Assistant 与您的设备、服务等连接和集成。 [Learn more] 支持所有符合 modbus 标准的设备。设备之间的通信可以是串行(rs-485)、TCP 或 UDP 连接。modbus 集成允许多个通信通道,例如串口连接与一个或多个 TCP 连接的组合。
配置 modbus 通信
配置与 modbus 设备的通信。这是建立设备访问所需的一般设置。
modbus 集成允许您使用多个连接,每个连接可以包含多个传感器等。
modbus 集成提供了一些参数来帮助与“困难”设备通信,这些参数与通信类型无关。
要启用此集成,请将其添加到您的 configuration.yaml
configuration.yaml 文件是 Home Assistant 的主要配置文件。它列出了要加载的集成及其特定配置。在某些情况下,需要直接在 configuration.yaml 文件中手动编辑配置。大多数集成可以在 UI 中配置。 [Learn more] 文件中。
在更改了configuration.yaml
configuration.yaml 文件是 Home Assistant 的主要配置文件。它列出了要加载的集成及其特定配置。在某些情况下,需要直接在 configuration.yaml 文件中手动编辑配置。大多数集成可以在 UI 中配置。 [Learn more] 文件后,重启 Home Assistant 以应用更改。 该集成现在显示在集成页面的 设置 > 设备与服务 下。其实体在集成卡片上以及实体标签上列出。
Configuration Variables
连接后发送消息的延迟时间(以秒为单位)。 一些 modbus 设备在建立连接后需要通常 1-2 秒的延迟来准备通信。 如果设备在连接后未响应消息,请尝试此参数。 备注: 仅影响第一条消息。
配置 tcp 连接
type: tcp
是必需的。用于直接提供 TCP/IP 接口的设备。
示例:典型的 tcp 配置
# 示例 yaml:典型的 tcp 连接
modbus:
- name: modbus_hub
type: tcp
host: IP_ADDRESS
port: 502
示例:完整的 tcp 配置
# 示例 yaml:完整的 tcp 连接
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 转发器通信,modbus 转发器具有向上的 TCP/IP 连接和一个或多个向下的串行连接。让我们在这里写更多内容,看看错误是否移动。
示例:典型的 TCP-RTU 配置
# 示例 yaml:典型的 tcp-rtu 连接
modbus:
- name: modbus_hub
type: rtuovertcp
host: IP_ADDRESS
port: 502
示例:完整的 TCP-RTU 配置
# 示例 yaml:完整的 tcp-rtu 连接
modbus:
- name: modbus_hub
type: rtuovertcp
host: IP_ADDRESS
port: 502
delay: 0
message_wait_milliseconds: 30
timeout: 5
配置 UDP 连接
type: udp
是必需的。这很少使用,仅用于非常特殊的配置。
示例:典型的 udp 配置
# 示例 yaml:典型的 udp 连接
modbus:
- name: modbus_hub
type: udp
host: IP_ADDRESS
port: 502
示例:完整的 UDP 配置
# 示例 yaml:完整的 udp 连接
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。
示例:典型的串行配置
# 示例 yaml:典型的串行连接
modbus:
- name: modbus_hub
type: serial
port: /dev/ttyUSB0
baudrate: 9600
bytesize: 8
method: rtu
parity: E
stopbits: 1
示例:完整的串行配置
# 示例 yaml:完整的串行连接
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
配置多个连接
多个连接可以自由混合不同的通信方式:
# 示例 yaml:多个 tcp 连接
modbus:
- name: modbus_hub
type: tcp
host: IP_ADDRESS_1
port: 2020
- name: modbus_hub2
type: tcp
host: IP_ADDRESS_2
port: 502
# 示例 yaml:tcp 连接和串行连接
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 设备必须至少定义一个实体,否则集成将不会加载。
请参阅 参数使用 了解冲突参数。
所有 modbus 实体具有以下参数:
Configuration Variables
更新间隔(以秒为单位)。 scan_interval = 0 表示不轮询。 实体会在启动后短时间内读取,然后根据 scan_interval 读取。 备注,当重新启动 HA 时,会恢复最后已知的值。
设备的 ID。用于在 rs485 总线上寻址多个设备或连接到 modbus 中继器的设备。0 是广播 ID。
示例:实体分组
# 示例 yaml:实体分组
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 二进制传感器允许您从线圈中收集数据,根据标准,线圈的状态为 ON/OFF。
通常,一个寄存器包含 16 个线圈,给出不同的地址,具体取决于使用的请求。
寄存器 512:线圈 1 - 16
寄存器 513:线圈 17 - 32
input_type: coils
将使用 1 到 32 的地址,而 input_type: input
将使用 512 和 513 的地址。
因此,许多设备(尤其是旧设备)不会与寄存器地址空间共享线圈地址空间,
而这个 input
将从不同的地址空间读取,而不是 coil
。问题存在于具有
共享地址空间的设备中,并且在配置实体时经常引起问题。
请参阅 参数使用 了解冲突参数。
Configuration Variables
为此连接配置的所有二进制传感器的列表。
用于 UI 的 类型/类。
生成 count+1 个二进制传感器(主 + 从)。 地址会自动递增。 该参数简化了配置,并通过不使用 count+1 请求而是单个请求提供了更好的性能。
示例:典型的二进制传感器配置
# 示例 yaml:典型的 binary_sensor
modbus:
- name: hub1
type: tcp
host: IP_ADDRESS
port: 502
binary_sensors:
- name: my_relay
address: 100
slave: 1
示例:完整的二进制传感器配置
# 示例 yaml:带有所有选项的 binary_sensor
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
示例:多个相同的二进制传感器配置
# 示例 10 个相同的 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_relay
和 my_relay_1
到 my_relay_10
。
主配置(如 device_class)会自动复制到从机。
配置气候实体
Modbus 气候平台允许您监控恒温器或加热器,并设置目标温度、HVAC 模式、摆动模式和风扇状态。
请参阅 参数使用 了解冲突参数。
Configuration Variables
此 modbus 实例中所有气候实体的列表。
读取当前温度所需的寄存器数量。 仅对 data_type: custom
和 data_type: string
有效,对于其他数据类型,count 会自动计算。
读取当前温度寄存器时的响应表示。
目标温度(设定值)的寄存器地址。使用列表,可以为每个可用的 HVAC 模式定义一个寄存器。列表必须有 7 个寄存器,分别对应 7 个可用的 HVAC 模式,如下所示:寄存器 1:HVAC 自动模式;寄存器 2:HVAC 制冷模式;寄存器 3:HVAC 干燥模式;寄存器 4:HVAC 仅风扇模式;寄存器 5:HVAC 加热模式;寄存器 6:HVAC 加热制冷模式;寄存器 7:HVAC 关闭模式。对于没有相关寄存器的模式,可以设置重复的值。
如果 true
使用 write_registers
设置目标温度(target_temp_register
),否则使用 write_register
。
如果指定了 data_type: custom
,则需要一个双引号的 Python 结构体字符串, 用于格式化字符串以解包值。请参阅 Python 文档了解详细信息。 示例:>i
。
f
交换字节/字的顺序,不适用于 custom
和 datatype: string
设置目标温度时
HVAC 模式寄存器的配置
设置 HVAC 模式的请求类型,如果为 true 使用 write_registers
,否则使用 write_register
。 如果为特定模式指定了多个值,则仅使用第一个值写入寄存器。
寄存器值与 HVAC 模式之间的映射
风扇模式寄存器的配置
寄存器值与风扇模式之间的映射 这通常用于控制以下之一:速度、方向或开/关状态。
开/关状态的线圈地址。 仅在 On/Off 状态未作为 HVAC 模式处理时使用此设置。 当从该线圈读取到零时,HVAC 状态设置为关闭,否则 hvac_mode_register
决定 HVAC 的状态。如果未定义此类线圈,则默认为自动。 当 HVAC 模式设置为关闭时,值 0 写入线圈,否则 值 1 写入。 不能与 hvac_onoff_register
一起使用。
开/关状态的寄存器地址。 仅在 On/Off 状态未作为 HVAC 模式处理时使用此设置。 当从该寄存器读取到零时,HVAC 状态设置为关闭,否则 hvac_mode_register
决定 HVAC 的状态。如果未定义此类寄存器,则默认为自动。 当 HVAC 模式设置为关闭时,值 0 写入寄存器,否则 值 1 写入寄存器。
摆动模式寄存器的配置
摆动模式寄存器的地址。(int 调用 write_register,1 个 int 的列表调用 write_registers)。 - 通过保持寄存器读取
寄存器值与摆动模式之间的映射
示例:气候配置
# 示例 configuration.yaml 条目
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_open
、state_opening
、state_closed
和 state_closing
属性指定值。这些值将与从 status_register
读取的值匹配。
如果您的覆盖使用 input_type: holding
(默认)发送命令,它也可以读取中间状态。要调整哪个值表示什么状态,您可以微调可选的状态属性,如 state_open
。这些可选状态值也用于指定写入寄存器的值。如果您指定了可选的 status_register 属性,覆盖状态将从 status_register 读取,而不是用于发送命令的寄存器。
请参阅 参数使用 了解冲突参数。
Configuration Variables
为此连接配置的所有覆盖实体的列表。
设置前端图标的覆盖 类型/类。
在 status_register
或 register
中表示覆盖打开的值。 如果您的配置使用 register
属性,此值将写入保持寄存器以打开覆盖。
在 status_register
或 register
中表示覆盖关闭的值。 如果您的配置使用 register
属性,此值将写入保持寄存器以关闭覆盖。
在 status_register
或 register
中表示覆盖打开的值。 请注意,此状态也应在连接的 Modbus 覆盖上支持。 如果它不会报告状态,则不会检测到此状态。
在 status_register
或 register
中表示覆盖关闭的值。 请注意,此状态也应在连接的 Modbus 覆盖上支持。 如果它不会报告状态,则不会检测到此状态。
从中读取所有覆盖状态的寄存器地址。 如果您指定了 register
属性,而未指定 status_register
属性, 您的主寄存器也将用作状态寄存器。
示例:Modbus 覆盖
# 示例 configuration.yaml 条目
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_open
和 state_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
请参阅 参数使用 了解冲突参数。
Configuration Variables
此 modbus 实例中所有风扇实体的列表。
写请求的类型。
从 Modbus 设备读取以验证风扇。 如果不使用属性,则使用切换寄存器配置。 如果省略,则不进行验证,但风扇的状态会在每次切换时设置。
地址的类型。
与 write_type
相同
示例:风扇配置
# 示例 configuration.yaml 条目
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
请参阅 参数使用 了解冲突参数。
Configuration Variables
此 modbus 实例中所有灯光实体的列表。
写请求的类型。
从 Modbus 设备读取以验证灯光。 如果不使用属性,则使用切换寄存器配置。 如果省略,则不进行验证,但灯光的状态会在每次切换时设置。
地址的类型(holding/coil/discrete/input)。
与 write_type
相同
示例:灯光配置
# 示例 configuration.yaml 条目
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
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
请参阅 参数使用 了解冲突参数。
Configuration Variables
此 modbus 实例中所有传感器的列表。
要读取的寄存器数量。 仅对 data_type: custom
和 data_type: string
有效,对于其他数据类型,count 会自动计算。
响应表示。
设置前端图标的传感器 类型/类。
如果 Modbus 传感器有定义的 NaN 值,可以将此值设置为以 0x
开头的十六进制字符串,包含一个或多个字节(例如,0xFFFF
或 0x80000000
),或直接提供为整数。如果触发,传感器将变为 unavailable
。请注意,nan_value
的十六进制到整数转换目前不遵循 home-assistant 的 Modbus 编码,使用 data_type
、structure
或 swap
参数。
传感器的 state_class。
如果指定了 data_type: custom
,则需要一个双引号的 Python 结构体字符串, 用于格式化字符串以解包值。请参阅 Python 文档了解详细信息。 示例:>i
。
f
交换字节/字的顺序,不适用于 custom
和 datatype: string
如果您将 scale 或 offset 指定为浮点值,将使用双精度浮点运算来计算最终值。这可能会导致值大于 2^53 时的精度损失。
示例:传感器配置
# 示例 configuration.yaml 条目
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
请参阅 参数使用 了解冲突参数。
Configuration Variables
此 modbus 实例中所有开关的列表。
写请求的类型。
从 Modbus 设备读取以验证开关。 如果不使用属性,则使用切换寄存器配置。 如果省略,则不进行验证,但开关的状态会在每次切换时设置。
地址的类型。
与 write_type
相同
示例:开关配置
# 示例 configuration.yaml 条目
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
示例:开关完整配置
# 示例 configuration.yaml 条目
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
参数使用矩阵
某些参数排除其他参数,以下表格显示了可以组合的内容:
数据类型: | custom | string | *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) |
address | 寄存器的地址(例如 138) |
value | (write_register)单个值或 16 位值的数组。单个值将调用 modbus 功能码 0x06。数组将调用 modbus 功能码 0x10。值可能需要反向排序。例如,要设置 0x0004,您可能需要设置 [4,0] ,这取决于 CPU 的字节顺序 |
state | (write_coil)单个布尔值或布尔值数组。单个布尔值将调用 modbus 功能码 0x05。数组将调用 modbus 功能码 0x0F |
示例:写入 float32 类型寄存器
要写入 float32 数据类型寄存器,请使用网络格式,例如 10.0
== 0x41200000
(网络顺序浮点十六进制)。
action: modbus.write_register
data:
address: <目标寄存器地址>
slave: <目标从地址>
hub: <集线器名称>
value: [0x4120, 0x0000]
操作 modbus.set-temperature
操作 | 描述 |
---|---|
set_temperature | 设置温度。需要传入 value ,即所需的目标温度。value 应与 data_type 的类型相同 |
操作 modbus.set_hvac_mode
操作 | 描述 |
---|---|
set_hvac_mode | 设置 HVAC 模式。需要传入 value ,即所需的模式。value 应为有效的 HVAC 模式。所需状态与写入 HVAC 模式寄存器的值之间必须存在映射。执行此操作还将设置 On/Off 寄存器为适当的值,如果定义了此类寄存器。 |
提交问题
提交问题时,请添加您当前的配置(或缩小版本),至少包括:
- modbus 配置行
- 实体(传感器等)行
为了让开发人员更好地识别问题,请将以下行添加到 configuration.yaml
configuration.yaml 文件是 Home Assistant 的主要配置文件。它列出了要加载的集成及其特定配置。在某些情况下,需要直接在 configuration.yaml 文件中手动编辑配置。大多数集成可以在 UI 中配置。 [Learn more]:
logger:
default: warning
logs:
homeassistant.components.modbus: debug
pymodbus: debug
并重新启动 Home Assistant,重现问题,并在问题中包含日志。
基于 modbus 构建
唯一推荐的方法是继承所需的实体。