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);;}
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.
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
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.
Habe readingsChange eingecheckt, ist ab morgen per update verfuegbar.
Die Ankuendigung: https://forum.fhem.de/index.php?topic=60226.new#new
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.
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.
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.