[Gelöst] Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm

Begonnen von sunrise, 21 November 2023, 19:49:10

Vorheriges Thema - Nächstes Thema

sunrise

Hallo zusammen!

Rudolf hat kürzlich 98_SVG.pm aktualisiert (danke dafür!) und damit das Escaping abgeschaltet, falls der Text in <html></html> eingeschlossen ist. Das Beispiel zeigt, wie man nun gemischt-farbige Titel von Plots verwenden kann:

Du darfst diesen Dateianhang nicht ansehen.

Der Code dazu:

attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'>$data{currval1} K</tspan> \\
<tspan style='fill:red'>Integralwert </tspan> \\
<tspan style='fill:red;;font-weight:bold'>$data{currval2} Kmin</tspan> \\
</html>"

Nun möchte ich gerne die Werte auf eine Stelle nach dem Komma runden. Dass es im Screenshot oben so aussieht, ist Zufall, d.h. ab und an kommen da auch Werte mit vielen Nachkommastellen.

Zuvor (ohne Farbe) hatte ich das so gelöst:

attr Mythz_Plot2_HC1Offset_Integral label \\
sprintf("HC1_Soll - HC1_Ist %0.1fK, Integralwert %0.1f Kmin", \\
$data{currval1}, $data{currval2})

Nun versuche ich, beides zusammenzubringen, scheitere aber daran, weil mir unklar ist, wie/wo sprintf beim Beispiel oben (1. Code-Schnipsel) einzubringen ist.

Kann mir da bitte jemand helfen? Danke! :)
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

frober

#1
Im attr label wird Perlcode ausgewertet, entsprechend kannst du genauso wie du die Variable verwendest auch sprintf verwenden.

ungestestet:
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'>sprintf("%0.1f K", $data{currval1})</tspan> \\
<tspan style='fill:red'>Integralwert </tspan> \\
<tspan style='fill:red;;font-weight:bold'>sprintf("%0.1f KMin", $data{currval2})</tspan> \\
</html>"
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

sunrise

#2
Das geht leider nicht, weil bei sprintf doppelte Hochkommas verwendet werden, welche sich jedoch bereits als Begrenzer um <html> und </html> befinden. Das ist ja mein Problem, welches ich nicht lösen kann. Ich habe es bereits mit einfachen Hochkommas versucht und auch mit dem Escapen von Hochkommas, aber ich erhalte stets diesen Fehler anstelle des Plot-Titels:
Zitatsyntax error at (eval 28415) line 1, near "0.1f K"
(teste mit nur einem Parameter/Wert)
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

betateilchen

Anstatt den ganzen Kram in das Attribut zu schreiben, was ich für ziemlich unsinnig und schwer wartbar halte, würde ich das Ganze in eine Funktion der 99_myUtils.pm packen und den vollständigen HTML-Text als return-Wert der Funktion im Attribut verwenden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sunrise

#4
Ohne sprintf:
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
$data{currval1} \\
</tspan> \\
</html>"

Ergebnis:
ZitatHC1_Soll - HC1_Ist -2.6

Mit sprintf:
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
sprintf("%0.1f", $data{currval1}) \\
</tspan> \\
</html>"

Ergebnis:
Zitatsyntax error at (eval 28720) line 1, near "0.1f"

Mit sprintf und dem Versuch des Escapens (offenbar nicht richtig):
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
sprintf(\"%0.1f\", $data{currval1}) \\
</tspan> \\
</html>"

Ergebnis:
ZitatHC1_Soll - HC1_Ist sprintf("%0.1f", -2.6)


PS @betateilchen
Funktionen überschreiten meine Kompetenzen, und ich hoffte, eine "simple" Formatierung eines Plot-Titels ohne eine Funktion hinzubekommen.
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

sunrise

#6
Zitat von: frank am 23 November 2023, 11:49:19nimm im sprint ebenfalls die 'einfachen'.
Wie meinst Du das mit ebenfalls? Sonst sind es doch "doppelte" Hochkommas (beim html).

Folgendes habe ich probiert - außen (beim html) doppelt und innen (beim sprintf und wie schon zuvor beim tspan) einfach:
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
sprintf('%0.1f', $data{currval1}) \\
</tspan> \\
</html>"

Ergebnis:
ZitatHC1_Soll - HC1_Ist sprintf(%0.1f, -2.4)
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

frank

ebenfalls: weil für style hast du auch schon einfache.

vielleicht so?
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
".sprintf("%0.1f", $data{currval1})." \\
</tspan> \\
</html>"
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

sunrise

Perfekt - so klappt es! Vielen Dank! ❤️ Und das ist (für mich) deutlich einfacher als dafür eine Funktion zu bemühen. 😊

Verstehe ich es richtig, dass mit dem ". und ." das sprintf aus dem Doppelhochkomma-Bereich des <html> und </html> genommen wird und dass es dafür aber zusätzlich eben der Punkte (.) bedarf? Wo kann man solche "Tricks" nachlesen?
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

sunrise

Hier nochmal alles im Zusammenhang für andere Interessierte:

define Mythz_Plot2_HC1Offset_Integral SVG FileLog_Mythz:thz2:CURRENT
attr Mythz_Plot2_HC1Offset_Integral captionPos auto
#attr Mythz_Plot2_HC1Offset_Integral label sprintf("HC1_Soll - HC1_Ist %0.1fK, Integralwert %0.1f Kmin", $data{currval1}, $data{currval2})
attr Mythz_Plot2_HC1Offset_Integral label \\
"<html>\\
<tspan style='fill:blue'>HC1_Soll - HC1_Ist </tspan> \\
<tspan style='fill:blue;;font-weight:bold'> \\
".sprintf("%0.1f", $data{currval1})." K \\
<tspan style='fill:red'>Integralwert </tspan> \\
<tspan style='fill:red;;font-weight:bold'> \\
".sprintf("%0.0f", $data{currval2})." Kmin \\
</html>"
attr Mythz_Plot2_HC1Offset_Integral plotsize 900,225
attr Mythz_Plot2_HC1Offset_Integral room Heizung_Plot

Ergebnis:
Du darfst diesen Dateianhang nicht ansehen.
Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2

frank

Zitat von: sunrise am 23 November 2023, 12:39:29Verstehe ich es richtig, dass mit dem ". und ." das sprintf aus dem Doppelhochkomma-Bereich des <html> und </html> genommen wird und dass es dafür aber zusätzlich eben der Punkte (.) bedarf? Wo kann man solche "Tricks" nachlesen?
die zusätzlichen hochkommas teilen den attribut-string in 3 teile (2 strings + eine funktion).
die punkte "kleben" die teile wieder zusammen. => concatenation-operator in perl
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

sunrise

Viele Grüße/kind regards
sunrise
_________________
Tecalor THZ 303 (SOL, 2006/09-2008/08), FW 2.16 | FHEM THZ module testing with FW 2.06 (INTEGRAL, 2006/12-2008/08) & FW 2.14 (SOL, 2002/10-2004/08) on Raspberry Pi 2