Manufacter
https://gplug.ch/produkte/gplugm/
gPlugM.yml
# gPlugM (ESP32-C3) – Landis+Gyr E450 über M-Bus / DLMS
#
# Analog zu: https://github.com/haribert/gplug-esphome (gPlugE-DSMR-P1)
# Hardware: RX=GPIO7 inverted, 2400 8E1, unverschlüsselt
# Parser: PR #16942 (dlms_parser 1.2.0 – Self-describing E450)
external_components:
- source: github://pr#16942
components: [dlms_meter]
refresh: 1d
substitutions:
devicename: "gplugm"
friendly_name: "gPlugM - Stromzähler"
purpose: "Landis+Gyr E450 über M-Bus/DLMS auslesen"
project_name: "esphome.gplug"
project_version: "1.4"
dns_domain: ".local"
timezone: "Europe/Zurich"
log_level: "DEBUG"
web_server_user: admin
web_server_password: !secret web_server_password
current_ota_password: !secret "gplugm_ota_password"
new_ota_password: !secret ota_password
esphome:
name: "${devicename}"
friendly_name: "${friendly_name}"
comment: "${purpose}"
project:
name: "${project_name}"
version: "${project_version}"
min_version: "2025.2.0"
on_boot:
- priority: -10
then:
- lambda: |-
if (strcmp("${current_ota_password}", "${new_ota_password}") != 0) {
ESP_LOGI("ota_update", "OTA Passwörter unterschiedlich. Setze neues Passwort...");
id(ota_component).set_auth_password("${new_ota_password}");
} else {
ESP_LOGI("ota_update", "OTA Passwörter sind identisch. Keine Änderung nötig.");
}
esp32:
board: esp32-c3-devkitm-1
framework:
type: arduino
wifi:
networks:
- ssid: !secret wifi_1_ssid
password: !secret wifi_1_password
priority: 10
- ssid: !secret wifi_2_ssid
password: !secret wifi_2_password
priority: 5
domain: "${dns_domain}"
ap:
ssid: "${devicename} Fallback"
password: !secret ap_password
captive_portal:
ota:
- platform: esphome
id: ota_component
password: ${current_ota_password}
- platform: web_server
web_server:
port: 80
version: 3
local: true
# auth:
# username: ${web_server_user}
# password: ${web_server_password}
sorting_groups:
- id: group_total
name: "Total"
sorting_weight: 10
- id: group_l1
name: "Phase L1"
sorting_weight: 20
- id: group_l2
name: "Phase L2"
sorting_weight: 30
- id: group_l3
name: "Phase L3"
sorting_weight: 40
- id: group_energy
name: "Energiezähler"
sorting_weight: 50
- id: group_reactive
name: "Blindenergie"
sorting_weight: 55
- id: group_meter
name: "Stromzähler"
sorting_weight: 60
- id: group_diag
name: "${friendly_name}"
sorting_weight: 70
api:
# encryption:
# key: !secret api_key
reboot_timeout: 86400s
logger:
level: ${log_level}
baud_rate: 0
time:
- platform: sntp
id: sntp_time
timezone: "${timezone}"
# --- UART M-Bus (Tasmota: Pin 7, 8E1, 2400, invert so2,0C) ---
uart:
id: mbus_uart
rx_pin:
number: GPIO7
inverted: true
baud_rate: 2400
parity: EVEN
data_bits: 8
stop_bits: 1
rx_buffer_size: 4096
# --- DLMS Meter ---
dlms_meter:
id: dlms_hub
uart_id: mbus_uart
receive_timeout: 150ms
skip_crc: true
# dKEY="" → keine decryption_key
sensor:
# ========== TOTAL ==========
# Rohwert in W → kW
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.1.7.0.255"
name: "Aktueller Bezug (Pi 1.7.0)"
id: power_in
unit_of_measurement: "W"
icon: "mdi:transmission-tower-import"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_total, sorting_weight: 10}
# kein filters / kein multiply
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.2.7.0.255"
name: "Aktuelle Einspeisung (Po 2.7.0)"
id: power_out
unit_of_measurement: "W"
icon: "mdi:transmission-tower-export"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_total, sorting_weight: 20}
# kein filters / kein multiply
# ========== PHASE L1 ==========
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.21.7.0.255"
name: "Leistung L1 Bezug (21.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l1, sorting_weight: 10}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.22.7.0.255"
name: "Leistung L1 Einspeisung (22.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l1, sorting_weight: 15}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.32.7.0.255"
name: "Spannung L1 (32.7.0)"
unit_of_measurement: "V"
icon: "mdi:sine-wave"
accuracy_decimals: 1
device_class: voltage
state_class: measurement
web_server: {sorting_group_id: group_l1, sorting_weight: 20}
# Strom: Rohwert oft in 0.01 A → multiply 0.01 (bei Bedarf auf 0.001 ändern)
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.31.7.0.255"
name: "Strom L1 (31.7.0)"
unit_of_measurement: "A"
icon: "mdi:current-ac"
accuracy_decimals: 2
device_class: current
state_class: measurement
web_server: {sorting_group_id: group_l1, sorting_weight: 30}
filters:
- multiply: 0.01
# ========== PHASE L2 ==========
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.41.7.0.255"
name: "Leistung L2 Bezug (41.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l2, sorting_weight: 10}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.42.7.0.255"
name: "Leistung L2 Einspeisung (42.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l2, sorting_weight: 15}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.52.7.0.255"
name: "Spannung L2 (52.7.0)"
unit_of_measurement: "V"
icon: "mdi:sine-wave"
accuracy_decimals: 1
device_class: voltage
state_class: measurement
web_server: {sorting_group_id: group_l2, sorting_weight: 20}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.51.7.0.255"
name: "Strom L2 (51.7.0)"
unit_of_measurement: "A"
icon: "mdi:current-ac"
accuracy_decimals: 2
device_class: current
state_class: measurement
web_server: {sorting_group_id: group_l2, sorting_weight: 30}
filters:
- multiply: 0.01
# ========== PHASE L3 ==========
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.61.7.0.255"
name: "Leistung L3 Bezug (61.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l3, sorting_weight: 10}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.62.7.0.255"
name: "Leistung L3 Einspeisung (62.7.0)"
unit_of_measurement: "W"
icon: "mdi:flash"
accuracy_decimals: 0
device_class: power
state_class: measurement
web_server: {sorting_group_id: group_l3, sorting_weight: 15}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.72.7.0.255"
name: "Spannung L3 (72.7.0)"
unit_of_measurement: "V"
icon: "mdi:sine-wave"
accuracy_decimals: 1
device_class: voltage
state_class: measurement
web_server: {sorting_group_id: group_l3, sorting_weight: 20}
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.71.7.0.255"
name: "Strom L3 (71.7.0)"
unit_of_measurement: "A"
icon: "mdi:current-ac"
accuracy_decimals: 2
device_class: current
state_class: measurement
web_server: {sorting_group_id: group_l3, sorting_weight: 30}
filters:
- multiply: 0.01
# ========== ENERGIE (Kanal 1.1 wie im E450-Frame) ==========
# Rohwert in Wh → kWh
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.1.1.8.0.255"
name: "Energie Bezug Total (1.8.0)"
id: energy_in
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 10}
filters:
- multiply: 0.001
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.1.2.8.0.255"
name: "Energie Einspeisung Total (2.8.0)"
id: energy_out
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 20}
filters:
- multiply: 0.001
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.1.8.1.255"
name: "Energie Bezug Tarif 1 (1.8.1)"
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 30}
filters:
- multiply: 0.001
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.1.8.2.255"
name: "Energie Bezug Tarif 2 (1.8.2)"
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 40}
filters:
- multiply: 0.001
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.2.8.1.255"
name: "Energie Einspeisung Tarif 1 (2.8.1)"
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 50}
filters:
- multiply: 0.001
- platform: dlms_meter
dlms_meter_id: dlms_hub
obis_code: "1.0.2.8.2.255"
name: "Energie Einspeisung Tarif 2 (2.8.2)"
unit_of_measurement: "kWh"
icon: "mdi:counter"
accuracy_decimals: 3
device_class: energy
state_class: total_increasing
web_server: {sorting_group_id: group_energy, sorting_weight: 60}
filters:
- multiply: 0.001
# Fallback Kanal 0
- platform: dlms_meter
dlms_meter_id: dlms_hubsecrets.yaml
wifi_1_ssid: "foo1"
wifi_1_password: "bar1"
wifi_2_ssid: "foo2"
wifi_2_password: "bar2"
ap_password: ""
ota_password: ""
web_server_password: ""
gplugm_ota_password: ""
api_key: ""Flash to ESPHome
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv esphome --python 3.12
uv venv esphome
source esphome/bin/activate
uv pip install tornado esptool esphome
# backup
esptool.py --chip esp32c3 --port /dev/ttyACM0 --baud 460800 read_flash 0 ALL gplugm_full_backup.bin
# flash over tty
esphome run --device /dev/ttyACM0 gPlugM.yml
# flash over ota
esphome run gPlugM.yml --device 192.168.178.x
Installation
https://gplug.ch/installationsanleitung/gplugmt/
configuration.yaml
https://gplug.ch/blog/integration-gplugm-in-home-assistant/
https://gplug.ch/blog/integration-gplug-in-home-assistent/
homeassistant:
customize_glob:
sensor.gplugm_z_ei:
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
last_reset: 1970-01-01T00:00:00+00:00
sensor.gplugm_z_ei1:
unit_of_measurement: "kWh"
sensor.gplugm_z_ei2:
unit_of_measurement: "kWh"
sensor.gplugm_z_eo:
unit_of_measurement: "kWh"
device_class: energy
state_class: total_increasing
last_reset: 1970-01-01T00:00:00+00:00
sensor.gplugm_z_eo1:
unit_of_measurement: "kWh"
sensor.gplugm_z_eo2:
unit_of_measurement: "kWh"
sensor.gplugm_z_i1:
unit_of_measurement: "A"
sensor.gplugm_z_i2:
unit_of_measurement: "A"
sensor.gplugm_z_i3:
unit_of_measurement: "A"
sensor.gplugm_z_v1:
unit_of_measurement: "V"
sensor.gplugm_z_v2:
unit_of_measurement: "V"
sensor.gplugm_z_v3:
unit_of_measurement: "V"
sensor.gplugm_z_pi:
unit_of_measurement: "kW"
sensor.gplugm_z_po:
unit_of_measurement: "kW"
utility_meter:
energy_in_daily:
source: sensor.gplugm_z_ei
cycle: daily
energy_in_weekly:
source: sensor.gplugm_z_ei
cycle: weekly
energy_in_monthly:
source: sensor.gplugm_z_ei
cycle: monthly
energy_in_yearly:
source: sensor.gplugm_z_ei
cycle: yearly