[vz-users] S0-Werte aggregieren nur mit "aggfixedinterval": true
Matthias Behr
mbehr at mcbehr.de
Thu Jan 7 22:28:25 CET 2016
Hier noch kurze Erklärung, warum „aggfixedinterval“ aus meiner Sicht vermieden werden sollte:
Grundsätzlich funktioniert aggmode wie folgt:
bei Aufruf von „read“:
t0 = aktuelle Zeit
Do {
read Meters
} Loop until akz. Zeit größer t0 + aggtime.
dann aggregate Berechnungen
Das Problem ist, dass das „read Meters“ bei wenigen Impulsen (und ohne „send_zero“)) solange dauert, bis das nächste Event kommt. D.h. auch mal deutlich größer als paar Sekunden/30s,...
Nach der Schleife werden die Zeitstempel bei „aggfixedinterval“ aber gerundet:
tv.tv_sec = aggtime * (long int)((it->time_ms()/1000) / aggtime);
D.h. die Zeit vom letzten Event (was ja bereits außerhalb des Intervals lag) wird genommen und dann auf „aggtime“ Sekunden gerundet. -> <30s -> 0s, 30s-59s -> 30s, …
Das führt zu Verfälschungen der Avg Werte, da hier immer von einem fixen Zeitintervall ausgegangen wird.
(Bei „Sum“ sollte es eigentlich/theoretisch keinen großen Unterschied machen. Letztlich stimmt die Summe über den größeren Zeitraum ja. Aber die Frontend Darstellung könnte damit Probleme haben.)
Ohne aggfixedInterval wird einfach als Zeitstempel der Zeitstempel vom letzten Datensatz genommen, das kommt den Daten am nächsten.
Mit „send_zero“ liefert der "read MeterS0" genau nach 1s einen Wert (im Falle keines Events eben 0). D.h die obige Schleife läuft immer recht regelmäßig und vor allem unabhängig von den Daten 30-31s.
> Am 07.01.2016 um 20:36 schrieb Matthias Behr <mbehr at mcbehr.de>:
>
> Hallo,
>
> kannst du mal folgende Kombination testen:
> aggfixedinterval = false // das sollte man eher nicht verwenden, beschreibe später noch mal, warum nicht.
> dafür:
> send_zero:true // mit aggmode willst du ja alle z.B. 30s einen Datenpunkt, auch wenn der Null ist, oder?
>
> Damit sollten die Effekte, die du beobachtest weg sein.
>
>
>> Am 06.01.2016 um 20:29 schrieb Jens <panterglas at web.de <mailto:panterglas at web.de>>:
>>
>> Hallo Zusammen,
>>
>> ich logge einige S0 Zähler und seit zwei Wochen mit dem vzlogger. Ich möchte, dass nur alle 30 Sekunden ein Eintrag in die Datenbank geschrieben wird. Dafür nutze ich den Parameter „aggtime" auf 30. Das klappt auch, allerdings muss man den Parameter "aggfixedinterval" auf true setzen. Andernfalls werden die Daten gemäß dem Original-Impuls in die Datenbank geschrieben und aggtime wird ignoriert. Leider werden bei aktiviertem „aggfixedinterval“ die Werte nicht interpoliert, was zu kleinen Sägezahnmustern im Frontend führen kann - gerade bei kleinen Lasten.
>>
>> Hier ein Screenshot mit und ohne aggfixedinterval
>> <Schnappschuss (2016-01-06 20.16.04).png>
>>
>>
>> Meine Knotig, nur bis zum ersten S0-Zähler, die anderen sind gleich bis auf die UUID
>> {
>> "retry": 0,
>> "daemon": true,
>> "verbosity": 0,
>> "log": "/var/log/vzlogger.log",
>> "local": {
>> "enabled": false,
>> "port": 8080,
>> "index": true,
>> "timeout": 0,
>> "buffer": 0
>> },
>> "push": [
>> {
>> "url": "http://127.0.0.1:5582 <http://127.0.0.1:5582/>"
>> }
>> ],
>> "meters": [
>> // Sensor 1
>> {
>> "enabled": true,
>> "allowskip": false,
>> "interval": -1,
>> "aggtime": 30,
>> "aggfixedinterval": true,
>> "channels": [
>> {
>> "uuid": „das-ist-meine-Kanal-UUID",
>> "identifier": "Impulse",
>> "api": "volkszaehler",
>> "middleware": "http://127.0.0.1/middleware.php <http://127.0.0.1/middleware.php>",
>> "aggmode": "SUM",
>> "duplicates": 0
>> }
>> ],
>> "protocol": "s0",
>> "gpio": 4,
>> "resolution": 1000,
>> "configureGPIO": true,
>> "debounce_delay": 0
>> },
>> // Sensor 2
>> … weitere Sensoren
>>
>
> Gruß
>
> Matthias
>
Gruß
Matthias
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20160107/c55f7801/attachment.html>
More information about the volkszaehler-users
mailing list