Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-14 Diskussionsfäden Sebastian Michel

Hallo zusammen,

also es funktioniert nun sowohl mit dem ISKRAemeco MT174 als auch dem 
Siemens TD3511. Anbei findet ihr den Patch. Ich hab versucht sowenig 
Änderungen zu machen wie es geht. Hier nochmal die Zusammenfassungen:


1) Das Device wird im blocking mode geöffnet. Das führte bei mir dazu, 
dass die read() Funktion mit 0 zurückkehrt. Das heißt normalerweise ein 
eof oder derartiges. Sowas sollte bei einem seriellen Device niemals 
passieren. Ich weiß auch nicht warum das der Fall ist.


- Ich hab den Code dahingehend geändert, dass das Device im 
non-blocking mode geöffnet wird. Damit funktioniert's nun.


2) Die Statemachine sollte niemals unendlich warten und irgendwo hängen 
bleiben.


- Ich hab ein Timeout von 10s eingebaut. Also wenn innerhalb 10s keine 
Daten empfangen werden bzw. beim Start kein Sync-byte kommt, wird dieser 
Lesevorgang abgebrochen.


3) Die Statemaching wird immer beim Empfang eines '/' zurückgesetzt. Da 
mein Zähler ein '/' im Identification String sendet, hängt sich die 
Statemachine auf.


- Das habe ich rausgenommen.

4) Mein Zähler sendet ca. 330 obis-codes. Da ist dann sowas dabei wie 
2.8.1*16, 2.8.1*15 usw. Ich interessiere mich eigentlich nur für die 
Einträge von 2.8.0. Das ist insofern ein Problem, dass der D0-Meter nur 
maximal 32 Einträge zulässt. Das heißt bis die interessanten codes 
ankommen, sind die 32 Einträge schon längst belegt.


- Ich filtere jetzt nur noch obis-codes heraus die ein value und eine 
Einheit besitzen. Damit kommen bei meinem Zähler genau 32 zusammen.


5) Der Zähler sendet ungültige Obis-Codes. Zumindest ist der string für 
die Klasse Obis.cpp nicht auswertbar. Das führt dazu, dass vzlogger 
abstürzt. Vermutlich sind es die obis-codes die unter anderem Buchstaben 
statt Zahlen haben.


- Ich hab die Stellen mit einem try-except Block abgefangen und 
überspringe die betroffenen obis-codes.


6) Fehler beim Setzen der Parity

- Das hab ich korrigiert.



Weiterhin habe ich mal die Ausgaben der beiden Zähler angehangen, mit 
denen das getestet wurde.


Gruß
Sebastian

ISKRAemeco_MT174.txt
Description: Binary data


Siemens_TD-3511.txt
Description: Binary data
diff --git a/src/Obis.cpp b/src/Obis.cpp
index f918797..eebf5f8 100644
--- a/src/Obis.cpp
+++ b/src/Obis.cpp
@@ -192,7 +192,7 @@ int Obis::parse(const char *str) {
 }
 
 int Obis::lookup_alias(const char *alias) {
-	for (const obis_alias_t *it = aliases; it != NULL; it++) {
+	for (const obis_alias_t *it = aliases; !it-id.isNull(); it++) {
 		if (strcmp(it-name, alias) == 0) {
 			*this = it-id;
 			return SUCCESS;
diff --git a/src/protocols/MeterD0.cpp b/src/protocols/MeterD0.cpp
index f48f864..cc74146 100644
--- a/src/protocols/MeterD0.cpp
+++ b/src/protocols/MeterD0.cpp
@@ -204,6 +204,13 @@ ssize_t MeterD0::read(std::vectorReadingrds, size_t max_readings) {
 	char byte;			/* we parse our input byte wise */
 	int byte_iterator; 
 	size_t number_of_tuples;
+int bytes_read;
+
+time_t start_time;
+time_t end_time;
+
+// get current time
+time(start_time);
 
 	if(_pull.size()) {
 		int wlen=write(_fd,_pull.c_str(),_pull.size());
@@ -215,12 +222,41 @@ ssize_t MeterD0::read(std::vectorReadingrds, size_t max_readings) {
 
 	context = START;/* start with context START */
 
-	while (::read(_fd, byte, 1)) {
-		if (byte == '/') context = START; 	/* reset to START if / reoccurs */
-		else if (byte == '!') context = END;	/* ! is the identifier for the END */
+	while (1) {
+
+// check if timed out
+time(end_time);
+if (difftime(end_time, start_time)  10)
+{
+ print(log_error, nothing received for more than 10 seconds, name().c_str());
+ break;
+}
+
+// now read a single byte
+bytes_read = ::read(_fd, byte, 1);
+if (bytes_read == 0 || bytes_read == -1  errno == EAGAIN)
+{
+// wait and read again
+usleep(5000);	// 5 ms
+continue;
+}
+else if (bytes_read == -1)
+{
+// an error occured reading a byte
+print(log_error, error reading a byte (%d), name().c_str(), errno);
+break;
+}
+
+// reset timeout
+if (context != START)
+{
+time(start_time);
+}
+
+		if (byte == '!') context = END;	/* ! is the identifier for the END */
 		switch (context) {
 case START:			/* strip the initial / */
-if  (byte != '\r'   byte != '\n') { /*allow extra new line at the start */
+if  (byte == '/') {
   byte_iterator = number_of_tuples = 0;/* start */
   context = VENDOR;/* set new context: START - VENDOR */
 }
@@ 

Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-14 Diskussionsfäden thomas . schenkel
Hallo Sebastian,

Super Arbeit von Dir. 
Wie schon geschrieben, herzlichen Dank gerade auch persönlich von mir.
Wenn Ihr die Zählerlogs veröffentlichen wollt, dann nehmt aber bitte die 
Zählernummern raus (1-0:0.0.0*255).
Muss ja nicht sein ;-)

Ansonsten, wie ist eigentlich der Weg? Wie findet das in den Hauptsource?

VG
Thomas





 -Ursprüngliche Nachricht-
 Von: Sebastian Michel 
 Gesendet: Sa. 14.12.2013 18:40
 An: volkszaehler.org , 
 Betreff: Re: [vz-dev] Siemens TD3511 mit Protokoll D0

 Hallo zusammen,

 also es funktioniert nun sowohl mit dem ISKRAemeco MT174 als auch dem

 Siemens TD3511. Anbei findet ihr den Patch. Ich hab versucht sowenig 
 Änderungen zu machen wie es geht. Hier nochmal die
 Zusammenfassungen:

 1) Das Device wird im blocking mode geöffnet. Das führte
 bei mir dazu, 
 dass die read() Funktion mit 0 zurückkehrt. Das heißt
 normalerweise ein 
 eof oder derartiges. Sowas sollte bei einem seriellen Device niemals 
 passieren. Ich weiß auch nicht warum das der Fall ist.

 - Ich hab den Code dahingehend geändert, dass das Device im 
 non-blocking mode geöffnet wird. Damit funktioniert's nun.

 2) Die Statemachine sollte niemals unendlich warten und irgendwo
 hängen 
 bleiben.

 - Ich hab ein Timeout von 10s eingebaut. Also wenn innerhalb 10s
 keine 
 Daten empfangen werden bzw. beim Start kein Sync-byte kommt, wird
 dieser 
 Lesevorgang abgebrochen.

 3) Die Statemaching wird immer beim Empfang eines '/'
 zurückgesetzt. Da 
 mein Zähler ein '/' im Identification String sendet, hängt
 sich die 
 Statemachine auf.

 - Das habe ich rausgenommen.

 4) Mein Zähler sendet ca. 330 obis-codes. Da ist dann sowas
 dabei wie 
 2.8.1*16, 2.8.1*15 usw. Ich interessiere mich eigentlich nur für
 die 
 Einträge von 2.8.0. Das ist insofern ein Problem, dass der
 D0-Meter nur 
 maximal 32 Einträge zulässt. Das heißt bis die
 interessanten codes 
 ankommen, sind die 32 Einträge schon längst belegt.

 - Ich filtere jetzt nur noch obis-codes heraus die ein value und
 eine 
 Einheit besitzen. Damit kommen bei meinem Zähler genau 32
 zusammen.

 5) Der Zähler sendet ungültige Obis-Codes. Zumindest ist
 der string für 
 die Klasse Obis.cpp nicht auswertbar. Das führt dazu, dass
 vzlogger 
 abstürzt. Vermutlich sind es die obis-codes die unter anderem
 Buchstaben 
 statt Zahlen haben.

 - Ich hab die Stellen mit einem try-except Block abgefangen und 
 überspringe die betroffenen obis-codes.

 6) Fehler beim Setzen der Parity

 - Das hab ich korrigiert.



 Weiterhin habe ich mal die Ausgaben der beiden Zähler
 angehangen, mit 
 denen das getestet wurde.

 Gruß
 Sebastian

 -Ursprüngliche Nachricht Ende-




---
Alle Postfächer an einem Ort. Jetzt wechseln und E-Mail-Adresse mitnehmen! 
http://email.freenet.de/basic/Informationen


Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-14 Diskussionsfäden Patrik Karisch
Am 14.12.2013 19:16 schrieb thomas.schen...@freenet.de:
 Ansonsten, wie ist eigentlich der Weg? Wie findet das in den Hauptsource?

GitHub Pull Request sollte das erledigen.


Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-13 Diskussionsfäden Sebastian Michel

Hallo Thomas,

das Testprogramm kannst du dir selber kompilieren.

Quellen sind hier:
http://semiworks.de/~semi/test.c

Gruß
Sebastian

Am 2013-12-13 10:39, schrieb Thomas Schenkel:

Hallo Sebastian,

ich mache alles was Du willst ;)
Gibts Deinen Sourcecode schon irgendwo zum download oder nur über die 
diffs?

Welche Quelle lag diesem denn zu Grunde? Vielleicht kann ich da auch
noch ein wenig rumbasteln. Würde gerne ein bisschem mehr
debugmeldungen haben wollen (sendet der MT174 überhaput was während
vzlogger läuft etc.), aber meine cpp-Kenntnisse sind nur rudimentär
(Wirtschaftsinformatikstudium 1996) und danach nur im Marketing
gearbeitet ;-)

Aber die Idee mit dem Testprogramm ist super. Vielleicht finden wir es
so. Ist schon leicht deprimierend...

VG
Thomas





Am 13.12.2013 10:31, schrieb Sebastian Michel:

Hallo Thomas,

sieht wohl so aus als ob es nicht geht :-)

Dann helfen nur noch tracing Ausgaben. Oder ich schick dir heute abend 
mal mein kleines Testprogramm. Das macht genau wie der vzlogger die 
Schnittstelle auf und stellt sie ein, schickt die pull-sequenz und 
gibt dann einfach alle empfangenen Daten aus.


Gruß
Sebastian

Am 2013-12-13 10:22, schrieb Thomas Schenkel:

Hallo Sebastian,

ich habe mal laufen lassen ...


pi@raspberrypi /usr/local/bin $ sudo vzlogger.seb -c 
/etc/vzlogger.conf

[Dec 13 09:29:49][mtr0] Creating new meter with protocol d0.
[Dec 13 09:29:49][d0]   pullseq len:5 found
[Dec 13 09:29:49][mtr0] Meter configured. enabled
[Dec 13 09:29:49]   New meter initialized (protocol=d0)
[Dec 13 09:29:49]   Configure channel.
[Dec 13 09:29:49][chn0] New channel initialized (uuid=...beebd6
protocol=volkszaehler id=1-0:1.8.0)
[Dec 13 09:29:49]   Have 1 meters.
[Dec 13 09:29:49][main] foreground=1, daemon=1, local=1
[Dec 13 09:29:49]   NOT Daemonize process...
[Dec 13 09:29:49]   Opened logfile /var/log/vzlogger.log
[Dec 13 09:29:49][] === Start meters.
[Dec 13 09:29:49][mtr0] Meter connection established
[Dec 13 09:29:49][mtr0] Meter thread started
[Dec 13 09:29:49][mtr0] meter is opened. Start channels.
[Dec 13 09:29:49][chn0] Logging thread started
[Dec 13 09:29:49][http] Starting local interface HTTPd on port 80
[Dec 13 09:29:49][] Startup done.
[Dec 13 09:29:49][mtr0] Number of readers: 32
[Dec 13 09:29:49][mtr0] Config.daemon: 1
[Dec 13 09:29:49][mtr0] Config.local: 1
[Dec 13 09:29:49][chn0] Start logging thread for volkszaehler-api.
Running as daemon: yes
[Dec 13 09:29:49][chn0] Using default api:
[Dec 13 09:29:49][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:00][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:00][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:00][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:00][chn0] == number of tuples: 0
[Dec 13 09:30:00][chn0] JSON request body is null. Nothing to send 
now.

[Dec 13 09:30:00][chn0] Buffer dump (size=0 keep=0): {}
[Dec 13 09:30:00][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:11][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:11][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:11][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:11][chn0] == number of tuples: 0
[Dec 13 09:30:11][chn0] JSON request body is null. Nothing to send 
now.

[Dec 13 09:30:11][chn0] Buffer dump (size=0 keep=0): {}
[Dec 13 09:30:11][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:22][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:22][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:22][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:22][chn0] == number of tuples: 0
[Dec 13 09:30:22][chn0] JSON request body is null. Nothing to send 
now.

[Dec 13 09:30:22][chn0] Buffer dump (size=0 keep=0): {}
[Dec 13 09:30:22][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:33][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:33][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:33][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:33][chn0] == number of tuples: 0
[Dec 13 09:30:33][chn0] JSON request body is null. Nothing to send 
now.

[Dec 13 09:30:33][chn0] Buffer dump (size=0 keep=0): {}
[Dec 13 09:30:33][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:44][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:44][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:44][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:44][chn0] == number of tuples: 0
[Dec 13 09:30:44][chn0] JSON request body is null. Nothing to send 
now.

[Dec 13 09:30:44][chn0] Buffer dump (size=0 keep=0): {}
[Dec 13 09:30:44][d0]   sending pullsequenz send (len:5 is:5).
[Dec 13 09:30:55][d0]   nothing received for more than 10 seconds
[Dec 13 09:30:55][d0]   Something unexpected happened: read:378!
[Dec 13 09:30:55][mtr0] Got 0 new readings from meter:
[Dec 13 09:30:55][chn0] == number of tuples: 0
[Dec 13 09:30:55][chn0] JSON request body is null. Nothing to send 

Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-13 Diskussionsfäden Rainer Gauweiler

Hallo,

Am 13.12.2013 13:26, schrieb Thomas Schenkel:

nachdem ich die 3 Zeilen raus nahm dann das:
./test3
Ergebinis:
file descriptor 3 opened (baudrate=7)
sending pullsequenz send (len:5 is:5)

und dann stand es wieder 

dann habe ich in der 2. Console folgendes aufgerufen:
stty -F /dev/ttyUSB0
10:4:da7:a30:3:1c:7f:15:4:0: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


und plötzlich lies es in der 1. Console:


Ich denke es hängt am Handshake (RTC/CTS). Irgendwie initialisiert der 
vzloger die Schnittstelle nicht richtig und schaltet das Handshake ein. 
Der Lesekopf stellt fest dass er die empfangenen Daten nicht senden darf 
und wartet ab.

stty hebt das dann wieder auf und schon flutschen die Daten.

Ich weiss leider nicht wie man in C das Handshake setzt. Es gab hier 
kürzlich einen Patch auf der Liste, der scheint aber nicht zu tun...


Gruss
 Rainer



Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-13 Diskussionsfäden Thomas Schenkel

Hallo Rainer,

da bringst du mich auf eine Idee. Vielleicht sollte man die 
Funktionalität in meinem Fall mal auskommentieren, damit er die 
Schnittstelle nicht verstellt und die gegebenen Werte (geladen vom 
rc.local) verwendet. Was denkt ihr, machbar oder geht nicht, weil ... ?


Grüße
Thomas


Am 13.12.2013 17:55, schrieb Rainer Gauweiler:


Ich denke es hängt am Handshake (RTC/CTS). Irgendwie initialisiert der 
vzloger die Schnittstelle nicht richtig und schaltet das Handshake 
ein. Der Lesekopf stellt fest dass er die empfangenen Daten nicht 
senden darf und wartet ab.

stty hebt das dann wieder auf und schon flutschen die Daten.

Ich weiss leider nicht wie man in C das Handshake setzt. Es gab hier 
kürzlich einen Patch auf der Liste, der scheint aber nicht zu tun...


Gruss
 Rainer






---
Diese E-Mail ist frei von Viren und Malware, denn der avast! Antivirus Schutz 
ist aktiv.
http://www.avast.com



Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-13 Diskussionsfäden Sebastian Michel

Hallo in die Runde,

also ich denke es gibt noch einen Fehler in vzlogger beim Konfigurieren 
der Schnittstelle. Beim Setzen der even Parity gibt es eine Zeile die 
sieht so aus:


tio.c_cflag |= ~ PARENB;

Es muss aber so ausschauen:

tio.c_cflag |= PARENB;

@Rainer: Mit der Änderung funktioniert nun das Testprogramm. Das kannst 
du ja mal testen. Außerdem hab ich in deine vzlogger.conf noch Einträge 
für Baudrate und Format ergänzt.


Ich muss nun mal alles zusammen schreiben. Es sollte am Ende sowohl bei 
mir als auch bei Rainer funktionieren. Es gibt da leider Unterschiede 
bei dem Ausgabeformat der beiden Zähler. Da schaue ich nochmal nach.


Aber für heute ist erstmal Schluss.

Sebastian


Am 2013-12-13 20:56, schrieb Thomas Schenkel:

Hallo Rainer,

da bringst du mich auf eine Idee. Vielleicht sollte man die
Funktionalität in meinem Fall mal auskommentieren, damit er die
Schnittstelle nicht verstellt und die gegebenen Werte (geladen vom
rc.local) verwendet. Was denkt ihr, machbar oder geht nicht, weil ...
?

Grüße
Thomas


Am 13.12.2013 17:55, schrieb Rainer Gauweiler:


Ich denke es hängt am Handshake (RTC/CTS). Irgendwie initialisiert der 
vzloger die Schnittstelle nicht richtig und schaltet das Handshake 
ein. Der Lesekopf stellt fest dass er die empfangenen Daten nicht 
senden darf und wartet ab.

stty hebt das dann wieder auf und schon flutschen die Daten.

Ich weiss leider nicht wie man in C das Handshake setzt. Es gab hier 
kürzlich einen Patch auf der Liste, der scheint aber nicht zu tun...


Gruss
 Rainer






---
Diese E-Mail ist frei von Viren und Malware, denn der avast! Antivirus
Schutz ist aktiv.
http://www.avast.com


Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-12 Diskussionsfäden Sebastian Michel

Hallo,

ich bin es nochmal. Ich hab ein sleep in der Schleife vergessen. Der 
vzlogger funktioniert im Prinzip, aber ohne das sleep hat er 100% 
CPU-Auslastung.


Anbei mal eine berichtigte Version.

Gruß
Sebastian


Am 2013-12-12 07:41, schrieb Michael Wulz:

Guten Morgen,

besten Dank für das Diff.
Werde es gleich bei mir probieren - hatte auch immer die gleichen
Probleme. Damit wird mein Logger auch stabiler rennen ;-)

merci


Am 12.12.13 07:35, schrieb Sebastian Michel:

Hallo Zusammen,

ich habe bei mir einen opt. USB-Lesekopf von Udo in Verbindung mit 
einem Siemens TD-3511 am Laufen. Das ganze hängt an einem raspberry pi 
mit image von volkszähler.


Leider lief es nicht so problemlos wie erhofft. Der vzlogger hat zwar 
die pullseq geschickt, aber dann keine Daten empfangen. Ich hab mir 
dann die Quellen vom vzlogger angeschaut und folgende Änderungen in 
MeterD0.cpp gemacht, dass es läuft:


1) Das Device wird im blocking mode geöffnet. Das führte bei mir dazu, 
dass die read() Funktion mit 0 zurückkehrt. Das heißt normalerweise 
ein eof oder derartiges. Sowas sollte bei einem seriellen Device 
niemals passieren. Ich weiß auch nicht warum das der Fall ist.


- Ich hab den Code dahingehend geändert, dass das Device im 
non-blocking mode geöffnet wird. Damit funktioniert's nun.


2) Die Statemachine sollte niemals unendlich warten und irgendwo 
hängen bleiben.


- Ich hab ein Timeout von 10s eingebaut. Also wenn innerhalb 10s 
keine Daten empfangen werden bzw. beim Start kein Sync-byte kommt, 
wird dieser Lesevorgang abgebrochen.


