Sleep fixes part 2 and 3 of 3

* Change scheduler phase 2/3 - Fixed when sleep is enabled: Blinktime (#3581)
 * Change scheduler phase 3/3 - Some sensor update timings: AdcEvery 200 -> 250, Senseair 300 -> 250, SDM120 300 -> 250, SDM630 300 -> 250
This commit is contained in:
Theo Arends 2018-08-26 17:10:18 +02:00
parent f090050e69
commit bbd2529914
10 changed files with 74 additions and 65 deletions

View File

@ -1,5 +1,7 @@
/* 6.1.1.11 20180826 /* 6.1.1.11 20180826
* Change scheduler phase 1 - Fixed when sleep is enabled: Uptime, Delay, PulseTime and TelePeriod (#3581) * Change scheduler phase 1/3 - Fixed when sleep is enabled: Uptime, Delay, PulseTime and TelePeriod (#3581)
* Change scheduler phase 2/3 - Fixed when sleep is enabled: Blinktime (#3581)
* Change scheduler phase 3/3 - Some sensor update timings: AdcEvery 200 -> 250, Senseair 300 -> 250, SDM120 300 -> 250, SDM630 300 -> 250
* *
* 6.1.1.10 20180827 * 6.1.1.10 20180827
* Disable wifi sleep for both Esp8266/Arduino core 2.4.1 and 2.4.2 to solve device freeze caused by Espressif SDK bug (#3554) * Disable wifi sleep for both Esp8266/Arduino core 2.4.1 and 2.4.2 to solve device freeze caused by Espressif SDK bug (#3554)

View File

@ -199,8 +199,9 @@ enum LightTypes {LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6,
enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC}; enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC};
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX}; enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};
enum XsnsFunctions {FUNC_PRE_INIT, FUNC_INIT, FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_SECOND, FUNC_PREP_BEFORE_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_APPEND, FUNC_SAVE_BEFORE_RESTART, enum XsnsFunctions {FUNC_PRE_INIT, FUNC_INIT, FUNC_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_100_MSECOND, FUNC_EVERY_250_MSECOND, FUNC_EVERY_SECOND, FUNC_PREP_BEFORE_TELEPERIOD,
FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR, FUNC_RULES_PROCESS, FUNC_FREE_MEM}; FUNC_JSON_APPEND, FUNC_WEB_APPEND, FUNC_SAVE_BEFORE_RESTART, FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR,
FUNC_RULES_PROCESS, FUNC_FREE_MEM};
const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 };

View File

@ -134,7 +134,7 @@ byte reset_web_log_flag = 0; // Reset web console log
byte devices_present = 0; // Max number of devices supported byte devices_present = 0; // Max number of devices supported
int status_update_timer = 0; // Refresh initial status int status_update_timer = 0; // Refresh initial status
unsigned long pulse_timer[MAX_PULSETIMERS] = { 0 }; // Power off timer unsigned long pulse_timer[MAX_PULSETIMERS] = { 0 }; // Power off timer
uint16_t blink_timer = 0; // Power cycle timer unsigned long blink_timer = 0; // Power cycle timer
uint16_t blink_counter = 0; // Number of blink cycles uint16_t blink_counter = 0; // Number of blink cycles
power_t blink_power; // Blink power state power_t blink_power; // Blink power state
power_t blink_mask = 0; // Blink relay active mask power_t blink_mask = 0; // Blink relay active mask
@ -662,9 +662,9 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE_ACTIVE_NVALUE, command, index, Settings.pulse_timer[index -1], GetPulseTimer(index -1)); snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_NVALUE_ACTIVE_NVALUE, command, index, Settings.pulse_timer[index -1], GetPulseTimer(index -1));
} }
else if (CMND_BLINKTIME == command_code) { else if (CMND_BLINKTIME == command_code) {
if ((payload > 2) && (payload <= 3600)) { if ((payload > 1) && (payload <= 3600)) {
Settings.blinktime = payload; Settings.blinktime = payload;
if (blink_timer) blink_timer = Settings.blinktime; if (blink_timer > 0) { blink_timer = millis() + (100 * payload); }
} }
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.blinktime); snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.blinktime);
} }
@ -1328,7 +1328,7 @@ void ExecuteCommandPower(byte device, byte state, int source)
blink_powersave = (blink_powersave & (POWER_MASK ^ mask)) | (power & mask); // Save state blink_powersave = (blink_powersave & (POWER_MASK ^ mask)) | (power & mask); // Save state
blink_power = (power >> (device -1))&1; // Prep to Toggle blink_power = (power >> (device -1))&1; // Prep to Toggle
} }
blink_timer = 1; blink_timer = millis() + 100;
blink_counter = ((!Settings.blinkcount) ? 64000 : (Settings.blinkcount *2)) +1; blink_counter = ((!Settings.blinkcount) ? 64000 : (Settings.blinkcount *2)) +1;
blink_mask |= mask; // Set device mask blink_mask |= mask; // Set device mask
MqttPublishPowerBlinkState(device); MqttPublishPowerBlinkState(device);
@ -1862,9 +1862,6 @@ void Every50mSeconds()
ButtonHandler(); ButtonHandler();
SwitchHandler(0); SwitchHandler(0);
XdrvCall(FUNC_EVERY_50_MSECOND);
XsnsCall(FUNC_EVERY_50_MSECOND);
} }
/*-------------------------------------------------------------------------------------------*\ /*-------------------------------------------------------------------------------------------*\
@ -1891,9 +1888,8 @@ void Every100mSeconds()
} }
if (blink_mask) { if (blink_mask) {
blink_timer--; if (TimeReached(blink_timer)) {
if (!blink_timer) { SetNextTimeInterval(blink_timer, 100 * Settings.blinktime);
blink_timer = Settings.blinktime;
blink_counter--; blink_counter--;
if (!blink_counter) { if (!blink_counter) {
StopAllPowerBlink(); StopAllPowerBlink();
@ -2620,16 +2616,22 @@ void loop()
if (TimeReached(state_50msecond)) { if (TimeReached(state_50msecond)) {
SetNextTimeInterval(state_50msecond, 50); SetNextTimeInterval(state_50msecond, 50);
Every50mSeconds(); Every50mSeconds();
XdrvCall(FUNC_EVERY_50_MSECOND);
XsnsCall(FUNC_EVERY_50_MSECOND);
} }
if (TimeReached(state_100msecond)) { if (TimeReached(state_100msecond)) {
SetNextTimeInterval(state_100msecond, 100); SetNextTimeInterval(state_100msecond, 100);
Every100mSeconds(); Every100mSeconds();
XdrvCall(FUNC_EVERY_100_MSECOND);
XsnsCall(FUNC_EVERY_100_MSECOND);
} }
if (TimeReached(state_250msecond)) { if (TimeReached(state_250msecond)) {
SetNextTimeInterval(state_250msecond, 250); SetNextTimeInterval(state_250msecond, 250);
Every250mSeconds(); Every250mSeconds();
XdrvCall(FUNC_EVERY_250_MSECOND);
XsnsCall(FUNC_EVERY_250_MSECOND);
} }
if (!serial_local) SerialInput(); if (!serial_local) SerialInput();

View File

@ -2085,7 +2085,6 @@ void RtcInit()
* ADC support * ADC support
\*********************************************************************************************/ \*********************************************************************************************/
uint8_t adc_counter = 0;
uint16_t adc_last_value = 0; uint16_t adc_last_value = 0;
uint16_t AdcRead() uint16_t AdcRead()
@ -2100,17 +2099,14 @@ uint16_t AdcRead()
} }
#ifdef USE_RULES #ifdef USE_RULES
void AdcEvery50ms() void AdcEvery250ms()
{ {
adc_counter++; uint16_t new_value = AdcRead();
if (!(adc_counter % 4)) { if ((new_value < adc_last_value -10) || (new_value > adc_last_value +10)) {
uint16_t new_value = AdcRead(); adc_last_value = new_value;
if ((new_value < adc_last_value -10) || (new_value > adc_last_value +10)) { uint16_t value = adc_last_value / 10;
adc_last_value = new_value; snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value);
uint16_t value = adc_last_value / 10; XdrvRulesProcess();
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value);
XdrvRulesProcess();
}
} }
} }
#endif // USE_RULES #endif // USE_RULES
@ -2141,8 +2137,8 @@ boolean Xsns02(byte function)
if (pin[GPIO_ADC0] < 99) { if (pin[GPIO_ADC0] < 99) {
switch (function) { switch (function) {
#ifdef USE_RULES #ifdef USE_RULES
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_250_MSECOND:
AdcEvery50ms(); AdcEvery250ms();
break; break;
#endif // USE_RULES #endif // USE_RULES
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:

View File

@ -401,20 +401,21 @@ void RulesEvery50ms()
mask <<= 1; mask <<= 1;
} }
} }
else { }
rules_quota++; }
if (rules_quota &1) { // Every 100 ms
mqtt_data[0] = '\0'; void RulesEvery100ms()
uint16_t tele_period_save = tele_period; {
tele_period = 2; // Do not allow HA updates during next function call if (Settings.rule_enabled) { // Any rule enabled
XsnsNextCall(FUNC_JSON_APPEND); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} mqtt_data[0] = '\0';
tele_period = tele_period_save; uint16_t tele_period_save = tele_period;
if (strlen(mqtt_data)) { tele_period = 2; // Do not allow HA updates during next function call
mqtt_data[0] = '{'; // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} XsnsNextCall(FUNC_JSON_APPEND); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data); tele_period = tele_period_save;
RulesProcess(); if (strlen(mqtt_data)) {
} mqtt_data[0] = '{'; // {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}
} snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s}"), mqtt_data);
RulesProcess();
} }
} }
} }
@ -595,6 +596,9 @@ boolean Xdrv10(byte function)
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_50_MSECOND:
RulesEvery50ms(); RulesEvery50ms();
break; break;
case FUNC_EVERY_100_MSECOND:
RulesEvery100ms();
break;
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
RulesEverySecond(); RulesEverySecond();
break; break;

View File

@ -198,6 +198,8 @@ void ShowFreeMem(const char *where)
* FUNC_SHOW_SENSOR * FUNC_SHOW_SENSOR
* FUNC_EVERY_SECOND * FUNC_EVERY_SECOND
* FUNC_EVERY_50_MSECOND * FUNC_EVERY_50_MSECOND
* FUNC_EVERY_100_MSECOND
* FUNC_EVERY_250_MSECOND
* FUNC_RULES_PROCESS * FUNC_RULES_PROCESS
* FUNC_FREE_MEM * FUNC_FREE_MEM
\*********************************************************************************************/ \*********************************************************************************************/

View File

@ -46,7 +46,7 @@ uint16_t senseair_co2 = 0;
float senseair_temperature = 0; float senseair_temperature = 0;
float senseair_humidity = 0; float senseair_humidity = 0;
uint8_t senseair_state = 0; //uint8_t senseair_state = 0;
/*********************************************************************************************/ /*********************************************************************************************/
@ -115,11 +115,11 @@ const uint8_t start_addresses[] { 0x1A, 0x00, 0x03, 0x04, 0x05, 0x1C, 0x0A };
uint8_t senseair_read_state = 0; uint8_t senseair_read_state = 0;
uint8_t senseair_send_retry = 0; uint8_t senseair_send_retry = 0;
void Senseair50ms() // Every 50 mSec void Senseair250ms() // Every 250 mSec
{ {
senseair_state++; // senseair_state++;
if (6 == senseair_state) { // Every 300 mSec // if (6 == senseair_state) { // Every 300 mSec
senseair_state = 0; // senseair_state = 0;
uint16_t value = 0; uint16_t value = 0;
bool data_ready = ModbusReceiveReady(); bool data_ready = ModbusReceiveReady();
@ -184,7 +184,7 @@ void Senseair50ms() // Every 50 mSec
senseair_send_retry--; senseair_send_retry--;
} }
} // }
} }
/*********************************************************************************************/ /*********************************************************************************************/
@ -244,8 +244,8 @@ boolean Xsns17(byte function)
case FUNC_INIT: case FUNC_INIT:
SenseairInit(); SenseairInit();
break; break;
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_250_MSECOND:
Senseair50ms(); Senseair250ms();
break; break;
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
SenseairShow(1); SenseairShow(1);

