mirror of https://github.com/arendst/Tasmota.git
Add command ``WifiPower 0``
Add command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443)
This commit is contained in:
parent
f40a63b5be
commit
0385204ca7
16
CHANGELOG.md
16
CHANGELOG.md
|
@ -3,7 +3,19 @@ All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## [Unreleased] - Development
|
## [Unreleased] - Development
|
||||||
|
|
||||||
## [12.5.0.2]
|
## [12.5.0.3]
|
||||||
|
### Added
|
||||||
|
- Command ``WifiPower 0`` to enable dynamic wifi power based on RSSI by @TD-er (#15443)
|
||||||
|
|
||||||
|
### Breaking Changed
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
## [12.5.0.2] 20230516
|
||||||
### Added
|
### Added
|
||||||
- Matter support for Shutters with Tilt
|
- Matter support for Shutters with Tilt
|
||||||
- Matter POC for remote Relay
|
- Matter POC for remote Relay
|
||||||
|
@ -31,8 +43,6 @@ All notable changes to this project will be documented in this file.
|
||||||
- Berry fixed a rare condition when a GC causes a memory corruption
|
- Berry fixed a rare condition when a GC causes a memory corruption
|
||||||
- LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 (#18666)
|
- LED PWM ac_dimmer curve was wrongly applied instead of Gamma regression from v12.2.0.5 (#18666)
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
## [12.5.0.1] 20230505
|
## [12.5.0.1] 20230505
|
||||||
### Added
|
### Added
|
||||||
- Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441)
|
- Matter sensors Humidity, Pressure, Illuminance; optimize memory (#18441)
|
||||||
|
|
|
@ -110,11 +110,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
|
||||||
|
|
||||||
[Complete list](BUILDS.md) of available feature and sensors.
|
[Complete list](BUILDS.md) of available feature and sensors.
|
||||||
|
|
||||||
## Changelog v12.5.0.2
|
## Changelog v12.5.0.3
|
||||||
### Added
|
### Added
|
||||||
- Command ``SetOption152 0/1`` to select two (0 = default) pin bistable or one (1) pin
|
- 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)
|
||||||
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)
|
||||||
- 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)
|
||||||
|
|
|
@ -20,6 +20,6 @@
|
||||||
#ifndef _TASMOTA_VERSION_H_
|
#ifndef _TASMOTA_VERSION_H_
|
||||||
#define _TASMOTA_VERSION_H_
|
#define _TASMOTA_VERSION_H_
|
||||||
|
|
||||||
const uint32_t VERSION = 0x0C050002; // 12.5.0.2
|
const uint32_t VERSION = 0x0C050003; // 12.5.0.3
|
||||||
|
|
||||||
#endif // _TASMOTA_VERSION_H_
|
#endif // _TASMOTA_VERSION_H_
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
const uint32_t VERSION_MARKER[] PROGMEM = { 0x5AA55AA5, 0xFFFFFFFF, 0xA55AA55A };
|
const uint32_t VERSION_MARKER[] PROGMEM = { 0x5AA55AA5, 0xFFFFFFFF, 0xA55AA55A };
|
||||||
|
|
||||||
struct WIFI {
|
struct WIFI {
|
||||||
|
int last_tx_pwr;
|
||||||
uint32_t last_event = 0; // Last wifi connection event
|
uint32_t last_event = 0; // Last wifi connection event
|
||||||
uint32_t downtime = 0; // Wifi down duration
|
uint32_t downtime = 0; // Wifi down duration
|
||||||
uint16_t link_count = 0; // Number of wifi re-connect
|
uint16_t link_count = 0; // Number of wifi re-connect
|
||||||
|
|
|
@ -2523,8 +2523,7 @@ 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 (Settings->wifi_output_power > 205) {
|
||||||
|
@ -2532,7 +2531,11 @@ void CmndWifiPower(void)
|
||||||
}
|
}
|
||||||
WifiSetOutputPower();
|
WifiSetOutputPower();
|
||||||
}
|
}
|
||||||
ResponseCmndChar(WifiGetOutputPower().c_str());
|
if (Settings->wifi_output_power) {
|
||||||
|
ResponseCmndChar(WifiGetOutputPower().c_str());
|
||||||
|
} else {
|
||||||
|
ResponseCmndNumber(Wifi.last_tx_pwr / 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmndWifi(void)
|
void CmndWifi(void)
|
||||||
|
|
|
@ -1241,6 +1241,10 @@ void Every100mSeconds(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (0 == Settings->wifi_output_power) {
|
||||||
|
WiFiSetTXpowerBasedOnRssi();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------------------------*\
|
/*-------------------------------------------------------------------------------------------*\
|
||||||
|
|
|
@ -966,9 +966,114 @@ String WifiGetOutputPower(void)
|
||||||
return String(stemp1);
|
return String(stemp1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WifiSetOutputPower(void)
|
void WifiSetOutputPower(void) {
|
||||||
{
|
if (Settings->wifi_output_power) {
|
||||||
WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10);
|
WiFi.setOutputPower((float)(Settings->wifi_output_power) / 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Dynamic WiFi transmit power based on RSSI lowering overall DC power usage
|
||||||
|
|
||||||
|
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) {
|
||||||
|
const WiFiMode_t cur_mode = WiFi.getMode();
|
||||||
|
if (cur_mode == WIFI_OFF) { return; }
|
||||||
|
|
||||||
|
// Range ESP32 : 2dBm - 20dBm
|
||||||
|
// Range ESP8266: 0dBm - 20.5dBm
|
||||||
|
// int maxTXpwr = Settings->wifi_output_power;
|
||||||
|
int maxTXpwr = 210;
|
||||||
|
int threshold = WIFI_SENSITIVITY_n;
|
||||||
|
int phy_mode = WiFi.getPhyMode();
|
||||||
|
switch (phy_mode) {
|
||||||
|
case 1: // 11b (WIFI_PHY_MODE_11B)
|
||||||
|
threshold = WIFI_SENSITIVITY_11b;
|
||||||
|
if (maxTXpwr > MAX_TX_PWR_DBM_11b) maxTXpwr = MAX_TX_PWR_DBM_11b;
|
||||||
|
break;
|
||||||
|
case 2: // 11bg (WIFI_PHY_MODE_11G)
|
||||||
|
threshold = WIFI_SENSITIVITY_54g;
|
||||||
|
if (maxTXpwr > MAX_TX_PWR_DBM_54g) maxTXpwr = MAX_TX_PWR_DBM_54g;
|
||||||
|
break;
|
||||||
|
case 3: // 11bgn (WIFI_PHY_MODE_11N)
|
||||||
|
threshold = WIFI_SENSITIVITY_n;
|
||||||
|
if (maxTXpwr > MAX_TX_PWR_DBM_n) maxTXpwr = MAX_TX_PWR_DBM_n;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
threshold += 30; // Margin in dBm * 10 on top of threshold
|
||||||
|
int minTXpwr = 0;
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
if (newrssi < threshold) {
|
||||||
|
minTXpwr = threshold - newrssi;
|
||||||
|
}
|
||||||
|
if (minTXpwr > maxTXpwr) {
|
||||||
|
minTXpwr = maxTXpwr;
|
||||||
|
}
|
||||||
|
int dBm = 0;
|
||||||
|
if (dBm > maxTXpwr) {
|
||||||
|
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;
|
||||||
|
int maxTXpwr_int = maxTXpwr * 4;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue