LED light control using webifyed ECHONET Light protocol
Dependencies: EthernetInterface MbedJSONValue WebSocketClient mbed-rtos mbed
Revision 1:fefc6c8b9864, committed 2012-11-29
- Comitter:
- kaz260
- Date:
- Thu Nov 29 11:30:40 2012 +0000
- Parent:
- 0:9a6234efda72
- Commit message:
- bug fix
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 9a6234efda72 -r fefc6c8b9864 main.cpp --- a/main.cpp Thu Nov 29 00:35:33 2012 +0000 +++ b/main.cpp Thu Nov 29 11:30:40 2012 +0000 @@ -1,198 +1,197 @@ -////////////////////////////////////////////////////////// -// Kaz Technology Lab. // -// 2012.11.29 // -// PROJECT: ECHONET Light over WebSocket // -////////////////////////////////////////////////////////// - -#include "mbed.h" -#include "EthernetInterface.h" -#include "Websocket.h" -#include "MbedJSONValue.h" - -#define BASE_URL "ws://129.60.20.254:8080/ws/sensors/rw" - -// illuminance control -PwmOut ilc(p21); - -// response control flag -int sendFlag = 0; - -// transaction ID -int transactionId = 0; - -// Super Class Device Object -string operatingStatus = ""; -string operatingStatus_prev = ""; -string classCode = "GeneralLighting"; -string instanceCode = "L0001"; - -// General Lighing Class Object -int illuminanceLevel = 100; -int illuminanceLevel_prev = 100; - -int main() { - char buf[200]; - Timer timer; - - //PWM frequency - ilc.period_ms(5); - - // setup Ethernet Interface - EthernetInterface eth; -// eth.init(); //Use DHCP - eth.init("192.168.11.21", "255.255.255.0", "192.168.11.254"); - eth.connect(); - printf("IP Address is %s\n\r", eth.getIPAddress()); - - //WebSocket instance - Websocket ws(BASE_URL); - - //attempt to make a connection - while(! ws.connect()) { - printf("cannot connect WebSocket, retrying...\r\n"); - wait(2); - } - printf("WebSocket connected!\r\n"); - - //INFO timer - timer.start(); - - while(true) { - MbedJSONValue json_r, json_s; - // send INFO - if (timer.read() > 10) { // device sends INFO every 10 seconds - json_s["TransactionID"] = transactionId; - json_s["ESV"] = "INFO"; - json_s["ClassCode"] = classCode; - json_s["InstanceCode"] = instanceCode; - json_s["OperatingStatus"] = operatingStatus; - - // power consumption = V * I * duty cycle (in mW) - json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); - transactionId++; - - printf("json_s: %s\r\n", json_s.serialize()); - ws.send((char*)json_s.serialize().c_str()); - timer.reset(); - } - - if (ws.read(buf)) { - parse(json_r, buf); - printf("json: %s\r\n", json_r.serialize()); - - if(strcmp(json_r["ESV"].get<std::string>().c_str(), "Get") == 0){ - if(json_r.hasMember("OperatingStatus")){ - json_s["OperatingStatus"] = operatingStatus; - } - else if(json_r.hasMember("IlluminanceLevel")){ - json_s["IlluminanceLevel"] = illuminanceLevel; - } - else if(json_r.hasMember("PowerConsumption")){ - // power consumption = V * I * duty cycle (in mW) - json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); - } - json_s["ESV"] = "Get_Res"; - sendFlag = 1; - } - - if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetI") == 0){ - if(json_r.hasMember("OperatingStatus")){ - operatingStatus_prev = operatingStatus; - operatingStatus = json_r["OperatingStatus"].get<std::string>().c_str(); - if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ - if(strcmp(operatingStatus.c_str(), "ON") == 0){ - ilc = illuminanceLevel / 100.0; - } - if(strcmp(operatingStatus.c_str(), "OFF") == 0){ - ilc = 0.0; - } - } - } - else if(json_r.hasMember("IlluminanceLevel")){ - illuminanceLevel_prev = illuminanceLevel; - illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); - if(illuminanceLevel_prev != illuminanceLevel){ - ilc = illuminanceLevel / 100.0; - } - } - sendFlag = 0; - } - - if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetC") == 0){ - printf("ESV: SetC\r\n"); - if(json_r.hasMember("OperatingStatus")){ - operatingStatus_prev = operatingStatus; - operatingStatus = json_r["OperatingStatus"].get<std::string>(); - if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) != 0){ - if(strcmp(operatingStatus.c_str(), "ON") == 0){ - printf("operationgStatus --> ON\r\n"); - json_s["OperatingStatus"] = "ON"; - if(illuminanceLevel_prev == 0) { - illuminanceLevel = 100; - illuminanceLevel_prev = 100; - } - ilc = illuminanceLevel / 100.0; - } - if(strcmp(operatingStatus.c_str(), "OFF") == 0){ - json_s["OperatingStatus"] = "OFF"; - printf("operatingStatus --> OFF\r\n"); - ilc = 0.0; - } - } - } - if(json_r.hasMember("IlluminanceLevel")){ - illuminanceLevel_prev = illuminanceLevel; - illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); - if(illuminanceLevel_prev != illuminanceLevel){ - printf("illminanceLevel --> %d\r\n", illuminanceLevel); - ilc = illuminanceLevel / 100.0; - json_s["IlluminanceLevel"] = illuminanceLevel; - } - } - json_s["ESV"] = "SetC_Res"; - sendFlag = 1; - } - - if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetGet") == 0){ - if(json_r.hasMember("OperatingStatus")){ - operatingStatus_prev = operatingStatus; - operatingStatus = json_r["OperatingStatus"].get<std::string>(); - if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ - if(strcmp(operatingStatus.c_str(), "ON") == 0){ - ilc = illuminanceLevel / 100.0; - } - if(strcmp(operatingStatus.c_str(), "OFF") == 0){ - ilc = 0.0; - } - } - } - if(json_r.hasMember("IlluminanceLevel")){ - illuminanceLevel_prev = illuminanceLevel; - illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); - if(illuminanceLevel_prev != illuminanceLevel){ - ilc = illuminanceLevel / 100.0; - } - } - json_s["ESV"] = "SetGet_Res"; - json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); - sendFlag = 1; - } - - if(sendFlag == 1){ - json_s["TransactionID"] = transactionId; - json_s["ClassCode"] = classCode; - json_s["InstanceCode"] = instanceCode; - - printf("json_s: %s\r\n", json_s.serialize()); - ws.send((char*)json_s.serialize().c_str()); - sendFlag = 0; - transactionId++; - } - } - - if (! ws.is_connected()) { - printf("disconnected\r\n"); - exit(0); - } - } +////////////////////////////////////////////////////////// +// Kaz Technology Lab. // +// 2012.11.29 // +// PROJECT: ECHONET Light over WebSocket // +////////////////////////////////////////////////////////// + +#include "mbed.h" +#include "EthernetInterface.h" +#include "Websocket.h" +#include "MbedJSONValue.h" + +#define BASE_URL "ws://129.60.20.254:8080/ws/sensors/rw" + +// illuminance control +PwmOut ilc(p21); + +// response control flag +int sendFlag = 0; + +// transaction ID +int transactionId = 0; + +// Super Class Device Object +string operatingStatus = ""; +string operatingStatus_prev = ""; +string classCode = "GeneralLighting"; +string instanceCode = "L0001"; + +// General Lighing Class Object +int illuminanceLevel = 100; +int illuminanceLevel_prev = 100; + +int main() { + char buf[200]; + Timer timer; + MbedJSONValue json_r, json_s; + + //PWM frequency + ilc.period_ms(5); + // setup Ethernet Interface + EthernetInterface eth; +// eth.init(); //Use DHCP + eth.init("192.168.111.21", "255.255.255.0", "192.168.111.1"); + eth.connect(); + printf("IP Address is %s\n\r", eth.getIPAddress()); + + //WebSocket instance + Websocket ws(BASE_URL); + + //attempt to make a connection + while(! ws.connect()) { + printf("cannot connect WebSocket, retrying...\r\n"); + wait(2); + } + printf("WebSocket connected!\r\n"); + + //INFO timer + timer.start(); + + while(true) { + // send INFO + if (timer.read() > 10) { // device sends INFO every 10 seconds + json_s["TransactionID"] = transactionId; + json_s["ESV"] = "INFO"; + json_s["ClassCode"] = classCode; + json_s["InstanceCode"] = instanceCode; + json_s["OperatingStatus"] = operatingStatus; + + // power consumption = V * I * duty cycle (in mW) + json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); + transactionId++; + + printf("json_s: %s\r\n", json_s.serialize()); + ws.send((char*)json_s.serialize().c_str()); + timer.reset(); + } + + if (ws.read(buf)) { + parse(json_r, buf); + printf("json: %s\r\n", json_r.serialize()); + + if(strcmp(json_r["ESV"].get<std::string>().c_str(), "Get") == 0){ + if(json_r.hasMember("OperatingStatus")){ + json_s["OperatingStatus"] = operatingStatus; + } + else if(json_r.hasMember("IlluminanceLevel")){ + json_s["IlluminanceLevel"] = illuminanceLevel; + } + else if(json_r.hasMember("PowerConsumption")){ + // power consumption = V * I * duty cycle (in mW) + json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); + } + json_s["ESV"] = "Get_Res"; + sendFlag = 1; + } + + if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetI") == 0){ + if(json_r.hasMember("OperatingStatus")){ + operatingStatus_prev = operatingStatus; + operatingStatus = json_r["OperatingStatus"].get<std::string>().c_str(); + if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ + if(strcmp(operatingStatus.c_str(), "ON") == 0){ + ilc = illuminanceLevel / 100.0; + } + if(strcmp(operatingStatus.c_str(), "OFF") == 0){ + ilc = 0.0; + } + } + } + else if(json_r.hasMember("IlluminanceLevel")){ + illuminanceLevel_prev = illuminanceLevel; + illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); + if(illuminanceLevel_prev != illuminanceLevel){ + ilc = illuminanceLevel / 100.0; + } + } + sendFlag = 0; + } + + if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetC") == 0){ + printf("ESV: SetC\r\n"); + if(json_r.hasMember("OperatingStatus")){ + operatingStatus_prev = operatingStatus; + operatingStatus = json_r["OperatingStatus"].get<std::string>(); + if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) != 0){ + if(strcmp(operatingStatus.c_str(), "ON") == 0){ + printf("operationgStatus --> ON\r\n"); + json_s["OperatingStatus"] = "ON"; + if(illuminanceLevel_prev == 0) { + illuminanceLevel = 100; + illuminanceLevel_prev = 100; + } + ilc = illuminanceLevel / 100.0; + } + if(strcmp(operatingStatus.c_str(), "OFF") == 0){ + json_s["OperatingStatus"] = "OFF"; + printf("operatingStatus --> OFF\r\n"); + ilc = 0.0; + } + } + } + if(json_r.hasMember("IlluminanceLevel")){ + illuminanceLevel_prev = illuminanceLevel; + illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); + if(illuminanceLevel_prev != illuminanceLevel){ + printf("illminanceLevel --> %d\r\n", illuminanceLevel); + ilc = illuminanceLevel / 100.0; + json_s["IlluminanceLevel"] = illuminanceLevel; + } + } + json_s["ESV"] = "SetC_Res"; + sendFlag = 1; + } + + if(strcmp(json_r["ESV"].get<std::string>().c_str(), "SetGet") == 0){ + if(json_r.hasMember("OperatingStatus")){ + operatingStatus_prev = operatingStatus; + operatingStatus = json_r["OperatingStatus"].get<std::string>(); + if(strcmp(operatingStatus_prev.c_str(), operatingStatus.c_str()) == 0){ + if(strcmp(operatingStatus.c_str(), "ON") == 0){ + ilc = illuminanceLevel / 100.0; + } + if(strcmp(operatingStatus.c_str(), "OFF") == 0){ + ilc = 0.0; + } + } + } + if(json_r.hasMember("IlluminanceLevel")){ + illuminanceLevel_prev = illuminanceLevel; + illuminanceLevel = json_r["IlluminanceLevel"].get<int>(); + if(illuminanceLevel_prev != illuminanceLevel){ + ilc = illuminanceLevel / 100.0; + } + } + json_s["ESV"] = "SetGet_Res"; + json_s["PowerConsumption"] = int(12.0 * 40.0 * ilc.read()); + sendFlag = 1; + } + + if(sendFlag == 1){ + json_s["TransactionID"] = transactionId; + json_s["ClassCode"] = classCode; + json_s["InstanceCode"] = instanceCode; + + printf("json_s: %s\r\n", json_s.serialize()); + ws.send((char*)json_s.serialize().c_str()); + sendFlag = 0; + transactionId++; + } + } + + if (! ws.is_connected()) { + printf("disconnected\r\n"); + exit(0); + } + } } \ No newline at end of file