Allows my home wiz lights to be timed on and off according to a schedule.
wiz/wiz-sched.c@7:3035a540ef65, 2021-06-09 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed Jun 09 09:23:54 2021 +0000
- Revision:
- 7:3035a540ef65
- Parent:
- 6:09ca95ef1cdd
Changed WizSchedMinutesUtcToLocal function so that local midnight in summer is 00h00 rather than 24h00.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 0:9af80a39adcc | 1 | #include <stdint.h> |
andrewboyson | 0:9af80a39adcc | 2 | #include <string.h> |
andrewboyson | 0:9af80a39adcc | 3 | |
andrewboyson | 0:9af80a39adcc | 4 | #include "wiz-list.h" |
andrewboyson | 0:9af80a39adcc | 5 | #include "wiz-sun.h" |
andrewboyson | 0:9af80a39adcc | 6 | #include "wiz-sched.h" |
andrewboyson | 0:9af80a39adcc | 7 | #include "settings.h" |
andrewboyson | 0:9af80a39adcc | 8 | #include "http.h" |
andrewboyson | 0:9af80a39adcc | 9 | #include "clk.h" |
andrewboyson | 0:9af80a39adcc | 10 | #include "log.h" |
andrewboyson | 0:9af80a39adcc | 11 | #include "mac.h" |
andrewboyson | 5:ec0498d7d2c1 | 12 | #include "tm.h" |
andrewboyson | 0:9af80a39adcc | 13 | |
andrewboyson | 0:9af80a39adcc | 14 | #define MINIMUM_DURATION_MINUTES 1 |
andrewboyson | 0:9af80a39adcc | 15 | |
andrewboyson | 3:d33dda272a7f | 16 | #define DEBUG false |
andrewboyson | 0:9af80a39adcc | 17 | |
andrewboyson | 0:9af80a39adcc | 18 | struct item |
andrewboyson | 0:9af80a39adcc | 19 | { |
andrewboyson | 0:9af80a39adcc | 20 | char name[WIZ_LIST_NAME_LENGTH]; //Name or '*' for broadcast |
andrewboyson | 0:9af80a39adcc | 21 | char ondatum; |
andrewboyson | 0:9af80a39adcc | 22 | int16_t onminutes; |
andrewboyson | 0:9af80a39adcc | 23 | char offdatum; |
andrewboyson | 0:9af80a39adcc | 24 | int16_t offminutes; |
andrewboyson | 0:9af80a39adcc | 25 | }; |
andrewboyson | 0:9af80a39adcc | 26 | static struct item items[WIZ_SCHED_MAX_ITEMS]; |
andrewboyson | 0:9af80a39adcc | 27 | |
andrewboyson | 0:9af80a39adcc | 28 | void WizSchedSetName (int i, char* name) { strncpy ( items[i].name, name, WIZ_LIST_NAME_LENGTH); SetWizSchedName (i, name ); } |
andrewboyson | 0:9af80a39adcc | 29 | void WizSchedSetOnEvent (int i, char datum, int16_t minutes) |
andrewboyson | 0:9af80a39adcc | 30 | { |
andrewboyson | 0:9af80a39adcc | 31 | items[i].ondatum = datum ; |
andrewboyson | 0:9af80a39adcc | 32 | items[i].onminutes = minutes; |
andrewboyson | 0:9af80a39adcc | 33 | SetWizSchedOnDatum (i, &datum ); |
andrewboyson | 0:9af80a39adcc | 34 | SetWizSchedOnMinutes(i, &minutes); |
andrewboyson | 0:9af80a39adcc | 35 | } |
andrewboyson | 0:9af80a39adcc | 36 | void WizSchedSetOffEvent(int i, char datum, int16_t minutes) |
andrewboyson | 0:9af80a39adcc | 37 | { |
andrewboyson | 0:9af80a39adcc | 38 | items[i].offdatum = datum; |
andrewboyson | 0:9af80a39adcc | 39 | items[i].offminutes = minutes; |
andrewboyson | 0:9af80a39adcc | 40 | SetWizSchedOffDatum (i, &datum ); |
andrewboyson | 0:9af80a39adcc | 41 | SetWizSchedOffMinutes(i, &minutes); |
andrewboyson | 0:9af80a39adcc | 42 | } |
andrewboyson | 0:9af80a39adcc | 43 | |
andrewboyson | 0:9af80a39adcc | 44 | static int minutesTodayUtc; |
andrewboyson | 0:9af80a39adcc | 45 | static int minutesSunriseUtc; |
andrewboyson | 0:9af80a39adcc | 46 | static int minutesSunsetUtc; |
andrewboyson | 5:ec0498d7d2c1 | 47 | static bool isDst; |
andrewboyson | 5:ec0498d7d2c1 | 48 | |
andrewboyson | 5:ec0498d7d2c1 | 49 | int WizSchedMinutesUtcToLocal(int minutes) |
andrewboyson | 5:ec0498d7d2c1 | 50 | { |
andrewboyson | 5:ec0498d7d2c1 | 51 | if (isDst) minutes += TM_DST_OFFSET * 60; |
andrewboyson | 5:ec0498d7d2c1 | 52 | else minutes += TM_STD_OFFSET * 60; |
andrewboyson | 7:3035a540ef65 | 53 | if (minutes >= 1440) minutes -= 1440; |
andrewboyson | 5:ec0498d7d2c1 | 54 | return minutes; |
andrewboyson | 5:ec0498d7d2c1 | 55 | } |
andrewboyson | 5:ec0498d7d2c1 | 56 | int WizSchedMinutesLocalToUtc(int minutes) |
andrewboyson | 5:ec0498d7d2c1 | 57 | { |
andrewboyson | 5:ec0498d7d2c1 | 58 | if (isDst) minutes -= TM_DST_OFFSET * 60; |
andrewboyson | 5:ec0498d7d2c1 | 59 | else minutes -= TM_STD_OFFSET * 60; |
andrewboyson | 5:ec0498d7d2c1 | 60 | if (minutes < 0) minutes += 1440; |
andrewboyson | 5:ec0498d7d2c1 | 61 | return minutes; |
andrewboyson | 5:ec0498d7d2c1 | 62 | } |
andrewboyson | 0:9af80a39adcc | 63 | |
andrewboyson | 0:9af80a39adcc | 64 | static int getOnMinuteUtc(int i) |
andrewboyson | 0:9af80a39adcc | 65 | { |
andrewboyson | 0:9af80a39adcc | 66 | switch (items[i].ondatum) |
andrewboyson | 0:9af80a39adcc | 67 | { |
andrewboyson | 0:9af80a39adcc | 68 | case 'U': return items[i].onminutes; |
andrewboyson | 5:ec0498d7d2c1 | 69 | case 'L': return WizSchedMinutesLocalToUtc(items[i].onminutes); |
andrewboyson | 0:9af80a39adcc | 70 | case 'R': return items[i].onminutes + minutesSunriseUtc; |
andrewboyson | 0:9af80a39adcc | 71 | case 'S': return items[i].onminutes + minutesSunsetUtc; |
andrewboyson | 0:9af80a39adcc | 72 | } |
andrewboyson | 0:9af80a39adcc | 73 | return -1; |
andrewboyson | 0:9af80a39adcc | 74 | } |
andrewboyson | 0:9af80a39adcc | 75 | static int getOffMinuteUtc(int i) |
andrewboyson | 0:9af80a39adcc | 76 | { |
andrewboyson | 0:9af80a39adcc | 77 | switch (items[i].offdatum) |
andrewboyson | 0:9af80a39adcc | 78 | { |
andrewboyson | 0:9af80a39adcc | 79 | case 'U': return items[i].offminutes; |
andrewboyson | 5:ec0498d7d2c1 | 80 | case 'L': return WizSchedMinutesLocalToUtc(items[i].offminutes); |
andrewboyson | 0:9af80a39adcc | 81 | case 'R': return items[i].offminutes + minutesSunriseUtc; |
andrewboyson | 0:9af80a39adcc | 82 | case 'S': return items[i].offminutes + minutesSunsetUtc; |
andrewboyson | 0:9af80a39adcc | 83 | } |
andrewboyson | 0:9af80a39adcc | 84 | return -1; |
andrewboyson | 0:9af80a39adcc | 85 | } |
andrewboyson | 0:9af80a39adcc | 86 | static int subtractMinutes(int a, int b) |
andrewboyson | 0:9af80a39adcc | 87 | { |
andrewboyson | 0:9af80a39adcc | 88 | int d = a - b; |
andrewboyson | 0:9af80a39adcc | 89 | if (d >= 1080) d -= 1440; //Positive durations upto and including 18 hours are ok |
andrewboyson | 0:9af80a39adcc | 90 | if (d < -360) d += 1440; //Negative durations over 6 hours are assumed to be next day |
andrewboyson | 0:9af80a39adcc | 91 | return d; |
andrewboyson | 0:9af80a39adcc | 92 | } |
andrewboyson | 0:9af80a39adcc | 93 | static void onOffHttp(char datum, int minutes) |
andrewboyson | 0:9af80a39adcc | 94 | { |
andrewboyson | 0:9af80a39adcc | 95 | bool isNegative = minutes < 0; |
andrewboyson | 0:9af80a39adcc | 96 | if (isNegative) minutes = -minutes; |
andrewboyson | 0:9af80a39adcc | 97 | switch (datum) |
andrewboyson | 0:9af80a39adcc | 98 | { |
andrewboyson | 0:9af80a39adcc | 99 | case 'L': |
andrewboyson | 0:9af80a39adcc | 100 | if (isNegative) HttpAddChar('-') ; |
andrewboyson | 0:9af80a39adcc | 101 | HttpAddF("%02d", minutes / 60); |
andrewboyson | 0:9af80a39adcc | 102 | HttpAddChar('h'); |
andrewboyson | 0:9af80a39adcc | 103 | HttpAddF("%02d", minutes % 60); |
andrewboyson | 0:9af80a39adcc | 104 | break; |
andrewboyson | 0:9af80a39adcc | 105 | case 'S': |
andrewboyson | 0:9af80a39adcc | 106 | case 'R': |
andrewboyson | 0:9af80a39adcc | 107 | HttpAddChar(datum); |
andrewboyson | 6:09ca95ef1cdd | 108 | if (minutes) |
andrewboyson | 0:9af80a39adcc | 109 | { |
andrewboyson | 6:09ca95ef1cdd | 110 | HttpAddChar(isNegative ? '-' : '+') ; |
andrewboyson | 6:09ca95ef1cdd | 111 | if (minutes < 60) |
andrewboyson | 6:09ca95ef1cdd | 112 | { |
andrewboyson | 6:09ca95ef1cdd | 113 | HttpAddF("%d", minutes); |
andrewboyson | 6:09ca95ef1cdd | 114 | } |
andrewboyson | 6:09ca95ef1cdd | 115 | else |
andrewboyson | 6:09ca95ef1cdd | 116 | { |
andrewboyson | 6:09ca95ef1cdd | 117 | HttpAddF("%02d", minutes / 60); |
andrewboyson | 6:09ca95ef1cdd | 118 | HttpAddChar('h'); |
andrewboyson | 6:09ca95ef1cdd | 119 | HttpAddF("%02d", minutes % 60); |
andrewboyson | 6:09ca95ef1cdd | 120 | } |
andrewboyson | 0:9af80a39adcc | 121 | } |
andrewboyson | 0:9af80a39adcc | 122 | break; |
andrewboyson | 0:9af80a39adcc | 123 | case 'D': |
andrewboyson | 0:9af80a39adcc | 124 | HttpAddChar(isNegative ? '-' : '+') ; |
andrewboyson | 0:9af80a39adcc | 125 | HttpAddF("%02d", minutes / 60); |
andrewboyson | 0:9af80a39adcc | 126 | HttpAddChar('h'); |
andrewboyson | 0:9af80a39adcc | 127 | HttpAddF("%02d", minutes % 60); |
andrewboyson | 0:9af80a39adcc | 128 | break; |
andrewboyson | 0:9af80a39adcc | 129 | } |
andrewboyson | 0:9af80a39adcc | 130 | } |
andrewboyson | 0:9af80a39adcc | 131 | void WizSchedParseEvent(char* text, char* pDatum, int16_t* pMinutes) |
andrewboyson | 0:9af80a39adcc | 132 | { |
andrewboyson | 0:9af80a39adcc | 133 | if (!text || !pDatum || !pMinutes) return; |
andrewboyson | 0:9af80a39adcc | 134 | |
andrewboyson | 0:9af80a39adcc | 135 | *pDatum = 'L'; //Default to local |
andrewboyson | 0:9af80a39adcc | 136 | bool isNegative = false; |
andrewboyson | 0:9af80a39adcc | 137 | int minutes = 0; |
andrewboyson | 0:9af80a39adcc | 138 | int hours = 0; |
andrewboyson | 0:9af80a39adcc | 139 | for (int i = 0; i < 10 && text[i]; i++) |
andrewboyson | 0:9af80a39adcc | 140 | { |
andrewboyson | 0:9af80a39adcc | 141 | switch (text[i]) |
andrewboyson | 0:9af80a39adcc | 142 | { |
andrewboyson | 0:9af80a39adcc | 143 | case 'H': |
andrewboyson | 0:9af80a39adcc | 144 | case 'h': |
andrewboyson | 0:9af80a39adcc | 145 | hours = minutes; |
andrewboyson | 0:9af80a39adcc | 146 | minutes = 0; |
andrewboyson | 0:9af80a39adcc | 147 | break; |
andrewboyson | 0:9af80a39adcc | 148 | case 'L': |
andrewboyson | 0:9af80a39adcc | 149 | case 'l': |
andrewboyson | 0:9af80a39adcc | 150 | *pDatum = 'L'; |
andrewboyson | 0:9af80a39adcc | 151 | break; |
andrewboyson | 0:9af80a39adcc | 152 | case 'R': |
andrewboyson | 0:9af80a39adcc | 153 | case 'r': |
andrewboyson | 0:9af80a39adcc | 154 | *pDatum = 'R'; |
andrewboyson | 0:9af80a39adcc | 155 | break; |
andrewboyson | 0:9af80a39adcc | 156 | case 'S': |
andrewboyson | 0:9af80a39adcc | 157 | case 's': |
andrewboyson | 0:9af80a39adcc | 158 | *pDatum = 'S'; |
andrewboyson | 0:9af80a39adcc | 159 | break; |
andrewboyson | 0:9af80a39adcc | 160 | case '0': minutes = minutes * 10 + 0; break; |
andrewboyson | 0:9af80a39adcc | 161 | case '1': minutes = minutes * 10 + 1; break; |
andrewboyson | 0:9af80a39adcc | 162 | case '2': minutes = minutes * 10 + 2; break; |
andrewboyson | 0:9af80a39adcc | 163 | case '3': minutes = minutes * 10 + 3; break; |
andrewboyson | 0:9af80a39adcc | 164 | case '4': minutes = minutes * 10 + 4; break; |
andrewboyson | 0:9af80a39adcc | 165 | case '5': minutes = minutes * 10 + 5; break; |
andrewboyson | 0:9af80a39adcc | 166 | case '6': minutes = minutes * 10 + 6; break; |
andrewboyson | 0:9af80a39adcc | 167 | case '7': minutes = minutes * 10 + 7; break; |
andrewboyson | 0:9af80a39adcc | 168 | case '8': minutes = minutes * 10 + 8; break; |
andrewboyson | 0:9af80a39adcc | 169 | case '9': minutes = minutes * 10 + 9; break; |
andrewboyson | 0:9af80a39adcc | 170 | case '+': isNegative = false; break; |
andrewboyson | 0:9af80a39adcc | 171 | case '-': isNegative = true; break; |
andrewboyson | 0:9af80a39adcc | 172 | } |
andrewboyson | 0:9af80a39adcc | 173 | } |
andrewboyson | 0:9af80a39adcc | 174 | *pMinutes = hours * 60 + minutes; |
andrewboyson | 0:9af80a39adcc | 175 | if (isNegative) *pMinutes = -*pMinutes; |
andrewboyson | 0:9af80a39adcc | 176 | } |
andrewboyson | 0:9af80a39adcc | 177 | |
andrewboyson | 0:9af80a39adcc | 178 | void WizSchedMoveUp(int i) |
andrewboyson | 0:9af80a39adcc | 179 | { |
andrewboyson | 0:9af80a39adcc | 180 | if (i <= 0) return; //Cannot move further up |
andrewboyson | 0:9af80a39adcc | 181 | struct item item; |
andrewboyson | 0:9af80a39adcc | 182 | strncpy ( item.name, items[i].name, WIZ_LIST_NAME_LENGTH); |
andrewboyson | 0:9af80a39adcc | 183 | item.ondatum = items[i].ondatum; |
andrewboyson | 0:9af80a39adcc | 184 | item.onminutes = items[i].onminutes; |
andrewboyson | 0:9af80a39adcc | 185 | item.offdatum = items[i].offdatum; |
andrewboyson | 0:9af80a39adcc | 186 | item.offminutes = items[i].offminutes; |
andrewboyson | 0:9af80a39adcc | 187 | |
andrewboyson | 0:9af80a39adcc | 188 | WizSchedSetName (i, items[i-1].name); |
andrewboyson | 0:9af80a39adcc | 189 | WizSchedSetOnEvent (i, items[i-1].ondatum, items[i-1].onminutes); |
andrewboyson | 0:9af80a39adcc | 190 | WizSchedSetOffEvent(i, items[i-1].offdatum, items[i-1].offminutes); |
andrewboyson | 0:9af80a39adcc | 191 | |
andrewboyson | 0:9af80a39adcc | 192 | WizSchedSetName (i-1, item.name ); |
andrewboyson | 0:9af80a39adcc | 193 | WizSchedSetOnEvent (i-1, item.ondatum, item.onminutes); |
andrewboyson | 0:9af80a39adcc | 194 | WizSchedSetOffEvent(i-1, item.offdatum, item.offminutes); |
andrewboyson | 0:9af80a39adcc | 195 | } |
andrewboyson | 0:9af80a39adcc | 196 | void WizSchedMoveDown(int i) |
andrewboyson | 0:9af80a39adcc | 197 | { |
andrewboyson | 0:9af80a39adcc | 198 | if (i >= WIZ_LIST_MAX_ITEMS - 1) return; //Cannot move further down |
andrewboyson | 0:9af80a39adcc | 199 | struct item item; |
andrewboyson | 0:9af80a39adcc | 200 | strncpy ( item.name, items[i].name, WIZ_LIST_NAME_LENGTH); |
andrewboyson | 0:9af80a39adcc | 201 | item.ondatum = items[i].ondatum; |
andrewboyson | 0:9af80a39adcc | 202 | item.onminutes = items[i].onminutes; |
andrewboyson | 0:9af80a39adcc | 203 | item.offdatum = items[i].offdatum; |
andrewboyson | 0:9af80a39adcc | 204 | item.offminutes = items[i].offminutes; |
andrewboyson | 0:9af80a39adcc | 205 | |
andrewboyson | 0:9af80a39adcc | 206 | WizSchedSetName (i, items[i+1].name); |
andrewboyson | 0:9af80a39adcc | 207 | WizSchedSetOnEvent (i, items[i+1].ondatum, items[i+1].onminutes); |
andrewboyson | 0:9af80a39adcc | 208 | WizSchedSetOffEvent(i, items[i+1].offdatum, items[i+1].offminutes); |
andrewboyson | 0:9af80a39adcc | 209 | |
andrewboyson | 0:9af80a39adcc | 210 | WizSchedSetName (i+1, item.name ); |
andrewboyson | 0:9af80a39adcc | 211 | WizSchedSetOnEvent (i+1, item.ondatum, item.onminutes); |
andrewboyson | 0:9af80a39adcc | 212 | WizSchedSetOffEvent(i+1, item.offdatum, item.offminutes); |
andrewboyson | 0:9af80a39adcc | 213 | } |
andrewboyson | 0:9af80a39adcc | 214 | void WizSchedHttp() |
andrewboyson | 0:9af80a39adcc | 215 | { |
andrewboyson | 0:9af80a39adcc | 216 | int i = 0; |
andrewboyson | 0:9af80a39adcc | 217 | while (i < WIZ_SCHED_MAX_ITEMS) |
andrewboyson | 0:9af80a39adcc | 218 | { |
andrewboyson | 0:9af80a39adcc | 219 | if (items[i].name[0]) |
andrewboyson | 0:9af80a39adcc | 220 | { |
andrewboyson | 0:9af80a39adcc | 221 | HttpAddTextN(items[i].name, WIZ_LIST_NAME_LENGTH); |
andrewboyson | 0:9af80a39adcc | 222 | HttpAddChar('\t'); |
andrewboyson | 0:9af80a39adcc | 223 | |
andrewboyson | 0:9af80a39adcc | 224 | onOffHttp(items[i].ondatum, items[i].onminutes ); |
andrewboyson | 0:9af80a39adcc | 225 | HttpAddChar('\t'); |
andrewboyson | 0:9af80a39adcc | 226 | |
andrewboyson | 0:9af80a39adcc | 227 | onOffHttp(items[i].offdatum, items[i].offminutes ); |
andrewboyson | 0:9af80a39adcc | 228 | HttpAddChar('\t'); |
andrewboyson | 0:9af80a39adcc | 229 | |
andrewboyson | 0:9af80a39adcc | 230 | int onMinuteUtc = getOnMinuteUtc(i); |
andrewboyson | 0:9af80a39adcc | 231 | int offMinuteUtc = getOffMinuteUtc(i); |
andrewboyson | 0:9af80a39adcc | 232 | int duration = subtractMinutes(offMinuteUtc, onMinuteUtc); |
andrewboyson | 5:ec0498d7d2c1 | 233 | |
andrewboyson | 5:ec0498d7d2c1 | 234 | |
andrewboyson | 5:ec0498d7d2c1 | 235 | onOffHttp('L', WizSchedMinutesUtcToLocal(onMinuteUtc)); |
andrewboyson | 0:9af80a39adcc | 236 | HttpAddChar('\t'); |
andrewboyson | 0:9af80a39adcc | 237 | |
andrewboyson | 5:ec0498d7d2c1 | 238 | onOffHttp('L', WizSchedMinutesUtcToLocal(offMinuteUtc)); |
andrewboyson | 0:9af80a39adcc | 239 | HttpAddChar('\t'); |
andrewboyson | 0:9af80a39adcc | 240 | |
andrewboyson | 0:9af80a39adcc | 241 | onOffHttp('L', duration); |
andrewboyson | 0:9af80a39adcc | 242 | } |
andrewboyson | 0:9af80a39adcc | 243 | HttpAddChar('\n'); |
andrewboyson | 0:9af80a39adcc | 244 | i++; |
andrewboyson | 0:9af80a39adcc | 245 | } |
andrewboyson | 0:9af80a39adcc | 246 | } |
andrewboyson | 0:9af80a39adcc | 247 | static void doSchedule(int i) |
andrewboyson | 0:9af80a39adcc | 248 | { |
andrewboyson | 0:9af80a39adcc | 249 | if (items[i].name[0] == 0) return; |
andrewboyson | 0:9af80a39adcc | 250 | |
andrewboyson | 0:9af80a39adcc | 251 | int onMinuteUtc = getOnMinuteUtc(i); |
andrewboyson | 0:9af80a39adcc | 252 | int offMinuteUtc = getOffMinuteUtc(i); |
andrewboyson | 0:9af80a39adcc | 253 | |
andrewboyson | 0:9af80a39adcc | 254 | //Don't switch on for short or negative durations durations |
andrewboyson | 0:9af80a39adcc | 255 | int duration = subtractMinutes(offMinuteUtc, onMinuteUtc); |
andrewboyson | 0:9af80a39adcc | 256 | if (duration < MINIMUM_DURATION_MINUTES) return; |
andrewboyson | 0:9af80a39adcc | 257 | |
andrewboyson | 0:9af80a39adcc | 258 | if (onMinuteUtc == minutesTodayUtc) |
andrewboyson | 0:9af80a39adcc | 259 | { |
andrewboyson | 0:9af80a39adcc | 260 | if (items[i].name[0] == '*') |
andrewboyson | 0:9af80a39adcc | 261 | { |
andrewboyson | 0:9af80a39adcc | 262 | if (DEBUG) LogTimeF("Wiz schedule - turn all on\r\n"); |
andrewboyson | 0:9af80a39adcc | 263 | WizListTurnAllOn(); |
andrewboyson | 0:9af80a39adcc | 264 | } |
andrewboyson | 0:9af80a39adcc | 265 | else |
andrewboyson | 0:9af80a39adcc | 266 | { |
andrewboyson | 0:9af80a39adcc | 267 | if (DEBUG) LogTimeF("Wiz schedule - turn %s on\r\n", items[i].name); |
andrewboyson | 0:9af80a39adcc | 268 | WizListTurnRoomOn(items[i].name); |
andrewboyson | 0:9af80a39adcc | 269 | } |
andrewboyson | 0:9af80a39adcc | 270 | } |
andrewboyson | 0:9af80a39adcc | 271 | if (offMinuteUtc == minutesTodayUtc) |
andrewboyson | 0:9af80a39adcc | 272 | { |
andrewboyson | 0:9af80a39adcc | 273 | if (items[i].name[0] == '*') |
andrewboyson | 0:9af80a39adcc | 274 | { |
andrewboyson | 0:9af80a39adcc | 275 | if (DEBUG) LogTimeF("Wiz schedule - turn all off\r\n"); |
andrewboyson | 0:9af80a39adcc | 276 | WizListTurnAllOff(); |
andrewboyson | 0:9af80a39adcc | 277 | } |
andrewboyson | 0:9af80a39adcc | 278 | else |
andrewboyson | 0:9af80a39adcc | 279 | { |
andrewboyson | 0:9af80a39adcc | 280 | if (DEBUG) LogTimeF("Wiz schedule - turn %s off\r\n", items[i].name); |
andrewboyson | 0:9af80a39adcc | 281 | WizListTurnRoomOff(items[i].name); |
andrewboyson | 0:9af80a39adcc | 282 | } |
andrewboyson | 0:9af80a39adcc | 283 | } |
andrewboyson | 0:9af80a39adcc | 284 | } |
andrewboyson | 0:9af80a39adcc | 285 | |
andrewboyson | 0:9af80a39adcc | 286 | void WizSchedMain() |
andrewboyson | 0:9af80a39adcc | 287 | { |
andrewboyson | 0:9af80a39adcc | 288 | if (!ClkTimeIsSet()) return; |
andrewboyson | 0:9af80a39adcc | 289 | |
andrewboyson | 0:9af80a39adcc | 290 | struct tm tmUtc; |
andrewboyson | 0:9af80a39adcc | 291 | ClkNowTmUtc (&tmUtc); |
andrewboyson | 0:9af80a39adcc | 292 | |
andrewboyson | 0:9af80a39adcc | 293 | minutesTodayUtc = tmUtc.tm_hour * 60 + tmUtc.tm_min; |
andrewboyson | 5:ec0498d7d2c1 | 294 | isDst = tmUtc.tm_isdst; |
andrewboyson | 0:9af80a39adcc | 295 | |
andrewboyson | 0:9af80a39adcc | 296 | minutesSunsetUtc = WizSunSetMinutes(); |
andrewboyson | 0:9af80a39adcc | 297 | minutesSunriseUtc = WizSunRiseMinutes(); |
andrewboyson | 0:9af80a39adcc | 298 | |
andrewboyson | 0:9af80a39adcc | 299 | static int minutesLastScan = -1; |
andrewboyson | 0:9af80a39adcc | 300 | if (minutesLastScan == minutesTodayUtc) return; //Start of new minute one-shot |
andrewboyson | 0:9af80a39adcc | 301 | minutesLastScan = minutesTodayUtc; |
andrewboyson | 0:9af80a39adcc | 302 | |
andrewboyson | 0:9af80a39adcc | 303 | for (int i = 0; i < WIZ_SCHED_MAX_ITEMS; i++) doSchedule(i); |
andrewboyson | 0:9af80a39adcc | 304 | } |
andrewboyson | 0:9af80a39adcc | 305 | void WizSchedInit() |
andrewboyson | 0:9af80a39adcc | 306 | { |
andrewboyson | 0:9af80a39adcc | 307 | for (int i = 0; i < WIZ_SCHED_MAX_ITEMS; i++) |
andrewboyson | 0:9af80a39adcc | 308 | { |
andrewboyson | 0:9af80a39adcc | 309 | GetWizSchedName (i, items[i].name ); |
andrewboyson | 0:9af80a39adcc | 310 | GetWizSchedOnDatum (i, &items[i].ondatum ); |
andrewboyson | 0:9af80a39adcc | 311 | GetWizSchedOnMinutes (i, &items[i].onminutes ); |
andrewboyson | 0:9af80a39adcc | 312 | GetWizSchedOffDatum (i, &items[i].offdatum ); |
andrewboyson | 0:9af80a39adcc | 313 | GetWizSchedOffMinutes(i, &items[i].offminutes); |
andrewboyson | 0:9af80a39adcc | 314 | } |
andrewboyson | 0:9af80a39adcc | 315 | } |