@ -11,6 +11,8 @@ Adapted by Xose Pérez <xose dot perez at gmail dot com>
# include <TimeLib.h>
int _sch_restore = 0 ;
// -----------------------------------------------------------------------------
# if WEB_SUPPORT
@ -136,10 +138,36 @@ int _schMinutesLeft(time_t t, unsigned char schedule_hour, unsigned char schedul
return ( schedule_hour - now_hour ) * 60 + schedule_minute - now_minute ;
}
void _schCheck ( ) {
void _schAction ( int sch_id , int sch_action , int sch_switch ) {
unsigned char sch_type = getSetting ( " schType " , sch_id , SCHEDULER_TYPE_SWITCH ) . toInt ( ) ;
if ( SCHEDULER_TYPE_SWITCH = = sch_type ) {
DEBUG_MSG_P ( PSTR ( " [SCH] Switching switch %d to %d \n " ) , sch_switch , sch_action ) ;
if ( sch_action = = 2 ) {
relayToggle ( sch_switch ) ;
} else {
relayStatus ( sch_switch , sch_action ) ;
}
}
# if LIGHT_PROVIDER != LIGHT_PROVIDER_NONE
if ( SCHEDULER_TYPE_DIM = = sch_type ) {
DEBUG_MSG_P ( PSTR ( " [SCH] Set channel %d value to %d \n " ) , sch_switch , sch_action ) ;
lightChannel ( sch_switch , sch_action ) ;
lightUpdate ( true , true ) ;
}
# endif
}
// If daybefore and relay is -1, check with current timestamp
// Otherwise, modify it by moving 'daybefore' days back and only use the 'relay' id
void _schCheck ( int relay , int daybefore ) {
time_t local_time = now ( ) ;
time_t utc_time = ntpLocal2UTC ( local_time ) ;
int minimum_restore_time = - 1440 ;
int saved_action = - 1 ;
int saved_sch = - 1 ;
// Check schedules
for ( unsigned char i = 0 ; i < SCHEDULER_MAX_SCHEDULES ; i + + ) {
@ -154,36 +182,39 @@ void _schCheck() {
bool sch_utc = getSetting ( " schUTC " , i , 0 ) . toInt ( ) = = 1 ;
time_t t = sch_utc ? utc_time : local_time ;
if ( daybefore > 0 ) {
unsigned char now_hour = hour ( t ) ;
unsigned char now_minute = minute ( t ) ;
unsigned char now_sec = second ( t ) ;
t = t - ( ( now_hour * 3600 ) + ( ( now_minute + 1 ) * 60 ) + now_sec + ( daybefore * 86400 ) ) ;
}
String sch_weekdays = getSetting ( " schWDs " , i , " " ) ;
if ( _schIsThisWeekday ( t , sch_weekdays ) ) {
int sch_hour = getSetting ( " schHour " , i , 0 ) . toInt ( ) ;
int sch_minute = getSetting ( " schMinute " , i , 0 ) . toInt ( ) ;
int minutes_to_trigger = _schMinutesLeft ( t , sch_hour , sch_minute ) ;
int sch_action = getSetting ( " schAction " , i , 0 ) . toInt ( ) ;
unsigned char sch_type = getSetting ( " schType " , i , SCHEDULER_TYPE_SWITCH ) . toInt ( ) ;
if ( minutes_to_trigger = = 0 ) {
unsigned char sch_type = getSetting ( " schType " , i , SCHEDULER_TYPE_SWITCH ) . toInt ( ) ;
if ( sch_type = = SCHEDULER_TYPE_SWITCH & & sch_switch = = relay & & sch_action ! = 2 & & minutes_to_trigger < 0 & & minutes_to_trigger > minimum_restore_time ) {
minimum_restore_time = minutes_to_trigger ;
saved_action = sch_action ;
saved_sch = i ;
}
if ( SCHEDULER_TYPE_SWITCH = = sch_type ) {
int sch_action = getSetting ( " schAction " , i , 0 ) . toInt ( ) ;
DEBUG_MSG_P ( PSTR ( " [SCH] Switching switch %d to %d \n " ) , sch_switch , sch_action ) ;
if ( sch_action = = 2 ) {
relayToggle ( sch_switch ) ;
} else {
relayStatus ( sch_switch , sch_action ) ;
}
# if LIGHT_PROVIDER != LIGHT_PROVIDER_NONE
if ( SCHEDULER_TYPE_DIM = = sch_type & & sch_switch = = relay & & minutes_to_trigger < 0 & & minutes_to_trigger > minimum_restore_time ) {
minimum_restore_time = minutes_to_trigger ;
saved_action = sch_action ;
saved_sch = i ;
}
# endif
# if LIGHT_PROVIDER != LIGHT_PROVIDER_NONE
if ( SCHEDULER_TYPE_DIM = = sch_type ) {
int sch_brightness = getSetting ( " schAction " , i , - 1 ) . toInt ( ) ;
DEBUG_MSG_P ( PSTR ( " [SCH] Set channel %d value to %d \n " ) , sch_switch , sch_brightness ) ;
lightChannel ( sch_switch , sch_brightness ) ;
lightUpdate ( true , true ) ;
}
# endif
if ( minutes_to_trigger = = 0 & & relay = = - 1 ) {
_schAction ( i , sch_action , sch_switch ) ;
DEBUG_MSG_P ( PSTR ( " [SCH] Schedule #%d TRIGGERED!! \n " ) , i ) ;
// Show minutes to trigger every 15 minutes
@ -191,7 +222,7 @@ void _schCheck() {
// This only works for schedules on this same day.
// For instance, if your scheduler is set for 00:01 you will only
// get one notification before the trigger (at 00:00)
} else if ( minutes_to_trigger > 0 ) {
} else if ( minutes_to_trigger > 0 & & relay = = - 1 ) {
# if DEBUG_SUPPORT
if ( ( minutes_to_trigger % 15 = = 0 ) | | ( minutes_to_trigger < 15 ) ) {
@ -208,6 +239,15 @@ void _schCheck() {
}
if ( daybefore > = 0 & & daybefore < 7 & & minimum_restore_time = = - 1440 & & saved_action = = - 1 ) {
_schCheck ( relay , + + daybefore ) ;
return ;
}
if ( minimum_restore_time ! = - 1440 & & saved_action ! = - 1 & & saved_sch ! = - 1 ) {
_schAction ( saved_sch , saved_action , relay ) ;
}
}
void _schLoop ( ) {
@ -215,12 +255,20 @@ void _schLoop() {
// Check time has been sync'ed
if ( ! ntpSynced ( ) ) return ;
if ( _sch_restore = = 0 ) {
for ( int i = 0 ; i < _relays . size ( ) ; i + + ) {
if ( getSetting ( " relayLastSch " , i , SCHEDULER_RESTORE_LAST_SCHEDULE ) . toInt ( ) = = 1 )
_schCheck ( i , 0 ) ;
}
_sch_restore = 1 ;
}
// Check schedules every minute at hh:mm:00
static unsigned long last_minute = 60 ;
unsigned char current_minute = minute ( ) ;
if ( current_minute ! = last_minute ) {
last_minute = current_minute ;
_schCheck ( ) ;
_schCheck ( - 1 , - 1 ) ;
}
}