View File

@ -30,7 +30,7 @@
TasmotaSerial *SDM120Serial; TasmotaSerial *SDM120Serial;
uint8_t sdm120_type = 1; uint8_t sdm120_type = 1;
uint8_t sdm120_state = 0; //uint8_t sdm120_state = 0;
float sdm120_voltage = 0; float sdm120_voltage = 0;
float sdm120_current = 0; float sdm120_current = 0;
@ -135,11 +135,11 @@ const uint16_t sdm120_start_addresses[] {
uint8_t sdm120_read_state = 0; uint8_t sdm120_read_state = 0;
uint8_t sdm120_send_retry = 0; uint8_t sdm120_send_retry = 0;
void SDM12050ms() // Every 50 mSec void SDM120250ms() // Every 250 mSec
{ {
sdm120_state++; // sdm120_state++;
if (6 == sdm120_state) { // Every 300 mSec // if (6 == sdm120_state) { // Every 300 mSec
sdm120_state = 0; // sdm120_state = 0;
float value = 0; float value = 0;
bool data_ready = SDM120_ModbusReceiveReady(); bool data_ready = SDM120_ModbusReceiveReady();
@ -198,7 +198,7 @@ void SDM12050ms() // Every 50 mSec
} else { } else {
sdm120_send_retry--; sdm120_send_retry--;
} }
} // end 300 ms // } // end 300 ms
} }
void SDM120Init() void SDM120Init()
@ -281,8 +281,8 @@ boolean Xsns23(byte function)
case FUNC_INIT: case FUNC_INIT:
SDM120Init(); SDM120Init();
break; break;
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_250_MSECOND:
SDM12050ms(); SDM120250ms();
break; break;
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
SDM120Show(1); SDM120Show(1);

