EasyMeter Stromzähler in Home Assistant einbinden

Unser Messstellenbetreiber nutzt die „smarten“ Stromzähler der Firma EasyMeter GmbH, speziell den Easy Meter Q3M. Dies ist ein Drehstromzähler, der dahingehend „smart“ ist, dass man einige Daten auslesen kann. Je nach Konfiguration des Messstellenbetreibers können die aktuelle Gesamtleistung, die Leistung pro Phase in Watt und die „verbrauchte“ sowie eingespeiste Energie in Wattstunden ausgelesen werden. Dazu wird eine optische Schnittstelle namens „Info-DSS“ bereitgestellt, die nichts anderes ist als eine unidirektionale Implementierung des SML Protokolls.

Über das SML Protokoll werden mittels sogenannter OBIS-Codes die oben genannten Informationen sekündlich über die Schnittstelle gepusht. Diese Daten muss man „nur“ noch abgreifen und bereitstellen. Dazu benötigt man – zusätzlich zum bestehenden Home Assistant System – ein Gerät direkt am Zähler, dass die Daten der Info-DSS-Schnittstelle entgegennimmt und lesbar umwandelt. Ich nutze dafür einen Raspberry Pi (Zero W), aber auch andere Geräte mit einem Linux funktionieren. Die Anbindung funktioniert bei mir über einen IR-Lesekopf, den man sich aber auch selber bauen kann.

Auf meinem Raspebrry Pi habe ich dann die Software vzlogger installiert – wohlgemerkt ohne die Volkszähler-Middleware, die sonst die Speicherung und Darstellung der Daten übernimmt. Der vzlogger kann die aktuellen Daten problemlos allein auswerten und als json bereitstellen. Dafür ist in /etc/vzlogger.conf folgende Konfiguration notwendig:

{
  "retry": 0,
  "daemon": true,
  "verbosity": 3,
  "local": {
    "enabled": true,
    "port": 8084,
    "index": true,
    "timeout": 0,
    "buffer": -1
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": true,
      "interval": -1,
      "aggtime": -1,
      "aggfixedinterval": false,
      "channels": [
        {
          "api": "null",
          "uuid": "abcdefgh-ijkl-mnop-qrst-uvwxyz012345",
          "identifier": "1-0:1.8.0*255",
          "aggmode": "max",
          "duplicates": 3600
        }
	  ],
      "protocol": "sml",
      "device": "/dev/ttyUSB0",
      "pullseq": "",
      "baudrate": 9600,
      "parity": "8n1",
      "use_local_time": true
    }
  ]
}

Wobei ich die uuid hier unkenntlich gemacht habe und der Übersicht halber nur einen „channel“, nämlich die Energiemenge „Verbrauch“ erfasse. Nachdem die Datei gespeichert ist wird der vzlogger-Daemon neu gestartet:

sudo systemctl restart vzlogger

Und somit kann man die aktuellen Daten unter der IP des Raspberry Pi abrufen: http://[ip_des_pi]:8084 . Das Ganze könnte dann so aussehen:

{
	"version": "0.8.0",
	"generator": "vzlogger",
	"data":[ {
		"uuid": "abcdefgh-ijkl-mnop-qrst-uvwxyz012345", 
		"last": 1634638205040,
		"interval": -1,
		"protocol": "sml",
		"tuples": [ [ 1634638205040, 7418885.2847000007 ] ] 
	} ]
}

In dem Tuple steht also der aktuelle Zählerstand in Wh. Diesen müssen wir nun über Home Assistant auslesen, dazu wird in der Datei /config/configuration.yaml zuerst folgender Bereich eingefügt:

#Zählerstand Verbrauch
sensor:
  - platform: rest
    resource: http://192.168.178.202:8084/
    value_template: >
      {% for i in value_json.data %}
        {% if i.uuid == "abcdefgh-ijkl-mnop-qrst-uvwxyz012345" %}
           {{ '%.2f'%(i.tuples[0][1]) | float }}
        {% endif %}
      {% endfor %}
    method: GET
    name: "Zählerstand Verbrauch"
    unit_of_measurement: Wh
    device_class: energy

Zu beachten an dieser Stelle: Der String, der aus dem Tuple extrahiert wird, bekommt mittels ‚%.2f’% eine Begrenzung der Kommastellen auf 2. Sonst wird der Float regelmäßig mit einer unterschiedlichen Anzahl Kommastellenangezeigt, was die Lesbarkeit beeinträchtigt. Mittels | float wandel ich den String direkt in einen Float um, damit kann ein PC immer besser umgehen als mit String-Zahlen.

Nun könnte man über sensor.zahlerstand_verbrauch schon den aktuellen Zählerstand in Homeassistandt nutzen, aber unglücklicherweise nicht im neuen Energy-Management. Denn dafür muss der Sensor eine Eigenschaft mit state_class haben – die es aber Stand heute nicht gibt (Featue-Request läuft). Daher müssen einige wenige weitere Anpassungen in der /config/configuration.yaml vorgenommen werden:

homeassistant:
  customize:
    #grid consumption
    sensor.zahlerstand_verbrauch:
      state_class: total_increasing

Mit diesen Zeilen teilen wir Home Assistant mit, dass unser Zählerstand eine Gesamtsumme ist, die immer weiter wächst. So kann dann sensor.zahlerstand_verbrauch auch endgültig ins neue Energy-Management eingefügt werden:

Abschließend sei angemerkt, dass diese Integration im Prinzip mit allen Daten funktioniert, die der vzLogger produziert und das ist eine ganze Menge. Implementiert sind unter anderem das OMS-Protokoll, mit dem man funkende Wasserzähler, elektronische Heizkostenverteile und Wärmemengenzähler empfangen kann, aber auch diverse andere sind auf der Info-Seite vermerkt. Von der verfügbaren volkszähler-Implementierung für Home Assistant kann ich leider nur abraten. Diese bietet weder die Performance wie der hier dargestellte Ansatz, noch können die Daten ins Energy-Management einfließen. Auch würde man sich damit eine doppelte Datenhaltung ins Haus holen.

31 Kommentare

  1. Super Sache. Ich habe nämlich die Volkszähler Integration nicht zum Laufen bekommen.

    Da hier ja der Gesamtzählerstand abgefragt wird, müsste sie Bezugseinheit nicht kWh sein? Zumindest ist das bei mir der Fall. Ich habe einen Q3D und das Protokoll ist entsprechend D0.

    1. Der Zähler gibt tatsächlich Wattstunden aus: „tuples“: [ [ 1634638205040, 7418885.2847000007 ] ]
      7418885,2847000007 Wh sind 7418,885 kWh und sogar 7,418885 MWh. Wären das 7418885 kWh wäre ich schon arm 😀 Die meisten Zähler geben in SI-Basiseinheiten aus.

      PS: ich hab das gerade nochmal quer geprüft: Auf der Anzeige stehen 7xxx kWh, aber per SML kommen 7xxxxxx Wh.

  2. Bei mir läuft es super dank dem Tutorial. Ich habe nur das Problem das ich die Daten nicht in den Energy Tab angezeigt bekomme.
    An welcher stelle muss
    homeassistant:
    customize:
    #grid consumption
    sensor.zahlerstand_verbrauch:
    state_class: total_increasing
    in die yaml eingefügt werden?
    Bin noch recht neu zu Homeassistant

    1. Hallo Mark!

      Das ist etwas schwierig zu sagen, weil ich deine Konfiguration ja nicht kenne. Wenn du ncoh recht am Anfang stehst, wirst du wahrscheinlich deine gesamte Konfiguration in der Datei config/configuration.yaml haben. Dort müsstest du suchen, ob das Stichwort „customize:“ schon irgendwo steht. Es sollte direkt unter „homeassistant:“ stehen. Wenn ja, eine Zeile darunter mit zwei Leerzeichen Einschub

      sensor.zahlerstand_verbrauch:
      state_class: total_increasing

      einfügen.

      Ansonsten, wenn das Stichwort „customize:“ bisher nirgendwo auftaucht, kannst du den ganze Block

      customize:
      #grid consumption
      sensor.zahlerstand_verbrauch:
      state_class: total_increasing

      einfach nach dem „homeassistant“ einfügen. Bei mir ist das bereits am Anfang der Datei und sieht dann so aus:

  3. Hallo, irgendwie stehe ich hier auf dem Schlauch…. wo bekomme ich den die meine uuid her. Wenn ich direkt auf den Raspberry zugreife kann ich zwar eine uuid erzeugen diese erzeugt allerdings keine Werte.

    1. Hallo Marc!

      Aus der Datei /etc/vzlogger.conf im Raspberry mit dem IR-Kopf. Da hast du ja eine Vz-Logger Konfiguration angelegt. Daher kommt die uuid.

      Gruß

      Pascal

          1. Antworte ich mir mal selbst. Es lag an meiner config. Ist für einen EBZ Stromzähler nicht ganz einfach zu finden. Danke dir für die Top Anleitung.

          2. Hallo Marc!

            Vielleicht kannst du deine Lösung für deinen speziellen Zähler ja mal hier posten. Da würde sicher der ein oder andere von profotieren.

            Gruß Pascal

  4. Danke für die Anleitung klappt super für Einspeisung und Verbrauch, aber die aktuelle Leistung der PV kann ich mir so nicht anzeigen lassen oder ?

      1. Klappt direkt oben drauf ist ein Siegel das nimmst weg und dann läuft es direkt.

        Aber halt das auslesen der PV Anlage was ich produziere sieht man halt nicht sondern nur was ins Netz geht

        1. Vorsicht mit dem entfernen von Siegeln. Mit der oberen Schnittstelle kann man auch Einstellungen ändern, auf die mir der Messstellenbetreiber Zugriff haben sollte.

      2. nö war nicht notwendig, aber wie bekommst du die Daten deiner PV ? also nicht die Einspeisung sondern die was sie tatsächlich produziert?

          1. Also meine Solaranlage ist ein „Balkonkraftwerk“, es hat einen Schuko Stecker. Darüber kann ich gut die Energie messen.

            Es gibt auch Shelly’s für die Hutschiene.

  5. Danke für diese Konfiguration!

    Kann man das Template anpassen das kW Heraus kommt mit 3 Nachkommastellen?
    Hab versucht nach dem |float /1000 einzugeben aber das klappt leidern incht.
    an welcher stelle muß ich durch 1000 teilen?

  6. Danke für diese super Anleitung! Wie können denn zwei Sensoren integrieren? Momentan zeigt mir Home Assistant bei einem der beiden Werte „Entität nicht definiert“ an.

  7. Hallo Pascal,

    super Beitrag den ich schon länger verfolge. Ich habe mich in letzter in das Thema eingearbeitet und bin nun endlich soweit das Homeassistant und Vzlogger laufen. Ich bekomme Zählerwerte und kann diese auch (in meinem Fall über MQTT) abfragen.

    Ich habe aber noch das Problem die Daten in HA anzuzeigen? Meine Configuration.yaml habe ich um die notwendigen Angaben ergänzt. Auch die Angabe des Sensors. Danach HA einmal neugestartet. Müsste ich nicht nun schon unter Energie den Sensor aus der Dropdownliste wählen können?

    # Loads default set of integrations. Do not remove.
    default_config:

    # Load frontend themes from the themes folder
    frontend:
    themes: !include_dir_merge_named themes

    # Text to speech
    tts:
    – platform: google_translate

    automation: !include automations.yaml
    script: !include scripts.yaml
    scene: !include scenes.yaml

    sensor:
    – platform: mqtt
    name: „stromzaehler_oben_gesamtverbrauch_vz“
    device_claas: energy
    state_claas: total_increasing
    state_topic: „vzlogger/data/chn0/raw“
    unit_of_measurement: kWh
    scan_interval: 10
    friendly_name: „Strom Gesamtverbrauch oben“
    value_template: ‚{{value | round(2) }}‘

    homeassistant:
    customize:
    #grid consumption
    sensor.stromzaehler_oben_gesamtverbrauch_vz:
    state_class: total_increasing

    1. Wenn der Sensor nicht in der Energie-Liste auftaucht, fehlt ihm ein Attribut. Ich habe dafür folgendes in der configuration.yaml hinzugefügt:
      homeassistant:
      customize:
      sensor.zahlerstand_verbrauch:
      state_class: total_increasing

    2. Hallo Rene,

      wäre ja mal spannend – sicherlich nicht nur für mich – zu wissen wie Du die MQTT Integration hinbekommen hast.

      Gruß Olaf

  8. Hallo,
    habe das mal bei mir ausprobiert 🙂
    aber es kommt nix raus
    Habe auch das Problem das ich einen 2 Tarifzähler habe also HT und NT wie bekomme ich das unter?
    meine configuration ist 1:1 wie oben beschrieben.
    Volkszähler laüft einwandfrei und zeigt mir die Grafen an nur ich bekomme das nicht in HA rein .
    wo liegt da mein problem?
    Ha läuft und die Daten der Tasmotas kommen ja
    aber möchte ja die einspeissung haben

    cu Makrus

  9. Hi Pascal,
    erst mal Danke für diese Lösung. Ich hab das noch nicht am Laufen, bin gerade dran …
    ABER: Du hast in Deiner configuration.yaml unter „sensor:“ folgendes stehen:
    name: „Zählerstand Verbrauch“
    unter customize steht aber „zahlerstand_verbrauch“
    Müssten die beiden Einträge nicht gleich heißen (also auch mit Groß- und Kleinschreibung, etc.)?
    Danke

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.