go seven !

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.