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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Also ich habe mir das mal angeschaut und es versucht, diese Geschichte mit nur einer Rule zu lösen. Irgendwie spinnt dann mein gesamtes System :roll:

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Ich habe mich dran gewagt und versucht das alles in eine Rule zu packen. Irgendwie will es aber nicht so wie ich will. Ich glaube dass es etwas mit meiner Abfrage von der Zeit zu tun hat.

Code: Alles auswählen

rule "Zeitschaltuhr EIN"
when
	Item Spotlight1_Kitchen_Timer_On received Update or
	Item Stehlampe_Time_On received Update
then
	if(now.getHourOfDay == 17 && now.getMinutesOfDay == 00){
		if(Spotlight1_Kitchen_Timer_On.state == 1){
			HUE_Spotlight_Kitchen.sendCommand(ON)
			logInfo("Beleuchtung","Spotlight Küche wurde um 17:00 Uhr eingeschaltet.")
		}
		if(Stehlampe_Time_On.state == 1){
			HUE_Lamp_Childsroom.sendCommand(ON)
			logInfo("Beleuchtung","Die Stehlampe im Kinderzimmer wurde um 17:00 Uhr eingeschaltet.")
		}
	}
	else if(now.getHourOfDay == 18 && now.getMinutesOfDay == 00){
		if(Spotlight1_Kitchen_Timer_On.state == 2){
			HUE_Spotlight_Kitchen.sendCommand(ON)
			logInfo("Beleuchtung","Spotlight in der Küche wurde um 18:00 Uhr eingeschaltet.")
		}
		if(Stehlampe_Time_On.state == 2){
			HUE_Lamp_Childsroom.sendCommand(ON)
			logInfo("Beleuchtung","Die Stehlampe im Kinderzimmer wurde um 18:00 Uhr eingeschaltet")
		}
	}
end

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

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;
    }
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 »

Vielen Dank! udo1toni ich ziehe meinen Hut vor dir! Da wäre ich im Leben nicht drauf gekommen!
Aber so wie du das erklärst macht es auf jeden Fall Sinn. Eine Frage habe ich aber noch zu der Abbruchbedingung. Wieso bei "if(now.getMinuteOfDay > (21*60 + 30))" wird da 21*60 + 30 gerechnet?

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von int5749 »

MrCrashy hat geschrieben: 6. Jan 2021 09:34 Wieso bei "if(now.getMinuteOfDay > (21*60 + 30))" wird da 21*60 + 30 gerechnet?
Ich vermute, um es lesbarer zu halten? Man könnte auch > (1290) schreiben, müsste aber entweder sehr gut im Kopfrechnen sein oder einen Rechner bemühen um auf 21:30 zu kommen. Zudem kann es so schneller an neue Zeiten angepasst werden, ohne Rechner. Aber das ist nur meine Vermutung, mal sehen was Udo antwortet.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von udo1toni »

Genauso ist es.
Es ist halt die Minute des Tages.

Wie gesagt, es handelt sich um eine Grenze, die erreicht oder überschritten sein muss, wenn Du das mit getHourOfDay und getMinuteOfDay ausdrücken willst, musst Du geklammerte Bool'sche Algebra verwenden (Stunde gleich 21 UND Minute größer gleich 30 ODER Stunde größer 21), das ist wesentlich komplexer und braucht um Größenordnungen mehr Rechenzeit.

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 »

Ok, vielen Dank für die wunderbare Erklärung! Muss nachher einmal nach meinen Logs schauen. Ich habe mich Gestern daran versucht, eine neue log-Datei für die Beleuchtung zu erstellen. Irgendwie schreibt er jetzt weder in die openhab.log, noch in meine beleuchtung.log rein. Das ist das Problem, wenn man sein Haus endlich weiter aufrüsten will aber gleichzeitig noch für die Meisterschule lernt. :D

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

Re: Zeitschaltung nachträglich Astro-Binding

Beitrag von MrCrashy »

Hallo, ich fürchte, dass ich das Thema nochmal hervor holen muss. Ich bin auf einen Fehler gestoßen, der sich mir nicht ganz erschließt.
Folgendes Problem: Wenn ich die Stehlampe im Kinderzimmer zum Sonnenuntergang einschalten lasse und um 21:00 Uhr wieder aus, dann schaltet diese sich aber nicht ab.
In der Küche (welches exakt die selbe Rule, nur mit anderen Items hat) ist es so, dass wenn ich sie z.B. um 17:00 Uhr einschalten lasse und um 21:00 Uhr wieder aus, dann funktioniert es. Also anscheinend nur nicht, wenn die Rule per Sonnenuntergang eingeschaltet wurde.
In den Logs, wird zwar angegeben, wenn beide Lampen angeschaltet wurden und auch wenn sich die Küche abschaltet. Aber der "Abschaltprozess" von der Stehlampe wird nicht ausgeführt.

