Zeitschaltung nachträglich Astro-Binding

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53
Answers: 0

Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Hallo,

Ich habe es endlich geschafft und mit einem Selection Widged mehrere Zeitschaltungen meiner Lampe zugewiesen. Ich kann zwischen vier Uhrzeiten wählen und noch den "Automatik-Modus", wo die Lampe normal bei Sonnenuntergang eingeschaltet werden soll. Jetzt ist mir allerdings aufgefallen, dass wenn ich z.B. die Zeit "20 Uhr" ausgewählt habe und ich doch lieber den "Automatik-Modus" auswählen will, dann schaltet sich die Lampe nicht ein, wenn der Sonnenuntergang schon war. Dieser ist ja circa 16:30 Uhr. Der Schalter für den Sonnenuntergang wurde so verwirklicht:

Code: Alles auswählen

rule "Sonnenuntergang"
when 
    Channel 'astro:sun:home:set#event' triggered START
then 
    Cinema_Night.postUpdate(ON)
end 

rule "Sonnenaufgang"
when 
    Channel 'astro:sun:home:rise#event' triggered START
then 
    Cinema_Night.postUpdate(OFF)
end 
Meine Rules für die Lampe sehen so aus:

Code: Alles auswählen

rule "Stehlampe automatisch an 17:00 Uhr"
when 
    Time cron "0 00 17 ? * * *"
then 
    if(Stehlampe_Timer.state == 1){
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde um 18:00 Uhr eingeschaltet")
    }
end 

rule "Stehlampe automatisch an 18:00 Uhr"
when
    Time cron "0 00 18 ? * * *"
then 
    if(Stehlampe_Timer.state == 2){
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde um 18:00 Uhr eingeschaltet")
    }
end

rule "Stehlampe automatisch an 19:00 Uhr"
when
    Time cron "0 00 19 ? * * *"
then 
    if(Stehlampe_Timer.state == 3){
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde um 19:00 Uhr eingeschaltet")
    }
end

rule "Stehlampe automatisch an 20:00 Uhr"
when 
    Time cron "0 00 20 ? * * *"
then 
    if(Stehlampe_Timer.state == 4){
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde um 20:00 Uhr eingeschaltet")
    }
end

rule "Stehlampe automatisch an bei Sonnenuntergang"
when 
    Item Cinema_Night changed from OFF to ON
then 
    if(Stehlampe_Timer == 0){
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde bei Sonnenuntergang eingeschaltet")
    }
end
Jetzt stellt sich mir die Frage wieso sich das Licht nach dem Sonnenuntergang nicht einschaltet, wenn man es auch erst nach dem Sonnenuntergang auswählt. Habe es mit "received command" und mit "changed from .. to .." ausprobiert, nichts funktioniert.
Und da ich das Gefühl habe, dass man die ganzen Rules bestimmt auch kürzer gestallten kann, würde ich mich sehr über Tipps freuen.
von udo1toni » 6. Jan 2021 08:43
Du denkst zu kompliziert :)

Code: Alles auswählen

rule "Sonnenuntergang"
when 
    Channel 'astro:sun:home:set#event' triggered START
then 
    Cinema_Night.postUpdate(ON)
end 

rule "Sonnenaufgang"
when 
    Channel 'astro:sun:home:rise#event' triggered START
then 
    Cinema_Night.postUpdate(OFF)
end 

rule "Stehlampe automatisch an"
when
    Time cron "0 00 17-20 * * ?" or // täglich um 17,18,19 und 20 Uhr
    Item Cinema_Night changed to ON or
    Item Stehlampe_Timer changed
then
    val nSel = if(Stehlampe_Timer.state instanceof Number) (Stehlampe_Timer.state as Number) else 0

    if(nSel == 0) {
        if(Cinema_Night.state == ON && gHUE_Lamp_Childsroom.getStateAs(OnOffType) != ON) {
            gHUE_Lamp_Childsroom.sendCommand(ON)
            logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde wegen Sonnenuntergang eingeschaltet")
        }
    } else if(now.getHourOfDay > (15 + nSel) && gHUE_Lamp_Childsroom.getStateAs(OnOffType) != ON) {
        gHUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("Beleuchtung", "Stehlampe im Kinderzimmer wurde wegen Zeitgrenze {} eingeschaltet",(16 + nSel))
    }
end
Die ersten beiden Rules bleiben unverändert und sorgen nur für das Nachtstatus Item.
Die dritte Rule triggert über die Stunde, den Nachtzustand und das Item, über welches das Verhalten gesteuert wird.

