Rule in bestimmten Zeiträumen ausführen ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 26. Mai 2020 01:16 Jetzt wäre die Frage, was die Rule nun tatsächlich tun soll.
Da ich hier über kurz oder lang sowieso Fragen dazu haben werde, werde ich das mal etwas ausführlicher beschreiben:

Zwei Rules, drei Räume und zusammen sechs Leuchten.
Die drei Leuchten in Raum B sind in so fern besonders weil sie zusammen an einer Lampe hängen (eine Lampe mit drei Leuchten eben). In Raum B befindet sich zudem noch ein Hue Bewegungsmelder, der auch den LichtLevel liefert.

Rule 1 Bewegungsmelder:

Wechselt der Status des BWM (ganztägig), wird geprüft ob der Lichtlevel unter 3000 liegt, wenn ja
wird geprüft ob Leuchte B3 AN ist (da sie NICHT einzeln zu schalten ist, bedeutet das, das die ganze Lampe per App oder Sprachsteuerung EIN geschaltet wurde und kein "BWM-Licht" gebraucht wird).
Ist dies der Fall werden zur Sicherheit B1, B2 und B3 auf den gleichen Prozentwert gedimmt.
Ist dies NICHT der Fall und der BWM hat den Status "ON" wird B1 EIN geschaltet, ein Timer von 12 sec gesetzt und anschließend wieder AUS geschaltet.

Bei der Rule hast Du mir damals geholfen und sie funktioniert auch (fast) Tadellos. Also alles bestens! ;-)

Rule 2 Abendlicht:

Bisher habe ich A1, A2 und C1 per Cron um 21:00 EIN geschaltet und wenn ich irgendwann nachts C1 AUS schalte, schalten sich A1 und A2 auch aus.
Das will ich nun zum einen erweitern und zum anderen auch per LichtLevel auslösen...:

Sinkt abends zwischen 19:00 und 22:00 Uhr der LichtLevel auf unter 2500 sollen
A1, A2, B2, und C1 EIN geschaltet werden (letztendlich gedimmt und in besonderer Farbe, aber das ist erst einmal unerheblich!)

Bild

Raum A: ist A2 schon EIN geschaltet soll nichts weiter passieren
Raum B: ist B3 EIN geschaltet (und somit wieder die ganze Lampe) soll auch nichts weiter passieren.
Problem 1: ist B3 AUS und B2 wird dann EIN geschaltet darf B1 in dieser Zeit ja NICHT vom BWM geschaltet werden! Erst wenn alle Leuchten in Raum B AUS sind, soll der BWM wieder schalten.
Raum C: C1 ist garantiert AUS und wird einfach nur EIN geschaltet. Schalte ich später C1 AUS, werden A1, A2 und B2 mit AUS geschaltet und der BWM soll wieder aktiv werden.

Problem 2 und IMO das Hauptproblem: Sind A2 und B3 ab 19:00 Uhr EIN geschaltet und somit von der Abendlichtrule unbehelligt und werden irgendwann bei Dunkelheit (LichtLevel 0) wieder ausgeschaltet, WIE würde dann das "Abendlicht" eingeschaltet? Bei Raum A kann ich mir das ja noch vorstellen: Wenn LichtLevel 0, alle Leuchten AUS und zwischen 19:00 und 22:00 Uhr....
Aber Raum B, wo der BWM zwischenfunkt...?

Lange Rede kurzer Sinn: das ist mein Vorhaben und über ein paar Denkanstöße würde ich mich freuen. Ich poste mal die beiden Rules mit denen ich schon arbeite, allerdings heißen da die Leuchten nicht A1, A2 usw. sondern haben ihre wirklichen Item Namen was zugegeben etwas verwirrend ist.

Danke fürs lesen,

Code: Alles auswählen

rule "Nachtlicht_ein"

when   
        Item Hue_AmbientLight_Sensor1_LightLevel changed                                                // LichtLevel wechselt

