if Auswertung finktioniert nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Joerg
Beiträge: 44
Registriert: 2. Jan 2020 10:38
Answers: 0

if Auswertung finktioniert nicht

Beitrag von Joerg »

Hallo,
folgende Auswertung der Bedingung funktioniert nicht, aber warum?

Code: Alles auswählen

if ((Startstunde_1.state as Number).intValue() < 10)
  val String St_H_1 = "0" + (Startstunde_1.state as Number).intValue().toString  // Item Startstunde 1 im HabPanel wenn unter 10
else
  val String St_H_1 = (Startstunde_1.state as Number).intValue().toString  // Item Startstunde 1 im HabPanel
Kann mich da wer beraten :-)
Vielen Dank
Gruß Jörg

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

Re: if Auswertung finktioniert nicht

Beitrag von udo1toni »

Die Auswertung wird schon funktionieren, aber anschließend existiert die Variable St_H_1 dennoch nicht.
Das liegt daran, dass der Geltungsbereich der Definition sich nur auf den aktuellen Kontext bezieht, also entweder auf den if-Teil oder den else-Teil.

Korrekt geht es so:

Code: Alles auswählen

val String St_H_1 = if((Startstunde_1.state as Number).intValue < 10) "0" else "" + Startstunde_1.state.toString
Wenn man statt einer Konstanten eine Variable einsetzt wäre dies eine mögliche Variante:

Code: Alles auswählen

var String St_H_1 = ""
if((Startstunde_1.state as Number).intValue < 10) St_H_1 = "0" 
St_H_1 = St_H_1 + Startstunde_1.state.toString
Allerdings ginge es einfacher so:

Code: Alles auswählen

val String St_H_1 = String.format("%02d",(Startstunde_1.state as Number))
Der Wert wird als formatierter String ausgegeben, dabei ist 0 das Füllzeichen, 2 ist die Anzahl Stellen, die auf jeden Fall angezeigt werden und d fügt den übergebenen Wert als Integer ein.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Joerg
Beiträge: 44
Registriert: 2. Jan 2020 10:38
Answers: 0

Re: if Auswertung finktioniert nicht

Beitrag von Joerg »

Vielen Dank für deine Mühe!
Das mit den Geltungsbereichen kenne ich von anderen Programmiersprachen. Dort aber nur innerhalb einer Funktion. Das es sowas auch innerhalb einer Schleife oder Bedingung gibt, kannte ich bisher nicht.
Die erste deiner Lösungen ist gedanklich für mich absolut nicht nachvollziehbar, zu hoch für mich. Wird eine if gehändelt wie eine Funktion? Warum muß da dann kein "return St_H_1" oder sowas stehen?
Die letzte funktioniert bei mir nicht. Die Richtung hatte ich schon probiert, habe aber keinen Erfolg gehabt mit der Formatierung. Die Fehlermeldung hier ist:

Code: Alles auswählen

ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID '5ebabac754' failed: d != org.openhab.core.library.types.DecimalTypee]
Die goldene Mitte ist mein Ding. Zwar etwas länger, aber sie funktioniert und ich verstehe sie auch morgen noch. :D

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

Re: if Auswertung finktioniert nicht

Beitrag von udo1toni »

Joerg hat geschrieben: 8. Dez 2023 08:23 Das mit den Geltungsbereichen kenne ich von anderen Programmiersprachen. Dort aber nur innerhalb einer Funktion. Das es sowas auch innerhalb einer Schleife oder Bedingung gibt, kannte ich bisher nicht.
Das ist eigentlich der normale Weg. Jede bedingte Verzweigung erschafft einen neuen Kontext. Um mehr als einen Befehl im Kontext ausführen zu können, muss der Kontext sogar mit {} als Block markiert werden. Meines Wissens arbeiten alle (modernen) objektorientierten Programmiersprachen kontextbezogen. Bei vielen Sprachen fällt das nicht auf, weil man eh gelernt hat, alle Variablen und Konstanten zu Beginn der Funktion zu definieren :)
Joerg hat geschrieben: 8. Dez 2023 08:23 Die erste deiner Lösungen ist gedanklich für mich absolut nicht nachvollziehbar, zu hoch für mich. Wird eine if gehändelt wie eine Funktion? Warum muß da dann kein "return St_H_1" oder sowas stehen?
Das ist ein ternärer Operator. Die allgemeine Form lautet

Code: Alles auswählen

a = if(b) c else d
Also, Falls b wahr ist, setze a = c, ansonsten a = d. Der ternäre Operator ist z.B. auch als Toggle sehr praktisch:

Code: Alles auswählen

Licht.sendCommand(if(Licht.state != ON) ON else OFF)
Sende einen Befehl an das Item Licht, falls der aktuelle Status von Licht nicht ON ist, sende ON, ansonsten OFF.
Joerg hat geschrieben: 8. Dez 2023 08:23 Die letzte funktioniert bei mir nicht. Die Richtung hatte ich schon probiert, habe aber keinen Erfolg gehabt mit der Formatierung.
Hmmm... kann natürlich sein, dass Du noch ein .intValue ergänzen musst. Alternativ könnte man auch mit Float arbeiten:

Code: Alles auswählen

val String St_H_1 = String.format("%02d",(Startstunde_1.state as Number).intValue) // erzwinge Integer
val String St_H_1 = String.format("%02.0f",(Startstunde_1.state as Number)) // Verwende Float mit 0 Nachkommastellen
Die verwendeten Datentypen sind leider oft nicht einfach nachzuvollziehen (also zumindest, wenn man - wie ich auch - als ambitionierter Laie unterwegs ist).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Joerg
Beiträge: 44
Registriert: 2. Jan 2020 10:38
Answers: 0

Re: if Auswertung finktioniert nicht

Beitrag von Joerg »

Ah, jetzt habe ich das mit dem Operator verstanden, vielen Dank für die Erklärung.
Laie ... is klar :D :D :D

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

Re: if Auswertung finktioniert nicht

Beitrag von udo1toni »

Joerg hat geschrieben: 11. Dez 2023 14:04 Laie ... is klar :D :D :D
Ambitioniert... Ich habe schon erkannt, dass ich kein blutiger Anfänger mehr bin ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten