[dsmr] add Switzerland channel 1-1 sensors (EWL Luzern AM550) (#17391)

Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
This commit is contained in:
Sebastian G.
2026-10-11 22:37:05 -10:00
committed by GitHub
co-authored by J. Nick Koston J. Nick Koston
parent 602bf00435
commit e92d239996
4 changed files with 230 additions and 2 deletions
+1 -1
View File
@@ -87,7 +87,7 @@ async def to_code(config: ConfigType) -> None:
cg.add_build_flag("-DDSMR_WATER_MBUS_ID=" + str(config[CONF_WATER_MBUS_ID]))
cg.add_build_flag("-DDSMR_THERMAL_MBUS_ID=" + str(config[CONF_THERMAL_MBUS_ID]))
cg.add_library("esphome/dsmr_parser", "1.9.0")
cg.add_library("esphome/dsmr_parser", "1.10.0")
def final_validate(config: ConfigType) -> None:
+168
View File
@@ -97,6 +97,12 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_ENERGY,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("energy_delivered_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT_HOURS,
accuracy_decimals=3,
device_class=DEVICE_CLASS_ENERGY,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("energy_delivered_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT_HOURS,
accuracy_decimals=3,
@@ -109,6 +115,12 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_ENERGY,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("energy_returned_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT_HOURS,
accuracy_decimals=3,
device_class=DEVICE_CLASS_ENERGY,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("energy_returned_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT_HOURS,
accuracy_decimals=3,
@@ -121,6 +133,77 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_ENERGY,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
# Reactive energy totals and per-quadrant (Q1-Q4) values (Switzerland, e.g. EWL Luzern AM550)
cv.Optional("total_imported_energy_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("total_exported_energy_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q1_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q1_tariff2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q2_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q2_tariff2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q3_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q3_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q3_tariff2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q4_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q4_tariff1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("reactive_energy_q4_tariff2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE_HOURS,
accuracy_decimals=3,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
cv.Optional("energy_delivered_tariff1_il"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT_HOURS,
accuracy_decimals=3,
@@ -231,6 +314,91 @@ CONFIG_SCHEMA = cv.Schema(
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
# Per-phase active power and maximum demand (Switzerland, e.g. EWL Luzern AM550)
cv.Optional("power_delivered_l1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("power_delivered_l2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("power_delivered_l3_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("power_returned_l1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("power_returned_l2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("power_returned_l3_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_delivered_l1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_delivered_l2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_delivered_l3_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_returned_l1_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_returned_l2_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_returned_l3_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
device_class=DEVICE_CLASS_REACTIVE_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("maximum_power_delivered_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("maximum_power_returned_ch"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOWATT,
accuracy_decimals=3,
device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT,
),
cv.Optional("reactive_power_delivered"): sensor.sensor_schema(
unit_of_measurement=UNIT_KILOVOLT_AMPS_REACTIVE,
accuracy_decimals=3,
+1 -1
View File
@@ -37,7 +37,7 @@ lib_deps_base =
wjtje/qr-code-generator-library@1.7.0 ; qr_code
functionpointer/arduino-MLX90393@1.0.2 ; mlx90393
pavlodn/HaierProtocol@0.9.31 ; haier
esphome/dsmr_parser@1.9.0 ; dsmr
esphome/dsmr_parser@1.10.0 ; dsmr
https://github.com/esphome/TinyGPSPlus.git#v1.1.0 ; gps
; This is using the repository until a new release is published to PlatformIO
https://github.com/Sensirion/arduino-gas-index-algorithm.git#3.2.1 ; Sensirion Gas Index Algorithm Arduino Library
+60
View File
@@ -12,6 +12,66 @@ sensor:
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_ch:
name: "Energy Consumed (CH). OBIS: 1-1:1.8.0"
energy_returned_ch:
name: "Energy Produced (CH). OBIS: 1-1:2.8.0"
total_imported_energy_ch:
name: "Reactive Energy Imported (CH). OBIS: 1-1:3.8.0"
total_exported_energy_ch:
name: "Reactive Energy Exported (CH). OBIS: 1-1:4.8.0"
reactive_energy_q1_ch:
name: "Reactive Energy Q1 (CH). OBIS: 1-1:5.8.0"
reactive_energy_q1_tariff1_ch:
name: "Reactive Energy Q1 Tariff 1 (CH). OBIS: 1-1:5.8.1"
reactive_energy_q1_tariff2_ch:
name: "Reactive Energy Q1 Tariff 2 (CH). OBIS: 1-1:5.8.2"
reactive_energy_q2_ch:
name: "Reactive Energy Q2 (CH). OBIS: 1-1:6.8.0"
reactive_energy_q2_tariff1_ch:
name: "Reactive Energy Q2 Tariff 1 (CH). OBIS: 1-1:6.8.1"
reactive_energy_q2_tariff2_ch:
name: "Reactive Energy Q2 Tariff 2 (CH). OBIS: 1-1:6.8.2"
reactive_energy_q3_ch:
name: "Reactive Energy Q3 (CH). OBIS: 1-1:7.8.0"
reactive_energy_q3_tariff1_ch:
name: "Reactive Energy Q3 Tariff 1 (CH). OBIS: 1-1:7.8.1"
reactive_energy_q3_tariff2_ch:
name: "Reactive Energy Q3 Tariff 2 (CH). OBIS: 1-1:7.8.2"
reactive_energy_q4_ch:
name: "Reactive Energy Q4 (CH). OBIS: 1-1:8.8.0"
reactive_energy_q4_tariff1_ch:
name: "Reactive Energy Q4 Tariff 1 (CH). OBIS: 1-1:8.8.1"
reactive_energy_q4_tariff2_ch:
name: "Reactive Energy Q4 Tariff 2 (CH). OBIS: 1-1:8.8.2"
power_delivered_l1_ch:
name: "Power Consumed L1 (CH). OBIS: 1-1:21.7.0"
power_delivered_l2_ch:
name: "Power Consumed L2 (CH). OBIS: 1-1:41.7.0"
power_delivered_l3_ch:
name: "Power Consumed L3 (CH). OBIS: 1-1:61.7.0"
power_returned_l1_ch:
name: "Power Produced L1 (CH). OBIS: 1-1:22.7.0"
power_returned_l2_ch:
name: "Power Produced L2 (CH). OBIS: 1-1:42.7.0"
power_returned_l3_ch:
name: "Power Produced L3 (CH). OBIS: 1-1:62.7.0"
reactive_power_delivered_l1_ch:
name: "Reactive Power Consumed L1 (CH). OBIS: 1-1:23.7.0"
reactive_power_delivered_l2_ch:
name: "Reactive Power Consumed L2 (CH). OBIS: 1-1:43.7.0"
reactive_power_delivered_l3_ch:
name: "Reactive Power Consumed L3 (CH). OBIS: 1-1:63.7.0"
reactive_power_returned_l1_ch:
name: "Reactive Power Produced L1 (CH). OBIS: 1-1:24.7.0"
reactive_power_returned_l2_ch:
name: "Reactive Power Produced L2 (CH). OBIS: 1-1:44.7.0"
reactive_power_returned_l3_ch:
name: "Reactive Power Produced L3 (CH). OBIS: 1-1:64.7.0"
maximum_power_delivered_ch:
name: "Maximum Power Consumed (CH). OBIS: 1-1:1.6.0"
maximum_power_returned_ch:
name: "Maximum Power Produced (CH). OBIS: 1-1:2.6.0"
text_sensor:
- platform: dsmr