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.
Regel mit Kostal binding Zahlen
- udo1toni
- Beiträge: 15249
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Regel mit Kostal binding Zahlen
Na, nehmen wir an, Du hast ein Number Item "MeinWert", welches im Status eine Zahl zwischen 0 und 10 hält. Dann wird
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:
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:
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.
Code: Alles auswählen
meineVariable = itemRegistry.getItem('MeinWert').getState();
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
Code: Alles auswählen
var Integer meineVariable = 0
if(MeinWert.state instanceof Number)
meineVariable = (MeinWert.state as Number).intValue
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