Leidiges Thema: Formatierung von Zahlen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von peter-pan »

Ich hab noch mal ein bisschen herum gespielt mit meinem Beispiel. Hier das Ergebnis

.items:

Code: Alles auswählen

Number test_anotherNumber          "TestUmwandlung dreistelling[%.3f] "
Number CPU_Temp_num                "CPU-OH2-Pi Temperatur [%.1f °C]" <temperature> (Chart_Sys_Temp)
.rules

Code: Alles auswählen

rule "newtest"
when
 Item Dummy4 changed to ON
then
 test_anotherNumber.sendCommand(CPU_Temp_num.state.format("%.3f").toString.replace(",","."))
 logInfo("xxx","geht {}",test_anotherNumber)
end

Code: Alles auswählen

openhab> smarthome:items list | grep -i test_anotherNumber
test_anotherNumber (Type=NumberItem, State=36.020, Label=TestUmwandlung dreistelling, Category=null)
openhab>
So sollte es auch funktionieren. Einfach Komma und Punkt umdrehen (replace). Ich dachte du wolltest das Komma in deinem String haben.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.3 openhabian

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Vielen Dank für deine "Mitforschung"!!!
peter-pan hat geschrieben: 20. Jan 2020 12:40...
test_anotherNumber.sendCommand(CPU_Temp_num.state.format("%.3f").toString.replace(",","."))
...

So sollte es auch funktionieren. Einfach Komma und Punkt umdrehen (replace). Ich dachte du wolltest das Komma in deinem String haben.
Meiner Meinung nach wird durch

Code: Alles auswählen

replace(",",".")
das Komma durch einen Punkt ersetzt, was ich ja eigentlich nicht will.
Wenn ich es anders schreibe

Code: Alles auswählen

replace(".",",")
bekomme ich im log eine Fehlermeldung.

Code: Alles auswählen

2020-01-20 19:05:44.582 [WARN ] [rthome.model.script.actions.BusEvent] - Cannot convert '1,0' to a command type which item 'svg_Speicher_Leistung' accepts: [DecimalType, QuantityType, RefreshType].
Meine Items sind alle vom Typ Number.
In der Rule berechne ich das Ergebnis und übergebe dieses an ein Number-Item:

Code: Alles auswählen

svg_Energie.sendCommand(((Energiezaehler_2.state as Number * 65536) + Energiezaehler_1.state as Number) / 1000)
Die berechnete Zahl wird mit einem Punkt anstatt eines Kommas dargestellt. Ich benötige den Wert aber als Number mit einem Komma.
Dabei habe ich mir dann die Zähne ausgebrochen.

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hallo Udo,

vielen Dank für die Informationen!
Sag mal, gibt es irgendwo im I-Net eine Doku, wo die ganzen Typwandlungen beschrieben werden?
Unter welcher Programmiersprache muss ich danach suchen?

Mich interessiert z.B.
- String To Number
- von einem Wert mit UoM die Einheit zu Berechnungszwecken entfernen
- ...
und zwar so, das es vom Syntax korrekt geschrieben ist.
Ich stelle nämlich fest, das ich mir durch Halbwissen schon einiges nicht ganz korrekt angeeignet habe :shock:

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

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von peter-pan »

violine21 hat geschrieben: 20. Jan 2020 19:23 bekomme ich im log eine Fehlermeldung.

Code: Alles auswählen

2020-01-20 19:05:44.582 [WARN ] [rthome.model.script.actions.BusEvent] - Cannot convert '1,0' to a command type which item 'svg_Speicher_Leistung' accepts: [DecimalType, QuantityType, RefreshType].
...das wirst du auch nicht hinbekommen. Intern arbeiten die Programme alle mit einem Dezimalpunkt, egal ob du die Verfahrensweise von Udo oder mir benutzst, wenn es sich um ein Number-Item handelt.

Wenn du ein UoM-Item von seinem Suffix befreien willst, kannst du z.B. so ein Konstrukt benutzen:

Code: Alles auswählen

 var vRainVol = (localHourlyForecast3RainVolume.state as Number).floatValue
Die Darstellung in deine(r)m UI hängt natürlich davon ab, wie du das in den Einstellungen definiert hast.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.3 openhabian

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

peter-pan hat geschrieben: 20. Jan 2020 22:56 ...das wirst du auch nicht hinbekommen. Intern arbeiten die Programme alle mit einem Dezimalpunkt, egal ob du die Verfahrensweise von Udo oder mir benutzst, wenn es sich um ein Number-Item handelt.
Besten Dank!
Mein Gefühl sagt mir, das für meinen Fall String-Items wohl die bessere Wahl sind. Da bin ich scheinbar flexibler, was die "Zeichenmanipulation" angeht. Werde dann zum Rechnen den Weg über Integer/Float gehen und danach einen String daraus machen.

Beste Grüße!

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hallo,

habe hier noch eine Herausforderung.
Mein Item:

Code: Alles auswählen

String	UVR_1611_Kollektortemperatur	"Kollektortemperatur [%s]"	{ http="<[cacheUVR:60000:REGEX(.*?<div id=.pos2.>(.*?) &deg;C </div>(.*))]" }
In der Rule:
String.gif
Ich muss von dem erhaltenen Wert die überflüssigen Zeichen entfernen. Das funktioniert mit dem replace. Soweit so gut.
Jetzt will ich mit dem Wert rechnen, dazu versuche ich ihn nach Float zu parsen (wegen des Kommawerts) und in eine Variable zu schreiben.
Mehrere Konstrukte habe ich getestet, leider ohne Erfolg. Im log steht der Fehler:

Code: Alles auswählen

[ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'UVR1611': For input string: "9,8"
Es ist zum Haare raufen. Was zum Teufel mache ich falsch?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von peter-pan »

versuch nochmal ein ".replace(",",".")" nach dem ".replace("&nbsp",""). Das sollte dann aus dem Komma wieder einen Punkt machen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.3 openhabian

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hi Peter,

dank Deinem Hinweis und einer umfangreichen I-Net-Recherche ist es mir tatsächlich gelungen, aus einem String mit Komma und Einheit eine Zahl
zu machen die im Zwischenschritt zudem noch eine Berechnung durchläuft.
In der Rule:

Code: Alles auswählen

var Number int_A = Float::parseFloat(String::format("%s",(virtual_UVR_Leistung.state.toString.replace('kW','').replace(',','.'))))
svg_Solarthermieleistung.postUpdate(int_A * 1000)
Die Items:

Code: Alles auswählen

String	virtual_UVR_Leistung			"UVR Leistung[%s]"
Number  svg_Solarthermieleistung        "svg_aktuelle Solarthermie-Leistung"
Jetzt ist der Weg frei für eine Visu meiner Photovoltaik/Solarthermieanlage.

Schönen Abend und danke!
Gruß André

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

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von peter-pan »

Hallo André,
das freut mich jetzt, das es geklappt hat. Ich hab aber nicht ganz verstanden um was es eigentlich ging. Was ist denn mit der Umwandlung von UoM-Items ? Und was war das mit der Umwandlung von Komma nach Punkt oder anders herum ? Bekommst du da einen Wert von deiner Photovoltaik-Anlage per HTTP, die an dein Netzwerk angeschlossen ist ? Was ist das für ein Item String virtual_UVR_Leistung "UVR Leistung[%s]" und wie wird das befüllt ? Fragen über Fragen :lol:

Hast du das schon probiert:

Code: Alles auswählen

svg_Solarthermieleistung.postUpdate((Float::parseFloat(String::format("%s",(virtual_UVR_Leistung.state.toString.replace('kW','').replace(',','.'))))) * 1000)
Schöner Einzeiler :geek: (Ich hab's nicht getestet) ;)

Gruss - Peter
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.3 openhabian

violine21
Beiträge: 591
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Leidiges Thema: Formatierung von Zahlen

Beitrag von violine21 »

Hallo Peter,
peter-pan hat geschrieben: 23. Jan 2020 22:57 Ich hab aber nicht ganz verstanden um was es eigentlich ging. Was ist denn mit der Umwandlung von UoM-Items ? Und was war das mit der Umwandlung von Komma nach Punkt oder anders herum ? Bekommst du da einen Wert von deiner Photovoltaik-Anlage per HTTP, die an dein Netzwerk angeschlossen ist ? Was ist das für ein Item String virtual_UVR_Leistung "UVR Leistung[%s]" und wie wird das befüllt ? Fragen über Fragen :lol:
Ich habe vor Jahren eine thermische Solaranlage auf dem Dach installieren lassen. Von der habe ich die Daten noch per php-Script und http-put auf einem Raspi 2 abgerufen und in einer MySQL-DB gesichert. Mir war am Anfang nur wichtig, einen ungefähren Überblick über die Rentabilität meiner Investition zu bekommen. Schnell kam dann noch eine kleine Visualisierung dazu.
Vor Kurzem folgte nun noch eine Photovoltaikanlage mit Akku. Da ja heutzutage der ins Netz eingespeiste Strom kaum noch vergütet wird, ist es mir wichtig, soviel wie möglich selbst zu verbrauchen.

Jetzt kommt die Automatisierung ins Spiel. Ich habe mich für OpenHAB entschieden. Damit will ich abhängig von den zur Verfügung stehenden Resourcen solche Dinge wie Geschirrspüler, Waschmaschine , elektr. Fussbodenheizung, ... steuern.

Die Daten von der Solarthermie kommen per http-Binding, das sind die UVR-Items.
Vom Wechselrichter bekomme ich sie mit dem Fronius-Binding.
Der VARTA-Akku bietet mit Modbus-Daten an.

Jetzt habe ich natürlich jede Menge unterschiedlicher Daten (String, Number, UoM-Werte) und irgendwie müssen die alle untereinander kompatibel sein um z.B. zu rechnen.

Ich komme aus einer Ära mit antiquierten Programmiersprachen (Basic, VB6...) und das auch nur als Hobby (bin Elektromechaniker). Darum tue ich mich mit dem "modernen Kram" noch etwas schwer.
Die Basis steht aber, darauf kann ich super aufbauen. Zum Glück gibts auch noch das Forum als Quell von Information.

Viele Grüße
André

PS: Habe auch den Einzeiler erfolgreich getestet und es doch wegen der Übersichtlichkeit beim Mehrzeiler gelassen. Irgendwann gehen mir die Klammern auf der Tastatur aus ;) ;) ;)

Antworten