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:

benötigte Software

Wie bereits an anderen Stellen dieser Seite erwĂ€hnt, verwende ich ausschließlich Docker-Container fĂŒr mein Smart-Home-Setup:

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.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE fĂŒr deine Bewertung!

Fragen / Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]

✍Tahsin
02.06.2023 12:05
m-bus-slave-click TSS721A
Bestellung nur ĂŒber Firma
giebt Möglichkeit ohne Firma bestellen

✍pinsel
26.04.2023 07:57
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
↳
✍Bernhard
gepostet am 26.04.2023 08:29
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

✍anonym
26.04.2023 00:54
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!
↳
✍anonym
gepostet am 26.04.2023 14:27
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
↳
✍Bernhard
gepostet am 26.04.2023 16:49
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

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details