View File

@ -30,7 +30,7 @@
TasmotaSerial *SDM630Serial; TasmotaSerial *SDM630Serial;
uint8_t sdm630_type = 1; uint8_t sdm630_type = 1;
uint8_t sdm630_state = 0; //uint8_t sdm630_state = 0;
float sdm630_voltage[] = {0,0,0}; float sdm630_voltage[] = {0,0,0};
float sdm630_current[] = {0,0,0}; float sdm630_current[] = {0,0,0};
@ -141,11 +141,11 @@ const uint16_t sdm630_start_addresses[] {
uint8_t sdm630_read_state = 0; uint8_t sdm630_read_state = 0;
uint8_t sdm630_send_retry = 0; uint8_t sdm630_send_retry = 0;
void SDM63050ms() // Every 50 mSec void SDM630250ms() // Every 250 mSec
{ {
sdm630_state++; // sdm630_state++;
if (6 == sdm630_state) { // Every 300 mSec // if (6 == sdm630_state) { // Every 300 mSec
sdm630_state = 0; // sdm630_state = 0;
float value = 0; float value = 0;
bool data_ready = SDM630_ModbusReceiveReady(); bool data_ready = SDM630_ModbusReceiveReady();
@ -236,7 +236,7 @@ void SDM63050ms() // Every 50 mSec
} else { } else {
sdm630_send_retry--; sdm630_send_retry--;
} }
} // end 300 ms // } // end 300 ms
} }
void SDM630Init() void SDM630Init()
@ -336,8 +336,8 @@ boolean Xsns25(byte function)
case FUNC_INIT: case FUNC_INIT:
SDM630Init(); SDM630Init();
break; break;
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_250_MSECOND:
SDM63050ms(); SDM630250ms();
break; break;
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
SDM630Show(1); SDM630Show(1);

View File

@ -229,8 +229,10 @@ uint8_t xsns_index = 0;
* FUNC_JSON_APPEND * FUNC_JSON_APPEND
* FUNC_WEB_APPEND * FUNC_WEB_APPEND
* return FUNC_COMMAND * return FUNC_COMMAND
* FUNC_EVERY_SECOND
* FUNC_EVERY_50_MSECOND * FUNC_EVERY_50_MSECOND
* FUNC_EVERY_100_MSECOND
* FUNC_EVERY_250_MSECOND
* FUNC_EVERY_SECOND
\*********************************************************************************************/ \*********************************************************************************************/
uint8_t XsnsPresent() uint8_t XsnsPresent()