3) Die Statemaching wird immer beim Empfang eines '/' zurückgesetzt. 
Da mein Zähler ein '/' im Identification String sendet, hängt sich die 
Statemachine auf.


- Das habe ich rausgenommen.

4) Mein Zähler sendet ca. 330 obis-codes. Da ist dann sowas dabei wie 
2.8.1*16, 2.8.1*15 usw. Ich interessiere mich eigentlich nur für die 
Einträge von 2.8.0. Das ist insofern ein Problem, dass der D0-Meter 
nur maximal 32 Einträge zulässt. Das heißt bis die interessanten codes 
ankommen, sind die 32 Einträge schon längst belegt.


- Das ist vielleicht nicht ganz sauber, aber ich nehme nur obis-codes 
an die eine Länge von genau 5 bytes haben. Damit kommen bei meinem 
Zähler genau 32 zusammen.


5) Der Zähler sendet ungültige Obis-Codes. Zumindest ist der string 
für die Klasse Obis.cpp nicht auswertbar. Das führt dazu, dass 
vzlogger abstürzt. Vermutlich sind es die obis-codes die unter anderem 
Buchstaben statt Zahlen haben.


- Ich hab die Stellen mit einem try-except Block abgefangen und 
überspringe die betroffenen obis-codes.


Alles in allem freue ich mich, dass es nun funktioniert. Die 
Änderungen habe ich als Diff mal angehangen.


