/** * \brief Entry point * * Deskcontrol is a simple on/off timer switch inteded for use with an ATX PSU. * The theory of operation is turning on and off power by pulling the control line low/high while * running of the 5V standby line. * * Additional features include support for a DHT11 to log the temperature. * \file */ #include "config.h" #include #include LoggerNode LN; /// 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"); LN.logf(__PRETTY_FUNCTION__, LoggerNode::INFO, "Power on for %d minutes", settimer); OUTPUT_SET(true); return true; } void setupHandler() { pinMode(CONFIG_IO_RELAY, OUTPUT); OUTPUT_SET(false); powerNode.setProperty("state").send("off"); powerNode.setProperty("timer").send("0"); dht.setup(CONFIG_IO_DHT11, DHTesp::DHT11); // Connect DHT sensor to GPIO 17 } void loopHandleTimer() { if(timer) { if(timer < millis()) { //Timer has expired. (Ignore the wraparound...) timer = 0; OUTPUT_SET(false); powerNode.setProperty("timer").send("0"); powerNode.setProperty("state").send("off"); } if(next_timer_update && 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 loopHandleTemperature() { static unsigned long lastTemperatureSent = 0; if (millis() - lastTemperatureSent >= CONFIG_TEMPERATURE_SEND_INTERVAL * 1000UL || lastTemperatureSent == 0) { float humidity = dht.getHumidity(); float temperature = dht.getTemperature(); LN.logf(__PRETTY_FUNCTION__, LoggerNode::DEBUG, "Temperature: %f C Humidity: %f", temperature, humidity); temperatureNode.setProperty("temperature").send(String(temperature)); temperatureNode.setProperty("humidity").send(String(humidity)); lastTemperatureSent = millis(); } } /** * Main event loop * \callgraph */ void loopHandler() { loopHandleTimer(); loopHandleTemperature(); } void setup() { Homie_setFirmware("deskcontrol", VERSION); Homie.setLoggingPrinter(&Serial); Serial.begin(CONFIG_SERIAL_BAUDRATE); Homie.disableResetTrigger(); //Power powerNode.advertise("state").settable(powerStateHandler); powerNode.advertise("timer").settable(powerTimerHandler); //Temperature temperatureNode.advertise("humidity"); temperatureNode.advertise("temperature"); Homie.setSetupFunction(setupHandler); Homie.setLoopFunction(loopHandler); Homie.setup(); } void loop() { Homie.loop(); }