Stromverbrauchserfassung mit IR-Kopf aus Logarex LK13BD

Einführung

So wie jeder Hausbesitzer und Datennerd, möchte ich wissen wie der Stromverbrauch ist. Als ersten Ansatz möchte ich gerne den gesamten Stromverbrauch messen und daher ist die besten Datenquelle der Stromzähler im Schaltschrank.

Problem Statement

Ziel:

  • Erfassung des Verbrauchs auf Basis von Daten des Stromzählers
  • Empfang der Daten durch den Raspberry im Schaltschrank
  • Aufbereitung der Daten durch die Node-RED Instanz auf dem Raspi
  • Speicherung der Daten in einer Datenbank (MariaDB oder andere Time-Series Database)
  • Erstellen einer HTML Seite für die Anzeige des Verbrauchs

Aufgaben:

  1. Vorbereitung:
    • Ermittlung der Daten die der Stromzähler bereitstellen kann und der Schnittstellen.
    • Aussuchen des Sensors in Orientierung an die Schnittstelle und der Verbindung zum Raspi
  2. Konfiguration
    • Anbringen des Sensors
    • Node-RED zum Empfang und zur Aufbereitung der Daten konfigurieren
  3. Auswahl der Datenbank für die Datenhaltung
  4. Auswahl des Reporting-Werzkzeugs zum Erstellen von Reports bzw. HTML Charts über dem Datenbestand.

Vorbereitung

Der Zähler:

Nun ist der erste Blick einer auf den Stromzähler um zu prüfen, ob dieser auch „smart“ genug ist. Mein Zähler ist ein Logarex LK13BD102015 Baujahr 2014 mit SW-Ver.:02. Nun geht es also darum ein paar Informationen über den Zähler zu ermitteln, was sich als recht schwierig herausstellte. Die tschechische Firma ist bgzl. der Produktdokumentation jetzt nicht so Premium, kann aber auch an meinem tendenziell immer schlechter werdenden Tschechisch liegen.

Grundsätzlich, so scheint es, gibt es eine Art Standard für Verbrauchsmessungen. Die OBIS Kennzahlen. Je nach technischer Implementierung, kann ein Zähler eine Vielzahl von OBIS Kennzahlen über verschiedene Schnittstellen (z.B. Verbrauch) berichten. Meiner kann leider nur den Gesamtverbrauch (OBIS-Kennzahl 1.8.0) über die IR (Infrarot) Schnittstelle wiedergeben. SuperDing.

Der Sensor:

Nach der Informationsbeschaffung über den Zähler hätte ich mich normalerweise für einen Eigenbau IR-Sensor entschieden, doch da ich für die Wärmepumpe noch einen zweiten Zähler habe, und der hoffentlich deutlich Smarter ist, habe ich dann einen etwas besseren Sensor bestellt. Es ist das Modell von Weidmann geworden.

Dieser hat zwei IR-Dioden (Daten senden und empfangen), und ist mit einer USB 2.0 Schnittstelle ausgestattet, die über einen FTDI eine serielle Schnittstelle darstellt. Der Sensor wird mit Hilfe eines Ringmagneten am Stromzähler angebracht. Dabei ist etwas darauf zu achten, dass die Dioden an der LED des Zählers ausgerichtet werden. Das hat aber auf Anhieb geklappt. Ich persönlich finde das 3m lange Kabel etwas zu lang, aber wird schon einen Grund haben.

<Bild vom Sensor>

Konfiguration

Vor dem Anschluß des IR-Lesekopfes am Raspberry ist zu empfehlen, das Syslog auf der Konsole zu starten um zu sehen, ob der Lesekopfes als serielles Gerät erkannt wird.

sudo tail -f /var/log/syslog

Hier ist zu erkennen, dass …

<Details einfügen>

Jetzt können wir über ein paar Shell Befehle schauen, ob der IR-Reader Daten vom Stromzähler empfangen kann. Mit stty konfigurieren wir das Interface auf die richtigen Werte. Die Anleitung dazu gibt es hier.

stty -F /dev/ttyUSB0 300 -parodd cs7 -cstopb parenb -ixoff -crtscts -hupcl -ixon -opost -onlcr -isig -icanon -iexten -echo -echoe -echoctl -echoke

