Smart Meter des Netzbetreibers auslesen KAIFA MA309M
Für ein sinnvolles Optimieren des Stromverbrauchs hilft das Wissen über die aktuellen Verbrauchsdaten. Dazu kann ein zusätzlichen Smart Meter verbaut werden, oder noch besser: Der Smart Meter des Netzbetreibers ausgelesen werden. Als Beispiel kann der Smart Meter meines Netzbetreibers, der Salzburg AG über die M-Bus-Kundenschnittstelle abgefragt und die Daten dadurch in anderen Systemen verwendet werden. Die ausgelesenen Werte umfassen den Energieverbrauch und bei Einsatz einer PV-Anlage die Einspeiseleistung, sowie die Spannung und den Strom jeder einzelnen Phase, alles live, im 5-Sekunden-Takt. Für das Auslesen des Kaifa MA309M reicht ein MBUS-to UART-Board und ein ESP32-Mikrocontroller. Programmiert habe ich den Mikrocontroller in ESP-Home mithilfe eines Open-Source-Projekts von Github: https://github.com/DomiStyle/esphome-dlms-meter. Nach dem Aufspielen des Projekts auf den ESP32 liefert dieser, beim Anschluss an den Smart Meter, die Daten an Home Assistant, wodurch diese ausgewertet und für bestimmte Automatisierungen verwendet werden können.
Eine Voraussetzung für die Kommunikation mit dem Smart Meter ist das Aktivieren der Kundenschnittstelle im Webportal des Netzbetreibers:
Kundenschnittstelle freigeben
Für das Aktivieren der Kundenschnittstelle bietet mein Netzbetreiber im Portal einen Menüpunkt für dessen Freigabe:
Der dadurch bereitgestellte Schlüssel kann für das Auslesen der Daten mittels M-Bus über einen RJ12-Stecker verwendet werden.
Benötigte Hardware
Als Hardware wird dazu folgendes benötigt:
- RJ11 oder RJ12 Kabel
- ESP32: www.amazon.de/dp/B071P98VTG
- m-bus-slave-click TSS721A (MBus -to UART-Board): at.rs-online.com/web/p/entwicklungstools-kommunikation-und-drahtlos/2167484
- 5V-Netzteil oder Ladegerät als Spannungsversorgung für den ESP32
- Kabel: amazon.de/gp/product/B01EV70C78
benötigte Software
Wie bereits an anderen Stellen dieser Seite erwähnt, verwende ich ausschließlich Docker-Container für mein Smart-Home-Setup:
- Home Assistant
- ESP Home (Verbindung zu Home Assistant mittels API-Key)
- Alternativ zur ESP-Home API: MQTT - Broker und Heimassistent MQTT - Integration
Verkabelung
Den TSS721A habe ich wie folgt mit dem ESP32 verbunden:
Stromversorgung über die PINs:
- 5V und
- GND
vom ESP32 auf das M-Bus Board:
- ESP32-Pin35 <-> M-Bus Board Pin TX
- ESP32-Pin16 <-> M-Bus Board Pin RX
- ESP32-GND <-> M-Bus Board GND
- ESP32-3V3 <-> M-Bus Board 3V3
Vom M-Bus-Board auf den RJ12-Stecker
- M-Bus Board MBUS1 auf RJ12-3
- M-Bus Board MBUS2 auf RJ12-4
Vom TSS721A geht es mittels RJ-12 Stecker in den Anschluss des Smart Meter:
Hier nochmal ein Einzelfoto der beiden Boards:
ESPHome-Projekt
Als Voraussetzung für das ESPHome-Projekt wird ein zusätzlicher Ordner vom Git-Hub-Projekt benötigt, welcher in einen Unterordner in ESP-Home kopiert oder mittels git clone heruntergeladen werden kann.
Die Volumes in der Docker-Compose-Datei von ESP-Home mounten bei mir den /config-Ordner auf ./esphome:
..
volumes:
- ./esphome:/config:rw
..
docker-compose.yml, siehe auch: Home-Assistant + DIY Mikrocontroller + ESP Home (Docker)
Die Dateien des esphome-dlms-meter-Projekts habe ich mittels git clone in einem Unterordner abgelegt:
cd OrdnerDesESPHome-Projekts
git clone git@github.com:DomiStyle/esphome-dlms-meter.git
Der Ordner befindet sich bei mir innerhalb von ./esphome, also im Container als Unterordner von /config : /config/esphome-dlms-meter
Damit Wifi und der API-Key des ESP-Home-Projekts richtig angelegt werden, sollte der ESP32 in ESP-Home zunächst als neues Gerät hinzugefügt werden:
Im Anschluss kann die Konfig des ESP32 wie folgt angepasst werden:
esphome:
name: smartmeter
includes:
- ./esphome-dlms-meter
esp32:
board: esp32dev
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "??"
ota:
password: "??"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Smartmeter Fallback Hotspot"
password: "??"
captive_portal:
uart:
tx_pin: GPIO16
rx_pin: GPIO35
baud_rate: 2400
rx_buffer_size: 2048
id: mbus
sensor:
- platform: template
id: meter01_voltage_l1
name: meter01_voltage_l1
unit_of_measurement: V
accuracy_decimals: 1
device_class: "voltage"
state_class: "measurement"
- platform: template
id: meter01_voltage_l2
name: meter01_voltage_l2
unit_of_measurement: V
accuracy_decimals: 1
device_class: "voltage"
state_class: "measurement"
- platform: template
id: meter01_voltage_l3
name: meter01_voltage_l3
unit_of_measurement: V
accuracy_decimals: 1
device_class: "voltage"
state_class: "measurement"
- platform: template
id: meter01_current_l1
name: meter01_current_l1
unit_of_measurement: A
accuracy_decimals: 2
device_class: "current"
state_class: "measurement"
- platform: template
id: meter01_current_l2
name: meter01_current_l2
unit_of_measurement: A
accuracy_decimals: 2
device_class: "current"
state_class: "measurement"
- platform: template
id: meter01_current_l3
name: meter01_current_l3
unit_of_measurement: A
accuracy_decimals: 2
device_class: "current"
state_class: "measurement"
- platform: template
id: meter01_active_power_plus
name: meter01_active_power_plus
unit_of_measurement: W
accuracy_decimals: 0
device_class: "power"
state_class: "measurement"
- platform: template
id: meter01_active_power_minus
name: meter01_active_power_minus
unit_of_measurement: W
accuracy_decimals: 0
device_class: "power"
state_class: "measurement"
- platform: template
id: meter01_active_energy_plus
name: meter01_active_energy_plus
unit_of_measurement: Wh
accuracy_decimals: 0
device_class: "energy"
state_class: "total_increasing"
- platform: template
id: meter01_active_energy_minus
name: meter01_active_energy_minus
unit_of_measurement: Wh
accuracy_decimals: 0
device_class: "energy"
state_class: "total_increasing"
- platform: template
id: meter01_reactive_energy_plus
name: meter01_reactive_energy_plus
unit_of_measurement: Wh
accuracy_decimals: 0
device_class: "energy"
state_class: "total_increasing"
- platform: template
id: meter01_reactive_energy_minus
name: meter01_reactive_energy_minus
unit_of_measurement: Wh
accuracy_decimals: 0
device_class: "energy"
state_class: "total_increasing"
text_sensor:
- platform: template
id: meter01_timestamp
name: meter01_timestamp
mqtt:
broker: "192.168.1.5"
port: "1883"
username: "mqtt"
password: "??"
id: mqtt_broker
discovery: true
custom_component:
- lambda: |-
auto dlms_meter = new esphome::espdm::DlmsMeter(id(mbus));
uint8_t key[] = {0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??};
dlms_meter->set_key(key, 16);
dlms_meter->set_voltage_sensors(id(meter01_voltage_l1), id(meter01_voltage_l2), id(meter01_voltage_l3));
dlms_meter->set_current_sensors(id(meter01_current_l1), id(meter01_current_l2), id(meter01_current_l3));
dlms_meter->set_active_power_sensors(id(meter01_active_power_plus), id(meter01_active_power_minus));
dlms_meter->set_active_energy_sensors(id(meter01_active_energy_plus), id(meter01_active_energy_minus));
dlms_meter->set_reactive_energy_sensors(id(meter01_reactive_energy_plus), id(meter01_reactive_energy_minus));
dlms_meter->set_timestamp_sensor(id(meter01_timestamp)); // Set sensor to use for timestamp (optional)
dlms_meter->enable_mqtt(id(mqtt_broker), "meter01/data");
return {dlms_meter};
Der Parameter "includes" verweist auf den zuvor kopierten Ordner des Github-Projektes. Der unit8_t key muss mit dem zuvor erstellten Schlüssel der Kundenschnittstelle (Netzbetreiberportal) befüllt werden. Die Verbindung des ESP32 mit Home Assistant kann über den ESP-Home und dessen API-Key erfolgen - der Bereich "mqtt:" ist dann nicht notwendig. Wer für die Verbindung MQTT als Protokoll bevorzugt, kann alternativ die Daten für den MQTT-Broker anpassen. (IP, Username und Password).
Falsche Werte in Home Assistant
Zu Beginn habe ich für die Verbindung des TSS721A den im Projekt empfohlenen Pin 36 verwendet, was immer wieder mal komplett falsche Werte erzeugt hat:
Die falschen Werte habe ich zunächst händisch korrigiert, siehe auch: www.libe.net/home-assistant-statistic
Fehlerhafte Werte können per Filter in ESP-Home vermieden werden, siehe folgendes Beispiel:
...
- platform: template
id: meter01_active_power_plus
name: meter01_active_power_plus
unit_of_measurement: W
accuracy_decimals: 0
device_class: "power"
state_class: "measurement"
filters:
- lambda: |-
float MAX_DIFFERENCE = 1500.0;
static float last_value_t = NAN;
static int count_missed_t = 0;
if (count_missed_t == 5) last_value_t = x;
if (isnan(last_value_t) || std::abs(x - last_value_t) < MAX_DIFFERENCE) {
count_missed_t = 0;
return last_value_t = x;
} else {
count_missed_t += 1;
ESP_LOGW("main", "Missed Data active_power_plus %d", count_missed_t);
return last_value_t;
}
Besser ist es aber, wenn die fehlerhaften Werte gar nicht entstehen. Bei mir konnte ich das Problem lösen, indem ich den RX Pin von 36 auf 35 geändert habe. Ein entsprechender Hinweis ist auch in dem Github-Projekt zu finden: https://github.com/DomiStyle/esphome-dlms-meter/issues/16
ESP-Home Update: MBUS: Frame too big for received data
Mit der ursprünglichen ESP-Home-Version 2022.11.3 habe ich als Wert für die uart - rx_buffer_size: 1024 verwendet, was nach einem ESP-Home-Update auf 2023.4.3 beim Auslesen der Daten folgenden Fehler verursacht hat:
[20:44:29][E][espdm:064]: MBUS: Frame too big for received data
[20:44:30][E][espdm:048]: MBUS: Start bytes do not match
[20:44:30][E][espdm:104]: DLMS: Unsupported system title length
Nachdem ich rx_buffer_size auf 2048 geändert habe, konnte ich den ESP32 auch mit der neuen ESPHome-Version verwenden:
uart:
tx_pin: GPIO16
rx_pin: GPIO35
baud_rate: 2400
rx_buffer_size: 2048
id: mbus
siehe auch: https://github.com/DomiStyle/esphome-dlms-meter/issues/19
Fazit
Wenn der Netzbetreiber ein Auslesen des Smartmeters erlaubt, liefert dieser die exakte Bezugs- und Einspeiseleistung. Zudem können die Daten für das Steuern einer Smarthome-Lösung wie Home-Assistant verwendet werden. Der exakte Einspeisewert kann speziell für Betreiber von Photovoltaikanlagen interessant sein. Denkbar wäre als Beispiel auf den Überschuss einer PV-Anlage zu reagieren, ganz ohne der Notwendigkeit den Wechselrichter abzufragen und ohne einen zusätzlichen Smartmeter verbauen zu müssen.

{{percentage}} % positiv

DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
m-bus-slave-click TSS721A Bestellung nur über Firma giebt Möglichkeit ohne Firma bestellen
Danke für die Anleitung! Wir haben hier in Vorarlberg ebenfalls KAIFA MA309M im EInsatz. Dazu habe ich Home Assistent auf meiner Synology NAS in einer virtuellen Umgebung laufen und dort die Add-ons "ESPHome" und "Mosquitto broker" installiert. Wie muss ich hier vorgehen, wenn ich nicht Docker verwende? Wäre nett, wenn du mir weiterhelfen könntest. Danke im Voraus und LG, Kurt
Hallo Kurt, habe ich leider noch nicht gemacht, aber ich denke, du musst dann die zugehörigen Integrationen für MQTT und ESPHome hinzufügen und konfigurieren. Die benötigten Files (includes) für ESPHome würde ich über External Components versuchen?
Beitrag erstellt von Bernhard
Vielen Dank für die tolle Anleitung! Ich versuche gerade den Nachbau mit den gleichen Komponenten, jedoch sehe ich in der Log-Ausgabe außer Info MQTT verbunden keine Ausgabe mehr. Es werden auch keine Messwerte ausgegeben. In anderen Projekten werden auch andere Pins belegt, daher bin ich mir nicht sicher, ob das so alles passt. Verstehe auch nicht, warum hier nicht RX und TX am NodeMCU verwendet wird, sondern ein Pin 35. Bin um jeden Hinweis dankbar, finde das Projekt sehr interessant. LG Daniel Logausgabe: INFO Waiting for result... INFO OTA successful INFO Successfully uploaded program. INFO Starting log output from meter01/debug INFO Connected to MQTT broker!
Danke, hat sich erübrigt! Funktioniert perfekt! Habe api: vergessen - offensichtlich funktioniert bei mir die mqtt-verbindung nicht, aber als esphome in homeassistant wird das Smartmeter korrekt angezeigt! Danke für die Anleitung! LG Daniel
Beitrag erstellt von anonym
Danke für den Hinweis: Ja das sind zwei verschiedene Varianten: ESP-Home API oder MQTT. Ich passe den Artikel bei Gelegenheit an, damit das etwas verständlicher wird.
Beitrag erstellt von Bernhard