Seite 1 von 2

Einen String formatieren?

Verfasst: 21. Nov 2022 11:07
von magarethe
Hallo Forum,

habe jetzt hier ein kleines Problem? Ich bekomme über ein Item einen String:

Code: Alles auswählen

String Gesamt_Zaehler "Aktueller Zählerstand [%s kWh]"  { channel="http:url:Stromzaehler_1:sumValue" }
Ergebnis: 24371685 als String
Der Zählerstand intessiert mich aber nur bis 24371! Also die letzten 3 Stellen sind mir egal!
Jetzt habe ich eine Rule geschrieben um den String zu foprmatieren, leider tut sich da gar NICHTS! Ich denke mal irgendeine Syntax stimmt da wieder nicht.

Rules:

Code: Alles auswählen

rule "Zählerstand formatieren"
when
    Item Gesamt_Zaehler update
then
    val String strIn = Gesamt_Zaehler.state 
    val String strOut = strIn.subString(0,5)
end   
Vielleicht habt ihr ja den entscheidenen Hinweis, was ich hier wieder mal, unwissend wie ich so bin, falsch mache?

Danke Magarethe

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 11:36
von peter-pan
Ich gehe mal davon aus, das die Rule richtig ist. Das Ergebnis solltest du dir vielleicht mal testweise mit einer Logausgabe anzeigen. Das Ergebnis solltest auf jeden Fall in ein neues ungebundenes Item schreiben, da dein "Ursprungs-Item"mit einem Channel verlinkt ist und deshalb der Status immer wieder auf den Ursprungswert gesetzt wird.


Edit: Probiere mal:

Code: Alles auswählen

    val String strOut = strIn.substring(0,5)
(Gross-Kleinschreibung)

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 13:39
von magarethe
Hallo Peter-Pan
Das Ergebnis solltest auf jeden Fall in ein neues ungebundenes Item schreiben, da dein "Ursprungs-Item"mit einem Channel verlinkt ist und deshalb der Status immer wieder auf den Ursprungswert gesetzt wird.
Wie schreibt man denn ein ungebundenes Item? :shock:
Kann man die Stringänderung nicht gleich in das Item einbinden?

Gruß Magarethe

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 15:11
von peter-pan
magarethe hat geschrieben: 21. Nov 2022 13:39 Kann man die Stringänderung nicht gleich in das Item einbinden?
Das kannst du ja mal probieren, aber spätestens bei der nächsten Statusänderung, ggf. auch sofort wird der Status wieder durch den Channel korrigiert. Ich könnte mir auch vorstellen, dass durch die Status-Änderung wiederum die Rule getriggert wird, usw... (muss nicht sein, aber vielleicht doch...).
magarethe hat geschrieben: 21. Nov 2022 13:39 Wie schreibt man denn ein ungebundenes Item? :shock:
Ein ungebundenes Item ist ein (ich sag meisten Dummy-Item dazu) Item, welches nicht mit einem Channel verlinkt ist.

Beispiel - gebundenes Item:

Code: Alles auswählen

String Gesamt_Zaehler "Aktueller Zählerstand [%s kWh]"  { channel="http:url:Stromzaehler_1:sumValue" }
dazu ein ungebundenes (Dummy)-Item:

Code: Alles auswählen

String Gesamt_Zaehler_Dummy "Aktueller Zählerstand formatiert[%s kWh]" 
und noch die Rule dazu(etwas verkürzt):

Code: Alles auswählen

rule "Zählerstand formatieren"
when
 Item Gesamt_Zaehler changed
then
    Gesamt_Zaehler_Dummy.postUpdate(Gesamt_Zaehler.state.toString.substring(0,5))
//    Gesamt_Zaehler_Dummy.postUpdate(Gesamt_Zaehler.state.toString.substring(0,5) + " kWH")   // alternativ, dann brauchst du keine zusätzliche Formatierung im Item
    logInfo("Zählerstand","Zählerstand hat getriggert ")  // nur für Test
end   

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 15:23
von udo1toni
Du kannst die Stellen über eine JS Transformation entfernen, auf diese Weise landen sie erst gar nicht im Item.

Aber zuerst mal: was erwartest Du denn, was in der Rule passieren soll? Du liest einen Wert in eine Variable ein und überträgst einen Teilstring aus dieser Variablen in eine zweite Variable. Wie soll das das ursprüngliche Item beeinflussen? Ich hoffe, wir sind uns einig, dass im Gegenteil Auswirkungen auf das Item ein absolutes NoGo wären.

Ungebundene Items: Ein ungebundenes Item ist eines, bei dem kein Link auf einen Channel gesetzt ist. Du kannst einfach in der UI auf die Itemliste gehen und ein Item anlegen, schon hast Du ein ungebundenes Item.

String Item für Zählerstand: Mach das bitte nicht. Wenn doch der Wert ohne Weiteres als Zahl angeliefert wird, warum nutzt Du nicht diesen Wert? Ein String kann nicht mit einer Zahl verglichen werden (ist der Zählerstand größer oder kleiner als...) und Du kannst den Wert nicht als Graph im zeitlichen Verlauf darstellen lassen.

Aber es geht noch weiter... Wenn Du nämlich den Channel direkt als Number Channel definierst, gibt es unter den advanced Options einen unscheinbaren Parameter Einheit. Wenn Du dort einfach nur Wh einträgst, solltest Du anschließend diesen Channel mit einem Number:Energy Item verbinden können.
In der Folge musst Du keine Einheit anhängen.

Aber es wird noch besser... Du kannst dennoch für die Ausgabe eine Einheit anhängen :) z.B. kWh. Nur dass openHAB nun automatisch das Komma verschiebt! Und die Nachkommastellen, die Du nicht sehen willst, kannst Du mit der Formatierung %.0f unterdrücken. Der im Item gehaltene Wert ist dann aber der vollständige Messwert, keiner, der abgeschnitten wurde.

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 16:43
von peter-pan
udo1toni hat geschrieben: 21. Nov 2022 15:23 Aber es wird noch besser...
Das ist natürlich das allerbeste. Hab's gerade mal ausprobiert. Funktioniert super. Ohne Rule einfach nur mit UoM 👍👍

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 16:49
von udo1toni
;)

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 18:11
von magarethe
Hallo Peter-Pan

Habe jetzt die Rule zum Laufen gekriegt. Vielen Dank. Habe viel gelernt.
Jetzt noch einmal zu den Werten. Die Werte kommen aber leider nur als String.
Aber jetzt in der Rule kann man ja konvertieren und dann auch rechnen.

Also nochmals an alle vielen Dank.

Gruß Magarethe

Re: Einen String formatieren?

Verfasst: 21. Nov 2022 23:12
von udo1toni
magarethe hat geschrieben: 21. Nov 2022 18:11 Die Werte kommen aber leider nur als String.
Woran machst Du fest, dass 24371685 ein String ist? Für mich sieht das nach einer Zahl aus.

Oder anders ausgedrückt: http transportiert Zeichen. Solange eine Zeichenkette aber ausschließlich Ziffern (und eventuell noch einen einzelnen Punkt, als Dezimaltrenner) enthält, kann die Zeichenfolge ohne weiteres auch als Zahl verwendet werden. Ob die Zahl als Zahl oder als String in ein Item geschrieben wird, hängt nur davon ab, welchen Channeltyp man verwendet.

Re: Einen String formatieren?

Verfasst: 22. Nov 2022 00:58
von peter-pan
Die "komplizierte Methode mit Rule.
Dein Dummy-Item heisst:

Code: Alles auswählen

Number:Energy   Gesamt_Zaehler_Dummy "Test-Number [%s kWh]"  
Die Rule dazu:

Code: Alles auswählen

rule "Zählerstand formatieren"
when
 Item Gesamt_Zaehler changed
then
    vTest = Gesamt_Zaehler.state.toString.substring(0,5)
    Gesamt_Zaehler_Dummy.postUpdate(vTest)
    logInfo("Zählerstand","Zählerstand hat getriggert {}", vTest )  // nur für Test
end   
Also diese Version hat bei mir funktioniert.

Jetzt aber die bessere Version ohne Rule, wie Udo es beschrieben hat:

1) du legst dein HTTP-Thing mit einem Number-Channel an und gibst dort die Einheit einfach mit:

Code: Alles auswählen

Thing http:url:weather "Wetterinformationen" [ baseURL="https://api.openweathermap.org/data/2.5/onecall?lat=57.3341&lon=4.56789&exclude=minutely,hourly&appid=strenggeheim&lang=de&units=metric", refresh=7200, timeout=720000, username="sagichnich", password="verratichnich"] {
    Channels:
        Type number : actpressure "Actual Pressure" [ stateTransformation ="JSONPATH:$.current.pressure", unit="Wh" ]
}


2) das Item dazu:

Code: Alles auswählen

Number:Energy   Gesamt_Zaehler_num "Zaehler[%s kWh]"  { channel="http:url:weather:actpressure"}
Ich habe jetzt grad nicht die Daten von deinem HTTP-Thing präsent. Das musst du halt noch "synchronisieren". Im Thing-Channel steht jetzt als Einheit "Wh"(Watt/Stunden).

Den Item-Namen habe ich auch etwas verändert und da musst du den richtigen Channel verlinken.
Da du diesen Wert so nicht haben willst, stellst du im Item einfach "kWh" (Kilowattstunden) ein und schon wird das automatisch umgerechnet. "mWh" geht sicher auch noch. ;) Aber dann musst du mit Nachkommastellen arbeiten. :lol:


Edit:
Mir ist noch was eingefallen. Wenn du an den Things Änderungen vornimmst, solltest du danach sicherheitshalber einen Restart von openHAB vornehmen. Das hat schon in der Vergangenheit manchmal ein Problem nach sich gezogen, da die Synchronisation nicht so hunderprozentig geklappt hat.