Re: Zeitschaltung nachträglich Astro-Binding
Verfasst: 5. Jan 2021 15:57
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 

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
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
Code: Alles auswählen
if(now.getMinuteOfDay > (21*60 + 30)) {
logInfo("Beleuchtung","Licht bleibt aus!")
return;
}
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.
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"
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"]
}
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