Stromzähler via IR-Lesekopf auslesen und Daten in Home Assistant erfassen

Meinen Stromzähler lese ich schon länger mit Hilfe eines IR-Schreib-Lesekopfs aus. Dieser hing bisher via USB-Interface an einem Raspberry Pi 3B+ mit vzlogger. Die Daten werden dann in Home Assistant erfasst und visualisiert. Grundsätzlich funktionierte die Variante sehr gut. Allerdings habe ich auf dem Raspberry Pi zwischendurch immer wieder andere Dinge getestet und das ein oder andere Mal musste ich ihn daher neu aufsetzen. Darüber hinaus wollte ich schon länger alle Services meines Smart Homes auf mein Intel NUC umziehen. Gesagt, getan. Heute war es soweit.

Home Assistant Energie Dashboard

Für den Umbau muss sich das Intel NUC natürlich in der Nähe des Stromzählers befinden, da sonst der IR-Schreib-Lesekopf nicht via USB verbunden werden kann. In meinem Fall ist die Anschlussleitung ca. 2 Meter lang. Da sich mein Netzwerkschrank mit dem NUC in der Nähe befindet, war das Kabel geradeso ausreichend. Alternativ kann natürlich auch ein längeres Kabel verlötet werden. Mehr als 5 Meter sollten es aber nicht sein. Eine andere Möglichkeit wäre das Gerät, welches das Auslesen übernimmt, näher an den Lesekopf zu platzieren. Beispielsweise mit einem WLAN-fähigen IR-Schreib-Lesekopf, einem ESP32 oder einem Raspberry Pi. Aber genau diese Variante möchte ich in meinem Fall ja ersetzen… ;-)

Umsetzung

Hier eine kleine Übersicht, wie mein aktueller Aufbau aussieht:

EMH Metering eHZ-K Stromzähler –> IR-Schreib-Lesekopfs mit USB-Schnittstelle –> Intel NUC 11 –> Proxmox 7.3 –> Debian-VM (Docker Host) –> vzlogger 0.8.1 Docker-Container –> Home Assistant 2022.12.0

Zunächst habe ich den IR-Schreib-Lesekopf via USB mit meinem Intel NUC 11 verbunden. Über die Proxmox-Shell kann man prüfen, ob der IR-Schreib-Lesekopf erkannt wurde. Dieser Schritt kann in der Regel übersprungen werden, da das Gerät auch automatisch in der GUI verfügbar ist, sofern es keine Probleme beim Verbinden gab.

lsusb
Bus 001 Device 002: ID 10c4:ea60 Silicon Labs CP210x UART Bridge

In der Proxmox-Weboberfläche habe ich nun das USB-Gerät vom Proxmox-Host an meine Docker-VM durchgereicht. Dies funktioniert bei der entsprechenden VM unter “Hardware”  mit Klick auf den Button “Add” und “USB Device”. Anschließend öffnet sich ein Dialog und unter “Use USB Port” sollte das gewünschte Gerät auftauchen. Dieses auswählen und mit “Add” bestätigen.

Die VM muss neugestartet werden, damit die Änderung wirksam und das USB-Gerät durchgeschleift wird.

Jetzt wird vzlogger als Docker-Container installiert.  Zur Erstellung des Containers nutze ich Portainer.

Als Image verwende ich “stefanschoof/vzlogger:latest”. Darüber hinaus musste ich noch ein paar Dinge anpassen bzw. ergänzen.

  • Port-Forwarding für Nutzung der REST-API einrichten, ich  nutze Port 8081
  • /etc des Containers auf den Docker Host mappen, sodass die Konfigurationsdatei einen Neustart des Containers überlebt
  • User von “vz” in “root” ändern, da ansonsten kein Zugriff auf das Logfile “/var/log/vzlogger.log” möglich ist und vzlogger nicht startet
  • IR-Schreib-Lesekopf vom Docker Host an den Container durchreichen