then
        if(UHR_abend.state == OFF){                                                                     // Abendschalter 19:00 - 22:00 AUS ? -> Abbruch
        logInfo("Bettlicht","Abbruch -> noch nicht 19:00")
        return;
        }


        if(LED_schra_gross_Power.state == ON) {                                                         // Schranklicht AN ? -> Abbruch
        logInfo("Bettlicht","Abbruch -> LED Schrank ist eingeschaltet ---")                            
        return;        
        }

        if(2500 > Hue_AmbientLight_Sensor1_LightLevel.state as Number) {                                // wenn LichtLevel unter 2500 ist
        
                LED_sock_gross_Power.sendCommand(ON)                                                    // Sockellicht AN
                logInfo("Bettlicht","LED Sockel gross wurde eingeschaltet ---")                           

                LED_schra_gross_Power.sendCommand(ON)                                                   // Schranklicht AN
                logInfo("Bettlicht","LED Schrank gross wurde eingeschaltet ---")       

                Hue_BedRon_Color.sendCommand("26,99,33")                                                // HUE Bettlich AN, "Nachtlicht", 33%


                verz_farbe?.cancel                                                                      // evtl. laufenden Timer abbrechen
                verz_farbe = createTimer(now.plusSeconds(2), [|                                         // Timer auf 2 sec setzen

                        LED_sock_gross_Color.sendCommand("120.0000035762786865234375000,100,2")         // LED Farbe ändern                           
                        logInfo("Bettlich","LED Sockel gross FARBE gesetzt ---")                         

                        LED_schra_gross_Color.sendCommand("120.0000035762786865234375000,100,2")        // LED Farbe ändern                                                
                        logInfo("Bettlicht","LED Schrank gross FARBE gesetzt ---")               
                
                verz_farbe = null                                                                       // Timer wieder auf NULL setzen                            
        
        ]
        )
        }

end

Code: Alles auswählen

var Timer tBewegung = null                                                  // Timervariable definieren


rule "BWM ganztags"

when
    Item Hue_MotionSensor1_Presence changed                                                         // Bewegung wurde erkannt
then
    logInfo("PROD_BW_flur_rules","BWM -> Bewegung erkannt.")
    
    if
            (3000 < Hue_AmbientLight_Sensor1_LightLevel.state as Number) {                          // Abfrage des Bewegungsmelders wie hell es ist           
            logInfo("PROD_BW_flur_rules","BWM -> kein Licht, Light Level ueber 3000.")              // Log Info
                return;
        }

            if
                (Hue_Flur3_Brightness.state > 0) {                                                      // Abfrage ob Flur1 schon an ist, wenn ja ->

                Hue_Flur1_Brightness.sendCommand(70)                                                    // Flur_1 auf 50 % Dimmen
                Hue_Flur2_ColorTemperature.sendCommand(70)                                              // Flur_2 auf 50 % Dimmen
                Hue_Flur3_Brightness.sendCommand(70)                                                    // Flur_3 auf 50 % Dimmen
                logInfo("PROD_BW_flur_rules","BWM -> Flurlicht ist bereits eingeschaltet.")
                return;
        }


                tBewegung?.cancel                                                                   // zunächst eventuell laufende Timer entfernen

                if(Hue_MotionSensor1_Presence.state == ON){                                         // Falls Bewegung
                Hue_Flur1_Brightness.sendCommand(10)                                                    // Licht an
                logInfo("PROD_BW_flur_rules","BWM -> Flur kleines Licht AN.")

    
               
        }      
                
                else                                                                                // sonst
                tBewegung = createTimer(now.plusSeconds(12), [|                                     // Timer auf 12 sec anlegen
                Hue_Flur1_Power.sendCommand(OFF)                                                        // und nach Ablauf Licht aus
                logInfo("PROD_BW_flur_rules","BWM -> Timer -> Flur kleines Licht AUS.")


    
    ]) 
    

end
bis dann, Steinspiel

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

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von udo1toni »

