From e322b5ddcdc117f9d7801482af227c70b14ab317 Mon Sep 17 00:00:00 2001 From: Jens Christian True Date: Mon, 15 Jul 2019 15:19:15 +0200 Subject: [PATCH 1/7] Feature fork --- src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 022586c..f52a415 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,9 @@ bool powerOnHandler(const HomieRange& range, const String& value) { return true; } +bool powerTimerHandler(const HomieRange& range, const String& value); + + void setupHandler() { pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); @@ -65,7 +68,6 @@ void onHomieEvent(const HomieEvent& event) { break; case HomieEventType::WIFI_DISCONNECTED: // Do whatever you want when Wi-Fi is disconnected in normal mode - // You can use event.wifiReason break; case HomieEventType::MQTT_READY: From 2a3bbc36286ffaba31c55569acc21e30aefee807 Mon Sep 17 00:00:00 2001 From: Jens True Date: Tue, 16 Jul 2019 12:56:05 +0200 Subject: [PATCH 2/7] Empty timer handler. Cleaned up code --- src/main.cpp | 66 ++++++++++++++++------------------------------------ 1 file changed, 20 insertions(+), 46 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f52a415..00bc77d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,52 +8,44 @@ const int PIN_RELAY = D1; int timer = 0; HomieNode powerNode("power", "switch"); - - -bool powerOnHandler(const HomieRange& range, const String& value) { +bool powerStateHandler(const HomieRange& range, const String& value) { if (value != "true" && value != "false") return false; bool on = (value == "true"); digitalWrite(PIN_RELAY, on ? LOW : HIGH); - powerNode.setProperty("on").send(value); + powerNode.setProperty("state").send(value); Homie.getLogger() << "Power is " << (on ? "on" : "off") << endl; return true; } -bool powerTimerHandler(const HomieRange& range, const String& value); +bool powerTimerHandler(const HomieRange& range, const String& value) { + int settimer = value.toInt(); + if(settimer == 0 || settimer > 120) + return false; + + powerNode.setProperty("timer").send(String(settimer)); + powerNode.setProperty("state").send("on"); + Homie.getLogger() << "Power is on for " << settimer << "minutes" << endl; + digitalWrite(PIN_RELAY, on ? LOW : HIGH); + return true; +} void setupHandler() { pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); - powerNode.setProperty("on").send("false"); + powerNode.setProperty("state").send("off"); } void onHomieEvent(const HomieEvent& event) { switch(event.type) { - case HomieEventType::STANDALONE_MODE: - // Do whatever you want when standalone mode is started - break; - case HomieEventType::CONFIGURATION_MODE: - // Do whatever you want when configuration mode is started - break; - case HomieEventType::NORMAL_MODE: - // Do whatever you want when normal mode is started - break; - case HomieEventType::OTA_STARTED: - // Do whatever you want when OTA is started - break; - case HomieEventType::OTA_PROGRESS: - // Do whatever you want when OTA is in progress - - // You can use event.sizeDone and event.sizeTotal - break; case HomieEventType::OTA_FAILED: + syslog.log(LOG_INFO, "OTA failed"); // Do whatever you want when OTA is failed break; case HomieEventType::OTA_SUCCESSFUL: - // Do whatever you want when OTA is successful + syslog.log(LOG_INFO, "OTA completed"); break; case HomieEventType::ABOUT_TO_RESET: // Do whatever you want when the device is about to reset @@ -64,38 +56,20 @@ void onHomieEvent(const HomieEvent& event) { syslog.appName("deskcontrol"); syslog.defaultPriority(LOG_ERR); syslog.log(LOG_INFO, "WiFi Connected, software version: 1.0"); - // You can use event.ip, event.gateway, event.mask - break; - case HomieEventType::WIFI_DISCONNECTED: - // Do whatever you want when Wi-Fi is disconnected in normal mode - // You can use event.wifiReason break; case HomieEventType::MQTT_READY: - // Do whatever you want when MQTT is connected in normal mode syslog.log(LOG_INFO, "MQTT connected"); break; case HomieEventType::MQTT_DISCONNECTED: - // Do whatever you want when MQTT is disconnected in normal mode syslog.log(LOG_INFO, "MQTT disconnected"); - // You can use event.mqttReason break; - case HomieEventType::MQTT_PACKET_ACKNOWLEDGED: - // Do whatever you want when an MQTT packet with QoS > 0 is acknowledged by the broker - - // You can use event.packetId - break; - case HomieEventType::READY_TO_SLEEP: - // After you've called `prepareToSleep()`, the event is triggered when MQTT is disconnected - break; - case HomieEventType::SENDING_STATISTICS: - // Do whatever you want when statistics are sent in normal mode + default: break; } } void setup() { syslog.server("192.168.1.100", 514); - Serial.begin(115200); @@ -106,10 +80,10 @@ void setup() { Homie_setFirmware("deskcontrol", "1.0.0"); Homie_setBrand("FuryFire"); - powerNode.advertise("on").settable(powerOnHandler); - + powerNode.advertise("state").settable(powerStateHandler); + powerNode.advertise("timer").settable(powerTimerHandler); Homie.setSetupFunction(setupHandler); - Homie.onEvent(onHomieEvent); // before Homie.setup() + Homie.onEvent(onHomieEvent); // before Homie.setup() Homie.setup(); } From 6efa5bd0b89a4362aecc73b7769c05ecc5a99456 Mon Sep 17 00:00:00 2001 From: Jens True Date: Tue, 16 Jul 2019 13:19:51 +0200 Subject: [PATCH 3/7] Compile error --- src/main.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 00bc77d..5b1de52 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,14 +5,17 @@ WiFiUDP udpClient; Syslog syslog(udpClient, SYSLOG_PROTO_IETF); const int PIN_RELAY = D1; +#define OUTPUT(x) digitalWrite(PIN_RELAY, x ? LOW : HIGH); int timer = 0; HomieNode powerNode("power", "switch"); bool powerStateHandler(const HomieRange& range, const String& value) { if (value != "true" && value != "false") return false; bool on = (value == "true"); - digitalWrite(PIN_RELAY, on ? LOW : HIGH); + OUTPUT(on); powerNode.setProperty("state").send(value); + if(!on) + powerNode.setProperty("timer").send("0"); Homie.getLogger() << "Power is " << (on ? "on" : "off") << endl; return true; @@ -26,16 +29,16 @@ bool powerTimerHandler(const HomieRange& range, const String& value) { powerNode.setProperty("timer").send(String(settimer)); powerNode.setProperty("state").send("on"); Homie.getLogger() << "Power is on for " << settimer << "minutes" << endl; - digitalWrite(PIN_RELAY, on ? LOW : HIGH); + OUTPUT(true); return true; } void setupHandler() { pinMode(PIN_RELAY, OUTPUT); - digitalWrite(PIN_RELAY, HIGH); - + OUTPUT(false); powerNode.setProperty("state").send("off"); + powerNode.setProperty("timer").send("0"); } void onHomieEvent(const HomieEvent& event) { From 58bcd731fc6de7b25b4855933fec571fed499e9c Mon Sep 17 00:00:00 2001 From: Jens True Date: Tue, 16 Jul 2019 13:22:46 +0200 Subject: [PATCH 4/7] Compile error --- src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5b1de52..29a43b7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,14 +5,14 @@ WiFiUDP udpClient; Syslog syslog(udpClient, SYSLOG_PROTO_IETF); const int PIN_RELAY = D1; -#define OUTPUT(x) digitalWrite(PIN_RELAY, x ? LOW : HIGH); +#define OUTPUT_SET(x) digitalWrite(PIN_RELAY, x ? LOW : HIGH); int timer = 0; HomieNode powerNode("power", "switch"); bool powerStateHandler(const HomieRange& range, const String& value) { if (value != "true" && value != "false") return false; bool on = (value == "true"); - OUTPUT(on); + OUTPUT_SET(on); powerNode.setProperty("state").send(value); if(!on) powerNode.setProperty("timer").send("0"); @@ -29,14 +29,14 @@ bool powerTimerHandler(const HomieRange& range, const String& value) { powerNode.setProperty("timer").send(String(settimer)); powerNode.setProperty("state").send("on"); Homie.getLogger() << "Power is on for " << settimer << "minutes" << endl; - OUTPUT(true); + OUTPUT_SET(true); return true; } void setupHandler() { pinMode(PIN_RELAY, OUTPUT); - OUTPUT(false); + OUTPUT_SET(false); powerNode.setProperty("state").send("off"); powerNode.setProperty("timer").send("0"); } From dc912118893026a99f65d803532a3b777df58984 Mon Sep 17 00:00:00 2001 From: Jens Christian True Date: Fri, 19 Jul 2019 09:04:14 +0200 Subject: [PATCH 5/7] Prototype of timer implementation --- src/main.cpp | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 29a43b7..b0d2cc5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,18 +6,23 @@ Syslog syslog(udpClient, SYSLOG_PROTO_IETF); const int PIN_RELAY = D1; #define OUTPUT_SET(x) digitalWrite(PIN_RELAY, x ? LOW : HIGH); -int timer = 0; +unsigned int timer = 0; +unsigned int next_timer_update = 0; HomieNode powerNode("power", "switch"); bool powerStateHandler(const HomieRange& range, const String& value) { - if (value != "true" && value != "false") return false; - bool on = (value == "true"); - OUTPUT_SET(on); + if (value != "on" && value != "off") return false; powerNode.setProperty("state").send(value); - if(!on) - powerNode.setProperty("timer").send("0"); - Homie.getLogger() << "Power is " << (on ? "on" : "off") << endl; - + powerNode.setProperty("timer").send("0"); + timer = 0; + if(value == "on") { + OUTPUT_SET(true); + Homie.getLogger() << "Power is on" << endl; + } else { + OUTPUT_SET(false); + Homie.getLogger() << "Power is off" << endl; + } + return true; } @@ -26,6 +31,8 @@ bool powerTimerHandler(const HomieRange& range, const String& value) { if(settimer == 0 || settimer > 120) return false; + timer = millis() + (settimer * 1000 * 60); + next_timer_update = millis() + 60*1000; powerNode.setProperty("timer").send(String(settimer)); powerNode.setProperty("state").send("on"); Homie.getLogger() << "Power is on for " << settimer << "minutes" << endl; @@ -41,6 +48,25 @@ void setupHandler() { powerNode.setProperty("timer").send("0"); } +void loopHandler() { + if(timer) + { + if(timer < millis()) + { + timer = 0; + OUTPUT_SET(false); + powerNode.setProperty("timer").send("0"); + } + if(millis() > next_timer_update) { + next_timer_update = millis() + 60*1000; + unsigned int time_remaining = timer - millis(); + unsigned int min_left = time_remaining / (60*1000); + powerNode.setProperty("timer").send(String(min_left)); + + } + } +} + void onHomieEvent(const HomieEvent& event) { switch(event.type) { case HomieEventType::OTA_FAILED: @@ -50,9 +76,6 @@ void onHomieEvent(const HomieEvent& event) { case HomieEventType::OTA_SUCCESSFUL: syslog.log(LOG_INFO, "OTA completed"); break; - case HomieEventType::ABOUT_TO_RESET: - // Do whatever you want when the device is about to reset - break; case HomieEventType::WIFI_CONNECTED: // Do whatever you want when Wi-Fi is connected in normal mode syslog.deviceHostname(Homie.getConfiguration().name); @@ -87,6 +110,7 @@ void setup() { powerNode.advertise("timer").settable(powerTimerHandler); Homie.setSetupFunction(setupHandler); Homie.onEvent(onHomieEvent); // before Homie.setup() + Homie.setLoopFunction(loopHandler); Homie.setup(); } From 847dda81be6d02802c6f77ce342da5377212da3f Mon Sep 17 00:00:00 2001 From: Jens Christian True Date: Tue, 13 Aug 2019 11:56:59 +0200 Subject: [PATCH 6/7] Update to Homie V3 --- .gitignore | 1 + platformio.ini | 2 +- src/main.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6c97aa4..baf3230 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .pioenvs .piolibdeps +.pio data/homie/config.json nbproject diff --git a/platformio.ini b/platformio.ini index d111ac2..4b6f9f1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -24,4 +24,4 @@ board = nodemcu upload_speed=921600 build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY -lib_deps = https://github.com/homieiot/homie-esp8266.git#develop, Syslog +lib_deps = https://github.com/homieiot/homie-esp8266.git#develop-v3, Syslog diff --git a/src/main.cpp b/src/main.cpp index b0d2cc5..fe7c189 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ const int PIN_RELAY = D1; #define OUTPUT_SET(x) digitalWrite(PIN_RELAY, x ? LOW : HIGH); unsigned int timer = 0; unsigned int next_timer_update = 0; -HomieNode powerNode("power", "switch"); +HomieNode powerNode("power", "Power", "switch"); bool powerStateHandler(const HomieRange& range, const String& value) { if (value != "on" && value != "off") return false; From 0ae3824e88cbbf853a7e5f2507bc0dac75106301 Mon Sep 17 00:00:00 2001 From: Jens Christian True Date: Tue, 13 Aug 2019 12:52:18 +0200 Subject: [PATCH 7/7] make sure mqtt state is updated when timer expires --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index fe7c189..4785209 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,6 +56,7 @@ void loopHandler() { timer = 0; OUTPUT_SET(false); powerNode.setProperty("timer").send("0"); + powerNode.setProperty("state").send("off"); } if(millis() > next_timer_update) { next_timer_update = millis() + 60*1000;