Leidiges Thema: Formatierung von Zahlen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

violine21
Beiträge: 136
Registriert: 20. Sep 2019 05:49

Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hallo,
beim Thema Zahlenformatierung beisse ich mir regelmäßig die Zähne aus.
Folgendes Beispiel:
Ich habe folgende Items

Code: Alles auswählen

Number	Energiezaehler_1	"gespeicherte Energie Low-Word[%s]"		{channel="modbus:data:1105cf1c:number"}
Number	Energiezaehler_2	"gespeicherte Energie High-Word[%s]"        {channel="modbus:data:9f6096e3:number"}
Number	svg_Energie
In einer Rule setze ich die beiden Zahlen Energiezähler_1 und 2 (High- und Low-Word) zusammen.

Code: Alles auswählen

svg_Energie.sendCommand(((Energiezaehler_2.state as Number * 65536) + Energiezaehler_1.state as Number) / 1000)
Das funktioniert super und das Ergebnis lautet

Code: Alles auswählen

79.9280000
Ich möchte aber die Zahl so formatieren

Code: Alles auswählen

79,928
Statt Dezimaltrenner Punkt ein Komma und nur 3 Nachkommastellen.
Ich habe schon einiges versucht aber nur Fehler erzeugt :(

Wie ist die beste Vorgehensweise und gibt es eine Doku, wo das Thema erklärt wird?

Danke schön!

Benutzeravatar
PeterA
Beiträge: 348
Registriert: 8. Feb 2019 12:12
Answers: 3

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von PeterA »

Hi,

das geht in der Sitemap eigentlich ganz einfach:

Code: Alles auswählen

Default   item=deinitemname label="Energie [%.2f kWh]"
das "2f" erzeugt 2 Nachkommastellen oder eben "3f" oder "4f" usw

Gruß

Peter

violine21
Beiträge: 136
Registriert: 20. Sep 2019 05:49

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hallo,
ja, in der Sitemap geht das prima.
Ich benötige den Wert aber in einer externen Anwendung und dort kann ich nicht mehr formatieren.

Trotzdem danke!

Benutzeravatar
peter-pan
Beiträge: 614
Registriert: 28. Nov 2018 12:03
Answers: 3
Wohnort: Schwäbisch Gmünd

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von peter-pan »

..leider kann ich dein exaktes Problem nicht nachstellen, aber ich hab mal eine kleine Regel zusammengebastelt, die du vielleicht als Ankerpunkt verwenden kannst:

Regel:

Code: Alles auswählen

rule "format"
when
 Item Dummy4 changed to ON
then
 var test = CPU_Temp_num.state.format("%.3f").toString
 logInfo("xxx","geht {}",test)
end
Das Ergebnis sieht dann im Logger(und in der Variablen) so aus:

Code: Alles auswählen

2020-01-19 03:52:47.881 [INFO ] [g.eclipse.smarthome.model.script.xxx] - geht 35,530
Das Ergebnis ist bei mir übrigens das gleiche, wenn ich es ohne "toString" teste.

Vielleicht kannst du das in deiner Regel bzw. in der Rechenformel oder ggf. in einem Zwischenschritt einbauen.

Edit:
Das geht evtl. auch noch, falls es ein bisschen mehr sein soll(muss) ;)

Code: Alles auswählen

rule "newtest"
when
 Item Dummy4 changed to ON
then
 var test = CPU_Temp_num.state.format("%.3f").toString.replace(",",".")
 logInfo("xxx","geht {}",test)
end
Das Komma und den Punkt kann man auch vertauschen, oder durch was ganz anderes ersetzen :D

Benutzeravatar
PeterA
Beiträge: 348
Registriert: 8. Feb 2019 12:12
Answers: 3

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von PeterA »

violine21 hat geschrieben:
19. Jan 2020 01:34
Hallo,
ja, in der Sitemap geht das prima.
Ich benötige den Wert aber in einer externen Anwendung und dort kann ich nicht mehr formatieren.

Trotzdem danke!
Und wenn Du die Kommatstellen schon im item vorgibst ?

Code: Alles auswählen

Number        Shellyswitch25_myshellyID_kWh           "Shelly2501energy [%.5f kWh]"

