Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:edl-ehz_unknown

Unbekannten eHz mit vzlogger in Betrieb nehmen

Auch wenn die Liste mit Beispielkonfigurationen für SmartMeter immer länger wird gibt es doch immer wieder neue oder geringfügig andere Modelle die noch nicht aufgeführt sind. Dieser Beitrag soll ein Wegweiser sein wie man solche undokumentierten Zähler mittels IR-Lesekopf und vzlogger eine Kommunikation aufbaut.

Vorbereitungen

Recherche

Auch wenn der Zähler nicht bei uns im Wiki erwähnt wird gibt es vielleicht irgend wo anders Hinweise was für ein Protokoll der Zähler spricht. Ein kurzer Blick in eine Internetsuchmaschine spart vielleicht ein paar der folgenden Schritte.
Man kann die möglichen Varianten auch schon eingrenzen indem man mit einer Digitalkamera (oder SmartPhone) die optische Schnittstelle am Zähler beobachtet. Viele dieser Kameras machen IR-Licht sichtbar, sollte die IR-LED im Display gelegentlich aufleuchten ist schon mal klar das der Zähler PUSH, also ohne Aufforderung, kommuniziert. Das Gegenstück ist PULL, da muss der Zähler zur Datenübertragung aufgefordert werden.

Hardware

  • Zähler muss installiert und mit Spannung versorgt sein
  • Lesekopf an den Zähler heften und mit dem Rechner auf dem vzlogger laufen soll verbinden
  • Prüfen ob das device verfügbar ist, im Folgenden gehen wir von /dev/lesekopf0 als Lesekopf aus

vzlogger

  • RasperryPi Image in Betrieb nehmen oder vzlogger installieren.
  • Sicherstellen das vzlogger nicht als Dienst im Hintergrund läuft
    sudo systemctl stop vzlogger
  • Möglicherweise vorhandenes Logfile löschen
    sudo rm /var/log/vzlogger.log

Tests

Vzlogger hat fast alle Tools eingebaut die nötig sind um heraus zu finden wie man mit dem Zähler Daten austauscht. Dazu nutzen wir verschiedene Minimalkonfigurationen und die Logfiles die dabei generiert werden. Im Grunde verfahren wir im Folgenden nach dem Prinzip „Try and Error“.

erster Versuch

Als erstes prüfen wir ob der Zähler PUSH oder PULL kommuniziert.
Erstelle /home/pi/1_push_d0.conf mit folgendem Inhalt:

1_min_d0.conf
{
  "retry": 0,
  "daemon": false,
  "verbosity": 15,
  "log": "/home/pi/1_push_d0.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": false,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "protocol": "d0",
      "device": "/dev/lesekopf0",
      "dump_file": "/home/pi/1_push_d0.txt",
      "baudrate": 300,
      "parity": "7e1",
      "read_timeout": 60
    }
  ]
}

Führe vzlogger aus

 vzlogger -c ~/1_push_d0.conf 

Achte auf Fehlermeldungen wie z.B. Cannot open logfile, Permission denied oder open(/dev/lesekopf0): No such file or directory. Bevor die nicht behoben sind geht es nicht weiter.
Timeout ist auf 60 Sekunden konfiguriert, entsprechend lange kann es dauern bis vzlogger beendet wird. Ist das nicht der Fall mit den Tasten Strg und C abbrechen.
Läuft vzlogger durch wird er sehr wahrscheinlich eine Meldung Got 0 new readings from meter: ausgeben. Das war zu erwarten und nicht weiter tragisch. Sehen wir uns das dumpfile an:

cat 1_push_d0.txt

Wir suchen nach Zeilen die mit »» beginnen.

  • Ist keine solche Zeile vorhanden bei Pull d0 fortfahren.
  • Ist mindestens eine vorhanden suchen wir links nach der Zeichenfolge 1b 1b 1b 1b SML oder rechts nach lesbarem Text 1.8.0 D0.

Sehr wahrscheinlich wird da aber nur Käse stehen. z.B.

