[vz-users] TD-3511 mit vzlogger - c++ Hilfe gesucht

Anton antonkaser at gmx.at
Tue Jun 25 19:24:31 CEST 2013


Hallo,

aus unten angeführte Links von "Peter" habe ich mir Obis.cpp angesehen:

/* general */
	{Obis(  1,   0,   1,   7,  DC,  DC), "power",		"Wirkleistung  (Summe)"},
	{Obis(  1,   0,  21,   7,  DC,  DC), "power-l1",		"Wirkleistung  (Phase 1)"},
	{Obis(  1,   0,  41,   7,  DC,  DC), "power-l2",		"Wirkleistung  (Phase 2)"},
	{Obis(  1,   0,  61,   7,  DC,  DC), "power-l3",		"Wirkleistung  (Phase 3)"},

	{Obis(  1,   0,  12,   7,  DC,  DC), "voltage",		"Spannung      (Mittelwert)"},
	{Obis(  1,   0,  32,   7,  DC,  DC), "voltage-l1",	"Spannung      (Phase 1)"},
	{Obis(  1,   0,  52,   7,  DC,  DC), "voltage-l2",	"Spannung      (Phase 2)"},
	{Obis(  1,   0,  72,   7,  DC,  DC), "voltage-l3",	"Spannung      (Phase 3)"},

	{Obis(  1,   0,  11,   7,  DC,  DC), "current",		"Stromstaerke  (Summe)"},
	{Obis(  1,   0,  31,   7,  DC,  DC), "current-l1",	"Stromstaerke  (Phase 1)"},
	{Obis(  1,   0,  51,   7,  DC,  DC), "current-l2",	"Stromstaerke  (Phase 2)"},
	{Obis(  1,   0,  71,   7,  DC,  DC), "current-l3",	"Stromstaerke  (Phase 3)"},

	{Obis(  1,   0,  14,   7,   0,  DC), "frequency",		"Netzfrequenz"},
	{Obis(  1,   0,  12,   7,   0,  DC), "powerfactor",	"Leistungsfaktor"},

	{Obis(  0,   0,  96,   1,  DC,  DC), "device",		"Zaehler Seriennr."},
	{Obis(  1,   0,  96,   5,   5,  DC), "status",		"Zaehler Status"},

	{Obis(  1,   0,   1,   8,	DC, DC), "counter",		"Zaehlerstand Wirkleistung"},
	{Obis(  1,   0,   2,   8,  DC, DC), "counter-out",	"Zaehlerstand Lieferg."},

BSP bei mir:

1.8.1(2.538*kWh)

2.8.1(24666.715*kWh)

Daraus erkenne ich, dass meine Datenausgeabe des Lesekopfes erkannt werden müsste, wenn Die Daten richtig vom MeterD0.cpp
übergeben werden würden.

In MeterD0 wird aber jede Zeile der Lesekopfausgabe gehandelt. Das möchte ich gerne verhindern, da ich meine, dass folgende Zeilen Probleme bereiten:
	
#F.F()
..(32958)
..1(G23-511-C.1/95-3762)
C.7.()

Also würde ich gerne in MeterD0 einen "Abfrage" einfügen, die alle Zeilen, die, nachdem die Seriennummer ausgelesen wurde, daraufhin überprüft, ob als erster Wert eine "Zahl" steht. Die Zahl soll auch nicht "0" sein.
Solche Zeilen sollen dann vollständig ignoriert werden.


			case IDENTIFICATION:		/* IDENTIFICATION has 16 bytes */

				if (byte == '\r' || byte == '\n') { /* detect line end */

					identification[byte_iterator] = '\0'; /* termination */

					print("identification ", identification);

					context = FF_CODE;	/*+++ <--- Hier müsste auf die "Zahlenueberpruefung" gesprungen werden. +++++ */

					byte_iterator = 0;

				}

				else {

					if(!isprint(byte)) {

						print(log_error, "====> binary character '%x'", name().c_str(), byte);

						//error_flag=true;

					}

					else {

						identification[byte_iterator++] = byte;

					}

					}

				break;

			case START_LINE:

				break;

				

     case Zahlenueberpruefung  ?????????

  

			case FF_CODE:

				if ((byte != '\n') && (byte != '\r'))

				{

				if (byte == ')') {

							

					byte_iterator = 0;

                     			print("OBIS_CODE ");

					context = OBIS_CODE;

				}

					else byte_iterator++;

				}

				break;


Wobei diese "Zahlenueberpruefung" nach jedem '\n' gemacht werden müsste 
(also in JEDER Zeile), bis das '!' kommt.

Ich kann mir zwar etwas lesen, wie das Programm funktioniert, kann es 
dann auch compilieren, aber leider reichen meine Kenntnisse nicht aus, 
um dies Überprüfung mit einzubauen.
Daher wäre ich sehr dankbar für Hilfe in dieser Richtung!


