diff --git a/include/credentials.h.tpl b/include/credentials.h.tpl deleted file mode 100644 index c5637e4..0000000 --- a/include/credentials.h.tpl +++ /dev/null @@ -1,4 +0,0 @@ -struct WifiCredentials { - const char* ssid; - const char* password; -} credentials[] = {"foo", "bar"}; diff --git a/include/devices.h b/include/devices.h index 60b0bb1..8a28872 100644 --- a/include/devices.h +++ b/include/devices.h @@ -1,6 +1,5 @@ #pragma once -#define MAIN_DEVICE_ID "esp_clock" #define SENSOR_ID "bme280" #include "ha.h" @@ -28,10 +27,9 @@ namespace Devices { .addSecondary(Builder::instance(SENSOR_ID).withValueTemplate("{{ value_json.pressure }}").build()) .build(); - Switch* ledMqtt = Builder::instance(new Switch{ "Led", "led", + auto ledMqtt = Builder::instance(new Switch{ "Led", "led", [](const char* msg) { - strcmp("ON", msg) == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH); - ledMqtt->updateState(!digitalRead(LED_BUILTIN)); + turnLed(strcmp("ON", msg) == 0); } }).withStateTopic().restoreFromState().build(); @@ -59,6 +57,7 @@ namespace Devices { [](const char* msg) { if (strcmp("PRESS", msg) == 0 && !Display::tDisplaySensor.isEnabled()) { Bme::data.readAll(); + Display::tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS); Display::tDisplaySensor.restart(); }; } diff --git a/include/display.h b/include/display.h index 9653f80..ae2edf4 100644 --- a/include/display.h +++ b/include/display.h @@ -33,7 +33,7 @@ namespace Display { tDisplayTime.disable(); return true; }, []() { - tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS); + tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS*2); tDisplayTime.enableDelayed(tDisplaySensor.getInterval()); }); @@ -50,7 +50,7 @@ namespace Display { void set(uint8_t value) { current = value % (BRIGHTNESS_MAX + 1); clockDisplay.setBrightness(current); - brightnessChangedCallback(); + if (brightnessChangedCallback) brightnessChangedCallback(); } void change(bool increase) { @@ -82,9 +82,12 @@ namespace Display { static int currentHour = -1; if (currentHour != hour()) { currentHour = hour(); + if (currentHour == 4) { + Ntp::tUpdateTime.restart(); + } if (currentHour == 8) { Brightness::set(BRIGHTNESS_DAY); - Wifi::reconnect(); + Wifi::tReconnect.enable(); } if (currentHour == 17) { Brightness::set(BRIGHTNESS_NIGHT); @@ -139,7 +142,7 @@ namespace Display { void changeHourFormat24(bool format24) { hourFormat24 = format24; drawTime(); - hourFormatChangedCallback(); + if (hourFormatChangedCallback) hourFormatChangedCallback(); } void setup() { diff --git a/include/ntp_time.h b/include/ntp_time.h index e047434..fca16af 100644 --- a/include/ntp_time.h +++ b/include/ntp_time.h @@ -14,18 +14,16 @@ namespace Ntp { TimeChangeRule CET = { "CET ", Last, Sun, Oct, 3, 60 }; // Central European Standard Time Timezone CE(CEST, CET); - time_t updateTime() { + Task tUpdateTime(TASK_IMMEDIATE, TASK_ONCE, []{ if (timeClient.forceUpdate()) { time_t newTime = CE.toLocal(timeClient.getEpochTime()); setTime(newTime); - return newTime; - } else { - return 0; + Serial.println(asctime(localtime(&newTime))); } - } + }, &ts); void setup() { - timeClient.begin(); Serial.println("NTP setup"); + timeClient.begin(); } } \ No newline at end of file diff --git a/include/ota.h b/include/ota.h deleted file mode 100644 index 43b4c05..0000000 --- a/include/ota.h +++ /dev/null @@ -1,35 +0,0 @@ -#include - -namespace Ota { - - void loop(); - Task tLoop(TASK_IMMEDIATE, TASK_FOREVER, loop, &ts, true); - - void setup() { - ArduinoOTA.onStart([]() { - Serial.println("Starting OTA"); - Mqtt::publishCleanupConfig(); - delay(2000); - Mqtt::disconnect(); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\nOTA Finished"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - ArduinoOTA.begin(); - } - - void loop() { - ArduinoOTA.handle(); - } -} diff --git a/include/wifi.h b/include/wifi.h deleted file mode 100644 index c00d88d..0000000 --- a/include/wifi.h +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include -#include -#include "credentials.h" - -namespace Wifi { - - WiFiEventHandler stationConnectedHandler; - WiFiEventHandler stationDisconnectedHandler; - void reconnect(); - - Task tWifiReconnect(1 * TASK_MINUTE, TASK_FOREVER, reconnect, &ts); - - String currentSSID; - String currentPsk; - - void setup() { - stationConnectedHandler = WiFi.onStationModeGotIP([](const WiFiEventStationModeGotIP& e) { - Serial.println("Reconnected to network."); - tWifiConnected.restart(); - tWifiReconnect.cancel(); - }); - - stationDisconnectedHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& e) { - Serial.println("Disconnected from network."); - tWifiReconnect.restartDelayed(); - }); - - - ESP8266WiFiMulti wifiMulti; - for (uint32_t i = 0; i < sizeof(credentials) / sizeof(WifiCredentials); i++) { - wifiMulti.addAP(credentials[i].ssid, credentials[i].password); - } - - Serial.println("Connecting to WiFi netowrk."); - while (wifiMulti.run() != WL_CONNECTED) { - delay(500); - } - WiFi.setHostname("esp-clock"); - currentSSID = WiFi.SSID(); - currentPsk = WiFi.psk(); - } - - void reconnect() { - if (WiFi.status() != WL_CONNECTED) { - WiFi.forceSleepWake(); - WiFi.begin(currentSSID.c_str(), currentPsk.c_str()); - Serial.println("Reconnecting to WiFi netowrk..."); - } - } - - void disconnect() { - Serial.println("Disconnecting WiFi"); - WiFi.disconnect(); - WiFi.forceSleepBegin(); - } - - void printStatus() { - // print the SSID of the network you're attached to: - Serial.print("SSID: "); - Serial.println(WiFi.SSID()); - - // print your WiFi shield's IP address: - IPAddress ip = WiFi.localIP(); - Serial.print("IP Address: "); - Serial.println(ip); - - // print the received signal strength: - long rssi = WiFi.RSSI(); - Serial.print("signal strength (RSSI):"); - Serial.print(rssi); - Serial.println(" dBm"); - } -} diff --git a/platformio.ini b/platformio.ini index 25ec799..f5443ef 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,7 +20,8 @@ lib_deps = jchristensen/Timezone@^1.2.4 adafruit/Adafruit Unified Sensor @ ^1.1.4 adafruit/Adafruit BME280 Library@^2.2.4 - https://git.hodos.ro/arduino/ha-mqtt.git@^1.0.0 + https://git.hodos.ro/libraries/wifi.git@^1.0.1 + https://git.hodos.ro/libraries/ha-mqtt.git@^1.0.0 build_flags = -D WIFI_ALWAYS_ON=1 [env:laptop_home] diff --git a/src/esp_clock.cpp b/src/esp_clock.cpp index b6e0678..0e65126 100644 --- a/src/esp_clock.cpp +++ b/src/esp_clock.cpp @@ -1,18 +1,21 @@ #include void checkWifiCallback(); -void onWifiConnected(); void onButtonPressed(); void onLed(); void onButtonCallback(); #define MQTT_HOST IPAddress(192, 168, 5, 11) #define MQTT_PORT 1883 +#define MAIN_DEVICE_ID "esp-clock" #include Scheduler ts; Task tCheckWifi(5 * TASK_MINUTE, TASK_ONCE, checkWifiCallback, &ts); -Task tWifiConnected(TASK_IMMEDIATE, TASK_ONCE, onWifiConnected, &ts); + +void turnLed(bool on = true) { + on ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH); +} #include "bme.h" #include "ntp_time.h" @@ -26,6 +29,7 @@ Task tWifiConnected(TASK_IMMEDIATE, TASK_ONCE, onWifiConnected, &ts); Task tButton(TASK_IMMEDIATE, TASK_ONCE, []() { if (Display::tDisplaySensor.isEnabled()) return; Bme::data.readAll(); + Display::tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS); Display::tDisplaySensor.restart(); }, &ts); Task tLed(TASK_IMMEDIATE, TASK_ONCE, []() { @@ -40,7 +44,6 @@ Task tReadBme(TASK_MINUTE, TASK_FOREVER, []() { Devices::publishBme280(); if (abs(lastTemp - Bme::data.temp) > 0.2) { lastTemp = Bme::data.temp; - Display::tDisplaySensor.setIterations(DISPLAY_SENSOR_ITERATIONS*2); Display::tDisplaySensor.restart(); } }, &ts); @@ -48,18 +51,32 @@ Task tReadBme(TASK_MINUTE, TASK_FOREVER, []() { void setup() { Serial.begin(9600); + Serial.println(); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Display::setup(); - Ota::setup(); + Ota::setup( + [] { + Display::displayText("load"); + Mqtt::publishCleanupConfig(); + delay(2000); + Mqtt::disconnect(); + }); Ntp::setup(); Bme::setup(); - Mqtt::setup(&ts); + Mqtt::setup(&ts, + [] {turnLed(false);}, + [] {turnLed();} + ); Devices::setup(); - Wifi::setup(); + Wifi::setup(ts, []{ + Ota::tLoop.enable(); + Mqtt::tReConnect.enable(); + Ntp::tUpdateTime.enable(); + }); pinMode(BUTTON, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(BUTTON), onButtonPressed, FALLING); @@ -72,16 +89,6 @@ void loop() { ts.execute(); } -void onWifiConnected() { - Serial.println("Wifi connected event"); - Wifi::printStatus(); - Ota::tLoop.enable(); - Mqtt::tReConnect.enable(); - if (time_t newTime = Ntp::updateTime()) { - Serial.println(asctime(localtime(&newTime))); - } -} - void checkWifiCallback() { #if !WIFI_ALWAYS_ON Serial.println("Wifi connection timed out");