[...]
>>>>> 91.950464000s (   903 ms)
4b 23 2a 50 0a 28 3c 52 7f 52 7f 23 42 02 00 40   K#*P (<R R #B  @
52 0f 53 7f 08 00 40 22 31 40 40 24 00 06 40 00   R S   @"1@@$  @
53 7f 0b 10 42 0e 52 7f 28 4a 00 0a 17 0e 04 18   S   B R (J
0a 17 0e 53 7f 23 4a 42 00 6a 56 39 4a 50 0a 28      S #JB jV9JP (
48 53 7f 20 61 02 40 22 40 28 5c 60 52 7f 01 28   HS  a @"@(\`R  (
02 52 7f 23 2a 0a 17 3e 23 4a 62 00 23 4a 42 47    R #*  >#Jb #JBG
40 0a 0b 10 42 0e 53 7f 23 4a 40 22 30 23 4a 02   @   B S #J@"0#J
00 6b 4b 00                                        kK
[...]

In dem Fall ist klar das der Zähler PUSH kommuniziert, aber die Schnittstelle noch nicht passt. Bei Push d0 fortfahren.

Pull d0

Scheinbar müssen wir die Daten vom Zähler anfordern.
Erstelle /home/pi/2_pull_d0.conf mit folgendem Inhalt:

2_pull_d0.conf
{
  "retry": 0,
  "daemon": false,
  "verbosity": 15,
  "log": "/home/pi/2_pull_d0.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": false,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "protocol": "d0",
      "device": "/dev/lesekopf0",
      "dump_file": "/home/pi/2_pull_d0.txt",
      "pullseq": "2F3F210D0A",
      "ackseq": "auto",
      "baudrate": 300,
      "parity": "7e1"
    }
  ]
}

Führe vzlogger aus

 vzlogger -c ~/2_pull_d0.conf 

und

cat 2_pull_d0.txt

Eine Ausgabe in der Art

##### 51.279460000s (     0 ms) opened
##### 51.311300000s (    32 ms) read
##### 51.311431000s (     0 ms) TCIOFLUSH and cfsetiospeed
<<<<< 51.311854000s (     0 ms) 
2f 3f 21 0d 0a                                    /?!              

>>>>> 51.750178000s (   439 ms) 
2f 4c 47 5a 34 5a 4d 46 31 30 30 41 43 2e 4d 32   /LGZ4ZMF100AC.M2 
37 0d 0a                                          7                

<<<<< 52.546553000s (   796 ms) 
06 30 34 30 0d 0a                                  040             

##### 52.756216000s (   210 ms) tcdrain cfsetispeed
>>>>> 53.915045000s (  1159 ms) 
02 46 2e 46 28 30 30 29 0d 0a 30 2e 30 28 20 20    F.F(00)  0.0(   
20 20 20 20 20 20 33 30 32 36 32 32 37 32 29 0d         30262272)  
0a 43 2e 31 2e 30 28 33 30 32 36 32 32 37 32 29    C.1.0(30262272) 
0d 0a 43 2e 31 2e 31 28 20 20 20 20 20 20 20 20     C.1.1(         
29 0d 0a 31 2e 38 2e 31 28 30 30 30 30 30 30 2e   )  1.8.1(000000. 
30 30 30 2a 6b 57 68 29 0d 0a 31 2e 38 2e 32 28   000*kWh)  1.8.2( 
30 30 30 30 33 35 2e 33 39 30 2a 6b 57 68 29 0d   000035.390*kWh)  
[...]

##### 55.268535000s (  1353 ms) closed

wäre ein voller Erfolg. Der Zähler hat geantwortet und vzlogger automatisch die Baudrate angepasst.
Schauen wir mal im Log was uns wirklich interessiert:

cat /home/pi/2_pull_d0.log | grep Parsed
[Mar 21 16:23:15][d0]   Parsed reading (OBIS code=1-0:0.0.0*255, value=331210-5032451, unit=)
[Mar 21 16:23:15][d0]   Parsed reading (OBIS code=1-0:1.8.1*255, value=036167.6779, unit=)
[...]

In der Liste sind alle OBIS-Codes enthalten die der jeweilige Zähler bereit stellt. Weiter mit OBIS identifizieren.

Push d0

Wir tasten uns nun an die Geschwindkeit der Schnittstelle heran. Sehr weit verbreitet sind 9600baud. Erstelle /home/pi/2_push_d0.conf mit folgendem Inhalt:

2_push_d0.conf
{
  "retry": 0,
  "daemon": false,
  "verbosity": 15,
  "log": "/home/pi/2_push.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": false,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "protocol": "d0",
      "device": "/dev/lesekopf0",
      "dump_file": "/home/pi/2_push_d0.txt",
      "baudrate": 9600,
      "parity": "7e1",
      "read_timeout": 60
    }
  ]
}

Führe vzlogger aus

 vzlogger -c ~/2_push_d0.conf 

und

cat 2_push_d0.txt

Wir suchen wieder links nach der Zeichenfolge 1b 1b 1b 1b SML oder rechts nach lesbarem Text 1.8.0.

Push SML

Bei SML ist der Standard sehr spezifisch. Es gibt nur sehr selten Abweichungen davon. Es gilt nun nur noch herauszufinden was für Daten uns der Zähler bereitstellt.
Erstelle /home/pi/3_push_sml.conf mit folgendem Inhalt:

3_push_sml.conf
{
  "retry": 0,
  "daemon": false,
  "verbosity": 15,
  "log": "/home/pi/3_push_sml.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": false,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "protocol": "sml",
      "device": "/dev/lesekopf0",
      "baudrate": 9600,
      "parity": "8n1",
      "read_timeout": 60
    }
  ]
}

Führe vzlogger aus

 vzlogger -c ~/3_push_sml.conf 

Die Ausgabe an der Konsole (bzw. cat /home/3_push_sml.log) könnte teilweise so aussehen:

[...]
[Mar 21 19:02:11][mtr0] Reading: id=1-0:1.8.0*255/ObisIdentifier:1-0:1.8.0*255 value=5148283.40 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:2.8.0*255/ObisIdentifier:1-0:2.8.0*255 value=45620365.80 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=5148283.40 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:2.8.1*255/ObisIdentifier:1-0:2.8.1*255 value=45620365.80 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:1.8.2*255/ObisIdentifier:1-0:1.8.2*255 value=0.00 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:2.8.2*255/ObisIdentifier:1-0:2.8.2*255 value=0.00 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:16.7.0*255/ObisIdentifier:1-0:16.7.0*255 value=185.80 ts=1521655331149
[...]

In der Liste sind alle OBIS-Codes enthalten die der jeweilige Zähler bereit stellt. Weiter mit OBIS identifizieren.

OBIS identifizieren

Wir haben nun also ein Liste mit Werten die unser Zähler ausgibt die so

[Mar 21 16:23:15][d0]   Parsed reading (OBIS code=1-0:0.0.0*255, value=331210-5032451, unit=)
[Mar 21 16:23:15][d0]   Parsed reading (OBIS code=1-0:1.8.1*255, value=036167.6779, unit=)
[...]

oder so

[...]
[Mar 21 19:02:11][mtr0] Reading: id=1-0:1.8.0*255/ObisIdentifier:1-0:1.8.0*255 value=5148283.40 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:2.8.0*255/ObisIdentifier:1-0:2.8.0*255 value=45620365.80 ts=1521655331149
[Mar 21 19:02:11][mtr0] Reading: id=1-0:1.8.1*255/ObisIdentifier:1-0:1.8.1*255 value=5148283.40 ts=1521655331149
[...]

ausschaut. Der Dreierblock vor dem Stern (z.B. 1.8.0*) nennt uns Messgröße.Messart.Tarif*.

Viele der Schlüssel die ein Zähler ausgibt interessieren uns aber nicht, wir brauchen keine Seriennummern oder Lastgänge. Wichtig ist erstmal ob es sich um einen Ein- oder Zweirichtungszähler handelt. Dementsprechend wird nur Wirkleistung Bezug (1.x.x) oder zusätzlich Wirkleistung Lieferung (2.x.x) ausgegeben.
Es ist auch nicht ungewöhnlich das ein Zähler OBIS Codes ausgibt die gar nicht in Gebrauch sind, zu erkenne sind sie daran das der Wert (value=) sich nicht verändert. Die meisten Zähler listen z.B. zwei Tarife (x.x.1 und x.x.2), gezählt wird aber nur einer. Für Volkszähler ist der Gesamtwert (x.x.0) am ehesten zu gebrauchen.

