Hauptmenü

sprintf verstehen?

Begonnen von bajogger, 02 September 2023, 10:35:58

Vorheriges Thema - Nächstes Thema

bajogger

Habe seit kurzer Zeit einen Shelly Pro 3EM im Einsatz. Habe dabei mit setReading das ein oder andere Reading definiert.
Da der Shelly ca 5% vom eigentlichen Zähler abweicht rechne ich in einem Reading "TagesVerbrauchKor" das Reading "TagesVerbrauch" *1,05.

Der Shelly gibt bereits seine Readings mit 4 Nachkommastellen aus. Das Berechnete hat >7 Nachkommastellen. Deshalb komme ich auf sprintf.
Habe es in vielen Versuchen geschafft das in die vielen Klammern zu integrieren das es funktioniert. Aber verstehen kann ich es nicht.

Der Ursprungscode
*07:59:50 setreading StromZaehler TagesVerbrauchKor {(ReadingsVal("StromZaehler","TagesVerbrauch",0)*1.05 ." kWh")}habe ich so angepasst
*07:59:50 setreading StromZaehler TagesVerbrauchKor {(sprintf("%.2f",ReadingsVal("StromZaehler","TagesVerbrauch",0))*1.05 ." kWh")}Was zu einer Reduzierung von >7 auf 4 Nachkommastellen führt. %.1f führt zu 3 Nachkommastellen ??

Dachte .2 = 2 Nachkommastellen ( so lese ich das auch in Forenbeiträgen)

Kann mir jemand das verständlich machen und wie kommt man zu 2 Nachkommastellen
FHEM auf Raspberry Pi, CUL 433 und CUL 866,
Diverse IT Empfänger für Rolladen und Licht, IPCam Instar 2905

RalfRog

Statt ReadingsVal einfach ReadingsNum verwenden.
Das kann runden (letzter Parameter)
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

betateilchen

Die Verwendung dieses unsäglichen Mischmaschs aus FHEM und perl mit der sinnlosen Klammersyntax finde ich immer noch zum Kotzen Brechen.

  • Setze die Klammern in den perl Funktionen richtig, dann funktioniert es auch.
  • Wenn Du mit Werten aus readings rechnen willst, verwende ReadingsNum() anstatt ReadingsVal()
  • Wenn Du schon mit sprintf() arbeitest, kannst Du auch das "kWh" gleich mit einbauen

{(sprintf("%.2f kWh",ReadingsNum("StromZaehler","TagesVerbrauch",0)*1.05))}

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#3
Zitat von: RalfRog am 02 September 2023, 10:44:02...

Hauptsache irgendwas geschrieben?
Ob es Sinn macht und zur Fragestellung

Zitatsprintf verstehen?

passt, ist Dir offenbar grundsätzlich in den meisten Deiner Antworten egal.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bajogger

Alles klar

Aber warum gibt %.2  keine 2 Nachkommastellen ? Meine eigentliche Frage

Zur Schimpferei über die Klammersetzung nur soviel. Kann euch zwar verstehen, falls es da bessere Wege gibt, aber in allen Forenbeiträgen steht es ebenso. Was macht unsereiner Copy - Paste und dann anpassen.
FHEM auf Raspberry Pi, CUL 433 und CUL 866,
Diverse IT Empfänger für Rolladen und Licht, IPCam Instar 2905

bajogger

Wieso. Ich verstehe sprintf nicht.

Soll heisen ich möchte die Syntax verstehen. %.2 ergibt schon mal keine 2 Nachkommastellen.
So hatte ich es aber in vielen Beiträgen verstanden

Wo an meiner Frage ist das Problem
FHEM auf Raspberry Pi, CUL 433 und CUL 866,
Diverse IT Empfänger für Rolladen und Licht, IPCam Instar 2905

RalfRog

#6
Zitat von: betateilchen am 02 September 2023, 10:47:05.
...
Hauptsache irgendwas geschrieben?
...
Ob es Sinn macht und zur Fragestellung... passt

Ok werd mich zukünftig mehr raushalten :(

Zur Fragestellung passt es sicher nicht direkt aber zum Problem einfach einen Wert ohne 7 Nachkommastellen zu erhalten.
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Jamo

Deine Klammersetzung ist falsch. Erst machst Du ein sprintf des Readings mit 2 Nachkommastellen, danach multiplizierst Du mit 1.05. Das ergibt 4 Nachkommastellen.

Du möchtest aber das Reading erst mit 1.05 multiplizieren, und danach das sprintf anwenden, oder?
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/Conbee III, FB7690, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack, Sonos, ESPresence

bajogger

ZitatDeine Klammersetzung ist falsch. Erst machst Du ein sprintf des Readings mit 2 Nachkommastellen, danach multiplizierst Du mit 1.05. Das ergibt 4 Nachkommastellen.

Du möchtest aber das Reading erst mit 1.05 multiplizieren, und danach das sprintf anwenden, oder?

Genau richtig.

Habe ja schon geschrieben das ich zig Versuche hinter mir habe sprintf in mein Reading einzufügen. Klar ich probiere und verstehe vieles nicht. Durch deinen Ansatz werde ich aber nochmal gezielt nach der besseren Klammer suchen. Danke an Alle welche helfend antworten.

Den Herrn "betateilchen" provoziere ich mit meiner Art zu fragen. Weis aber nicht wieso. Wozu gibt es eigentlich Foren wenn man nicht einfach mal fragen kann
FHEM auf Raspberry Pi, CUL 433 und CUL 866,
Diverse IT Empfänger für Rolladen und Licht, IPCam Instar 2905

betateilchen

#9
Zitat von: bajogger am 02 September 2023, 11:15:14Den Herrn "betateilchen" provoziere ich mit meiner Art zu fragen. Weis aber nicht wieso. Wozu gibt es eigentlich Foren wenn man nicht einfach mal fragen kann

Wie kommst Du darauf, dass Du mich provoziert hättest?
Das haben hier im Thread mal wieder andere Leute gemacht.

In meiner ersten Antwort hatte ich Dich auf Deinen Fehler hingewiesen

ZitatSetze die Klammern in den perl Funktionen richtig, dann funktioniert es auch.

und auch eine funktionierende Lösung - inklusive korrekt gesetzter Klammern! - als Codeschnipsel gepostet

Zitat{(sprintf("%.2f kWh",ReadingsNum("StromZaehler","TagesVerbrauch",0)*1.05))}

Das ist doch in Summe nicht schlecht für jemanden, von dem Du glaubst, ihn provoziert zu haben, oder?

Was erwartest Du denn noch mehr?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bajogger

Habe keine weitere Erwartungen. Hatte deine kritische Antwort irrtümlich auf mich bezogen. Sorry

Danke für deine Hilfe.
FHEM auf Raspberry Pi, CUL 433 und CUL 866,
Diverse IT Empfänger für Rolladen und Licht, IPCam Instar 2905

betateilchen

Bitte nächstes Mal erst lesen, dann denken und dann schreiben (wenn es wirklich noch notwendig ist)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!