LED light control using webifyed ECHONET Light protocol
Dependencies: EthernetInterface MbedJSONValue WebSocketClient mbed-rtos mbed
main.cpp@1:fefc6c8b9864, 2012-11-29 (annotated)
- Committer:
- kaz260
- Date:
- Thu Nov 29 11:30:40 2012 +0000
- Revision:
- 1:fefc6c8b9864
- Parent:
- 0:9a6234efda72
bug fix
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kaz260 | 1:fefc6c8b9864 | 1 | ////////////////////////////////////////////////////////// |
kaz260 | 1:fefc6c8b9864 | 2 | // Kaz Technology Lab. // |
kaz260 | 1:fefc6c8b9864 | 3 | // 2012.11.29 // |
kaz260 | 1:fefc6c8b9864 | 4 | // PROJECT: ECHONET Light over WebSocket // |
kaz260 | 1:fefc6c8b9864 | 5 | ////////////////////////////////////////////////////////// |
kaz260 | 1:fefc6c8b9864 | 6 | |
kaz260 | 1:fefc6c8b9864 | 7 | #include "mbed.h" |
kaz260 | 1:fefc6c8b9864 | 8 | #include "EthernetInterface.h" |
kaz260 | 1:fefc6c8b9864 | 9 | #include "Websocket.h" |
kaz260 | 1:fefc6c8b9864 | 10 | #include "MbedJSONValue.h" |
kaz260 | 1:fefc6c8b9864 | 11 | |
kaz260 | 1:fefc6c8b9864 | 12 | #define BASE_URL "ws://129.60.20.254:8080/ws/sensors/rw" |
kaz260 | 1:fefc6c8b9864 | 13 | |
kaz260 | 1:fefc6c8b9864 | 14 | // illuminance control |
kaz260 | 1:fefc6c8b9864 | 15 | PwmOut ilc(p21); |
kaz260 | 1:fefc6c8b9864 | 16 | |
kaz260 | 1:fefc6c8b9864 | 17 | // response control flag |
kaz260 | 1:fefc6c8b9864 | 18 | int sendFlag = 0; |
kaz260 | 1:fefc6c8b9864 | 19 | |
kaz260 | 1:fefc6c8b9864 | 20 | // transaction ID |
kaz260 | 1:fefc6c8b9864 | 21 | int transactionId = 0; |
kaz260 | 1:fefc6c8b9864 | 22 | |
kaz260 | 1:fefc6c8b9864 | 23 | // Super Class Device Object |
kaz260 | 1:fefc6c8b9864 | 24 | string operatingStatus = ""; |
kaz260 | 1:fefc6c8b9864 | 25 | string operatingStatus_prev = ""; |
kaz260 | 1:fefc6c8b9864 | 26 | string classCode = "GeneralLighting"; |
kaz260 | 1:fefc6c8b9864 | 27 | string instanceCode = "L0001"; |
kaz260 | 1:fefc6c8b9864 | 28 | |
kaz260 | 1:fefc6c8b9864 | 29 | // General Lighing Class Object |
kaz260 | 1:fefc6c8b9864 | 30 | int illuminanceLevel = 100; |
kaz260 | 1:fefc6c8b9864 | 31 | int illuminanceLevel_prev = 100; |
kaz260 | 1:fefc6c8b9864 | 32 | |
kaz260 | 1:fefc6c8b9864 | 33 | int main() { |
kaz260 | 1:fefc6c8b9864 | 34 | char buf[200]; |
kaz260 | 1:fefc6c8b9864 | 35 | Timer timer; |
kaz260 | 1:fefc6c8b9864 | 36 | MbedJSONValue json_r, json_s; |
kaz260 | 1:fefc6c8b9864 | 37 | |
kaz260 | 1:fefc6c8b9864 | 38 | //PWM frequency |
kaz260 | 1:fefc6c8b9864 | 39 | ilc.period_ms(5); |
kaz260 | 1:fefc6c8b9864 | 40 | // setup Ethernet Interface |
kaz260 | 1:fefc6c8b9864 | 41 | EthernetInterface eth; |
kaz260 | 1:fefc6c8b9864 | 42 | // eth.init(); //Use DHCP |
kaz260 | 1:fefc6c8b9864 | 43 | eth.init("192.168.111.21", "255.255.255.0", "192.168.111.1"); |
kaz260 | 1:fefc6c8b9864 | 44 | eth.connect(); |
kaz260 | 1:fefc6c8b9864 | 45 | printf("IP Address is %s\n\r", eth.getIPAddress()); |
kaz260 | 1:fefc6c8b9864 | 46 | |
kaz260 | 1:fefc6c8b9864 | 47 | //WebSocket instance |
kaz260 | 1:fefc6c8b9864 | 48 | Websocket ws(BASE_URL); |
kaz260 | 1:fefc6c8b9864 | 49 | |
kaz260 | 1:fefc6c8b9864 | 50 | //attempt to make a connection |
kaz260 | 1:fefc6c8b9864 | 51 | while(! ws.connect()) { |
kaz260 | 1:fefc6c8b9864 | 52 | printf("cannot connect WebSocket, retrying...\r\n"); |
kaz260 | 1:fefc6c8b9864 | 53 | wait(2); |
kaz260 | 1:fefc6c8b9864 | 54 | } |
kaz260 | 1:fefc6c8b9864 | 55 | printf("WebSocket connected!\r\n"); |
kaz260 | 1:fefc6c8b9864 | 56 | |
kaz260 | 1:fefc6c8b9864 | 57 | //INFO timer |
kaz260 | 1:fefc6c8b9864 | 58 | timer.start(); |
kaz260 | 1:fefc6c8b9864 | 59 | |
kaz260 | 1:fefc6c8b9864 | 60 | while(true) { |
kaz260 | 1:fefc6c8b9864 | 61 | // send INFO |
kaz260 | 1:fefc6c8b9864 | 62 | if (timer.read() > 10) { // device sends INFO every 10 seconds |
kaz260 | 1:fefc6c8b9864 | 63 | json_s["TransactionID"] = transactionId; |
kaz260 | 1:fefc6c8b9864 | 64 | json_s["ESV"] = "INFO"; |
kaz260 | 1:fefc6c8b9864 | 65 | json_s["ClassCode"] = classCode; |
kaz260 | 1:fefc6c8b9864 | 66 | json_s["InstanceCode"] = instanceCode; |
kaz260 | 1:fefc6c8b9864 | 67 | json_s["OperatingStatus"] = operatingStatus; |
kaz260 | 1:fefc6c8b9864 | 68 | |
kaz260 | 1:fefc6c8b9864 | 69 | // power consumption = V * I * duty cycle (in mW) |
kaz260 | 1:fefc6c8b9864 | 70 | json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); |
kaz260 | 1:fefc6c8b9864 | 71 | transactionId++; |
kaz260 | 1:fefc6c8b9864 | 72 | |
kaz260 | 1:fefc6c8b9864 | 73 | printf("json_s: %s\r\n", json_s.serialize()); |
kaz260 | 1:fefc6c8b9864 | 74 | ws.send((char*)json_s.serialize().c_str()); |
kaz260 | 1:fefc6c8b9864 | 75 | timer.reset(); |
kaz260 | 1:fefc6c8b9864 | 76 | } |
kaz260 | 1:fefc6c8b9864 | 77 | |
kaz260 | 1:fefc6c8b9864 | 78 | if (ws.read(buf)) { |
kaz260 | 1:fefc6c8b9864 | 79 | parse(json_r, buf); |
kaz260 | 1:fefc6c8b9864 | 80 | printf("json: %s\r\n", json_r.serialize()); |
kaz260 | 1:fefc6c8b9864 | 81 | |
kaz260 | 1:fefc6c8b9864 | 82 | if(strcmp(json_r["ESV"].get<std::string>().c_str(), "Get") == 0){ |
kaz260 | 1:fefc6c8b9864 | 83 | if(json_r.hasMember("OperatingStatus")){ |
kaz260 | 1:fefc6c8b9864 | 84 | json_s["OperatingStatus"] = operatingStatus; |
kaz260 | 1:fefc6c8b9864 | 85 | } |
kaz260 | 1:fefc6c8b9864 | 86 | else if(json_r.hasMember("IlluminanceLevel")){ |
kaz260 | 1:fefc6c8b9864 | 87 | json_s["IlluminanceLevel"] = illuminanceLevel; |
kaz260 | 1:fefc6c8b9864 | 88 | } |
kaz260 | 1:fefc6c8b9864 | 89 | else if(json_r.hasMember("PowerConsumption")){ |
kaz260 | 1:fefc6c8b9864 | 90 | // power consumption = V * I * duty cycle (in mW) |
kaz260 | 1:fefc6c8b9864 | 91 | json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); |
kaz260 | 1:fefc6c8b9864 | 92 | } |
kaz260 | 1:fefc6c8b9864 | 93 | json_s["ESV"] = "Get_Res"; |
kaz260 | 1:fefc6c8b9864 | 94 | sendFlag = 1; |
kaz260 | 1:fefc6c8b9864 | 95 | } |
kaz260 | 1:fefc6c8b9864 | 96 | |
kaz260 | 1:fefc6c8b9864 | 97 | if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetI") == 0){ |
kaz260 | 1:fefc6c8b9864 | 98 | if(json_r.hasMember("OperatingStatus")){ |
kaz260 | 1:fefc6c8b9864 | 99 | operatingStatus_prev = operatingStatus; |
kaz260 | 1:fefc6c8b9864 | 100 | operatingStatus = json_r["OperatingStatus"].get<std::string>().c_str(); |
kaz260 | 1:fefc6c8b9864 | 101 | if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ |
kaz260 | 1:fefc6c8b9864 | 102 | if(strcmp(operatingStatus.c_str(), "ON") == 0){ |
kaz260 | 1:fefc6c8b9864 | 103 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 104 | } |
kaz260 | 1:fefc6c8b9864 | 105 | if(strcmp(operatingStatus.c_str(), "OFF") == 0){ |
kaz260 | 1:fefc6c8b9864 | 106 | ilc = 0.0; |
kaz260 | 1:fefc6c8b9864 | 107 | } |
kaz260 | 1:fefc6c8b9864 | 108 | } |
kaz260 | 1:fefc6c8b9864 | 109 | } |
kaz260 | 1:fefc6c8b9864 | 110 | else if(json_r.hasMember("IlluminanceLevel")){ |
kaz260 | 1:fefc6c8b9864 | 111 | illuminanceLevel_prev = illuminanceLevel; |
kaz260 | 1:fefc6c8b9864 | 112 | illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); |
kaz260 | 1:fefc6c8b9864 | 113 | if(illuminanceLevel_prev != illuminanceLevel){ |
kaz260 | 1:fefc6c8b9864 | 114 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 115 | } |
kaz260 | 1:fefc6c8b9864 | 116 | } |
kaz260 | 1:fefc6c8b9864 | 117 | sendFlag = 0; |
kaz260 | 1:fefc6c8b9864 | 118 | } |
kaz260 | 1:fefc6c8b9864 | 119 | |
kaz260 | 1:fefc6c8b9864 | 120 | if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetC") == 0){ |
kaz260 | 1:fefc6c8b9864 | 121 | printf("ESV: SetC\r\n"); |
kaz260 | 1:fefc6c8b9864 | 122 | if(json_r.hasMember("OperatingStatus")){ |
kaz260 | 1:fefc6c8b9864 | 123 | operatingStatus_prev = operatingStatus; |
kaz260 | 1:fefc6c8b9864 | 124 | operatingStatus = json_r["OperatingStatus"].get<std::string>(); |
kaz260 | 1:fefc6c8b9864 | 125 | if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) != 0){ |
kaz260 | 1:fefc6c8b9864 | 126 | if(strcmp(operatingStatus.c_str(), "ON") == 0){ |
kaz260 | 1:fefc6c8b9864 | 127 | printf("operationgStatus --> ON\r\n"); |
kaz260 | 1:fefc6c8b9864 | 128 | json_s["OperatingStatus"] = "ON"; |
kaz260 | 1:fefc6c8b9864 | 129 | if(illuminanceLevel_prev == 0) { |
kaz260 | 1:fefc6c8b9864 | 130 | illuminanceLevel = 100; |
kaz260 | 1:fefc6c8b9864 | 131 | illuminanceLevel_prev = 100; |
kaz260 | 1:fefc6c8b9864 | 132 | } |
kaz260 | 1:fefc6c8b9864 | 133 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 134 | } |
kaz260 | 1:fefc6c8b9864 | 135 | if(strcmp(operatingStatus.c_str(), "OFF") == 0){ |
kaz260 | 1:fefc6c8b9864 | 136 | json_s["OperatingStatus"] = "OFF"; |
kaz260 | 1:fefc6c8b9864 | 137 | printf("operatingStatus --> OFF\r\n"); |
kaz260 | 1:fefc6c8b9864 | 138 | ilc = 0.0; |
kaz260 | 1:fefc6c8b9864 | 139 | } |
kaz260 | 1:fefc6c8b9864 | 140 | } |
kaz260 | 1:fefc6c8b9864 | 141 | } |
kaz260 | 1:fefc6c8b9864 | 142 | if(json_r.hasMember("IlluminanceLevel")){ |
kaz260 | 1:fefc6c8b9864 | 143 | illuminanceLevel_prev = illuminanceLevel; |
kaz260 | 1:fefc6c8b9864 | 144 | illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); |
kaz260 | 1:fefc6c8b9864 | 145 | if(illuminanceLevel_prev != illuminanceLevel){ |
kaz260 | 1:fefc6c8b9864 | 146 | printf("illminanceLevel --> %d\r\n", illuminanceLevel); |
kaz260 | 1:fefc6c8b9864 | 147 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 148 | json_s["IlluminanceLevel"] = illuminanceLevel; |
kaz260 | 1:fefc6c8b9864 | 149 | } |
kaz260 | 1:fefc6c8b9864 | 150 | } |
kaz260 | 1:fefc6c8b9864 | 151 | json_s["ESV"] = "SetC_Res"; |
kaz260 | 1:fefc6c8b9864 | 152 | sendFlag = 1; |
kaz260 | 1:fefc6c8b9864 | 153 | } |
kaz260 | 1:fefc6c8b9864 | 154 | |
kaz260 | 1:fefc6c8b9864 | 155 | if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetGet") == 0){ |
kaz260 | 1:fefc6c8b9864 | 156 | if(json_r.hasMember("OperatingStatus")){ |
kaz260 | 1:fefc6c8b9864 | 157 | operatingStatus_prev = operatingStatus; |
kaz260 | 1:fefc6c8b9864 | 158 | operatingStatus = json_r["OperatingStatus"].get<std::string>(); |
kaz260 | 1:fefc6c8b9864 | 159 | if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ |
kaz260 | 1:fefc6c8b9864 | 160 | if(strcmp(operatingStatus.c_str(), "ON") == 0){ |
kaz260 | 1:fefc6c8b9864 | 161 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 162 | } |
kaz260 | 1:fefc6c8b9864 | 163 | if(strcmp(operatingStatus.c_str(), "OFF") == 0){ |
kaz260 | 1:fefc6c8b9864 | 164 | ilc = 0.0; |
kaz260 | 1:fefc6c8b9864 | 165 | } |
kaz260 | 1:fefc6c8b9864 | 166 | } |
kaz260 | 1:fefc6c8b9864 | 167 | } |
kaz260 | 1:fefc6c8b9864 | 168 | if(json_r.hasMember("IlluminanceLevel")){ |
kaz260 | 1:fefc6c8b9864 | 169 | illuminanceLevel_prev = illuminanceLevel; |
kaz260 | 1:fefc6c8b9864 | 170 | illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); |
kaz260 | 1:fefc6c8b9864 | 171 | if(illuminanceLevel_prev != illuminanceLevel){ |
kaz260 | 1:fefc6c8b9864 | 172 | ilc = illuminanceLevel / 100.0; |
kaz260 | 1:fefc6c8b9864 | 173 | } |
kaz260 | 1:fefc6c8b9864 | 174 | } |
kaz260 | 1:fefc6c8b9864 | 175 | json_s["ESV"] = "SetGet_Res"; |
kaz260 | 1:fefc6c8b9864 | 176 | json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); |
kaz260 | 1:fefc6c8b9864 | 177 | sendFlag = 1; |
kaz260 | 1:fefc6c8b9864 | 178 | } |
kaz260 | 1:fefc6c8b9864 | 179 | |
kaz260 | 1:fefc6c8b9864 | 180 | if(sendFlag == 1){ |
kaz260 | 1:fefc6c8b9864 | 181 | json_s["TransactionID"] = transactionId; |
kaz260 | 1:fefc6c8b9864 | 182 | json_s["ClassCode"] = classCode; |
kaz260 | 1:fefc6c8b9864 | 183 | json_s["InstanceCode"] = instanceCode; |
kaz260 | 1:fefc6c8b9864 | 184 | |
kaz260 | 1:fefc6c8b9864 | 185 | printf("json_s: %s\r\n", json_s.serialize()); |
kaz260 | 1:fefc6c8b9864 | 186 | ws.send((char*)json_s.serialize().c_str()); |
kaz260 | 1:fefc6c8b9864 | 187 | sendFlag = 0; |
kaz260 | 1:fefc6c8b9864 | 188 | transactionId++; |
kaz260 | 1:fefc6c8b9864 | 189 | } |
kaz260 | 1:fefc6c8b9864 | 190 | } |
kaz260 | 1:fefc6c8b9864 | 191 | |
kaz260 | 1:fefc6c8b9864 | 192 | if (! ws.is_connected()) { |
kaz260 | 1:fefc6c8b9864 | 193 | printf("disconnected\r\n"); |
kaz260 | 1:fefc6c8b9864 | 194 | exit(0); |
kaz260 | 1:fefc6c8b9864 | 195 | } |
kaz260 | 1:fefc6c8b9864 | 196 | } |
kaz260 | 0:9a6234efda72 | 197 | } |