跳转到内容

DSMR 组件

DSMR 组件连接符合 DSMR(荷兰智能电表标准)的荷兰智能电表,也称为”Slimme meter”或”P1 端口”。

该组件支持纯文本非加密报文,也支持卢森堡使用的加密报文。 如果您的设备使用加密,您必须从您的能源公司获取一个 32 字符长的加密密钥。

该组件是被动式的,它不会向您的设备发送任何数据,设备始终发送数据,该组件解码数据并在接收到数据时更新配置的传感器。

# 示例配置条目
uart:
rx_pin: GPIO16
baud_rate: 115200
rx_buffer_size: 1700
dsmr:
# 可选。DSMR 的 ID。如果您有多个 DSMR 组件,请指定它。
id: dsmr_id
# 可选。UART 集线器的 ID。
# 如果配置了多个 UART,则需要此项。
uart_id: uart_dsmr
# 可选。32 字符长的加密密钥。
# 仅当您的智能电表使用加密时指定(例如,如果您有"Luxembourg Smarty")
decryption_key: !secret decryption_key
# 可选。燃气表的 ID。默认=1。
gas_mbus_id: 1
# 可选。水表的 ID。默认=2。
water_mbus_id: 2
# 可选。指定是否必须进行 CRC 校验。默认=true。
# 您必须将旧版 DSMR 版本设置为 false,因为它们不提供 CRC。
crc_check: true
# 可选。用于读取 DSMR 报文的缓冲区大小。
# 仅当您的智能电表发送大型报文时才指定此参数。
max_telegram_length: 1500
# 可选。P1 端口的数据请求引脚。
# DSMR 模块使用此引脚告诉智能电表何时发送数据。
# 默认情况下,智能电表持续发送数据。
# 仅当您想使用自定义 `request_interval` 时,指定此引脚才有用。
request_pin: GPIO5
# 可选。两次报文读取之间的最小时间。默认=0ms。
# 智能电表发送数据的速度决定了更新频率。
# 这与 `request_pin` 配合使用效果最佳,但此选项也可以在没有它的情况下工作。
request_interval: 0ms
# 可选。读取报文时传入数据的超时时间。默认=200ms。
# 当在给定的超时时间内没有新数据到达时,设备将认为当前
# 报文丢失,并开始寻找下一个报文的头部。
receive_timeout: 200ms
#
# 可用传感器和文本传感器列表。
# 并非所有设备都提供所有传感器。
#
sensor:
- platform: dsmr
energy_delivered_lux:
name: "Energy Consumed Luxembourg. OBIS: 1-0:1.8.0"
energy_delivered_tariff1:
name: "Energy Consumed Tariff 1. OBIS: 1-0:1.8.1"
energy_delivered_tariff2:
name: "Energy Consumed Tariff 2. OBIS: 1-0:1.8.2"
energy_delivered_tariff3:
name: "Energy Consumed Tariff 3. OBIS: 1-0:1.8.3"
energy_delivered_tariff4:
name: "Energy Consumed Tariff 4. OBIS: 1-0:1.8.4"
energy_returned_lux:
name: "Energy Produced Luxembourg. OBIS: 1-0:2.8.0"
energy_returned_tariff1:
name: "Energy Produced Tariff 1. OBIS: 1-0:2.8.1"
energy_returned_tariff2:
name: "Energy Produced Tariff 2. OBIS: 1-0:2.8.2"
energy_returned_tariff3:
name: "Energy Produced Tariff 3. OBIS: 1-0:2.8.3"
energy_returned_tariff4:
name: "Energy Produced Tariff 4. OBIS: 1-0:2.8.4"
energy_delivered_tariff1_ch:
name: "Energy Consumed Tariff 1 (CH). OBIS: 1-1:1.8.1"
energy_delivered_tariff2_ch:
name: "Energy Consumed Tariff 2 (CH). OBIS: 1-1:1.8.2"
energy_returned_tariff1_ch:
name: "Energy Produced Tariff 1 (CH). OBIS: 1-1:2.8.1"
energy_returned_tariff2_ch:
name: "Energy Produced Tariff 2 (CH). OBIS: 1-1:2.8.2"
total_imported_energy:
name: "Reactive Energy Imported (Total). OBIS: 1-0:3.8.0"
reactive_energy_delivered_tariff1:
name: "Reactive Energy Imported Tariff 1. OBIS: 1-0:3.8.1"
reactive_energy_delivered_tariff2:
name: "Reactive Energy Imported Tariff 2. OBIS: 1-0:3.8.2"
reactive_energy_delivered_tariff3:
name: "Reactive Energy Imported Tariff 3. OBIS: 1-0:3.8.3"
reactive_energy_delivered_tariff4:
name: "Reactive Energy Imported Tariff 4. OBIS: 1-0:3.8.4"
total_exported_energy:
name: "Reactive Energy Exported (Total). OBIS: 1-0:4.8.0"
reactive_energy_returned_tariff1:
name: "Reactive Energy Exported Tariff 1. OBIS: 1-0:4.8.1"
reactive_energy_returned_tariff2:
name: "Reactive Energy Exported Tariff 2. OBIS: 1-0:4.8.2"
reactive_energy_returned_tariff3:
name: "Reactive Energy Exported Tariff 3. OBIS: 1-0:4.8.3"
reactive_energy_returned_tariff4:
name: "Reactive Energy Exported Tariff 4. OBIS: 1-0:4.8.4"
power_delivered:
name: "Power Consumed. OBIS: 1-0:1.7.0"
power_returned:
name: "Power Produced. OBIS: 1-0:2.7.0"
power_delivered_ch:
name: "Power Consumed (CH). OBIS: 1-1:1.7.0"
power_returned_ch:
name: "Power Produced (CH). OBIS: 1-1:2.7.0"
reactive_power_delivered:
name: "Reactive Power Imported. OBIS: 1-0:3.7.0"
reactive_power_returned:
name: "Reactive Power Exported. OBIS: 1-0:4.7.0"
electricity_threshold:
name: "Electricity Threshold. OBIS: 0-0:17.0.0"
electricity_switch_position:
name: "Electricity Switch Position. OBIS: 0-0:96.3.10"
electricity_failures:
name: "Electricity Failures. OBIS: 0-0:96.7.21"
electricity_long_failures:
name: "Long Electricity Failures. OBIS: 0-0:96.7.9"
electricity_sags_l1:
name: "Voltage Sags L1. OBIS: 1-0:32.32.0"
electricity_sags_l2:
name: "Voltage Sags L2. OBIS: 1-0:52.32.0"
electricity_sags_l3:
name: "Voltage Sags L3. OBIS: 1-0:72.32.0"
electricity_swells_l1:
name: "Voltage Swells L1. OBIS: 1-0:32.36.0"
electricity_swells_l2:
name: "Voltage Swells L2. OBIS: 1-0:52.36.0"
electricity_swells_l3:
name: "Voltage Swells L3. OBIS: 1-0:72.36.0"
voltage_sag_time_l1:
name: "Voltage Sag Time L1. OBIS: 1-0:32.33.0"
voltage_sag_time_l2:
name: "Voltage Sag Time L2. OBIS: 1-0:52.33.0"
voltage_sag_time_l3:
name: "Voltage Sag Time L3. OBIS: 1-0:72.33.0"
voltage_sag_l1:
name: "Voltage Sag L1. OBIS: 1-0:32.34.0"
voltage_sag_l2:
name: "Voltage Sag L2. OBIS: 1-0:52.34.0"
voltage_sag_l3:
name: "Voltage Sag L3. OBIS: 1-0:72.34.0"
voltage_swell_time_l1:
name: "Voltage Swell Time L1. OBIS: 1-0:32.37.0"
voltage_swell_time_l2:
name: "Voltage Swell Time L2. OBIS: 1-0:52.37.0"
voltage_swell_time_l3:
name: "Voltage Swell Time L3. OBIS: 1-0:72.37.0"
voltage_swell_l1:
name: "Voltage Swell L1. OBIS: 1-0:32.38.0"
voltage_swell_l2:
name: "Voltage Swell L2. OBIS: 1-0:52.38.0"
voltage_swell_l3:
name: "Voltage Swell L3. OBIS: 1-0:72.38.0"
current_l1:
name: "Current Phase 1. OBIS: 1-0:31.7.0"
current_l2:
name: "Current Phase 2. OBIS: 1-0:51.7.0"
current_l3:
name: "Current Phase 3. OBIS: 1-0:71.7.0"
current:
name: "Current. OBIS: 1-0:11.7.0"
current_n:
name: "Neutral Current. OBIS: 1-0:91.7.0"
current_sum:
name: "Current Sum. OBIS: 1-0:90.7.0"
current_fuse_l1:
name: "Current Fuse Phase 1. OBIS: 1-0:31.4.0"
current_fuse_l2:
name: "Current Fuse Phase 2. OBIS: 1-0:51.4.0"
current_fuse_l3:
name: "Current Fuse Phase 3. OBIS: 1-0:71.4.0"
power_delivered_l1:
name: "Power Consumed Phase 1. OBIS: 1-0:21.7.0"
power_delivered_l2:
name: "Power Consumed Phase 2. OBIS: 1-0:41.7.0"
power_delivered_l3:
name: "Power Consumed Phase 3. OBIS: 1-0:61.7.0"
power_returned_l1:
name: "Power Produced Phase 1. OBIS: 1-0:22.7.0"
power_returned_l2:
name: "Power Produced Phase 2. OBIS: 1-0:42.7.0"
power_returned_l3:
name: "Power Produced Phase 3. OBIS: 1-0:62.7.0"
reactive_power_delivered_l1:
name: "Reactive Power Imported L1. OBIS: 1-0:23.7.0"
reactive_power_delivered_l2:
name: "Reactive Power Imported L2. OBIS: 1-0:43.7.0"
reactive_power_delivered_l3:
name: "Reactive Power Imported L3. OBIS: 1-0:63.7.0"
reactive_power_returned_l1:
name: "Reactive Power Exported L1. OBIS: 1-0:24.7.0"
reactive_power_returned_l2:
name: "Reactive Power Exported L2. OBIS: 1-0:44.7.0"
reactive_power_returned_l3:
name: "Reactive Power Exported L3. OBIS: 1-0:64.7.0"
voltage_l1:
name: "Voltage Phase 1. OBIS: 1-0:32.7.0"
voltage_l2:
name: "Voltage Phase 2. OBIS: 1-0:52.7.0"
voltage_l3:
name: "Voltage Phase 3. OBIS: 1-0:72.7.0"
voltage_avg_l1:
name: "Voltage Avg Phase 1. OBIS: 1-0:32.24.0"
voltage_avg_l2:
name: "Voltage Avg Phase 2. OBIS: 1-0:52.24.0"
voltage_avg_l3:
name: "Voltage Avg Phase 3. OBIS: 1-0:72.24.0"
voltage:
name: "Voltage (Overall). OBIS: 1-0:12.7.0"
frequency:
name: "Grid Frequency. OBIS: 1-0:14.7.0"
abs_power:
name: "Absolute active instantaneous power. OBIS: 1-0:15.7.0"
gas_delivered:
name: "Gas Consumed. OBIS: 0-gas_mbus_id:24.2.1"
gas_delivered_be:
name: "Gas Consumed Belgium. OBIS: 0-gas_mbus_id:24.2.3"
water_delivered:
name: "Water Consumed. OBIS: 0-water_mbus_id:24.2.1"
thermal_delivered:
name: "Thermal Energy Consumed. OBIS: 0-3:24.2.1"
sub_delivered:
name: "Submeter Volume. OBIS: 0-4:24.2.1"
gas_device_type:
name: "Gas Device Type. OBIS: 0-gas_mbus_id:24.1.0"
gas_valve_position:
name: "Gas Valve Position. OBIS: 0-gas_mbus_id:24.4.0"
thermal_device_type:
name: "Thermal Device Type. OBIS: 0-3:24.1.0"
thermal_valve_position:
name: "Thermal Valve Position. OBIS: 0-3:24.4.0"
water_device_type:
name: "Water Device Type. OBIS: 0-water_mbus_id:24.1.0"
water_valve_position:
name: "Water Valve Position. OBIS: 0-water_mbus_id:24.4.0"
sub_device_type:
name: "Submeter Device Type. OBIS: 0-4:24.1.0"
sub_valve_position:
name: "Submeter Valve Position. OBIS: 0-4:24.4.0"
apparent_delivery_power:
name: "Apparent Power Delivered. OBIS: 1-0:9.7.0"
apparent_delivery_power_l1:
name: "Apparent Power Delivered L1. OBIS: 1-0:29.7.0"
apparent_delivery_power_l2:
name: "Apparent Power Delivered L2. OBIS: 1-0:49.7.0"
apparent_delivery_power_l3:
name: "Apparent Power Delivered L3. OBIS: 1-0:69.7.0"
apparent_return_power:
name: "Apparent Power Returned. OBIS: 1-0:10.7.0"
apparent_return_power_l1:
name: "Apparent Power Returned L1. OBIS: 1-0:30.7.0"
apparent_return_power_l2:
name: "Apparent Power Returned L2. OBIS: 1-0:50.7.0"
apparent_return_power_l3:
name: "Apparent Power Returned L3. OBIS: 1-0:70.7.0"
active_demand_power:
name: "Active Demand (Avg3 Plus). OBIS: 1-0:1.24.0"
active_demand_abs:
name: "Active Demand (Avg3) Absolute. OBIS: 1-0:15.24.0"
active_energy_import_current_average_demand:
name: "Current Average Quarterly Demand for Peak Tariff Belgium. OBIS: 1-0:1.4.0"
active_energy_export_current_average_demand:
name: "Avg Export Demand (Active). OBIS: 1-0:2.4.0"
reactive_energy_import_current_average_demand:
name: "Avg Import Demand (Reactive). OBIS: 1-0:3.4.0"
reactive_energy_export_current_average_demand:
name: "Avg Export Demand (Reactive). OBIS: 1-0:4.4.0"
apparent_energy_import_current_average_demand:
name: "Avg Import Demand (Apparent). OBIS: 1-0:9.4.0"
apparent_energy_export_current_average_demand:
name: "Avg Export Demand (Apparent). OBIS: 1-0:10.4.0"
active_energy_import_last_completed_demand:
name: "Last Completed Import Demand (Active). OBIS: 1-0:1.5.0"
active_energy_export_last_completed_demand:
name: "Last Completed Export Demand (Active). OBIS: 1-0:2.5.0"
reactive_energy_import_last_completed_demand:
name: "Last Completed Import Demand (Reactive). OBIS: 1-0:3.5.0"
reactive_energy_export_last_completed_demand:
name: "Last Completed Export Demand (Reactive). OBIS: 1-0:4.5.0"
apparent_energy_import_last_completed_demand:
name: "Last Completed Import Demand (Apparent). OBIS: 1-0:9.5.0"
apparent_energy_export_last_completed_demand:
name: "Last Completed Export Demand (Apparent). OBIS: 1-0:10.5.0"
active_energy_import_maximum_demand_running_month:
name: "Max Import Demand This Month (Active). OBIS: 1-0:1.6.0"
active_energy_import_maximum_demand_last_13_months:
name: "Average of Monthly Max Import (Active, 13 months). OBIS: 0-0:98.1.0"
text_sensor:
- platform: dsmr
identification:
name: "DSMR Identification"
p1_version:
name: "DSMR Version. OBIS: 1-3:0.2.8"
p1_version_be:
name: "DSMR Version Belgium. OBIS: 0-0:96.1.4"
timestamp:
name: "Telegram Timestamp. OBIS: 0-0:1.0.0"
electricity_tariff:
name: "Electricity Tariff. OBIS: 0-0:96.14.0"
electricity_failure_log:
name: "Electricity Failure Log. OBIS: 1-0:99.97.0"
message_short:
name: "Message Short. OBIS: 0-0:96.13.1"
message_long:
name: "Message Long. OBIS: 0-0:96.13.0"
equipment_id:
name: "Electric Meter Equipment ID. OBIS: 0-0:96.1.1"
gas_equipment_id:
name: "Gas Equipment ID. OBIS: 0-gas_mbus_id:96.1.0"
gas_equipment_id_be:
name: "Gas Equipment ID Belgium. OBIS: 0-gas_mbus_id:96.1.1"
thermal_equipment_id:
name: "Thermal Equipment ID. OBIS: 0-3:96.1.0"
water_equipment_id:
name: "Water Equipment ID. OBIS: 0-water_mbus_id:96.1.0"
sub_equipment_id:
name: "Submeter Equipment ID. OBIS: 0-4:96.1.0"
gas_delivered_text:
name: "Unformatted gas data. OBIS: 0-gas_mbus_id:24.3.0"
fw_core_checksum:
name: "FW Core Checksum. OBIS: 1-0:0.2.8"
fw_core_version:
name: "Meter FW Core Version. OBIS: 1-0:0.2.0"
fw_module_checksum:
name: "FW Module Checksum. OBIS: 1-1:0.2.8"
fw_module_version:
name: "Meter FW Module Version. OBIS: 1-1:0.2.0"
# (解密的)未解析报文,标记为内部传感器。
# 也可用于根据最后的值触发操作。
telegram:
name: "Raw DSMR Telegram"
internal: true

