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