[OH2] Syntax bei Vergleichen mit Einheiten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Ezeqeel
Beiträge: 31
Registriert: 27. Okt 2020 08:16
Answers: 0

[OH2] Syntax bei Vergleichen mit Einheiten

Beitrag von Ezeqeel »

Hallo!
Ich kämpfe mit einer rule zur automatischen Beschattung.
Weil die Temperaturen und die Winkel Einheiten enthalten, scheinen die Vergleiche nicht zu funktionieren.
Hab schon einige Varianten ausprobiert, die man so findet. Richtig schlau bin ich aus dem Rechnen bzw. Umschreiben nicht geworden.
Hier die rule:

Code: Alles auswählen

rule "Verschattung"
when
    Item azimuth received update
then
    val maxTemp = 20|"°C"
    //
    if ( Rollo_ALL_1 == 0 && localDailyForecastHours03MaxTemperature >= maxTemp && azimuth >= 90.0|"°" && azimuth <= 110.0|"°" && elevation >= 30.0|"°" ) {
        logInfo("rolloshutdown" ,"Morgen - Beschattung Ost aktiviert")
        gRollerEast.sendCommand(80)
    }
    else if ( Rollo_ALL_1 == 0 && localDailyForecastHours03MaxTemperature >= maxTemp && azimuth >= 110.0|"°" && azimuth <= 130.0|"°" && elevation >= 30.0|"°" ) {
        logInfo("rolloshutdown" ,"Vormittag - Beschattung Süd-Ost aktiviert")
        Rollo_EG_Wohnzimmer.sendCommand(0)
        Rollo_EG_Esszimmer_S.sendCommand(80)
    }
    else if ( Rollo_ALL_1 == 0 && localDailyForecastHours03MaxTemperature >= maxTemp && azimuth >= 130.0|"°" && azimuth <= 230.0|"°" && elevation >= 30.0|"°" ) {
        logInfo("rolloshutdown" ,"Mittag - Beschattung Süd aktiviert")
        gRollerEast.sendCommand(0)
        gRollerSouth.sendCommand(80)
    }
    else if ( Rollo_ALL_1 == 0 && localDailyForecastHours03MaxTemperature >= maxTemp && azimuth >= 230|"°" && azimuth <= 250|"°" && elevation >= 30|"°" ) {
        logInfo("rolloshutdown" ,"Nachmittag - Beschattung Süd-West aktiviert")
        Rollo_EG_Esszimmer_S.sendCommand(0)
        Rollo_EG_Kueche_W.sendCommand(80)
    }
    else if ( Rollo_ALL_1 == 0 && localCurrentTemperature >= maxTemp && azimuth >= 250|"°" && azimuth <= 320|"°" && elevation >= 1|"°" ) {
        logInfo("rolloshutdown" ,"Abend - Beschattung West aktiviert")
        gRollerSouth.sendCommand(0)
        gRollerWest.sendCommand(80)
    }
    else
        logInfo("rolloshutdown" ,"Keine Beschattung erforderlich")
        Rollo_ALL_1.sendCommand(0)
end
Danke für einen Tipp dazu!

Ezeqeel
Beiträge: 31
Registriert: 27. Okt 2020 08:16
Answers: 0

Re: [OH2] Syntax bei Vergleichen mit Einheiten

Beitrag von Ezeqeel »

Hab meinen Fehler gefunden. Hab konsequent das .state vergessen.... :roll:

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

Re: [OH2] Syntax bei Vergleichen mit Einheiten

Beitrag von udo1toni »

Da sind ein paar Fehler in der Rule. Du vergleichst das Item mit einem Wert. Eigentlich willst Du aber den Status des Items vergleichen.
Du fragst die Gruppe Rollo_ALL_1 ab. Bist Du sicher, dass diese tatsächlich einen sinnvollen Wert liefert?
Du verwendest den Trigger received update, besser wäre changed.

