Wie immer: Umwandlung von Werten
Wie immer: Umwandlung von Werten
Hallo!
Ich habe ein Item, dass mir einen Wert "Number:Angle".
Leider wollte wohl noch niemand diesen Wert mal in eine Zahl umwandeln.
Ich muss es leider machen, da ich sagen will: Ist der Winkel zwischen 238 und 239 ° DANN
Auch die Formatierung von Strings in Zahlen habe ich Echo nicht gefunden.
Wer kann mir sagen, wo ich die Umwandlungsregeln finde.
Und kann mir jemand sagen, wie das mit den [%$ds] funktioniert?
Das habe ich auch noch nicht verstanden. Was bedeuten hier das %-Zeichen, die Zahlen, das "f" und das "s" und das "d".
Gibt es irgendwo eine Anleitung, in der das mal verständlich dargestellt wird oder muss man immer alles ausprobieren, bis mal etwas passt?
Danke und Gruß
Frank
Ich habe ein Item, dass mir einen Wert "Number:Angle".
Leider wollte wohl noch niemand diesen Wert mal in eine Zahl umwandeln.
Ich muss es leider machen, da ich sagen will: Ist der Winkel zwischen 238 und 239 ° DANN
Auch die Formatierung von Strings in Zahlen habe ich Echo nicht gefunden.
Wer kann mir sagen, wo ich die Umwandlungsregeln finde.
Und kann mir jemand sagen, wie das mit den [%$ds] funktioniert?
Das habe ich auch noch nicht verstanden. Was bedeuten hier das %-Zeichen, die Zahlen, das "f" und das "s" und das "d".
Gibt es irgendwo eine Anleitung, in der das mal verständlich dargestellt wird oder muss man immer alles ausprobieren, bis mal etwas passt?
Danke und Gruß
Frank
Also, den Unterschied var<->val hast Du ja schon. Trotzdem noch mal zur Klarstellung:
val ist das Schlüsselwort um eine Konstante zu definieren,
var ist das Schlüsselwort um eine Variable zu definieren.
Dann die Sache mit dem Number:Angle. Alle Items vom Typ Number:irgendwas sind UoM Items. UoM steht für Units of Measurement und bedeutet, dass das Item nicht nur den konkreten Wert enthält, sondern zusätzlich noch die zugehörige Einheit. Der Punkt dabei ist, dass man durch Anpassen der Einheit auch den konkreten Wert ändert, also z.B. wird aus 0 °C einfach durch Ändern der Einheit 32 °F, ganz ohne mit irgendwelchen Formeln rumzuhantieren. Bei einem Winkel könnte man diesen auch im Bogenmaß oder als Zeitwinkel angeben oder ablesen.
Die Kehrseite der Medaille ist, dass 250 ° eben etwas anderes ist als 250, man muss also Maßnahmen ergreifen um damit umzugehen.
Möglichkeit 1: Du entfernst die Einheit. Dazu muss man wissen, dass der "echte" Datentyp hier QuantityType lautet. QuantityType gehört zum Typ Number. Number kann witzigerweise auch zusätzlich die Unit halten, es reicht also nicht, den Datentyp nach Number zu casten (as Number). Stattdessen muss gezielt in einen Datentyp gewandelt werden, bei dem keine Einheit mitgeführt werden kann, das wären native Zahlentypen, z.B. Float oder Integer. Ganz sauber sieht es also so aus:
Dabei kann man in diesem Fall QuantityType<Number> auch verkürzt Number schreiben.
Möglichkeit 2: Du fügst die Einheit hinzu:
Einige Beispiele dazu gibt es in der offiziellen Doku: https://www.openhab.org/docs/configurat ... umber-item
In der Ausgangsrule gibt es diese Zeile:
Da gibt es einen grundsätzlichen Fehler:
= ist kein Vergleich, sondern eine Zuweisung. Mercedes_Benz_EQA_Door_Lock_Status.state = 0 bedeutet also eine Zuweisung des Wertes 0 zu ...state (was natürlich nicht funktioniert...) Auf Gleichheit prüft man mit ==.
Korrekt wäre der Vergleich so:
Wahlweise auch mit den Werten als Winkel mit Einheit:
Gehe zur vollständigen Antwortval ist das Schlüsselwort um eine Konstante zu definieren,
var ist das Schlüsselwort um eine Variable zu definieren.
Dann die Sache mit dem Number:Angle. Alle Items vom Typ Number:irgendwas sind UoM Items. UoM steht für Units of Measurement und bedeutet, dass das Item nicht nur den konkreten Wert enthält, sondern zusätzlich noch die zugehörige Einheit. Der Punkt dabei ist, dass man durch Anpassen der Einheit auch den konkreten Wert ändert, also z.B. wird aus 0 °C einfach durch Ändern der Einheit 32 °F, ganz ohne mit irgendwelchen Formeln rumzuhantieren. Bei einem Winkel könnte man diesen auch im Bogenmaß oder als Zeitwinkel angeben oder ablesen.
Die Kehrseite der Medaille ist, dass 250 ° eben etwas anderes ist als 250, man muss also Maßnahmen ergreifen um damit umzugehen.
Möglichkeit 1: Du entfernst die Einheit. Dazu muss man wissen, dass der "echte" Datentyp hier QuantityType lautet. QuantityType gehört zum Typ Number. Number kann witzigerweise auch zusätzlich die Unit halten, es reicht also nicht, den Datentyp nach Number zu casten (as Number). Stattdessen muss gezielt in einen Datentyp gewandelt werden, bei dem keine Einheit mitgeführt werden kann, das wären native Zahlentypen, z.B. Float oder Integer. Ganz sauber sieht es also so aus:
Code: Alles auswählen
val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as QuantityType<Number>).floatValue
if(EQARichtungZahl < 270) ...
Möglichkeit 2: Du fügst die Einheit hinzu:
Code: Alles auswählen
val EQARichtungZahl = Mercedes_Benz_EQA_Heading_Angle.state as Number
if(EQARichtungZahl < 270|°) ...
In der Ausgangsrule gibt es diese Zeile:
Code: Alles auswählen
if (Mercedes_Benz_EQA_Heading_Angle.state < 239.1 && Mercedes_Benz_EQA_Heading_Angle.state > 237.9 && Mercedes_Benz_EQA_Door_Lock_Status.state = 0) {
= ist kein Vergleich, sondern eine Zuweisung. Mercedes_Benz_EQA_Door_Lock_Status.state = 0 bedeutet also eine Zuweisung des Wertes 0 zu ...state (was natürlich nicht funktioniert...) Auf Gleichheit prüft man mit ==.
Korrekt wäre der Vergleich so:
Code: Alles auswählen
val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as Number).floatValue
if(EQARichtungZahl < 239.1 && EQARichtungZahl > 237.9 && (Mercedes_Benz_EQA_Door_Lock_Status.state as Number).intValue == 0)
Code: Alles auswählen
val EQARichtungZahl = Mercedes_Benz_EQA_Heading_Angle.state as Number
if(EQARichtungZahl < 239.1|° && EQARichtungZahl > 237.9|° && (Mercedes_Benz_EQA_Door_Lock_Status.state as Number).intValue == 0)
Re: Wie immer: Umwandlung von Werten
Hier der Code dazu, der mich um den Verstand bringt und mich schon wieder knapp 6 Stunden Zeit gekostet hat... leider ergebnislos. 
Habe es mir var und val im DIM-Bereich versucht (Frage: Was ist der Unterschied zwischen val und var?). Ging aber auch nicht.
Daher versuche ich es, den State einfach mal so zu verwenden. Leider komme ich mit der Try&Error Methode nicht weiter und meine Stundenlange Suche im Netz hat mich auch nicht weitergebracht.

Code: Alles auswählen
if (Mercedes_Benz_EQA_Heading_Angle.state < 239.1 && Mercedes_Benz_EQA_Heading_Angle.state > 237.9 && Mercedes_Benz_EQA_Door_Lock_Status.state = 0) {
Laden_EQA.sendCommand(ON)
Laden_ix3.sendCommand(OFF)
easeeladen.postUpdate("EQA")
Laden_Ziel_Batterie.sendCommand(80)
Laden_Batterie_Anfang.sendCommand(Mercedes_Benz_EQA_Battery_Charge_Level.state.toString)
}
Daher versuche ich es, den State einfach mal so zu verwenden. Leider komme ich mit der Try&Error Methode nicht weiter und meine Stundenlange Suche im Netz hat mich auch nicht weitergebracht.
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Wie immer: Umwandlung von Werten
var -> Variable (Wert veränderbar)fmmephisto hat geschrieben: ↑29. Jan 2023 13:24 (Frage: Was ist der Unterschied zwischen val und var?)
val -> Variable, Wert kann nur einmal gesetzt werden
BYe
Harald
Harald
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Wie immer: Umwandlung von Werten
probier einmalfmmephisto hat geschrieben: ↑29. Jan 2023 13:24Code: Alles auswählen
if (Mercedes_Benz_EQA_Heading_Angle.state < 239.1 && Mercedes_Benz_EQA_Heading_Angle.state > 237.9 && Mercedes_Benz_EQA_Door_Lock_Status.state = 0) { Laden_EQA.sendCommand(ON) Laden_ix3.sendCommand(OFF) easeeladen.postUpdate("EQA") Laden_Ziel_Batterie.sendCommand(80) Laden_Batterie_Anfang.sendCommand(Mercedes_Benz_EQA_Battery_Charge_Level.state.toString) }
Code: Alles auswählen
Mercedes_Benz_EQA_Heading_Angle.state as Number ....
BYe
Harald
Harald
Re: Wie immer: Umwandlung von Werten
Hallo Harald!
Danke für die Erklärung für var und val.
Das mit "as Number" geht nicht.
Ich bekomme eine Meldung mit "238.4 °"
Danke für die Erklärung für var und val.

Das mit "as Number" geht nicht.
Habe es mal ganz kurz damit versucht.var Number EQARichtungZahl = 0
rule "Testrules"
when
Item VariableActuator_Testknopf_Status changed
then
EQARichtungZahl = Mercedes_Benz_EQA_Heading_Angle.state as Number
if (EQARichtungZahl < 238)
messageohb.sendCommand(EQARichtungZahl)
end
Ich bekomme eine Meldung mit "238.4 °"
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Wie immer: Umwandlung von Werten
Also, den Unterschied var<->val hast Du ja schon. Trotzdem noch mal zur Klarstellung:
val ist das Schlüsselwort um eine Konstante zu definieren,
var ist das Schlüsselwort um eine Variable zu definieren.
Dann die Sache mit dem Number:Angle. Alle Items vom Typ Number:irgendwas sind UoM Items. UoM steht für Units of Measurement und bedeutet, dass das Item nicht nur den konkreten Wert enthält, sondern zusätzlich noch die zugehörige Einheit. Der Punkt dabei ist, dass man durch Anpassen der Einheit auch den konkreten Wert ändert, also z.B. wird aus 0 °C einfach durch Ändern der Einheit 32 °F, ganz ohne mit irgendwelchen Formeln rumzuhantieren. Bei einem Winkel könnte man diesen auch im Bogenmaß oder als Zeitwinkel angeben oder ablesen.
Die Kehrseite der Medaille ist, dass 250 ° eben etwas anderes ist als 250, man muss also Maßnahmen ergreifen um damit umzugehen.
Möglichkeit 1: Du entfernst die Einheit. Dazu muss man wissen, dass der "echte" Datentyp hier QuantityType lautet. QuantityType gehört zum Typ Number. Number kann witzigerweise auch zusätzlich die Unit halten, es reicht also nicht, den Datentyp nach Number zu casten (as Number). Stattdessen muss gezielt in einen Datentyp gewandelt werden, bei dem keine Einheit mitgeführt werden kann, das wären native Zahlentypen, z.B. Float oder Integer. Ganz sauber sieht es also so aus:
Dabei kann man in diesem Fall QuantityType<Number> auch verkürzt Number schreiben.
Möglichkeit 2: Du fügst die Einheit hinzu:
Einige Beispiele dazu gibt es in der offiziellen Doku: https://www.openhab.org/docs/configurat ... umber-item
In der Ausgangsrule gibt es diese Zeile:
Da gibt es einen grundsätzlichen Fehler:
= ist kein Vergleich, sondern eine Zuweisung. Mercedes_Benz_EQA_Door_Lock_Status.state = 0 bedeutet also eine Zuweisung des Wertes 0 zu ...state (was natürlich nicht funktioniert...) Auf Gleichheit prüft man mit ==.
Korrekt wäre der Vergleich so:
Wahlweise auch mit den Werten als Winkel mit Einheit:
val ist das Schlüsselwort um eine Konstante zu definieren,
var ist das Schlüsselwort um eine Variable zu definieren.
Dann die Sache mit dem Number:Angle. Alle Items vom Typ Number:irgendwas sind UoM Items. UoM steht für Units of Measurement und bedeutet, dass das Item nicht nur den konkreten Wert enthält, sondern zusätzlich noch die zugehörige Einheit. Der Punkt dabei ist, dass man durch Anpassen der Einheit auch den konkreten Wert ändert, also z.B. wird aus 0 °C einfach durch Ändern der Einheit 32 °F, ganz ohne mit irgendwelchen Formeln rumzuhantieren. Bei einem Winkel könnte man diesen auch im Bogenmaß oder als Zeitwinkel angeben oder ablesen.
Die Kehrseite der Medaille ist, dass 250 ° eben etwas anderes ist als 250, man muss also Maßnahmen ergreifen um damit umzugehen.
Möglichkeit 1: Du entfernst die Einheit. Dazu muss man wissen, dass der "echte" Datentyp hier QuantityType lautet. QuantityType gehört zum Typ Number. Number kann witzigerweise auch zusätzlich die Unit halten, es reicht also nicht, den Datentyp nach Number zu casten (as Number). Stattdessen muss gezielt in einen Datentyp gewandelt werden, bei dem keine Einheit mitgeführt werden kann, das wären native Zahlentypen, z.B. Float oder Integer. Ganz sauber sieht es also so aus:
Code: Alles auswählen
val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as QuantityType<Number>).floatValue
if(EQARichtungZahl < 270) ...
Möglichkeit 2: Du fügst die Einheit hinzu:
Code: Alles auswählen
val EQARichtungZahl = Mercedes_Benz_EQA_Heading_Angle.state as Number
if(EQARichtungZahl < 270|°) ...
In der Ausgangsrule gibt es diese Zeile:
Code: Alles auswählen
if (Mercedes_Benz_EQA_Heading_Angle.state < 239.1 && Mercedes_Benz_EQA_Heading_Angle.state > 237.9 && Mercedes_Benz_EQA_Door_Lock_Status.state = 0) {
= ist kein Vergleich, sondern eine Zuweisung. Mercedes_Benz_EQA_Door_Lock_Status.state = 0 bedeutet also eine Zuweisung des Wertes 0 zu ...state (was natürlich nicht funktioniert...) Auf Gleichheit prüft man mit ==.
Korrekt wäre der Vergleich so:
Code: Alles auswählen
val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as Number).floatValue
if(EQARichtungZahl < 239.1 && EQARichtungZahl > 237.9 && (Mercedes_Benz_EQA_Door_Lock_Status.state as Number).intValue == 0)
Code: Alles auswählen
val EQARichtungZahl = Mercedes_Benz_EQA_Heading_Angle.state as Number
if(EQARichtungZahl < 239.1|° && EQARichtungZahl > 237.9|° && (Mercedes_Benz_EQA_Door_Lock_Status.state as Number).intValue == 0)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
Re: Wie immer: Umwandlung von Werten
Wieder mal recht herzlichen Dank.
Und schon wieder viel gelernt.
Gut: der Vergleich "==" war glaube ich nur ein Fehler von mir... meist mache ich das auch mit "==" oder "!="....
Werde jetzt mal die Umformatierung beginnen.
Danke nochmals.
Gruß
Frank
Und schon wieder viel gelernt.
Gut: der Vergleich "==" war glaube ich nur ein Fehler von mir... meist mache ich das auch mit "==" oder "!="....
Werde jetzt mal die Umformatierung beginnen.
Danke nochmals.
Gruß
Frank