版本 2.2 使用以下配置支持:

# DSMR v2.2 的自定义 UART 设置
uart:
baud_rate: 9600
data_bits: 7
parity: NONE
stop_bits: 1
dsmr:
crc_check: false
sensor:
- platform: dsmr
energy_delivered_tariff1:
name: dsmr_energy_delivered_tariff1
energy_delivered_lux:
name: dsmr_energy_delivered_tarifflux
text_sensor:
- platform: dsmr
identification:
name: "dsmr_identification"
p1_version:
name: "dsmr_p1_version"
gas_delivered_text:
name: "gas delivered raw"

根据 P1 伴生指南:P1 端口通过将”数据请求”线路拉高(至 +5V)来激活(开始发送数据)。在接收数据时,请求 OSM 必须保持”数据请求”线路处于激活状态(设置为 +5V)。 要停止接收数据,OSM 需要拉低”数据请求”线路(将其设置为”高阻抗”模式)。在这种情况下,数据传输将立即停止。

  • 读取报文后,dsmr 组件将停止数据传输,直到报文被完全处理。这将检索数据和处理数据分开,因此可以看作一种硬件流控制形式。

  • 可以通过仅在需要时启动数据传输来干净地控制传感器读数更新的间隔。此配置选项 request_interval 可用于定义此间隔。