Wenn Du die Einheit anhängst, sollte es nicht notwendig sein, die Einheit in Anführungszeichen zu setzen.
Alternativ kannst Du die Einheit auch loswerden. Da Du hier etliche Vergleiche ausführst, ist es ohnehin sinnvoll, lokale Konstanten zu verwenden.
Dadurch wird die Rule vorne etwas länger (weil man darauf achten muss, dass auch alles funktioniert wie geplant), dafür wird es hinten kürzer und schneller.

Code: Alles auswählen

rule "Verschattung"
when
    Item azimuth changed
then
    val Number maxTemp = 20
    var Number nMax3   = null
    var Number nMax0   = null
    var Number nElev   = null
    var Number nAzim   = null
    var Boolean bRoll  = false
    if(Rollo_ALL_1.state == 0) bRoll = true
    if(!(localDailyForecastHours03MaxTemperature.state instanceof Number)) {
        logWarn("shutter","Fehler! Forecast Temperatur fehlt!")
        return;
    }
    if(!(localCurrentTemperature.state instanceof Number)) {
        logWarn("shutter","Fehler! Aktuelle Temperatur fehlt!")
        return;
    }
    if(!(azimuth.state instanceof Number)) {
        logWarn("shutter","Fehler! Azimuth fehlt!")
        return;
    }
    if(!(elevation.state instanceof Number)) {
        logWarn("shutter","Fehler! Elevation fehlt!")
        return;
    }
    nMax3 = (localDailyForecastHours03MaxTemperature.state as Number).floatValue 
    nMax0 = (localCurrentTemperature.state as Number).floatValue 
    nElev = (elevation.state as Number).floatValue
    nAzim = (azimuth.state as Number).floatValue

    if(bRoll && nMax3 >= maxTemp && nAzim >= 90 && nAzim <= 110 && nElev >= 30) {
        logInfo("rolloshutdown" ,"Morgen - Beschattung Ost aktiviert")
        gRollerEast.sendCommand(80)
    } else if(bRoll && nMax3 >= maxTemp && nAzim >= 110 && nAzim <= 130 && nElev >= 30) {
        logInfo("rolloshutdown" ,"Vormittag - Beschattung Süd-Ost aktiviert")
        Rollo_EG_Wohnzimmer.sendCommand(0)
        Rollo_EG_Esszimmer_S.sendCommand(80)
    } else if(bRoll && nMax3 >= maxTemp && nAzim >= 130 && nAzim <= 230 && nElev >= 30) {
        logInfo("rolloshutdown" ,"Mittag - Beschattung Süd aktiviert")
        gRollerEast.sendCommand(0)
        gRollerSouth.sendCommand(80)
    } else if(bRoll && nMax3 >= maxTemp && nAzim >= 230 && nAzim <= 250 && nElev >= 30) {
        logInfo("rolloshutdown" ,"Nachmittag - Beschattung Süd-West aktiviert")
        Rollo_EG_Esszimmer_S.sendCommand(0)
        Rollo_EG_Kueche_W.sendCommand(80)
    } else if(bRoll && nMax >= maxTemp && nAzim >= 250 && nAzim <= 320 && nElev >= 1) {
        logInfo("rolloshutdown" ,"Abend - Beschattung West aktiviert")
        gRollerSouth.sendCommand(0)
        gRollerWest.sendCommand(80)
    } else {
        logInfo("rolloshutdown" ,"Keine Beschattung erforderlich")
        Rollo_ALL_1.sendCommand(0)
    }
end
Im ersten Teil werden die Variablen definiert. Falls die Items gültige Werte lieferden, werden die Variablen gefüllt. Andernfalls gibt es im Log eine Warnmeldung.
Der Status von Rollo_ALL_1 wird in einer Boolean Variable gespeichert. Im zweiten Teil erfolgt die Auswertung. Nun sind die Einheiten weg (weniger Schreibarbeit) und es geht auch nicht mehr um Itemstatus, sondern nur noch um lokale Variablen. Der Unterschied: die lokale Variable befindet sich direkt im Programmspeicher. der Status eines Items wird jedes Mal aufs Neue vom openHAB Bus erfragt. Das macht zum Schluss vielleicht nur ein paar Zehntel Sekunden Unterschied, aber ist dennoch sinnvoll.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten