#include SpejsNode node("string-controller"); //DriverPWM pwm; #define SLAVES_COUNT 1 class SlaveEndpoint { public: String topic; int ledPin; int btnPin; bool state = false; uint32_t lastTrigger = 0; bool lastButton = false; bool toggle = false; Timer breatheTimer; void init() { if (ledPin != -1) pinMode(ledPin, OUTPUT); if (btnPin != -1) pinMode(btnPin, INPUT_PULLUP); //breatheTimer.initializeMs(20, TimerDelegate(&SlaveEndpoint::breatheHandler, this)).start(); } void stateUpdate(bool newState) { state = newState; digitalWrite(ledPin, !state); } void breatheHandler() { //pwm.analogWrite(ledPin, (millis()/10) % 50 + 20); } SlaveEndpoint(String _topic, int _ledPin = -1, int _btnPin = -1, bool _toggle = false) : topic(_topic), ledPin(_ledPin), btnPin(_btnPin), toggle(_toggle) {} }; SlaveEndpoint slaves[] = { {"iot/077521/relay/on", 2, 4, true}, // Exhaust }; class StatusEndpoint : public Endpoint { public: Timer sampleTimer; Timer idleTimer; StatusEndpoint() : Endpoint("status") { } void bind(String _name, SpejsNode* _parent) { Endpoint::bind(_name, _parent); idleTimer.initializeMs(100, TimerDelegate(&StatusEndpoint::idleHandler, this)).start(); //pwm.initialize(); for(int i = 0; i < SLAVES_COUNT; i++) { slaves[i].init(); } } void idleHandler() { for(int i = 0; i < SLAVES_COUNT; i++) { slaves[i].stateUpdate(!slaves[i].state); } } void onConnected() { idleTimer.stop(); Serial.println("status: connected"); for(int i = 0; i < SLAVES_COUNT; i++) { Serial.println(i); parent->mqtt.subscribe(slaves[i].topic); slaves[i].init(); } sampleTimer.initializeMs(50, TimerDelegate(&StatusEndpoint::sampleButtons, this)).start(); } void onMessage(String topic, String payload) { Serial.println("status: got message"); Serial.printf("%s: %s\r\n", topic.c_str(), payload.c_str()); for(int i = 0; i < SLAVES_COUNT; i++) { if (topic.equals(slaves[i].topic)) { slaves[i].stateUpdate(payload.equals("true")); } } } void sampleButtons() { for(int i = 0; i < SLAVES_COUNT; i++) { bool s = digitalRead(slaves[i].btnPin); if(s != slaves[i].lastButton) { slaves[i].lastButton = s; if (!s || slaves[i].toggle) { Serial.println("INTERRUPT"); parent->mqtt.publish(slaves[i].topic + "/set", slaves[i].state ? "false" : "true", true); } } } } }; void init() { node.init(); node.registerEndpoint("status", new StatusEndpoint()); //node.registerEndpoint("relay", new OutputEndpoint(5)); //node.registerEndpoint("dht", new DHTEndpoint(D4, 5000)); }