From 5f0614ce4f966925f40ab2af6d6f3b3bf7561e06 Mon Sep 17 00:00:00 2001 From: Kai Lauterbach Date: Sun, 15 May 2022 22:34:36 +0200 Subject: [PATCH] Moved Homebridge webstat to webUpdater logic. Fixed Windspeed calculation. Added a interval firmware reset functionality. --- firmware/config.h | 10 +++- firmware/firmware.ino | 47 ++++++++++++++----- firmware/hb_webstat_srv.ino | 30 ------------ firmware/influxdb.ino | 4 +- firmware/sensor_wind.ino | 15 +++--- firmware/webUpdater.ino | 41 ++++++++++++++-- .../influxdb_write/influxdb_write.ino | 0 7 files changed, 92 insertions(+), 55 deletions(-) mode change 100755 => 100644 firmware/config.h delete mode 100755 firmware/hb_webstat_srv.ino mode change 100755 => 100644 firmware/sensor_wind.ino mode change 100644 => 100755 influxdb-lib/examples/influxdb_write/influxdb_write.ino diff --git a/firmware/config.h b/firmware/config.h old mode 100755 new mode 100644 index 358fd4e..beea44a --- a/firmware/config.h +++ b/firmware/config.h @@ -24,6 +24,13 @@ #define POWERSAVING_SLEEP_S 600 #define EMERGENCY_SLEEP_S 172800 // Sleep for 2 days to recover #define ENERGY_SAVING_ITERATIONS 30 +#define WIFI_MINIMUM_SIGNAL_QUALITY 10 // percent +#define RESET_ESP_TIME_INTERVAL_MS 3600000 + +#define ROTOR_LENGTH_KM 0.000105 +#define WIND_SENSOR_MEAS_TIME_S 5.0 +#define SEC_TO_HOUR_FACTOR (60.0 * 60.0) +#define COUNT_TO_KMH ((TWO_PI * ROTOR_LENGTH_KM / WIND_SENSOR_MEAS_TIME_S) * SEC_TO_HOUR_FACTOR) #define BAT_LOW_VOLTAGE 3.6 #define BAT_EMERGENCY_DEEPSLEEP_VOLTAGE 3.5 @@ -47,6 +54,7 @@ #define BME_CS 10 #define BME_ADDRESS 0x76 -#define INITIAL_WEBSERVER_TIME 20 +#define INITIAL_WEBSERVER_TIME 20 +#define WEB_UPDATER_HTTP_PORT 8080 #endif diff --git a/firmware/firmware.ino b/firmware/firmware.ino index b8442a1..d56a7bb 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -5,8 +5,8 @@ #include #include -#include // WiFiClient -#include // WiFiManager from bib manager +#include // WiFiClient +#include // WiFiManager from bib manager // Project includes #include "config.h" @@ -19,21 +19,22 @@ const uint8_t VALUES = 8; float currentSensorData[VALUES] = {nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value"), nanf("no value")}; float (*sensors[VALUES])() = {}; -uint16_t update_sensor_cnt = 0; -uint16_t update_webserver_cnt = 0; +uint16_t update_sensor_cnt = 0; +uint16_t update_webserver_cnt = 0; WiFiManager wifiManager; //*************************************************************************// -void debug(String x) { +void debug(String x) +{ #ifdef DEBUG Serial.println(x); #endif } - -void setup() { +void setup() +{ #if defined(DEBUG) || defined(SERIAL_FEATURE) Serial.begin(115200); @@ -60,16 +61,29 @@ void setup() { // Establish WiFi connection String wifiName = "oko-weather-" + DEVICE_NAME; - wifiManager.setMinimumSignalQuality(16); - wifiManager.setConnectTimeout(WIFI_AUTOCONNECT_TIMEOUT_S); // the time in seconds to wait for the known wifi connection - wifiManager.setTimeout(WIFI_CONFIG_PORTAL_TIMEOUT_S); // the time in seconds to wait for the user to configure the device + wifiManager.setMinimumSignalQuality(WIFI_MINIMUM_SIGNAL_QUALITY); + // the time in seconds to wait for the known wifi connection + wifiManager.setConnectTimeout(WIFI_AUTOCONNECT_TIMEOUT_S); + // the time in seconds to wait for the user to configure the device + wifiManager.setTimeout(WIFI_CONFIG_PORTAL_TIMEOUT_S); - while (!wifiManager.autoConnect(wifiName.c_str(), "DEADBEEF")) +#ifdef SLEEP_IF_NO_WLAN_CONNECTION + while +#endif +#ifndef SLEEP_IF_NO_WLAN_CONNECTION + if +#endif + (!wifiManager.autoConnect(wifiName.c_str(), "DEADBEEF")) { debug("WiFi connection failed, try again in 5 seconds..."); // If autoconnect to WLAN failed and no client connected, go to deep sleep - //ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT); +#ifdef SLEEP_IF_NO_WLAN_CONNECTION + ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT); + delay(100); +#endif +#ifndef SLEEP_IF_NO_WLAN_CONNECTION delay(5000); +#endif } debug("Connected!"); @@ -125,6 +139,15 @@ void setup() { //It's magic! leave in delay(100); +#ifdef RESET_ESP_TIMEINTERVAL + // if millis() reached interval (1h) restart ESP + if (millis() >= RESET_ESP_TIME_INTERVAL_MS) + { + // TODO test + ESP.restart(); + } +#endif + #ifdef BATTERY_POWERED debug("battery powered"); _loop(); diff --git a/firmware/hb_webstat_srv.ino b/firmware/hb_webstat_srv.ino deleted file mode 100755 index 8a186bc..0000000 --- a/firmware/hb_webstat_srv.ino +++ /dev/null @@ -1,30 +0,0 @@ - -// Port des Web Servers auf 80 setzen - -#ifdef HOMEBRIDGE_WEBSTAT - -WiFiServer hb_webstat_server(80); - -const char *hb_ws_msg_start = "{\"temperature\": "; -const char *hb_ws_msg_mid = "\"humidity\": "; -const char *hb_ws_msg_end = "}"; - -void hb_webstat_setup() -{ - hb_webstat_server.begin() -} - -void hb_webstat_send(floar currentSensorDfloar currentSensorData[]ata[]) -{ - WiFiClient client = server.available(); - - if (client.available()) { - client.print(hb_ws_msg_start); - client.print(String(currentSensorData[0],2)); - client.print(hb_ws_msg_mid); - client.print(hb_ws_msg_end); - } -} - -#endif - diff --git a/firmware/influxdb.ino b/firmware/influxdb.ino index 9b6a186..bf27cfc 100755 --- a/firmware/influxdb.ino +++ b/firmware/influxdb.ino @@ -1,7 +1,9 @@ #include // from bib manager +#include "config_user.h" + // Data point -Point sensor("weatherstation"); +Point sensor(DEVICE_NAME); // Init variables to influxdb config - doesn't talk to database InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN); diff --git a/firmware/sensor_wind.ino b/firmware/sensor_wind.ino old mode 100755 new mode 100644 index 746a5f5..6e61a71 --- a/firmware/sensor_wind.ino +++ b/firmware/sensor_wind.ino @@ -1,9 +1,11 @@ + #include "config_user.h" +#include "config.h" -int anemometerRotations = 0; -unsigned long currentTime = 0; +unsigned int anemometerRotations = 0; -ICACHE_RAM_ATTR void _anemometerInterrupt() { +ICACHE_RAM_ATTR void _anemometerInterrupt() +{ anemometerRotations++; #ifdef DEBUG Serial.print("*"); @@ -12,12 +14,13 @@ ICACHE_RAM_ATTR void _anemometerInterrupt() { float wind_speed() { anemometerRotations = 0; - currentTime = millis(); + int interruptNumber = digitalPinToInterrupt(ANEMOMETER_PIN); attachInterrupt(interruptNumber, _anemometerInterrupt, RISING); - delay(1000 * 5); + delay(1000 * WIND_SENSOR_MEAS_TIME_S); // time to measure detachInterrupt(interruptNumber); - return (float)anemometerRotations / 5.0 * 2.4; + return (float)anemometerRotations * COUNT_TO_KMH; + } diff --git a/firmware/webUpdater.ino b/firmware/webUpdater.ino index ca8a043..4cf7da9 100644 --- a/firmware/webUpdater.ino +++ b/firmware/webUpdater.ino @@ -13,12 +13,22 @@ #include #include // WiFiManager from bib manager -ESP8266WebServer httpServer(8080); +#include "config.h" +#include "config_user.h" + +ESP8266WebServer httpServer(WEB_UPDATER_HTTP_PORT); ESP8266HTTPUpdateServer httpUpdater; String _webUpdater_ip = "127.0.0.1"; String _webUpdater_dev = "unknown"; -float _webUpdater_sensValues[VALUES]; +float _webUpdater_sensValues[VALUES]; + +String hb_ws_msg_start = "{"; +String hb_ws_msg_temp = "\"temperature\": "; +String hb_ws_msg_humi = "\"humidity\": "; +String hb_ws_msg_light = "\"light\": "; +String hb_ws_msg_windspeed = "\"windspeed\": "; +String hb_ws_msg_end = "}"; void setupWebUpdater(String device, String ip) { @@ -30,6 +40,9 @@ void setupWebUpdater(String device, String ip) httpServer.on("/", showHTMLMain); httpServer.on("/resetWifiManager", resetWifiManager); +#ifdef HOMEBRIDGE_WEBSTAT + httpServer.on("/hbWebstat", hb_webstat_send); +#endif httpServer.begin(); @@ -42,13 +55,15 @@ void doWebUpdater(void) httpServer.handleClient(); } -void setSensorData(float sensorValues[]) { +void setSensorData(float sensorValues[]) +{ for (uint8_t i = 0; i < VALUES; i++) { _webUpdater_sensValues[i] = sensorValues[i]; } } -void showHTMLMain(void) { +void showHTMLMain(void) +{ String message = "OKO Weatherstation - " + String(_webUpdater_dev) + "" "" "" @@ -66,6 +81,20 @@ void showHTMLMain(void) { httpServer.send(200, "text/html", message); } +void hb_webstat_send(void) +{ + httpServer.send(200, "text/html", hb_ws_msg_start + + hb_ws_msg_temp + + String(_webUpdater_sensValues[SENSOR_TEMPERATURE], 2) + + hb_ws_msg_humi + + String(_webUpdater_sensValues[SENSOR_HUMIDITY], 2) + + hb_ws_msg_light + + String(_webUpdater_sensValues[SENSOR_LIGHT], 2) + + hb_ws_msg_windspeed + + String(_webUpdater_sensValues[SENSOR_WINDSPEED], 2) + + hb_ws_msg_end); +} + void resetWifiManager() { @@ -79,9 +108,11 @@ void resetWifiManager() httpServer.send(200, "text/html", message); // Erase WiFi Credentials, enable, compile, flash, disable and reflash. - WiFiManager.resetSettings(); + WiFiManager wifiManager; + wifiManager.resetSettings(); delay(5000); + // manual reset after restart is required ESP.restart(); } diff --git a/influxdb-lib/examples/influxdb_write/influxdb_write.ino b/influxdb-lib/examples/influxdb_write/influxdb_write.ino old mode 100644 new mode 100755