LED light control using webifyed ECHONET Light protocol

Dependencies:   EthernetInterface MbedJSONValue WebSocketClient mbed-rtos mbed

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?

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