Volkszähler Daten aus dem Stromzähler auslesen

Ziel auslesen eines Smartmeters (EMH-ED300L) -> Vorbereitung für PV -> Wieviel „Watt“ brauchen wir denn und wie verteilt sich das?
Ich habe genutzt:
– USB-IR Lesekopf (von hichi aus dem PV Forum)
– RasPi mit Volkszähler Image

Als erstes den PIN vom Versorger besorgt, damit die Infrarotschnittstelle Daten ausgibt.
Mit einer Taschenlampe musste man den PIN eingeben – komisches Konstrukt, aber berührungslos. nichts für Leute mit zittrigen Händen.

Pi mit SD Karte und Volkszähler Image (Download von der Webseite volkszaehler.org) schreiben mit dem Raspberry Imager.

Feste DHCP IP vergeben und Erreichbarkeit getestet, Passwort geändert, so muss ich nicht im Keller stehen um zu konfigurieren.

USB Lesekopf an der Frontplatte anbringen und am Pi anschliessen.
Udev Rule erstellen, damit der Lesekopf immer unter einem bestimmten Namen

udevadm info --query=all --name=/dev/ttyUSB0

Uns interessiert die „Serial Short“

root@raspberrypi:/home/pi# udevadm info --query=all --name=/dev/ttyUSB0
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.3/1-1.1.3:1.0/ttyUSB0/tty/ttyUSB0
N: ttyUSB0
[..]
E: ID_MODEL_ENC=CP2102\x20USB\x20to\x20UART\x20Bridge\x20Controller
E: ID_MODEL_ID=ea60
E: ID_REVISION=0100
E: ID_SERIAL=Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001
E: ID_SERIAL_SHORT=0001
[..]

Udev Rule erstellen, dann wird der Lesekopf immer unter dem gleichen namen ansprechbar, auch wenn an einem anderen USB Port angesteckt:

vi /etc/udev/rules.d/99-usb-ir-lesekopf.rules
SUBSYSTEM=="tty", ENV{ID_SERIAL_SHORT}=="0001", SYMLINK+="usb-ir-lesekopf0"

Danach Volkszähler konfigurieren – zum start erstmal eine minimal Config erstellen (meters -> enabled, protocol sml und verbosity auf 15) und schauen, ob was ankommt:
/etc/vzlogger.conf

{
"retry" : 0,                /* how long to sleep between failed requests, in seconds */
"verbosity" : 15,           /* between 0 and 15 */
"log" : "/var/log/vzlogger/vzlogger.log",/* path to logfile, optional */
"local" : {
        "enabled" : false,  /* should we start the local HTTPd for serving live readings? */
        "port" : 8081,      /* the TCP port for the local HTTPd */
        "index" : true,     /* should we provide a index listing of available channels? */
        "timeout" : 30,     /* timeout for long polling comet requests, 0 disables comet, in seconds */
        "buffer" : 600      /* how long to buffer readings for the local interface, in seconds */
},
"meters" : [{
        "enabled" : true,   /* disabled meters will be ignored */
        "protocol" : "sml", /* use 'vzlogger -h' for list of available protocols */
        "device" : "/dev/usb-ir-lesekopf0",
        },
]}
systemctl start vzlogger
tail -f /var/log/vzlogger/vzlogger.log
[..]
Dec 22 15:26:26][]     Startup done.
[Dec 22 15:26:26][mtr0] Config.local: 0
[Dec 22 15:26:27][mtr0] Got 4 new readings from meter:
[Dec 22 15:26:27][mtr0] Reading: id=1-0:1.8.0*255/ObisIdentifier:1-0:1.8.0*255 value=70862637.00 ts=1671719187367
[Dec 22 15:26:27][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=36159417.50 ts=1671719187367
[Dec 22 15:26:27][mtr0] Reading: id=1-0:1.8.2*255/ObisIdentifier:1-0:1.8.2*255 value=34703219.50 ts=1671719187367
[Dec 22 15:26:27][mtr0] Reading: id=1-0:16.7.0*255/ObisIdentifier:1-0:16.7.0*255 value=1553.80 ts=1671719187367
[Dec 22 15:26:28][mtr0] Got 4 new readings from meter:
[Dec 22 15:26:28][mtr0] Reading: id=1-0:1.8.0*255/ObisIdentifier:1-0:1.8.0*255 value=70862637.60 ts=1671719188732
[Dec 22 15:26:28][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=36159418.10 ts=1671719188732
[Dec 22 15:26:28][mtr0] Reading: id=1-0:1.8.2*255/ObisIdentifier:1-0:1.8.2*255 value=34703219.50 ts=1671719188732
[Dec 22 15:26:28][mtr0] Reading: id=1-0:16.7.0*255/ObisIdentifier:1-0:16.7.0*255 value=1560.00 ts=1671719188732
[Dec 22 15:26:30][mtr0] Got 4 new readings from meter:
[..]

-> Es kommen sekündlich neue Daten und mein Meter gibt folgende OBIS Codes aus.

1-0:1.8.0 (Gesamtzählerstand)
1-0:1.8.1 Zählerstand HT
1-0:1.8.2 Zählerstand NT
1-0:16.7.0 Aktuelle Leistung in Watt

Kommt hier nichts muss man erstmal suchen -> ggf die IR Diode nicht richtig platziert, debuggen nach volkszähler wiki

Jetzt muss man einen (oder mehrere) Kanäle anlegen, mich interessiert nur die Leistung, also lege ich im Frontend auf der Webseite (-> http:\\IP_des_PI) einen Kanal an:
„Kanal hinzufügen“ -> Elektrische Energie (Leistungswerte) – öffentlich -> Stil Step, Name“Haus 1-0:16.7.0 Leistung“
Es wird eine UUID angezeigt (bekommt man auch nachträglich über das blaue „i“) die benötigt man für die vzlogger.conf

Man ergänzt die in der vzlogger.conf: indem man hinter die device Zeile den/die neuen Kanäle hängt:

{
"retry" : 0, /* how long to sleep between failed requests, in seconds */
"verbosity" : 15 , /* between 0 and 15 */
"log" : "/var/log/vzlogger/vzlogger.log", /* path to logfile, optional */

"local" : {
"enabled" : false, /* should we start the local HTTPd for serving live readings? */
"port" : 8081, /* the TCP port for the local HTTPd */
"index" : true, /* should we provide a index listing of available channels if no UUID was requested? */
"timeout" : 30, /* timeout for long polling comet requests, 0 disables comet, in seconds */
"buffer" : 600 /* how long to buffer readings for the local interface, in seconds */
},

"meters" : [{
         "enabled" : true, /* disabled meters will be ignored */
         "protocol" : "sml", /* see 'vzlogger -h' for list of available prot$ */
         "device" : "/dev/usb-ir-lesekopf0",
         "channels": [{
         "uuid" : "f0014260-8295-11ed-aaad-e54ab8ec0d75 <-UUID aus dem Frontend",
         "middleware" : "http://localhost/middleware.php",
         "identifier" : "1-0:16.7.0" /* Leistung */
         }]
         }
]}

nochmal starten und log anschauen:

systemctl start vzlogger
tail -f /var/log/vzlogger/vzlogger.log
[Dec 23 08:52:05][mtr0] Got 4 new readings from meter:
[Dec 23 08:52:05][mtr0] Reading: id=1-0:1.8.0*255/ObisIdentifier:1-0:1.8.0*255 value=70890821.30 ts=1671781925108
[Dec 23 08:52:05][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=36174328.40 ts=1671781925108
[Dec 23 08:52:05][mtr0] Reading: id=1-0:1.8.2*255/ObisIdentifier:1-0:1.8.2*255 value=34716492.90 ts=1671781925108
[Dec 23 08:52:05][mtr0] Reading: id=1-0:16.7.0*255/ObisIdentifier:1-0:16.7.0*255 value=1013.00 ts=1671781925108
[Dec 23 08:52:05][chn0] Adding reading to queue (value=1013.00 ts=1671781925108)
[Dec 23 08:52:05][chn0] ==> number of tuples: 1
[Dec 23 08:52:05][chn0] compare: 1671781923743 1671781925108
[Dec 23 08:52:05][chn0] copied 1/1 values for middleware transmission
[Dec 23 08:52:05][chn0] JSON request body: [ [ 1671781925108, 1013 ] ]
[Dec 23 08:52:05][chn0] CURL: Found bundle for host localhost: 0x74a07ed0 [serially]
[Dec 23 08:52:05][chn0] CURL: Can not multiplex, even if we wanted to!
[Dec 23 08:52:05][chn0] CURL: Re-using existing connection! (#0) with host localhost
[Dec 23 08:52:05][chn0] CURL: Connected to localhost (::1) port 80 (#0)
[Dec 23 08:52:05][chn0] CURL: Sent 27 bytes: '[ [ 1671781925108, 1013 ] ]'
[Dec 23 08:52:05][chn0] CURL: upload completely sent off: 27 out of 27 bytes
[Dec 23 08:52:05][chn0] CURL: Mark bundle as not supporting multiuse
[Dec 23 08:52:05][chn0] CURL: Received 26 bytes: '{"version":"0.3","rows":1}'
[Dec 23 08:52:05][chn0] CURL: Connection #0 to host localhost left intact
[Dec 23 08:52:05][chn0] CURL Request succeeded with code: 200
[Dec 23 08:52:05][chn0] emptied all (1) values

Man sieht jetzt auch die CURL requests mit dem der Datenwert in die Datenbank/an die Middleware) geschickt wird.

In der Weboberfläche kann man nach kuzer Zeit die ersten Daten bewundern.
Danach das logging im vzlogger.conf von „15“ auf „0“ stellen, da sonst sehr viel geloggt wird (schlecht für die Haltbarkeit der SSD). ggf testen ob der Pi auch einen Reboot übersteht und die vzlogger dann automatisch anspringt

Sehr geholfen hat mir:
https://wiki.volkszaehler.org/howto/emh_pv-anlage
https://wiki.volkszaehler.org/howto/debug