#include const byte TRIGGER_PIN = 3; //pin 3 which is RX pin. Doesn't seem to work on GPIO0 or GPIO2, maybe because they have internal pull up resistors? const unsigned int TRIGGER_HOLD_TIME = 5000; // 5 seconds unsigned long triggerTime = 0; enum trigger_status {start, stop}; trigger_status triggerStatus = stop; HomieNode motionNode("motion", "Motion", "motion"); void loopHandler(){ if (digitalRead(TRIGGER_PIN) == HIGH) { // if triggered triggerTime = millis(); // set trigger timer to current time if (triggerStatus == stop) { // if trigger status == stop motionNode.setProperty("motion").send("true"); // send mqtt "motion started" triggerStatus = start; // set trigger status to start } } else { // if not triggered if (triggerStatus == start) { // if trigger status == start if (millis() - triggerTime >= TRIGGER_HOLD_TIME) { // if difference between 'current time' and 'trigger timer' >= 'trigger hold time' motionNode.setProperty("motion").send("false"); // send mqtt "motion stopped" triggerStatus = stop; // set trigger status to "stop" } } } //end else } // loopHandler() void setup() { //Serial.begin(115200); Homie_setFirmware("homie-motion", "1.0.0"); Homie.setLoopFunction(loopHandler); pinMode(TRIGGER_PIN, INPUT); triggerStatus = stop; motionNode.advertise("motion").setName("Motion Detected") .setDatatype("boolean") .setRetained(false); Homie.setup(); motionNode.setProperty("motion").send("false"); } // the loop routine runs over and over again forever: void loop() { Homie.loop(); }