/* A SCHEDULER MODULE Copyright (C) 2017 by faina09 */ #if SCHEDULER_SUPPORT #include #if WEB_SUPPORT void _schWebSocketOnSend(JsonObject &root){ root["maxScheduled"] = MAX_SCHEDULED; JsonArray &sch = root.createNestedArray("schedule"); for (byte i = 0; i < MAX_SCHEDULED; i++) { if (!hasSetting("schSwitch", i)) break; JsonObject &scheduler = sch.createNestedObject(); scheduler["schSwitch"] = getSetting("schSwitch", i, ""); scheduler["schAction"] = getSetting("schAction", i, ""); scheduler["schHour"] = getSetting("schHour", i, ""); scheduler["schMinute"] = getSetting("schMinute", i, ""); scheduler["schWDs"] = getSetting("schWDs", i, ""); } } void _schConfigure() { bool delete_flag = false; for (unsigned char i = 0; i < MAX_SCHEDULED; i++) { int sch_switch = getSetting("schSwitch", i, 0xFF).toInt(); if (sch_switch == 0xFF) delete_flag = true; if (delete_flag) { delSetting("schSwitch", i); delSetting("schAction", i); delSetting("schHour", i); delSetting("schMinute", i); delSetting("schWDs", i); } else { #if DEBUG_SUPPORT int sch_operation = getSetting("schAction", i, 0).toInt(); int sch_hour = getSetting("schHour", i, 0).toInt(); int sch_minute = getSetting("schMinute", i, 0).toInt(); String sch_weekdays = getSetting("schWDs", i, ""); DEBUG_MSG_P(PSTR("[SCH] Turn switch #%d %s at %02d:%02d on %s\n"), sch_switch, sch_operation ? "ON" : "OFF", sch_hour, sch_minute, (char *)sch_weekdays.c_str()); #endif // DEBUG_SUPPORT } } } #endif // WEB_SUPPORT bool _isThisWeekday(String weekdays){ //Sunday = 1, Monday = 2, ... int w = weekday(now()); //DEBUG_MSG_P(PSTR("[SCH] NTP weekday: %d\n"), w); char * pch; char * p = (char *) weekdays.c_str(); while ((pch = strtok_r(p, ",", &p)) != NULL) { //DEBUG_MSG_P(PSTR("[SCH] w found: %d\n"), atoi(pch)); if (atoi(pch) == w) return true; } return false; } int _diffTime(unsigned char schedule_hour, unsigned char schedule_minute){ unsigned char now_hour; unsigned char now_minute; if (ntpConnected()) { String value = NTP.getTimeDateString(); now_hour = value.substring(0, 2).toInt(); now_minute = value.substring(3, 5).toInt(); } else { time_t t = now(); now_hour = hour(t); now_minute = minute(t); } return (schedule_hour - now_hour) * 60 + schedule_minute - now_minute; } // ----------------------------------------------------------------------------- void schSetup() { _schConfigure(); // Update websocket clients #if WEB_SUPPORT wsOnSendRegister(_schWebSocketOnSend); wsOnAfterParseRegister(_schConfigure); #endif } void schLoop(){ static unsigned long last_update = 0; static int update_time = 0; // Check if we should compare scheduled and actual times if ((millis() - last_update > update_time) || (last_update == 0)) { last_update = millis(); // Calculate next update time unsigned char current_second = ntpConnected() ? NTP.getTimeDateString().substring(6, 8).toInt() : second(now()) ; update_time = (SCH_UPDATE_SEC + 60 - current_second) * 1000; for (unsigned char i = 0; i < MAX_SCHEDULED; i++) { int sch_switch = getSetting("schSwitch", i, 0xFF).toInt(); if (sch_switch == 0xFF) break; String sch_weekdays = getSetting("schWDs", i, ""); if (_isThisWeekday(sch_weekdays)) { int sch_hour = getSetting("schHour", i, 0).toInt(); int sch_minute = getSetting("schMinute", i, 0).toInt(); int minutes_to_trigger = _diffTime(sch_hour, sch_minute); if (minutes_to_trigger == 0) { int sch_operation = getSetting("schAction", i, 0).toInt(); relayStatus(sch_switch, sch_operation); DEBUG_MSG_P(PSTR("[SCH] Schedule #%d TRIGGERED!!\n"), sch_switch); } else if (minutes_to_trigger > 0) { DEBUG_MSG_P(PSTR("[SCH] %d minutes to trigger schedule #%d\n"), minutes_to_trigger, sch_switch); } } } } } #endif // SCHEDULER_SUPPORT