Add command ``SetSensor1..127 0|1`` to globally disable individual sensor driver

This commit is contained in:
Theo Arends 2021-07-14 14:20:50 +02:00
parent 0851549b10
commit 6cd9a7d899
10 changed files with 50 additions and 56 deletions

View File

@ -3,7 +3,11 @@ All notable changes to this project will be documented in this file.
## [Unreleased] - Development ## [Unreleased] - Development
## [9.5.0.2] ## [9.5.0.3]
### Added
- Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver
## [9.5.0.2] 20210714
### Added ### Added
- Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW (#11939) - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW (#11939)
- MQTT minimum password length restriction in GUI (#12553) - MQTT minimum password length restriction in GUI (#12553)

View File

@ -98,10 +98,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
[Complete list](BUILDS.md) of available feature and sensors. [Complete list](BUILDS.md) of available feature and sensors.
## Changelog v9.5.0.2 ## Changelog v9.5.0.3
### Added ### Added
- Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota/) - Release of [Tasmota WebInstaller](https://arendst.github.io/Tasmota/)
- Command ``SetOption127 1`` to force Wifi in no-sleep mode even if ``Sleep 0`` is not enabled - Command ``SetOption127 1`` to force Wifi in no-sleep mode even if ``Sleep 0`` is not enabled
- Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver
- Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939) - Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939)
- Berry ESP32 partition manager [#12465](https://github.com/arendst/Tasmota/issues/12465) - Berry ESP32 partition manager [#12465](https://github.com/arendst/Tasmota/issues/12465)
- Support for AM2320 Temperature and Humidity Sensor by Lars Wessels [#12485](https://github.com/arendst/Tasmota/issues/12485) - Support for AM2320 Temperature and Humidity Sensor by Lars Wessels [#12485](https://github.com/arendst/Tasmota/issues/12485)

View File

@ -257,6 +257,7 @@
#define D_CMND_PULSETIME "PulseTime" #define D_CMND_PULSETIME "PulseTime"
#define D_CMND_BLINKTIME "BlinkTime" #define D_CMND_BLINKTIME "BlinkTime"
#define D_CMND_BLINKCOUNT "BlinkCount" #define D_CMND_BLINKCOUNT "BlinkCount"
#define D_CMND_SETSENSOR "SetSensor"
#define D_CMND_SENSOR "Sensor" #define D_CMND_SENSOR "Sensor"
#define D_CMND_DRIVER "Driver" #define D_CMND_DRIVER "Driver"
#define D_CMND_SAVEDATA "SaveData" #define D_CMND_SAVEDATA "SaveData"

View File

@ -643,12 +643,7 @@ typedef struct {
uint16_t sbaudrate; // 77A uint16_t sbaudrate; // 77A
EnergyUsage energy_usage; // 77C EnergyUsage energy_usage; // 77C
uint32_t ex_adc_param1; // 794 Free since 9.0.0.1 uint32_t sensors[2][4]; // 794 Disable individual (0) sensor drivers / (1) GUI sensor output
uint32_t ex_adc_param2; // 798 Free since 9.0.0.1
int ex_adc_param3; // 79C Free since 9.0.0.1
uint32_t monitors; // 7A0
uint32_t sensors[4]; // 7A4 Normal WebSensor, Debug SetSensor
uint32_t energy_kWhtotal_time; // 7B4 uint32_t energy_kWhtotal_time; // 7B4
unsigned long weight_item; // 7B8 Weight of one item in gram * 10 unsigned long weight_item; // 7B8 Weight of one item in gram * 10
uint16_t ledmask; // 7BC uint16_t ledmask; // 7BC

View File

@ -1122,7 +1122,7 @@ void SettingsDefaultSet2(void) {
SettingsDefaultWebColor(); SettingsDefaultWebColor();
memset(&Settings->monitors, 0xFF, 20); // Enable all possible monitors, displays and sensors memset(&Settings->sensors, 0xFF, 32); // Enable all possible sensors
SettingsEnableAllI2cDrivers(); SettingsEnableAllI2cDrivers();
// Tuya // Tuya
@ -1361,7 +1361,6 @@ void SettingsDelta(void) {
if (Settings->version < 0x09040006) { if (Settings->version < 0x09040006) {
Settings->mqtt_wifi_timeout = MQTT_WIFI_CLIENT_TIMEOUT / 100; Settings->mqtt_wifi_timeout = MQTT_WIFI_CLIENT_TIMEOUT / 100;
} }
#ifdef CONFIG_IDF_TARGET_ESP32C3 #ifdef CONFIG_IDF_TARGET_ESP32C3
if (Settings->version < 0x09050002) { if (Settings->version < 0x09050002) {
if (Settings->cfg_size != sizeof(TSettings)) { if (Settings->cfg_size != sizeof(TSettings)) {
@ -1374,6 +1373,9 @@ void SettingsDelta(void) {
} }
} }
#endif #endif
if (Settings->version < 0x09050003) {
memset(&Settings->sensors, 0xFF, 16); // Enable all possible sensors
}
Settings->version = VERSION; Settings->version = VERSION;
SettingsSave(1); SettingsSave(1);

View File

@ -42,7 +42,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix
#endif // USE_DEVICE_GROUPS_SEND #endif // USE_DEVICE_GROUPS_SEND
D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|" D_CMND_DEVGROUP_TIE "|" D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|" D_CMND_DEVGROUP_TIE "|"
#endif // USE_DEVICE_GROUPS #endif // USE_DEVICE_GROUPS
D_CMND_SENSOR "|" D_CMND_DRIVER D_CMND_SETSENSOR "|" D_CMND_SENSOR "|" D_CMND_DRIVER
#ifdef ESP32 #ifdef ESP32
"|Info|" D_CMND_TOUCH_CAL "|" D_CMND_TOUCH_THRES "|" D_CMND_TOUCH_NUM "|" D_CMND_CPU_FREQUENCY "|Info|" D_CMND_TOUCH_CAL "|" D_CMND_TOUCH_THRES "|" D_CMND_TOUCH_NUM "|" D_CMND_CPU_FREQUENCY
#endif // ESP32 #endif // ESP32
@ -74,7 +74,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = {
#endif // USE_DEVICE_GROUPS_SEND #endif // USE_DEVICE_GROUPS_SEND
&CmndDevGroupShare, &CmndDevGroupStatus, &CmndDevGroupTie, &CmndDevGroupShare, &CmndDevGroupStatus, &CmndDevGroupTie,
#endif // USE_DEVICE_GROUPS #endif // USE_DEVICE_GROUPS
&CmndSensor, &CmndDriver &CmndSetSensor, &CmndSensor, &CmndDriver
#ifdef ESP32 #ifdef ESP32
, &CmndInfo, &CmndTouchCal, &CmndTouchThres, &CmndTouchNum, &CmndCpuFrequency , &CmndInfo, &CmndTouchCal, &CmndTouchThres, &CmndTouchNum, &CmndCpuFrequency
#endif // ESP32 #endif // ESP32
@ -560,7 +560,7 @@ void CmndStatus(void)
ResponseAppendFeatures(); ResponseAppendFeatures();
XsnsDriverState(); XsnsDriverState();
ResponseAppend_P(PSTR(",\"Sensors\":")); ResponseAppend_P(PSTR(",\"Sensors\":"));
XsnsSensorState(); XsnsSensorState(0);
ResponseJsonEndEnd(); ResponseJsonEndEnd();
CmndStatusResponse(4); CmndStatusResponse(4);
} }
@ -2266,6 +2266,21 @@ void CmndDevGroupTie(void)
} }
#endif // USE_DEVICE_GROUPS #endif // USE_DEVICE_GROUPS
void CmndSetSensor(void)
{
if (XdrvMailbox.index < MAX_XSNS_DRIVERS) {
if (XdrvMailbox.payload >= 0) {
bitWrite(Settings->sensors[0][XdrvMailbox.index / 32], XdrvMailbox.index % 32, XdrvMailbox.payload &1);
if (1 == XdrvMailbox.payload) {
TasmotaGlobal.restart_flag = 2; // To safely re-enable a sensor currently most sensor need to follow complete restart init cycle
}
}
Response_P(PSTR("{\"" D_CMND_SETSENSOR "\":"));
XsnsSensorState(0);
ResponseJsonEnd();
}
}
void CmndSensor(void) void CmndSensor(void)
{ {
XsnsCall(FUNC_COMMAND_SENSOR); XsnsCall(FUNC_COMMAND_SENSOR);

View File

@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_ #ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_
const uint32_t VERSION = 0x09050002; const uint32_t VERSION = 0x09050003;
#endif // _TASMOTA_VERSION_H_ #endif // _TASMOTA_VERSION_H_

View File

@ -3235,11 +3235,11 @@ void CmndWebSensor(void)
{ {
if (XdrvMailbox.index < MAX_XSNS_DRIVERS) { if (XdrvMailbox.index < MAX_XSNS_DRIVERS) {
if (XdrvMailbox.payload >= 0) { if (XdrvMailbox.payload >= 0) {
bitWrite(Settings->sensors[XdrvMailbox.index / 32], XdrvMailbox.index % 32, XdrvMailbox.payload &1); bitWrite(Settings->sensors[1][XdrvMailbox.index / 32], XdrvMailbox.index % 32, XdrvMailbox.payload &1);
} }
} }
Response_P(PSTR("{\"" D_CMND_WEBSENSOR "\":")); Response_P(PSTR("{\"" D_CMND_WEBSENSOR "\":"));
XsnsSensorState(); XsnsSensorState(1);
ResponseJsonEnd(); ResponseJsonEnd();
} }

View File

@ -53,7 +53,6 @@
#define D_CMND_FREEMEM "FreeMem" #define D_CMND_FREEMEM "FreeMem"
#define D_CMND_HELP "Help" #define D_CMND_HELP "Help"
#define D_CMND_RTCDUMP "RtcDump" #define D_CMND_RTCDUMP "RtcDump"
#define D_CMND_SETSENSOR "SetSensor"
#define D_CMND_I2CWRITE "I2CWrite" #define D_CMND_I2CWRITE "I2CWrite"
#define D_CMND_I2CREAD "I2CRead" #define D_CMND_I2CREAD "I2CRead"
#define D_CMND_I2CSTRETCH "I2CStretch" #define D_CMND_I2CSTRETCH "I2CStretch"
@ -69,7 +68,7 @@ const char kDebugCommands[] PROGMEM = "|" // No prefix
#ifdef DEBUG_THEO #ifdef DEBUG_THEO
D_CMND_EXCEPTION "|" D_CMND_EXCEPTION "|"
#endif #endif
D_CMND_FLASHDUMP "|" D_CMND_FLASHMODE "|" D_CMND_FREEMEM"|" D_CMND_HELP "|" D_CMND_RTCDUMP "|" D_CMND_SETSENSOR "|" D_CMND_FLASHDUMP "|" D_CMND_FLASHMODE "|" D_CMND_FREEMEM"|" D_CMND_HELP "|" D_CMND_RTCDUMP "|"
#ifdef USE_I2C #ifdef USE_I2C
D_CMND_I2CWRITE "|" D_CMND_I2CREAD "|" D_CMND_I2CSTRETCH "|" D_CMND_I2CCLOCK D_CMND_I2CWRITE "|" D_CMND_I2CREAD "|" D_CMND_I2CSTRETCH "|" D_CMND_I2CCLOCK
#endif #endif
@ -84,7 +83,7 @@ void (* const DebugCommand[])(void) PROGMEM = {
#ifdef DEBUG_THEO #ifdef DEBUG_THEO
&CmndException, &CmndException,
#endif #endif
&CmndFlashDump, &CmndFlashMode, &CmndFreemem, &CmndHelp, &CmndRtcDump, &CmndSetSensor, &CmndFlashDump, &CmndFlashMode, &CmndFreemem, &CmndHelp, &CmndRtcDump,
#ifdef USE_I2C #ifdef USE_I2C
&CmndI2cWrite, &CmndI2cRead, &CmndI2cStretch, &CmndI2cClock &CmndI2cWrite, &CmndI2cRead, &CmndI2cStretch, &CmndI2cClock
#endif #endif
@ -558,21 +557,6 @@ void CmndFreemem(void)
ResponseCmndNumber(CPU_show_freemem); ResponseCmndNumber(CPU_show_freemem);
} }
void CmndSetSensor(void)
{
if (XdrvMailbox.index < MAX_XSNS_DRIVERS) {
if (XdrvMailbox.payload >= 0) {
bitWrite(Settings->sensors[XdrvMailbox.index / 32], XdrvMailbox.index % 32, XdrvMailbox.payload &1);
if (1 == XdrvMailbox.payload) {
TasmotaGlobal.restart_flag = 2; // To safely re-enable a sensor currently most sensor need to follow complete restart init cycle
}
}
Response_P(PSTR("{\"" D_CMND_SETSENSOR "\":"));
XsnsSensorState();
ResponseJsonEnd();
}
}
void CmndFlashMode(void) void CmndFlashMode(void)
{ {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) {

View File

@ -1055,7 +1055,9 @@ const uint8_t kXsnsList[] = {
/*********************************************************************************************/ /*********************************************************************************************/
bool XsnsEnabled(uint32_t sns_index) { bool XsnsEnabled(uint32_t sensor_list, uint32_t sns_index) {
// sensor_list 0 = sensors
// sensor_list 1 = web_sensors
if (sns_index < sizeof(kXsnsList)) { if (sns_index < sizeof(kXsnsList)) {
#ifdef XFUNC_PTR_IN_ROM #ifdef XFUNC_PTR_IN_ROM
uint32_t index = pgm_read_byte(kXsnsList + sns_index); uint32_t index = pgm_read_byte(kXsnsList + sns_index);
@ -1063,13 +1065,15 @@ bool XsnsEnabled(uint32_t sns_index) {
uint32_t index = kXsnsList[sns_index]; uint32_t index = kXsnsList[sns_index];
#endif #endif
if (index < MAX_XSNS_DRIVERS) { if (index < MAX_XSNS_DRIVERS) {
return bitRead(Settings->sensors[index / 32], index % 32); return bitRead(Settings->sensors[sensor_list][index / 32], index % 32);
} }
} }
return true; return true;
} }
void XsnsSensorState(void) { void XsnsSensorState(uint32_t sensor_list) {
// sensor_list 0 = sensors
// sensor_list 1 = web_sensors
ResponseAppend_P(PSTR("\"")); // Use string for enable/disable signal ResponseAppend_P(PSTR("\"")); // Use string for enable/disable signal
for (uint32_t i = 0; i < sizeof(kXsnsList); i++) { for (uint32_t i = 0; i < sizeof(kXsnsList); i++) {
#ifdef XFUNC_PTR_IN_ROM #ifdef XFUNC_PTR_IN_ROM
@ -1079,7 +1083,7 @@ void XsnsSensorState(void) {
#endif #endif
bool disabled = false; bool disabled = false;
if (sensorid < MAX_XSNS_DRIVERS) { if (sensorid < MAX_XSNS_DRIVERS) {
disabled = !bitRead(Settings->sensors[sensorid / 32], sensorid % 32); disabled = !bitRead(Settings->sensors[sensor_list][sensorid / 32], sensorid % 32);
} }
ResponseAppend_P(PSTR("%s%s%d"), (i) ? "," : "", (disabled) ? "!" : "", sensorid); ResponseAppend_P(PSTR("%s%s%d"), (i) ? "," : "", (disabled) ? "!" : "", sensorid);
} }
@ -1098,18 +1102,11 @@ bool XsnsNextCall(uint8_t Function, uint8_t &xsns_index) {
xsns_index++; xsns_index++;
if (xsns_index == xsns_present) { xsns_index = 0; } if (xsns_index == xsns_present) { xsns_index = 0; }
uint32_t max_disabled = xsns_present;
#ifndef USE_DEBUG_DRIVER while ((!XsnsEnabled(0, xsns_index) || ((FUNC_WEB_SENSOR == Function) && !XsnsEnabled(1, xsns_index))) && max_disabled--) { // Perform at least one sensor
if (FUNC_WEB_SENSOR == Function) { // Skip web info for disabled sensors xsns_index++;
#endif if (xsns_index == xsns_present) { xsns_index = 0; }
uint32_t max_disabled = xsns_present;
while (!XsnsEnabled(xsns_index) && max_disabled--) { // Perform at least one sensor
xsns_index++;
if (xsns_index == xsns_present) { xsns_index = 0; }
}
#ifndef USE_DEBUG_DRIVER
} }
#endif
return xsns_func_ptr[xsns_index](Function); return xsns_func_ptr[xsns_index](Function);
} }
@ -1124,11 +1121,8 @@ bool XsnsCall(uint8_t Function) {
#endif // PROFILE_XSNS_EVERY_SECOND #endif // PROFILE_XSNS_EVERY_SECOND
for (uint32_t x = 0; x < xsns_present; x++) { for (uint32_t x = 0; x < xsns_present; x++) {
#ifdef USE_DEBUG_DRIVER if (XsnsEnabled(0, x)) { // Skip disabled sensor
if (XsnsEnabled(x)) { // Skip disabled sensor in debug mode if ((FUNC_WEB_SENSOR == Function) && !XsnsEnabled(1, x)) { continue; } // Skip web info for disabled sensors
#endif
if ((FUNC_WEB_SENSOR == Function) && !XsnsEnabled(x)) { continue; } // Skip web info for disabled sensors
#ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND #ifdef PROFILE_XSNS_SENSOR_EVERY_SECOND
uint32_t profile_start_millis = millis(); uint32_t profile_start_millis = millis();
@ -1150,9 +1144,7 @@ bool XsnsCall(uint8_t Function) {
)) { )) {
break; break;
} }
#ifdef USE_DEBUG_DRIVER
} }
#endif
} }
#ifdef PROFILE_XSNS_EVERY_SECOND #ifdef PROFILE_XSNS_EVERY_SECOND