Formatierung per sprintf [gelöst]

Begonnen von SHOFHEM, 31 Mai 2021, 19:10:51

Vorheriges Thema - Nächstes Thema

SHOFHEM

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




rudolfkoenig

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.

SHOFHEM

#2
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 :(

herrmannj

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

herrmannj

Lass das sprintf doch den ganzen Text erstellen ...

SHOFHEM

#5
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])}


SHOFHEM

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.

yersinia

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)))}
???

viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

rudolfkoenig

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

SHOFHEM

#9
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)))}



yersinia

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.
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

SHOFHEM

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]

SHOFHEM

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)))

SHOFHEM

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