Seite 1 von 1

if Abfrage Astro Binding in rule

Verfasst: 3. Jul 2022 20:50
von galaxisspatz
Moin,
ich habe eine Rule die bei mir im Flur das Licht steuert, diese ist bisher auch ohne Probleme gelaufen. Seit ein paar Tagen wird die Abfrage

Code: Alles auswählen

if (AstronomischeSonnendatenPhaseName.state !="DAYLIGHT" || AstronomischeSonnendatenPhaseName.state !="SUN_SET" || AstronomischeSonnendatenPhaseName.state !="CIVIL_DUSK" || AstronomischeSonnendatenPhaseName.state !="NOON" )
komplett ignoriert, das heißt unabhänig was "AstronomischeSonnendatenPhaseName" für einen Wert hat wird der Vergleich mit true gewertet und das Licht geht an (rund um die Uhr).

Code: Alles auswählen

    rule "FlurOben Bewegung"
    when
        Item BewegungFlurObenAnwesendPresence received update ON
    then
        tFlurOben?.cancel
        if(SchalterdummyFlurOben !=ON){
            if(ShellyFlurObenRelayOutput.state != ON){
                ShellyFlurObenRelayOutput.sendCommand(ON)
            }
            if (AstronomischeSonnendatenPhaseName.state !="DAYLIGHT" || AstronomischeSonnendatenPhaseName.state !="SUN_SET" || AstronomischeSonnendatenPhaseName.state !="CIVIL_DUSK" || AstronomischeSonnendatenPhaseName.state !="NOON" ){
                if (new DateTimeType().zonedDateTime.getHour() >=19 || new DateTimeType().zonedDateTime.getHour() <=7){
                    if (new DateTimeType().zonedDateTime.getHour() >=23 || new DateTimeType().zonedDateTime.getHour() <=6){
                        LichtFlurOben1Brightness.sendCommand(1)
                        LichtFlurOben1ColorTemperature.sendCommand(100)
                        tFlurOben = createTimer(now.plusSeconds(12), [| 
                        FlurObenLightGroupSwitch.sendCommand(OFF)
                        ])
                    }               
                    else
                        if(FlurObenLightGroupSwitch.state != ON){
                            LichtFlurOben1Brightness.sendCommand(1)
                            LichtFlurOben1ColorTemperature.sendCommand(100)
                            tFlurOben = createTimer(now.plusSeconds(20), [| 
                            FlurObenLightGroupSwitch.sendCommand(OFF)
                            ])
                        }    
                }                     
                else
                    if(FlurObenLightGroupSwitch.state != ON){
                        LichtFlurOben2Brightness.sendCommand(10)
                        LichtFlurOben2ColorTemperature.sendCommand(60)
                        tFlurOben = createTimer(now.plusSeconds(20), [| 
                        FlurObenLightGroupSwitch.sendCommand(OFF)
                        ])
                    }
            }   
        }
    end
Danke für eure Hilfe
Olaf

Re: if Abfrage Astro Binding in rule

Verfasst: 4. Jul 2022 20:03
von udo1toni
Nein, nicht seit kurzem, schon immer. Deine Bedingung lautet übersetzt: " Falls a ungleich 1 ODER a ungleich 2 ODER a ungleich 3 ODER a ungleich 4" Wenn a = 1 ist, ist es ungleich 2,3 und 4. Gleiches gilt sinngemäß für alle anderen Varianten. Es sind immer mindestens drei der vier Bedingungen erfüllt. Du möchtest, dass keine der Bedingungen zutreffen darf. Es gibt dafür verschiedene Möglichkeiten, z.B. aus dem != jeweils ein == machen.

Aber zuerst mal: Bei diesem Ausdruck: AstronomischeSonnendatenPhaseName.state lohnt definitiv die Übernahme in eine lokale Konstante, schon um die Lesbarkeit zu erhöhen.
Auch im Rest der Rule verwendest Du unnötig komplizierte Ausdrücke, bei denen ich mir nicht sicher bin, ob sie jemals funktioniert haben.
Statt new DateTimeType().zonedDateTime kannst Du einfach now schreiben, aber auch hier nutzt Du vier mal den selben Ausdruck, was nach einer lokalen Konstante schreit.
getHour() liefert einen Integer Wert zwischen 0 und 23, eben die Stunde einer Digitaluhr. >= 23 kann also ohne Verlust auf == 23 geändert werden, alle anderen <= und >= Vergleiche können durch einfach > und < Vergleiche ersetzt werden.

Schau mal, ob das Deinem Wunschverhalten entspricht (Rule leicht optimiert):

Code: Alles auswählen

var Timer tFlurOben = null                                                                                  // Definition der Timer Variable global vor der ersten Rule

rule "FlurOben Bewegung"
when
    Item BewegungFlurObenAnwesendPresence received update ON
