diff --git a/code/espurna/ascheduler.ino b/code/espurna/ascheduler.ino deleted file mode 100644 index b78d6f57..00000000 --- a/code/espurna/ascheduler.ino +++ /dev/null @@ -1,117 +0,0 @@ -/* - -A SCHEDULER MODULE - -Copyright (C) 2017 by faina09 - -*/ - -#if SCHEDULER_SUPPORT - -#include - -void _schWebSocketOnSend(JsonObject &root){ - root["maxScheduled"] = MAX_SCHEDULED; - JsonArray &sch = root.createNestedArray("schedule"); - for (byte i = 0; i < MAX_SCHEDULED; i++) { - if (!hasSetting("sch_switch", i)) - break; - JsonObject &scheduler = sch.createNestedObject(); - scheduler["sch_switch"] = getSetting("sch_switch", i, ""); - scheduler["sch_operation"] = getSetting("sch_operation", i, ""); - scheduler["sch_hour"] = getSetting("sch_hour", i, ""); - scheduler["sch_minute"] = getSetting("sch_minute", i, ""); - scheduler["sch_weekdays"] = getSetting("sch_weekdays", i, ""); - } -} - -void schSetup(){ - // Update websocket clients - #if WEB_SUPPORT - wsOnSendRegister(_schWebSocketOnSend); - #endif - - int i; - for (i = 0; i < MAX_SCHEDULED; i++) { - if (getSetting("sch_switch" + String(i)).length() == 0) - break; - String sch_weekdays = getSetting("sch_weekdays" + String(i)); - int sch_switch = getSetting("sch_switch" + String(i)).toInt(); - int sch_operation = getSetting("sch_operation" + String(i)).toInt(); - int sch_hour = getSetting("sch_hour" + String(i)).toInt(); - int sch_minute = getSetting("sch_minute" + String(i)).toInt(); - 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()); - } -} - -void schLoop(){ - // Check if we should compare scheduled and actual times - static unsigned long last_update = 0; - static int sec = 0; - if ((millis() - last_update > ((SCH_UPDATE_SEC + 60 - sec)*1000)) || (last_update == 0)) { - last_update = millis(); - if (!ntpConnected()){ - time_t t = now(); - sec = second(t); - DEBUG_MSG_P(PSTR("[SCH] no NTP, time now=%02d:%02d:%02d\n"),hour(t),minute(t),second(t)); - } - else { - // compare at next minute and SCH_UPDATE_SEC seconds - sec = NTP.getTimeDateString().substring(6, 8).toInt(); - } - int i; - for (i = 0; i < MAX_SCHEDULED; i++) { - if (getSetting("sch_switch" + String(i)).length() == 0) - break; - String sch_weekdays = getSetting("sch_weekdays" + String(i)); - if (isThisWday(sch_weekdays)) { - int sch_switch = getSetting("sch_switch" + String(i)).toInt(); - int sch_operation = getSetting("sch_operation" + String(i)).toInt(); - int sch_hour = getSetting("sch_hour" + String(i)).toInt(); - int sch_minute = getSetting("sch_minute" + String(i)).toInt(); - //DEBUG_MSG_P(PSTR("[SCH] Today it will turn switch #%d %d @ %02d:%02d\n"), sch_switch, sch_operation, sch_hour, sch_minute); - int minToTrigger = diffTime(sch_hour, sch_minute); - if (minToTrigger == 0) { - relayStatus(sch_switch, sch_operation); - DEBUG_MSG_P(PSTR("[SCH] TRIGGERED!! switch #%d is %s\n"), sch_switch, sch_operation ? "ON" : "OFF"); - } - if (minToTrigger < 0) { - //DEBUG_MSG_P(PSTR("[SCH] Time now: %s\n"), (char *)ntpDateTime().c_str()); // aaaa/mm/dd hh:mm:ss - DEBUG_MSG_P(PSTR("[SCH] Time now: %s, %d minutes to trigger %02d:%02d switch #%d %s\n"), - (char *)ntpDateTime().c_str(), -minToTrigger, sch_hour, sch_minute, sch_switch, sch_operation ? "ON" : "OFF"); - } - } - } - } -} - -bool isThisWday(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(int schhour, int schminute){ - if (!ntpConnected()){ - time_t t = now(); - DEBUG_MSG_P(PSTR("[SCH] no NTP time = %02d:%02d:%02d\n"),hour(t),minute(t),second(t)); - return (hour(t) - schhour) * 60 + minute(t) - schminute; - } - else { - String value = NTP.getTimeDateString(); - int hour = value.substring(0, 2).toInt(); - int minute = value.substring(3, 5).toInt(); - //DEBUG_MSG_P(PSTR("[SCH] ntp time: %02d:%02d\n"), hour, minute); - //DEBUG_MSG_P(PSTR("[SCH] cmp time: %02d:%02d\n"), schhour, schminute); - return (hour - schhour) * 60 + minute - schminute; - } -} - -#endif // SCHEDULER_SUPPORT diff --git a/code/espurna/data/index.html.gz b/code/espurna/data/index.html.gz index b7dbcd47..a8b64c48 100644 Binary files a/code/espurna/data/index.html.gz and b/code/espurna/data/index.html.gz differ diff --git a/code/espurna/scheduler.ino b/code/espurna/scheduler.ino new file mode 100644 index 00000000..2f005a23 --- /dev/null +++ b/code/espurna/scheduler.ino @@ -0,0 +1,155 @@ +/* + +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 diff --git a/code/html/custom.js b/code/html/custom.js index eb4c477a..b066579e 100644 --- a/code/html/custom.js +++ b/code/html/custom.js @@ -101,7 +101,7 @@ function validateForm(form) { // These fields will always be a list of values var is_group = [ "ssid", "pass", "gw", "mask", "ip", "dns", - "sch_switch","sch_operation","sch_hour","sch_minute","sch_weekdays", + "schSwitch","schAction","schHour","schMinute","schWDs", "relayBoot", "relayPulse", "relayTime", "mqttGroup", "mqttGroupInv", "dczRelayIdx", "dczMagnitude", @@ -146,6 +146,9 @@ function getData(form) { } }); + // Post process + if ("schSwitch" in data) data["schSwitch"].push(0xFF); + return data; } @@ -479,16 +482,16 @@ function moreSchedule() { var parent = $(this).parents(".pure-g"); $("div.more", parent).toggle(); } - -function addSchedule() { + +function addSchedule() { var numSchedules = $("#schedules > div").length; if (numSchedules >= maxSchedules) { alert("Max number of schedules reached"); return; - } + } var tabindex = 200 + numSchedules * 10; var template = $("#scheduleTemplate").children(); - var line = $(template).clone(); + var line = $(template).clone(); $(line).find("input").each(function() { $(this).attr("tabindex", tabindex++); }); @@ -1118,7 +1121,7 @@ $(function() { $(".button-add-schedule").on('click', function() { $("div.more", addSchedule()).toggle(); }); - + $(document).on('change', 'input', hasChanged); $(document).on('change', 'select', hasChanged); diff --git a/code/html/index.html b/code/html/index.html index 1c01a153..a6a2a1a8 100644 --- a/code/html/index.html +++ b/code/html/index.html @@ -1047,34 +1047,37 @@
+
- -
- -
+ + +
+
- +
+ -
- -
-
- -
+
+
+
+
- +
1 = Sunday, 2 = Monday, ...
+
+
+