[gelöst]userReadings mit monotonic und 2 Nachkommastellen

Begonnen von Kai-Alfonso, 11 Januar 2018, 16:41:06

Vorheriges Thema - Nächstes Thema

Kai-Alfonso

Hallo,

ich hole mir von der Fritzbox den täglichen "Datenverbrauch" und lasse den per useRreadings aufaddieren, um Monatssummen zu bekommen.

GesendetGB_Monat monotonic { sprintf("%.2f", ReadingsVal("doif.Datenvolumenzaehler","GesendetGB_Tag",0))},
EmpfangenGB_Monat monotonic { sprintf("%.2f", ReadingsVal("doif.Datenvolumenzaehler","EmpfangenGB_Tag",0))},


hier wäre meine Erwartung, das die Zahl mit 2 Nachkommastellen dargestellt wird. Wurde Sie auch an Anfang, aber irgendwann kamen dann Nachkommastellen dazu - wo habe ich den Fehler gemacht?

setstate doif.Datenvolumenzaehler 2018-01-10 23:59:59 EmpfangenGB_Gestern 64.74
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 EmpfangenGB_Monat 459.200000000007
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 EmpfangenGB_Tag 27.31
setstate doif.Datenvolumenzaehler 2018-01-04 10:32:46 EmpfangenGB_Vormonat 196.14
setstate doif.Datenvolumenzaehler 2018-01-10 23:59:59 GesamtGB_Gestern 66.33
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 GesamtGB_Monat 477.920000000007
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 GesamtGB_Tag 29.08
setstate doif.Datenvolumenzaehler 2018-01-04 10:33:22 GesamtGB_Vormonat 286.96
setstate doif.Datenvolumenzaehler 2018-01-04 08:26:44 GesendetGB_Gestern 2.22
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 GesendetGB_Monat 18.7200000000001
setstate doif.Datenvolumenzaehler 2018-01-11 16:38:55 GesendetGB_Tag 1.77
setstate doif.Datenvolumenzaehler 2018-01-04 10:32:14 GesendetGB_Vormonat 90.82


Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

viegener

Die Darstellung mit zwei Stellen ist ja hier nicht sichergestellt, denn der auf 2 Stellen gekürzte Wert wird ja nur verwendet (in einer Addition) um das eigentliche Reading zu berechnen.

Also wenn erstmal mehr nachkommastellen da sin wie in Deinem Fall bleiben sie auch da weil z.B. 459.200000000007 + 1.00 = 460.200000000007 immer noch mehr Nachkommastellen hat

Bleibt die Frage, wie die nachkommastellen ursprünglich reingekommen sind, da kann ich aber erstmal nichts zu sagen - sagt der log dazu etwas und vielleicht potentielle Ursachen?

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Kai-Alfonso

Zitat von: viegener am 11 Januar 2018, 17:04:06


Bleibt die Frage, wie die nachkommastellen ursprünglich reingekommen sind, da kann ich aber erstmal nichts zu sagen - sagt der log dazu etwas und vielleicht potentielle Ursachen?

Naja, die Nachkommastellen müssen durch die monotonic Funktion irgendwie kommen, weil selbst wenn ich die Werte per setreading gerunfet auf 2 Nachkommastellen per Hand setze, dann sind die nach 1-2 Tagen wieder mit Nachkommastellen
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

viegener

Dann vermute ich fast, dass es ein Problem bei der Berechnung in perl gibt. Soweit ich das in fhem.pl sehe wird nur addiert.
Im Netz findet man auch dafür Hinweise:

ZitatFor reasons described in excruciating detail in the document already cited, there will be errors, but according to a quick test on my system, they are nowhere near as large as you claim:

    $ perl -e '$x=0.001; $sum += $x for 1..40; printf "%.20f", $sum/40'
    0.00100000000000000067
    [download]

    Looks more like a "one off" error to me (i.e. summing over one more than you divide by):

    $ perl -e '$x=0.001; $sum += $x for 0..40; printf "%.20f", $sum/40'
    0.00102500000000000074
    [download]

http://www.perlmonks.org/?node_id=961262

Vielleicht kannst Du das mit zwei userreadings lösen - eines in dem die Detailwerte aufsummiert werden und dann ein weiteres, dass nur den gerundeten wert enthält:


