Smartmeter Stromzähler mit dem Raspberry Pi auslesen und Stromverbrauch aufzeichnen

Erstellt am 5. November 2017 von At2oo1

raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials

Schon länger spiele ich mit dem Gedanken den Stromverbrauch im Haus etwas genauer unter die Lupe zu nehmen. Neben den Messungen an einzelnen Steckdosen, welche bisher immer mal wieder mit einem Zwischenstecker erledigt habe, wollte ich auch mal den gesamten Verbrauch zu Gesicht bekommen da sich viele Verbraucher nicht mit einem Zwischenstecker messen lassen (Heiz-pumpe, Außenlicht etc).

Allerdings gab es am Markt für mein Homematic System nur die Möglichkeit den Verbrauch an einem klassischen Ferrari-Stromzähler zu messen oder das ganze via recht teurer SD-Zähler LED an den neueren Stromzählern abzubilden (wobei die Unterstützung für die SML nur selten gegeben ist). Durch Zufall entdeckte ich das die meisten neuen Digitalen Zähler eine optische Datenschnittstelle haben und darüber Verbrauchswerte via Smart Messaging Language (SML) ausgeben. Das Protokoll wurde in verschiedenen Foren schon diskutiert und gut beschrieben, die Ausgabe erfolgt via Infrarot LED am Zähler und lässt sich somit einfach anhand eines Raspberry Pi abgreifen.

Ich habe von den Stadtwerken einen Ehz-01Dvar Wirkverbrauchszähler von ABN Braun eingebaut bekommen. Ab 2017 sind die intelligenten Stromzähler pflicht und die meisten Modelle haben, so wie meiner, eine optische Datenschnittstelle D0 (Infrarot LED) nach DIN EN 62056-21 die uns die Werte im SML-Format liefert. Wenn ihr euch unsicher seit ob die Datenschnittstelle eures Zählers im Standard aktiv ist könnt ihr mit eurem Smartphone ein paar Photos knipsen, auf den Bildern solltet ihr das Infrarot-Licht zu Gesicht bekommen da der digitale Chip eures Smartphone auch IR-Licht sieht. Ich habe einige Bilder machen müssen bis ich durch Zufall den richtigen Moment erwischt habe. Schaut am Besten zusätzlich in das Datenblatt eures Zählers und fragt, falls eine Freischaltung notwendig ist, bei eurem Betreiber an. Meist erhaltet ihr dann unter Angabe eurer Zählernummer eine Anleitung und einen PIN via Post.

Manche Zähler haben auch noch/nur eine S0-Schnittstelle (Bei mir die Infrarot LED ganz links oben), diese übermittelt pro verbrauchter Kilowatt Stunde eine bestimmte Anzahl an Impulsen (blinken). Im Prinzip kann mit der selben Schaltung der Verbrauch auch dort abgefragt werden, die Übermittlung via SML ist aber die moderner Variante und bietet mehrer Möglichkeiten und Informationen.

Hardware

Raspberry Pi

  • Einen Raspberry Pi 3 oder ein Raspberry Pi Zero W
  • Ein Standard Micro USB Netzteil
  • Ein einfaches Gehäuse für den Pi
  • Eine 32GB Micro SD Karte
  • Optional: Ethernet Kabel
  • Optional: Powerline oder WLAN Extender mit PowerLine

Schaltung

Da ich in meinem Stromkasten im Keller keinen WLAN Empfang habe verwende ich einen Raspberry pi 3 mit Ethernet Kabel und PowerLine Adapter, Powerline erhalte ich direkt im Sicherungskasten über eine Hutschienen Schuko Steckdose. Als Alternative kann auch ein WLAN PowerLine Extender an der nächsten vorhandenen Steckdose neben eurem Stromkasten verwendet werden oder das Kabel der IR-LED mit Klingeldraht o.ä. um einen Meter verlängert und der Pi außerhalb des Stromkastens platziert werden (war für mich keine Option).

Verkabelung der Schaltung

Der Aufbau unserer Schaltung ist sehr simpel, wir haben ja nur den Phototransistor und den Widerstand welche wir mit unserem Raspberry Pi verbinden müssen. Das mini Steckbrett benutze ich der Einfachheit halber, das Steckbrett kann mittels doppelseitigen Klebeband einfach im Sicherungskasten festgeklebt werden und ist somit flexibel, wir haben keinen Zug auf den Kabeln der Photodiode. Fritzing File

