fhem.pl/Integralfunktion für UserReadings

Begonnen von abc2006, 02 November 2016, 17:08:54

Vorheriges Thema - Nächstes Thema

abc2006

Hallo,
ich verwende diese Integralfunktion:

https://forum.fhem.de/index.php/topic,26300.msg193084.html#msg193084

Leider habe ich (schon länger, komme aber jetzt erst dazu) das *Problem*, dass meine Readings vorher Ganzzahlen sind und nach dem Integral bis zu 14 Nachkommastellen haben.

Wie kann ich das auf (ggf. ganze) Zahlen runden? ( okay, ausser *noch* ein UserReading mit dem inhalt
total_round {int(10*ReadingsVal($name,"total",0)/10)}
anzulegen. Oder wäre das tatsächlich die empfohlene Lösung?

Internals:
   NAME       D_WMZ_SOLAR
   NR         633
   STATE      P: 0 W V: 0 l/min VL: 25 °C RL: 25.25 °C E: 16
   TYPE       dummy
   Helper:
     Dblog:
       Energie_heute:
         Logdb:
           TIME       1478102594.37294
           VALUE      16
       Leistung:
         Logdb:
           TIME       1478102594.1946
           VALUE      0
       Literpromin:
         Logdb:
           TIME       1478102594.28463
           VALUE      0
   Readings:
     2016-11-02 17:03:14   Energie_1       57617732.3457959
     2016-11-02 17:03:14   RL              25.25
     2016-11-02 17:03:13   VL              25
     2016-11-01 23:59:00   energie_gestern_gesamt 3.2
     2016-11-02 17:03:14   energie_heute   16
     2016-11-02 16:16:56   energie_heuteEnergie_heute Hour: 0.0 Day: 15.9 Month: 15.9 Year: 15.9 (since: 2016-11-02_08:27:06 )
     2016-11-02 15:59:55   energie_heuteEnergie_heuteLast Hour: 0.7 Day: - Month: - Year: -
     2016-11-02 17:03:14   energie_jahr_gesamt 20794203.1618196
     2016-11-02 17:03:14   energie_monat_gesamt 20794203.1618196
     2016-11-02 17:03:14   leistung        0
     2016-11-02 17:03:14   literpromin     0
     2016-11-02 17:03:14   literprostunde  0
     2016-11-02 17:03:14   statTotal       Hour: 0.0000000000000 Day: 0.0168011761996 Month: 0.0168011761996 Year: 0.0168011761996 (since: 2016-11-02_16:17:18 )
     2016-11-02 17:03:14   statTotalDay    0.0168011761996
     2016-11-02 17:03:14   statTotalHour   0.0000000000000
     2016-11-02 16:59:55   statTotalHourLast 0.0168011761996
     2016-11-02 16:59:55   statTotalLast   Hour: 0.0168011761996 Day: - Month: - Year: - (since: 2016-11-02_16:17:18 )
     2016-11-02 17:03:14   statTotalMonth  0.0168011761996
     2016-11-02 17:03:14   statTotalYear   0.0168011761996
     2016-11-02 17:03:14   total           16.00492565161
   Helper:
     _98_statistics stat_Gas
Attributes:
   DbLogInclude leistung,literpromin,energie_gestern_gesamt,energie_heute
   room       Solar,_dummy
   userReadings total integral { ReadingsVal($name,"leistung",0)/3600/1000;;},Energie_1 integral { ReadingsVal($name,"leistung",0);;},energie_heute { int(10*ReadingsVal($name,"Energie_1",0)/3600/1000)/10;;},energie_monat_gesamt integral { ReadingsVal($name,"energie_gestern_gesamt",0);;},energie_jahr_gesamt integral { ReadingsVal($name,"energie_gestern_gesamt",0);;}
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

rudolfkoenig

Z.Zt. ist mir nichts Besseres bekannt.

Ich wuerde gerne eine generische Loesung anbieten (brauche ich auch fuer ZWave), weiss aber noch nicht, an welcher Stelle:
- (noch) ein Attribut fuer alle Geraete, readingChange: Liste von substitute Anweisungen, inkl Eval Option.
- das Gleiche als global Attribut.
- ein Modul, der sich ganz vorne in der notify-Kette einklinkt, um diese Funktionalitaet zu bieten.

Tendiere z.Zt. zur letzten Alternative.

abc2006

Hm. Mal als Verständnisfrage:
Mein Fhem ist mittlerweile schon recht groß, könnte fast von Clustering sprechen xD
Habe 2500 Zeilen fhem.cfg, MyUtils wächst noch. Probleme mit der Reaktionszeit hab ich schon manchmal, vielleicht eher durch Module als Readings.

Hilf mir doch mal bitte, einzuschätzen, wieviel zusätzliche (hm. sinnlose?) Last ich durch ein zusätzliches UserReading (mit Events, Berechnung usw ) erzeuge. Ist das im vernachlässigbaren Bereich?
Hab manchmal das Gefühl, dass das langsam Überhand nimmt ... (wie gesagt, ich kanns nicht einschätzen).
Naja, wenns eine BuiltIn-Lösung ist, muss es ja auch berechnet werden..

Bei den Lösungen (gerade als Attribut) fände ich ggf. zu berücksichtigen, dass man es evtl. nur für spezielle Readings nutzen will.. Fände gut, wenn man dediziert für jedes <Device:Reading:DecPlaces> angeben könnte -> hab ich jetzt ausm PID-Modul, da isses für den ActorValue eingebaut..

Grüße
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

rudolfkoenig

Die zusaetzliche Last durch UserReading ist vmtl. vernachlaessigbar. Das UserReading ist Device-spezifisch, d.h. der Code wird nur bei den Events des betroffenen Geraetes ausgewertet, und hier wird zu den Events/Readings eins hinzugefuegt. FileLog/Notify/etc haengt stark vom Regexp ab: wenn der Regexp einem Geraet zugeordnet werden kann (NOTIFYDEV ist im Detailansicht sichtbar), dann wird das FileLog/notify nur fuer Events von diesem Geraet aufgerufen. Man kann aber natuerlich alles kaputt (d.h. zu langsam) konfigurieren, z.Bsp. wenn man alle Events in einem Datei protokolliert.

ZitatFände gut, wenn man dediziert für jedes <Device:Reading:DecPlaces> angeben könnte
Mag sein, ist mir aber zu spezifisch. Ich baue lieber Loesungen, die man auch fuer andere Zwecke verwenden kann, Nachkommastellen zu kappen waere nur ein Spezialfall.

rudolfkoenig

Habe readingsChange eingecheckt, ist ab morgen per update verfuegbar.
Die Ankuendigung: https://forum.fhem.de/index.php?topic=60226.new#new

dev0

In der commandref zu readingsChange steht:
Zitat
# format each decimal number in the power reading to 2 decimal places
define p2dec readingsChange pm power (\d+\.\d+) {sprintf("%02.f", $1)}

Müßte es in dem Beispiel nicht {sprintf("%.2f", $1)} heißen? Und exakter wäre die Formulierung "to max. 2 decimal places", da das verwendete eval unbenötigte Nachkommastellen abschneidet.

rudolfkoenig

sprintf habe ich korrigiert, danke fuer den Hinweis.
"to max 2" stimmt nicht:
fhem> setreading pm power 2.1 W
fhem> list pm
...
     2016-11-22 08:51:50   power           2.10 W

Vmtl. hast du es mit 2 versucht, das erwischt aber der Regexp aus dem Beispiel nicht.

dev0

Zitat von: rudolfkoenig am 22 November 2016, 08:53:19
Vmtl. hast du es mit 2 versucht
Stimmt, hatte fälschlicherweise mit einem anderen sprintf Ausdruck getestet.