Ich fürchte, es geht schon mit den Begrifflichkeiten los. Also ganz offiziell (man greife nach einem Prospekt des Lieblingsbaumarkts) Heißen die Lampen Leuchten (z.B. eine Stehleuchte, eine Deckenleuchte (Kronleuchter) oder auch eine Schreibtischleuchte. In dieser Leuchte befindet sich das, was das Licht macht, das heißt ganz offiziell Lampe. Früher hat man gerne von einer Birne gesprochen ;) , die hatten gewöhnlich ein E27 Schraubgewinde. Das finden wir bei der Hue wieder, die Hue ist also eine Lampe (und wird in eine Leuchte geschraubt.

Ich höre schon das Augenrollen ;) aber gerade in diesem Fall ist es wichtig, sich ob der Begrifflichkeiten einig zu sein.

Was ich verstanden zu haben glaube: Die drei Lampen B1 bis B3 befinden sich in einer Leuchte, die nicht dauerhaft mit Strom versorgt wird. Die Stromversorgung kann nur gemeinsam für alle drei Lampen geschaltet werden. Die einzelnen Lampen sollen aber ansonsten unabhängig voneinander gesteuert werden.

Was ich nicht verstehe: Wen Du die Lampen A1 und A2 einschaltest, wenn es dunkel wird, und ausschaltest, wenn C1 ausgeschaltet wird, warum sollten dann A1 und A2 trotzdem wieder eingeschaltet werden? Schließlich wurden sie ja willentlich ausgeschaltet. Ich denke, da hast Du einen Denkfehler, denn entweder darf das Licht nicht ausgeschaltet werden (mit minütlichem Trigger würde das Licht nach dem Ausschalten spätestens nach einer Minute wieder eingeschaltet, sofern Uhrzeit und Helligkeit noch passen) - warum sollte man also das Licht überhaupt ausschalten?
Sollte das Licht aber z.B. über den Bewegungsmelder gesteuert werden (unter der Voraussetzung, dass Helligkeit und Uhrzeit passt), spielt die Nicht-Änderung der Helligkeit keine Rolle mehr. Meine Vermutung ist daher, dass einfach der Trigger Helligkeit allein nicht ausreichend ist, andererseits aber ein minütlicher Trigger nicht zielführend sein kann.

Die ganze Angelegenheit mit Deinen Regeln ist recht komplex, vermutlich wäre es sinnvoll, dazu eine Statemachine zu erstellen. Also zunächst festhalten, welche Änderungen auf der einen Seite welche Änderungen auf der anderen Seite auslösen sollen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 26. Mai 2020 23:26 man greife nach einem Prospekt des Lieblingsbaumarkts
Manchmal gibt es Zufälle..! ;-)

Beim schreiben dachte ich das der Begriff "Birne" ähnliche Reaktionen wie "Zollstock" auslösen könnte, deshalb hatte ich wahllos als Suchbegriffe "hornbach" und "stehlampe" (so nennt man die Dinger hier) eingegeben und bin bei einer Phillips Stehlampe gelandet, bei der Leuchtmittel nicht inklusive sind. Wirklich!!! ;-)
Einfache Nummer dachte ich: "Leuchtmittel" sind dann "Leuchten" und ne "Lampe" ist ja sowieso schon ne "Lampe"... ;-)
Ich höre schon das Augenrollen
Ick weeß nich wat De meenst! ;-)

Begrifflichkeiten: Ich denke wir bleiben bei Deinen Begriffen: was von der Decke hängt ist eine Leuchte und da werden dann Lampen rein geschraubt, OK?

Zwei Dinge vorweg:
- ein Großteil von den Sachen die ich oben aufgezählt habe läuft bereits erfolgreich, ich will das nur um die Geschichte mit dem LichtLevel und die zusätzliche "B2 Nachtleuchte" ergänzen. Letzteres ist mir am wichtigsten, vieleicht kannst Du mir dabei ja erstmal etwas zur Seite stehen?
Ob der Auslöser von allem dann später der LichtLevel oder ein CronJob ist lässt sich IMO immer noch ändern.