Wichtig! Der Phototransistor hat einen Emitter und einen Kollektor. Achtet darauf diese richtig anzuschließen, mit Sicht auf die Diode ist der Emitter links und der Kollektor rechts.

Rot: 3,3V – PIN1
Schwarz: GND – PIN6
Blau: RXD – PIN10
Grün: Kollektor
Geld: Emitter
R1: 1k Ohm zwischen Rot und dem Kollektor bzw. RXD

Raspberry Pi für den SML Datenempfang einrichten

Ich verwende als Image das aktuelle Raspbian Stretch und habe meinen Raspberry Pi anhand meines Einsteiger Guides eingerichtet. Alles weitere könnt ihr via SSH oder direkt an der Konsole oder mit einer VNC Verbindung über das Terminal auf dem Desktop erledigen.

Raspberry Pi am Smart Meter anbringen

Bringt euren Raspberry Pi in eurem Sicherungskasten an, der Phototransistor wird mit etwas doppelseitigem Klebeband direkt über die Sende IR-LED geklebt, nach Möglichkeit so das von außen kein Licht mehr eindringt. Schaut in der Bedienungsanleitung eures Zählers welches die Sende LED ist, meist aber die Rechte, die Linke ist für das Empfangen.

Bei mir schaut das Setup so aus (noch zum testen, wird dann ordentlich verkabelt).

Hardware Serial Port aktivieren

Wie ihr sicherlich bemerkt habt verwenden wir den RXD Pin der UART  Schnittstelle unseres Raspberry Pi 3 um die Impulse unseres Phototransistors auszulesen. In alten Raspbian bzw. Raspberry Pi Versionen war die UART Schnittstelle (Hardware Serial Port,  TXD Pin8 und RXD Pin10) über das Gerät /dev/ttyAMA0 auszulesen, in neueren Versionen hängt daran allerdings der Bluetooth Chip und wir können uns der Schnittstelle nicht mehr so einfach bedienen.

Um den UART Hardware Serial Port wieder nutzen zu können sind einige Anpassungen notwendig, hierbei müssen wir allerdings auf Bluetooth verzichten.  Als erstes müssen wir das Consolen Feature deaktivieren um zu verhindern das der Kernel den Serial Port verwendet. Hierfür verwenden wir das Tool raspi-config

sudo raspi-config

Dort wählt ihr:

  • 5 Interfacing options
  • P6 Serial

Die erste Frage beantwortet ihr mit NO, das deaktiviert die Serial Konsole des Kernel

Die zweite Frage beantwortet ihr mit YES um den Hardware Serial Port zu aktivieren

  • Bestätigt mit OK und dann Finish um raspi-config zu beenden

Dann deaktivieren wir Bluetooth um die Hardware Serial Port wieder als Hardware Serial unter /dev/ttyAMA0  benutzen zu können. Wir editieren hierzu die Datei config.txt mit dem Editor nano.

sudo nano /boot/config.txt

Fügt ans ende der Datei folgende Zeile an

dtoverlay=pi3-disable-bt

Speichert die Datei mit STRG+X, Y und ENTER.

Zum Schluss deaktivieren wir noch den Systemdienst des Bluetooth Modems um zu verhindern das sich der Dienst immer wieder des Geräts bedient.

sudo systemctl disable hciuart

Nach einem Reboot können wir den Hardware Serial Port wieder wie früher benutzen.

sudo reboot

Minicom installieren und Photodiode testen

Als Tool um die Serielle Kommunikation zu testen verwenden wir Minicom, dieses installieren wir noch.

sudo apt-get -y install minicom

Wir müssen Minicom noch auf die korrekte Baudrate (9600), 8Bit und keine Parität einstellen, startet minicom

sudo minicom -s
  • Wählt „Serial port setup
  • Drückt dann A für „Serial Device
  • Gebt folgendes Gerät via Tastatur ein /dev/ttyAMA0 bestätigt mit Enter

  • Drückt dann E für „Bps/Par/Bits
  • Wir drücken dann nacheinander folgende Buchstaben um „9600 8N1“ zu wählen und bestätigen mit Enter
    • C
    • L
    • V
    • W

  • Wählt dann „Save setup as dfl“ und beendet den Dialog mit „exit

Dann solltet ihr innerhalb von minicom auch schon Daten zu sehen bekommen (komische Zeichen, dann passt alles), falls nicht stimmt die Schaltung nicht, UART ist nicht ordentlich aktiviert, euer Zähler sendet nichts oder die Photodiode klebt nicht ordentlich über der Sende IR LED (mir ist diese mehrfach verrutscht). Minicom kann dann jeder Zeit mit CTRL+A, Q und ENTER beendet werden.