Am 2013-06-17 12:43, schrieb Peter Evertz:
>> Am 17.06.2013 08:30, schrieb Michael Wulz:
>>> Hallo,
>>>
>>> oben weiter hats schon jemand mal erwähnt - der Parser für d0 ist 
>>> recht rudimentär, um nicht
>>> zu sagen 'unsauber programmiert'.
>>>
>>> Bin leider jetzt kein c++ Progger - sodass ich schnell helfen 
>>> könnte. Peter hat angekündigt es zu machen
>>> aber derzeit wenig Zeit.
>>>
>>> Denke wir werden mit dem Problem ein Zeitchen leben müssen ;-)
>>>
>>> gruss
>> Das Problem mit der Baudrate ist gefixed.
>>
>>
>> https://github.com/peterevertz/vzlogger.git
>> Raspi-binary: http://www.peterevertz.net/vz/vzlogger.gz
>>
>> Die Problem im D0 Parser werde mangels Zeit und D0 Zähler nicht fixen 
>> können.
>>
>>
>> Grüße
>> Peter
>>
>>
>>>
>>> Am 16.06.13 21:14, schrieb Anton:
>>>> Hallo,
>>>>
>>>> die Tipps in letzter Zeit brachten mich heute genau bis zu dem 
>>>> F.F() Problem:
>>>>
>>>> Ich habe den alternativen vzlogger als git geladen und die MeterD0 
>>>> angepasst
>>>> Dann neu compiliert.
>>>> Dann folgendes u.a in vzlogger.conf eingetragen:
>>>>
>>>> "meters" : [{
>>>>    "enabled" : true, /* disabled meters will be ignored */
>>>>    "protocol" : "d0",
>>>>    "device" : "/dev/ttyUSB0",
>>>>    "baudrate" : 300,
>>>>    "parity" : "7E1",
>>>>    "pullseq" : "2F3F210D0A", /* HEX Darstellung der Pullsequen*/
>>>>    "interval" : 61, /* Wartezeit bis zum nächsten Pul*/
>>>>
>>>>         }
>>>> ]}
>>>>
>>>> Danach wird der Logger erkannt, aber die Daten werden nicht 
>>>> eingelesen!!
>>>>
>>>> root at raspberrypi:/etc# vzlogger
>>>> [Jun 16 21:01:30][mtr0] Creating new meter with protocol d0.
>>>> [Jun 16 21:01:30][mtr0] Meter configured. enabled
>>>> [Jun 16 21:01:30]       New meter initialized (protocol=d0)
>>>> [Jun 16 21:01:30]       Have 1 meters.
>>>> [Jun 16 21:01:30][main] foreground=1, daemon=0, local=0
>>>> [Jun 16 21:01:30]       NOT Daemonize process...
>>>> [Jun 16 21:01:30]       Opened logfile /var/log/vzlogger.log
>>>> [Jun 16 21:01:30][]     ===> Start meters.
>>>> [Jun 16 21:01:30][mtr0] Meter connection established
>>>> [Jun 16 21:01:30][mtr0] Meter thread started
>>>> [Jun 16 21:01:30][mtr0] meter is opened. Start channels.
>>>> [Jun 16 21:01:30][]     Startup done.
>>>> [Jun 16 21:01:30][mtr0] Number of readers: 32
>>>> [Jun 16 21:01:30][mtr0] Config.daemon: 0
>>>> [Jun 16 21:01:30][mtr0] Config.local: 0
>>>>
>>>>
>>>> Was muss ich noch tun, damit dieses F.F() ignieriert wird!!
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Am 2013-06-12 07:31, schrieb Michael Wulz:
>>>>> Hallo,
>>>>>
>>>>> habe jetzt mangels Zeit auch nur in etwa im Kopf.
>>>>>
>>>>> zum Einen die Baud-Rate wie schon im Thread beschrieben auf 300 
>>>>> anpassen
>>>>> zum anderen muss im d0-Parser noch eingebaut werden, dass ein 
>>>>> Zeichen wie: F.F()
>>>>>
>>>>> Siehe Auszug aus dem Thread etwas früher:
>>>>> root at raspberrypi:/etc# ./lesekopfansprechen
>>>>> 6 Bytes written
>>>>> /SAT63511C1948915
>>>>> F.F()
>>>>> ..(317119)
>>>>> ..1(G23-511-C.1/948-915)
>>>>> C.7.()
>>>>> 1.128.(.*kWh)
>>>>> .1.(23)
>>>>> .1.2*23(13-6-1
>>>>> .1.2*22(13-5-1
>>>>> .1.2*21(13-4-1
>>>>> .1.2*2(13-3-1 .....
>>>>>
>>>>>
>>>>> akzeptiert werden.
>>>>> Jetzt kackt der Logger bei dem F.F() ab.
>>>>>
>>>>> gruss
>>>>> Michael
>>>>>
>>>>> Am 11.06.13 23:38, schrieb Justin Otherguy:
>>>>>> Hi Michael,
>>>>>>
>>>>>> Am 11.06.2013 um 20:42 schrieb Michael Wulz:
>>>>>>
>>>>>>> Nein leider, in der C++ fehlt für d0 noch viel!
>>>>>>>
>>>>>>> Mein Vzlogger bricht beim Parsen immer ab.
>>>>>>>
>>>>>>> In der C Version gabs da mal einen Patch. Dieser ist aber nicht 
>>>>>>> in der C++ drin.
>>>>>> damit wir den Missstand abstellen können:
>>>>>> kannst du den Fehler genauer beschreiben?
>>>>>>
>>>>>> Ich habe selbst keinen "d0"-Zähler im Zugriff und kann daher 
>>>>>> nicht testen.
>>>>>>
>>>>>>
>>>>>> Gruss, J.
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://volkszaehler.org/pipermail/volkszaehler-users/attachments/20130625/5741d953/attachment.html>


More information about the volkszaehler-users mailing list