Zunächst wird der gewünschte Modus ausgelesen und in eine Number Konstante geschrieben. Falls der Modus keine Zahl ist (z.B. weil das Item noch nie benutzt wurde), wird 0 als Default verwendet (also Sonnenuntergang)
Nun gibt es (weil Deine Schaltzeiten so schön glatt sind) nur zwei zu unterscheidende Situationen: nSel ist 0 oder nSel ist nicht 0. Im ersten Fall muss zusätzlich die Bedingung erfüllt sein, dass es nach Sonnenuntergang ist. im zweiten Fall muss zusätzlich die Bedingung erfüllt sein, dass die aktuelle Zeit nach der Zeitgrenze liegt. Da Du die Begrenzung zur vollen Stunde gesetzt hast, reicht es, die Stunde auszurechnen (15 + 1 = 16 -> ab 17 Uhr ist die Stunde größer als 16, 15 + 4 = 19 -> ab 20 Uhr ist die Stunde größer als 19).
Natürlich sollte das Licht nur dann eingeschaltet werden, wenn es vorher aus war, deshalb noch die abschließende Bedingung, welche explizit den Status als OnOffType anfordert. Ansonsten gäbe ein Dimmer z.B. den Zahlwert 0 bis 100 oder ein Color Item den HSBType zurück.

Falls die Schaltzeiten nicht so glatt liegen, kann man natürlich auch für jede Schaltzeit einen eigenen if-Block schreiben.

Wichtig ist nur, dass die Schaltzeiten auf Überschreiten des Grenzwertes geprüft werden, nicht auf den konkreten Zeitpunkt.

Die Rule könnte sich natürlich auch noch um das Abschalten kümmern ;)

Wenn ab einer bestimmten Zeit das Licht nicht mehr eingeschaltet werden soll (schließlich könnte man auch um 23:59 auf die Idee kommen, den Modus zu ändern) müsste man das gesondert abfangen, z.B. mit einer Abbruchbedingung zu Beginn der Rule:

Code: Alles auswählen

    if(now.getMinuteOfDay > (21*60 + 30)) {
        logInfo("Beleuchtung","Licht bleibt aus!")
        return;
    }
Gehe zur vollständigen Antwort

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

Wenn Stehlampe_Timer ein Item ist, musst Du mit .state arbeiten, wie in den anderen Rules auch.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53
Answers: 0

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Das habe ich probiert. Es funktioniert leider auch nicht. Ich vermute das Problem liegt daran, dass die Rule ja getriggert werden muss. Und der Schalter "Cinema_Night" triggert ja nur einmal, wenn er seinen Status ändert. Ich muss irgendwie die Rule triggern, wenn ich im Selection Widget die Stellung "Sonnenuntergang" auswähle. Danach müsste ja dann geprüft werden ob der Schalter "Cinema_Night" auf "ON" steht. Ist das richtig? Wie kann man so etwas triggern?

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

Na indem Du das entsprechende Item als Trigger einträgt... received command ist der richtige Trigger.

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53
Answers: 0

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Also zum Verständnis: Mit dem "received Command" ist die Rule die ganze Zeit aktiv? Also dass ich nach Sonnenuntergang die Rule aktivieren kann und das Licht sich direkt einschaltet?

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von Darkwin101 »

Nein eine neue Regel die auf deine Uhrzeitauswahl reagiert meinte udo1toni bestimmt

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

Also, grundsätzlich kannst Du die RuleS so gestalten, wie Du das gemacht hast. Du hast dadurch halt ein ziemliches Kuddelmuddel an Rules für eine Aufgabe.
Damit die Automatik auch greift, wenn es schon zu spät ist, brauchst Du dann halt eine Rule, die bei Änderung der Auswahl prüft, ob die Bedingungen erfüllt sind (also Automatik und Nacht aktiv) und gegebenenfalls entsprechend reagiert.

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53
Answers: 0

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Ich werde es nochmal Probieren. Du hattest gerade aber von "Kuddelmuddel" geschrieben. Wie kann man sowas denn kürzer gestalten?

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

Na ja, halt mit einer Rule... auch da gibt es verschiedene Ansätze. Ist aber etwas schwierig vom Handy aus... vielleicht denke ich dran, wenn ich vom Dienst zurück bin...

Gesendet von meinem SM-G973F mit Tapatalk

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

MrCrashy
Beiträge: 113
Registriert: 2. Jan 2021 09:53
Answers: 0

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Das wäre sehr freundlich. Habe nämlich die Sorge, dass das System "träge" wird, wenn ich so weiter mache.

Antworten