GesendetGB_Monat_Detail monotonic { ReadingsVal("doif.Datenvolumenzaehler","GesendetGB_Tag",0)},
GesendetGB_Monat { sprintf("%.2f", ReadingsVal("doif.Datenvolumenzaehler","GesendetGB_Monat_Detail",0))},


Ohne das jetzt getestet zu haben - vermutlich muss auch noch ein Trigger hinzugefügt werden

Oder Du machst die monotonic-Berechnung selber und dann den sprintf

[/code]
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Kai-Alfonso

Zitat von: viegener am 11 Januar 2018, 17:23:29
Dann vermute ich fast, dass es ein Problem bei der Berechnung in perl gibt. Soweit ich das in fhem.pl sehe wird nur addiert.
Im Netz findet man auch dafür Hinweise:
http://www.perlmonks.org/?node_id=961262

Vielleicht kannst Du das mit zwei userreadings lösen - eines in dem die Detailwerte aufsummiert werden und dann ein weiteres, dass nur den gerundeten wert enthält:

So hab ich es jetzt gelöst. Danke für den Hinweis.


Zitat von: viegener am 11 Januar 2018, 17:23:29
Ohne das jetzt getestet zu haben - vermutlich muss auch noch ein Trigger hinzugefügt werden



Den Trigger hatte ich im doif
Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

viegener

Schön, kannst Du den Thread noch als gelöst markieren? Also im ersten Beitrag Betreff ändern.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Kai-Alfonso

Raspi2|nanoCul433|nanoCul868|CCU2
Energie-USBZähler|homebrew HM Devices
DBLog|DBRep|Homematic|Baumarktsteckdosen
Hue|Webcams mit DS-Station (Synology)|Bewegungsmelder|Rollladen|Schalter (IT|HM)

RalfRog

#7
Zitat von: viegener am 11 Januar 2018, 17:23:29
.....
Vielleicht kannst Du das mit zwei userreadings lösen - eines in dem die Detailwerte aufsummiert werden und dann ein weiteres, dass nur den gerundeten wert enthält:

GesendetGB_Monat_Detail monotonic { ReadingsVal("doif.Datenvolumenzaehler","GesendetGB_Tag",0)},
GesendetGB_Monat { sprintf("%.2f", ReadingsVal("doif.Datenvolumenzaehler","GesendetGB_Monat_Detail",0))},

....

Hab mich da jetzt mal drangehängt. Habe zum gleichen Problem lange gesucht und nicht wirklich etwas gefunden (ausser vielleicht das Modul readingChange).
So mit dem Vorschlag lässt es sich fix einbauen und man muss nichts am Logging oder der Logik verändern und beides steht an der "gleichen" Stelle.

Die Ausweitung der Nachkommastellen beim "userreading" liegt denke ich an der "monotonic" Berechnung. Ich habe die Beobachtung gemacht, dass es nach einem Restart von FHEM passiert - ohne Restart ist es bei mir bei einer Nachkommastelle geblieben.


energycalc:energy.* monotonic {ReadingsVal("shelly_plug_s_df2674","energy",0)}
energyCum:energy.* {sprintf("%.1f",ReadingsVal("shelly_plug_s_df2674","energyCum",0))}
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

jkriegl

Versuch es mal mit ReadingsNum.
Bei mir bleiben 3 Nachkommastellen auch nach einem FHEM restart erhalten.
energyTotal:energy.* monotonic {ReadingsNum($name,"energy",0)}
Rpi 3, Fhem, Cul 868, HM-CC-RT-DN, HM-Sec-Sco, HM-ES-PMSw1-Pl, ebus (Vaillant), ECMD, Telegram, HTTPMOD, Xiaomi, Shelly

RalfRog

Bin etwas spät...
Danke für den Tipp. Habe mir zum Test ein weiteres Monotonic-Userreading angelegt und lasse es parallel mitlaufen.
Mal sehen wie die Zahlendarstellung wird.
Nach den letzten FHEM-Restart vor 49 Tagen bin ich mit meinem ursprünglichen Userreading noch nicht wieder in die vielen Nachkommastellen gelaufen.
testmono:energy.* monotonic {ReadingsNum("shelly_plug_s_df2674","energy",0)}
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

RalfRog

Hatte zwar länger gedauert aber irgendwann waren die Nachkommatstellen wieder da.

Wenn man es richtig machen würde, würde es wahrscheinlich auch klappen => zwei Parameter: default und round
testmono:energy.* monotonic {ReadingsNum("shelly_plug_s_df2674","energy",0,0)}
::)
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder