From 3163b621952880472d7a73857105d06230ebb4f1 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Thu, 18 Nov 2021 17:23:27 +0100 Subject: [PATCH 01/21] restore to dev channel and incremented revsion code --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 7098c3a8..79a6cd93 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,8 +17,8 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.6 -revision = 841 -target = prod +revision = 843 +target = dev monitor_filters = time extra_scripts = pre:prebuild.py build_flags = From 1aa48b3917241623789d6ea8c448520e2d008d04 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Fri, 19 Nov 2021 12:28:03 +0100 Subject: [PATCH 02/21] testing MQTT and HASS library dependencies --- include/wifi.hpp | 1 + platformio.ini | 3 ++- src/mqtt_hass.cpp | 0 src/wifi.cpp | 13 +++++++++---- 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 src/mqtt_hass.cpp diff --git a/include/wifi.hpp b/include/wifi.hpp index 1be66af5..a75d551e 100644 --- a/include/wifi.hpp +++ b/include/wifi.hpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/platformio.ini b/platformio.ini index 79a6cd93..b3aa8552 100644 --- a/platformio.ini +++ b/platformio.ini @@ -27,7 +27,8 @@ build_flags = lib_deps = bblanchon/ArduinoJson @ ^6 tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 - https://github.com/hpsaturn/esp32FOTA.git + plapointe6/HAMqttDevice @ ^1.0.0 + chrisjoyce911/esp32FOTA @ ^0.1.4 hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 [esp32_common] diff --git a/src/mqtt_hass.cpp b/src/mqtt_hass.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/wifi.cpp b/src/wifi.cpp index 4e9df4b8..27e47328 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -1,17 +1,22 @@ #include -uint32_t ifxdbwcount; int rssi = 0; String hostId = ""; -InfluxDBClient influx; -Point sensor ("fixed_stations_01"); -bool ifx_ready; +/****************************************************************************** +* H A S S M E T H O D S +******************************************************************************/ + +HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); /****************************************************************************** * I N F L U X D B M E T H O D S ******************************************************************************/ +InfluxDBClient influx; +Point sensor ("fixed_stations_01"); +bool ifx_ready; + bool influxDbIsConfigured() { if(cfg.ifx.db.length() > 0 && cfg.ifx.ip.length() > 0 && cfg.geo.length()==0) { Serial.println("-->[W][IFDB] ifxdb is configured but Location (GeoHash) is missing!"); From 7900c01232a0686bd4468a18d81c772fa166118c Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Fri, 19 Nov 2021 19:38:33 +0100 Subject: [PATCH 03/21] added basic implementation for test MQTT --- include/wifi.hpp | 1 + platformio.ini | 4 +++- src/wifi.cpp | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/wifi.hpp b/include/wifi.hpp index a75d551e..5510fc14 100644 --- a/include/wifi.hpp +++ b/include/wifi.hpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/platformio.ini b/platformio.ini index b3aa8552..11734796 100644 --- a/platformio.ini +++ b/platformio.ini @@ -27,8 +27,10 @@ build_flags = lib_deps = bblanchon/ArduinoJson @ ^6 tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 + plapointe6/EspMQTTClient @ ^1.11.1 plapointe6/HAMqttDevice @ ^1.0.0 - chrisjoyce911/esp32FOTA @ ^0.1.4 + ; chrisjoyce911/esp32FOTA @ ^0.1.4 + https://github.com/chrisjoyce911/esp32FOTA.git hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 [esp32_common] diff --git a/src/wifi.cpp b/src/wifi.cpp index 27e47328..e60c7391 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -9,6 +9,38 @@ String hostId = ""; HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); +EspMQTTClient hassMQTT( + "192.168.178.88", + 1883, + "", + "", + "HassMQTTClient" +); + +void onConnectionEstablished() { + Serial.printf("-->[MQTT] connected to %s\n",hassMQTT.getMqttServerIp()); + hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { + if (payload.equals("ON")) + Serial.printf("-->[MQTT] %d\n",true); + else if (payload.equals("OFF")) + Serial.printf("-->[MQTT] %d\n",false); + + hassMQTT.publish(hassSensor.getStateTopic(), payload); + // valueChangedMillis = millis(); + }); +} + +void mqttInit() { + + hassSensor + .enableAttributesTopic() + .addConfigVar("bri_stat_t", "~/br/state") + .addConfigVar("bri_cmd_t", "~/br/cmd") + .addConfigVar("bri_scl", "100"); + hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); + hassMQTT.enableHTTPWebUpdater(); +} + /****************************************************************************** * I N F L U X D B M E T H O D S ******************************************************************************/ @@ -187,6 +219,7 @@ void wifiConnect(const char* ssid, const char* pass) { wd.pause(); otaInit(); ota.checkRemoteOTA(); + mqttInit(); wd.resume(); } else { Serial.println("fail!\n-->[E][WIFI] disconnected!"); @@ -222,6 +255,7 @@ void wifiLoop() { influxDbInit(); cfg.setWifiConnected(WiFi.isConnected()); } + hassMQTT.loop(); } int getWifiRSSI() { From f88310fd11585ddefddb0a77a47c4f4b7bbcfe22 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Fri, 19 Nov 2021 22:44:59 +0100 Subject: [PATCH 04/21] first Anaire version (automatic publication their Grafana) --- src/wifi.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/wifi.cpp b/src/wifi.cpp index e60c7391..141a4ccb 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -8,6 +8,7 @@ String hostId = ""; ******************************************************************************/ HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); +HAMqttDevice anaireSensor("CanAirIO Device", HAMqttDevice::SENSOR); EspMQTTClient hassMQTT( "192.168.178.88", @@ -17,19 +18,54 @@ EspMQTTClient hassMQTT( "HassMQTTClient" ); +EspMQTTClient anaireMQTT( + "mqtt.anaire.org", + 80, + "", + "", + "HassMQTTClient" +); + void onConnectionEstablished() { - Serial.printf("-->[MQTT] connected to %s\n",hassMQTT.getMqttServerIp()); + Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { if (payload.equals("ON")) - Serial.printf("-->[MQTT] %d\n",true); + Serial.printf("-->[MQTT] Hass command: %d\n",true); else if (payload.equals("OFF")) - Serial.printf("-->[MQTT] %d\n",false); + Serial.printf("-->[MQTT] Hass command %d\n",false); hassMQTT.publish(hassSensor.getStateTopic(), payload); // valueChangedMillis = millis(); }); } +void onAnaireConnectionEstablished() { + Serial.printf("-->[MQTT] Anaire connected to %s\n",anaireMQTT.getMqttServerIp()); + hassMQTT.subscribe("measurement", [](const String& payload) { + Serial.printf("-->[MQTT] Anaire measurement: %s\n",payload.c_str()); + }); +} + +String getAnaireDeviceId() { // Get TTGO T-Display info and fill up anaire_device_id with last 6 digits (in HEX) of WiFi mac address + uint32_t chipId = 0; + for (int i = 0; i < 17; i = i + 8) { + chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + return String(chipId, HEX); // HEX format for backwards compatibility to Anaire devices based on NodeMCU board +} + +void mqttPublish() { + char MQTT_message[256]; + sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", + getAnaireDeviceId().c_str(), + sensors.getCO2(), + sensors.getCO2humi(), + sensors.getCO2temp(), + 0.0 + ); + anaireMQTT.publish("measurement", MQTT_message); +} + void mqttInit() { hassSensor @@ -37,8 +73,25 @@ void mqttInit() { .addConfigVar("bri_stat_t", "~/br/state") .addConfigVar("bri_cmd_t", "~/br/cmd") .addConfigVar("bri_scl", "100"); + + hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); hassMQTT.enableHTTPWebUpdater(); + hassMQTT.enableDebuggingMessages(); + + anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); + anaireMQTT.enableHTTPWebUpdater(); + anaireMQTT.enableDebuggingMessages(); +} + +void mqttLoop () { + static uint_fast64_t mqttTimeStamp = 0; + if (millis() - mqttTimeStamp > cfg.stime * 2 * 1000) { + mqttTimeStamp = millis(); + mqttPublish(); + } + hassMQTT.loop(); + anaireMQTT.loop(); } /****************************************************************************** @@ -255,7 +308,7 @@ void wifiLoop() { influxDbInit(); cfg.setWifiConnected(WiFi.isConnected()); } - hassMQTT.loop(); + mqttLoop(); } int getWifiRSSI() { From 17a80cc6b63c2aea32d15e4f37e2040358836cc6 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 10:14:55 +0100 Subject: [PATCH 05/21] some refactors on MQTT methods for Hass and Anaire --- src/main.cpp | 1 - src/wifi.cpp | 29 ++++++++++++++++++----------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3390bcfa..04e89abb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -150,7 +150,6 @@ void setup() { gui.setCallbacks(new MyGUIUserPreferencesCallbacks()); gui.showWelcome(); - // device wifi mac addres and firmware version Serial.println("-->[INFO] ESP32MAC: " + cfg.deviceId); Serial.println("-->[INFO] Revision: " + gui.getFirmwareVersionCode()); diff --git a/src/wifi.cpp b/src/wifi.cpp index 141a4ccb..c0a8d39a 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -46,15 +46,13 @@ void onAnaireConnectionEstablished() { }); } -String getAnaireDeviceId() { // Get TTGO T-Display info and fill up anaire_device_id with last 6 digits (in HEX) of WiFi mac address +String getAnaireDeviceId() { uint32_t chipId = 0; - for (int i = 0; i < 17; i = i + 8) { - chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - } - return String(chipId, HEX); // HEX format for backwards compatibility to Anaire devices based on NodeMCU board + for (int i = 0; i < 17; i = i + 8) chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + return String(chipId, HEX); } -void mqttPublish() { +void anaireMqttPublish() { char MQTT_message[256]; sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", getAnaireDeviceId().c_str(), @@ -66,22 +64,31 @@ void mqttPublish() { anaireMQTT.publish("measurement", MQTT_message); } -void mqttInit() { +void mqttPublish() { + anaireMqttPublish(); +} +void hassInit() { hassSensor .enableAttributesTopic() .addConfigVar("bri_stat_t", "~/br/state") .addConfigVar("bri_cmd_t", "~/br/cmd") .addConfigVar("bri_scl", "100"); - hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); hassMQTT.enableHTTPWebUpdater(); hassMQTT.enableDebuggingMessages(); +} - anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); - anaireMQTT.enableHTTPWebUpdater(); - anaireMQTT.enableDebuggingMessages(); +void anaireInit() { + anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); + anaireMQTT.enableHTTPWebUpdater(); + anaireMQTT.enableDebuggingMessages(); +} + +void mqttInit() { + hassInit(); + anaireInit(); } void mqttLoop () { From e1b69ef040a75d216435feb8e717e94fd0ec4596 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 11:01:27 +0100 Subject: [PATCH 06/21] added rules a new preferences for Hass --- lib/configlib/ConfigApp.cpp | 49 ++++++++++++++++++++++++++++++++++++- lib/configlib/ConfigApp.hpp | 13 ++++++++++ src/wifi.cpp | 4 +-- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index cc76f148..1eb8b723 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -37,6 +37,10 @@ void ConfigApp::reload() { devmode = preferences.getBool("debugEnable", false); pax_enable = preferences.getBool("paxEnable", true); i2conly = preferences.getBool("i2conly", false); + hassip = preferences.getString("hassip", ""); + hasspt = preferences.getUInt("hasspt", 1883); + hassusr = preferences.getString("hassusr", ""); + hasspsw = preferences.getString("hasspsw", ""); preferences.end(); } @@ -59,6 +63,10 @@ String ConfigApp::getCurrentConfig() { doc["i2conly"] = preferences.getBool("i2conly", false); // force only i2c sensors doc["toffset"] = preferences.getFloat("toffset", 0.0); // temperature offset doc["altoffset"] = preferences.getFloat("altoffset",0.0);// altitude offset + doc["hassip"] = preferences.getString("hassip", ""); // Home Assistant MQTT server ip + doc["hasspt"] = preferences.getUInt("hasspt", 1883); // Home Assistant MQTT server port + doc["hassusr"] = preferences.getString("hassusr", ""); // Home Assistant MQTT user + doc["hasspsw"] = preferences.getString("hasspsw", ""); // Home Assistant MQTT password doc["lskey"] = lastKeySaved; // last key saved doc["wmac"] = (uint16_t)(chipid >> 32); // chipid calculated in init doc["wsta"] = wifi_connected; // current wifi state @@ -265,6 +273,42 @@ bool ConfigApp::saveI2COnly(bool enable) { return true; } +bool ConfigApp::saveHassIP(String ip) { + preferences.begin(_app_name, false); + preferences.putString("hassip", ip); + preferences.end(); + setLastKeySaved("hassip"); + Serial.printf("-->[CONF] Hass IP: %s saved.\n",ip.c_str()); + return true; +} + +bool ConfigApp::saveHassPort(int port) { + preferences.begin(_app_name, false); + preferences.putInt("hasspt", port); + preferences.end(); + setLastKeySaved("hasspt"); + Serial.printf("-->[CONF] Hass Port: %i saved.\n", port); + return true; +} + +bool ConfigApp::saveHassUser(String user) { + preferences.begin(_app_name, false); + preferences.putString("hassusr", user); + preferences.end(); + setLastKeySaved("hassusr"); + Serial.printf("-->[CONF] Hass User: %s saved.\n", user.c_str()); + return true; +} + +bool ConfigApp::saveHassPassword(String passw) { + preferences.begin(_app_name, false); + preferences.putString("hasspsw", passw); + preferences.end(); + setLastKeySaved("hasspsw"); + Serial.println("-->[CONF] Hass password saved."); + return true; +} + bool ConfigApp::save(const char *json) { StaticJsonDocument<1000> doc; auto error = deserializeJson(doc, json); @@ -293,8 +337,11 @@ bool ConfigApp::save(const char *json) { if (doc.containsKey("lat")) return saveGeo(doc["lat"].as(), doc["lon"].as(), doc["geo"] | ""); if (doc.containsKey("toffset")) return saveTempOffset(doc["toffset"].as()); if (doc.containsKey("altoffset")) return saveAltitudeOffset(doc["altoffset"].as()); + if (doc.containsKey("hassip")) return saveHassIP(doc["hassip"] | ""); + if (doc.containsKey("hasspt")) return saveHassPort(doc["hasspt"] | 1883); + if (doc.containsKey("hassusr")) return saveHassUser(doc["hassusr"] | ""); + if (doc.containsKey("hasspsw")) return saveHassPassword(doc["hasspsw"] | ""); - // some actions with chopid validation (for security reasons) if (cmd == ((uint16_t)(chipid >> 32)) && act.length() > 0) { if (act.equals("wst")) return wifiEnable(doc["wenb"].as()); diff --git a/lib/configlib/ConfigApp.hpp b/lib/configlib/ConfigApp.hpp index c846be85..063d57e9 100644 --- a/lib/configlib/ConfigApp.hpp +++ b/lib/configlib/ConfigApp.hpp @@ -19,6 +19,11 @@ class ConfigApp { String ssid; String pass; + String hassip; + String hassusr; + String hasspsw; + int16_t hasspt; + struct ifxdbValues { String db = "canairio"; String ip = "influxdb.canair.io"; @@ -71,6 +76,14 @@ class ConfigApp { bool paxEnable(bool enable); + bool saveHassIP(String ip); + + bool saveHassPort(int port); + + bool saveHassPassword(String pass); + + bool saveHassUser(String user); + String getCurrentConfig(); bool isWifiEnable(); diff --git a/src/wifi.cpp b/src/wifi.cpp index c0a8d39a..da449d55 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -77,13 +77,13 @@ void hassInit() { hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); hassMQTT.enableHTTPWebUpdater(); - hassMQTT.enableDebuggingMessages(); + if(cfg.devmode) hassMQTT.enableDebuggingMessages(); } void anaireInit() { anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); anaireMQTT.enableHTTPWebUpdater(); - anaireMQTT.enableDebuggingMessages(); + if(cfg.devmode) anaireMQTT.enableDebuggingMessages(); } void mqttInit() { From 8b71ccf6c13aeebad74c5e793cc46697e5a054cb Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 11:40:22 +0100 Subject: [PATCH 07/21] added Hass config fields to MQTT Hass instance --- src/wifi.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/wifi.cpp b/src/wifi.cpp index da449d55..9d6767a0 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -11,10 +11,10 @@ HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); HAMqttDevice anaireSensor("CanAirIO Device", HAMqttDevice::SENSOR); EspMQTTClient hassMQTT( - "192.168.178.88", - 1883, - "", - "", + cfg.hassip.c_str(), + cfg.hasspt, + cfg.hassusr.c_str(), + cfg.hasspsw.c_str(), "HassMQTTClient" ); @@ -26,6 +26,12 @@ EspMQTTClient anaireMQTT( "HassMQTTClient" ); +String getAnaireDeviceId() { + uint32_t chipId = 0; + for (int i = 0; i < 17; i = i + 8) chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + return String(chipId, HEX); +} + void onConnectionEstablished() { Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { @@ -40,16 +46,12 @@ void onConnectionEstablished() { } void onAnaireConnectionEstablished() { - Serial.printf("-->[MQTT] Anaire connected to %s\n",anaireMQTT.getMqttServerIp()); - hassMQTT.subscribe("measurement", [](const String& payload) { - Serial.printf("-->[MQTT] Anaire measurement: %s\n",payload.c_str()); - }); -} - -String getAnaireDeviceId() { - uint32_t chipId = 0; - for (int i = 0; i < 17; i = i + 8) chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - return String(chipId, HEX); + Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); + Serial.printf("-->[MQTT] Anaire deviceId: %s\n", getAnaireDeviceId().c_str()); + // subscription for see all Anaire devices: + // anaireMQTT.subscribe("measurement", [](const String& payload) { + // Serial.printf("-->[MQTT] Anaire measurement: %s\n", payload.c_str()); + // }); } void anaireMqttPublish() { @@ -69,6 +71,7 @@ void mqttPublish() { } void hassInit() { + if (cfg.hassip.isEmpty()) return; hassSensor .enableAttributesTopic() .addConfigVar("bri_stat_t", "~/br/state") @@ -77,13 +80,13 @@ void hassInit() { hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); hassMQTT.enableHTTPWebUpdater(); - if(cfg.devmode) hassMQTT.enableDebuggingMessages(); + if(CORE_DEBUG_LEVEL > 0) hassMQTT.enableDebuggingMessages(); } void anaireInit() { anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); anaireMQTT.enableHTTPWebUpdater(); - if(cfg.devmode) anaireMQTT.enableDebuggingMessages(); + if(CORE_DEBUG_LEVEL > 0) anaireMQTT.enableDebuggingMessages(); } void mqttInit() { From 4c358a2418e6197277fb99991f23c9cde91ac9e0 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 12:03:18 +0100 Subject: [PATCH 08/21] fixed enable/disable Hass when the IP is empty --- src/wifi.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/wifi.cpp b/src/wifi.cpp index 9d6767a0..377e700b 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -70,8 +70,12 @@ void mqttPublish() { anaireMqttPublish(); } +bool isHassEnabled() { + return !cfg.hassip.isEmpty(); +} + void hassInit() { - if (cfg.hassip.isEmpty()) return; + if(!isHassEnabled()) return; hassSensor .enableAttributesTopic() .addConfigVar("bri_stat_t", "~/br/state") @@ -100,8 +104,10 @@ void mqttLoop () { mqttTimeStamp = millis(); mqttPublish(); } - hassMQTT.loop(); + + if(isHassEnabled()) hassMQTT.loop(); anaireMQTT.loop(); + } /****************************************************************************** From 205debf53e06f41695bc8134d07e0a844aeaffff Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 14:03:05 +0100 Subject: [PATCH 09/21] migrated Anaire deviceId to Config method --- lib/configlib/ConfigApp.cpp | 8 ++++++++ lib/configlib/ConfigApp.hpp | 3 +++ src/wifi.cpp | 12 +++--------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index 1eb8b723..ea9adc33 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -5,6 +5,7 @@ void ConfigApp::init(const char app_name[]) { strcpy(_app_name, app_name); chipid = ESP.getEfuseMac(); deviceId = getDeviceId(); + anaireId = getAnaireDeviceId(); reload(); // override with debug INFO level (>=3) #ifdef CORE_DEBUG_LEVEL @@ -69,6 +70,7 @@ String ConfigApp::getCurrentConfig() { doc["hasspsw"] = preferences.getString("hasspsw", ""); // Home Assistant MQTT password doc["lskey"] = lastKeySaved; // last key saved doc["wmac"] = (uint16_t)(chipid >> 32); // chipid calculated in init + doc["anaireid"] = anaireId; // deviceId for Anaire cloud doc["wsta"] = wifi_connected; // current wifi state doc["vrev"] = REVISION; doc["vflv"] = FLAVOR; @@ -386,6 +388,12 @@ String ConfigApp::getDeviceId() { return String(baseMacChr); } +String ConfigApp::getAnaireDeviceId() { + uint32_t chipId = 0; + for (int i = 0; i < 17; i = i + 8) chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + return String(chipId, HEX); +} + String ConfigApp::getDeviceIdShort() { String devId = getDeviceId(); devId = devId.substring(13); diff --git a/lib/configlib/ConfigApp.hpp b/lib/configlib/ConfigApp.hpp index 063d57e9..f7731ea9 100644 --- a/lib/configlib/ConfigApp.hpp +++ b/lib/configlib/ConfigApp.hpp @@ -10,6 +10,7 @@ class ConfigApp { uint64_t chipid; String deviceId; String dname; + String anaireId; int stime; int stype; double lat; @@ -154,6 +155,8 @@ class ConfigApp { void performCO2Calibration(); + String getAnaireDeviceId(); + void DEBUG(const char* text, const char* textb = ""); // @todo use DEBUG_ESP_PORT ? diff --git a/src/wifi.cpp b/src/wifi.cpp index 377e700b..c888145b 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -26,12 +26,6 @@ EspMQTTClient anaireMQTT( "HassMQTTClient" ); -String getAnaireDeviceId() { - uint32_t chipId = 0; - for (int i = 0; i < 17; i = i + 8) chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - return String(chipId, HEX); -} - void onConnectionEstablished() { Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { @@ -47,7 +41,7 @@ void onConnectionEstablished() { void onAnaireConnectionEstablished() { Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); - Serial.printf("-->[MQTT] Anaire deviceId: %s\n", getAnaireDeviceId().c_str()); + Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.anaireId.c_str()); // subscription for see all Anaire devices: // anaireMQTT.subscribe("measurement", [](const String& payload) { // Serial.printf("-->[MQTT] Anaire measurement: %s\n", payload.c_str()); @@ -57,7 +51,7 @@ void onAnaireConnectionEstablished() { void anaireMqttPublish() { char MQTT_message[256]; sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", - getAnaireDeviceId().c_str(), + cfg.anaireId.c_str(), sensors.getCO2(), sensors.getCO2humi(), sensors.getCO2temp(), @@ -324,7 +318,7 @@ void wifiLoop() { influxDbInit(); cfg.setWifiConnected(WiFi.isConnected()); } - mqttLoop(); + if(cfg.isWifiEnable()) mqttLoop(); } int getWifiRSSI() { From 8602ac3d4e34ed120ee56a33266086a3e873b849 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 19:56:08 +0100 Subject: [PATCH 10/21] added dynamic instance to Hass MQTT client --- lib/configlib/ConfigApp.hpp | 2 +- src/wifi.cpp | 52 ++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib/configlib/ConfigApp.hpp b/lib/configlib/ConfigApp.hpp index f7731ea9..44617c09 100644 --- a/lib/configlib/ConfigApp.hpp +++ b/lib/configlib/ConfigApp.hpp @@ -24,7 +24,7 @@ class ConfigApp { String hassusr; String hasspsw; int16_t hasspt; - + struct ifxdbValues { String db = "canairio"; String ip = "influxdb.canair.io"; diff --git a/src/wifi.cpp b/src/wifi.cpp index c888145b..72149257 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -10,31 +10,24 @@ String hostId = ""; HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); HAMqttDevice anaireSensor("CanAirIO Device", HAMqttDevice::SENSOR); -EspMQTTClient hassMQTT( - cfg.hassip.c_str(), - cfg.hasspt, - cfg.hassusr.c_str(), - cfg.hasspsw.c_str(), - "HassMQTTClient" -); - +EspMQTTClient* hassMQTT; EspMQTTClient anaireMQTT( "mqtt.anaire.org", 80, "", "", - "HassMQTTClient" + "AnaireMQTTClient" ); void onConnectionEstablished() { - Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); - hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { + Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT->getMqttServerIp()); + hassMQTT->subscribe(hassSensor.getCommandTopic(), [](const String& payload) { if (payload.equals("ON")) Serial.printf("-->[MQTT] Hass command: %d\n",true); else if (payload.equals("OFF")) Serial.printf("-->[MQTT] Hass command %d\n",false); - hassMQTT.publish(hassSensor.getStateTopic(), payload); + hassMQTT->publish(hassSensor.getStateTopic(), payload); // valueChangedMillis = millis(); }); } @@ -69,22 +62,31 @@ bool isHassEnabled() { } void hassInit() { - if(!isHassEnabled()) return; - hassSensor - .enableAttributesTopic() - .addConfigVar("bri_stat_t", "~/br/state") - .addConfigVar("bri_cmd_t", "~/br/cmd") - .addConfigVar("bri_scl", "100"); - - hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); - hassMQTT.enableHTTPWebUpdater(); + if (!isHassEnabled()) return; + hassSensor + .enableAttributesTopic() + .addConfigVar("bri_stat_t", "~/br/state") + .addConfigVar("bri_cmd_t", "~/br/cmd") + .addConfigVar("bri_scl", "100"); + + hassMQTT = new EspMQTTClient( + cfg.hassip.c_str(), + cfg.hasspt, + cfg.hassusr.c_str(), + cfg.hasspsw.c_str(), + "HassMQTTClient"); + + hassMQTT->setOnConnectionEstablishedCallback(onConnectionEstablished); + hassMQTT->enableHTTPWebUpdater(); if(CORE_DEBUG_LEVEL > 0) hassMQTT.enableDebuggingMessages(); + // hassMQTT->enableDebuggingMessages(); } void anaireInit() { anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); anaireMQTT.enableHTTPWebUpdater(); if(CORE_DEBUG_LEVEL > 0) anaireMQTT.enableDebuggingMessages(); + // anaireMQTT.enableDebuggingMessages(); } void mqttInit() { @@ -98,10 +100,8 @@ void mqttLoop () { mqttTimeStamp = millis(); mqttPublish(); } - - if(isHassEnabled()) hassMQTT.loop(); - anaireMQTT.loop(); - + if(isHassEnabled() && WiFi.isConnected()) hassMQTT->loop(); + if(WiFi.isConnected()) anaireMQTT.loop(); } /****************************************************************************** @@ -318,7 +318,7 @@ void wifiLoop() { influxDbInit(); cfg.setWifiConnected(WiFi.isConnected()); } - if(cfg.isWifiEnable()) mqttLoop(); + mqttLoop(); } int getWifiRSSI() { From 421712ecbab46630daf271c24e6dfdc8c8bef7be Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 20:03:53 +0100 Subject: [PATCH 11/21] rev844 HassMQTT dynamic and AnaireMQTT integration --- platformio.ini | 4 ++-- src/wifi.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index f9325516..f887fc4b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,8 +16,8 @@ platform = espressif32 framework = arduino upload_speed = 1500000 monitor_speed = 115200 -version = 0.4.6 -revision = 843 +version = 0.4.7 +revision = 844 target = dev monitor_filters = time extra_scripts = pre:prebuild.py diff --git a/src/wifi.cpp b/src/wifi.cpp index 72149257..623f175e 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -78,7 +78,7 @@ void hassInit() { hassMQTT->setOnConnectionEstablishedCallback(onConnectionEstablished); hassMQTT->enableHTTPWebUpdater(); - if(CORE_DEBUG_LEVEL > 0) hassMQTT.enableDebuggingMessages(); + if(CORE_DEBUG_LEVEL > 0) hassMQTT->enableDebuggingMessages(); // hassMQTT->enableDebuggingMessages(); } From 646764e5d3285889e659537392a96da558476a26 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sat, 20 Nov 2021 23:53:50 +0100 Subject: [PATCH 12/21] changed to inline config of Hass --- lib/configlib/ConfigApp.cpp | 4 +-- platformio.ini | 6 ++-- src/wifi.cpp | 61 +++++++++++++++++++++++-------------- 3 files changed, 44 insertions(+), 27 deletions(-) diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index ea9adc33..f0d814d7 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -38,7 +38,7 @@ void ConfigApp::reload() { devmode = preferences.getBool("debugEnable", false); pax_enable = preferences.getBool("paxEnable", true); i2conly = preferences.getBool("i2conly", false); - hassip = preferences.getString("hassip", ""); + hassip = preferences.getString("hassip", "192.168.178.88"); hasspt = preferences.getUInt("hasspt", 1883); hassusr = preferences.getString("hassusr", ""); hasspsw = preferences.getString("hasspsw", ""); @@ -64,7 +64,7 @@ String ConfigApp::getCurrentConfig() { doc["i2conly"] = preferences.getBool("i2conly", false); // force only i2c sensors doc["toffset"] = preferences.getFloat("toffset", 0.0); // temperature offset doc["altoffset"] = preferences.getFloat("altoffset",0.0);// altitude offset - doc["hassip"] = preferences.getString("hassip", ""); // Home Assistant MQTT server ip + doc["hassip"] = preferences.getString("hassip", "192.168.178.88"); // Home Assistant MQTT server ip doc["hasspt"] = preferences.getUInt("hasspt", 1883); // Home Assistant MQTT server port doc["hassusr"] = preferences.getString("hassusr", ""); // Home Assistant MQTT user doc["hasspsw"] = preferences.getString("hasspsw", ""); // Home Assistant MQTT password diff --git a/platformio.ini b/platformio.ini index f887fc4b..46eef2c5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -27,8 +27,10 @@ build_flags = lib_deps = bblanchon/ArduinoJson @ ^6 tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 - plapointe6/EspMQTTClient @ ^1.11.1 - plapointe6/HAMqttDevice @ ^1.0.0 + https://github.com/plapointe6/EspMQTTClient.git + https://github.com/plapointe6/HAMqttDevice.git + ; plapointe6/EspMQTTClient @ ^1.11.1 + ; plapointe6/HAMqttDevice @ ^1.0.0 ; chrisjoyce911/esp32FOTA @ ^0.1.4 https://github.com/chrisjoyce911/esp32FOTA.git hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 diff --git a/src/wifi.cpp b/src/wifi.cpp index 623f175e..45791431 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -10,7 +10,7 @@ String hostId = ""; HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); HAMqttDevice anaireSensor("CanAirIO Device", HAMqttDevice::SENSOR); -EspMQTTClient* hassMQTT; +EspMQTTClient hassMQTT; EspMQTTClient anaireMQTT( "mqtt.anaire.org", 80, @@ -20,21 +20,41 @@ EspMQTTClient anaireMQTT( ); void onConnectionEstablished() { - Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT->getMqttServerIp()); - hassMQTT->subscribe(hassSensor.getCommandTopic(), [](const String& payload) { + Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); + delay(100); + hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { if (payload.equals("ON")) Serial.printf("-->[MQTT] Hass command: %d\n",true); else if (payload.equals("OFF")) Serial.printf("-->[MQTT] Hass command %d\n",false); - hassMQTT->publish(hassSensor.getStateTopic(), payload); + hassMQTT.publish(hassSensor.getStateTopic(), payload); // valueChangedMillis = millis(); }); + + hassMQTT.subscribe("ha/status", [](const String& payload) { + if (payload.equals("online")) { + Serial.println("-->[MQTT] Hass is online"); + hassMQTT.publish(hassSensor.getConfigTopic(), hassSensor.getConfigPayload()); + + // hassMQTT.executeDelayed(send_states_delay, []() { + // client.publish(dimmableLight.getStateTopic(), lightValues.lightOn ? "ON" : "OFF"); + // client.publish(dimmableLight.getTopic() + "/br/state", String(lightValues.brightness)); + + // dimmableLight + // .clearAttributes() + // .addAttribute("IP", WiFi.localIP().toString()); + // client.publish(dimmableLight.getAttributesTopic(), dimmableLight.getAttributesPayload()); + // }); + } + }); } void onAnaireConnectionEstablished() { - Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); - Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.anaireId.c_str()); + if (cfg.devmode) { + Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); + Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.anaireId.c_str()); + } // subscription for see all Anaire devices: // anaireMQTT.subscribe("measurement", [](const String& payload) { // Serial.printf("-->[MQTT] Anaire measurement: %s\n", payload.c_str()); @@ -62,46 +82,41 @@ bool isHassEnabled() { } void hassInit() { - if (!isHassEnabled()) return; hassSensor .enableAttributesTopic() .addConfigVar("bri_stat_t", "~/br/state") .addConfigVar("bri_cmd_t", "~/br/cmd") .addConfigVar("bri_scl", "100"); - hassMQTT = new EspMQTTClient( - cfg.hassip.c_str(), - cfg.hasspt, - cfg.hassusr.c_str(), - cfg.hasspsw.c_str(), - "HassMQTTClient"); - - hassMQTT->setOnConnectionEstablishedCallback(onConnectionEstablished); - hassMQTT->enableHTTPWebUpdater(); - if(CORE_DEBUG_LEVEL > 0) hassMQTT->enableDebuggingMessages(); - // hassMQTT->enableDebuggingMessages(); + if(CORE_DEBUG_LEVEL > 0) hassMQTT.enableDebuggingMessages(); + hassMQTT.setMqttClientName(cfg.getDeviceId().c_str()); + hassMQTT.setMqttServer(cfg.hassip.c_str(), cfg.hassusr.c_str(), cfg.hasspsw.c_str(), cfg.hasspt); + hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); + hassMQTT.setKeepAlive(60); + if(cfg.devmode) Serial.printf("-->[MQTT] connecting to %s\n", hassMQTT.getMqttServerIp()); } void anaireInit() { - anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); - anaireMQTT.enableHTTPWebUpdater(); if(CORE_DEBUG_LEVEL > 0) anaireMQTT.enableDebuggingMessages(); - // anaireMQTT.enableDebuggingMessages(); + anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); + if(cfg.devmode) Serial.printf("-->[MQTT] connecting to %s\n", anaireMQTT.getMqttServerIp()); } void mqttInit() { + Serial.println("-->[MQTT] mqttInit"); hassInit(); anaireInit(); } void mqttLoop () { + if(!WiFi.isConnected()) return; static uint_fast64_t mqttTimeStamp = 0; if (millis() - mqttTimeStamp > cfg.stime * 2 * 1000) { mqttTimeStamp = millis(); mqttPublish(); } - if(isHassEnabled() && WiFi.isConnected()) hassMQTT->loop(); - if(WiFi.isConnected()) anaireMQTT.loop(); + hassMQTT.loop(); + anaireMQTT.loop(); } /****************************************************************************** From ebf26d3c312bc9c8d643be1a1731ef0fb8a33287 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sun, 21 Nov 2021 13:02:01 +0100 Subject: [PATCH 13/21] rev847 restored IP to null for testing release --- lib/configlib/ConfigApp.cpp | 4 ++-- platformio.ini | 4 +--- src/wifi.cpp | 5 ++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index f0d814d7..ea9adc33 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -38,7 +38,7 @@ void ConfigApp::reload() { devmode = preferences.getBool("debugEnable", false); pax_enable = preferences.getBool("paxEnable", true); i2conly = preferences.getBool("i2conly", false); - hassip = preferences.getString("hassip", "192.168.178.88"); + hassip = preferences.getString("hassip", ""); hasspt = preferences.getUInt("hasspt", 1883); hassusr = preferences.getString("hassusr", ""); hasspsw = preferences.getString("hasspsw", ""); @@ -64,7 +64,7 @@ String ConfigApp::getCurrentConfig() { doc["i2conly"] = preferences.getBool("i2conly", false); // force only i2c sensors doc["toffset"] = preferences.getFloat("toffset", 0.0); // temperature offset doc["altoffset"] = preferences.getFloat("altoffset",0.0);// altitude offset - doc["hassip"] = preferences.getString("hassip", "192.168.178.88"); // Home Assistant MQTT server ip + doc["hassip"] = preferences.getString("hassip", ""); // Home Assistant MQTT server ip doc["hasspt"] = preferences.getUInt("hasspt", 1883); // Home Assistant MQTT server port doc["hassusr"] = preferences.getString("hassusr", ""); // Home Assistant MQTT user doc["hasspsw"] = preferences.getString("hasspsw", ""); // Home Assistant MQTT password diff --git a/platformio.ini b/platformio.ini index 46eef2c5..bf01800f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,7 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.7 -revision = 844 +revision = 847 target = dev monitor_filters = time extra_scripts = pre:prebuild.py @@ -29,8 +29,6 @@ lib_deps = tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 https://github.com/plapointe6/EspMQTTClient.git https://github.com/plapointe6/HAMqttDevice.git - ; plapointe6/EspMQTTClient @ ^1.11.1 - ; plapointe6/HAMqttDevice @ ^1.0.0 ; chrisjoyce911/esp32FOTA @ ^0.1.4 https://github.com/chrisjoyce911/esp32FOTA.git hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 diff --git a/src/wifi.cpp b/src/wifi.cpp index 45791431..bd21b5da 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -20,8 +20,6 @@ EspMQTTClient anaireMQTT( ); void onConnectionEstablished() { - Serial.printf("-->[MQTT] Hass connected to %s\n",hassMQTT.getMqttServerIp()); - delay(100); hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { if (payload.equals("ON")) Serial.printf("-->[MQTT] Hass command: %d\n",true); @@ -32,7 +30,7 @@ void onConnectionEstablished() { // valueChangedMillis = millis(); }); - hassMQTT.subscribe("ha/status", [](const String& payload) { + hassMQTT.subscribe("#/status", [](const String& payload) { if (payload.equals("online")) { Serial.println("-->[MQTT] Hass is online"); hassMQTT.publish(hassSensor.getConfigTopic(), hassSensor.getConfigPayload()); @@ -82,6 +80,7 @@ bool isHassEnabled() { } void hassInit() { + if(!isHassEnabled()) return; hassSensor .enableAttributesTopic() .addConfigVar("bri_stat_t", "~/br/state") From 12d57067903305cbe230372480667def389e9a7e Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sun, 21 Nov 2021 16:26:59 +0100 Subject: [PATCH 14/21] added proof of concept with geo tag station name to Anaire --- lib/configlib/ConfigApp.cpp | 14 ++++++- lib/configlib/ConfigApp.hpp | 4 +- src/wifi.cpp | 73 +++++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 35 deletions(-) diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index ea9adc33..7a804a0b 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -5,7 +5,6 @@ void ConfigApp::init(const char app_name[]) { strcpy(_app_name, app_name); chipid = ESP.getEfuseMac(); deviceId = getDeviceId(); - anaireId = getAnaireDeviceId(); reload(); // override with debug INFO level (>=3) #ifdef CORE_DEBUG_LEVEL @@ -70,7 +69,7 @@ String ConfigApp::getCurrentConfig() { doc["hasspsw"] = preferences.getString("hasspsw", ""); // Home Assistant MQTT password doc["lskey"] = lastKeySaved; // last key saved doc["wmac"] = (uint16_t)(chipid >> 32); // chipid calculated in init - doc["anaireid"] = anaireId; // deviceId for Anaire cloud + doc["anaireid"] = getStationName(); // deviceId for Anaire cloud doc["wsta"] = wifi_connected; // current wifi state doc["vrev"] = REVISION; doc["vflv"] = FLAVOR; @@ -401,6 +400,17 @@ String ConfigApp::getDeviceIdShort() { return devId; } +String ConfigApp::getStationName() { + if (geo.isEmpty()) return getAnaireDeviceId(); + String name = ""+geo.substring(0,3); // GeoHash ~70km https://en.wikipedia.org/wiki/Geohash + name = name + String(FLAVOR).substring(0,7); // Flavor short, firmware name (board) + name = name + getDeviceId().substring(10); // MAC address 4 digts + name.replace("_",""); + name.replace(":",""); + name.toUpperCase(); + return name; +} + bool ConfigApp::isWifiEnable() { return wifi_enable; } diff --git a/lib/configlib/ConfigApp.hpp b/lib/configlib/ConfigApp.hpp index 44617c09..1aec1b71 100644 --- a/lib/configlib/ConfigApp.hpp +++ b/lib/configlib/ConfigApp.hpp @@ -10,7 +10,7 @@ class ConfigApp { uint64_t chipid; String deviceId; String dname; - String anaireId; + int stime; int stype; double lat; @@ -101,6 +101,8 @@ class ConfigApp { String getDeviceIdShort(); + String getStationName(); + int getSensorType(); void clear(); diff --git a/src/wifi.cpp b/src/wifi.cpp index bd21b5da..7fb52376 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -2,6 +2,15 @@ int rssi = 0; String hostId = ""; +float humi, temp; + + +void selectTempAndHumidity() { + humi = sensors.getHumidity(); + if(humi == 0.0) humi = sensors.getCO2humi(); + temp = sensors.getTemperature(); + if(temp == 0.0) temp = sensors.getCO2temp(); +} /****************************************************************************** * H A S S M E T H O D S @@ -51,7 +60,7 @@ void onConnectionEstablished() { void onAnaireConnectionEstablished() { if (cfg.devmode) { Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); - Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.anaireId.c_str()); + Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.getStationName().c_str()); } // subscription for see all Anaire devices: // anaireMQTT.subscribe("measurement", [](const String& payload) { @@ -61,13 +70,28 @@ void onAnaireConnectionEstablished() { void anaireMqttPublish() { char MQTT_message[256]; - sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", - cfg.anaireId.c_str(), - sensors.getCO2(), - sensors.getCO2humi(), - sensors.getCO2temp(), - 0.0 - ); + + int deviceType = sensors.getPmDeviceTypeSelected(); + selectTempAndHumidity(); + + if (deviceType <= 3) { + sprintf(MQTT_message, "{id: %s,pm1: %d,pm25: %d, pm10: %d, tmp: %f, hum: %f, geo: %s}", + cfg.getStationName().c_str(), + sensors.getPM1(), + sensors.getPM25(), + sensors.getPM10(), + temp, + humi, + cfg.geo.c_str()); + } else { + sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", + cfg.getStationName().c_str(), + sensors.getCO2(), + humi, + temp, + 0.0); + } + anaireMQTT.publish("measurement", MQTT_message); } @@ -87,7 +111,7 @@ void hassInit() { .addConfigVar("bri_cmd_t", "~/br/cmd") .addConfigVar("bri_scl", "100"); - if(CORE_DEBUG_LEVEL > 0) hassMQTT.enableDebuggingMessages(); + if(cfg.devmode) hassMQTT.enableDebuggingMessages(); hassMQTT.setMqttClientName(cfg.getDeviceId().c_str()); hassMQTT.setMqttServer(cfg.hassip.c_str(), cfg.hassusr.c_str(), cfg.hasspsw.c_str(), cfg.hasspt); hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); @@ -96,8 +120,10 @@ void hassInit() { } void anaireInit() { - if(CORE_DEBUG_LEVEL > 0) anaireMQTT.enableDebuggingMessages(); + if(cfg.devmode) anaireMQTT.enableDebuggingMessages(); anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); + anaireMQTT.setKeepAlive(120); + anaireMQTT.setMaxPacketSize(512); if(cfg.devmode) Serial.printf("-->[MQTT] connecting to %s\n", anaireMQTT.getMqttServerIp()); } @@ -110,7 +136,7 @@ void mqttInit() { void mqttLoop () { if(!WiFi.isConnected()) return; static uint_fast64_t mqttTimeStamp = 0; - if (millis() - mqttTimeStamp > cfg.stime * 2 * 1000) { + if (millis() - mqttTimeStamp > cfg.stime * 1000) { mqttTimeStamp = millis(); mqttPublish(); } @@ -133,21 +159,10 @@ bool influxDbIsConfigured() { return cfg.ifx.db.length() > 0 && cfg.ifx.ip.length() > 0 && cfg.geo.length() > 0; } -String influxdbGetStationName() { - String name = ""+cfg.geo.substring(0,3); // GeoHash ~70km https://en.wikipedia.org/wiki/Geohash - name = name + String(FLAVOR).substring(0,7); // Flavor short, firmware name (board) - name = name + cfg.getDeviceId().substring(10); // MAC address 4 digts - name.replace("_",""); - name.replace(":",""); - name.toUpperCase(); - - return name; -} - void influxDbAddTags() { sensor.addTag("mac",cfg.deviceId.c_str()); sensor.addTag("geo3",cfg.geo.substring(0,3).c_str()); - sensor.addTag("name",influxdbGetStationName().c_str()); + sensor.addTag("name",cfg.getStationName().c_str()); } void influxDbInit() { @@ -172,14 +187,8 @@ void influxDbInit() { * */ void influxDbParseFields() { - // select humi and temp for publish it - float humi = sensors.getHumidity(); - if(humi == 0.0) humi = sensors.getCO2humi(); - float temp = sensors.getTemperature(); - if(temp == 0.0) temp = sensors.getCO2temp(); - sensor.clearFields(); - + selectTempAndHumidity(); sensor.addField("pm1",sensors.getPM1()); sensor.addField("pm25",sensors.getPM25()); sensor.addField("pm10",sensors.getPM10()); @@ -192,7 +201,7 @@ void influxDbParseFields() { sensor.addField("prs",sensors.getPressure()); sensor.addField("gas",sensors.getGas()); sensor.addField("alt",sensors.getAltitude()); - sensor.addField("name",influxdbGetStationName().c_str()); + sensor.addField("name",cfg.getStationName().c_str()); } bool influxDbWrite() { @@ -349,6 +358,6 @@ String getDeviceInfo () { info = info + "(" + WiFi.localIP().toString() + ")\n"; info = info + "OTA: " + String(TARGET) + " channel\n\n"; info = info + "Fixed station:\n"; - info = info + influxdbGetStationName(); + info = info + cfg.getStationName(); return info; } From e5c4230e54f34b1e9fa92fec893e6b586a371c99 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sun, 21 Nov 2021 18:16:38 +0100 Subject: [PATCH 15/21] rev847 migrated MQTT library to 256dpi/arduino-mqtt library --- include/wifi.hpp | 3 +- platformio.ini | 5 +-- src/wifi.cpp | 112 +++++++++++++++-------------------------------- 3 files changed, 39 insertions(+), 81 deletions(-) diff --git a/include/wifi.hpp b/include/wifi.hpp index 5510fc14..b913fe09 100644 --- a/include/wifi.hpp +++ b/include/wifi.hpp @@ -2,8 +2,7 @@ #include #include #include -#include -#include +#include #include #include #include diff --git a/platformio.ini b/platformio.ini index bf01800f..571916ce 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,7 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.7 -revision = 847 +revision = 848 target = dev monitor_filters = time extra_scripts = pre:prebuild.py @@ -27,8 +27,7 @@ build_flags = lib_deps = bblanchon/ArduinoJson @ ^6 tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 - https://github.com/plapointe6/EspMQTTClient.git - https://github.com/plapointe6/HAMqttDevice.git + https://github.com/256dpi/arduino-mqtt.git ; chrisjoyce911/esp32FOTA @ ^0.1.4 https://github.com/chrisjoyce911/esp32FOTA.git hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 diff --git a/src/wifi.cpp b/src/wifi.cpp index 7fb52376..c3a62d48 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -1,10 +1,13 @@ #include +/****************************************************************************** +* C O M M O N C O D E +******************************************************************************/ + int rssi = 0; String hostId = ""; float humi, temp; - void selectTempAndHumidity() { humi = sensors.getHumidity(); if(humi == 0.0) humi = sensors.getCO2humi(); @@ -13,60 +16,14 @@ void selectTempAndHumidity() { } /****************************************************************************** -* H A S S M E T H O D S +* M Q T T M E T H O D S ******************************************************************************/ -HAMqttDevice hassSensor("CanAirIO Device", HAMqttDevice::SENSOR); -HAMqttDevice anaireSensor("CanAirIO Device", HAMqttDevice::SENSOR); - -EspMQTTClient hassMQTT; -EspMQTTClient anaireMQTT( - "mqtt.anaire.org", - 80, - "", - "", - "AnaireMQTTClient" -); - -void onConnectionEstablished() { - hassMQTT.subscribe(hassSensor.getCommandTopic(), [](const String& payload) { - if (payload.equals("ON")) - Serial.printf("-->[MQTT] Hass command: %d\n",true); - else if (payload.equals("OFF")) - Serial.printf("-->[MQTT] Hass command %d\n",false); - - hassMQTT.publish(hassSensor.getStateTopic(), payload); - // valueChangedMillis = millis(); - }); - - hassMQTT.subscribe("#/status", [](const String& payload) { - if (payload.equals("online")) { - Serial.println("-->[MQTT] Hass is online"); - hassMQTT.publish(hassSensor.getConfigTopic(), hassSensor.getConfigPayload()); - - // hassMQTT.executeDelayed(send_states_delay, []() { - // client.publish(dimmableLight.getStateTopic(), lightValues.lightOn ? "ON" : "OFF"); - // client.publish(dimmableLight.getTopic() + "/br/state", String(lightValues.brightness)); - - // dimmableLight - // .clearAttributes() - // .addAttribute("IP", WiFi.localIP().toString()); - // client.publish(dimmableLight.getAttributesTopic(), dimmableLight.getAttributesPayload()); - // }); - } - }); -} +#define ANAIRE_HOST "mqtt.anaire.org" +#define ANAIRE_TOPIC "measurement" -void onAnaireConnectionEstablished() { - if (cfg.devmode) { - Serial.printf("-->[MQTT] Anaire connected to %s\n", anaireMQTT.getMqttServerIp()); - Serial.printf("-->[MQTT] Anaire deviceId: %s\n", cfg.getStationName().c_str()); - } - // subscription for see all Anaire devices: - // anaireMQTT.subscribe("measurement", [](const String& payload) { - // Serial.printf("-->[MQTT] Anaire measurement: %s\n", payload.c_str()); - // }); -} +WiFiClient net; +MQTTClient client; void anaireMqttPublish() { char MQTT_message[256]; @@ -91,8 +48,7 @@ void anaireMqttPublish() { temp, 0.0); } - - anaireMQTT.publish("measurement", MQTT_message); + client.publish(ANAIRE_TOPIC, MQTT_message); } void mqttPublish() { @@ -103,45 +59,49 @@ bool isHassEnabled() { return !cfg.hassip.isEmpty(); } -void hassInit() { - if(!isHassEnabled()) return; - hassSensor - .enableAttributesTopic() - .addConfigVar("bri_stat_t", "~/br/state") - .addConfigVar("bri_cmd_t", "~/br/cmd") - .addConfigVar("bri_scl", "100"); - - if(cfg.devmode) hassMQTT.enableDebuggingMessages(); - hassMQTT.setMqttClientName(cfg.getDeviceId().c_str()); - hassMQTT.setMqttServer(cfg.hassip.c_str(), cfg.hassusr.c_str(), cfg.hasspsw.c_str(), cfg.hasspt); - hassMQTT.setOnConnectionEstablishedCallback(onConnectionEstablished); - hassMQTT.setKeepAlive(60); - if(cfg.devmode) Serial.printf("-->[MQTT] connecting to %s\n", hassMQTT.getMqttServerIp()); +void messageReceived(String &topic, String &payload) { + // subscription for see all Anaire devices: + if(cfg.devmode) Serial.println("-->[MQTT] incoming: " + topic + " - " + payload); + + // Note: Do not use the client in the callback to publish, subscribe or + // unsubscribe as it may cause deadlocks when other things arrive while + // sending and receiving acknowledgments. Instead, change a global variable, + // or push to a queue and handle it in the loop after calling `client.loop()`. +} + +void connect() { + Serial.printf("-->[MQTT] Anaire connecting to %s ..", ANAIRE_HOST); + while (cfg.isWifiEnable() && WiFi.isConnected() && !client.connect(cfg.getStationName().c_str())) { + Serial.print("."); + delay(500); + } + Serial.println("connected!"); + client.subscribe(ANAIRE_TOPIC); } void anaireInit() { - if(cfg.devmode) anaireMQTT.enableDebuggingMessages(); - anaireMQTT.setOnConnectionEstablishedCallback(onAnaireConnectionEstablished); - anaireMQTT.setKeepAlive(120); - anaireMQTT.setMaxPacketSize(512); - if(cfg.devmode) Serial.printf("-->[MQTT] connecting to %s\n", anaireMQTT.getMqttServerIp()); + client.begin(ANAIRE_HOST, 80, net); + // client.onMessage(messageReceived); + connect(); } void mqttInit() { Serial.println("-->[MQTT] mqttInit"); - hassInit(); anaireInit(); } void mqttLoop () { if(!WiFi.isConnected()) return; + + client.loop(); + delay(10); + if (!client.connected()) connect(); + static uint_fast64_t mqttTimeStamp = 0; if (millis() - mqttTimeStamp > cfg.stime * 1000) { mqttTimeStamp = millis(); mqttPublish(); } - hassMQTT.loop(); - anaireMQTT.loop(); } /****************************************************************************** From fe126e519528ece6ce6a4b8078ddab6fe57f9057 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Sun, 21 Nov 2021 21:26:07 +0100 Subject: [PATCH 16/21] rev848 tested over 2h on PM2.5 and CO2 TTGO stations --- src/wifi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wifi.cpp b/src/wifi.cpp index c3a62d48..582cc46b 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -32,7 +32,7 @@ void anaireMqttPublish() { selectTempAndHumidity(); if (deviceType <= 3) { - sprintf(MQTT_message, "{id: %s,pm1: %d,pm25: %d, pm10: %d, tmp: %f, hum: %f, geo: %s}", + sprintf(MQTT_message, "{id: %s, pm1: %d, pm25: %d, pm10: %d, tmp: %f, hum: %f, geo: %s}", cfg.getStationName().c_str(), sensors.getPM1(), sensors.getPM25(), @@ -41,7 +41,7 @@ void anaireMqttPublish() { humi, cfg.geo.c_str()); } else { - sprintf(MQTT_message, "{id: %s,CO2: %d,humidity: %f,temperature: %f,VBat: %f}", + sprintf(MQTT_message, "{id: %s,CO2: %d, humidity: %f, temperature: %f,VBat: %f}", cfg.getStationName().c_str(), sensors.getCO2(), humi, From aea46d57f80f0075b9ba8d4644508e95fdfebb3a Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Mon, 22 Nov 2021 13:57:02 +0100 Subject: [PATCH 17/21] some code refactors and validations for bad wifi conditions --- include/wifi.hpp | 1 + src/wifi.cpp | 39 +++++++++++++++++---------------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/include/wifi.hpp b/include/wifi.hpp index b913fe09..20573ec1 100644 --- a/include/wifi.hpp +++ b/include/wifi.hpp @@ -11,6 +11,7 @@ #define PUBLISH_INTERVAL 30 // publish to cloud each 30 seconds #define WIFI_RETRY_CONNECTION 30 // 30 seconds wait for wifi connection #define IFX_RETRY_CONNECTION 5 // influxdb publish retry +#define MQTT_RETRY_CONNECTION 5 // mqtt publish retry void otaLoop(); void otaInit(); diff --git a/src/wifi.cpp b/src/wifi.cpp index 582cc46b..40297b58 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -21,6 +21,7 @@ void selectTempAndHumidity() { #define ANAIRE_HOST "mqtt.anaire.org" #define ANAIRE_TOPIC "measurement" +#define ANAIRE_PORT 80 WiFiClient net; MQTTClient client; @@ -55,38 +56,32 @@ void mqttPublish() { anaireMqttPublish(); } -bool isHassEnabled() { - return !cfg.hassip.isEmpty(); -} - -void messageReceived(String &topic, String &payload) { - // subscription for see all Anaire devices: - if(cfg.devmode) Serial.println("-->[MQTT] incoming: " + topic + " - " + payload); +void connect() { - // Note: Do not use the client in the callback to publish, subscribe or - // unsubscribe as it may cause deadlocks when other things arrive while - // sending and receiving acknowledgments. Instead, change a global variable, - // or push to a queue and handle it in the loop after calling `client.loop()`. -} + if (!(cfg.isWifiEnable() && WiFi.isConnected())) return; -void connect() { Serial.printf("-->[MQTT] Anaire connecting to %s ..", ANAIRE_HOST); - while (cfg.isWifiEnable() && WiFi.isConnected() && !client.connect(cfg.getStationName().c_str())) { + int mqtt_try = 0; + while (mqtt_try++ < MQTT_RETRY_CONNECTION && !client.connect(cfg.getStationName().c_str())) { Serial.print("."); delay(500); } + if (mqtt_try >= MQTT_RETRY_CONNECTION && !client.connected()) { + Serial.println("[E][MQTT] connection failed!"); + return; + } + Serial.println("connected!"); client.subscribe(ANAIRE_TOPIC); } void anaireInit() { - client.begin(ANAIRE_HOST, 80, net); - // client.onMessage(messageReceived); + Serial.println("-->[MQTT] Anaire init"); + client.begin(ANAIRE_HOST, ANAIRE_PORT, net); connect(); } void mqttInit() { - Serial.println("-->[MQTT] mqttInit"); anaireInit(); } @@ -114,7 +109,7 @@ bool ifx_ready; bool influxDbIsConfigured() { if(cfg.ifx.db.length() > 0 && cfg.ifx.ip.length() > 0 && cfg.geo.length()==0) { - Serial.println("-->[W][IFDB] ifxdb is configured but Location (GeoHash) is missing!"); + Serial.println("[W][IFDB] ifxdb is configured but Location (GeoHash) is missing!"); } return cfg.ifx.db.length() > 0 && cfg.ifx.ip.length() > 0 && cfg.geo.length() > 0; } @@ -137,7 +132,7 @@ void influxDbInit() { Serial.printf("-->[IFDB] connected to %s\n",influx.getServerUrl().c_str()); ifx_ready = true; } - else Serial.println("-->[E][IFDB] connection error!"); + else Serial.println("[E][IFDB] connection error!"); delay(100); } } @@ -168,7 +163,7 @@ bool influxDbWrite() { influxDbParseFields(); log_d("[IFDB] %s",influx.pointToLineProtocol(sensor).c_str()); if (!influx.writePoint(sensor)) { - Serial.print("-->[E][IFDB] Write Point failed: "); + Serial.print("[E][IFDB] Write Point failed: "); Serial.println(influx.getLastErrorMessage()); return false; } @@ -185,7 +180,7 @@ void influxDbLoop() { gui.displayDataOnIcon(); } else - Serial.printf("-->[E][IFDB] write error to %s@%s:%i \n",cfg.ifx.db.c_str(),cfg.ifx.ip.c_str(),cfg.ifx.pt); + Serial.printf("[E][IFDB] write error to %s@%s:%i \n",cfg.ifx.db.c_str(),cfg.ifx.ip.c_str(),cfg.ifx.pt); } } } @@ -268,7 +263,7 @@ void wifiConnect(const char* ssid, const char* pass) { mqttInit(); wd.resume(); } else { - Serial.println("fail!\n-->[E][WIFI] disconnected!"); + Serial.println("fail!\n[E][WIFI] disconnected!"); } } From c451ec4c5b183f8832653cb1422d5ea4f800da65 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Mon, 22 Nov 2021 13:57:27 +0100 Subject: [PATCH 18/21] improved presentation on serial log for W and E error msgs --- lib/canairioota/src/OTAHandler.cpp | 2 +- lib/configlib/ConfigApp.cpp | 18 +++++++++--------- src/bluetooth.cpp | 6 +++--- tests/test_auth/src/main.cpp | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/canairioota/src/OTAHandler.cpp b/lib/canairioota/src/OTAHandler.cpp index 335fe548..d239275f 100644 --- a/lib/canairioota/src/OTAHandler.cpp +++ b/lib/canairioota/src/OTAHandler.cpp @@ -29,7 +29,7 @@ void OTAHandler::setup(const char* ESP_ID, const char* ESP_PASS) { ota.getInstance()->m_pOTAHandlerCallbacks->onProgress(progress,total); }) .onError([](ota_error_t error) { - Serial.printf("-->[E][OTA] Error[%u]: ", error); + Serial.printf("[E][OTA] 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"); diff --git a/lib/configlib/ConfigApp.cpp b/lib/configlib/ConfigApp.cpp index 7a804a0b..18763cd0 100644 --- a/lib/configlib/ConfigApp.cpp +++ b/lib/configlib/ConfigApp.cpp @@ -132,7 +132,7 @@ bool ConfigApp::saveDeviceName(String name) { Serial.println("-->[CONF] set device name to: " + name); return true; } - DEBUG("-->[E][CONF] device name is empty!"); + DEBUG("[E][CONF] device name is empty!"); return false; } @@ -143,7 +143,7 @@ bool ConfigApp::saveSampleTime(int time) { Serial.println(time); return true; } - DEBUG("-->[W][CONF] warning: sample time is too low!"); + DEBUG("[W][CONF] warning: sample time is too low!"); return false; } @@ -182,7 +182,7 @@ bool ConfigApp::saveSSID(String ssid){ Serial.println("-->[CONF] WiFi SSID saved!"); return true; } - DEBUG("-->[W][CONF] empty Wifi SSID"); + DEBUG("[W][CONF] empty Wifi SSID"); return false; } @@ -200,7 +200,7 @@ bool ConfigApp::saveWifi(String ssid, String pass){ log_i("[CONF] ssid:%s pass:%s",ssid,pass); return true; } - DEBUG("-->[W][CONF] empty Wifi SSID"); + DEBUG("[W][CONF] empty Wifi SSID"); return false; } @@ -218,7 +218,7 @@ bool ConfigApp::saveInfluxDb(String db, String ip, int pt) { Serial.println("-->[CONF] influxdb config saved."); return true; } - DEBUG("-->[W][CONF] wrong InfluxDb params!"); + DEBUG("[W][CONF] wrong InfluxDb params!"); return false; } @@ -235,7 +235,7 @@ bool ConfigApp::saveGeo(double lat, double lon, String geo){ Serial.println(geo); return true; } - DEBUG("-->[W][CONF] wrong GEO params!"); + DEBUG("[W][CONF] wrong GEO params!"); return false; } @@ -314,7 +314,7 @@ bool ConfigApp::save(const char *json) { StaticJsonDocument<1000> doc; auto error = deserializeJson(doc, json); if (error) { - Serial.print(F("-->[E][CONF] deserialize Json failed with code ")); + Serial.print(F("[E][CONF] deserialize Json failed with code ")); Serial.println(error.c_str()); return false; } @@ -355,7 +355,7 @@ bool ConfigApp::save(const char *json) { if (act.equals("clb")) performCO2Calibration(); return true; } else { - Serial.println("-->[E][CONF] invalid config file!"); + Serial.println("[E][CONF] invalid config file!"); return false; } } @@ -364,7 +364,7 @@ bool ConfigApp::getTrackStatusValues(const char *json) { StaticJsonDocument<200> doc; auto error = deserializeJson(doc, json); if (error) { - Serial.print(F("-->[E][CONF] deserialize Json failed with code ")); + Serial.print(F("[E][CONF] deserialize Json failed with code ")); Serial.println(error.c_str()); return false; } diff --git a/src/bluetooth.cpp b/src/bluetooth.cpp index d0159bad..35942455 100644 --- a/src/bluetooth.cpp +++ b/src/bluetooth.cpp @@ -91,7 +91,7 @@ class MyConfigCallbacks : public BLECharacteristicCallbacks { if(sensors.devmode != cfg.devmode) sensors.setDebugMode(cfg.devmode); } else{ - Serial.println("-->[E][BTLE][CONFIG] saving error!"); + Serial.println("[E][BTLE][CONFIG] saving error!"); } } }; @@ -106,12 +106,12 @@ class MyStatusCallbacks : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic* pCharacteristic) { std::string value = pCharacteristic->getValue(); if (value.length() > 0 && cfg.getTrackStatusValues(value.c_str())) { - log_v("-->[E][BTLE][STATUS] "+String(value.c_str())); + log_v("[E][BTLE][STATUS] "+String(value.c_str())); gui.setTrackValues(cfg.track.spd,cfg.track.kms); gui.setTrackTime(cfg.track.hrs,cfg.track.min,cfg.track.seg); } else { - Serial.println("-->[E][BTLE][STATUS] write error!"); + Serial.println("[E][BTLE][STATUS] write error!"); } } }; diff --git a/tests/test_auth/src/main.cpp b/tests/test_auth/src/main.cpp index cd06a13f..c3e4b7a6 100644 --- a/tests/test_auth/src/main.cpp +++ b/tests/test_auth/src/main.cpp @@ -55,7 +55,7 @@ void wifiConnect(const char* ssid, const char* pass) { if (wifiCheck()) { Serial.println("done\n-->[WIFI] connected!"); } else { - Serial.println("fail!\n-->[E][WIFI] disconnected!"); + Serial.println("fail!\n[E][WIFI] disconnected!"); } } From 84f07895793f7362b5bdc724264118f187881e26 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Mon, 22 Nov 2021 15:10:44 +0100 Subject: [PATCH 19/21] rev849 Added delayed time for bad MQTT connection condition --- include/wifi.hpp | 3 +- platformio.ini | 2 +- src/wifi.cpp | 87 +++++++++++++++++++++++++----------------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/include/wifi.hpp b/include/wifi.hpp index 20573ec1..d6486f54 100644 --- a/include/wifi.hpp +++ b/include/wifi.hpp @@ -11,7 +11,8 @@ #define PUBLISH_INTERVAL 30 // publish to cloud each 30 seconds #define WIFI_RETRY_CONNECTION 30 // 30 seconds wait for wifi connection #define IFX_RETRY_CONNECTION 5 // influxdb publish retry -#define MQTT_RETRY_CONNECTION 5 // mqtt publish retry +#define MQTT_RETRY_CONNECTION 1 // mqtt publish retry +#define MQTT_DELAYED_TIME 30 // mqtt retry connection delayed time void otaLoop(); void otaInit(); diff --git a/platformio.ini b/platformio.ini index 571916ce..67c3787f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,7 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.7 -revision = 848 +revision = 849 target = dev monitor_filters = time extra_scripts = pre:prebuild.py diff --git a/src/wifi.cpp b/src/wifi.cpp index 40297b58..defebb8d 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -27,57 +27,66 @@ WiFiClient net; MQTTClient client; void anaireMqttPublish() { - char MQTT_message[256]; - - int deviceType = sensors.getPmDeviceTypeSelected(); - selectTempAndHumidity(); - - if (deviceType <= 3) { - sprintf(MQTT_message, "{id: %s, pm1: %d, pm25: %d, pm10: %d, tmp: %f, hum: %f, geo: %s}", - cfg.getStationName().c_str(), - sensors.getPM1(), - sensors.getPM25(), - sensors.getPM10(), - temp, - humi, - cfg.geo.c_str()); - } else { - sprintf(MQTT_message, "{id: %s,CO2: %d, humidity: %f, temperature: %f,VBat: %f}", - cfg.getStationName().c_str(), - sensors.getCO2(), - humi, - temp, - 0.0); + static uint_fast64_t mqttTimeStamp = 0; + if (millis() - mqttTimeStamp > cfg.stime * 1000) { + mqttTimeStamp = millis(); + char MQTT_message[256]; + + int deviceType = sensors.getPmDeviceTypeSelected(); + selectTempAndHumidity(); + + if (deviceType <= 3) { + sprintf(MQTT_message, "{id: %s, pm1: %d, pm25: %d, pm10: %d, tmp: %f, hum: %f, geo: %s}", + cfg.getStationName().c_str(), + sensors.getPM1(), + sensors.getPM25(), + sensors.getPM10(), + temp, + humi, + cfg.geo.c_str()); + } else { + sprintf(MQTT_message, "{id: %s,CO2: %d, humidity: %f, temperature: %f,VBat: %f}", + cfg.getStationName().c_str(), + sensors.getCO2(), + humi, + temp, + 0.0); + } + client.publish(ANAIRE_TOPIC, MQTT_message); } - client.publish(ANAIRE_TOPIC, MQTT_message); } void mqttPublish() { anaireMqttPublish(); } -void connect() { +static uint_fast64_t mqttDelayedStamp = 0; +void connect() { if (!(cfg.isWifiEnable() && WiFi.isConnected())) return; - Serial.printf("-->[MQTT] Anaire connecting to %s ..", ANAIRE_HOST); - int mqtt_try = 0; - while (mqtt_try++ < MQTT_RETRY_CONNECTION && !client.connect(cfg.getStationName().c_str())) { - Serial.print("."); - delay(500); - } - if (mqtt_try >= MQTT_RETRY_CONNECTION && !client.connected()) { - Serial.println("[E][MQTT] connection failed!"); - return; + if (millis() - mqttDelayedStamp > MQTT_DELAYED_TIME * 1000) { + Serial.printf("-->[MQTT] Anaire connecting to %s..", ANAIRE_HOST); + int mqtt_try = 0; + while (mqtt_try++ < MQTT_RETRY_CONNECTION && !client.connect(cfg.getStationName().c_str())) { + Serial.print("."); + delay(100); + } + if (mqtt_try >= MQTT_RETRY_CONNECTION && !client.connected()) { + mqttDelayedStamp = millis(); + Serial.println("connection failed!"); + return; + } + mqttDelayedStamp = millis(); + Serial.println("connected!"); + client.subscribe(ANAIRE_TOPIC); } - - Serial.println("connected!"); - client.subscribe(ANAIRE_TOPIC); } void anaireInit() { Serial.println("-->[MQTT] Anaire init"); client.begin(ANAIRE_HOST, ANAIRE_PORT, net); + mqttDelayedStamp = millis() - MQTT_DELAYED_TIME * 1000; connect(); } @@ -87,16 +96,10 @@ void mqttInit() { void mqttLoop () { if(!WiFi.isConnected()) return; - client.loop(); delay(10); if (!client.connected()) connect(); - - static uint_fast64_t mqttTimeStamp = 0; - if (millis() - mqttTimeStamp > cfg.stime * 1000) { - mqttTimeStamp = millis(); - mqttPublish(); - } + mqttPublish(); } /****************************************************************************** From 0758282b4dbf91eba0051d8b582c2be4930edaa2 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Tue, 23 Nov 2021 15:17:35 +0100 Subject: [PATCH 20/21] testing issue altitude issue on Sensorlib https://github.com/kike-canaries/canairio_sensorlib/pull/100 --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 398a0a23..5a4b7b02 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,7 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.6 -revision = 843 +revision = 850 target = dev monitor_filters = time extra_scripts = pre:prebuild.py @@ -28,7 +28,7 @@ lib_deps = bblanchon/ArduinoJson @ ^6 tobiasschuerg/ESP8266 Influxdb @ ^3.8.0 https://github.com/hpsaturn/esp32FOTA.git - hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 + ; hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 [esp32_common] platform = espressif32 From 5e91de8d4e152af1f470510543e2a7bf1de74be1 Mon Sep 17 00:00:00 2001 From: Hpsaturn Date: Wed, 24 Nov 2021 12:45:43 +0100 Subject: [PATCH 21/21] rev851 new Sensorlib v0.3.8, Anaire MQTT prod release --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 33590e62..bf411329 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,8 +17,8 @@ framework = arduino upload_speed = 1500000 monitor_speed = 115200 version = 0.4.7 -revision = 850 -target = dev +revision = 851 +target = prod monitor_filters = time extra_scripts = pre:prebuild.py build_flags = @@ -30,7 +30,7 @@ lib_deps = https://github.com/256dpi/arduino-mqtt.git ; chrisjoyce911/esp32FOTA @ ^0.1.4 https://github.com/chrisjoyce911/esp32FOTA.git - ; hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.7 + hpsaturn/CanAirIO Air Quality Sensors Library@^0.3.8 [esp32_common] platform = espressif32