Seite 1 von 2
Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 23. Mai 2020 19:52
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...
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 08:04
von EmptySoft
Du kannst den Time Cron noch erweitern, dass er nur zwischen 19 und 22 Uhr läuft
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)
{
...
}
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 08:25
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?
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 15:40
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.

Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 15:43
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...
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 16:55
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
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 24. Mai 2020 18:47
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
Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 25. Mai 2020 07:55
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!

Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 25. Mai 2020 21:42
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...

Re: Rule in bestimmten Zeiträumen ausführen ?
Verfasst: 26. Mai 2020 01:16
von udo1toni
Jetzt wäre die Frage, was die Rule nun tatsächlich tun soll.