Viele Grüße
Sebastiandiff --git a/src/Obis.cpp b/src/Obis.cpp
index f918797..eebf5f8 100644
--- a/src/Obis.cpp
+++ b/src/Obis.cpp
@@ -192,7 +192,7 @@ int Obis::parse(const char *str) {
 }
 
 int Obis::lookup_alias(const char *alias) {
-	for (const obis_alias_t *it = aliases; it != NULL; it++) {
+	for (const obis_alias_t *it = aliases; !it-id.isNull(); it++) {
 		if (strcmp(it-name, alias) == 0) {
 			*this = it-id;
 			return SUCCESS;
diff --git a/src/protocols/MeterD0.cpp b/src/protocols/MeterD0.cpp
index f48f864..e3e34b3 100644
--- a/src/protocols/MeterD0.cpp
+++ b/src/protocols/MeterD0.cpp
@@ -204,6 +204,13 @@ ssize_t MeterD0::read(std::vectorReadingrds, size_t max_readings) {
 	char byte;			/* we parse our input byte wise */
 	int byte_iterator; 
 	size_t number_of_tuples;
+int bytes_read;
+
+time_t start_time;
+time_t end_time;
+
+// get current time
+time(start_time);
 
 	if(_pull.size()) {
 		int wlen=write(_fd,_pull.c_str(),_pull.size());
@@ -215,12 +222,41 @@ ssize_t MeterD0::read(std::vectorReadingrds, size_t max_readings) {
 
 	context = START;/* start with context START */
 
-	while (::read(_fd, byte, 1)) {
-		if (byte == '/') context = START; 	/* reset to START if / reoccurs */
-		else if (byte == '!') context = END;	/* ! is the identifier for the END */
+	while (1) {
+
+// check if timed out
+time(end_time);
+if (difftime(end_time, start_time)  10)
+{
+ print(log_error, nothing received for more than 10 seconds, name().c_str());
+ break;
+}
+
+// now read a single byte
+bytes_read = ::read(_fd, byte, 1);
+if (bytes_read == 0 || bytes_read == -1  errno == EAGAIN)
+{
+// wait and read again
+usleep(5000);	// 5 ms
+continue;
+}
+else if (bytes_read == -1)
+{
+// an error occured reading a byte
+print(log_error, error reading a byte (%d), name().c_str(), errno);
+break;
+}
+
+// reset timeout
+if 

Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-12 Diskussionsfäden Udo1

Hallo Sebastian,

super. Vielen Dank dafür.

Am 12.12.2013 07:35, schrieb Sebastian Michel:
1) Das Device wird im blocking mode geöffnet. Das führte bei mir dazu, 
dass die read() Funktion mit 0 zurückkehrt. Das heißt normalerweise 
ein eof oder derartiges. Sowas sollte bei einem seriellen Device 
niemals passieren. Ich weiß auch nicht warum das der Fall ist. 

Kann das auch die Ursache hierfür sein?:
http://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html

Gruß
Udo


Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-12 Diskussionsfäden thomas . schenkel
Hi Sebastian,

schau mal hier, das ist von mir:
http://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html
 
der 1.8.0 heißt beim mt174 so:

1-0:1.8.0*255(132.227*kWh)


oder welche Logs meinst du?

VG
Thomas

 -Ursprüngliche Nachricht-
 Von: Sebastian Michel 
 Gesendet: Do. 12.12.2013 22:30
 An: volkszaehler-dev@lists.volkszaehler.org
 Betreff: Re: [vz-dev] Siemens TD3511 mit Protokoll D0

 Hallo Thomas,

 ich hab eine Vermutung. Schick doch mal bitte die Log-Ausgaben.

 So wie ich das sehe, sieht dein obis-code so aus:

 1-0:1.8.1*255

 Das wird aber vermutlich nicht erkannt. Der Lesevorgang sollte aber 
 zumindest ohne Fehler durchlaufen, oder?

 Gruß
 Sebastian


 Am 2013-12-12 22:13, schrieb thomas.schen...@freenet.de:
 Hi Udo und die Anderen,

 Sebastian hat mir  netterweise eine
 bin von seiner vzlogger-Version
 geschickt. Aber die verhält sich
 genauso .. es tut sich nichts .. ich
 weiß gerade nicht mehr, wo ich
 ansetzen sollte ... in der console
 gehts .. aber der vzlogger mag den
 MT174 einfach nicht
 VG
 Thomas


 -Ursprüngliche
 Nachricht-
 Von: Udo1
 Gesendet: Do. 12.12.2013
 18:31
 An:
 volkszaehler-dev@lists.volkszaehler.org
 Betreff: Re: [vz-dev] Siemens
 TD3511 mit Protokoll D0

 Hallo Sebastian,

 super. Vielen Dank
 dafür.

 Am 12.12.2013 07:35, schrieb
 Sebastian Michel:
 1) Das Device wird im blocking
 mode
 geöffnet. Das führte bei
 mir dazu,
 dass die read() Funktion mit
 0
 zurückkehrt. Das heißt
 normalerweise
 ein eof oder derartiges. Sowas
 sollte
 bei einem seriellen Device
 niemals passieren. Ich
 weiß auch
 nicht warum das der Fall
 ist.
 Kann das auch die Ursache
 hierfür sein?:
 href= 
 href=http://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html;
 target=_blankhttp://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html;
 target=_blank 
 href=http://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html;
 target=_blankhttp://www.mail-archive.com/volkszaehler-dev@lists.volkszaehler.org/msg02109.html

 Gruß
 Udo


 -Ursprüngliche Nachricht
 Ende-




 ---
 Alle Postfächer an einem Ort.
 Jetzt wechseln und E-Mail-Adresse
 mitnehmen!  href=http://email.freenet.de/basic/Informationen;
 target=_blankhttp://email.freenet.de/basic/Informationen


 -Ursprüngliche Nachricht Ende-




---
Alle Postfächer an einem Ort. Jetzt wechseln und E-Mail-Adresse mitnehmen! 
http://email.freenet.de/basic/Informationen



Re: [vz-dev] Siemens TD3511 mit Protokoll D0

2013-12-11 Diskussionsfäden Michael Wulz

Guten Morgen,

besten Dank für das Diff.
Werde es gleich bei mir probieren - hatte auch immer die gleichen 
Probleme. Damit wird mein Logger auch stabiler rennen ;-)


merci


Am 12.12.13 07:35, schrieb Sebastian Michel:

Hallo Zusammen,

ich habe bei mir einen opt. USB-Lesekopf von Udo in Verbindung mit 
einem Siemens TD-3511 am Laufen. Das ganze hängt an einem raspberry pi 
mit image von volkszähler.


Leider lief es nicht so problemlos wie erhofft. Der vzlogger hat zwar 
die pullseq geschickt, aber dann keine Daten empfangen. Ich hab mir 
dann die Quellen vom vzlogger angeschaut und folgende Änderungen in 
MeterD0.cpp gemacht, dass es läuft:


1) Das Device wird im blocking mode geöffnet. Das führte bei mir dazu, 
dass die read() Funktion mit 0 zurückkehrt. Das heißt normalerweise 
ein eof oder derartiges. Sowas sollte bei einem seriellen Device 
niemals passieren. Ich weiß auch nicht warum das der Fall ist.


- Ich hab den Code dahingehend geändert, dass das Device im 
non-blocking mode geöffnet wird. Damit funktioniert's nun.


2) Die Statemachine sollte niemals unendlich warten und irgendwo 
hängen bleiben.


- Ich hab ein Timeout von 10s eingebaut. Also wenn innerhalb 10s 
keine Daten empfangen werden bzw. beim Start kein Sync-byte kommt, 
wird dieser Lesevorgang abgebrochen.


3) Die Statemaching wird immer beim Empfang eines '/' zurückgesetzt. 
Da mein Zähler ein '/' im Identification String sendet, hängt sich die 
Statemachine auf.


- Das habe ich rausgenommen.

4) Mein Zähler sendet ca. 330 obis-codes. Da ist dann sowas dabei wie 
2.8.1*16, 2.8.1*15 usw. Ich interessiere mich eigentlich nur für die 
Einträge von 2.8.0. Das ist insofern ein Problem, dass der D0-Meter 
nur maximal 32 Einträge zulässt. Das heißt bis die interessanten codes 
ankommen, sind die 32 Einträge schon längst belegt.


- Das ist vielleicht nicht ganz sauber, aber ich nehme nur obis-codes 
an die eine Länge von genau 5 bytes haben. Damit kommen bei meinem 
Zähler genau 32 zusammen.


5) Der Zähler sendet ungültige Obis-Codes. Zumindest ist der string 
für die Klasse Obis.cpp nicht auswertbar. Das führt dazu, dass 
vzlogger abstürzt. Vermutlich sind es die obis-codes die unter anderem 
Buchstaben statt Zahlen haben.


- Ich hab die Stellen mit einem try-except Block abgefangen und 
überspringe die betroffenen obis-codes.


Alles in allem freue ich mich, dass es nun funktioniert. Die 
Änderungen habe ich als Diff mal angehangen.


Viele Grüße
Sebastian