mirror of https://github.com/arendst/Tasmota.git
Optimize dynamic WiFi power
This commit is contained in:
parent
4e5c62ce33
commit
57f85ae478
|
@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
|
||||||
## [12.5.0.3]
|
## [12.5.0.3]
|
||||||
### Added
|
### Added
|
||||||
- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443)
|
- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443)
|
||||||
|
- Command ``WifiPower 1`` to restore default wifi power
|
||||||
|
|
||||||
### Breaking Changed
|
### Breaking Changed
|
||||||
|
|
||||||
|
|
|
@ -115,6 +115,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
|
||||||
- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386)
|
- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin latching relay control [#18386](https://github.com/arendst/Tasmota/issues/18386)
|
||||||
- Command ``I2cScan0`` to scan both busses on ESP32 with one command
|
- Command ``I2cScan0`` to scan both busses on ESP32 with one command
|
||||||
- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er [#15443](https://github.com/arendst/Tasmota/issues/15443)
|
- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er [#15443](https://github.com/arendst/Tasmota/issues/15443)
|
||||||
|
- Command ``WifiPower 1`` to restore default wifi power
|
||||||
- Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042)
|
- Support for TC74 temperature sensor by Michael Loftis [#18042](https://github.com/arendst/Tasmota/issues/18042)
|
||||||
- Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399)
|
- Support for GM861 1D and 2D bar code reader [#18399](https://github.com/arendst/Tasmota/issues/18399)
|
||||||
- Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632)
|
- Support for PCA9557 8-bit I/O expander [#18632](https://github.com/arendst/Tasmota/issues/18632)
|
||||||
|
|
|
@ -300,6 +300,46 @@ const uint32_t LOOP_SLEEP_DELAY = 50; // Lowest number of milliseconds to
|
||||||
#define XPT2046_MINY 346
|
#define XPT2046_MINY 346
|
||||||
#define XPT2046_MAXY 3870
|
#define XPT2046_MAXY 3870
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
#if defined(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 defined(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 defined(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
|
||||||
|
#endif
|
||||||
|
#ifdef ESP8266
|
||||||
|
#define MAX_TX_PWR_DBM_11b 200
|
||||||
|
#define MAX_TX_PWR_DBM_54g 170
|
||||||
|
#define MAX_TX_PWR_DBM_n 140
|
||||||
|
#define WIFI_SENSITIVITY_11b -910
|
||||||
|
#define WIFI_SENSITIVITY_54g -750
|
||||||
|
#define WIFI_SENSITIVITY_n -720
|
||||||
|
#endif
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Enumeration
|
* Enumeration
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
|
@ -929,7 +929,7 @@ void SettingsDefaultSet2(void) {
|
||||||
flag4.network_wifi |= 1;
|
flag4.network_wifi |= 1;
|
||||||
flag3.use_wifi_scan |= WIFI_SCAN_AT_RESTART;
|
flag3.use_wifi_scan |= WIFI_SCAN_AT_RESTART;
|
||||||
flag3.use_wifi_rescan |= WIFI_SCAN_REGULARLY;
|
flag3.use_wifi_rescan |= WIFI_SCAN_REGULARLY;
|
||||||
Settings->wifi_output_power = 170;
|
Settings->wifi_output_power = MAX_TX_PWR_DBM_54g;
|
||||||
Settings->dns_timeout = DNS_TIMEOUT;
|
Settings->dns_timeout = DNS_TIMEOUT;
|
||||||
Settings->param[P_ARP_GRATUITOUS] = WIFI_ARP_INTERVAL;
|
Settings->param[P_ARP_GRATUITOUS] = WIFI_ARP_INTERVAL;
|
||||||
ParseIPv4(&Settings->ipv4_address[0], PSTR(WIFI_IP_ADDRESS));
|
ParseIPv4(&Settings->ipv4_address[0], PSTR(WIFI_IP_ADDRESS));
|
||||||
|
|
|
@ -2526,16 +2526,16 @@ void CmndLedPwmMode(void) {
|
||||||
void CmndWifiPower(void) {
|
void CmndWifiPower(void) {
|
||||||
if (XdrvMailbox.data_len > 0) {
|
if (XdrvMailbox.data_len > 0) {
|
||||||
Settings->wifi_output_power = (uint8_t)(CharToFloat(XdrvMailbox.data) * 10);
|
Settings->wifi_output_power = (uint8_t)(CharToFloat(XdrvMailbox.data) * 10);
|
||||||
if (Settings->wifi_output_power > 205) {
|
if (10 == Settings->wifi_output_power) {
|
||||||
Settings->wifi_output_power = 205;
|
// WifiPower 1
|
||||||
|
Settings->wifi_output_power = MAX_TX_PWR_DBM_54g;
|
||||||
|
}
|
||||||
|
else if (Settings->wifi_output_power > MAX_TX_PWR_DBM_11b) {
|
||||||
|
Settings->wifi_output_power = MAX_TX_PWR_DBM_11b;
|
||||||
}
|
}
|
||||||
WifiSetOutputPower();
|
WifiSetOutputPower();
|
||||||
}
|
}
|
||||||
if (Settings->wifi_output_power) {
|
ResponseCmndChar(WifiGetOutputPower().c_str());
|
||||||
ResponseCmndChar(WifiGetOutputPower().c_str());
|
|
||||||
} else {
|
|
||||||
ResponseCmndNumber(Wifi.last_tx_pwr / 10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmndWifi(void)
|
void CmndWifi(void)
|
||||||
|
|
|
@ -959,10 +959,13 @@ int WifiState(void)
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
String WifiGetOutputPower(void)
|
String WifiGetOutputPower(void) {
|
||||||
{
|
|
||||||
char stemp1[TOPSZ];
|
char stemp1[TOPSZ];
|
||||||
dtostrfd((float)(Settings->wifi_output_power) / 10, 1, stemp1);
|
if (Settings->wifi_output_power) {
|
||||||
|
dtostrfd((float)(Settings->wifi_output_power) / 10, 1, stemp1);
|
||||||
|
} else {
|
||||||
|
dtostrfd((float)(Wifi.last_tx_pwr) / 10, 0, stemp1); // No decimal to indicate dynamic tx power
|
||||||
|
}
|
||||||
return String(stemp1);
|
return String(stemp1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -973,76 +976,33 @@ void WifiSetOutputPower(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Dynamic WiFi transmit power based on RSSI lowering overall DC power usage
|
Dynamic WiFi transmit power based on RSSI lowering overall DC power usage.
|
||||||
|
|
||||||
Original idea by ESPEasy (@TD-er)
|
Original idea by ESPEasy (@TD-er)
|
||||||
*/
|
*/
|
||||||
#ifdef ESP32
|
|
||||||
#if defined(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 defined(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 defined(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
|
|
||||||
#endif
|
|
||||||
#ifdef ESP8266
|
|
||||||
#define MAX_TX_PWR_DBM_11b 200
|
|
||||||
#define MAX_TX_PWR_DBM_54g 170
|
|
||||||
#define MAX_TX_PWR_DBM_n 140
|
|
||||||
#define WIFI_SENSITIVITY_11b -910
|
|
||||||
#define WIFI_SENSITIVITY_54g -750
|
|
||||||
#define WIFI_SENSITIVITY_n -720
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void WiFiSetTXpowerBasedOnRssi(void) {
|
void WiFiSetTXpowerBasedOnRssi(void) {
|
||||||
const WiFiMode_t cur_mode = WiFi.getMode();
|
const WiFiMode_t cur_mode = WiFi.getMode();
|
||||||
if (cur_mode == WIFI_OFF) { return; }
|
if (cur_mode == WIFI_OFF) { return; }
|
||||||
|
|
||||||
// Range ESP32 : 2dBm - 20dBm
|
// Range ESP32 : 2dBm - 20dBm
|
||||||
// Range ESP8266: 0dBm - 20.5dBm
|
// Range ESP8266: 0dBm - 20.5dBm
|
||||||
// int maxTXpwr = Settings->wifi_output_power;
|
int max_tx_pwr = MAX_TX_PWR_DBM_11b;
|
||||||
int maxTXpwr = 210;
|
|
||||||
int threshold = WIFI_SENSITIVITY_n;
|
int threshold = WIFI_SENSITIVITY_n;
|
||||||
int phy_mode = WiFi.getPhyMode();
|
int phy_mode = WiFi.getPhyMode();
|
||||||
switch (phy_mode) {
|
switch (phy_mode) {
|
||||||
case 1: // 11b (WIFI_PHY_MODE_11B)
|
case 1: // 11b (WIFI_PHY_MODE_11B)
|
||||||
threshold = WIFI_SENSITIVITY_11b;
|
threshold = WIFI_SENSITIVITY_11b;
|
||||||
if (maxTXpwr > MAX_TX_PWR_DBM_11b) maxTXpwr = MAX_TX_PWR_DBM_11b;
|
if (max_tx_pwr > MAX_TX_PWR_DBM_11b) max_tx_pwr = MAX_TX_PWR_DBM_11b;
|
||||||
break;
|
break;
|
||||||
case 2: // 11bg (WIFI_PHY_MODE_11G)
|
case 2: // 11bg (WIFI_PHY_MODE_11G)
|
||||||
threshold = WIFI_SENSITIVITY_54g;
|
threshold = WIFI_SENSITIVITY_54g;
|
||||||
if (maxTXpwr > MAX_TX_PWR_DBM_54g) maxTXpwr = MAX_TX_PWR_DBM_54g;
|
if (max_tx_pwr > MAX_TX_PWR_DBM_54g) max_tx_pwr = MAX_TX_PWR_DBM_54g;
|
||||||
break;
|
break;
|
||||||
case 3: // 11bgn (WIFI_PHY_MODE_11N)
|
case 3: // 11bgn (WIFI_PHY_MODE_11N)
|
||||||
threshold = WIFI_SENSITIVITY_n;
|
threshold = WIFI_SENSITIVITY_n;
|
||||||
if (maxTXpwr > MAX_TX_PWR_DBM_n) maxTXpwr = MAX_TX_PWR_DBM_n;
|
if (max_tx_pwr > MAX_TX_PWR_DBM_n) max_tx_pwr = MAX_TX_PWR_DBM_n;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
threshold += 30; // Margin in dBm * 10 on top of threshold
|
threshold += 30; // Margin in dBm * 10 on top of threshold
|
||||||
int minTXpwr = 0;
|
|
||||||
|
|
||||||
// Assume AP sends with max set by ETSI standard.
|
// Assume AP sends with max set by ETSI standard.
|
||||||
// 2.4 GHz: 100 mWatt (20 dBm)
|
// 2.4 GHz: 100 mWatt (20 dBm)
|
||||||
|
@ -1050,30 +1010,21 @@ void WiFiSetTXpowerBasedOnRssi(void) {
|
||||||
int rssi = WiFi.RSSI() * 10;
|
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 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) {
|
if (newrssi < threshold) {
|
||||||
minTXpwr = threshold - newrssi;
|
min_tx_pwr = threshold - newrssi;
|
||||||
}
|
}
|
||||||
if (minTXpwr > maxTXpwr) {
|
if (min_tx_pwr > max_tx_pwr) {
|
||||||
minTXpwr = maxTXpwr;
|
min_tx_pwr = max_tx_pwr;
|
||||||
}
|
}
|
||||||
int dBm = 0;
|
WiFi.setOutputPower((float)min_tx_pwr / 10);
|
||||||
if (dBm > maxTXpwr) {
|
delay(Wifi.last_tx_pwr < min_tx_pwr); // If increase the TX power, give power supply of the unit some rest
|
||||||
dBm = maxTXpwr;
|
|
||||||
} else if (dBm < minTXpwr) {
|
|
||||||
dBm = minTXpwr;
|
|
||||||
}
|
|
||||||
WiFi.setOutputPower((float)dBm / 10);
|
|
||||||
|
|
||||||
delay(Wifi.last_tx_pwr < dBm); // If increase the TX power, give power supply of the unit some rest
|
|
||||||
Wifi.last_tx_pwr = dBm;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int TX_pwr_int = Wifi.last_tx_pwr * 4;
|
if (Wifi.last_tx_pwr != min_tx_pwr) {
|
||||||
int maxTXpwr_int = maxTXpwr * 4;
|
AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), min_tx_pwr / 10, threshold/ 10, rssi / 10);
|
||||||
if (TX_pwr_int != maxTXpwr_int) {
|
|
||||||
AddLog(LOG_LEVEL_DEBUG, PSTR("WIF: TX power %d, Sensitivity %d, RSSI %d"), dBm / 10, threshold/ 10, rssi / 10);
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
Wifi.last_tx_pwr = min_tx_pwr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue