[vz-dev] Zeitstampfer - was: Re: Fwd: watchcat.c und Hardwareansteuerung

Peer Janssen peer at baden-online.de
Thu Apr 29 12:08:24 CEST 2010


Justin Otherguy schrieb:
>> Für die fehlende Millisekundenauflösung hatte ich zwei Möglichkeiten 
>> ausprobiert:
>> - ein zweites Feld für die Millisekunden
> oh nein, bitte nicht.

finde ich auch bäh

>> - pro Event die Anzahl der Pulse speichern:
>> 	bei Impulsabständen kleiner 1s ist der Wert 1
>> 	kommen 3 Impulse innerhalb einer Sekunde eben 3
>> 	deshalb auch die Sprünge (Vielfache von 3600W)
> das ist spannend; die Idee, nicht pro Impuls einen Request abzusetzen, kam uns schon an verschiedenen Stellen.
> Das Problem ist, dass man so unschöne Ergebnisse erhält, wenn die Impulsabstände in der Nähe von 1 Sekunde (bzw. dem Übertragungsabstand) ist: dann gibt's diese komischen Sprünge. Der Stromzähler selbst bietet nun mal keine Möglichkeit, in festen Zeitintervallen den Verbrauch abzulesen. Das ist m.E. der Kern.

ACK

> Aber lass uns da ruhig noch drüber meditieren - vielleicht kommen wir ja noch auf eine brilliantere Lösung :-)
> 
>> Wobei vom Controller ja sowieso nur Sekunden-Timestamps kommen, von daher ist 
>> die Millisekundenauflösung ja nur künstlich am Server erzeugt.
>>
>> Schön wäre es natürlich, am Controller höher aufzulösen und evtl. auch pro 
>> Upload mehrere Timestamps zu übermitteln.

Soweit ich weiß, verkraftet die Parameterübergabe bei GET/POST auch 
mehrfaches Vorkommen von keys der key=value Paare.
Wenn der Controller also einen Puffer hat, könnte er die 
zwischenzeitlich während eines Requests aufgelaufenen Impulse im 
nächsten Request in einem Rutsch senden.
Und dann muss das PHP-Script das auch auswerten können.

Cave: Pufferüberlauf beim Zusammenstellen oder Senden des Requests, oder 
beim Zwischenspeichern der Daten.

> genau das hatten wir auch schon angedacht; der Controller bietet erst mal keine Auflösung feiner als 1 Sekunde - aber das ist lösbar.
> 
> Es gäbe noch ne andere Möglichkeit (das ist eine Idee von H. Häberle): man könnte die Zeitstempel als Unix-Timestamps aber in ms-Auflösung speichern. Für flot werden die Zeitstempel eh vor der Anzeige in genau dieses Format gewandelt. Da bliebe dann die Frage, an welcher Stelle man das überhaupt umwandeln müsste. Ich finde es sehr praktisch, die Uhrzeit für das darzustellende Intervall in "yyyy-mm-dd, hh:mm" anzugeben; aber dann müsste man das halt umrechnen - das tut nicht weh.

So mache ich das schon lange mit meinem GMZ. Der AVR hat einen 
freilaufenden ms-Zähler, und die mit den Impulssummen gesendete 
Timestamp ist dann einfach drei Ziffern länger.

Dies könnte allerdings zu Wertesprüngen beim Uhrupdate durch NTP führen.

Auf meinem Desktop beispielsweise sieht das so aus:

29 Apr 07:17:02 ntpdate[1493]: adjust time server 88.84.153.170 offset 
-0.243647 sec
29 Apr 08:17:03 ntpdate[2025]: adjust time server 83.170.1.225 offset 
-0.241005 sec
29 Apr 09:17:03 ntpdate[2383]: adjust time server 188.40.77.71 offset 
-0.242519 sec
29 Apr 10:17:02 ntpdate[2721]: adjust time server 78.47.136.228 offset 
-0.245004 sec
29 Apr 11:17:02 ntpdate[3670]: adjust time server 78.46.194.186 offset 
-0.233799 sec

Das sind immerhin jede Stunde 1/4 bis 1/5 Sekunde, die die Kiste falsch 
läuft. Warum sollte das auf einem unkalibrierten AVR mit eventueller 
Temperaturdrift (die dann je nach Installationsort einen Tagesgang oder 
einen Jahresgang haben könnte) anders sein? Das gäbe dann jede Stunde 
einen kleinen Hüpfer in der Watt-Kurve.

Wegen solcher Gründe lasse ich den Zähler des GMZ ohne NTP einfach frei 
laufen und speichere zusätzlich zur Controller-Timestamp auch eine 
Server-Timestamp des Requests. So kann man dann überhaupt mal 
herausfinden (und dann auch herausrechnen), wie die Controller-Uhr 
gelaufen ist.

Alternativ könnte man natürlich auch einen Request mit der 
NTP-Zeitkorrektur absetzen (letztlich wohl durch Abfrage eines ms-Timers 
im Controller), in der Datenbank speichern und im passenden Intervall 
berücksichtigen.

Peer


More information about the volkszaehler-dev mailing list