userReadings patch für monoton wachsenden offset

Begonnen von justme1968, 25 Juni 2013, 22:54:23

Vorheriges Thema - Nächstes Thema

justme1968

der angehängte kleine patch implementiert einen neuen modifier für die userReadings: incremental

damit lässt sich automatisch ein monoton wachsender offset realisieren der einen reset eines counters z.b. bei ausfall der stromversorgung eines zählers ohne batterie puffer ausgleichen kann.

hierzu wird ein userReading von typ incremental angelegt das beim reset des counters automatisch um den vorherigen wert erhöht wird. dieser offset kann dann in den anderen userReadings auf den aktuellen counter wert hinzu addiert:attr <device1> userReadings\
   offset.B incremental {ReadingsVal($name,"counters.B", 0)},\
   niederschlag_cum {ReadingsVal($name,"offset.B",0)+ReadingsVal($name,"counters.B",0)/5.0}

attr <device2> userReadings\
  offset.A incremental {{ReadingsVal($name,"offset.B",0)+ReadingsVal($name,"counters.A", 0)},\
  consumption {{ReadingsVal($name,"offset.A",0)+ReadingsVal($name,"counters.A",0))/1000.0},\
  power differential {(ReadingsVal($name,"offset.A",0)+ReadingsVal($name,"counters.A",0))*3600}

es können natürlich immer noch werte verloren gehen wenn der zähler zurückgesetzt wird bevor fhem den neuen wert ausgelesen hat oder wenn fhem selber abstürzt bevor der offset im save file landet. da die userReadings in einer undefinierten reihenfolge ausgeführt werden kann es im falle eines resets unter bestimmten umständen passieren das ein kleiner fehler mitgeschleift wird. der ist aber deutlich geringer als ein kompett zurückgesetzter counter.

falls du in betracht ziehst den patch zu übernehmen passe ich noch die doku an.

mit dem namen incremental bin ich nicht wirklich glücklich. eventuell ist offset besser.

gruss
  andre

edit: man könnte das auch so umsetzen das nicht der offset im user reading landet sondern direkt der monoton wachsende counter. dann würde man sich in den abgeleiteten readings das addieren des offsets sparen.  welche verson würdet ihr bevorzugen? weiterhin könnte man das reading über den trigger direkt mit der quelle verknüpfen und {} ohne Inhalt lassen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

eine neuere version des patches. incremental in offset umbenannt und monotonic hinzugefügt. letzteres bildet direkt den korrigierten zähler ab.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ich wuerde dein Patch mit Doku einchecken.

Das Problem was ich sehe ist, dass die meisten Anwendungen kumulierte Werte nur in einem Intervall (Tag/Monat/Jahr) benoetigen, und das ist damit noch nicht abgedeckt.

Bei der Darstellung mit SVG kann man die delta-h / delta-d Funktionen verwenden um sowas zu realisieren, insg. ist das fuer einen Anfaenger aber relativ kryptisch.

justme1968

mein anwendungs fall ist den zählerstand auch bei einem reset zu retten und weiterlaufen zu lassen.

da der zähler bzw der offset direkt im reading steht kann man ihn aber ohne probleme einfach löschen und dadurch monatlich oder jährlich auf 0 setzen. mit ein wenig erweiterung denke ich bekommt man das auch automatisiert zum tages/monats/jahres wechsel hin. der patch wird dadurch natürlich etwas grösser.

wenn man die verknüpfung zwischen original und user reading in diesen fällen über den trigger macht ist es vielleicht insgesammt einfacher. etwa in der art:attr <device> userReadings monthly monatlich:counters.A {} monotonic:counters.A {}

das erste würde einen von counters.A abgeleiteten zähler darstellen der monatlich auf 0 gesetzt wird, das zweite einen der monoton wachsend weiterläuft auch bei reset.

was denkst du?

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ich wuerde erstmal mit deinem urspruenglichen Version (dokumentiert) anfangen, und dann auf Reaktionen der Benutzer warten.
Oder auch: lieber erstmal einfach, vielleicht will es doch keiner kompliziert haben :)

justme1968

hier wäre ein vorschlag für die doku zum patch von oben. den aus dem zweiten post.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Habs eingecheckt.

Kannst Du bitte kontrollieren, ob ich es richtig gemacht habe: da patch die Arbeit mit
patch: **** malformed patch at line 19: +        $result += $oldvalue if( $value < $oldvalue );

quittiert hatte (keine Ahnung wieso), musste ich es manuell machen.

In den docs habe ich ü & co durch &uuml; &co ersetzt wg. UTF-8.

justme1968

ja. schaut richtig aus. danke.

an die umlaute hatte ich natürlich nicht gedacht. sorry.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

ich hab noch mal etwas geändert damit das verhalten besser ist wenn offset oder monotonic nachträglich angelegt wird und das original reading schon > 0 ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig


justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968