Leistung

Im Volkszähler Frontend macht es, grundsätzlich, keinen Unterschied ob ein Kanal als Aktualwert (x.7.x) oder Zählerstand (x.8.x) geloggt wird. Graph und Tabelle enthalten die selben Informationen.

Es gibt allerdings Fälle in denen nur ein grob aufgelöster Zählerstand ausgegeben wird und auch nach Freischaltung nicht besser wird, da kann es zweckmäßig sein auch die Leistung zu loggen.

Strom und Spannung

Strom (51.7.x) und Spannung (52.7.x) können für kürzere Zeiträume interessant sein. Z.B. im Zuge einer Diskussionen und Fehlersuche mit Geräteherstellern oder Netzbetreibern.

Channel einrichten

Da wir nun wissen was der Zähler für Daten bereit stellt können wir die nötigen Kanäle übers Frontend anlegen. Dabei ist wichtig den Typ passend zu den Daten auszuwählen. Die Middleware wird dem neuen Kanal eine UUID zuweisen. Sie sollte notiert werden, wird im nächsten Schritt nämlich noch benötigt.

vzlogger.conf erstellen

Als Ausgangsbasis nehmen wir die Konfiguration mit welcher der Zähler erfolgreich gelesen wurde. Exemplarisch hier die aus Push SML für einen Zweirichtungszähler. Die Unterschiede sollen zeigen wo die Kanäle einzufügen sind. Auf korrekte Klammern und Komma achten!

UUID und OBIS-Code den bereits ausgewählten und eingerichteten Kanälen entsprechend in die Konfiguration übernehmen.

Das die Daten an die Middleware gesendet werden muss der vzlogger im Hintergrund laufen, daher daemon aktivieren. Das ist auch ein guter Moment das Logfile auf Standard umzustellen.

vzlogger.conf
{
  "retry": 0,
  "daemon": true,
  "verbosity": 15,
  "log": "/home/pi/vzlogger.log",
  "local": {
    "enabled": false,
    "port": 8080,
    "index": false,
    "timeout": 0,
    "buffer": 0
  },
  "meters": [
    {
      "enabled": true,
      "allowskip": false,
      "protocol": "sml",
      "device": "/dev/lesekopf0",
      "baudrate": 9600,
      "parity": "8n1",
      "read_timeout": 60,
      "channels": [{
        "uuid" : "6836dd20-00d5-11e0-bab1-856ed5f959ae",
        "middleware" : "http://localhost/middleware.php",
        "identifier" : "1-0:1.8.0"
        },{
        "uuid" : "6836dd10-00d5-11e0-bab1-856ed5f959ae",
        "middleware" : "http://localhost/middleware.php",
        "identifier" : "1-0:2.8.0"
      }]
    }
  ]
}

Vzlogger wird nun nicht in der Konsole sondern als Hintergrunddienst gestartet:

sudo systemctl start vzlogger

Es sollten zeitnah Graphen im Frontend dargestellt werden. Ist das nicht der Fall das Logfile auf Fehlermeldungen prüfen.

cat /home/pi/vzlogger.log

Bei Fragen oder Problemen wende dich an Mailingliste oder Forum. Am schnellsten kann dir geholfen werden wenn du Konfiguration und Logfile gleich mit anhängst.

Abschlusss

Falls alles wie am Schnürchen läuft sollte das Loglevel noch reduziert werden. Dazu in der Konfiguration diese Zeile anpassen:

  "verbosity": 0,

Um die Änderung zu übernehmen den vzlogger neu starten:

sudo systemctl stop vzlogger
sudo systemctl start vzlogger

Besonders freuen wir uns wenn du auch bei erfolgfreicher Einrichtung deines Zähler kurze Rückmeldung gibst. Vielleicht sogar indem du selbst eine Wikiseite zu deinem Zähler erstellst.

howto/edl-ehz_unknown.txt · Zuletzt geändert: 2018/12/03 14:23 von jau