- so im Nachhinein denke ich das mein "A1", "B2" usw. für einen Außenstehenden ziemlich abstrakt ist, deshalb habe ich das nochmal überarbeitet und mehr der Wirklichkeit angepasst.

Bild

Also, Lampen/LED Verteilung in den drei Zimmern wie auf dem neuen Bild ersichtlich. Wobei die drei Lampen im Flur in einer Leuchte sind die in der Regel per Sprachbefehl alle drei zusammen EIN und AUS geschaltet werden (z.B."...Flur AN").
Der Bewegungsmelder im Flur schaltet, je nach LichtLevel, die Lampe "F1" im Flur für 12 sec AN, wobei er vorher prüft ob die Lampe "F3" AN oder AUS ist. Ist sie AN bedeutet das ja, das die ganze Leuchte EIN geschaltet ist und es wird kein "Bewegungsmelder Licht" gebraucht.

Meine "Nachtlicht EIN" Rule, schaltet bei einem bestimmten LichtLevel zwischen 19:00 und 22:00 UHR die beiden Küchen LED`s und das Schalfzimmerlicht ein, soweit das Grundgerüst!

Nun möchte ich das die "Nachtlicht EIN" Rule auch die Lampe "F2" im Flur mit einschaltet, mein Problem dabei ist:
Wie kriege ich das in der "Bewegungsmelder" Rule unter das, solange nach 19:00 nur die "F2" AN ist, der Bewegungsmelder nicht schaltet?

Weißt Du was ich meine und vor allem, konnte ich das halbwegs rüber bringen?

schönen Abend noch...
bis dann, Steinspiel

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von Steinspiel »

Ich weiß nicht wie, aber könnte die "Abendlicht" Rule beim schalten von "F2" nicht eine Variable (?) setzen anhand der die "Bewegungsmelder" Rule erkennt das der Bewegungsmelder nicht schalten soll?
Funktionieren Variablen überhaupt über einzelne *.rules Dateien hinaus?
bis dann, Steinspiel

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

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von udo1toni »

Na, aber ob F2 an ist, kannst Du ja einfach in der Rule prüfen? if(f2.getStateAs(OnOffType) != OFF)
Und ob die anderen beiden Aus sind, geht genauso, nur eben andersrum.
Ich würde vermutlich eine Rule in der Art bauen:

Code: Alles auswählen

wenn Bewegung erkannt
dann
falls F3 an -> rule abbrechen
falls F2 an und nach 19 Uhr -> rule abbrechen (sollte es an dieser Stelle überhaupt noch eine Rolle spielen, ob F1 oder F3 an sind?
falls F1 an -> rule abbrechen
Zu diesem Zeitpunkt ist klar, dass keine der Lampen aktiv ist, also Licht an und Timer starten
Falls getStateAs(OnOffType) nicht funktionieren sollte (unwahrscheinlich), kannst Du natürlich auch das Color Item selbst nutzen und im HSBType auf B > 0 testen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von Steinspiel »

Moin,

Danke, ich werde es versuchen, berichten und bestimmt neue Fragen haben ;) .
Allerdings erst Anfang kommender Woche...

Ganz kurz noch was:
if(f2.getStateAs(OnOffType) != OFF)
Ist das was anderes als "if(F2.state == OFF)" ?

Bis dann und frohe Pfingsten...
bis dann, Steinspiel

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

Re: Rule in bestimmten Zeiträumen ausführen ?

Beitrag von udo1toni »

Ja.

f2 ist nicht F2, damit geht's schon mal los...
== ist das Gegenteil von != (das eine heißt true falls gleich, das andere heißt true falls nicht gleich)
und Schließlich gehe ich davon aus, dass es sich bei F2 um ein Color Item handelt. Entsprechend liefert .state immer eine Zahlenfolge wie z.B. 35,17,15.
NIEMALS wird .state für ein Color Item OFF oder ON liefern.
Mittels .getStateAs(Typ) hingegen bekommt man den Status soweit möglich im gewünschten Typ, in diesem Fall also als OnOffType, entsprechend kann man auf ON bzw. OFF testen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten