Rule in bestimmten Zeiträumen ausführen ?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Rule in bestimmten Zeiträumen ausführen ?

Beitrag von Steinspiel »

Moin,

Ich möchte gern das eine Lampe nur zwischen 19:00 und 22:00 Uhr schaltet und das auch NUR wenn in diesem Zeitraum der LichtLevel des Bewegungsmelders einen bestimmten Wert hat.
Da mir das ganze "now.getHourOfDay" usw. zu kompliziert, unübersichtlich und unfelxibel ist habe ich ein Dummy Item angelegt das per cron um 19:00 Uhr EIN- und um 22:00 Uhr wieder AUSschaltet.

Die Rule hier funktioniert, aber natürlich nur um 19:00 Uhr wenn das Dummy Item einschaltet.

Code: Alles auswählen

rule "test_licht_1"

when   
        Item UHR_abend changed to ON                                            //Schalter 19:00 Uhr EIN 
then
        if(2000 > Hue_AmbientLight_Sensor1_LightLevel.state as Number) {        // Lichtlevel unter 2000
        LED_sock_gross_Power.sendCommand(ON)                                    //Licht AN
        }

end
Frage ich das Dummy Item aber z.B. jede Minute ab funktioniert es genau so wie ich will:

Code: Alles auswählen

rule "test_licht_2"

when   
        Time cron "0 0/1 * * * ?"                                                       // jede Minute
then

        if(LED_sock_gross_Power.state == ON){                                           // Licht schon AN -> Abbruch
        logInfo("test","Licht schon AN -> Abbruch.")
        return;
        }
            if(UHR_abend.state == ON) {                                                 // zwischen 19:00 und 22:00 Uhr
                if(2000 > Hue_AmbientLight_Sensor1_LightLevel.state as Number) {        // Lichtlevel unter 2000
                LED_sock_gross_Power.sendCommand(ON)                                    // Licht AN
                }
        }

end 
Trotzdem meine Fragen:
Ist es "egal" wenn openHAB (welches hier auf einem Raspi 4 läuft) quasi 1440/Tag eine Rule abarbeitet ? Oder sollte man das eleganter lösen und wenn ja wie?

Schönen Samstagabend noch...
bis dann, Steinspiel

EmptySoft
Beiträge: 188
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

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

Beitrag von EmptySoft »

Du kannst den Time Cron noch erweitern, dass er nur zwischen 19 und 22 Uhr läuft

Code: Alles auswählen

 Time cron "0 0/1 19-22 * * ?"
aber mit Time ist es sicher besser

Code: Alles auswählen

if(now(DateTimeZone.forID("Europe/Vienna")).getHourOfDay()>=19 && now(DateTimeZone.forID("Europe/Vienna")).getHourOfDay()<=22)
 {
 ...
 }
BYe
Harald

Tokamak
Beiträge: 168
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

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

Beitrag von Tokamak »

Wie oft ändert sich denn der Licht-Level Hue_AmbientLight_Sensor1_LightLevel bzw. das Item?

Dann könnte man erwägen, die Rule auf

Code: Alles auswählen

when
	Item Hue_AmbientLight_Sensor1_LightLevel changed
then
	...
triggern zu lassen und im Body dessen Wert und die Uhrzeit zu prüfen.

Denn eigentlich willst du das Licht einschalten, wenn ein bestimmter Licht-Wert unterschritten wird, allerdings nur in einem bestimmen Zeitraum.

Ja, dafür braucht man dann .getHoutOfDay() oder ähnliches. Aber mit

Code: Alles auswählen

	if ((Hue_AmbientLight_Sensor1_LightLevel.state as Number)<2000) {
		val stunde=now().getHourOfDay()
		if (stunde>=19 && stunde<22) {
			LED_sock_gross_Power.sendCommand(ON)
		}
	}
liest sich das doch wie eine Kurzgeschichte.

BTW, schaltest du das Licht um 22 Uhr wieder automatisch aus, wenn es automatisch eingeschaltet wurde?
Produktiv: Proxmox mit OH 3.4 und HABApp im LXC-Container
Entwicklung: Proxmox mit OH 4.1 und HABApp im LXC-Container

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

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

Beitrag von Steinspiel »

EmptySoft hat geschrieben: 24. Mai 2020 08:04 Du kannst den Time Cron noch erweitern, dass er nur zwischen 19 und 22 Uhr läuft
Das kannte ich noch nicht. Haut Super hin, genau das was ich suchte! Danke für den Tip.
aber mit Time ist es sicher besser
Wie erwähnt, ich mag das mit den Dummy Schaltern lieber. Für mich hat das auch den Vorteil das ich zu Testzwecken den Schalter einfach einschalte, egal ob es 19:00 Uhr ist oder nicht. ;-)
bis dann, Steinspiel

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

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