Wenn Daten empfangen wurden stellen wir die Werte noch fest ein um auch mit anderen Programmen ordentlich auf die Serielle Schnittstelle zugreifen zu können

sudo stty -F /dev/ttyAMA0 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

SML Telegramm vom Smart Meter am Raspberry Pi lesen und verarbeiten

Um die Daten zu verarbeiten kann im Prinzip jede Programmiersprache verwendet werden die auf den Serial Port zugreifen und die Daten verarbeiten kann. Da das SML Protokoll allerdings sehr sehr komplex ist verzichte ich nach langen versuchen auf eine selbst programmierte Lösung und verwende die Software von volkszähler.org

Die Software besteht aus zwei Komponenten:

  1. Der VZLogger -> Liest die Daten via Serial und versendet diese an ein konfigurierbares Ziel
  2. Die Volkszähler Middleware & Frontend -> Die Middleware nimmt die Daten entgegen und speichert Sie in einer MySQL Datenbank, das Frontend ist für die Ausgabe verantwortlich.

Installiert euch die beiden Software-Bestandteile auf eurem Raspberry Pi wie im Wiki beschrieben über das Build Script (VZLogger) und das Install Script (Middleware). Achtet darauf das für den VZLogger Autostart aktiviert wurde.

VZLogger auf dem Raspberry Pi einrichten

Der VZLogger benötigt eine Konfigurationsdatei die beschreibt aus welcher Quelle, welche Daten gelesen werden sollen und wohin diese versendet werden.

Wir erstellen uns als erstes eine dummy Konfiguration um herauszufinden welche SML Daten der VZLogger via Photodiode überhaupt erhält (ist von Zähler zu Zähler unterschiedlich).

Wir erstellen uns eine Konfigurationsdatei mit nano.

sudo nano /etc/vzlogger.conf

Fügt folgenden Inhalt ein

{
"retry" : 0,                    /* sleep between failed requests (seconds) */
"daemon": true,                 /* run as deamon*/
"verbosity" : 15,               /* Loglevel between 0 (nothing) and 15 (higest) */
"log" : "/var/log/vzlogger.log",/* logfile path */

"local" : {
        "enabled" : false,      /* Enable / Disable local HTTP-Server for serving live readings */
        "port" : 8080,          /* TCP port for the local HTTP-Server */
        "index" : true,         /* Provide a index listing of available channels */
        "timeout" : 30,         /* timeout for long polling requests (seconds) */
        "buffer" : 600          /* Buffer reading for the local interface (seconds) */
},

"meters" : [{
        "enabled" : true,           /* disable or enable meter */
        "protocol" : "sml",         /* use 'vzlogger -h' for available protocols */
        "device" : "/dev/ttyAMA0",  /* Serial Port of Photodiod */
        }
]}

Speichert mit STRG+X, Y und ENTER.

Dann starten wir den VZLogger mit folgendem Befehl

sudo systemctl stop vzlogger
sudo systemctl start vzlogger

Um nun herauszufinden welche Daten der Zähler liefert werfen wir einen Blick in das Logfile des VZ Logger.

tail -f /var/log/vzlogger.log

Nach etwas Zeit tauchen auf der Console folgende Informationen auf (ggf. bei euch mehr Readings oder andere) :

[Nov 05 16:31:44][mtr0] Got 4 new readings from meter:
[Nov 05 16:31:44][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=6353884.00 ts=1509895904991
[Nov 05 16:31:44][mtr0] Reading: id=1-0:1.8.2*255/ObisIdentifier:1-0:1.8.2*255 value=6.20 ts=1509895904991
[Nov 05 16:31:44][mtr0] Reading: id=1-0:96.5.5*255/ObisIdentifier:1-0:96.5.5*255 value=3840.00 ts=1509895904991
[Nov 05 16:31:44][mtr0] Reading: id=1-0:1.7.0*255/ObisIdentifier:1-0:1.7.0*255 value=2172.00 ts=1509895904991

Beendet tail mit STRG-C

Bei meinem Zähler erhalte ich wie oben zu sehen Vier Werte, aus der SML Nachricht werden anhand von  OBIS Kennzahlen Werte ausgelesen. Ich benötige lediglich folgende drei Werte / Kennzahlen.

  • ObisIdentifier:1-0:1.7.0 = Kennziffer 1.7.0 = Aktuelle Leistung in (WATT)
  • ObisIdentifier:1-0:1.8.1 = Kennziffer 1.8.1 = Bezug im Tarif 1 (Zählerstand)
  • ObisIdentifier:1-0:1.8.2 = Kennziffer 1.8.2 = Bezug im Tarif 2 (Zählerstand)

Eventuell müsst ihr nun Googeln und die für euch wichtigen Kennzahlen und deren Bedeutung notieren. Mit etwas glück gibts im Volkszähler WiKi zu eurem Zähler schon Infos welche Werte geliefert werden oder in der Bedienungsanleitung eures Zählers wird beschrieben welche Kennzahlen / Werte geliefert werden.

Volkszähler einrichten – Kanäle

Da wir nun Wissen welche Kennzahlen und Werte unser Zähler sendet legen wir auf der Weboberfläche die Kanäle an die unsere Daten vom VZLogger entgegen nehmen können. Bei mir sind es für die drei Kennzahlen demnach drei Kanäle.

Öffnet hierzu in eurem Browser die Volkszähler Webseite:

  • http://<ip-adresse>/ oder http://raspberrypi/

Klickt unten auf Kanal hinzufügen und fügt für eure OBIS Kennzahlen bzw. Werte die euer VZLogger liefert jeweils einen Kanal hinzu. Wichtig! Notiert euch nach dem Erstellen die UUID des jeweiligen Kanals (kann später durch klick auf Info angezeigt werden).

Ich habe drei Kanäle hinzugefügt (nicht benannte Werte bleiben wie voreingestellt):

  • Titel: Haus 1.7.0 (Aktuelle Leistung), Typ: El. Energie (Leistungswerte), Öffentlich: JA, Stil: STEPS
  • Titel: Haus 1.8.1 (Bezug Tarif 1), Typ: El. Energie (Zählerstände), Öffentlich: JA, Stil: STEPS, Auflösung: 1000
  • Titel: Haus 1.8.2 (Bezug Tarif 2), Typ: El. Energie (Zählerstände), Öffentlich: JA, Stil: STEPS, Auflösung: 1000

Hier ein Screenshot des ersten Kanal.

VZLogger fertig einrichten

Nun haben wir die UUIDS unser Kanäle aus der Oberfläche und können unserem VZLogger mitteilen an welchen Kanal er welchen Wert senden soll. Hierfür editieren wir wieder die Konfigurationsdatei mit Nano

sudo nano /etc/vzlogger.conf

Wir müssen nun für jeden Wert den wir übertragen haben möchten einen „Channel“ anlegen. Folgendes muss ein Channel beinhalten:

  • identifier = Die OBIS Kenziffer
  • middleware = Die middleware an welche versendet werden soll
  • uuid = Die UUID des Kanals welcher die Daten empfängt (haben wir uns eben notiert)

Das ist meine Fertige Konfigurationsdatei, UUIDs habe ich durch X ersetzt.

{
"retry" : 0,
"daemon": true,
"verbosity" : 10,
"log" : "/var/log/vzlogger.log",

"local" : {
"enabled" : false,
"port" : 8080,
"index" : true,
"timeout" : 30,
"buffer" : 600
},

"meters" : [{
         "enabled" : true,
         "protocol" : "sml",
         "device" : "/dev/ttyAMA0",
         "channels": [{
         "uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",     /* UUID von dem angelegten Channel für 1.8.1 */
         "middleware" : "http://localhost/middleware.php",    /* Server Adresse der Middleware, läuft bei uns auf dem RasPi mit */
         "identifier" : "1-0:1.8.1",                          /* Die OBIS Kennzahl welche an den Channel gesendet wird - hier Bezug Tarif 1 */
         }, {
         "uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
         "middleware" : "http://localhost/middleware.php",
         "identifier" : "1-0:1.8.2",                           /* Bezug Tarif 2 */
         }, {
         "uuid" : "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
         "middleware" : "http://localhost/middleware.php",
         "identifier" : "1-0:1.7.0",                           /* Aktuelle Leistung */
         }]
}
]}

Speichert mit STRG+X, Y und ENTER.

Nach einem Neustart des VZLogger sollten in eurem Webinterface direkt alle angelegten Channels mit Daten befüllt werden

sudo systemctl stop vzlogger
sudo systemctl start vzlogger

Viel Spaß!

Smartmeter Stromzähler mit dem Raspberry Pi auslesen und Stromverbrauch aufzeichnen
raspberry.tips