From bbd2529914483af33ef175a93f10fbd8a17987fd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 26 Aug 2018 17:10:18 +0200 Subject: [PATCH] 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 --- sonoff/_changelog.ino | 4 +++- sonoff/sonoff.h | 5 +++-- sonoff/sonoff.ino | 22 ++++++++++++---------- sonoff/support.ino | 22 +++++++++------------- sonoff/xdrv_10_rules.ino | 32 ++++++++++++++++++-------------- sonoff/xdrv_interface.ino | 2 ++ sonoff/xsns_17_senseair.ino | 16 ++++++++-------- sonoff/xsns_23_sdm120.ino | 16 ++++++++-------- sonoff/xsns_25_sdm630.ino | 16 ++++++++-------- sonoff/xsns_interface.ino | 4 +++- 10 files changed, 74 insertions(+), 65 deletions(-) diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino index a3f032ae7..e12138049 100644 --- a/sonoff/_changelog.ino +++ b/sonoff/_changelog.ino @@ -1,5 +1,7 @@ /* 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 * 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) diff --git a/sonoff/sonoff.h b/sonoff/sonoff.h index fd0b8430b..cea1b6f98 100644 --- a/sonoff/sonoff.h +++ b/sonoff/sonoff.h @@ -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 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, - FUNC_COMMAND, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_MQTT_DATA, FUNC_SET_POWER, FUNC_SHOW_SENSOR, FUNC_RULES_PROCESS, FUNC_FREE_MEM}; +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_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 }; diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index e26281fb7..f5758a6d2 100755 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -134,7 +134,7 @@ byte reset_web_log_flag = 0; // Reset web console log byte devices_present = 0; // Max number of devices supported int status_update_timer = 0; // Refresh initial status 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 power_t blink_power; // Blink power state 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)); } else if (CMND_BLINKTIME == command_code) { - if ((payload > 2) && (payload <= 3600)) { + if ((payload > 1) && (payload <= 3600)) { 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); } @@ -1328,7 +1328,7 @@ void ExecuteCommandPower(byte device, byte state, int source) blink_powersave = (blink_powersave & (POWER_MASK ^ mask)) | (power & mask); // Save state 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_mask |= mask; // Set device mask MqttPublishPowerBlinkState(device); @@ -1862,9 +1862,6 @@ void Every50mSeconds() ButtonHandler(); SwitchHandler(0); - - XdrvCall(FUNC_EVERY_50_MSECOND); - XsnsCall(FUNC_EVERY_50_MSECOND); } /*-------------------------------------------------------------------------------------------*\ @@ -1891,9 +1888,8 @@ void Every100mSeconds() } if (blink_mask) { - blink_timer--; - if (!blink_timer) { - blink_timer = Settings.blinktime; + if (TimeReached(blink_timer)) { + SetNextTimeInterval(blink_timer, 100 * Settings.blinktime); blink_counter--; if (!blink_counter) { StopAllPowerBlink(); @@ -2620,16 +2616,22 @@ void loop() if (TimeReached(state_50msecond)) { SetNextTimeInterval(state_50msecond, 50); Every50mSeconds(); + XdrvCall(FUNC_EVERY_50_MSECOND); + XsnsCall(FUNC_EVERY_50_MSECOND); } if (TimeReached(state_100msecond)) { SetNextTimeInterval(state_100msecond, 100); Every100mSeconds(); + XdrvCall(FUNC_EVERY_100_MSECOND); + XsnsCall(FUNC_EVERY_100_MSECOND); } if (TimeReached(state_250msecond)) { SetNextTimeInterval(state_250msecond, 250); Every250mSeconds(); + XdrvCall(FUNC_EVERY_250_MSECOND); + XsnsCall(FUNC_EVERY_250_MSECOND); } if (!serial_local) SerialInput(); diff --git a/sonoff/support.ino b/sonoff/support.ino index b609f4be8..90e31ce9c 100644 --- a/sonoff/support.ino +++ b/sonoff/support.ino @@ -2085,7 +2085,6 @@ void RtcInit() * ADC support \*********************************************************************************************/ -uint8_t adc_counter = 0; uint16_t adc_last_value = 0; uint16_t AdcRead() @@ -2100,17 +2099,14 @@ uint16_t AdcRead() } #ifdef USE_RULES -void AdcEvery50ms() +void AdcEvery250ms() { - adc_counter++; - if (!(adc_counter % 4)) { - uint16_t new_value = AdcRead(); - if ((new_value < adc_last_value -10) || (new_value > adc_last_value +10)) { - adc_last_value = new_value; - uint16_t value = adc_last_value / 10; - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value); - XdrvRulesProcess(); - } + uint16_t new_value = AdcRead(); + if ((new_value < adc_last_value -10) || (new_value > adc_last_value +10)) { + adc_last_value = new_value; + uint16_t value = adc_last_value / 10; + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"ANALOG\":{\"A0div10\":%d}}"), (value > 99) ? 100 : value); + XdrvRulesProcess(); } } #endif // USE_RULES @@ -2141,8 +2137,8 @@ boolean Xsns02(byte function) if (pin[GPIO_ADC0] < 99) { switch (function) { #ifdef USE_RULES - case FUNC_EVERY_50_MSECOND: - AdcEvery50ms(); + case FUNC_EVERY_250_MSECOND: + AdcEvery250ms(); break; #endif // USE_RULES case FUNC_JSON_APPEND: diff --git a/sonoff/xdrv_10_rules.ino b/sonoff/xdrv_10_rules.ino index b8116fbaf..4139d0273 100644 --- a/sonoff/xdrv_10_rules.ino +++ b/sonoff/xdrv_10_rules.ino @@ -401,20 +401,21 @@ void RulesEvery50ms() mask <<= 1; } } - else { - rules_quota++; - if (rules_quota &1) { // Every 100 ms - mqtt_data[0] = '\0'; - uint16_t tele_period_save = tele_period; - tele_period = 2; // Do not allow HA updates during next function call - XsnsNextCall(FUNC_JSON_APPEND); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} - tele_period = tele_period_save; - 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(); - } - } + } +} + +void RulesEvery100ms() +{ + if (Settings.rule_enabled) { // Any rule enabled + mqtt_data[0] = '\0'; + uint16_t tele_period_save = tele_period; + tele_period = 2; // Do not allow HA updates during next function call + XsnsNextCall(FUNC_JSON_APPEND); // ,"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089} + tele_period = tele_period_save; + 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: RulesEvery50ms(); break; + case FUNC_EVERY_100_MSECOND: + RulesEvery100ms(); + break; case FUNC_EVERY_SECOND: RulesEverySecond(); break; diff --git a/sonoff/xdrv_interface.ino b/sonoff/xdrv_interface.ino index 16bac5830..43a391076 100644 --- a/sonoff/xdrv_interface.ino +++ b/sonoff/xdrv_interface.ino @@ -198,6 +198,8 @@ void ShowFreeMem(const char *where) * FUNC_SHOW_SENSOR * FUNC_EVERY_SECOND * FUNC_EVERY_50_MSECOND + * FUNC_EVERY_100_MSECOND + * FUNC_EVERY_250_MSECOND * FUNC_RULES_PROCESS * FUNC_FREE_MEM \*********************************************************************************************/ diff --git a/sonoff/xsns_17_senseair.ino b/sonoff/xsns_17_senseair.ino index 2c059bb1b..6ebd00014 100644 --- a/sonoff/xsns_17_senseair.ino +++ b/sonoff/xsns_17_senseair.ino @@ -46,7 +46,7 @@ uint16_t senseair_co2 = 0; float senseair_temperature = 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_send_retry = 0; -void Senseair50ms() // Every 50 mSec +void Senseair250ms() // Every 250 mSec { - senseair_state++; - if (6 == senseair_state) { // Every 300 mSec - senseair_state = 0; +// senseair_state++; +// if (6 == senseair_state) { // Every 300 mSec +// senseair_state = 0; uint16_t value = 0; bool data_ready = ModbusReceiveReady(); @@ -184,7 +184,7 @@ void Senseair50ms() // Every 50 mSec senseair_send_retry--; } - } +// } } /*********************************************************************************************/ @@ -244,8 +244,8 @@ boolean Xsns17(byte function) case FUNC_INIT: SenseairInit(); break; - case FUNC_EVERY_50_MSECOND: - Senseair50ms(); + case FUNC_EVERY_250_MSECOND: + Senseair250ms(); break; case FUNC_JSON_APPEND: SenseairShow(1); diff --git a/sonoff/xsns_23_sdm120.ino b/sonoff/xsns_23_sdm120.ino index 9e5df92a4..c22bc28cb 100644 --- a/sonoff/xsns_23_sdm120.ino +++ b/sonoff/xsns_23_sdm120.ino @@ -30,7 +30,7 @@ TasmotaSerial *SDM120Serial; uint8_t sdm120_type = 1; -uint8_t sdm120_state = 0; +//uint8_t sdm120_state = 0; float sdm120_voltage = 0; float sdm120_current = 0; @@ -135,11 +135,11 @@ const uint16_t sdm120_start_addresses[] { uint8_t sdm120_read_state = 0; uint8_t sdm120_send_retry = 0; -void SDM12050ms() // Every 50 mSec +void SDM120250ms() // Every 250 mSec { - sdm120_state++; - if (6 == sdm120_state) { // Every 300 mSec - sdm120_state = 0; +// sdm120_state++; +// if (6 == sdm120_state) { // Every 300 mSec +// sdm120_state = 0; float value = 0; bool data_ready = SDM120_ModbusReceiveReady(); @@ -198,7 +198,7 @@ void SDM12050ms() // Every 50 mSec } else { sdm120_send_retry--; } - } // end 300 ms +// } // end 300 ms } void SDM120Init() @@ -281,8 +281,8 @@ boolean Xsns23(byte function) case FUNC_INIT: SDM120Init(); break; - case FUNC_EVERY_50_MSECOND: - SDM12050ms(); + case FUNC_EVERY_250_MSECOND: + SDM120250ms(); break; case FUNC_JSON_APPEND: SDM120Show(1); diff --git a/sonoff/xsns_25_sdm630.ino b/sonoff/xsns_25_sdm630.ino index 193c3a936..c3513fd42 100644 --- a/sonoff/xsns_25_sdm630.ino +++ b/sonoff/xsns_25_sdm630.ino @@ -30,7 +30,7 @@ TasmotaSerial *SDM630Serial; uint8_t sdm630_type = 1; -uint8_t sdm630_state = 0; +//uint8_t sdm630_state = 0; float sdm630_voltage[] = {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_send_retry = 0; -void SDM63050ms() // Every 50 mSec +void SDM630250ms() // Every 250 mSec { - sdm630_state++; - if (6 == sdm630_state) { // Every 300 mSec - sdm630_state = 0; +// sdm630_state++; +// if (6 == sdm630_state) { // Every 300 mSec +// sdm630_state = 0; float value = 0; bool data_ready = SDM630_ModbusReceiveReady(); @@ -236,7 +236,7 @@ void SDM63050ms() // Every 50 mSec } else { sdm630_send_retry--; } - } // end 300 ms +// } // end 300 ms } void SDM630Init() @@ -336,8 +336,8 @@ boolean Xsns25(byte function) case FUNC_INIT: SDM630Init(); break; - case FUNC_EVERY_50_MSECOND: - SDM63050ms(); + case FUNC_EVERY_250_MSECOND: + SDM630250ms(); break; case FUNC_JSON_APPEND: SDM630Show(1); diff --git a/sonoff/xsns_interface.ino b/sonoff/xsns_interface.ino index 7c18fa723..2f0468b9e 100644 --- a/sonoff/xsns_interface.ino +++ b/sonoff/xsns_interface.ino @@ -229,8 +229,10 @@ uint8_t xsns_index = 0; * FUNC_JSON_APPEND * FUNC_WEB_APPEND * return FUNC_COMMAND - * FUNC_EVERY_SECOND * FUNC_EVERY_50_MSECOND + * FUNC_EVERY_100_MSECOND + * FUNC_EVERY_250_MSECOND + * FUNC_EVERY_SECOND \*********************************************************************************************/ uint8_t XsnsPresent()