violine21
Beiträge: 136
Registriert: 20. Sep 2019 05:49

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Erst einmal vielen Dank für die Tip's!
..leider kann ich dein exaktes Problem nicht nachstellen
Ich bin gerade dabei, eine Visualisierung auf svg-Grafikbasis zu erstellen. Um dort alle möglichen Werte ohne erneute Formatierung 1:1 an zu zeigen,
habe ich mir gedacht, erstell ich für alle Zahlenwerte fertig formatierte Variablen in OpenHAB auf Number-Basis und brauche mich im svg-Editor
nur noch um die Platzierung zu kümmern. Die werte kommen sozusagen fertig in der Grafik an.
Dazu gehört z.B., das alle Zahlen als Dezimaltrenner ein Komma haben und die Nachkommastellen bereits passen.
Wenn ich eine Zahl habe z.B. 1234.1234567890 und möchte 1234,12 angezeigt bekommen, so muss das noch in OpenHAB passieren.
.toString.replace(",",".")
Replace funktioniert ja leider nur bei Strings und nicht bei Number.
Und wenn Du die Kommatstellen schon im item vorgibst ?
Danke! Das ist die Lösung. Ich habe mir wahrscheinlich eine Unart angewöhnt, die Formatierung in der Sitemap vor zu nehmen.
In den Items geht das ja auch :oops: :oops: :oops:

Trotzdem suche ich immer noch eine Dokumentation, wo die Formatierungsregeln erklärt sind.

Benutzeravatar
PeterA
Beiträge: 348
Registriert: 8. Feb 2019 12:12
Answers: 3

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von PeterA »

violine21 hat geschrieben:
19. Jan 2020 11:29
Erst einmal vielen Dank für die Tip's!
Und wenn Du die Kommatstellen schon im item vorgibst ?
Danke! Das ist die Lösung. Ich habe mir wahrscheinlich eine Unart angewöhnt, die Formatierung in der Sitemap vor zu nehmen.
In den Items geht das ja auch :oops: :oops: :oops:
Hey, freut mich das dass dein Problem gelöst hat. :D

Gruß
Peter

Benutzeravatar
udo1toni
Beiträge: 2606
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von udo1toni »

Also, wenn man ein Label definiert, ist es gleichgültig, ob man dieses im *.items File oder in der Sitemap definiert. Der einzige Unterschied ist, dass man das Label in der Sitemap nicht mehrfach angeben muss, wenn man das Item identisch an mehreren Stellen (oder auch in mehreren Sitemaps) anzeigen lassen will.
Die Formatierung bezieht sich ausschließlich auf das Label, im Item ist stets die komplette Zahl gespeichert.
Will man aus einem Number Item den Wert als Zahl mit einer bestimmten Anzahl Nachkommastellen haben, ist es das Einfachste, den Wert mit 10^n zu multiplizieren (n=Nachkommastellen), vom Ergebnis den Integer zu berechnen und das Ergebnis wiederum durch 10^n zu teilen. Geht es um eine rein textuelle Weiterverarbeitung, bietet es sich an, ein String::format("%.nf",Wert) vorzunehmen (wobei n wieder der Anzahl Nachkommastellen entspricht). Anschließend hat man einen String mit einem Punkt statt eines Kommas, welchen man aber mit .replace() bequem ersetzen kann.

violine21
Beiträge: 136
Registriert: 20. Sep 2019 05:49

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Danke auch dir für die Erklärungen.
Vieles ist für mich noch Neuland.
udo1toni hat geschrieben:
19. Jan 2020 18:57
Will man aus einem Number Item den Wert als Zahl mit einer bestimmten Anzahl Nachkommastellen haben, ist es das Einfachste, den Wert mit 10^n zu multiplizieren (n=Nachkommastellen), vom Ergebnis den Integer zu berechnen und das Ergebnis wiederum durch 10^n zu teilen.
Könntest du mir dazu evtl. ein Codebeispiel zeigen?
Ich habe Probleme mit der Syntax, ständig meckert VSC oder ich habe Fehler im log-File. :roll:

Schönen Restsonntag!

Benutzeravatar
udo1toni
Beiträge: 2606
Registriert: 11. Apr 2018 18:05
Answers: 13
Wohnort: Darmstadt

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von udo1toni »

Klar.

Code: Alles auswählen

rule "runden"
when
    Item nInput changed
then
    var Number nZahl = 0
    if(nInput.state instanceof Number) nZahl = nInput.state as Number
    nZahl = nZahl * 1000
    nZahl = nZahl.intValue
    nZahl = nZahl / 1000
    nOutput.postUpdate(nZahl)
end
nInput und nOutput sind zwei Number Items. Natürlich kann man die Berechnung auch in einem Rutsch erledigen, ich hab das hier nur der Verständlichkeit halber in einzelne Zeilen geschrieben.

Antworten