then
    tFlurOben?.cancel                                                                                       // Timer löschen, falls vorhanden
    if(SchalterdummyFlurOben.state == ON)                                                                   // Falls manuell an
        return;                                                                                             // Abbruch

    if(ShellyFlurObenRelayOutput.state != ON)                                                               // falls Relais nicht an
        ShellyFlurObenRelayOutput.sendCommand(ON)                                                           // Schalte Relais an

    val String strPhase = AstronomischeSonnendatenPhaseName.state.toString                                  // hole Status als String und speichere in lokaler Konstante

    if(strPhase == "DAYLIGHT" || strPhase == "SUN_SET" || strPhase == "CIVIL_DUSK" || strPhase == "NOON" )  // falls einer der Werte zutrifft
        return;                                                                                             // Abbruch

    val Integer iHour = now.getHour                                                                         // hole aktuelle Stunde und speichere in lokaler Konstante
    if (iHour > 18 || iHour < 8) {                                                                          // falls größer 18 oder kleiner 8 (zwischen 19:00:00 Uhr und 7:59:59 Uhr)
        if (iHour == 23 || iHour < 7) {                                                                     // falls = 23 oder kleiner 7 (zwischen 23:00:00 Uhr und 6:59:59 Uhr)
            LichtFlurOben1Brightness.sendCommand(1)                                                         // Schalte Oben1Helligkeit auf 1
            LichtFlurOben1ColorTemperature.sendCommand(100)                                                 // Schalte Oben1Farbtemperatur auf 100
            tFlurOben = createTimer(now.plusSeconds(12), [|                                                 // Starte Timer für 12 Sekunden
                FlurObenLightGroupSwitch.sendCommand(OFF)                                                   // Nach Ablauf, sende OFF an die Gruppe
            ])
        } else if(FlurObenLightGroupSwitch.state != ON) {                                                   // zwischen 19 Uhr und 23 Uhs sowie zwischen 7 Uhr und 8 Uhr, falls Gruppe nicht ON
            LichtFlurOben1Brightness.sendCommand(1)                                                         // Schalte Oben1Helligkeit auf 1
            LichtFlurOben1ColorTemperature.sendCommand(100)                                                 // Schalte Oben1Farbtemperatur auf 100
            tFlurOben = createTimer(now.plusSeconds(20), [|                                                 // Starte Timer für 20 Sekunden
                FlurObenLightGroupSwitch.sendCommand(OFF)                                                   // Nach Ablauf, sende OFF an die Gruppe
            ])
        }
    } else if(FlurObenLightGroupSwitch.state != ON) {                                                       // zwischen 8 Uhr und 19 Uhr, falls Grupope nicht ON
        LichtFlurOben2Brightness.sendCommand(10)                                                            // Schalte Oben2Helligkeit auf 10
        LichtFlurOben2ColorTemperature.sendCommand(60)                                                      // Schalte Oben2Farbtemperatur auf 100
        tFlurOben = createTimer(now.plusSeconds(20), [|                                                     // Starte Timer für 20 Sekunden
            FlurObenLightGroupSwitch.sendCommand(OFF)                                                       // Nach Ablauf, sende OFF an die Gruppe
        ])
    }
end

Re: if Abfrage Astro Binding in rule

Verfasst: 4. Jul 2022 22:22
von galaxisspatz
Hallo udo1toni,
danke für deine Antwort und besonders für deine Optimierungsvorschläge. Die Regel lief mehr als 1 Jahr zur Zufriedenheit aller. Ich werde deine Änderungen probieren und die Optimierung bei meinen anderen Regeln entsprechend umsetzten. Ich melde mich morgen und berichte.

Gruß
Olaf

Re: if Abfrage Astro Binding in rule

Verfasst: 5. Jul 2022 12:11
von udo1toni
Wie gesagt, die Bedingung über die verschiedenen Phasen des Sonnenstands hat definitiv noch nie ein anderes Ergebnis als true geliefert. Aber vielleicht hast Du an der Rule auch etwas geändert, ohne dass es Dir bewusst ist.

Re: if Abfrage Astro Binding in rule

Verfasst: 6. Jul 2022 19:44
von galaxisspatz
Hallo udo1toni,
es funktioniert und ja du hast recht die Regel wurde geändert, allerdings nicht von mir sondern von meiner Frau. Ursprünglich gab es nur die Abfrage nach Daylight: Meine Frau hatte es erweitert da sie es das Licht anders geschaltet haben wollte.
Erstens finde ich gut das sie anfängt sich damit zu beschäftigen und zweitens habe wir beide was gelernt.
Vielen Dank noch einmal

Case closed

Olaf

Re: if Abfrage Astro Binding in rule

Verfasst: 6. Jul 2022 22:10
von udo1toni
:) gerne

Toll, dass Deine Frau sich auch damit beschäftigt, und solche Fehler zu machen ist normal, das gehört dazu!