volkszaehler/vzlogger — pull request #27 by gitka (2014-05-17 22:36:32+00:00)
Title: update MeterD0

Änderungen von Reinhard:
1) Fehler beim Setzen des parity korrigiert. (RTS/CTS)
2) Der Landis+Gyr E350 braucht einen Acknowledge. Der kann über die vzlogger.conf nun konfiguriert werden.
"ackseq": "063030300d0a",
Aufbau: $06 ist ein Startzeichen, die nachfolgenden '000' sind 300 baud.' 040' wäre 4800baud. 0d0a sind die üblichen CR LF
3) Schnittstelle so konfiguriert, dass nach 5s ein timeout kommt und diesen ausgewertet. (der read kommt dann mit 0 zurück)
tio.c_cc[VTIME] = 50; /* inter-character timer 50*0.1s*/
tio.c_cc[VMIN] = 0; /* VTIME is timeout counter */

4) Baudrate umschalten. Kann nun konfiguriert werden. (Im Prinzip müßte es gehen, praktisch bekomme ich von meinem Zähler dann keine Antwort. Vielleicht kann es mal jemand testen oder mir sagen warum es nicht geht. )
"baudrate_read":300 setzt die Schnittstelle über
cfsetispeed(&tio, baudrate_read);
tcsetattr(_fd, TCSANOW, &tio);
auf die neue baudrate (nur die Empfangsrichtung)

Die Einträge in der vzlogger.conf für einen Acknowledge ohne baudraten umschalten sehen dann so aus:
"protocol" : "d0", /* see 'vzlogger -h' for list of available protocols */
"device" : "/dev/ttyUSB0",
"enabled": true,
"parity": "7e1",
"baudrate":300,
"baudrate_read":300,
"pullseq":"2f3f210d0a",
"ackseq": "063030300d0a",
"interval": 60,
"channels": [{
...
}]
Fehlen die zusätzlichen Einträge, ist die entsprechende Funktion inaktiv. (kompatible Erweiterung)

5) Filter auf die empfangenen OBIS Codes, da sonst Absturz.

case OBIS_CODE:
if ((byte != '\n') && (byte != '\r')&& (byte != 0x02))// STX ausklammern
case END_LINE:
...
if ((obis_code[0]=='1')||(obis_code[0]=='2')) {
Obis obis(obis_code);
Letzteres ist eigentlich eine Notlösung, da ich obis.cpp nicht wirklich durchschaut habe, aber feststellen musste, das es sehr empfindlich auf nicht Obis codes reagiert.

Zusätzliche Änderungen von Karlheinz:
1. Starterkennungssequenz "/" angepasst, da "/" auch im value-String vorkommen kann. (Siemens TD-3511)
2. "case END_LINE:" Neben "1" u. "2" soll auch "C" ausgewertet werden um Spannungsfehler ermitteln zu können. (wird von Wolfgang genutzt)
3. Endeerkennungssequenz "!" angepasst, da manche Zähler die Pullsequenz noch einmal ausgeben. (L&G ZMD120)