Beitrag von Steinspiel »

Moin,
Tokamak hat geschrieben: 24. Mai 2020 08:25 Wie oft ändert sich denn der Licht-Level Hue_AmbientLight_Sensor1_LightLevel bzw. das Item?
[...]
Alle 5 min.
BTW, schaltest du das Licht um 22 Uhr wieder automatisch aus, wenn es automatisch eingeschaltet wurde?
Meine Rule oben war nur ein ausgedünntes Beispiel. Eigentlich wird damit mein "Dämmerungskuschellicht" in der Wohnung geschaltet. Ausgeschaltet werden diese Lampen, sozusagen als letzte Handlung des Tages, zusammen mit der Nachttischlampe...
bis dann, Steinspiel

Tokamak
Beiträge: 168
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

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

Beitrag von Tokamak »

Steinspiel hat geschrieben: 24. Mai 2020 15:43 Alle 5 min.
Dann würde ich auf jeden Fall die obige Variante wählen, ein bisschen verbessert, damit sie um 19 Uhr ausgeführt einmalig ausgeführt wird:

Code: Alles auswählen

rule ""
when
	Item Hue_AmbientLight_Sensor1_LightLevel changed or
	Item UHR_Abend changed to ON
then
	if (UHR_Abend.state==ON && LED_sock_gross_Power.state!=ON && (Hue_AmbientLight_Sensor1_LightLevel.state as Number)<2000) {
		LED_sock_gross_Power.sendCommand(ON)
	}
end
Edit: UHR_Abend verwendet
Produktiv: Proxmox mit OH 3.4 und HABApp im LXC-Container
Entwicklung: Proxmox mit OH 4.1 und HABApp im LXC-Container

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

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

Beitrag von udo1toni »

Also, eigentlich ist es ein guter Weg, für die Uhrzeit hier ein Dummy zu verwenden. Die Rule sollte aber tatsächlich eher über die Änderung der Helligkeit getriggert werden, statt über Zeit, denn dieser Wert ist ja ausschlaggebend. Also so:

Code: Alles auswählen

rule "test_licht_2"
when   
    Item Hue_AmbientLight_Sensor1_LightLevel changed                      // bei Änderung der Helligkeit
then
    if(LED_sock_gross_Power.state == ON){                                 // Licht schon AN -> Abbruch
        logInfo("test","Licht schon AN -> Abbruch.")
        return;
    }
    if(UHR_abend.state == ON) {                                           // zwischen 19:00 und 22:00 Uhr
        if(2000 > Hue_AmbientLight_Sensor1_LightLevel.state as Number) {  // Lichtlevel unter 2000
           LED_sock_gross_Power.sendCommand(ON)                           // Licht AN
        }
    }
end 
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

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

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

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 24. Mai 2020 18:47 Also, eigentlich ist es ein guter Weg, für die Uhrzeit hier ein Dummy zu verwenden.
[...]
Ich habe Dein Post zwar gerade erst gelesen, aber letztendlich habe ich es gestern Abend fast genau so gemacht, und es funktioniert gut. Danke wieder einmal allen für die Hilfe! ;)
bis dann, Steinspiel

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

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

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 24. Mai 2020 18:47 Die Rule sollte aber tatsächlich eher über die Änderung der Helligkeit getriggert werden, statt über Zeit, denn dieser Wert ist ja ausschlaggebend.
Moin,

Wie ich gerade feststelle ist das in meinem Falle doch nicht so gut:
Ist, während der Dämmerzeit zwischen 19:00 und 22:00 Uhr, eine der zu schaltenden Lampen EINgeschaltet (LED_schra_gross_Power) während der LichtLevel triggert, bricht die Rule ab. Das ist auch so gewollt damit sich die Lichtfarbe usw nicht willkürlich ändert während man noch im Raum ist.

Verlässt jemand dann den Raum, schaltet zwischen 19:00 und 22:00 Uhr "LED_schra_gross_Power" wieder AUS und es ist schon dunkel, dann triggert der LichtLevel ja nicht mehr weil er ja "0.0" ist und sich während der Dunkelheit auch nicht ändert...

Code: Alles auswählen

rule "Bettlicht_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_BedTon_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
Da mangelt es mir jetzt doch an einer Idee... :shock:
bis dann, Steinspiel

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

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

Beitrag von udo1toni »

Jetzt wäre die Frage, was die Rule nun tatsächlich tun soll.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten