Wie immer: Umwandlung von Werten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
fmmephisto

Wie immer: Umwandlung von Werten

Beitrag von fmmephisto »

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
von udo1toni » 29. Jan 2023 19:37
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:

Code: Alles auswählen

val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as QuantityType<Number>).floatValue
if(EQARichtungZahl < 270) ...
Dabei kann man in diesem Fall QuantityType<Number> auch verkürzt Number schreiben.

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|°) ...
Einige Beispiele dazu gibt es in der offiziellen Doku: https://www.openhab.org/docs/configurat ... umber-item

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) {
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:

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)
Wahlweise auch mit den Werten als Winkel mit Einheit:

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)
Gehe zur vollständigen Antwort

fmmephisto

Re: Wie immer: Umwandlung von Werten

Beitrag von fmmephisto »

Hier der Code dazu, der mich um den Verstand bringt und mich schon wieder knapp 6 Stunden Zeit gekostet hat... leider ergebnislos. :-)

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)
    }
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.

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Wie immer: Umwandlung von Werten

Beitrag von EmptySoft »

fmmephisto hat geschrieben: 29. Jan 2023 13:24 (Frage: Was ist der Unterschied zwischen val und var?)
var -> Variable (Wert veränderbar)
val -> Variable, Wert kann nur einmal gesetzt werden
BYe
Harald

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Wie immer: Umwandlung von Werten

Beitrag von EmptySoft »

fmmephisto hat geschrieben: 29. Jan 2023 13:24

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)
    }
probier einmal

Code: Alles auswählen

Mercedes_Benz_EQA_Heading_Angle.state as Number ....
BYe
Harald

fmmephisto

Re: Wie immer: Umwandlung von Werten

Beitrag von fmmephisto »

Hallo Harald!

Danke für die Erklärung für var und val. :)

Das mit "as Number" geht nicht.
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
Habe es mal ganz kurz damit versucht.
Ich bekomme eine Meldung mit "238.4 °"

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

Re: Wie immer: Umwandlung von Werten

Beitrag von udo1toni »

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:

Code: Alles auswählen

val EQARichtungZahl = (Mercedes_Benz_EQA_Heading_Angle.state as QuantityType<Number>).floatValue
if(EQARichtungZahl < 270) ...
Dabei kann man in diesem Fall QuantityType<Number> auch verkürzt Number schreiben.

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|°) ...
Einige Beispiele dazu gibt es in der offiziellen Doku: https://www.openhab.org/docs/configurat ... umber-item

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) {
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:

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)
Wahlweise auch mit den Werten als Winkel mit Einheit:

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

fmmephisto

Re: Wie immer: Umwandlung von Werten

Beitrag von fmmephisto »

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

Antworten