Ich habe für beide Lampen jeweils ein Einschalt- und ein Ausschalttimer. Um die Ein- und Ausschaltzeit festzulegen.

Hier sind meine Items:

Code: Alles auswählen

Number Spotlight1_Kitchen_Timer_On "Zeitschaltuhr Spotlight 1 Küche AN"
Number Spotlight1_Kitchen_Timer_Off "Zeitschaltuhr Spotlight 1 Küche AUS"
Number Stehlampe_Timer_On "Zeitschaltuhr Stehlampe AN"
Number Stehlampe_Timer_Off "Zeitschaltuhr Stehlampe AUS"
Das hier ist mein Mapping:

Code: Alles auswählen

        Text label="Zeitschaltuhren"    icon="time"{
            Selection item=Spotlight1_Kitchen_Timer_On      label="Einschaltzeit Spotlight"     mappings=[0="Sonnenuntergang",1="17:00 Uhr",2="18:00 Uhr",3="19:00 Uhr",4="20:00 Uhr",5="AUS"]
            Selection item=Spotlight1_Kitchen_Timer_Off     label="Ausschaltzeiten Spotlight"   mappings=[0="Aus",1="21:00 Uhr",2="22:00 Uhr",3="23:00 Uhr",4="00:00 Uhr"]
            Selection item=Stehlampe_Timer_On               label="Einschaltzeit Stehlampe"     mappings=[0="Sonnenuntergang",1="17:00 Uhr",2="18:00 Uhr",3="19:00 Uhr",4="20:00 Uhr",5="AUS"]
            Selection item=Stehlampe_Timer_Off              label="Ausschaltzeiten Stehlampe"   mappings=[0="AUS",1="21:00 Uhr",2="22:00 Uhr",3="23:00 Uhr",4="00:00 Uhr"]
        }
Und das hier ist meine Rule:

Code: Alles auswählen

rule "Stehlampe Kinderzimmer"
when 
    Time cron "0 00 17-20 * * ?" or // täglich um 17,18,19 und 20 Uhr
    Time cron "0 00 21-23 * * ?" or // täglich um 21, 22 und 23 Uhr
    Item Cinema_Night changed to ON or
    Item Stehlampe_Timer_On changed or
    Item Stehlampe_Timer_Off changed 
then 
    val Stehlampe_OnSel = if(Stehlampe_Timer_On.state instanceof Number) (Stehlampe_Timer_On.state as Number) else 0
    val Stehlampe_OffSel = if(Stehlampe_Timer_Off.state instanceof Number) (Stehlampe_Timer_Off.state as Number) else 0
    if(Stehlampe_OffSel == 0){ // 0 = Kein Ausschaltvorgang (Selectionitem zeigt dann "AUS" an)
        return;
    }
    else if(Stehlampe_OnSel == 5){ // 5 = Kein Einschaltvorgang (Selectionitem zeigt dann "AUS" an)
        return;
    }
    else if(Stehlampe_OnSel == 0){
        if(Cinema_Night.state == ON && HUE_Lamp_Childsroom.getStateAs(OnOffType) != ON){
            HUE_Lamp_Childsroom.sendCommand(ON)
            logInfo("lighting", "Wohnwand im Kinderzimmer wurde bei Sonnenuntergang eingeschaltet!")
        }
    }
    else if(now.getHourOfDay > (15 + Stehlampe_OnSel) && HUE_Lamp_Childsroom.getStateAs(OnOffType) != ON){
        HUE_Lamp_Childsroom.sendCommand(ON)
        logInfo("lighting", "Wohnwand im Kinderzimmer wurde wegen Zeitgrenze {}:00 Uhr eingeschaltet!",(16 + Stehlampe_OnSel))
    } 
    else if(now.getHourOfDay > (19 + Stehlampe_OffSel) && HUE_Lamp_Childsroom.getStateAs(OnOffType) != OFF){
        HUE_Lamp_Childsroom.sendCommand(OFF)
        logInfo("lighting", "Wohnwand im Kinderzimmer wurde wegen Zeitgrenze {}:00 Uhr ausgeschaltet!",(20 + Stehlampe_OffSel))
    }
end 
// ___________________________________________________________< Küche >_______________________________________________________________________
rule "Spotlight 1 Küche"
when 
    Time cron "0 00 17-20 * * ?" or // täglich um 17,18,19 und 20 Uhr
    Time cron "0 00 21-23 * * ?" or // täglich um 21, 22 und 23 Uhr
    Item Cinema_Night changed to ON or
    Item Spotlight1_Kitchen_Timer_On changed or
    Item Spotlight1_Kitchen_Timer_Off changed 
then 
    val Spotlight1_OnSel = if(Spotlight1_Kitchen_Timer_On.state instanceof Number) (Spotlight1_Kitchen_Timer_On.state as Number) else 0
    val Spotlight1_OffSel = if(Spotlight1_Kitchen_Timer_Off.state instanceof Number) (Spotlight1_Kitchen_Timer_Off.state as Number) else 0
    if(Spotlight1_OffSel == 0){
        return;
    }
    else if(Spotlight1_OnSel == 5){
        return;
    }
    else if(Spotlight1_OnSel == 0){
        if(Cinema_Night.state == ON && HUE_SpotLight_Kitchen.getStateAs(OnOffType) != ON){
            HUE_SpotLight_Kitchen.sendCommand(ON)
            logInfo("lighting", "Spotlight in der Küche wurde zum Sonnenuntergang eingeschaltet!")
        }
    }
    else if(now.getHourOfDay > (15 + Spotlight1_OnSel) && HUE_SpotLight_Kitchen.getStateAs(OnOffType) != ON){
        HUE_SpotLight_Kitchen.sendCommand(ON)
        logInfo("lighting", "Spotlight in der Küche wurde wegen Zeitgrenze {}:00 Uhr eingeschaltet!",(16 + Spotlight1_OnSel))
    } 
    else if(now.getHourOfDay > (19 + Spotlight1_OffSel) && HUE_SpotLight_Kitchen.getStateAs(OnOffType) != OFF){
        HUE_SpotLight_Kitchen.sendCommand(OFF)
        logInfo("lighting", "Spotlight in der Küche wurde wegen Zeitgrenze {}:00 Uhr ausgeschaltet!",(20 + Spotlight1_OffSel))
    }
end 
Ebenfalls ist mir aufgefallen, dass bei einem Neustart vom Server, die "val" nicht auf einen Wert gesetzt werden. Am Desktop sieht es aus wie auf den Bildern (Siehe unten). Bei meinem Handy in der "openHAB" - App ist es so, dass im Auswahlfenster eine leere Zeile geschaffen wird. Wenn ich nun aber etwas auswähle, ist die Zeile weg.

Bild
Bild

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, das erste ist mal, es stehen nur 2 (!) Threads für Scheduler Rules zur Verfügung. Diese werden beide belegt, wenn Du mehrere Rules mit identischem Trigger verwendest. Es war ja auch oben nie die Rede davon, dass Du mehrere solche Timer verwenden willst...

Ein möglicher Workaround wäre, bei einer der beiden Rules den Trigger leicht zu ändern, z.B. auf 5 Sekunden nach der vollen Minute (statt "0 0 ..." einfach "5 0 ..."), damit wird das soweit entzerrt, dass die Timer nacheinander laufen und nicht mehr parallel.
Hier wäre es aber auch möglich, mit einer einzigen Rule auszukommen. Allerdings wäre es vermutlich sinnvoll, die Rule noch mal genauer anzuschauen, also auf die erweiterte Funktion (nicht nur ein, sondern auch ausschalten, mehrere Geräte).

Da Du ja (sehr sinnvoll!) eine eigene Nummer für Aus definiert hast, kannst Du auf die Aktivierung/Deaktivierung der Automatik komplett verzichten, es sei denn, Du willst das nochmal zusätzlich automatisiert steuern.
Die Abbruchbedingung (...OffSel == 0) ist allerdings nicht so gut, damit hast Du dann ja zwei Stellen, von denen nur eine eine bestimmte Schaltstellung aufweisen muss, damit der Timer gar nicht ausgeführt wird.
Ich persönlich würde auch lieber die Zahl -1 für den Wert "Aus" verwenden.
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 »

Ok, ich werde das alles nochmal überarbeiten. Ich muss gestehen, dass ich nicht gedacht habe, dass man nicht zweimal einen Trigger in dieser Art verwenden darf. Ich werde nochmal meine grauen Hirnzellen anstrengen und die Rule überarbeiten und alles in die eine Rule schreiben.
Vielen Dank!

Antworten