Für letzteres benötigen wir den genauen Pfad des USB-Geräts am Docker Host. Dieser kann folgendermaßen herausgefunden werden:

ls /dev/serial/by-id/
usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01A62BBF-if00-port0

Vom Host mappen wir also “/dev/serial/by-id/usb-Silicon_Labs_CP2104_USB_to_UART_Bridge_Controller_01A62BBF-if00-port0” in den Container als “/dev/ttyUSB0”.

Als letztes wird noch die “vzlogger.conf” benötigt. Ich konnte meine funktionsfähige Konfiguration direkt vom Raspberry Pi übernehmen und nach “/var/lib/docker/volumes/vzlogger_data/_data” auf dem Docker Host kopieren. Dadurch wird diese wie oben beschrieben im Container auf “/etc” gemappt.

Meine “vzlogger.conft” sieht folgendermaßen aus:

{
  "retry": 0,
  "daemon": true,
  "verbosity": 0,
  "log": "/var/log/vzlogger.log",
  "push": [],
  "local": {
    "enabled": true,
    "port": 8081,
    "index": true,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "interval": -1,
      "aggtime": -1,
      "aggfixedinterval": true,
      "channels": [
        {
          "uuid": "5078eef0-ea52-22e7-a3bb-8fdc47e03f0e",
          "identifier": "1-0:1.8.0",
          "api": "null",
          "aggmode": "none"
        },
        {
          "uuid": "9b835b00-ea52-22e7-a5c9-df2124ec3246",
          "identifier": "1-0:2.8.0",
          "api": "null",
          "aggmode": "none"
        },
        {
          "uuid": "88888888-2222-1111-aaaa-dd2222cc1111",
          "identifier": "1-0:16.7.0",
          "api": "null",
          "aggmode": "none"
        }

      ],
      "protocol": "sml",
      "device": "/dev/ttyUSB0",
      "baudrate": 9600,
      "parity": "8n1"
    }
  ]
}

Sofern keine fertige “vzlogger.conf” existiert, kann diese mit Hilfe der Dokumentation, Beispiel-Konfigurationen und des Konfigurations-Editors selber erstellt werden.

Jetzt kann der Container gestartet werden. Wenn im Container Log keine Fehler erscheinen, passt alles.

Über das vorher eingerichtete Port-Forwarding kann man nun im Browser bereits die ausgelesenen Daten einsehen. Bei mir über “http://10.10.70.3:8081”.

In Home Assistant lese ich die Daten vom vzlogger via REST-API aus. Folgenden Code nutze ich in der “configuration.yaml”:

  - platform: rest
    name: stromzaehler_gesamtverbrauch_volkszaehler
    device_class: 'energy'
    state_class: 'total_increasing'
    unit_of_measurement: "kWh"
    scan_interval: 10
    resource: http://10.10.70.3:8081
    value_template: > 
      {% for i in value_json.data %}
         {% if i.uuid == "5078eef0-ea52-22e7-a3bb-8fdc47e03f0e" %}
           {{ i.tuples[0][1]|round(0) / 1000 }}
         {% endif %}
      {% endfor %}
    method: GET
  - platform: rest
    name: stromzaehler_aktuellerverbrauch_volkszaehler
    device_class: 'power'
    state_class: 'measurement'
    unit_of_measurement: "W"
    scan_interval: 10
    resource: http://10.10.70.3:8081
    value_template: > 
      {% for i in value_json.data %}
         {% if i.uuid == "88888888-2222-1111-aaaa-dd2222cc1111" %}
           {{ i.tuples[0][1]|round(0) }}
         {% endif %}
      {% endfor %}
    method: GET

Diese Variante habe ich bereits beim Raspberry Pi verwendet, welche bisher ohne Probleme funktioniert hatte. Daher habe ich lediglich die IP-Adressen angepasst und den Code ansonsten unverändert übernommen. In der Zukunft werde ich das Ganze aber ggf. noch gauf MQTT umbauen.

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

Schreibe einen Kommentar

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