Dann kann man über einen cat Befehl schauen, was da so über das serielle Interface hereinkommt und ggf. auch bereits ein paar Daten sehen. Hier der Output meiner Stromzählers. Es ist auch gut zu erkennen, welche OBIS Kennzahlen übermittelt werden. Es ist leider nur die 1.8.0, also der Gesamtstromverbrauch.

xxx@yyy:~ $ cat /dev/ttyUSB0
/?!
/LOG4LK13BD102015
C.1.0(xxxxxxxx)
0.0.0(1LOG000xxxxxxx)
F.F(0000)
1.8.0(018586.454*kWh)
C.7.1(00000003)
C.7.2(00000004)
C.7.3(00000001)
0.2.1(ver.02, 130314, 41BD)
C.2.1(1409111313)
C.2.9(1400013)
!
a/?!
/LOG4LK13BD102015
C.1.0(xxxxxxxx)
0.0.0(1LOG000xxxxxxx)
F.F(0000)
1.8.0(018586.458*kWh)
C.7.1(00000003)
C.7.2(00000004)
C.7.3(00000001)
0.2.1(ver.02, 130314, 41BD)
C.2.1(1409111313)
C.2.9(1409111313)
!
m^C

Oben genannte Befehle auf der Konsole sind nur zum Testen der Funktionsfähigkeit des IR-Lesekopfes und der seriellen Verbindung. Im weiteren Verlauf werden diese Kommandos nicht mehr gebraucht, weil sich Node-RED um die Datenaufnahme kümmern wird.

Nun geht es als nächstes darum die Daten von der seriellen Schnittselle mit Hilfe von Node-RED zu verarbeiten. Nach etwas Suche bin ich dann auch den Node SmartMeter gekommen, welchen ich dann sofort im Node-RED installiert habe. Es steht dann ein neuer Node „SmartMeter“ bereit. Diesen habe ich dann folgendermaßen konfiguriert, so dass der Zählerstand alle 300 Sekunden (5 Minuten) abgefragt wird.

Konfiguration des SmartMeter Node

Ich habe dann hinter den Node noch einen Debug-Node gehängt, um zu sehen was der Node ausgibt. Hier kann man dann auch sehen, dass im Object 6-0:1.8.0 die OBIS Kennzahl steckt und ramm bei rawValue der aktuelle Zählerstand.

Als nächstes muss dann aus diesem Objekt der aktuelle Zählerstand ausgelesen werden. Dies habe ich mit einer Funktion umgesetzt, die ich direkt an den SmartMeter Node gehängt habe. So extrahiere ich nur den Zählerstand und gebe nur den Wert zur weiteren Verarbeitung als msg. payload weiter.

return [
    { payload: parseFloat(msg.payload["6-0:1.8.0"].rawValue.replace(/[^\d.-]/, '')) },
];

Nach diesem Node schicke ich die Payload dann über ein MQTT Telegram in das Netz, wo es von der Node-RED Hauptinstanz meines Servers weiterverarbeitet wird. Somit ist die Raspberry Seite erledigt.

Im nächsten Post geht es darum die gesammelten Daten aufzubereiten, in einer geeigneten Datenbank zu speichern und auszuwerten.

Quellen / Verweise

5 comments on “Stromverbrauchserfassung mit IR-Kopf aus Logarex LK13BD

  1. Ich würde das selbe auch machen. Leider habe ich einige Probleme und deshalb wollte ich sie um Rat fragen.

    Ich besitze ebenfalls den Logarex LK13BD.
    Wenn ich den IR Sensor am angeschlossenen Raspberry Pi teste funktioniert er unter folgenden Bedingungen:

    1.) stty -F /dev/ttyUSB0 300 -parodd cs7 -cstopb parenb -ixoff -crtscts -hupcl -ixon -opost -onlcr -isig -icanon -iexten -echo -echoe -echoctl -echoke
    2.) cat /dev/ttyUSB0 (in einem terminal öffen – es steht nichts drinnen)
    3.) echo -n -e ‚\x2F\x3F\x21\x0D\x0A‘ > /dev/ttyUSB0 –> Der Zähler antwortet mit: „/LOG4LK13BD202715“
    4.) Innerhalb von 2 Sekunden „echo -n -e ‚\x06\x30\x30\x30\x0D\x0A‘ > /dev/ttyUSB0“ senden und der Zähler antwortet mit allen relevanten Daten.

    Wenn ich das ganze nun über Node-Red laufen lasse sehe ich nur den ersten Handshake (also dass der Zähler mit seinem Namen antwortet. Dann timed der request aus und Node-Red versucht es erneut.

    Ich denke dass Punkt 3 in Node-Red nicht passiert.

    Haben Sie das gleiche Verhalten beim Testen gehabt dass der Zähler erst nach Aufforderung die Daten sendet oder sendet der Zähler aktiv.

    Villeicht haben Sie ja einen Rat.

    Danke,

    Stefan

    1. Moin Stefan,

      nein, so ein Verhalten konnte ich bislang nicht beobachten. Der Node holt, je nach eingestelltem Intervall, die Daten vom Lesekopf ab.

      Hier zum Abgleichen nochmal meine Config:

      [info] Node-RED version: v1.0.3
      [info] Node.js version: v10.18.1
      [info] Linux 4.19.93-v7l+ arm LE
      [info] Loading palette nodes

      Ich habe aber noch den alten node-red-node-serialport mit der Version 0.8.8 und habe eben gesehen, dass die aktuelle Version 0.10.0 ist. Evtl. lohnt ein Blick in das Change-Log, das sich u.U. etwas geändert hat.

      Hier nochmal mein flow.

      Gruß
      Karl

      [{„id“:“5428f539.a94a1c“,“type“:“smartmeter“,“z“:“5efd41c4.ca69c“,“name“:“Get Data“,“datasource“:“3173e1c9.be538e“,“protocol“:“D0Protocol“,“transport“:“SerialRequestResponseTransport“,“requestInterval“:“300″,“d0WakeupCharacter“:“0″,“x“:100,“y“:100,“wires“:[[„97df3769.72ee48“]]},{„id“:“3173e1c9.be538e“,“type“:“smartmeter-connection“,“z“:““,“sourcetype“:“serial“,“serialport“:“/dev/ttyUSB0″,“serialbaud“:“300″,“databits“:“7″,“parity“:“even“,“stopbits“:“1″,“httphost“:“localhost“,“httpport“:“80″,“filepath“:“/dev/null“}]

  2. Moin… ich habe den gleichen Stromzähler. Leider erhalte ich keine Daten über die IR Schnittstelle. Den USB IR Lesekopf konnt ich erfolgreich mit 300 baud 7,N,1 testen. Der funktioniert also.
    cat /dev/ttyUSB0 mit angeschlossenen IR Kopf am Stromzähler liefert keine Daten. Muss der Lesekopf exakt positioniert werden. So viel Spielraum hat man da ja nicht nicht.
    Musstest du deinen Stromzähler noch vorher vom Stromanbeiter aktivieren, damit die IR Schnittstelle auch Daten ausspuckt bzw. hast du den Stromzähler PIN erhalten?

    Gruß Kobi

    1. Moin Kobi,

      nein, ich musste beim Energieversorger nichts aktivieren. Hast du mal geprüft, ob die IR LED überhaupt Signale aussendet? Das kann man mit den meisten Smartphones mit Hilfe der Kamera testen. Vorher aber mit einer Fernbedienung prüfen, ob die Smartphone-Kamera das kann.

      Ich habe den Lesekopf nicht sonderlich lange positioniert. Ich habe ihn einfach raufgesteckt und es lief sofort.

      Gruß
      der Karl

  3. Hallo! Danke lieber Karl für diesen Post und auch Stefan Steiner für die weitere Infos. Ich habe dasselbe Meter und bei mir ginge es ebenfalls auch nur mit beiden Befehle, also in der Summe:

    Einrichten:
    stty -F /dev/ttyUSB0 300 -parodd cs7 -cstopb parenb -ixoff -crtscts -hupcl -ixon -opost -onlcr -isig -icanon -iexten -echo -echoe -echoctl -echoke

    Empfangen:
    cat /dev/ttyUSB0

    Nach Daten fragen:
    echo -n -e ‚\x2F\x3F\x21\x0D\x0A‘ > /dev/ttyUSB0
    echo -n -e ‚\x06\x30\x30\x30\x0D\x0A‘ > /dev/ttyUSB0

    Am besten alles als root (sudo su -).

    Ich habe mein Projekt hier aufgeschrieben:
    http://www.mattbirgit.de/smart-meter-over-poe-ethernet.html

Schreibe einen Kommentar

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