Hallo Fhem Gemeinde,
ich habe ein Problem mit der Formatierung / Darstellung einer Subtraktion von 2 userReadings.
userReading Tagesverbrauch
KWH {sprintf("%.2f",ReadingsVal($name,"state",0)/1000)}
userReading Leistungsmesser_IEC_02
KWH2 {sprintf("%.2f",ReadingsVal($name,"state",0)/1000)}
so wird die Subtraktion ausgeführt und das Ergebnis lasse ich mir per Telegram senden
Verbrauch Vortag {([Leistungsmesser_IEC_02:KWH2]-[Tagesverbrauch:KWH])}
Die Berechnung und der Versand als solches funktioniert perfekt, in 90% der Fälle bekomme ich den Verbrauch Vortag auf 2 Stellen genau gesendet, aber manchmal klappt die Formatierung nicht.
so soll es sein
Verbrauch Vortag 1.53 KWh
aber manchmal bekomme ich die Message so
Verbrauch Vortag 3.10000000000001 KWh
Wie kann das Ergebnis 2er Zahlen, die 2 Nachkommastellen haben in einigen Fällen soviele Nachkommastellen haben. Ich habe mir "sprintf" und sämtliche Optionen schon mehrfach durchgelesen, aber ich komme auf keine Lösung.
Könnt ihr mir auf die Sprünge helfen bitte!
Bin gespannt darauf was ich falsch mache.
VG
S
Meine Meinung: wenn mit %02f nicht zwei Nachkommastellen angezeigt werden, dann ist die verwendete Bibliothek kaputt.
Ueber die Rundung kann man noch diskutieren, die binaere Darstellung ist nicht immer Dezimal-freundlich.
Hallo Rudolf,
danke für deine schnelle Antwort. Habe beide readings das attr geändert, das hat leider keine Erfolg gebracht.
"%.02f"
Verbrauch Vortag 5.410000000000001 KWh
die Readings haben beide nur 2 Stellen, nur das Ergebnis der Subtraktion nicht
Verbrauch bis jetzt aktuell KWH2 75.04 2021-05-3119:38:05
Verbrauch gestern KWH 69.63 2021-05-31 00:00:05
:o :(
Ja klar, du musst das Ergebnis der substraktion auch durch ein sprintf jagen und evtl sogar zusätzlich verhindern dass doif das als Zahl interpretiert. Schreib testweise im sprintf einen _ davor oder so
Lass das sprintf doch den ganzen Text erstellen ...
Hallo herrmannj,
ich stehe auf dem Schlauch! :-[ Wo und wie muss das sprintf eingefügt werden? Kannst du mir den code bitte abändern? Muss ich ein zusätzliches userReading erstellen?
Verbrauch Vortag {([Leistungsmesser_IEC_02:KWH2]-[Tagesverbrauch:KWH])}
Guten Morgen,
ich komme nicht weiter, alle meine Versuche sind nicht von Erfolg gekrönt. Perl / sprintf sind nicht meine Stärke!! :-\ :-\ :o :o
Wenn mir noch einer einen Tipp geben würde, bzw den Code verbessert wäre ich extrem dankbar.
Schönen Tag in die Runde
S.
Zitat von: SHOFHEM am 31 Mai 2021, 19:10:51userReading Tagesverbrauch
KWH {sprintf("%.2f",ReadingsVal($name,"state",0)/1000)}
userReading Leistungsmesser_IEC_02
KWH2 {sprintf("%.2f",ReadingsVal($name,"state",0)/1000)}
so wird die Subtraktion ausgeführt und das Ergebnis lasse ich mir per Telegram senden
Verbrauch Vortag {([Leistungsmesser_IEC_02:KWH2]-[Tagesverbrauch:KWH])}
Müsste das nicht eher so aussehen:
userReading Tagesverbrauch
KWH {return sprintf("%.2f",(ReadingsNum($name,"state",0)/1000));}
userReading Leistungsmesser_IEC_02
KWH2 {return sprintf("%.2f",(ReadingsNum($name,"state",0)/1000));}
Telegram:
Verbrauch Vortag {sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)))}
???
ZitatMüsste das nicht eher so aussehen: [...]
Klar.
In der Ausgabe muss man runden, wenn man auf die Form Wert legt:
> perl -e 'printf("%.25f\n", 0.15)'
0.1499999999999999944488849
Hallo yersinia,
vielen Dank für deine Antwort. Die Änderungen an Tagesverbrauch und Leistungsmessung funktionieren perfekt.
Bei Telegram passt was noch nicht. Ich vermiss dort auch return, oder wird das nicht gebraucht? Klammern habe ich schon gezählt, aber fehlt evtl trotzdem noch eine? Ich bitte dich, wen du Zeit findest noch mal eine Blick darauf zu werfen.
Es liefert folgendes
*00:00:01 set telegramS message Verbrauch Vortag {return sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)))}
telegram
Verbrauch Vortag {return sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)))}
Ich weiss gar nicht, in welchem Kontext du die Telegram Message versendest. ist das at, DOIF, notify oder eine myUtils Funktion?
Verbrauch Vortag {return sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)));}
Klammern passen, hab noch ein Semikolon hinzugefügt - ist so aber nur geraten.
Hallo bin unterwegs, deshalb relativ formlos. Ist ein at
*00:00:01 set telegramS message Verbrauch Monat [Leistungsmesser_IEC_01:KWH2] KWh Verbrauch Vortag {([Leistungsmesser_IEC_02:KWH2]-[Tagesverbrauch:KWH]+1.4566)} KWh Zaehlerstand {([Leistungsmesser_IEC_02:KWH2]+141457.14)} KWh Stromkosten incl. heute [Leistungsmesser_IEC_01:Kosten]
Hallo yersinia,
habe deine Änderung in mein at gerade eingefügt, das Semikolon bringt nicht den Erfolg! :-[ Es werden auf die weiteren Werte Zaehlerstand und Stromkosten unterdrückt!
*00:00:01 set telegramS message Verbrauch Monat [Leistungsmesser_IEC_01:KWH2] KWh Verbrauch Vortag {return sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)));} KWh Zaehlerstand {([Leistungsmesser_IEC_02:KWH2]+141457.14)} KWh Stromkosten incl. heute [Leistungsmesser_IEC_01:Kosten]
die Telegram Ausgabe siehe hier
Verbrauch Monat 3.9400 KWh Verbrauch Vortag {return sprintf("%.2f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0)))
Hallo Gemeinde,
habe jetzt etwas Zeit gehabt und die Lösung für mein Problem hoffentlich gefunden. ::) Habe ein zusätzliches userReadings erstellt, in der ich die Berechnung und Formatierung ausführe. Im at Befehl wird dann nur noch der Wert abgefragt.
userReadings neu
Verbrauch {return sprintf("%.4f",(ReadingsNum("Leistungsmesser_IEC_02","KWH2",0)-ReadingsNum("Tagesverbrauch","KWH",0))+1.4566);}
at Def
Verbrauch Vortag [Leistungsmesser_IEC_02:Verbrauch]
Test läuft