LED light control using webifyed ECHONET Light protocol

Dependencies:   EthernetInterface MbedJSONValue WebSocketClient mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }