Seite 1 von 1

Fehler in Rule?

Verfasst: 9. Feb 2020 19:36
von dreamar
Hallo,

ich habe 2 Rules die komischerweise nicht funktionieren. Visusl Studio Code gibt keine Fehlermeldung aus und ich finde sie logisch.
Vielleicht kann mir einer den entscheidenen Hinweis geben.

Code: Alles auswählen

rule "Rolos runter nach Helligkeit"  //-----funktioniert-
when 
    Item phoscon_Bewegungsmelder_lightlux received update
then 
    val lux = (phoscon_Bewegungsmelder_lightlux.state as QuantityType<Number>)
    if (lux < 20 && IT_Rollo_Auto_Manuell_Betrieb == ON && IT_EG_Rollo_HWR_Fenster_Status.state == 2){
        IT_EG_Rollo_Zentral_Ab.sendCommand(ON)
        IT_OG_Rollo_Zentral_Ab.sendCommand(ON)
    }
end

Code: Alles auswählen

rule "Seitenbeleuchtung AN durch Bewegungsmelder"
when
    Item phoscon_Bewegungsmelder_presence changed to ON
then
    val lux = (phoscon_Bewegungsmelder_lightlux.state as QuantityType<Number>)
    if (lux < 10 && Seitenbeleuchtung.state == OFF){
       Seitenbeleuchtung.sendCommand(ON)
    }
    
end

Re: Fehler in Rule?

Verfasst: 9. Feb 2020 20:07
von udo1toni
Es gibt gleich zwei entscheidende Fehler.
1. In der ersten Rule im if-Statement, IT_Rollo_Auto_Manuell_Betrieb == ON muss es IT_Rollo_Auto_Manuell_Betrieb.state == ON heißen.
2. Du versuchst, dem Item phoscon_Bewegungsmelder_lightlux, welches vermutlich als UoM Item definiert ist, die Einheit zu nehmen. openHAB ist aber total schlau und ergänzt sofort die Einheit. Korrekt funktioniert es so:
val lux = (phoscon_Bewegungsmelder_lightlux.state as QuantityType<Number>).floatValue

.floatValue befreit den Wert zuverlässig von der Einheit. (.intValue ebenso, aber wir wollen ja weiterhin einen genauen Zahlenwert haben...)
Es wäre allerdings anzuraten, vorher zu prüfen, ob das Item überhaupt einen gültigen Wert enthält:

Code: Alles auswählen

var lux = 20
if(phoscon_Bewegungsmelder_lightlux.state instanceof Number)
    lux = (phoscon_Bewegungsmelder_lightlux.state as QuantityType<Number>).floatValue
lux muss außerhalb des if-Statements definiert werden, da eine Definition innerhalb des if-Statements außerhalb nicht gültig ist. Alternativ ginge auch ein ternärer Operator:

Code: Alles auswählen

val lux = if(phoscon_Bewegungsmelder_lightlux.state instanceof Number) (phoscon_Bewegungsmelder_lightlux.state as QuantityType<Number>).floatValue else 20

Re: Fehler in Rule?

Verfasst: 9. Feb 2020 21:17
von dreamar
Vielen Dank an udo1toni, hat alles geklappt.