From 2cfd2afaeeb7a36660e685af04c5731cece3e019 Mon Sep 17 00:00:00 2001 From: feeling Date: Tue, 12 Jan 2021 16:25:44 +0100 Subject: [PATCH] updated service --- src/FanStateService.cpp | 28 +++++++++++++ src/FanStateService.h | 87 +++++++++++++++++++++++++++++++++++++++++ src/main.cpp | 13 +++++- 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/FanStateService.cpp create mode 100644 src/FanStateService.h diff --git a/src/FanStateService.cpp b/src/FanStateService.cpp new file mode 100644 index 0000000..d7976b7 --- /dev/null +++ b/src/FanStateService.cpp @@ -0,0 +1,28 @@ +#include + +FanStateService::FanStateService(AsyncWebServer* server, + SecurityManager* securityManager) : + _httpEndpoint(FanState::read, + FanState::update, + this, + server, + FAN_SETTINGS_ENDPOINT_PATH, + securityManager, + AuthenticationPredicates::IS_AUTHENTICATED) { + pinMode(FAN_PIN, OUTPUT); + // configure settings service update handler to update LED state + addUpdateHandler([&](const String& originId) { onConfigUpdated(); }, false); + } + + +void FanStateService::begin() { + _state.fanStatus = DEFAULT_FAN_STATE; + Serial.print("Starting The Fan Service"); + onConfigUpdated(); +} + +void FanStateService::onConfigUpdated() { + Serial.print(" ** Fan UPDATE "); + digitalWrite(FAN_PIN, _state.fanStatus ? FAN_ON : FAN_OFF); +} + diff --git a/src/FanStateService.h b/src/FanStateService.h new file mode 100644 index 0000000..0e4085c --- /dev/null +++ b/src/FanStateService.h @@ -0,0 +1,87 @@ +#ifndef FanStateService_h +#define FanStateService_h + + +#include + + +#define FAN_PIN 13 +#define PRINT_DELAY 5000 + +#define DEFAULT_FAN_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 FAN_ON 0x1 +#define FAN_OFF 0x0 +#elif defined(ESP8266) +#define FAN_ON 0x0 +#define FAN_OFF 0x1 +#endif + +#define FAN_SETTINGS_ENDPOINT_PATH "/rest/fanState" + + +class FanState { + public: + bool fanStatus; + int fanSpeed; + + static void read(FanState& settings, JsonObject& root) { + root["fan_status"] = settings.fanStatus; + String s = root["fan_status"]; + Serial.print(" ** Fan read [" + s + "]\n"); + } + + static StateUpdateResult update(JsonObject& root, FanState& fanState) { + boolean newState = root["fan_status"] | DEFAULT_FAN_STATE; + Serial.print(" ** Fan update [" + (String)newState + "]\n"); + if (fanState.fanStatus != newState) { + fanState.fanStatus = newState; + return StateUpdateResult::CHANGED; + } + return StateUpdateResult::UNCHANGED; + } + + static void haRead(FanState& settings, JsonObject& root) { + root["state"] = settings.fanStatus ? ON_STATE : OFF_STATE; + String s = root["state"]; + Serial.print(" ** Fan haRead [" + s + "] \n"); + } + + static StateUpdateResult haUpdate(JsonObject& root, FanState& fanState) { + String state = root["state"]; + String s = root["state"]; + Serial.print(" ** Fan haUpdate [" + s + "] \n"); + // 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 (fanState.fanStatus != newState) { + fanState.fanStatus = newState; + return StateUpdateResult::CHANGED; + } + return StateUpdateResult::UNCHANGED; + } +}; + +class FanStateService : public StatefulService { + public: + FanStateService(AsyncWebServer* server, SecurityManager* securityManager); + void begin(); + + private: + HttpEndpoint _httpEndpoint; + + void registerConfig(); + void onConfigUpdated(); +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp index 0b1081a..4541559 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,27 @@ #include +/* #include #include +*/ +#include #define SERIAL_BAUD_RATE 115200 AsyncWebServer server(80); ESP8266React esp8266React(&server); +/* LightMqttSettingsService lightMqttSettingsService = LightMqttSettingsService(&server, esp8266React.getFS(), esp8266React.getSecurityManager()); + LightStateService lightStateService = LightStateService(&server, esp8266React.getSecurityManager(), esp8266React.getMqttClient(), &lightMqttSettingsService); +*/ + +FanStateService fanStateService = FanStateService(&server,esp8266React.getSecurityManager()); + void setup() { // start serial and filesystem Serial.begin(SERIAL_BAUD_RATE); @@ -21,10 +30,12 @@ void setup() { esp8266React.begin(); // load the initial light settings - lightStateService.begin(); + fanStateService.begin(); +/* // start the light service lightMqttSettingsService.begin(); +*/ // start the server server.begin();