diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index ff6c5a5d5..6590348ee 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -4,6 +4,8 @@ ## **IMPORTANT! BREAKING CHANGES** +- The Wifi Tx Power setting in Network Settings will be reset to Auto + ## Added - thermostat boost mode and boost time [#1446](https://github.com/emsesp/EMS-ESP32/issues/1446) @@ -28,6 +30,8 @@ - MQTT autodiscovery in Domoticz not working [#1360](https://github.com/emsesp/EMS-ESP32/issues/1528) - dhw comfort for new ems+, [#1495](https://github.com/emsesp/EMS-ESP32/issues/1495) - added writeable icon to Web's Custom Entity page for each entity shown in the table +- Wifi Tx Power not adjusted [#1614](https://github.com/emsesp/EMS-ESP32/issues/1614) +- MQTT discovery of custom entity doesn't consider type of data [#1587](https://github.com/emsesp/EMS-ESP32/issues/1587) ## Changed diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index fe4c574a5..20387fcf6 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -15,8 +15,8 @@ import { ListItemSecondaryAction, ListItemText, Typography, - InputAdornment, - TextField + TextField, + MenuItem } from '@mui/material'; // eslint-disable-next-line import/named import { updateState, useRequest } from 'alova'; @@ -43,7 +43,7 @@ import { } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import { numberValue, updateValueDirty, useRest } from 'utils'; +import { updateValueDirty, useRest } from 'utils'; import { validate } from 'validators'; import { createNetworkSettingsValidator } from 'validators/network'; @@ -88,7 +88,7 @@ const WiFiSettingsForm: FC = () => { static_ip_config: false, enableIPv6: false, bandwidth20: false, - tx_power: 20, + tx_power: 0, nosleep: false, enableMDNS: true, enableCORS: false, @@ -196,20 +196,27 @@ const WiFiSettingsForm: FC = () => { margin="normal" /> )} - dBm - }} fullWidth variant="outlined" - value={numberValue(data.tx_power)} + value={data.tx_power} onChange={updateFormValue} - type="number" margin="normal" - /> + select + > + Auto + 19.5 dBm + 19 dBm + 18.5 dBm + 17 dBm + 15 dBm + 13 dBm + 11 dBm + 8.5 dBm + 7 dBm + } label={LL.NETWORK_DISABLE_SLEEP()} diff --git a/interface/src/validators/network.ts b/interface/src/validators/network.ts index 66f92a3cd..7582d7af7 100644 --- a/interface/src/validators/network.ts +++ b/interface/src/validators/network.ts @@ -14,9 +14,5 @@ export const createNetworkSettingsValidator = (networkSettings: NetworkSettings) subnet_mask: [{ required: true, message: 'Subnet mask is required' }, IP_ADDRESS_VALIDATOR], dns_ip_1: IP_ADDRESS_VALIDATOR, dns_ip_2: IP_ADDRESS_VALIDATOR - }), - tx_power: [ - { required: true, message: 'Tx Power is required' }, - { type: 'number', min: 0, max: 20, message: 'Tx Power must be between 0 and 20dBm' } - ] + }) }); diff --git a/lib/ESPAsyncWebServer/library.properties b/lib/ESPAsyncWebServer/library.properties deleted file mode 100644 index fda5f3fe8..000000000 --- a/lib/ESPAsyncWebServer/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=ESP Async WebServer -version=2.6.1 -author=Me-No-Dev -maintainer=Mathieu Carbou -sentence=Asynchronous HTTP and WebSocket Server Library for ESP32 -paragraph=Supports: WebSocket, SSE, Authentication, Arduino Json 7, File Upload, Static File serving, URL Rewrite, URL Redirect, etc -category=Other -url=https://github.com/mathieucarbou/ESPAsyncWebServer -architectures=esp32 -license=LGPL-3.0 diff --git a/lib/framework/NetworkSettingsService.cpp b/lib/framework/NetworkSettingsService.cpp index 09369efb4..f726c996b 100644 --- a/lib/framework/NetworkSettingsService.cpp +++ b/lib/framework/NetworkSettingsService.cpp @@ -1,5 +1,7 @@ #include +#include "../../src/emsesp_stub.hpp" + using namespace std::placeholders; // for `_1` etc NetworkSettingsService::NetworkSettingsService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager) @@ -7,7 +9,8 @@ NetworkSettingsService::NetworkSettingsService(AsyncWebServer * server, FS * fs, , _fsPersistence(NetworkSettings::read, NetworkSettings::update, this, fs, NETWORK_SETTINGS_FILE) , _lastConnectionAttempt(0) { addUpdateHandler([&](const String & originId) { reconfigureWiFiConnection(); }, false); - WiFi.onEvent(std::bind(&NetworkSettingsService::WiFiEvent, this, _1)); + // wifi event callbacks + WiFi.onEvent(std::bind(&NetworkSettingsService::WiFiEvent, this, _1, _2)); } void NetworkSettingsService::begin() { @@ -83,31 +86,282 @@ void NetworkSettingsService::manageSTA() { } else { WiFi.begin(_state.ssid.c_str(), _state.password.c_str()); } - // set power after wifi is startet, fixed value for C3_V1 - // if (WiFi.isConnected()) { -#ifdef BOARD_C3_MINI_V1 - // v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979 - WiFi.setTxPower(WIFI_POWER_8_5dBm); // https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi -#else - // esp_wifi_set_max_tx_power(_state.tx_power * 4); - // TODO make it dynamic - WiFi.setTxPower((wifi_power_t)(_state.tx_power * 4)); -#endif - // } + // Set thw Wifi Tx power + setWiFiPower(); } else { // not connected but STA-mode active => disconnect reconfigureWiFiConnection(); } } -// handles if wifi stopped -void NetworkSettingsService::WiFiEvent(WiFiEvent_t event) { - if (event == ARDUINO_EVENT_WIFI_STA_STOP) { +// set the Tx WiFi power +// based of RSSI (signal strength) and copied from Tasmota's WiFiSetTXpowerBasedOnRssi() function with is copied from espEasy +void NetworkSettingsService::setWiFiPower() { +// hardcode Tx power for Wemos CS Mini v1 +// v1 needs this value, see https://github.com/emsesp/EMS-ESP32/pull/620#discussion_r993173979 +// https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi +#ifdef BOARD_C3_MINI_V1 + WiFi.setTxPower(WIFI_POWER_8_5dBm); + return; +#endif + + auto set_power = _state.tx_power; // get user settings. 0 means auto + + // If Auto set the TxPower based on the RSSI (signal strength) + if (set_power == 0) { + // Range ESP32 : 2dBm - 20dBm + // 802.11b - wifi1 + // 802.11a - wifi2 + // 802.11g - wifi3 + // 802.11n - wifi4 + // 802.11ac - wifi5 + // 802.11ax - wifi6 + int max_tx_pwr = MAX_TX_PWR_DBM_n; // assume wifi4 + int threshold = WIFI_SENSITIVITY_n; + threshold += 30; // Margin in dBm * 10 on top of threshold + + // Assume AP sends with max set by ETSI standard. + // 2.4 GHz: 100 mWatt (20 dBm) + // US and some other countries allow 1000 mW (30 dBm) + int rssi = WiFi.RSSI() * 10; + int newrssi = rssi - 200; // We cannot send with over 20 dBm, thus it makes no sense to force higher TX power all the time. + + int min_tx_pwr = 0; + if (newrssi < threshold) { + min_tx_pwr = threshold - newrssi; + } + if (min_tx_pwr > max_tx_pwr) { + min_tx_pwr = max_tx_pwr; + } + + set_power = min_tx_pwr / 10; // this is the recommended power setting to use + } + + // use the user setting, which is a value from WiFIGeneric.h + // WIFI_POWER_19_5dBm = 78,// 19.5dBm + // WIFI_POWER_19dBm = 76,// 19dBm + // WIFI_POWER_18_5dBm = 74,// 18.5dBm + // WIFI_POWER_17dBm = 68,// 17dBm + // WIFI_POWER_15dBm = 60,// 15dBm + // WIFI_POWER_13dBm = 52,// 13dBm + // WIFI_POWER_11dBm = 44,// 11dBm + // WIFI_POWER_8_5dBm = 34,// 8.5dBm + // WIFI_POWER_7dBm = 28,// 7dBm + // WIFI_POWER_5dBm = 20,// 5dBm + // WIFI_POWER_2dBm = 8,// 2dBm + // WIFI_POWER_MINUS_1dBm = -4// -1dBm + wifi_power_t p = WIFI_POWER_2dBm; + if (set_power > 19) + p = WIFI_POWER_19_5dBm; + else if (set_power > 18) + p = WIFI_POWER_18_5dBm; + else if (set_power >= 17) + p = WIFI_POWER_17dBm; + else if (set_power >= 15) + p = WIFI_POWER_15dBm; + else if (set_power >= 13) + p = WIFI_POWER_13dBm; + else if (set_power >= 11) + p = WIFI_POWER_11dBm; + else if (set_power >= 8) + p = WIFI_POWER_8_5dBm; + else if (set_power >= 7) + p = WIFI_POWER_7dBm; + else if (set_power >= 5) + p = WIFI_POWER_5dBm; + + WiFi.setTxPower(p); +} + +// start the multicast UDP service so EMS-ESP is discoverable via .local +void NetworkSettingsService::mDNS_start() const { +#ifndef EMSESP_STANDALONE + MDNS.end(); + + if (_state.enableMDNS) { + if (!MDNS.begin(emsesp::EMSESP::system_.hostname().c_str())) { + emsesp::EMSESP::logger().warning("Failed to start mDNS responder service"); + return; + } + + std::string address_s = emsesp::EMSESP::system_.hostname() + ".local"; + + MDNS.addService("http", "tcp", 80); // add our web server and rest API + MDNS.addService("telnet", "tcp", 23); // add our telnet console + + MDNS.addServiceTxt("http", "tcp", "version", EMSESP_APP_VERSION); + MDNS.addServiceTxt("http", "tcp", "address", address_s.c_str()); + + emsesp::EMSESP::logger().info("mDNS responder service started"); + } +#else + if (_state.enableMDNS) { + EMSESP::logger().info("mDNS responder service started"); + } +#endif +} + +const char * NetworkSettingsService::disconnectReason(uint8_t code) { +#ifndef EMSESP_STANDALONE + switch (code) { + case WIFI_REASON_UNSPECIFIED: // = 1, + return "unspecified"; + case WIFI_REASON_AUTH_EXPIRE: // = 2, + return "auth expire"; + case WIFI_REASON_AUTH_LEAVE: // = 3, + return "auth leave"; + case WIFI_REASON_ASSOC_EXPIRE: // = 4, + return "assoc expired"; + case WIFI_REASON_ASSOC_TOOMANY: // = 5, + return "assoc too many"; + case WIFI_REASON_NOT_AUTHED: // = 6, + return "not authenticated"; + case WIFI_REASON_NOT_ASSOCED: // = 7, + return "not assoc"; + case WIFI_REASON_ASSOC_LEAVE: // = 8, + return "assoc leave"; + case WIFI_REASON_ASSOC_NOT_AUTHED: // = 9, + return "assoc not authed"; + case WIFI_REASON_DISASSOC_PWRCAP_BAD: // = 10, + return "disassoc powerCAP bad"; + case WIFI_REASON_DISASSOC_SUPCHAN_BAD: // = 11, + return "disassoc supchan bad"; + case WIFI_REASON_IE_INVALID: // = 13, + return "IE invalid"; + case WIFI_REASON_MIC_FAILURE: // = 14, + return "MIC failure"; + case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: // = 15, + return "4way handshake timeout"; + case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT: // = 16, + return "group key-update timeout"; + case WIFI_REASON_IE_IN_4WAY_DIFFERS: // = 17, + return "IE in 4way differs"; + case WIFI_REASON_GROUP_CIPHER_INVALID: // = 18, + return "group cipher invalid"; + case WIFI_REASON_PAIRWISE_CIPHER_INVALID: // = 19, + return "pairwise cipher invalid"; + case WIFI_REASON_AKMP_INVALID: // = 20, + return "AKMP invalid"; + case WIFI_REASON_UNSUPP_RSN_IE_VERSION: // = 21, + return "unsupported RSN_IE version"; + case WIFI_REASON_INVALID_RSN_IE_CAP: // = 22, + return "invalid RSN_IE_CAP"; + case WIFI_REASON_802_1X_AUTH_FAILED: // = 23, + return "802 X1 auth failed"; + case WIFI_REASON_CIPHER_SUITE_REJECTED: // = 24, + return "cipher suite rejected"; + case WIFI_REASON_BEACON_TIMEOUT: // = 200, + return "beacon timeout"; + case WIFI_REASON_NO_AP_FOUND: // = 201, + return "no AP found"; + case WIFI_REASON_AUTH_FAIL: // = 202, + return "auth fail"; + case WIFI_REASON_ASSOC_FAIL: // = 203, + return "assoc fail"; + case WIFI_REASON_HANDSHAKE_TIMEOUT: // = 204, + return "handshake timeout"; + case WIFI_REASON_CONNECTION_FAIL: // 205, + return "connection fail"; + case WIFI_REASON_AP_TSF_RESET: // 206, + return "AP tsf reset"; + case WIFI_REASON_ROAMING: // 207, + return "roaming"; + case WIFI_REASON_ASSOC_COMEBACK_TIME_TOO_LONG: // 208, + return "assoc comeback time too long"; + case WIFI_REASON_SA_QUERY_TIMEOUT: // 209, + return "sa query timeout"; + default: + return "unknown"; + } +#endif + + return ""; +} + +// handles both WiFI and Ethernet +void NetworkSettingsService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { +#ifndef EMSESP_STANDALONE + + switch (event) { + case ARDUINO_EVENT_WIFI_STA_STOP: if (_stopping) { _lastConnectionAttempt = 0; _stopping = false; } + break; + + case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: + emsesp::EMSESP::logger().warning("WiFi disconnected. Reason: %s (%d)", + disconnectReason(info.wifi_sta_disconnected.reason), + info.wifi_sta_disconnected.reason); // IDF 4.0 + emsesp::EMSESP::system_.has_ipv6(false); + break; + + case ARDUINO_EVENT_WIFI_STA_GOT_IP: + char result[10]; + emsesp::EMSESP::logger().info("WiFi connected with IP=%s, hostname=%s, TxPower=%s", + WiFi.localIP().toString().c_str(), + WiFi.getHostname(), + emsesp::Helpers::render_value(result, (double)(WiFi.getTxPower() / 4), 1)); + + mDNS_start(); + break; + + case ARDUINO_EVENT_ETH_START: + ETH.setHostname(emsesp::EMSESP::system_.hostname().c_str()); + + // configure for static IP + if (_state.staticIPConfig) { + ETH.config(_state.localIP, _state.gatewayIP, _state.subnetMask, _state.dnsIP1, _state.dnsIP2); + } + break; + + case ARDUINO_EVENT_ETH_GOT_IP: + // prevent double calls + if (!emsesp::EMSESP::system_.ethernet_connected()) { + emsesp::EMSESP::logger().info("Ethernet connected with IP=%s, speed %d Mbps", ETH.localIP().toString().c_str(), ETH.linkSpeed()); + emsesp::EMSESP::system_.ethernet_connected(true); + mDNS_start(); + } + break; + + case ARDUINO_EVENT_ETH_DISCONNECTED: + emsesp::EMSESP::logger().warning("Ethernet disconnected"); + emsesp::EMSESP::system_.ethernet_connected(false); + emsesp::EMSESP::system_.has_ipv6(false); + break; + + case ARDUINO_EVENT_ETH_STOP: + emsesp::EMSESP::logger().info("Ethernet stopped"); + emsesp::EMSESP::system_.ethernet_connected(false); + emsesp::EMSESP::system_.has_ipv6(false); + break; + + case ARDUINO_EVENT_WIFI_STA_CONNECTED: + if (_state.enableIPv6) { + WiFi.enableIpV6(); + } + break; + + case ARDUINO_EVENT_ETH_CONNECTED: + if (_state.enableIPv6) { + ETH.enableIpV6(); + } + break; + + // IPv6 specific + case ARDUINO_EVENT_WIFI_STA_GOT_IP6: + case ARDUINO_EVENT_ETH_GOT_IP6: + if (emsesp::EMSESP::system_.ethernet_connected()) { + emsesp::EMSESP::logger().info("Ethernet connected with IPv6=%s, speed %d Mbps", ETH.localIPv6().toString().c_str(), ETH.linkSpeed()); + } else { + emsesp::EMSESP::logger().info("WiFi connected with IPv6=%s, hostname=%s", WiFi.localIPv6().toString().c_str(), WiFi.getHostname()); + } + mDNS_start(); + emsesp::EMSESP::system_.has_ipv6(true); + break; + + default: + break; } - // if (!_stopping && (event == ARDUINO_EVENT_WIFI_STA_LOST_IP || event == ARDUINO_EVENT_WIFI_STA_DISCONNECTED)) { - // reconfigureWiFiConnection(); - // } +#endif } diff --git a/lib/framework/NetworkSettingsService.h b/lib/framework/NetworkSettingsService.h index 96a9b116c..70e7a9430 100644 --- a/lib/framework/NetworkSettingsService.h +++ b/lib/framework/NetworkSettingsService.h @@ -9,8 +9,13 @@ #ifndef EMSESP_STANDALONE #include #include +#include +#include +#include #endif +#include + #define NETWORK_SETTINGS_FILE "/config/networkSettings.json" #define NETWORK_SETTINGS_SERVICE_PATH "/rest/networkSettings" #define WIFI_RECONNECTION_DELAY 1000 * 3 @@ -27,6 +32,37 @@ #define FACTORY_WIFI_HOSTNAME "" #endif + +#if CONFIG_IDF_TARGET_ESP32S2 +#define MAX_TX_PWR_DBM_11b 195 +#define MAX_TX_PWR_DBM_54g 150 +#define MAX_TX_PWR_DBM_n 130 +#define WIFI_SENSITIVITY_11b -880 +#define WIFI_SENSITIVITY_54g -750 +#define WIFI_SENSITIVITY_n -720 +#elif CONFIG_IDF_TARGET_ESP32S3 +#define MAX_TX_PWR_DBM_11b 210 +#define MAX_TX_PWR_DBM_54g 190 +#define MAX_TX_PWR_DBM_n 185 +#define WIFI_SENSITIVITY_11b -880 +#define WIFI_SENSITIVITY_54g -760 +#define WIFI_SENSITIVITY_n -720 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 +#define MAX_TX_PWR_DBM_11b 210 +#define MAX_TX_PWR_DBM_54g 190 +#define MAX_TX_PWR_DBM_n 185 +#define WIFI_SENSITIVITY_11b -880 +#define WIFI_SENSITIVITY_54g -760 +#define WIFI_SENSITIVITY_n -730 +#else +#define MAX_TX_PWR_DBM_11b 195 +#define MAX_TX_PWR_DBM_54g 160 +#define MAX_TX_PWR_DBM_n 140 +#define WIFI_SENSITIVITY_11b -880 +#define WIFI_SENSITIVITY_54g -750 +#define WIFI_SENSITIVITY_n -700 +#endif + class NetworkSettings { public: // core wifi configuration @@ -84,7 +120,7 @@ class NetworkSettings { settings.staticIPConfig = root["static_ip_config"] | false; settings.enableIPv6 = root["enableIPv6"] | false; settings.bandwidth20 = root["bandwidth20"] | false; - settings.tx_power = root["tx_power"] | 20; + settings.tx_power = root["tx_power"] | 0; settings.nosleep = root["nosleep"] | false; settings.enableMDNS = root["enableMDNS"] | true; settings.enableCORS = root["enableCORS"] | false; @@ -127,13 +163,16 @@ class NetworkSettingsService : public StatefulService { private: HttpEndpoint _httpEndpoint; FSPersistence _fsPersistence; - unsigned long _lastConnectionAttempt; - bool _stopping; - void WiFiEvent(WiFiEvent_t event); + unsigned long _lastConnectionAttempt; + bool _stopping; - void reconfigureWiFiConnection(); - void manageSTA(); + void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); + void mDNS_start() const; + const char * disconnectReason(uint8_t code); + void reconfigureWiFiConnection(); + void manageSTA(); + void setWiFiPower(); }; #endif diff --git a/lib/framework/NetworkStatus.h b/lib/framework/NetworkStatus.h index 1e73439e9..f31630e25 100644 --- a/lib/framework/NetworkStatus.h +++ b/lib/framework/NetworkStatus.h @@ -1,15 +1,11 @@ #ifndef NetworkStatus_h #define NetworkStatus_h -#include -#include - -#include - #include #include #include #include + #include #define MAX_NETWORK_STATUS_SIZE 1024 diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 68174ea61..ea1b198e0 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -59,21 +59,22 @@ class DummySettings { uint16_t publish_time_sensor = 10; uint16_t publish_time_heartbeat = 60; - String hostname = "ems-esp"; - String jwtSecret = "ems-esp"; - String ssid = "ems-esp"; - String password = "ems-esp"; - String bssid = ""; - String localIP = ""; - String gatewayIP = ""; - String subnetMask = ""; - bool staticIPConfig = false; - String dnsIP1 = ""; - String dnsIP2 = ""; - bool enableIPv6 = false; - bool enableMDNS = true; - bool enableCORS = false; - String CORSOrigin = "*"; + String hostname = "ems-esp"; + String jwtSecret = "ems-esp"; + String ssid = "ems-esp"; + String password = "ems-esp"; + String bssid = ""; + String localIP = ""; + String gatewayIP = ""; + String subnetMask = ""; + bool staticIPConfig = false; + String dnsIP1 = ""; + String dnsIP2 = ""; + bool enableIPv6 = false; + bool enableMDNS = true; + bool enableCORS = false; + String CORSOrigin = "*"; + uint8_t tx_power = 0; static void read(DummySettings & settings, JsonObject root){}; static void read(DummySettings & settings){}; diff --git a/mock-api/handler.ts b/mock-api/handler.ts index 692c55b5c..b3522e695 100644 --- a/mock-api/handler.ts +++ b/mock-api/handler.ts @@ -225,7 +225,7 @@ let network_settings = { password: 'myPassword', hostname: 'ems-esp', nosleep: true, - tx_power: 20, + tx_power: 0, bandwidth20: false, static_ip_config: false, enableMDNS: true, diff --git a/mock-api/server.js b/mock-api/server.js index ba672486f..72e93d791 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -155,7 +155,7 @@ network_settings = { password: 'myPassword', hostname: 'ems-esp', nosleep: true, - tx_power: 20, + tx_power: 0, bandwidth20: false, static_ip_config: false, enableMDNS: true, diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 1ad7a1832..9426f44f6 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1748,6 +1748,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { } } + // TODO remove CMD - see https://github.com/emsesp/EMS-ESP32/issues/1605 if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && (dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) { // create_device_config is only done once for the EMS device. It can added to any entity, so we take the first diff --git a/src/system.cpp b/src/system.cpp index a268aec16..cf5123b78 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1131,7 +1131,7 @@ bool System::check_upgrade(bool factory_settings) { // if we're coming from 3.4.4 or 3.5.0b14 which had no version stored then we need to apply new settings if (missing_version) { - LOG_DEBUG("Setting MQTT Entity ID format to v3.4 format"); + LOG_INFO("Setting MQTT Entity ID format to v3.4 format"); EMSESP::esp8266React.getMqttSettingsService()->update( [&](MqttSettings & mqttSettings) { mqttSettings.entity_format = 0; // use old Entity ID format from v3.4 @@ -1139,6 +1139,19 @@ bool System::check_upgrade(bool factory_settings) { }, "local"); } + + // Network Settings Wifi tx_power is now using the value * 4. + EMSESP::esp8266React.getNetworkSettingsService()->update( + [&](NetworkSettings & networkSettings) { + if (networkSettings.tx_power == 20) { + networkSettings.tx_power = 0; // use Auto + LOG_INFO("Setting WiFi TX Power to Auto"); + return StateUpdateResult::CHANGED; + } + return StateUpdateResult::UNCHANGED; + }, + "local"); + } else if (this_version < settings_version) { // need downgrade LOG_NOTICE("Downgrading to version %d.%d.%d-%s", this_version.major(), this_version.minor(), this_version.patch(), this_version.prerelease().c_str()); diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 08cd42b60..773d73927 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -23,95 +23,9 @@ using namespace std::placeholders; // for `_1` etc namespace emsesp { WebStatusService::WebStatusService(AsyncWebServer * server, SecurityManager * securityManager) { - // rest endpoint for web page server->on(EMSESP_STATUS_SERVICE_PATH, HTTP_GET, securityManager->wrapRequest(std::bind(&WebStatusService::webStatusService, this, _1), AuthenticationPredicates::IS_AUTHENTICATED)); - WiFi.onEvent(std::bind(&WebStatusService::WiFiEvent, this, _1, _2)); -} - -// handles both WiFI and Ethernet -void WebStatusService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { -#ifndef EMSESP_STANDALONE - - switch (event) { - case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - EMSESP::logger().warning("WiFi disconnected. Reason: %s (%d)", - disconnectReason(info.wifi_sta_disconnected.reason), - info.wifi_sta_disconnected.reason); // IDF 4.0 - EMSESP::system_.has_ipv6(false); - break; - - case ARDUINO_EVENT_WIFI_STA_GOT_IP: - EMSESP::logger().info("WiFi connected with IP=%s, hostname=%s", WiFi.localIP().toString().c_str(), WiFi.getHostname()); - mDNS_start(); - break; - - case ARDUINO_EVENT_ETH_START: - // EMSESP::logger().info("Ethernet initialized"); - ETH.setHostname(EMSESP::system_.hostname().c_str()); - - // configure for static IP - EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { - if (networkSettings.staticIPConfig) { - ETH.config(networkSettings.localIP, networkSettings.gatewayIP, networkSettings.subnetMask, networkSettings.dnsIP1, networkSettings.dnsIP2); - } - }); - - break; - - case ARDUINO_EVENT_ETH_GOT_IP: - // prevent double calls - if (!EMSESP::system_.ethernet_connected()) { - EMSESP::logger().info("Ethernet connected with IP=%s, speed %d Mbps", ETH.localIP().toString().c_str(), ETH.linkSpeed()); - EMSESP::system_.ethernet_connected(true); - mDNS_start(); - } - break; - - case ARDUINO_EVENT_ETH_DISCONNECTED: - EMSESP::logger().warning("Ethernet disconnected"); - EMSESP::system_.ethernet_connected(false); - EMSESP::system_.has_ipv6(false); - break; - - case ARDUINO_EVENT_ETH_STOP: - EMSESP::logger().info("Ethernet stopped"); - EMSESP::system_.ethernet_connected(false); - EMSESP::system_.has_ipv6(false); - break; - - case ARDUINO_EVENT_WIFI_STA_CONNECTED: - EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { - if (networkSettings.enableIPv6) { - WiFi.enableIpV6(); - } - }); - break; - - case ARDUINO_EVENT_ETH_CONNECTED: - EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { - if (networkSettings.enableIPv6) { - ETH.enableIpV6(); - } - }); - break; - - case ARDUINO_EVENT_WIFI_STA_GOT_IP6: - case ARDUINO_EVENT_ETH_GOT_IP6: - if (EMSESP::system_.ethernet_connected()) { - EMSESP::logger().info("Ethernet connected with IPv6=%s, speed %d Mbps", ETH.localIPv6().toString().c_str(), ETH.linkSpeed()); - } else { - EMSESP::logger().info("WiFi connected with IPv6=%s, hostname=%s", WiFi.localIPv6().toString().c_str(), WiFi.getHostname()); - } - mDNS_start(); - EMSESP::system_.has_ipv6(true); - break; - - default: - break; - } -#endif } void WebStatusService::webStatusService(AsyncWebServerRequest * request) { @@ -193,112 +107,4 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) { request->send(response); } -// start the multicast UDP service so EMS-ESP is discoverable via .local -void WebStatusService::mDNS_start() const { -#ifndef EMSESP_STANDALONE - MDNS.end(); - EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { - if (networkSettings.enableMDNS) { - if (!MDNS.begin(EMSESP::system_.hostname().c_str())) { - EMSESP::logger().warning("Failed to start mDNS responder service"); - return; - } - - std::string address_s = EMSESP::system_.hostname() + ".local"; - - MDNS.addService("http", "tcp", 80); // add our web server and rest API - MDNS.addService("telnet", "tcp", 23); // add our telnet console - - MDNS.addServiceTxt("http", "tcp", "version", EMSESP_APP_VERSION); - MDNS.addServiceTxt("http", "tcp", "address", address_s.c_str()); - - EMSESP::logger().info("mDNS responder service started"); - } - }); -#else - EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & networkSettings) { - if (networkSettings.enableMDNS) { - EMSESP::logger().info("mDNS responder service started"); - } - }); -#endif -} - -const char * WebStatusService::disconnectReason(uint8_t code) { -#ifndef EMSESP_STANDALONE - switch (code) { - case WIFI_REASON_UNSPECIFIED: // = 1, - return "unspecified"; - case WIFI_REASON_AUTH_EXPIRE: // = 2, - return "auth expire"; - case WIFI_REASON_AUTH_LEAVE: // = 3, - return "auth leave"; - case WIFI_REASON_ASSOC_EXPIRE: // = 4, - return "assoc expired"; - case WIFI_REASON_ASSOC_TOOMANY: // = 5, - return "assoc too many"; - case WIFI_REASON_NOT_AUTHED: // = 6, - return "not authenticated"; - case WIFI_REASON_NOT_ASSOCED: // = 7, - return "not assoc"; - case WIFI_REASON_ASSOC_LEAVE: // = 8, - return "assoc leave"; - case WIFI_REASON_ASSOC_NOT_AUTHED: // = 9, - return "assoc not authed"; - case WIFI_REASON_DISASSOC_PWRCAP_BAD: // = 10, - return "disassoc powerCAP bad"; - case WIFI_REASON_DISASSOC_SUPCHAN_BAD: // = 11, - return "disassoc supchan bad"; - case WIFI_REASON_IE_INVALID: // = 13, - return "IE invalid"; - case WIFI_REASON_MIC_FAILURE: // = 14, - return "MIC failure"; - case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: // = 15, - return "4way handshake timeout"; - case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT: // = 16, - return "group key-update timeout"; - case WIFI_REASON_IE_IN_4WAY_DIFFERS: // = 17, - return "IE in 4way differs"; - case WIFI_REASON_GROUP_CIPHER_INVALID: // = 18, - return "group cipher invalid"; - case WIFI_REASON_PAIRWISE_CIPHER_INVALID: // = 19, - return "pairwise cipher invalid"; - case WIFI_REASON_AKMP_INVALID: // = 20, - return "AKMP invalid"; - case WIFI_REASON_UNSUPP_RSN_IE_VERSION: // = 21, - return "unsupported RSN_IE version"; - case WIFI_REASON_INVALID_RSN_IE_CAP: // = 22, - return "invalid RSN_IE_CAP"; - case WIFI_REASON_802_1X_AUTH_FAILED: // = 23, - return "802 X1 auth failed"; - case WIFI_REASON_CIPHER_SUITE_REJECTED: // = 24, - return "cipher suite rejected"; - case WIFI_REASON_BEACON_TIMEOUT: // = 200, - return "beacon timeout"; - case WIFI_REASON_NO_AP_FOUND: // = 201, - return "no AP found"; - case WIFI_REASON_AUTH_FAIL: // = 202, - return "auth fail"; - case WIFI_REASON_ASSOC_FAIL: // = 203, - return "assoc fail"; - case WIFI_REASON_HANDSHAKE_TIMEOUT: // = 204, - return "handshake timeout"; - case WIFI_REASON_CONNECTION_FAIL: // 205, - return "connection fail"; - case WIFI_REASON_AP_TSF_RESET: // 206, - return "AP tsf reset"; - case WIFI_REASON_ROAMING: // 207, - return "roaming"; - case WIFI_REASON_ASSOC_COMEBACK_TIME_TOO_LONG: // 208, - return "assoc comeback time too long"; - case WIFI_REASON_SA_QUERY_TIMEOUT: // 209, - return "sa query timeout"; - default: - return "unknown"; - } -#endif - - return ""; -} - } // namespace emsesp \ No newline at end of file diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index 48551aac0..97109b82b 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -19,8 +19,6 @@ #ifndef WebStatusService_h #define WebStatusService_h -#include - #define EMSESP_STATUS_SERVICE_PATH "/rest/status" namespace emsesp { @@ -30,10 +28,7 @@ class WebStatusService { WebStatusService(AsyncWebServer * server, SecurityManager * securityManager); private: - void webStatusService(AsyncWebServerRequest * request); - void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); - void mDNS_start() const; - const char * disconnectReason(uint8_t code); + void webStatusService(AsyncWebServerRequest * request); }; } // namespace emsesp diff --git a/test/standalone_file_export/emsesp_settings.json b/test/standalone_file_export/emsesp_settings.json index 43eaecc5d..1ea7eef3c 100644 --- a/test/standalone_file_export/emsesp_settings.json +++ b/test/standalone_file_export/emsesp_settings.json @@ -11,7 +11,7 @@ "static_ip_config": false, "enableIPv6": false, "bandwidth20": false, - "tx_power": 20, + "tx_power": 0, "nosleep": false, "enableMDNS": true, "enableCORS": false,