Allows my home wiz lights to be timed on and off according to a schedule.

Dependents:   heating

Committer:
andrewboyson
Date:
Wed Jun 09 09:23:54 2021 +0000
Revision:
7:3035a540ef65
Parent:
0:9af80a39adcc
Changed WizSchedMinutesUtcToLocal function so that local midnight in summer is 00h00 rather than 24h00.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:9af80a39adcc 1 #include <stdint.h>
andrewboyson 0:9af80a39adcc 2 #include <stdbool.h>
andrewboyson 0:9af80a39adcc 3 #include <string.h>
andrewboyson 0:9af80a39adcc 4
andrewboyson 0:9af80a39adcc 5 #include "user.h"
andrewboyson 0:9af80a39adcc 6 #include "log.h"
andrewboyson 0:9af80a39adcc 7 #include "eth.h"
andrewboyson 0:9af80a39adcc 8 #include "mac.h"
andrewboyson 0:9af80a39adcc 9 #include "ip4.h"
andrewboyson 0:9af80a39adcc 10 #include "ip4addr.h"
andrewboyson 0:9af80a39adcc 11 #include "wiz.h"
andrewboyson 0:9af80a39adcc 12 #include "wiz-list.h"
andrewboyson 0:9af80a39adcc 13
andrewboyson 0:9af80a39adcc 14 static char method [20];
andrewboyson 0:9af80a39adcc 15 static char env [20];
andrewboyson 0:9af80a39adcc 16 static char mac [20];
andrewboyson 0:9af80a39adcc 17 static char rssi [20];
andrewboyson 0:9af80a39adcc 18 static char src [20];
andrewboyson 0:9af80a39adcc 19 static char mqttCd [20];
andrewboyson 0:9af80a39adcc 20 static char ts [20];
andrewboyson 0:9af80a39adcc 21 static char state [20];
andrewboyson 0:9af80a39adcc 22 static char sceneId[20];
andrewboyson 0:9af80a39adcc 23 static char temp [20];
andrewboyson 0:9af80a39adcc 24 static char dimming[20];
andrewboyson 0:9af80a39adcc 25 static char id [20];
andrewboyson 0:9af80a39adcc 26 static char result [20];
andrewboyson 0:9af80a39adcc 27 static char success[20];
andrewboyson 0:9af80a39adcc 28
andrewboyson 0:9af80a39adcc 29 static void log()
andrewboyson 0:9af80a39adcc 30 {
andrewboyson 0:9af80a39adcc 31 MacLog(EthMacRemote);
andrewboyson 0:9af80a39adcc 32 Log(" ");
andrewboyson 0:9af80a39adcc 33 Ip4AddrLog(Ip4Remote);
andrewboyson 0:9af80a39adcc 34 if (*method ) { Log(" method:" ); Log(method ); }
andrewboyson 0:9af80a39adcc 35 if (*env ) { Log(" env:" ); Log(env ); }
andrewboyson 0:9af80a39adcc 36 if (*mac ) { Log(" mac:" ); Log(mac ); }
andrewboyson 0:9af80a39adcc 37 if (*rssi ) { Log(" rssi:" ); Log(rssi ); }
andrewboyson 0:9af80a39adcc 38 if (*src ) { Log(" src:" ); Log(src ); }
andrewboyson 0:9af80a39adcc 39 if (*mqttCd ) { Log(" mqttCd:" ); Log(mqttCd ); }
andrewboyson 0:9af80a39adcc 40 if (*ts ) { Log(" ts:" ); Log(ts ); }
andrewboyson 0:9af80a39adcc 41 if (*state ) { Log(" state:" ); Log(state ); }
andrewboyson 0:9af80a39adcc 42 if (*sceneId) { Log(" sceneId:"); Log(sceneId); }
andrewboyson 0:9af80a39adcc 43 if (*temp ) { Log(" temp:" ); Log(temp ); }
andrewboyson 0:9af80a39adcc 44 if (*dimming) { Log(" dimming:"); Log(dimming); }
andrewboyson 0:9af80a39adcc 45 if (*id ) { Log(" id:" ); Log(id ); }
andrewboyson 0:9af80a39adcc 46 if (*result ) { Log(" result:" ); Log(result ); }
andrewboyson 0:9af80a39adcc 47 if (*success) { Log(" success:"); Log(success); }
andrewboyson 0:9af80a39adcc 48 Log("\r\n");
andrewboyson 0:9af80a39adcc 49 }
andrewboyson 0:9af80a39adcc 50
andrewboyson 0:9af80a39adcc 51 static void handleNameValue(char* pName, char* pValue)
andrewboyson 0:9af80a39adcc 52 {
andrewboyson 0:9af80a39adcc 53 if (*pName == 0 ) return; //Ignore an empty name
andrewboyson 0:9af80a39adcc 54 if (*pName == '\n') return; //Ignore an empty name
andrewboyson 0:9af80a39adcc 55 if (*pName == '\r') return; //Ignore an empty name
andrewboyson 0:9af80a39adcc 56 if (strcmp(pName, "params" ) == 0) return; //Ignore the params name
andrewboyson 0:9af80a39adcc 57 else if (strcmp(pName, "method" ) == 0) strncpy(method , pValue, sizeof(method ));
andrewboyson 0:9af80a39adcc 58 else if (strcmp(pName, "env" ) == 0) strncpy(env , pValue, sizeof(env ));
andrewboyson 0:9af80a39adcc 59 else if (strcmp(pName, "mac" ) == 0) strncpy(mac , pValue, sizeof(mac ));
andrewboyson 0:9af80a39adcc 60 else if (strcmp(pName, "rssi" ) == 0) strncpy(rssi , pValue, sizeof(rssi ));
andrewboyson 0:9af80a39adcc 61 else if (strcmp(pName, "src" ) == 0) strncpy(src , pValue, sizeof(src ));
andrewboyson 0:9af80a39adcc 62 else if (strcmp(pName, "mqttCd" ) == 0) strncpy(mqttCd , pValue, sizeof(mqttCd ));
andrewboyson 0:9af80a39adcc 63 else if (strcmp(pName, "ts" ) == 0) strncpy(ts , pValue, sizeof(ts ));
andrewboyson 0:9af80a39adcc 64 else if (strcmp(pName, "state" ) == 0) strncpy(state , pValue, sizeof(state ));
andrewboyson 0:9af80a39adcc 65 else if (strcmp(pName, "sceneId" ) == 0) strncpy(sceneId, pValue, sizeof(sceneId));
andrewboyson 0:9af80a39adcc 66 else if (strcmp(pName, "temp" ) == 0) strncpy(temp , pValue, sizeof(temp ));
andrewboyson 0:9af80a39adcc 67 else if (strcmp(pName, "dimming" ) == 0) strncpy(dimming, pValue, sizeof(dimming));
andrewboyson 0:9af80a39adcc 68 else if (strcmp(pName, "id" ) == 0) strncpy(id , pValue, sizeof(id ));
andrewboyson 0:9af80a39adcc 69 else if (strcmp(pName, "result" ) == 0) strncpy(result , pValue, sizeof(result ));
andrewboyson 0:9af80a39adcc 70 else if (strcmp(pName, "success" ) == 0) strncpy(success, pValue, sizeof(success));
andrewboyson 0:9af80a39adcc 71 else if (strcmp(pName, "fwVersion" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 72 else if (strcmp(pName, "homeId" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 73 else if (strcmp(pName, "phoneIp" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 74 else if (strcmp(pName, "phoneMac" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 75 else if (strcmp(pName, "register" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 76 else if (strcmp(pName, "rad" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 77 else if (strcmp(pName, "updateStatus") == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 78 else if (strcmp(pName, "speed" ) == 0) return; //Ignore
andrewboyson 0:9af80a39adcc 79
andrewboyson 0:9af80a39adcc 80 else LogF("Unrecognised name '%s'\r\n", pName);
andrewboyson 0:9af80a39adcc 81 }
andrewboyson 0:9af80a39adcc 82 static void clear()
andrewboyson 0:9af80a39adcc 83 {
andrewboyson 0:9af80a39adcc 84 *method = 0;
andrewboyson 0:9af80a39adcc 85 *env = 0;
andrewboyson 0:9af80a39adcc 86 *mac = 0;
andrewboyson 0:9af80a39adcc 87 *rssi = 0;
andrewboyson 0:9af80a39adcc 88 *src = 0;
andrewboyson 0:9af80a39adcc 89 *mqttCd = 0;
andrewboyson 0:9af80a39adcc 90 *ts = 0;
andrewboyson 0:9af80a39adcc 91 *state = 0;
andrewboyson 0:9af80a39adcc 92 *sceneId = 0;
andrewboyson 0:9af80a39adcc 93 *temp = 0;
andrewboyson 0:9af80a39adcc 94 *dimming = 0;
andrewboyson 0:9af80a39adcc 95 *id = 0;
andrewboyson 0:9af80a39adcc 96 *result = 0;
andrewboyson 0:9af80a39adcc 97 *success = 0;
andrewboyson 0:9af80a39adcc 98 }
andrewboyson 0:9af80a39adcc 99 static void decodePacket(int length, char* pData)
andrewboyson 0:9af80a39adcc 100 {
andrewboyson 0:9af80a39adcc 101 clear();
andrewboyson 0:9af80a39adcc 102 int i = 0;
andrewboyson 0:9af80a39adcc 103 bool finished = length <= 0;
andrewboyson 0:9af80a39adcc 104 char name[20];
andrewboyson 0:9af80a39adcc 105 char value[20];
andrewboyson 0:9af80a39adcc 106 char* pName = name;
andrewboyson 0:9af80a39adcc 107 char* pValue = value;
andrewboyson 0:9af80a39adcc 108 char* p = name;
andrewboyson 0:9af80a39adcc 109 *pValue = 0;
andrewboyson 0:9af80a39adcc 110 while(!finished)
andrewboyson 0:9af80a39adcc 111 {
andrewboyson 0:9af80a39adcc 112 switch (pData[i])
andrewboyson 0:9af80a39adcc 113 {
andrewboyson 0:9af80a39adcc 114 case 0: //Finish if EoS
andrewboyson 0:9af80a39adcc 115 finished = true;
andrewboyson 0:9af80a39adcc 116 *p = 0;
andrewboyson 0:9af80a39adcc 117 handleNameValue(name, value);
andrewboyson 0:9af80a39adcc 118 break;
andrewboyson 0:9af80a39adcc 119 case '\"': //Ignore paranthesis
andrewboyson 0:9af80a39adcc 120 break;
andrewboyson 0:9af80a39adcc 121 case '{': //End of name value pair
andrewboyson 0:9af80a39adcc 122 case '}':
andrewboyson 0:9af80a39adcc 123 case ',':
andrewboyson 0:9af80a39adcc 124 *p = 0;
andrewboyson 0:9af80a39adcc 125 handleNameValue(name, value);
andrewboyson 0:9af80a39adcc 126 p = name;
andrewboyson 0:9af80a39adcc 127 *pValue = 0;
andrewboyson 0:9af80a39adcc 128 *p = 0;
andrewboyson 0:9af80a39adcc 129 break;
andrewboyson 0:9af80a39adcc 130 case ':':
andrewboyson 0:9af80a39adcc 131 *p = 0;
andrewboyson 0:9af80a39adcc 132 p = value;
andrewboyson 0:9af80a39adcc 133 *p = 0;
andrewboyson 0:9af80a39adcc 134 break;
andrewboyson 0:9af80a39adcc 135 default:
andrewboyson 0:9af80a39adcc 136 *p++ = pData[i];
andrewboyson 0:9af80a39adcc 137 break;
andrewboyson 0:9af80a39adcc 138 }
andrewboyson 0:9af80a39adcc 139 i++;
andrewboyson 0:9af80a39adcc 140 if (i == length)
andrewboyson 0:9af80a39adcc 141 {
andrewboyson 0:9af80a39adcc 142 finished = true;
andrewboyson 0:9af80a39adcc 143 *p = 0;
andrewboyson 0:9af80a39adcc 144 handleNameValue(name, value);
andrewboyson 0:9af80a39adcc 145 }
andrewboyson 0:9af80a39adcc 146 }
andrewboyson 0:9af80a39adcc 147 if (WizTrace) log();
andrewboyson 0:9af80a39adcc 148
andrewboyson 0:9af80a39adcc 149 if (strcmp(method, "syncPilot" ) == 0 ) WizListStatusAdd(EthMacRemote, rssi, state, sceneId, dimming);
andrewboyson 0:9af80a39adcc 150 else if (strcmp(method, "registration") == 0 ) ; //Ignore registration method
andrewboyson 0:9af80a39adcc 151 else if (strcmp(method, "firstBeat" ) == 0 ) ; //Ignore firstBeat method
andrewboyson 0:9af80a39adcc 152 else if (strcmp(method, "syncAccEvt" ) == 0 ) ; //Ignore syncAccEvt method
andrewboyson 0:9af80a39adcc 153 else if (strcmp(method, "updateOta" ) == 0 ) ; //Ignore updateOta method
andrewboyson 0:9af80a39adcc 154 else if (strcmp(method, "setPilot" ) == 0 && strcmp(success, "true") == 0) WizListReceivedSuccess(EthMacRemote);
andrewboyson 0:9af80a39adcc 155 else LogF("Unrecognised method '%s' in %.*s\r\n", method, length, pData);
andrewboyson 0:9af80a39adcc 156 }
andrewboyson 0:9af80a39adcc 157
andrewboyson 0:9af80a39adcc 158 static int handleReceivedPacket(uint16_t port, void (*traceback)(void), int dataLengthRx, char* pDataRx, int* pPataLengthTx, char* pDataTx)
andrewboyson 0:9af80a39adcc 159 {
andrewboyson 0:9af80a39adcc 160 if (WizTrace)
andrewboyson 0:9af80a39adcc 161 {
andrewboyson 0:9af80a39adcc 162 LogTimeF("WIZ packet received on port %u\r\n", port);
andrewboyson 0:9af80a39adcc 163 traceback();
andrewboyson 0:9af80a39adcc 164 LogF("%.*s\r\n", dataLengthRx, pDataRx);
andrewboyson 0:9af80a39adcc 165 }
andrewboyson 0:9af80a39adcc 166 decodePacket(dataLengthRx, pDataRx);
andrewboyson 0:9af80a39adcc 167 pPataLengthTx = 0;
andrewboyson 0:9af80a39adcc 168 return 0;
andrewboyson 0:9af80a39adcc 169 }
andrewboyson 0:9af80a39adcc 170
andrewboyson 0:9af80a39adcc 171 void WizRecvInit()
andrewboyson 0:9af80a39adcc 172 {
andrewboyson 0:9af80a39adcc 173 UserUdpPort1 = 38899;
andrewboyson 0:9af80a39adcc 174 UserUdpPort2 = 38900;
andrewboyson 0:9af80a39adcc 175 UserHandleReceivedUdpPacket = handleReceivedPacket;
andrewboyson 0:9af80a39adcc 176 }