#include #include #include WiFiUDP udpClient; Syslog syslog(udpClient, SYSLOG_PROTO_IETF); 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"); bool powerStateHandler(const HomieRange& range, const String& value) { if (value != "on" && value != "off") return false; powerNode.setProperty("state").send(value); 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; } bool powerTimerHandler(const HomieRange& range, const String& value) { int settimer = value.toInt(); 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; OUTPUT_SET(true); return true; } void setupHandler() { pinMode(PIN_RELAY, OUTPUT); OUTPUT_SET(false); powerNode.setProperty("state").send("off"); 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: syslog.log(LOG_INFO, "OTA failed"); // Do whatever you want when OTA is failed break; case HomieEventType::OTA_SUCCESSFUL: syslog.log(LOG_INFO, "OTA completed"); break; case HomieEventType::WIFI_CONNECTED: // Do whatever you want when Wi-Fi is connected in normal mode syslog.deviceHostname(Homie.getConfiguration().name); syslog.appName("deskcontrol"); syslog.defaultPriority(LOG_ERR); syslog.log(LOG_INFO, "WiFi Connected, software version: 1.0"); break; case HomieEventType::MQTT_READY: syslog.log(LOG_INFO, "MQTT connected"); break; case HomieEventType::MQTT_DISCONNECTED: syslog.log(LOG_INFO, "MQTT disconnected"); break; default: break; } } void setup() { syslog.server("192.168.1.100", 514); Serial.begin(115200); Serial << endl << endl; Serial << "Firmware 0.0.1" << endl; Serial << endl << endl; Homie_setFirmware("deskcontrol", "1.0.0"); Homie_setBrand("FuryFire"); powerNode.advertise("state").settable(powerStateHandler); powerNode.advertise("timer").settable(powerTimerHandler); Homie.setSetupFunction(setupHandler); Homie.onEvent(onHomieEvent); // before Homie.setup() Homie.setLoopFunction(loopHandler); Homie.setup(); } void loop() { Homie.loop(); }