许多 DSMR 读取器电路将 P1 端口的 +5V 引脚直接连接到其数据请求引脚。这样做会使智能电表按照智能电表固件定义的速度发送报文。例如,许多 DSMR v5 电表每秒发送一个报文。 使用此类接线的电路无法使用 request_pin 选项。

但是,当使用允许从 GPIO 在 +5V 和高阻抗模式之间切换数据请求引脚的电路时,可以将此 GPIO 配置为 request_pin

使用光耦电路处理切换已获得最佳效果。直接 GPIO 输出或基于晶体管的电路不是可行的选择。以下是示例电路设计:

当使用在 GPIO 输出上提供 5V 而不是 3.3V 的 MCU 类型时,请使用 330 欧姆电阻代替 200 欧姆电阻。

当有时丢失报文或出现大量 CRC 错误时,您可能需要进行一些更改以获得更好的读取器结果。

建议将 UART 总线的 rx_buffer_size 选项设置为至少最大报文大小,默认为 1500 字节。默认的 UART 读取缓冲区相当小,容易溢出,导致数据字节丢失。

# 示例配置
uart:
pin: D7
baud_rate: 115200
rx_buffer_size: 1700
dsmr:
max_telegram_length: 1700

最好使用硬件 UART 读取 P1 数据。是否使用硬件 UART 可以在连接到 API 记录器时获得的配置转储中检查。示例日志输出:

[02:38:37][C][uart.arduino_esp8266:095]: UART Bus:
[02:38:37][C][uart.arduino_esp8266:097]: RX Pin: GPIO13
[02:38:37][C][uart.arduino_esp8266:099]: RX Buffer Size: 1500
[02:38:37][C][uart.arduino_esp8266:101]: Baud Rate: 115200 baud
[02:38:37][C][uart.arduino_esp8266:102]: Data Bits: 8
[02:38:37][C][uart.arduino_esp8266:103]: Parity: NONE
[02:38:37][C][uart.arduino_esp8266:104]: Stop bits: 1
[02:38:37][C][uart.arduino_esp8266:106]: Using hardware serial interface.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

使用 ESP8266 时,可以使用 GPIO13(例如 D1 Mini 上的引脚 D7)作为硬件 RX。但是,要使其正常工作,必须禁用串行日志记录以保持硬件 UART 可用于 D7。

# ESP8266 示例配置
logger:
baud_rate: 0
level: DEBUG
uart:
pin: GPIO13
baud_rate: 115200

您可以使用另一个 UART 向另一个 P1 接收器提供相同的报文。请参阅用于桥接的配置示例。

# 定义多个 UART
uart:
- id: p1_uart
rx_pin:
number: 4
inverted: true
baud_rate: 115200
rx_buffer_size: 1700
- id: p1_bridge_uart
tx_pin:
number: 10
baud_rate: 115200
# 将输入 UART 链接到 dsmr
dsmr:
uart_id: p1_uart
max_telegram_length: 1700
# 记录报文并将报文传递给 p1_bridge_uart
text_sensor:
- platform: dsmr
telegram:
name: "telegram"
on_value:
then:
- lambda: |-
ESP_LOGV("dsmr", "telegram: %s", x.c_str());
p1_bridge_uart->write_str(x.c_str());