#ifndef LightStateService_h #define LightStateService_h #include #include #include #include #define LED_PIN 2 #define PRINT_DELAY 5000 #define DEFAULT_LED_STATE false #define OFF_STATE "OFF" #define ON_STATE "ON" // Note that the built-in LED is on when the pin is low on most NodeMCU boards. // This is because the anode is tied to VCC and the cathode to the GPIO 4 (Arduino pin 2). #ifdef ESP32 #define LED_ON 0x1 #define LED_OFF 0x0 #elif defined(ESP8266) #define LED_ON 0x0 #define LED_OFF 0x1 #endif #define LIGHT_SETTINGS_ENDPOINT_PATH "/rest/lightState" #define LIGHT_SETTINGS_SOCKET_PATH "/ws/lightState" class LightState { public: bool ledOn; static void read(LightState& settings, JsonObject& root) { root["led_on"] = settings.ledOn; } static StateUpdateResult update(JsonObject& root, LightState& lightState) { boolean newState = root["led_on"] | DEFAULT_LED_STATE; if (lightState.ledOn != newState) { lightState.ledOn = newState; return StateUpdateResult::CHANGED; } return StateUpdateResult::UNCHANGED; } static void haRead(LightState& settings, JsonObject& root) { root["state"] = settings.ledOn ? ON_STATE : OFF_STATE; } static StateUpdateResult haUpdate(JsonObject& root, LightState& lightState) { String state = root["state"]; // parse new led state boolean newState = false; if (state.equals(ON_STATE)) { newState = true; } else if (!state.equals(OFF_STATE)) { return StateUpdateResult::ERROR; } // change the new state, if required if (lightState.ledOn != newState) { lightState.ledOn = newState; return StateUpdateResult::CHANGED; } return StateUpdateResult::UNCHANGED; } }; class LightStateService : public StatefulService { public: LightStateService(AsyncWebServer* server, SecurityManager* securityManager, AsyncMqttClient* mqttClient, LightMqttSettingsService* lightMqttSettingsService); void begin(); private: HttpEndpoint _httpEndpoint; MqttPubSub _mqttPubSub; WebSocketTxRx _webSocket; AsyncMqttClient* _mqttClient; LightMqttSettingsService* _lightMqttSettingsService; void registerConfig(); void onConfigUpdated(); }; #endif