Regel mit Kostal binding Zahlen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

EnergyMax
Beiträge: 2
Registriert: 14. Jun 2022 19:35
Answers: 0

Re: Regel mit Kostal binding Zahlen

Beitrag von EnergyMax »

Vielen Dank udo1toni für die schnelle Rückmeldung. Ich nutze die ECMA Implementierung in OH 3 über das UI. Ich habe mir nun mittels der Blockly Implementierung den richtigen Code generieren lassen der für meine Anwendung passt. Dieser ist:

homeenergy = itemRegistry.getItem('MyPlentiCore70WithoutBattery_DEVICE_LOCAL_HOMECONSUMPTION_TOTAL').getState();

Dadurch bekommt die Variable homeenergy den Wert des Items zugewiesen und ich kann weitere mathematische Funktionen bilden.
Deinen Kommentar "Außerdem weist Du den beiden Konstanten dcpower und homeenergy einfach den Status als FloatValue zu" habe ich nicht ganz verstanden, da ich meinte das Beispiel aus dem früheren Verlauf des Thread einfach kopiert zu haben. Jedoch funktioniert bei mir der Code nicht wie zuvor beschrieben.

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

Re: Regel mit Kostal binding Zahlen

Beitrag von udo1toni »

Na, nehmen wir an, Du hast ein Number Item "MeinWert", welches im Status eine Zahl zwischen 0 und 10 hält. Dann wird

Code: Alles auswählen

meineVariable = itemRegistry.getItem('MeinWert').getState();
den Wert in die Variable schreiben.

Beim Systemstart hält das Item aber immer(!) den Status NULL (nicht 0!).
NULL ist keine gültige Zahl. Damit wird die Rule an dieser Stelle abbrechen und im Log tauchen etwa 30 Zeilen einer NullPointer Exception auf.
Ich bin mir nicht sicher, ob das auf ECMA auch zutrifft, aber in der DSL ist es so. Das Gegenstück in der DSL sähe so aus:

Code: Alles auswählen

meineVariable = MeinWert.state
Wenn die Variable unbestimmt ist, wird das noch nicht mal zu einer Fehlermeldung führen. Besser ist es aber (zumindest, wenn man anschließend mit dem Wert etwas anfangen will), zuerst zu prüfen, ob der Wert überhaupt zulässig ist:

Code: Alles auswählen

var Integer meineVariable = 0
if(MeinWert.state instanceof Number)
    meineVariable = (MeinWert.state as Number).intValue
Die Variable wird mit einem Wert vorbelegt. Anschließend wird geprüft, ob der Status eine gültige Zahl enthält. Ist das der Fall, so wird dieser Wert als Zahl nach Integer gewandelt und anschließend in der Variablen gespeichert.
Wenn nun der Code aufgerufen wird, bevor das Item einen gültigen Wert hält, so wird in der Variablen der Default Wert landen, also hier 0.

Natürlich kann man die Rule auch abbrechen, wenn kein gültiger Wert vorhanden ist, da kommt es auf den Anwendungsfall an.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten