FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: sunrise am 21 November 2023, 19:49:10

Titel: [Gelöst] Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 21 November 2023, 19:49:10
Hallo zusammen!

Rudolf hat kürzlich 98_SVG.pm aktualisiert (https://svn.fhem.de/trac/changeset/28159/) (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 (https://forum.fhem.de/index.php?msg=1293013) verwenden kann:

[url="https://forum.fhem.de/index.php?action=dlattach;attach=174573;type=preview;file"]thz 2023-11-20 140109.png[/url]

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! :)
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: frober am 22 November 2023, 18:54:01
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>"
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 23 November 2023, 11:00:04
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)
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: betateilchen am 23 November 2023, 11:21:07
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.
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 23 November 2023, 11:23:47
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.
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: frank am 23 November 2023, 11:49:19
nimm im sprint ebenfalls die 'einfachen'.
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 23 November 2023, 11:55:27
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)
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: frank am 23 November 2023, 12:11:03
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>"
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 23 November 2023, 12:39:29
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?
Titel: Aw: Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 23 November 2023, 12:50:36
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:
thz 2023-11-23 124929.png
Titel: Aw: [Gelöst] Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: frank am 23 November 2023, 14:37:44
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
Titel: Aw: [Gelöst] Nutzung von sprintf in <html></html> nach Update von 98_SVG.pm
Beitrag von: sunrise am 24 November 2023, 08:26:07
Nochmals vielen Dank! 😊