From 4b20976a08d48928196973517a748e3e55c74ba3 Mon Sep 17 00:00:00 2001 From: Florian Date: Tue, 17 Sep 2024 10:32:20 -0400 Subject: [PATCH] [BLUFI] Add Blufi activation and deactivation at runtime (#2058) Co-authored-by: Florian <1technophile@users.noreply.github.com> --- main/User_config.h | 4 ++++ main/Zblufi.ino | 18 ++++++++++++++++++ main/main.ino | 41 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/main/User_config.h b/main/User_config.h index b8391af..e648d78 100644 --- a/main/User_config.h +++ b/main/User_config.h @@ -648,6 +648,7 @@ enum PowerMode { DEACTIVATED = -1, struct SYSConfig_s { bool mqtt; // if true the gateway will publish the received data on the MQTT broker bool serial; // if true the gateway will publish the received data on the SERIAL + bool blufi; // if true the gateway will be accesible with blufi bool offline; bool discovery; // HA discovery convention bool ohdiscovery; // OH discovery specificities @@ -663,6 +664,9 @@ struct SYSConfig_s { #ifndef DEFAULT_SERIAL # define DEFAULT_SERIAL false #endif +#ifndef DEFAULT_BLUFI +# define DEFAULT_BLUFI true +#endif #ifndef DEFAULT_OFFLINE # define DEFAULT_OFFLINE false #endif diff --git a/main/Zblufi.ino b/main/Zblufi.ino index f1b2416..a1fbf20 100644 --- a/main/Zblufi.ino +++ b/main/Zblufi.ino @@ -396,7 +396,25 @@ bool startBlufi() { NimBLEDevice::init(advName); esp_blufi_gatt_svr_init(); ble_gatts_start(); + Log.notice(F("BLUFI started" CR)); return esp_blufi_profile_init() == ESP_OK; } +bool stopBlufi() { + esp_err_t result = ESP_OK; + if (omg_blufi_ble_connected) { + esp_blufi_disconnect(); + delay(50); + } + + ble_gap_adv_stop(); + result = esp_blufi_profile_deinit(); + if (result != ESP_OK) { + Log.error(F("Failed to deinit blufi profile: %d" CR), result); + return false; + } + Log.notice(F("BLUFI stopped" CR)); + return true; +} + #endif // defined(ESP32) && defined(USE_BLUFI) \ No newline at end of file diff --git a/main/main.ino b/main/main.ino index ebcc9b4..71327c1 100644 --- a/main/main.ino +++ b/main/main.ino @@ -795,6 +795,9 @@ void SYSConfig_init() { SYSConfig.mqtt = DEFAULT_MQTT; SYSConfig.serial = DEFAULT_SERIAL; SYSConfig.offline = DEFAULT_OFFLINE; +#if USE_BLUFI + SYSConfig.blufi = DEFAULT_BLUFI; +#endif #ifdef ZmqttDiscovery SYSConfig.discovery = DEFAULT_DISCOVERY; SYSConfig.ohdiscovery = OpenHABDiscovery; @@ -809,6 +812,9 @@ void SYSConfig_fromJson(JsonObject& SYSdata) { Config_update(SYSdata, "mqtt", SYSConfig.mqtt); Config_update(SYSdata, "serial", SYSConfig.serial); Config_update(SYSdata, "offline", SYSConfig.offline); +#if USE_BLUFI + Config_update(SYSdata, "blufi", SYSConfig.blufi); +#endif #ifdef ZmqttDiscovery Config_update(SYSdata, "disc", SYSConfig.discovery); Config_update(SYSdata, "ohdisc", SYSConfig.ohdiscovery); @@ -827,6 +833,9 @@ void SYSConfig_save() { SYSdata["serial"] = SYSConfig.serial; SYSdata["offline"] = SYSConfig.offline; SYSdata["powermode"] = SYSConfig.powerMode; +# if USE_BLUFI + SYSdata["blufi"] = SYSConfig.blufi; +# endif # ifdef ZmqttDiscovery SYSdata["disc"] = SYSConfig.discovery; SYSdata["ohdisc"] = SYSConfig.ohdiscovery; @@ -1374,7 +1383,8 @@ void setup() { #endif #if defined(ESP32) && defined(USE_BLUFI) - startBlufi(); + if (SYSConfig.blufi) + startBlufi(); #endif #if defined(ESPWifiManualSetup) @@ -2733,6 +2743,9 @@ String stateMeasures() { #ifdef LED_ADDRESSABLE SYSdata["rgbb"] = SYSConfig.rgbbrightness; #endif +#if USE_BLUFI + SYSdata["blufi"] = SYSConfig.blufi; +#endif #ifdef ZmqttDiscovery SYSdata["disc"] = SYSConfig.discovery; SYSdata["ohdisc"] = SYSConfig.ohdiscovery; @@ -3268,6 +3281,7 @@ void readCntParameters(int index) { void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding if (cmpToMainTopic(topicOri, subjectMQTTtoSYSset)) { bool restartESP = false; + bool publishState = false; Log.trace(F("MQTTtoSYS json" CR)); if (SYSdata.containsKey("cmd")) { const char* cmd = SYSdata["cmd"]; @@ -3279,7 +3293,7 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding setupwifi(true); #endif } else if (strstr(cmd, statusCmd) != NULL) { //erase and restart - stateMeasures(); + publishState = true; } } #ifdef LED_ADDRESSABLE @@ -3291,7 +3305,7 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding updatePowerIndicator(); # endif Log.notice(F("RGB brightness: %d" CR), SYSConfig.rgbbrightness); - stateMeasures(); + publishState = true; } else { Log.warning(F("RGB brightness value invalid - ignoring command" CR)); } @@ -3301,7 +3315,7 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding if (SYSdata.containsKey("ohdisc") && SYSdata["ohdisc"].is()) { SYSConfig.ohdiscovery = SYSdata["ohdisc"]; Log.notice(F("OpenHAB discovery: %T" CR), SYSConfig.ohdiscovery); - stateMeasures(); + publishState = true; } #endif if (SYSdata.containsKey("wifi_ssid") && SYSdata["wifi_ssid"].is() && SYSdata.containsKey("wifi_pass") && SYSdata["wifi_pass"].is()) { @@ -3494,12 +3508,26 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding SYSConfig.powerMode = SYSdata["powermode"]; Log.notice(F("Power mode: %d" CR), SYSConfig.powerMode); } +#if USE_BLUFI + if (SYSdata.containsKey("blufi") && SYSdata["blufi"].is()) { + bool res = false; + if (SYSdata["blufi"] && !SYSConfig.blufi) { // Start Blufi + res = startBlufi(); + } else if (!SYSdata["blufi"] && SYSConfig.blufi) { // Stop Blufi + res = stopBlufi(); + } + if (res) + SYSConfig.blufi = SYSdata["blufi"]; + publishState = true; + Log.notice(F("Blufi: %T" CR), SYSConfig.blufi); + } +#endif if (SYSdata.containsKey("disc")) { if (SYSdata["disc"].is()) { if (SYSdata["disc"] == true && SYSConfig.discovery == false) lastDiscovery = millis(); SYSConfig.discovery = SYSdata["disc"]; - stateMeasures(); + publishState = true; if (SYSConfig.discovery) pubMqttDiscovery(); } else { @@ -3510,6 +3538,9 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding if (SYSdata.containsKey("save") && SYSdata["save"].as()) { SYSConfig_save(); } + if (publishState) { + stateMeasures(); + } if (restartESP) { ESPRestart(7); }