mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 05:36:39 +00:00
Use global struct
This commit is contained in:
parent
7ce5365cf6
commit
b93b719108
@ -657,7 +657,7 @@ float ConvertTemp(float c)
|
|||||||
{
|
{
|
||||||
float result = c;
|
float result = c;
|
||||||
|
|
||||||
global_update = uptime;
|
TasmotaGlobal.global_update = TasmotaGlobal.uptime;
|
||||||
global_temperature_celsius = c;
|
global_temperature_celsius = c;
|
||||||
|
|
||||||
if (!isnan(c) && Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
|
if (!isnan(c) && Settings.flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit
|
||||||
@ -688,7 +688,7 @@ float ConvertHumidity(float h)
|
|||||||
{
|
{
|
||||||
float result = h;
|
float result = h;
|
||||||
|
|
||||||
global_update = uptime;
|
TasmotaGlobal.global_update = TasmotaGlobal.uptime;
|
||||||
global_humidity = h;
|
global_humidity = h;
|
||||||
|
|
||||||
result = result + (0.1 * Settings.hum_comp);
|
result = result + (0.1 * Settings.hum_comp);
|
||||||
@ -717,7 +717,7 @@ float ConvertPressure(float p)
|
|||||||
{
|
{
|
||||||
float result = p;
|
float result = p;
|
||||||
|
|
||||||
global_update = uptime;
|
TasmotaGlobal.global_update = TasmotaGlobal.uptime;
|
||||||
global_pressure_hpa = p;
|
global_pressure_hpa = p;
|
||||||
|
|
||||||
if (!isnan(p) && Settings.flag.pressure_conversion) { // SetOption24 - Switch between hPa or mmHg pressure unit
|
if (!isnan(p) && Settings.flag.pressure_conversion) { // SetOption24 - Switch between hPa or mmHg pressure unit
|
||||||
@ -745,8 +745,8 @@ String SpeedUnit(void)
|
|||||||
|
|
||||||
void ResetGlobalValues(void)
|
void ResetGlobalValues(void)
|
||||||
{
|
{
|
||||||
if ((uptime - global_update) > GLOBAL_VALUES_VALID) { // Reset after 5 minutes
|
if ((TasmotaGlobal.uptime - TasmotaGlobal.global_update) > GLOBAL_VALUES_VALID) { // Reset after 5 minutes
|
||||||
global_update = 0;
|
TasmotaGlobal.global_update = 0;
|
||||||
global_temperature_celsius = NAN;
|
global_temperature_celsius = NAN;
|
||||||
global_humidity = 0.0f;
|
global_humidity = 0.0f;
|
||||||
global_pressure_hpa = 0.0f;
|
global_pressure_hpa = 0.0f;
|
||||||
@ -902,10 +902,10 @@ String GetSerialConfig(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetSerialBegin(void) {
|
void SetSerialBegin(void) {
|
||||||
baudrate = Settings.baudrate * 300;
|
TasmotaGlobal.baudrate = Settings.baudrate * 300;
|
||||||
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_SERIAL "Set to %s %d bit/s"), GetSerialConfig().c_str(), baudrate);
|
AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_SERIAL "Set to %s %d bit/s"), GetSerialConfig().c_str(), TasmotaGlobal.baudrate);
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
Serial.begin(baudrate, (SerialConfig)pgm_read_byte(kTasmotaSerialConfig + Settings.serial_config));
|
Serial.begin(TasmotaGlobal.baudrate, (SerialConfig)pgm_read_byte(kTasmotaSerialConfig + Settings.serial_config));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSerialConfig(uint32_t serial_config) {
|
void SetSerialConfig(uint32_t serial_config) {
|
||||||
@ -918,19 +918,19 @@ void SetSerialConfig(uint32_t serial_config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSerialBaudrate(uint32_t ubaudrate) {
|
void SetSerialBaudrate(uint32_t baudrate) {
|
||||||
baudrate = ubaudrate;
|
TasmotaGlobal.baudrate = baudrate;
|
||||||
Settings.baudrate = baudrate / 300;
|
Settings.baudrate = TasmotaGlobal.baudrate / 300;
|
||||||
if (Serial.baudRate() != baudrate) {
|
if (Serial.baudRate() != TasmotaGlobal.baudrate) {
|
||||||
SetSerialBegin();
|
SetSerialBegin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetSerial(uint32_t ubaudrate, uint32_t serial_config) {
|
void SetSerial(uint32_t baudrate, uint32_t serial_config) {
|
||||||
Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
|
Settings.flag.mqtt_serial = 0; // CMND_SERIALSEND and CMND_SERIALLOG
|
||||||
Settings.serial_config = serial_config;
|
Settings.serial_config = serial_config;
|
||||||
baudrate = ubaudrate;
|
TasmotaGlobal.baudrate = baudrate;
|
||||||
Settings.baudrate = baudrate / 300;
|
Settings.baudrate = TasmotaGlobal.baudrate / 300;
|
||||||
SetSeriallog(LOG_LEVEL_NONE);
|
SetSeriallog(LOG_LEVEL_NONE);
|
||||||
SetSerialBegin();
|
SetSerialBegin();
|
||||||
}
|
}
|
||||||
@ -939,8 +939,8 @@ void ClaimSerial(void) {
|
|||||||
serial_local = true;
|
serial_local = true;
|
||||||
AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial"));
|
AddLog_P(LOG_LEVEL_INFO, PSTR("SNS: Hardware Serial"));
|
||||||
SetSeriallog(LOG_LEVEL_NONE);
|
SetSeriallog(LOG_LEVEL_NONE);
|
||||||
baudrate = Serial.baudRate();
|
TasmotaGlobal.baudrate = Serial.baudRate();
|
||||||
Settings.baudrate = baudrate / 300;
|
Settings.baudrate = TasmotaGlobal.baudrate / 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialSendRaw(char *codes)
|
void SerialSendRaw(char *codes)
|
||||||
@ -1996,9 +1996,11 @@ void AddLog(uint32_t loglevel)
|
|||||||
(masterlog_level <= Settings.weblog_level)) {
|
(masterlog_level <= Settings.weblog_level)) {
|
||||||
// Delimited, zero-terminated buffer of log lines.
|
// Delimited, zero-terminated buffer of log lines.
|
||||||
// Each entry has this format: [index][log data]['\1']
|
// Each entry has this format: [index][log data]['\1']
|
||||||
web_log_index &= 0xFF;
|
TasmotaGlobal.web_log_index &= 0xFF;
|
||||||
if (!web_log_index) web_log_index++; // Index 0 is not allowed as it is the end of char string
|
if (!TasmotaGlobal.web_log_index) {
|
||||||
while (web_log_index == web_log[0] || // If log already holds the next index, remove it
|
TasmotaGlobal.web_log_index++; // Index 0 is not allowed as it is the end of char string
|
||||||
|
}
|
||||||
|
while (TasmotaGlobal.web_log_index == web_log[0] || // If log already holds the next index, remove it
|
||||||
strlen(web_log) + strlen(log_data) + 13 > WEB_LOG_SIZE) // 13 = web_log_index + mxtime + '\1' + '\0'
|
strlen(web_log) + strlen(log_data) + 13 > WEB_LOG_SIZE) // 13 = web_log_index + mxtime + '\1' + '\0'
|
||||||
{
|
{
|
||||||
char* it = web_log;
|
char* it = web_log;
|
||||||
@ -2007,9 +2009,11 @@ void AddLog(uint32_t loglevel)
|
|||||||
it++; // Skip delimiting "\1"
|
it++; // Skip delimiting "\1"
|
||||||
memmove(web_log, it, WEB_LOG_SIZE -(it-web_log)); // Move buffer forward to remove oldest log line
|
memmove(web_log, it, WEB_LOG_SIZE -(it-web_log)); // Move buffer forward to remove oldest log line
|
||||||
}
|
}
|
||||||
snprintf_P(web_log, sizeof(web_log), PSTR("%s%c%s%s\1"), web_log, web_log_index++, mxtime, log_data);
|
snprintf_P(web_log, sizeof(web_log), PSTR("%s%c%s%s\1"), web_log, TasmotaGlobal.web_log_index++, mxtime, log_data);
|
||||||
web_log_index &= 0xFF;
|
TasmotaGlobal.web_log_index &= 0xFF;
|
||||||
if (!web_log_index) web_log_index++; // Index 0 is not allowed as it is the end of char string
|
if (!TasmotaGlobal.web_log_index) {
|
||||||
|
TasmotaGlobal.web_log_index++; // Index 0 is not allowed as it is the end of char string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
if (Settings.flag.mqtt_enabled && // SetOption3 - Enable MQTT
|
if (Settings.flag.mqtt_enabled && // SetOption3 - Enable MQTT
|
||||||
|
@ -135,7 +135,7 @@ uint8_t ButtonSerial(uint8_t serial_in_byte)
|
|||||||
|
|
||||||
void ButtonHandler(void)
|
void ButtonHandler(void)
|
||||||
{
|
{
|
||||||
if (uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
if (TasmotaGlobal.uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
||||||
|
|
||||||
uint8_t hold_time_extent = IMMINENT_RESET_FACTOR; // Extent hold time factor in case of iminnent Reset command
|
uint8_t hold_time_extent = IMMINENT_RESET_FACTOR; // Extent hold time factor in case of iminnent Reset command
|
||||||
uint16_t loops_per_second = 1000 / Settings.button_debounce; // ButtonDebounce (50)
|
uint16_t loops_per_second = 1000 / Settings.button_debounce; // ButtonDebounce (50)
|
||||||
|
@ -244,8 +244,8 @@ void CommandHandler(char* topicBuf, char* dataBuf, uint32_t data_len)
|
|||||||
|
|
||||||
DEBUG_CORE_LOG(PSTR("CMD: Payload %d"), payload);
|
DEBUG_CORE_LOG(PSTR("CMD: Payload %d"), payload);
|
||||||
|
|
||||||
// backlog_delay = millis() + (100 * MIN_BACKLOG_DELAY);
|
// TasmotaGlobal.backlog_delay = millis() + (100 * MIN_BACKLOG_DELAY);
|
||||||
backlog_delay = millis() + Settings.param[P_BACKLOG_DELAY];
|
TasmotaGlobal.backlog_delay = millis() + Settings.param[P_BACKLOG_DELAY];
|
||||||
|
|
||||||
char command[CMDSZ] = { 0 };
|
char command[CMDSZ] = { 0 };
|
||||||
XdrvMailbox.command = command;
|
XdrvMailbox.command = command;
|
||||||
@ -344,7 +344,7 @@ void CmndBacklog(void)
|
|||||||
}
|
}
|
||||||
// ResponseCmndChar(D_JSON_APPENDED);
|
// ResponseCmndChar(D_JSON_APPENDED);
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
backlog_delay = 0;
|
TasmotaGlobal.backlog_delay = 0;
|
||||||
} else {
|
} else {
|
||||||
bool blflag = BACKLOG_EMPTY;
|
bool blflag = BACKLOG_EMPTY;
|
||||||
#ifdef SUPPORT_IF_STATEMENT
|
#ifdef SUPPORT_IF_STATEMENT
|
||||||
@ -359,10 +359,10 @@ void CmndBacklog(void)
|
|||||||
void CmndDelay(void)
|
void CmndDelay(void)
|
||||||
{
|
{
|
||||||
if ((XdrvMailbox.payload >= (MIN_BACKLOG_DELAY / 100)) && (XdrvMailbox.payload <= 3600)) {
|
if ((XdrvMailbox.payload >= (MIN_BACKLOG_DELAY / 100)) && (XdrvMailbox.payload <= 3600)) {
|
||||||
backlog_delay = millis() + (100 * XdrvMailbox.payload);
|
TasmotaGlobal.backlog_delay = millis() + (100 * XdrvMailbox.payload);
|
||||||
}
|
}
|
||||||
uint32_t bl_delay = 0;
|
uint32_t bl_delay = 0;
|
||||||
long bl_delta = TimePassedSince(backlog_delay);
|
long bl_delta = TimePassedSince(TasmotaGlobal.backlog_delay);
|
||||||
if (bl_delta < 0) { bl_delay = (bl_delta *-1) / 100; }
|
if (bl_delta < 0) { bl_delay = (bl_delta *-1) / 100; }
|
||||||
ResponseCmndNumber(bl_delay);
|
ResponseCmndNumber(bl_delay);
|
||||||
}
|
}
|
||||||
@ -440,7 +440,7 @@ void CmndStatus(void)
|
|||||||
",\"" D_JSON_SAVEADDRESS "\":\"%X\""
|
",\"" D_JSON_SAVEADDRESS "\":\"%X\""
|
||||||
#endif
|
#endif
|
||||||
"}}"),
|
"}}"),
|
||||||
baudrate, GetSerialConfig().c_str(), SettingsText(SET_MQTT_GRP_TOPIC), SettingsText(SET_OTAURL),
|
TasmotaGlobal.baudrate, GetSerialConfig().c_str(), SettingsText(SET_MQTT_GRP_TOPIC), SettingsText(SET_OTAURL),
|
||||||
GetResetReason().c_str(), GetUptime().c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep,
|
GetResetReason().c_str(), GetUptime().c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep,
|
||||||
Settings.cfg_holder, Settings.bootcount, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag
|
Settings.cfg_holder, Settings.bootcount, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
@ -661,7 +661,7 @@ void CmndGlobalTemp(void)
|
|||||||
}
|
}
|
||||||
if ((temperature >= -50.0f) && (temperature <= 100.0f)) {
|
if ((temperature >= -50.0f) && (temperature <= 100.0f)) {
|
||||||
ConvertTemp(temperature);
|
ConvertTemp(temperature);
|
||||||
global_update = 1; // Keep global values just entered valid
|
TasmotaGlobal.global_update = 1; // Keep global values just entered valid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndFloat(global_temperature_celsius, 1);
|
ResponseCmndFloat(global_temperature_celsius, 1);
|
||||||
@ -673,7 +673,7 @@ void CmndGlobalHum(void)
|
|||||||
float humidity = CharToFloat(XdrvMailbox.data);
|
float humidity = CharToFloat(XdrvMailbox.data);
|
||||||
if ((humidity >= 0.0) && (humidity <= 100.0)) {
|
if ((humidity >= 0.0) && (humidity <= 100.0)) {
|
||||||
ConvertHumidity(humidity);
|
ConvertHumidity(humidity);
|
||||||
global_update = 1; // Keep global values just entered valid
|
TasmotaGlobal.global_update = 1; // Keep global values just entered valid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndFloat(global_humidity, 1);
|
ResponseCmndFloat(global_humidity, 1);
|
||||||
@ -805,7 +805,9 @@ void CmndBlinktime(void)
|
|||||||
{
|
{
|
||||||
if ((XdrvMailbox.payload > 1) && (XdrvMailbox.payload <= 3600)) {
|
if ((XdrvMailbox.payload > 1) && (XdrvMailbox.payload <= 3600)) {
|
||||||
Settings.blinktime = XdrvMailbox.payload;
|
Settings.blinktime = XdrvMailbox.payload;
|
||||||
if (blink_timer > 0) { blink_timer = millis() + (100 * XdrvMailbox.payload); }
|
if (TasmotaGlobal.blink_timer > 0) {
|
||||||
|
TasmotaGlobal.blink_timer = millis() + (100 * XdrvMailbox.payload);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndNumber(Settings.blinktime);
|
ResponseCmndNumber(Settings.blinktime);
|
||||||
}
|
}
|
||||||
@ -1340,10 +1342,10 @@ void CmndBaudrate(void)
|
|||||||
{
|
{
|
||||||
if (XdrvMailbox.payload >= 300) {
|
if (XdrvMailbox.payload >= 300) {
|
||||||
XdrvMailbox.payload /= 300; // Make it a valid baudrate
|
XdrvMailbox.payload /= 300; // Make it a valid baudrate
|
||||||
baudrate = (XdrvMailbox.payload & 0xFFFF) * 300;
|
TasmotaGlobal.baudrate = (XdrvMailbox.payload & 0xFFFF) * 300;
|
||||||
SetSerialBaudrate(baudrate);
|
SetSerialBaudrate(TasmotaGlobal.baudrate);
|
||||||
}
|
}
|
||||||
ResponseCmndNumber(baudrate);
|
ResponseCmndNumber(TasmotaGlobal.baudrate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CmndSerialConfig(void)
|
void CmndSerialConfig(void)
|
||||||
|
@ -225,7 +225,7 @@ uint32_t UpTime(void)
|
|||||||
if (Rtc.restart_time) {
|
if (Rtc.restart_time) {
|
||||||
return Rtc.utc_time - Rtc.restart_time;
|
return Rtc.utc_time - Rtc.restart_time;
|
||||||
} else {
|
} else {
|
||||||
return uptime;
|
return TasmotaGlobal.uptime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,11 +380,11 @@ void RtcSecond(void)
|
|||||||
|
|
||||||
if (!Rtc.user_time_entry) {
|
if (!Rtc.user_time_entry) {
|
||||||
if (!global_state.network_down) {
|
if (!global_state.network_down) {
|
||||||
uint8_t uptime_minute = (uptime / 60) % 60; // 0 .. 59
|
uint8_t uptime_minute = (TasmotaGlobal.uptime / 60) % 60; // 0 .. 59
|
||||||
if ((Rtc.ntp_sync_minute > 59) && (uptime_minute > 2)) {
|
if ((Rtc.ntp_sync_minute > 59) && (uptime_minute > 2)) {
|
||||||
Rtc.ntp_sync_minute = 1; // If sync prepare for a new cycle
|
Rtc.ntp_sync_minute = 1; // If sync prepare for a new cycle
|
||||||
}
|
}
|
||||||
uint8_t offset = (uptime < 30) ? RtcTime.second : (((ESP_getChipId() & 0xF) * 3) + 3) ; // First try ASAP to sync. If fails try once every 60 seconds based on chip id
|
uint8_t offset = (TasmotaGlobal.uptime < 30) ? RtcTime.second : (((ESP_getChipId() & 0xF) * 3) + 3) ; // First try ASAP to sync. If fails try once every 60 seconds based on chip id
|
||||||
if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced
|
if ( (((offset == RtcTime.second) && ( (RtcTime.year < 2016) || // Never synced
|
||||||
(Rtc.ntp_sync_minute == uptime_minute))) || // Re-sync every hour
|
(Rtc.ntp_sync_minute == uptime_minute))) || // Re-sync every hour
|
||||||
ntp_force_sync ) ) { // Forced sync
|
ntp_force_sync ) ) { // Forced sync
|
||||||
@ -395,7 +395,7 @@ void RtcSecond(void)
|
|||||||
Rtc.last_sync = Rtc.ntp_time;
|
Rtc.last_sync = Rtc.ntp_time;
|
||||||
Rtc.ntp_sync_minute = 60; // Sync so block further requests
|
Rtc.ntp_sync_minute = 60; // Sync so block further requests
|
||||||
if (Rtc.restart_time == 0) {
|
if (Rtc.restart_time == 0) {
|
||||||
Rtc.restart_time = Rtc.utc_time - uptime; // save first ntp time as restart time
|
Rtc.restart_time = Rtc.utc_time - TasmotaGlobal.uptime; // save first ntp time as restart time
|
||||||
}
|
}
|
||||||
BreakTime(Rtc.utc_time, tmpTime);
|
BreakTime(Rtc.utc_time, tmpTime);
|
||||||
RtcTime.year = tmpTime.year + 1970;
|
RtcTime.year = tmpTime.year + 1970;
|
||||||
|
@ -88,7 +88,7 @@ bool SwitchState(uint32_t index)
|
|||||||
|
|
||||||
void SwitchProbe(void)
|
void SwitchProbe(void)
|
||||||
{
|
{
|
||||||
if (uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
if (TasmotaGlobal.uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
||||||
|
|
||||||
uint8_t state_filter;
|
uint8_t state_filter;
|
||||||
uint8_t debounce_flags = Settings.switch_debounce % 10;
|
uint8_t debounce_flags = Settings.switch_debounce % 10;
|
||||||
@ -232,7 +232,7 @@ void SwitchInit(void)
|
|||||||
|
|
||||||
void SwitchHandler(uint8_t mode)
|
void SwitchHandler(uint8_t mode)
|
||||||
{
|
{
|
||||||
if (uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
if (TasmotaGlobal.uptime < 4) { return; } // Block GPIO for 4 seconds after poweron to workaround Wemos D1 / Obi RTS circuit
|
||||||
|
|
||||||
uint16_t loops_per_second = 1000 / Settings.switch_debounce;
|
uint16_t loops_per_second = 1000 / Settings.switch_debounce;
|
||||||
|
|
||||||
|
@ -421,12 +421,12 @@ void SetLedLink(uint32_t state)
|
|||||||
|
|
||||||
void SetPulseTimer(uint32_t index, uint32_t time)
|
void SetPulseTimer(uint32_t index, uint32_t time)
|
||||||
{
|
{
|
||||||
pulse_timer[index] = (time > 111) ? millis() + (1000 * (time - 100)) : (time > 0) ? millis() + (100 * time) : 0L;
|
TasmotaGlobal.pulse_timer[index] = (time > 111) ? millis() + (1000 * (time - 100)) : (time > 0) ? millis() + (100 * time) : 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t GetPulseTimer(uint32_t index)
|
uint32_t GetPulseTimer(uint32_t index)
|
||||||
{
|
{
|
||||||
long time = TimePassedSince(pulse_timer[index]);
|
long time = TimePassedSince(TasmotaGlobal.pulse_timer[index]);
|
||||||
if (time < 0) {
|
if (time < 0) {
|
||||||
time *= -1;
|
time *= -1;
|
||||||
return (time > 11100) ? (time / 1000) + 100 : (time > 0) ? time / 100 : 0;
|
return (time > 11100) ? (time / 1000) + 100 : (time > 0) ? time / 100 : 0;
|
||||||
@ -606,7 +606,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t 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 = millis() + 100;
|
TasmotaGlobal.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);
|
||||||
@ -669,7 +669,7 @@ void MqttShowState(void)
|
|||||||
|
|
||||||
ResponseAppend_P(PSTR(",\"" D_JSON_HEAPSIZE "\":%d,\"SleepMode\":\"%s\",\"Sleep\":%u,\"LoadAvg\":%u,\"MqttCount\":%u"),
|
ResponseAppend_P(PSTR(",\"" D_JSON_HEAPSIZE "\":%d,\"SleepMode\":\"%s\",\"Sleep\":%u,\"LoadAvg\":%u,\"MqttCount\":%u"),
|
||||||
ESP_getFreeHeap()/1024, GetTextIndexed(stemp1, sizeof(stemp1), Settings.flag3.sleep_normal, kSleepMode), // SetOption60 - Enable normal sleep instead of dynamic sleep
|
ESP_getFreeHeap()/1024, GetTextIndexed(stemp1, sizeof(stemp1), Settings.flag3.sleep_normal, kSleepMode), // SetOption60 - Enable normal sleep instead of dynamic sleep
|
||||||
ssleep, loop_load_avg, MqttConnectCount());
|
ssleep, TasmotaGlobal.loop_load_avg, MqttConnectCount());
|
||||||
|
|
||||||
for (uint32_t i = 1; i <= devices_present; i++) {
|
for (uint32_t i = 1; i <= devices_present; i++) {
|
||||||
#ifdef USE_LIGHT
|
#ifdef USE_LIGHT
|
||||||
@ -789,13 +789,13 @@ void MqttPublishSensor(void)
|
|||||||
|
|
||||||
void PerformEverySecond(void)
|
void PerformEverySecond(void)
|
||||||
{
|
{
|
||||||
uptime++;
|
TasmotaGlobal.uptime++;
|
||||||
|
|
||||||
if (POWER_CYCLE_TIME == uptime) {
|
if (POWER_CYCLE_TIME == TasmotaGlobal.uptime) {
|
||||||
UpdateQuickPowerCycle(false);
|
UpdateQuickPowerCycle(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BOOT_LOOP_TIME == uptime) {
|
if (BOOT_LOOP_TIME == TasmotaGlobal.uptime) {
|
||||||
RtcRebootReset();
|
RtcRebootReset();
|
||||||
|
|
||||||
#ifdef USE_DEEPSLEEP
|
#ifdef USE_DEEPSLEEP
|
||||||
@ -867,8 +867,8 @@ void PerformEverySecond(void)
|
|||||||
wifiKeepAlive();
|
wifiKeepAlive();
|
||||||
|
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
if (11 == uptime) { // Perform one-time ESP32 houskeeping
|
if (11 == TasmotaGlobal.uptime) { // Perform one-time ESP32 houskeeping
|
||||||
ESP_getSketchSize(); // Init sketchsize as it can take up to 2 seconds
|
ESP_getSketchSize(); // Init sketchsize as it can take up to 2 seconds
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -892,9 +892,9 @@ void Every100mSeconds(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) {
|
for (uint32_t i = 0; i < MAX_PULSETIMERS; i++) {
|
||||||
if (pulse_timer[i] != 0L) { // Timer active?
|
if (TasmotaGlobal.pulse_timer[i] != 0L) { // Timer active?
|
||||||
if (TimeReached(pulse_timer[i])) { // Timer finished?
|
if (TimeReached(TasmotaGlobal.pulse_timer[i])) { // Timer finished?
|
||||||
pulse_timer[i] = 0L; // Turn off this timer
|
TasmotaGlobal.pulse_timer[i] = 0L; // Turn off this timer
|
||||||
for (uint32_t j = 0; j < devices_present; j = j +MAX_PULSETIMERS) {
|
for (uint32_t j = 0; j < devices_present; j = j +MAX_PULSETIMERS) {
|
||||||
ExecuteCommandPower(i + j +1, (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate) ? POWER_ON : POWER_OFF, SRC_PULSETIMER);
|
ExecuteCommandPower(i + j +1, (POWER_ALL_OFF_PULSETIME_ON == Settings.poweronstate) ? POWER_ON : POWER_OFF, SRC_PULSETIMER);
|
||||||
}
|
}
|
||||||
@ -903,8 +903,8 @@ void Every100mSeconds(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (blink_mask) {
|
if (blink_mask) {
|
||||||
if (TimeReached(blink_timer)) {
|
if (TimeReached(TasmotaGlobal.blink_timer)) {
|
||||||
SetNextTimeInterval(blink_timer, 100 * Settings.blinktime);
|
SetNextTimeInterval(TasmotaGlobal.blink_timer, 100 * Settings.blinktime);
|
||||||
blink_counter--;
|
blink_counter--;
|
||||||
if (!blink_counter) {
|
if (!blink_counter) {
|
||||||
StopAllPowerBlink();
|
StopAllPowerBlink();
|
||||||
|
@ -520,7 +520,7 @@ void WifiCheck(uint8_t param)
|
|||||||
#endif // LWIP_IPV6=1
|
#endif // LWIP_IPV6=1
|
||||||
WifiSetState(1);
|
WifiSetState(1);
|
||||||
if (Settings.flag3.use_wifi_rescan) { // SetOption57 - Scan wifi network every 44 minutes for configured AP's
|
if (Settings.flag3.use_wifi_rescan) { // SetOption57 - Scan wifi network every 44 minutes for configured AP's
|
||||||
if (!(uptime % (60 * WIFI_RESCAN_MINUTES))) {
|
if (!(TasmotaGlobal.uptime % (60 * WIFI_RESCAN_MINUTES))) {
|
||||||
Wifi.scan_state = 2;
|
Wifi.scan_state = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,14 +77,18 @@
|
|||||||
|
|
||||||
WiFiUDP PortUdp; // UDP Syslog and Alexa
|
WiFiUDP PortUdp; // UDP Syslog and Alexa
|
||||||
|
|
||||||
uint32_t pulse_timer[MAX_PULSETIMERS] = { 0 }; // Power off timer
|
struct {
|
||||||
uint32_t blink_timer = 0; // Power cycle timer
|
uint32_t baudrate; // Current Serial baudrate
|
||||||
uint32_t backlog_delay = 0; // Command backlog delay
|
uint32_t pulse_timer[MAX_PULSETIMERS]; // Power off timer
|
||||||
uint32_t uptime = 0; // Counting every second until 4294967295 = 130 year
|
uint32_t blink_timer; // Power cycle timer
|
||||||
uint32_t loop_load_avg = 0; // Indicative loop load average
|
uint32_t backlog_delay; // Command backlog delay
|
||||||
uint32_t global_update = 0; // Timestamp of last global temperature and humidity update
|
uint32_t loop_load_avg; // Indicative loop load average
|
||||||
uint32_t web_log_index = 1; // Index in Web log buffer (should never be 0)
|
uint32_t global_update; // Timestamp of last global temperature and humidity update
|
||||||
uint32_t baudrate = APP_BAUDRATE; // Current Serial baudrate
|
uint32_t web_log_index; // Index in Web log buffer
|
||||||
|
uint32_t uptime; // Counting every second until 4294967295 = 130 year
|
||||||
|
|
||||||
|
} TasmotaGlobal;
|
||||||
|
|
||||||
power_t power = 0; // Current copy of Settings.power
|
power_t power = 0; // Current copy of Settings.power
|
||||||
power_t last_power = 0; // Last power set state
|
power_t last_power = 0; // Last power set state
|
||||||
power_t blink_power; // Blink power state
|
power_t blink_power; // Blink power state
|
||||||
@ -177,6 +181,9 @@ void setup(void) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
memset(&TasmotaGlobal, 0, sizeof(TasmotaGlobal));
|
||||||
|
TasmotaGlobal.baudrate = APP_BAUDRATE;
|
||||||
|
|
||||||
global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
global_state.data = 0xF; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
||||||
|
|
||||||
RtcRebootLoad();
|
RtcRebootLoad();
|
||||||
@ -190,7 +197,7 @@ void setup(void) {
|
|||||||
#endif
|
#endif
|
||||||
RtcRebootSave();
|
RtcRebootSave();
|
||||||
|
|
||||||
Serial.begin(baudrate);
|
Serial.begin(TasmotaGlobal.baudrate);
|
||||||
// Serial.setRxBufferSize(INPUT_BUFFER_SIZE); // Default is 256 chars
|
// Serial.setRxBufferSize(INPUT_BUFFER_SIZE); // Default is 256 chars
|
||||||
seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded
|
seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded
|
||||||
|
|
||||||
@ -229,6 +236,8 @@ void setup(void) {
|
|||||||
#endif
|
#endif
|
||||||
#endif // USE_EMULATION
|
#endif // USE_EMULATION
|
||||||
|
|
||||||
|
// AddLogBuffer(LOG_LEVEL_DEBUG, (uint8_t*)&TasmotaGlobal, sizeof(TasmotaGlobal));
|
||||||
|
|
||||||
if (Settings.param[P_BOOT_LOOP_OFFSET]) { // SetOption36
|
if (Settings.param[P_BOOT_LOOP_OFFSET]) { // SetOption36
|
||||||
// Disable functionality as possible cause of fast restart within BOOT_LOOP_TIME seconds (Exception, WDT or restarts)
|
// Disable functionality as possible cause of fast restart within BOOT_LOOP_TIME seconds (Exception, WDT or restarts)
|
||||||
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET]) { // Restart twice
|
if (RtcReboot.fast_reboot_count > Settings.param[P_BOOT_LOOP_OFFSET]) { // Restart twice
|
||||||
@ -297,7 +306,7 @@ void setup(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BacklogLoop(void) {
|
void BacklogLoop(void) {
|
||||||
if (TimeReached(backlog_delay)) {
|
if (TimeReached(TasmotaGlobal.backlog_delay)) {
|
||||||
if (!BACKLOG_EMPTY && !backlog_mutex) {
|
if (!BACKLOG_EMPTY && !backlog_mutex) {
|
||||||
backlog_mutex = true;
|
backlog_mutex = true;
|
||||||
bool nodelay = false;
|
bool nodelay = false;
|
||||||
@ -315,8 +324,12 @@ void BacklogLoop(void) {
|
|||||||
nodelay_detected = !strncasecmp_P(cmd.c_str(), PSTR(D_CMND_NODELAY), strlen(D_CMND_NODELAY));
|
nodelay_detected = !strncasecmp_P(cmd.c_str(), PSTR(D_CMND_NODELAY), strlen(D_CMND_NODELAY));
|
||||||
if (nodelay_detected) { nodelay = true; }
|
if (nodelay_detected) { nodelay = true; }
|
||||||
} while (!BACKLOG_EMPTY && nodelay_detected);
|
} while (!BACKLOG_EMPTY && nodelay_detected);
|
||||||
if (!nodelay_detected) { ExecuteCommand((char*)cmd.c_str(), SRC_BACKLOG); }
|
if (!nodelay_detected) {
|
||||||
if (nodelay) { backlog_delay = 0; } // Reset backlog_delay which has been set by ExecuteCommand (CommandHandler)
|
ExecuteCommand((char*)cmd.c_str(), SRC_BACKLOG);
|
||||||
|
}
|
||||||
|
if (nodelay) {
|
||||||
|
TasmotaGlobal.backlog_delay = 0; // Reset backlog_delay which has been set by ExecuteCommand (CommandHandler)
|
||||||
|
}
|
||||||
backlog_mutex = false;
|
backlog_mutex = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -408,5 +421,5 @@ void loop(void) {
|
|||||||
if (!loop_delay) { loop_delay++; } // We cannot divide by 0
|
if (!loop_delay) { loop_delay++; } // We cannot divide by 0
|
||||||
uint32_t loops_per_second = 1000 / loop_delay; // We need to keep track of this many loops per second
|
uint32_t loops_per_second = 1000 / loop_delay; // We need to keep track of this many loops per second
|
||||||
uint32_t this_cycle_ratio = 100 * my_activity / loop_delay;
|
uint32_t this_cycle_ratio = 100 * my_activity / loop_delay;
|
||||||
loop_load_avg = loop_load_avg - (loop_load_avg / loops_per_second) + (this_cycle_ratio / loops_per_second); // Take away one loop average away and add the new one
|
TasmotaGlobal.loop_load_avg = TasmotaGlobal.loop_load_avg - (TasmotaGlobal.loop_load_avg / loops_per_second) + (this_cycle_ratio / loops_per_second); // Take away one loop average away and add the new one
|
||||||
}
|
}
|
||||||
|
@ -3029,11 +3029,11 @@ void HandleHttpCommand(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
WSContentBegin(200, CT_JSON);
|
WSContentBegin(200, CT_JSON);
|
||||||
uint32_t curridx = web_log_index;
|
uint32_t curridx = TasmotaGlobal.web_log_index;
|
||||||
String svalue = Webserver->arg("cmnd");
|
String svalue = Webserver->arg("cmnd");
|
||||||
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
if (svalue.length() && (svalue.length() < MQTT_MAX_PACKET_SIZE)) {
|
||||||
ExecuteWebCommand((char*)svalue.c_str(), SRC_WEBCOMMAND);
|
ExecuteWebCommand((char*)svalue.c_str(), SRC_WEBCOMMAND);
|
||||||
if (web_log_index != curridx) {
|
if (TasmotaGlobal.web_log_index != curridx) {
|
||||||
uint32_t counter = curridx;
|
uint32_t counter = curridx;
|
||||||
WSContentSend_P(PSTR("{"));
|
WSContentSend_P(PSTR("{"));
|
||||||
bool cflg = false;
|
bool cflg = false;
|
||||||
@ -3056,7 +3056,7 @@ void HandleHttpCommand(void)
|
|||||||
counter++;
|
counter++;
|
||||||
counter &= 0xFF;
|
counter &= 0xFF;
|
||||||
if (!counter) counter++; // Skip 0 as it is not allowed
|
if (!counter) counter++; // Skip 0 as it is not allowed
|
||||||
} while (counter != web_log_index);
|
} while (counter != TasmotaGlobal.web_log_index);
|
||||||
WSContentSend_P(PSTR("}"));
|
WSContentSend_P(PSTR("}"));
|
||||||
} else {
|
} else {
|
||||||
WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}"));
|
WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}"));
|
||||||
@ -3104,14 +3104,14 @@ void HandleConsoleRefresh(void)
|
|||||||
if (strlen(stmp)) { counter = atoi(stmp); }
|
if (strlen(stmp)) { counter = atoi(stmp); }
|
||||||
|
|
||||||
WSContentBegin(200, CT_PLAIN);
|
WSContentBegin(200, CT_PLAIN);
|
||||||
WSContentSend_P(PSTR("%d}1%d}1"), web_log_index, Web.reset_web_log_flag);
|
WSContentSend_P(PSTR("%d}1%d}1"), TasmotaGlobal.web_log_index, Web.reset_web_log_flag);
|
||||||
if (!Web.reset_web_log_flag) {
|
if (!Web.reset_web_log_flag) {
|
||||||
counter = 0;
|
counter = 0;
|
||||||
Web.reset_web_log_flag = true;
|
Web.reset_web_log_flag = true;
|
||||||
}
|
}
|
||||||
if (counter != web_log_index) {
|
if (counter != TasmotaGlobal.web_log_index) {
|
||||||
if (!counter) {
|
if (!counter) {
|
||||||
counter = web_log_index;
|
counter = TasmotaGlobal.web_log_index;
|
||||||
cflg = false;
|
cflg = false;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
@ -3128,7 +3128,7 @@ void HandleConsoleRefresh(void)
|
|||||||
counter++;
|
counter++;
|
||||||
counter &= 0xFF;
|
counter &= 0xFF;
|
||||||
if (!counter) { counter++; } // Skip log index 0 as it is not allowed
|
if (!counter) { counter++; } // Skip log index 0 as it is not allowed
|
||||||
} while (counter != web_log_index);
|
} while (counter != TasmotaGlobal.web_log_index);
|
||||||
}
|
}
|
||||||
WSContentSend_P(PSTR("}1"));
|
WSContentSend_P(PSTR("}1"));
|
||||||
WSContentEnd();
|
WSContentEnd();
|
||||||
|
@ -338,6 +338,8 @@ void EnergyMarginCheck(void)
|
|||||||
for (uint32_t phase = 0; phase < Energy.phase_count; phase++) {
|
for (uint32_t phase = 0; phase < Energy.phase_count; phase++) {
|
||||||
uint16_t active_power = (uint16_t)(Energy.active_power[phase]);
|
uint16_t active_power = (uint16_t)(Energy.active_power[phase]);
|
||||||
|
|
||||||
|
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("NRG: APower %d, HPower0 %d, HPower1 %d, HPower2 %d"), active_power, Energy.power_history[phase][0], Energy.power_history[phase][1], Energy.power_history[phase][2]);
|
||||||
|
|
||||||
if (Settings.energy_power_delta[phase]) {
|
if (Settings.energy_power_delta[phase]) {
|
||||||
power_diff[phase] = active_power - Energy.power_history[phase][0];
|
power_diff[phase] = active_power - Energy.power_history[phase][0];
|
||||||
uint16_t delta = abs(power_diff[phase]);
|
uint16_t delta = abs(power_diff[phase]);
|
||||||
@ -502,7 +504,7 @@ void EnergyMqttShow(void)
|
|||||||
void EnergyEverySecond(void)
|
void EnergyEverySecond(void)
|
||||||
{
|
{
|
||||||
// Overtemp check
|
// Overtemp check
|
||||||
if (global_update) {
|
if (TasmotaGlobal.global_update) {
|
||||||
if (power && !isnan(global_temperature_celsius) && (global_temperature_celsius > (float)Settings.param[P_OVER_TEMP])) { // Device overtemp, turn off relays
|
if (power && !isnan(global_temperature_celsius) && (global_temperature_celsius > (float)Settings.param[P_OVER_TEMP])) { // Device overtemp, turn off relays
|
||||||
|
|
||||||
char temperature[33];
|
char temperature[33];
|
||||||
|
@ -177,7 +177,7 @@ void ApplyTimerOffsets(Timer *duskdawn)
|
|||||||
if (hour[mode]==255) {
|
if (hour[mode]==255) {
|
||||||
// Permanent day/night sets the unreachable limit values
|
// Permanent day/night sets the unreachable limit values
|
||||||
if ((Settings.latitude > 0) != (RtcTime.month>=4 && RtcTime.month<=9)) {
|
if ((Settings.latitude > 0) != (RtcTime.month>=4 && RtcTime.month<=9)) {
|
||||||
duskdawn->time=2046; // permanent night
|
duskdawn->time=2046; // permanent night
|
||||||
} else {
|
} else {
|
||||||
duskdawn->time=2047; // permanent day
|
duskdawn->time=2047; // permanent day
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ void TimerEverySecond(void)
|
|||||||
if (RtcTime.valid) {
|
if (RtcTime.valid) {
|
||||||
if (!RtcTime.hour && !RtcTime.minute && !RtcTime.second) { TimerSetRandomWindows(); } // Midnight
|
if (!RtcTime.hour && !RtcTime.minute && !RtcTime.second) { TimerSetRandomWindows(); } // Midnight
|
||||||
if (Settings.flag3.timers_enable && // CMND_TIMERS
|
if (Settings.flag3.timers_enable && // CMND_TIMERS
|
||||||
(uptime > 60) && (RtcTime.minute != timer_last_minute)) { // Execute from one minute after restart every minute only once
|
(TasmotaGlobal.uptime > 60) && (RtcTime.minute != timer_last_minute)) { // Execute from one minute after restart every minute only once
|
||||||
timer_last_minute = RtcTime.minute;
|
timer_last_minute = RtcTime.minute;
|
||||||
int32_t time = (RtcTime.hour *60) + RtcTime.minute;
|
int32_t time = (RtcTime.hour *60) + RtcTime.minute;
|
||||||
uint8_t days = 1 << (RtcTime.day_of_week -1);
|
uint8_t days = 1 << (RtcTime.day_of_week -1);
|
||||||
|
@ -947,7 +947,7 @@ uint8_t rules_xsns_index = 0;
|
|||||||
|
|
||||||
void RulesEvery100ms(void)
|
void RulesEvery100ms(void)
|
||||||
{
|
{
|
||||||
if (Settings.rule_enabled && !Rules.busy && (uptime > 4)) { // Any rule enabled and allow 4 seconds start-up time for sensors (#3811)
|
if (Settings.rule_enabled && !Rules.busy && (TasmotaGlobal.uptime > 4)) { // Any rule enabled and allow 4 seconds start-up time for sensors (#3811)
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
int tele_period_save = tele_period;
|
int tele_period_save = tele_period;
|
||||||
tele_period = 2; // Do not allow HA updates during next function call
|
tele_period = 2; // Do not allow HA updates during next function call
|
||||||
@ -967,7 +967,7 @@ void RulesEverySecond(void)
|
|||||||
char json_event[120];
|
char json_event[120];
|
||||||
|
|
||||||
if (RtcTime.valid) {
|
if (RtcTime.valid) {
|
||||||
if ((uptime > 60) && (RtcTime.minute != Rules.last_minute)) { // Execute from one minute after restart every minute only once
|
if ((TasmotaGlobal.uptime > 60) && (RtcTime.minute != Rules.last_minute)) { // Execute from one minute after restart every minute only once
|
||||||
Rules.last_minute = RtcTime.minute;
|
Rules.last_minute = RtcTime.minute;
|
||||||
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Time\":{\"Minute\":%d}}"), MinutesPastMidnight());
|
snprintf_P(json_event, sizeof(json_event), PSTR("{\"Time\":{\"Minute\":%d}}"), MinutesPastMidnight());
|
||||||
RulesProcessEvent(json_event);
|
RulesProcessEvent(json_event);
|
||||||
|
@ -3012,7 +3012,7 @@ chknext:
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (!strncmp(vname, "upsecs", 6)) {
|
if (!strncmp(vname, "upsecs", 6)) {
|
||||||
fvar = uptime;
|
fvar = TasmotaGlobal.uptime;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (!strncmp(vname, "upd[", 4)) {
|
if (!strncmp(vname, "upd[", 4)) {
|
||||||
@ -4495,7 +4495,7 @@ uint8_t script_xsns_index = 0;
|
|||||||
|
|
||||||
void ScripterEvery100ms(void) {
|
void ScripterEvery100ms(void) {
|
||||||
|
|
||||||
if (Settings.rule_enabled && (uptime > 4)) {
|
if (Settings.rule_enabled && (TasmotaGlobal.uptime > 4)) {
|
||||||
mqtt_data[0] = '\0';
|
mqtt_data[0] = '\0';
|
||||||
uint16_t script_tele_period_save = tele_period;
|
uint16_t script_tele_period_save = tele_period;
|
||||||
tele_period = 2;
|
tele_period = 2;
|
||||||
|
@ -1019,7 +1019,7 @@ void HAssPublishStatus(void)
|
|||||||
"\"WiFi " D_JSON_LINK_COUNT "\":%d,\"WiFi " D_JSON_DOWNTIME "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"LoadAvg\":%lu}"),
|
"\"WiFi " D_JSON_LINK_COUNT "\":%d,\"WiFi " D_JSON_DOWNTIME "\":\"%s\",\"" D_JSON_MQTT_COUNT "\":%d,\"LoadAvg\":%lu}"),
|
||||||
my_version, my_image, GetBuildDateAndTime().c_str(), ModuleName().c_str(), GetResetReason().c_str(),
|
my_version, my_image, GetBuildDateAndTime().c_str(), ModuleName().c_str(), GetResetReason().c_str(),
|
||||||
GetUptime().c_str(), my_hostname, WiFi.localIP().toString().c_str(), WifiGetRssiAsQuality(WiFi.RSSI()),
|
GetUptime().c_str(), my_hostname, WiFi.localIP().toString().c_str(), WifiGetRssiAsQuality(WiFi.RSSI()),
|
||||||
WiFi.RSSI(), WifiLinkCount(), WifiDowntime().c_str(), MqttConnectCount(), loop_load_avg);
|
WiFi.RSSI(), WifiLinkCount(), WifiDowntime().c_str(), MqttConnectCount(), TasmotaGlobal.loop_load_avg);
|
||||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_HASS_STATE));
|
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_HASS_STATE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1123,7 +1123,7 @@ bool Xdrv16(uint8_t function)
|
|||||||
TuyaSendCmd(TUYA_CMD_HEARTBEAT);
|
TuyaSendCmd(TUYA_CMD_HEARTBEAT);
|
||||||
}
|
}
|
||||||
#ifdef USE_TUYA_TIME
|
#ifdef USE_TUYA_TIME
|
||||||
if (!(uptime % 60)) {
|
if (!(TasmotaGlobal.uptime % 60)) {
|
||||||
TuyaSetTime();
|
TuyaSetTime();
|
||||||
}
|
}
|
||||||
#endif //USE_TUYA_TIME
|
#endif //USE_TUYA_TIME
|
||||||
|
@ -182,7 +182,7 @@ bool Xdrv18(uint8_t function)
|
|||||||
case FUNC_EVERY_SECOND:
|
case FUNC_EVERY_SECOND:
|
||||||
if (ArmtronixSerial) {
|
if (ArmtronixSerial) {
|
||||||
if (Armtronix.wifi_state!=WifiState()) { ArmtronixSetWifiLed(); }
|
if (Armtronix.wifi_state!=WifiState()) { ArmtronixSetWifiLed(); }
|
||||||
if (uptime &1) {
|
if (TasmotaGlobal.uptime &1) {
|
||||||
ArmtronixSerial->println("Status");
|
ArmtronixSerial->println("Status");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,7 +233,7 @@ void SonoffIfanUpdate(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifan_restart_flag && (4 == uptime) && (SONOFF_IFAN02 == my_module_type)) { // Microcontroller needs 3 seconds before accepting commands
|
if (ifan_restart_flag && (4 == TasmotaGlobal.uptime) && (SONOFF_IFAN02 == my_module_type)) { // Microcontroller needs 3 seconds before accepting commands
|
||||||
ifan_restart_flag = false;
|
ifan_restart_flag = false;
|
||||||
SetDevicePower(1, SRC_RETRY); // Sync with default power on state microcontroller being Light ON and Fan OFF
|
SetDevicePower(1, SRC_RETRY); // Sync with default power on state microcontroller being Light ON and Fan OFF
|
||||||
SetDevicePower(power, SRC_RETRY); // Set required power on state
|
SetDevicePower(power, SRC_RETRY); // Set required power on state
|
||||||
|
@ -179,7 +179,7 @@ bool Xdrv26(uint8_t function)
|
|||||||
if (PinUsed(GPIO_ARIRFRCV)) { AriluxRfHandler(); }
|
if (PinUsed(GPIO_ARIRFRCV)) { AriluxRfHandler(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_EVERY_SECOND:
|
case FUNC_EVERY_SECOND:
|
||||||
if (10 == uptime) { AriluxRfInit(); } // Needs rest before enabling RF interrupts
|
if (10 == TasmotaGlobal.uptime) { AriluxRfInit(); } // Needs rest before enabling RF interrupts
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -522,8 +522,8 @@ void ShutterAllowPreStartProcedure(uint8_t i)
|
|||||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. var%d <99>=<%s>, max10s?"),i+i, rules_vars[i]);
|
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. var%d <99>=<%s>, max10s?"),i+i, rules_vars[i]);
|
||||||
rules_flag.shutter_moving = 1;
|
rules_flag.shutter_moving = 1;
|
||||||
XdrvRulesProcess();
|
XdrvRulesProcess();
|
||||||
uptime_Local = uptime;
|
uptime_Local = TasmotaGlobal.uptime;
|
||||||
while (uptime_Local+10 > uptime && (String)rules_vars[i] == "99") {
|
while (uptime_Local+10 > TasmotaGlobal.uptime && (String)rules_vars[i] == "99") {
|
||||||
loop();
|
loop();
|
||||||
}
|
}
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. Done"));
|
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Delay Start. Done"));
|
||||||
|
@ -367,7 +367,7 @@ int16_t ThermostatFahrenheitToCelsius(const int32_t deg, uint8_t conv_type) {
|
|||||||
void ThermostatSignalPreProcessingSlow(uint8_t ctr_output)
|
void ThermostatSignalPreProcessingSlow(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
// Update input sensor status
|
// Update input sensor status
|
||||||
if ((uptime - Thermostat[ctr_output].timestamp_temp_measured_update) > ((uint32_t)Thermostat[ctr_output].time_sens_lost * 60)) {
|
if ((TasmotaGlobal.uptime - Thermostat[ctr_output].timestamp_temp_measured_update) > ((uint32_t)Thermostat[ctr_output].time_sens_lost * 60)) {
|
||||||
Thermostat[ctr_output].status.sensor_alive = IFACE_OFF;
|
Thermostat[ctr_output].status.sensor_alive = IFACE_OFF;
|
||||||
Thermostat[ctr_output].temp_measured_gradient = 0;
|
Thermostat[ctr_output].temp_measured_gradient = 0;
|
||||||
Thermostat[ctr_output].temp_measured = 0;
|
Thermostat[ctr_output].temp_measured = 0;
|
||||||
@ -392,7 +392,7 @@ void ThermostatSignalProcessingFast(uint8_t ctr_output)
|
|||||||
Thermostat[ctr_output].status.status_input = (uint32_t)ThermostatInputStatus(Thermostat[ctr_output].status.input_switch_number);
|
Thermostat[ctr_output].status.status_input = (uint32_t)ThermostatInputStatus(Thermostat[ctr_output].status.input_switch_number);
|
||||||
// Update timestamp of last input
|
// Update timestamp of last input
|
||||||
if (Thermostat[ctr_output].status.status_input == IFACE_ON) {
|
if (Thermostat[ctr_output].status.status_input == IFACE_ON) {
|
||||||
Thermostat[ctr_output].timestamp_input_on = uptime;
|
Thermostat[ctr_output].timestamp_input_on = TasmotaGlobal.uptime;
|
||||||
}
|
}
|
||||||
// Update real status of the output
|
// Update real status of the output
|
||||||
Thermostat[ctr_output].status.status_output = (uint32_t)ThermostatOutputStatus(Thermostat[ctr_output].status.output_relay_number);
|
Thermostat[ctr_output].status.status_output = (uint32_t)ThermostatOutputStatus(Thermostat[ctr_output].status.output_relay_number);
|
||||||
@ -453,7 +453,7 @@ void ThermostatHybridCtrPhase(uint8_t ctr_output)
|
|||||||
// If ramp-up offtime counter has been initalized
|
// If ramp-up offtime counter has been initalized
|
||||||
// AND ramp-up offtime counter value reached
|
// AND ramp-up offtime counter value reached
|
||||||
if((Thermostat[ctr_output].time_ctr_checkpoint != 0)
|
if((Thermostat[ctr_output].time_ctr_checkpoint != 0)
|
||||||
&& (uptime >= Thermostat[ctr_output].time_ctr_checkpoint)) {
|
&& (TasmotaGlobal.uptime >= Thermostat[ctr_output].time_ctr_checkpoint)) {
|
||||||
// Reset pause period
|
// Reset pause period
|
||||||
Thermostat[ctr_output].time_ctr_checkpoint = 0;
|
Thermostat[ctr_output].time_ctr_checkpoint = 0;
|
||||||
// Reset timers
|
// Reset timers
|
||||||
@ -468,13 +468,13 @@ void ThermostatHybridCtrPhase(uint8_t ctr_output)
|
|||||||
// AND temp target has changed
|
// AND temp target has changed
|
||||||
// AND value of temp target - actual temperature bigger than threshold for heating and lower for cooling
|
// AND value of temp target - actual temperature bigger than threshold for heating and lower for cooling
|
||||||
// then go to ramp-up
|
// then go to ramp-up
|
||||||
if (((uptime - Thermostat[ctr_output].timestamp_output_off) > (60 * (uint32_t)Thermostat[ctr_output].time_allow_rampup))
|
if (((TasmotaGlobal.uptime - Thermostat[ctr_output].timestamp_output_off) > (60 * (uint32_t)Thermostat[ctr_output].time_allow_rampup))
|
||||||
&& (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
&& (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
&& ( ( (Thermostat[ctr_output].temp_target_level - Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_delta_in)
|
&& ( ( (Thermostat[ctr_output].temp_target_level - Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_delta_in)
|
||||||
&& (flag_heating))
|
&& (flag_heating))
|
||||||
|| ( (Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_target_level > Thermostat[ctr_output].temp_rampup_delta_in)
|
|| ( (Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_target_level > Thermostat[ctr_output].temp_rampup_delta_in)
|
||||||
&& (!flag_heating)))) {
|
&& (!flag_heating)))) {
|
||||||
Thermostat[ctr_output].timestamp_rampup_start = uptime;
|
Thermostat[ctr_output].timestamp_rampup_start = TasmotaGlobal.uptime;
|
||||||
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
||||||
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
||||||
Thermostat[ctr_output].time_rampup_deadtime = 0;
|
Thermostat[ctr_output].time_rampup_deadtime = 0;
|
||||||
@ -541,7 +541,7 @@ bool ThermostatStateManualToAuto(uint8_t ctr_output)
|
|||||||
// then go to automatic
|
// then go to automatic
|
||||||
if ((Thermostat[ctr_output].status.status_input == IFACE_OFF)
|
if ((Thermostat[ctr_output].status.status_input == IFACE_OFF)
|
||||||
&&(Thermostat[ctr_output].status.sensor_alive == IFACE_ON)
|
&&(Thermostat[ctr_output].status.sensor_alive == IFACE_ON)
|
||||||
&& ((uptime - Thermostat[ctr_output].timestamp_input_on) > ((uint32_t)Thermostat[ctr_output].time_manual_to_auto * 60))) {
|
&& ((TasmotaGlobal.uptime - Thermostat[ctr_output].timestamp_input_on) > ((uint32_t)Thermostat[ctr_output].time_manual_to_auto * 60))) {
|
||||||
change_state = true;
|
change_state = true;
|
||||||
}
|
}
|
||||||
return change_state;
|
return change_state;
|
||||||
@ -608,7 +608,7 @@ void ThermostatOutputRelay(uint8_t ctr_output, uint32_t command)
|
|||||||
ExecuteCommandPower(Thermostat[ctr_output].status.output_relay_number, POWER_OFF, SRC_THERMOSTAT);
|
ExecuteCommandPower(Thermostat[ctr_output].status.output_relay_number, POWER_OFF, SRC_THERMOSTAT);
|
||||||
}
|
}
|
||||||
//#endif // DEBUG_THERMOSTAT
|
//#endif // DEBUG_THERMOSTAT
|
||||||
Thermostat[ctr_output].timestamp_output_off = uptime;
|
Thermostat[ctr_output].timestamp_output_off = TasmotaGlobal.uptime;
|
||||||
Thermostat[ctr_output].status.status_output = IFACE_OFF;
|
Thermostat[ctr_output].status.status_output = IFACE_OFF;
|
||||||
#ifdef DEBUG_THERMOSTAT
|
#ifdef DEBUG_THERMOSTAT
|
||||||
ThermostatVirtualSwitch(ctr_output);
|
ThermostatVirtualSwitch(ctr_output);
|
||||||
@ -793,15 +793,15 @@ void ThermostatCalculatePI(uint8_t ctr_output)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Adjust output switch point
|
// Adjust output switch point
|
||||||
Thermostat[ctr_output].time_ctr_changepoint = uptime + (uint32_t)Thermostat[ctr_output].time_total_pi;
|
Thermostat[ctr_output].time_ctr_changepoint = TasmotaGlobal.uptime + (uint32_t)Thermostat[ctr_output].time_total_pi;
|
||||||
// Adjust next cycle point
|
// Adjust next cycle point
|
||||||
Thermostat[ctr_output].time_ctr_checkpoint = uptime + ((uint32_t)Thermostat[ctr_output].time_pi_cycle * 60);
|
Thermostat[ctr_output].time_ctr_checkpoint = TasmotaGlobal.uptime + ((uint32_t)Thermostat[ctr_output].time_pi_cycle * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
||||||
{
|
{
|
||||||
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
if ( (uptime >= Thermostat[ctr_output].time_ctr_checkpoint)
|
if ( (TasmotaGlobal.uptime >= Thermostat[ctr_output].time_ctr_checkpoint)
|
||||||
|| (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
|| (Thermostat[ctr_output].temp_target_level != Thermostat[ctr_output].temp_target_level_ctr)
|
||||||
|| ( (( (Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
|| ( (( (Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_target_level)
|
||||||
&& (Thermostat[ctr_output].temp_measured_gradient < 0)
|
&& (Thermostat[ctr_output].temp_measured_gradient < 0)
|
||||||
@ -815,7 +815,7 @@ void ThermostatWorkAutomaticPI(uint8_t ctr_output)
|
|||||||
// Reset cycle active
|
// Reset cycle active
|
||||||
Thermostat[ctr_output].status.status_cycle_active = CYCLE_OFF;
|
Thermostat[ctr_output].status.status_cycle_active = CYCLE_OFF;
|
||||||
}
|
}
|
||||||
if (uptime < Thermostat[ctr_output].time_ctr_changepoint) {
|
if (TasmotaGlobal.uptime < Thermostat[ctr_output].time_ctr_changepoint) {
|
||||||
Thermostat[ctr_output].status.status_cycle_active = CYCLE_ON;
|
Thermostat[ctr_output].status.status_cycle_active = CYCLE_ON;
|
||||||
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
||||||
}
|
}
|
||||||
@ -842,7 +842,7 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update time in ramp-up as well as delta temp
|
// Update time in ramp-up as well as delta temp
|
||||||
time_in_rampup = uptime - Thermostat[ctr_output].timestamp_rampup_start;
|
time_in_rampup = TasmotaGlobal.uptime - Thermostat[ctr_output].timestamp_rampup_start;
|
||||||
temp_delta_rampup = Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_rampup_start;
|
temp_delta_rampup = Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_rampup_start;
|
||||||
// Init command output status to true
|
// Init command output status to true
|
||||||
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
||||||
@ -873,14 +873,14 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
}
|
}
|
||||||
// Calculate absolute gradient since start of ramp-up (considering deadtime) in thousandths of º/hour
|
// Calculate absolute gradient since start of ramp-up (considering deadtime) in thousandths of º/hour
|
||||||
Thermostat[ctr_output].temp_rampup_meas_gradient = (int32_t)((360000 * (int32_t)temp_delta_rampup) / (int32_t)time_in_rampup);
|
Thermostat[ctr_output].temp_rampup_meas_gradient = (int32_t)((360000 * (int32_t)temp_delta_rampup) / (int32_t)time_in_rampup);
|
||||||
Thermostat[ctr_output].time_rampup_nextcycle = uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
Thermostat[ctr_output].time_rampup_nextcycle = TasmotaGlobal.uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
||||||
// Set auxiliary variables
|
// Set auxiliary variables
|
||||||
Thermostat[ctr_output].temp_rampup_cycle = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_cycle = Thermostat[ctr_output].temp_measured;
|
||||||
Thermostat[ctr_output].time_ctr_changepoint = uptime + (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max);
|
Thermostat[ctr_output].time_ctr_changepoint = TasmotaGlobal.uptime + (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max);
|
||||||
Thermostat[ctr_output].temp_rampup_output_off = Thermostat[ctr_output].temp_target_level_ctr;
|
Thermostat[ctr_output].temp_rampup_output_off = Thermostat[ctr_output].temp_target_level_ctr;
|
||||||
}
|
}
|
||||||
// Gradient calculation every time_rampup_cycle
|
// Gradient calculation every time_rampup_cycle
|
||||||
else if ((Thermostat[ctr_output].time_rampup_deadtime > 0) && (uptime >= Thermostat[ctr_output].time_rampup_nextcycle)) {
|
else if ((Thermostat[ctr_output].time_rampup_deadtime > 0) && (TasmotaGlobal.uptime >= Thermostat[ctr_output].time_rampup_nextcycle)) {
|
||||||
// Calculate temp. gradient in º/hour and set again time_rampup_nextcycle and temp_rampup_cycle
|
// Calculate temp. gradient in º/hour and set again time_rampup_nextcycle and temp_rampup_cycle
|
||||||
// temp_rampup_meas_gradient = ((3600 * temp_delta_rampup) / (os.time() - time_rampup_nextcycle))
|
// temp_rampup_meas_gradient = ((3600 * temp_delta_rampup) / (os.time() - time_rampup_nextcycle))
|
||||||
temp_delta_rampup = Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_rampup_cycle;
|
temp_delta_rampup = Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_rampup_cycle;
|
||||||
@ -902,7 +902,7 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
// y = (((y2-y1)/(x2-x1))*(x-x1)) + y1
|
// y = (((y2-y1)/(x2-x1))*(x-x1)) + y1
|
||||||
Thermostat[ctr_output].temp_rampup_output_off = (int16_t)(((int32_t)temp_delta_rampup * (int32_t)(Thermostat[ctr_output].time_ctr_changepoint - (uptime - (time_total_rampup)))) / (int32_t)(time_total_rampup * Thermostat[ctr_output].counter_rampup_cycles)) + Thermostat[ctr_output].temp_rampup_cycle;
|
Thermostat[ctr_output].temp_rampup_output_off = (int16_t)(((int32_t)temp_delta_rampup * (int32_t)(Thermostat[ctr_output].time_ctr_changepoint - (uptime - (time_total_rampup)))) / (int32_t)(time_total_rampup * Thermostat[ctr_output].counter_rampup_cycles)) + Thermostat[ctr_output].temp_rampup_cycle;
|
||||||
// Set auxiliary variables
|
// Set auxiliary variables
|
||||||
Thermostat[ctr_output].time_rampup_nextcycle = uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
Thermostat[ctr_output].time_rampup_nextcycle = TasmotaGlobal.uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
||||||
Thermostat[ctr_output].temp_rampup_cycle = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_cycle = Thermostat[ctr_output].temp_measured;
|
||||||
// Reset period counter
|
// Reset period counter
|
||||||
Thermostat[ctr_output].counter_rampup_cycles = 1;
|
Thermostat[ctr_output].counter_rampup_cycles = 1;
|
||||||
@ -911,9 +911,9 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
// Increase the period counter
|
// Increase the period counter
|
||||||
Thermostat[ctr_output].counter_rampup_cycles++;
|
Thermostat[ctr_output].counter_rampup_cycles++;
|
||||||
// Set another period
|
// Set another period
|
||||||
Thermostat[ctr_output].time_rampup_nextcycle = uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
Thermostat[ctr_output].time_rampup_nextcycle = TasmotaGlobal.uptime + ((uint32_t)Thermostat[ctr_output].time_rampup_cycle * 60);
|
||||||
// Reset time_ctr_changepoint and temp_rampup_output_off
|
// Reset time_ctr_changepoint and temp_rampup_output_off
|
||||||
Thermostat[ctr_output].time_ctr_changepoint = uptime + (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max) - time_in_rampup;
|
Thermostat[ctr_output].time_ctr_changepoint = TasmotaGlobal.uptime + (60 * (uint32_t)Thermostat[ctr_output].time_rampup_max) - time_in_rampup;
|
||||||
Thermostat[ctr_output].temp_rampup_output_off = Thermostat[ctr_output].temp_target_level_ctr;
|
Thermostat[ctr_output].temp_rampup_output_off = Thermostat[ctr_output].temp_target_level_ctr;
|
||||||
}
|
}
|
||||||
// Set time to get out of ramp-up
|
// Set time to get out of ramp-up
|
||||||
@ -927,7 +927,7 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
// or gradient is <= 0 for heating of >= 0 for cooling
|
// or gradient is <= 0 for heating of >= 0 for cooling
|
||||||
if ((Thermostat[ctr_output].time_rampup_deadtime == 0)
|
if ((Thermostat[ctr_output].time_rampup_deadtime == 0)
|
||||||
|| (Thermostat[ctr_output].time_ctr_checkpoint == 0)
|
|| (Thermostat[ctr_output].time_ctr_checkpoint == 0)
|
||||||
|| (uptime < Thermostat[ctr_output].time_ctr_changepoint)
|
|| (TasmotaGlobal.uptime < Thermostat[ctr_output].time_ctr_changepoint)
|
||||||
|| ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_output_off)
|
|| ( ((Thermostat[ctr_output].temp_measured < Thermostat[ctr_output].temp_rampup_output_off)
|
||||||
&& (flag_heating))
|
&& (flag_heating))
|
||||||
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_output_off)
|
|| ((Thermostat[ctr_output].temp_measured > Thermostat[ctr_output].temp_rampup_output_off)
|
||||||
@ -951,7 +951,7 @@ void ThermostatWorkAutomaticRampUp(uint8_t ctr_output)
|
|||||||
Thermostat[ctr_output].temp_pi_accum_error = Thermostat[ctr_output].temp_rampup_pi_acc_error;
|
Thermostat[ctr_output].temp_pi_accum_error = Thermostat[ctr_output].temp_rampup_pi_acc_error;
|
||||||
}
|
}
|
||||||
// Set to now time to get out of ramp-up
|
// Set to now time to get out of ramp-up
|
||||||
Thermostat[ctr_output].time_ctr_checkpoint = uptime;
|
Thermostat[ctr_output].time_ctr_checkpoint = TasmotaGlobal.uptime;
|
||||||
// Switch Off output
|
// Switch Off output
|
||||||
Thermostat[ctr_output].status.command_output = IFACE_OFF;
|
Thermostat[ctr_output].status.command_output = IFACE_OFF;
|
||||||
}
|
}
|
||||||
@ -971,7 +971,7 @@ void ThermostatPeakDetectorInit(uint8_t ctr_output)
|
|||||||
Thermostat[ctr_output].peak_ctr = 0;
|
Thermostat[ctr_output].peak_ctr = 0;
|
||||||
Thermostat[ctr_output].temp_abs_max_atune = 0;
|
Thermostat[ctr_output].temp_abs_max_atune = 0;
|
||||||
Thermostat[ctr_output].temp_abs_min_atune = 100;
|
Thermostat[ctr_output].temp_abs_min_atune = 100;
|
||||||
Thermostat[ctr_output].time_ctr_checkpoint = uptime + THERMOSTAT_TIME_MAX_AUTOTUNE;
|
Thermostat[ctr_output].time_ctr_checkpoint = TasmotaGlobal.uptime + THERMOSTAT_TIME_MAX_AUTOTUNE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThermostatPeakDetector(uint8_t ctr_output)
|
void ThermostatPeakDetector(uint8_t ctr_output)
|
||||||
@ -1020,7 +1020,7 @@ void ThermostatPeakDetector(uint8_t ctr_output)
|
|||||||
if ( (cond_peak_2)
|
if ( (cond_peak_2)
|
||||||
&& (abs(Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_peaks_atune[peak_num]) > Thermostat[ctr_output].temp_band_no_peak_det)) {
|
&& (abs(Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_peaks_atune[peak_num]) > Thermostat[ctr_output].temp_band_no_peak_det)) {
|
||||||
// Register peak timestamp;
|
// Register peak timestamp;
|
||||||
Thermostat[ctr_output].time_peak_timestamps_atune[peak_num] = (uptime / 60);
|
Thermostat[ctr_output].time_peak_timestamps_atune[peak_num] = (TasmotaGlobal.uptime / 60);
|
||||||
Thermostat[ctr_output].peak_ctr++;
|
Thermostat[ctr_output].peak_ctr++;
|
||||||
peak_transition = true;
|
peak_transition = true;
|
||||||
}
|
}
|
||||||
@ -1040,7 +1040,7 @@ void ThermostatPeakDetector(uint8_t ctr_output)
|
|||||||
&& (abs(Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_peaks_atune[peak_num]) > Thermostat[ctr_output].temp_band_no_peak_det)) {
|
&& (abs(Thermostat[ctr_output].temp_measured - Thermostat[ctr_output].temp_peaks_atune[peak_num]) > Thermostat[ctr_output].temp_band_no_peak_det)) {
|
||||||
// Calculate period
|
// Calculate period
|
||||||
// Register peak timestamp;
|
// Register peak timestamp;
|
||||||
Thermostat[ctr_output].time_peak_timestamps_atune[peak_num] = (uptime / 60);
|
Thermostat[ctr_output].time_peak_timestamps_atune[peak_num] = (TasmotaGlobal.uptime / 60);
|
||||||
Thermostat[ctr_output].peak_ctr++;
|
Thermostat[ctr_output].peak_ctr++;
|
||||||
peak_transition = true;
|
peak_transition = true;
|
||||||
}
|
}
|
||||||
@ -1117,17 +1117,17 @@ void ThermostatWorkAutomaticPIAutotune(uint8_t ctr_output)
|
|||||||
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
bool flag_heating = (Thermostat[ctr_output].status.climate_mode == CLIMATE_HEATING);
|
||||||
// If no timeout of the PI Autotune function
|
// If no timeout of the PI Autotune function
|
||||||
// AND no change in setpoint
|
// AND no change in setpoint
|
||||||
if ((uptime < Thermostat[ctr_output].time_ctr_checkpoint)
|
if ((TasmotaGlobal.uptime < Thermostat[ctr_output].time_ctr_checkpoint)
|
||||||
&&(Thermostat[ctr_output].temp_target_level_ctr == Thermostat[ctr_output].temp_target_level)) {
|
&&(Thermostat[ctr_output].temp_target_level_ctr == Thermostat[ctr_output].temp_target_level)) {
|
||||||
if (uptime >= Thermostat[ctr_output].time_ctr_checkpoint) {
|
if (TasmotaGlobal.uptime >= Thermostat[ctr_output].time_ctr_checkpoint) {
|
||||||
Thermostat[ctr_output].temp_target_level_ctr = Thermostat[ctr_output].temp_target_level;
|
Thermostat[ctr_output].temp_target_level_ctr = Thermostat[ctr_output].temp_target_level;
|
||||||
// Calculate time_ctr_changepoint
|
// Calculate time_ctr_changepoint
|
||||||
Thermostat[ctr_output].time_ctr_changepoint = uptime + (((uint32_t)Thermostat[ctr_output].time_pi_cycle * (uint32_t)Thermostat[ctr_output].dutycycle_step_autotune) / (uint32_t)100);
|
Thermostat[ctr_output].time_ctr_changepoint = TasmotaGlobal.uptime + (((uint32_t)Thermostat[ctr_output].time_pi_cycle * (uint32_t)Thermostat[ctr_output].dutycycle_step_autotune) / (uint32_t)100);
|
||||||
// Reset cycle active
|
// Reset cycle active
|
||||||
Thermostat[ctr_output].status.status_cycle_active = CYCLE_OFF;
|
Thermostat[ctr_output].status.status_cycle_active = CYCLE_OFF;
|
||||||
}
|
}
|
||||||
// Set Output On/Off depending on the changepoint
|
// Set Output On/Off depending on the changepoint
|
||||||
if (uptime < Thermostat[ctr_output].time_ctr_changepoint) {
|
if (TasmotaGlobal.uptime < Thermostat[ctr_output].time_ctr_changepoint) {
|
||||||
Thermostat[ctr_output].status.status_cycle_active = CYCLE_ON;
|
Thermostat[ctr_output].status.status_cycle_active = CYCLE_ON;
|
||||||
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
Thermostat[ctr_output].status.command_output = IFACE_ON;
|
||||||
}
|
}
|
||||||
@ -1318,7 +1318,7 @@ void ThermostatDebug(uint8_t ctr_output)
|
|||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_rampup_output_off: %s"), result_chr);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_rampup_output_off: %s"), result_chr);
|
||||||
dtostrfd(Thermostat[ctr_output].time_ctr_checkpoint, 0, result_chr);
|
dtostrfd(Thermostat[ctr_output].time_ctr_checkpoint, 0, result_chr);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_ctr_checkpoint: %s"), result_chr);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_ctr_checkpoint: %s"), result_chr);
|
||||||
dtostrfd(uptime, 0, result_chr);
|
dtostrfd(TasmotaGlobal.uptime, 0, result_chr);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("uptime: %s"), result_chr);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("uptime: %s"), result_chr);
|
||||||
dtostrfd(power, 0, result_chr);
|
dtostrfd(power, 0, result_chr);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("power: %s"), result_chr);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("power: %s"), result_chr);
|
||||||
@ -1341,7 +1341,7 @@ void ThermostatGetLocalSensor(uint8_t ctr_output) {
|
|||||||
if ( (value >= -1000)
|
if ( (value >= -1000)
|
||||||
&& (value <= 1000)
|
&& (value <= 1000)
|
||||||
&& (Thermostat[ctr_output].status.sensor_type == SENSOR_LOCAL)) {
|
&& (Thermostat[ctr_output].status.sensor_type == SENSOR_LOCAL)) {
|
||||||
uint32_t timestamp = uptime;
|
uint32_t timestamp = TasmotaGlobal.uptime;
|
||||||
// Calculate temperature gradient if temperature value has changed
|
// Calculate temperature gradient if temperature value has changed
|
||||||
if (value != Thermostat[ctr_output].temp_measured) {
|
if (value != Thermostat[ctr_output].temp_measured) {
|
||||||
int32_t temp_delta = (value - Thermostat[ctr_output].temp_measured); // in tenths of degrees
|
int32_t temp_delta = (value - Thermostat[ctr_output].temp_measured); // in tenths of degrees
|
||||||
@ -1385,7 +1385,7 @@ void CmndClimateModeSet(void)
|
|||||||
if ((value >= CLIMATE_HEATING) && (value < CLIMATE_MODES_MAX)) {
|
if ((value >= CLIMATE_HEATING) && (value < CLIMATE_MODES_MAX)) {
|
||||||
Thermostat[ctr_output].status.climate_mode = value;
|
Thermostat[ctr_output].status.climate_mode = value;
|
||||||
// Trigger a restart of the controller
|
// Trigger a restart of the controller
|
||||||
Thermostat[ctr_output].time_ctr_checkpoint = uptime;
|
Thermostat[ctr_output].time_ctr_checkpoint = TasmotaGlobal.uptime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndNumber((int)Thermostat[ctr_output].status.climate_mode);
|
ResponseCmndNumber((int)Thermostat[ctr_output].status.climate_mode);
|
||||||
@ -1428,7 +1428,7 @@ void CmndControllerModeSet(void)
|
|||||||
if ((value >= CTR_HYBRID) && (value < CTR_MODES_MAX)) {
|
if ((value >= CTR_HYBRID) && (value < CTR_MODES_MAX)) {
|
||||||
Thermostat[ctr_output].status.controller_mode = value;
|
Thermostat[ctr_output].status.controller_mode = value;
|
||||||
// Reset controller variables
|
// Reset controller variables
|
||||||
Thermostat[ctr_output].timestamp_rampup_start = uptime;
|
Thermostat[ctr_output].timestamp_rampup_start = TasmotaGlobal.uptime;
|
||||||
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
Thermostat[ctr_output].temp_rampup_start = Thermostat[ctr_output].temp_measured;
|
||||||
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
Thermostat[ctr_output].temp_rampup_meas_gradient = 0;
|
||||||
Thermostat[ctr_output].time_rampup_deadtime = 0;
|
Thermostat[ctr_output].time_rampup_deadtime = 0;
|
||||||
@ -1449,7 +1449,7 @@ void CmndInputSwitchSet(void)
|
|||||||
uint8_t value = (uint8_t)(XdrvMailbox.payload);
|
uint8_t value = (uint8_t)(XdrvMailbox.payload);
|
||||||
if (ThermostatSwitchIdValid(value)) {
|
if (ThermostatSwitchIdValid(value)) {
|
||||||
Thermostat[ctr_output].status.input_switch_number = value;
|
Thermostat[ctr_output].status.input_switch_number = value;
|
||||||
Thermostat[ctr_output].timestamp_input_on = uptime;
|
Thermostat[ctr_output].timestamp_input_on = TasmotaGlobal.uptime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ResponseCmndNumber((int)Thermostat[ctr_output].status.input_switch_number);
|
ResponseCmndNumber((int)Thermostat[ctr_output].status.input_switch_number);
|
||||||
@ -1538,7 +1538,7 @@ void CmndTempMeasuredSet(void)
|
|||||||
if ( (value >= -1000)
|
if ( (value >= -1000)
|
||||||
&& (value <= 1000)
|
&& (value <= 1000)
|
||||||
&& (Thermostat[ctr_output].status.sensor_type == SENSOR_MQTT)) {
|
&& (Thermostat[ctr_output].status.sensor_type == SENSOR_MQTT)) {
|
||||||
uint32_t timestamp = uptime;
|
uint32_t timestamp = TasmotaGlobal.uptime;
|
||||||
// Calculate temperature gradient if temperature value has changed
|
// Calculate temperature gradient if temperature value has changed
|
||||||
if (value != Thermostat[ctr_output].temp_measured) {
|
if (value != Thermostat[ctr_output].temp_measured) {
|
||||||
int32_t temp_delta = (value - Thermostat[ctr_output].temp_measured); // in tenths of degrees
|
int32_t temp_delta = (value - Thermostat[ctr_output].temp_measured); // in tenths of degrees
|
||||||
|
@ -289,9 +289,9 @@ void TelegramSendGetMe(void) {
|
|||||||
String TelegramExecuteCommand(const char *svalue) {
|
String TelegramExecuteCommand(const char *svalue) {
|
||||||
String response = "";
|
String response = "";
|
||||||
|
|
||||||
uint32_t curridx = web_log_index;
|
uint32_t curridx = TasmotaGlobal.web_log_index;
|
||||||
ExecuteCommand(svalue, SRC_CHAT);
|
ExecuteCommand(svalue, SRC_CHAT);
|
||||||
if (web_log_index != curridx) {
|
if (TasmotaGlobal.web_log_index != curridx) {
|
||||||
uint32_t counter = curridx;
|
uint32_t counter = curridx;
|
||||||
response = F("{");
|
response = F("{");
|
||||||
bool cflg = false;
|
bool cflg = false;
|
||||||
@ -315,7 +315,7 @@ String TelegramExecuteCommand(const char *svalue) {
|
|||||||
counter++;
|
counter++;
|
||||||
counter &= 0xFF;
|
counter &= 0xFF;
|
||||||
if (!counter) counter++; // Skip 0 as it is not allowed
|
if (!counter) counter++; // Skip 0 as it is not allowed
|
||||||
} while (counter != web_log_index);
|
} while (counter != TasmotaGlobal.web_log_index);
|
||||||
response += F("}");
|
response += F("}");
|
||||||
} else {
|
} else {
|
||||||
response = F("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}");
|
response = F("{\"" D_RSLT_WARNING "\":\"" D_ENABLE_WEBLOG_FOR_RESPONSE "\"}");
|
||||||
|
@ -194,7 +194,7 @@ void PzemEvery250ms(void)
|
|||||||
Pzem.energy += value;
|
Pzem.energy += value;
|
||||||
if (Pzem.phase == Energy.phase_count -1) {
|
if (Pzem.phase == Energy.phase_count -1) {
|
||||||
if (Pzem.energy > Pzem.last_energy) { // Handle missed phase
|
if (Pzem.energy > Pzem.last_energy) { // Handle missed phase
|
||||||
if (uptime > PZEM_STABILIZE) {
|
if (TasmotaGlobal.uptime > PZEM_STABILIZE) {
|
||||||
EnergyUpdateTotal(Pzem.energy, false);
|
EnergyUpdateTotal(Pzem.energy, false);
|
||||||
}
|
}
|
||||||
Pzem.last_energy = Pzem.energy;
|
Pzem.last_energy = Pzem.energy;
|
||||||
@ -232,7 +232,7 @@ void PzemEvery250ms(void)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Pzem.send_retry--;
|
Pzem.send_retry--;
|
||||||
if ((Energy.phase_count > 1) && (0 == Pzem.send_retry) && (uptime < PZEM_STABILIZE)) {
|
if ((Energy.phase_count > 1) && (0 == Pzem.send_retry) && (TasmotaGlobal.uptime < PZEM_STABILIZE)) {
|
||||||
Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart
|
Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,7 +285,7 @@ bool Xnrg03(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (PzemSerial && (uptime > 4)) { PzemEvery250ms(); }
|
if (PzemSerial && (TasmotaGlobal.uptime > 4)) { PzemEvery250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = PzemCommand();
|
result = PzemCommand();
|
||||||
|
@ -81,7 +81,7 @@ void PzemAcEverySecond(void)
|
|||||||
PzemAc.energy += (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]); // 4294967295 Wh
|
PzemAc.energy += (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]); // 4294967295 Wh
|
||||||
if (PzemAc.phase == Energy.phase_count -1) {
|
if (PzemAc.phase == Energy.phase_count -1) {
|
||||||
if (PzemAc.energy > PzemAc.last_energy) { // Handle missed phase
|
if (PzemAc.energy > PzemAc.last_energy) { // Handle missed phase
|
||||||
if (uptime > PZEM_AC_STABILIZE) {
|
if (TasmotaGlobal.uptime > PZEM_AC_STABILIZE) {
|
||||||
EnergyUpdateTotal(PzemAc.energy, false);
|
EnergyUpdateTotal(PzemAc.energy, false);
|
||||||
}
|
}
|
||||||
PzemAc.last_energy = PzemAc.energy;
|
PzemAc.last_energy = PzemAc.energy;
|
||||||
@ -109,7 +109,7 @@ void PzemAcEverySecond(void)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PzemAc.send_retry--;
|
PzemAc.send_retry--;
|
||||||
if ((Energy.phase_count > 1) && (0 == PzemAc.send_retry) && (uptime < PZEM_AC_STABILIZE)) {
|
if ((Energy.phase_count > 1) && (0 == PzemAc.send_retry) && (TasmotaGlobal.uptime < PZEM_AC_STABILIZE)) {
|
||||||
Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart
|
Energy.phase_count--; // Decrement phases if no response after retry within 30 seconds after restart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ bool Xnrg05(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_ENERGY_EVERY_SECOND:
|
case FUNC_ENERGY_EVERY_SECOND:
|
||||||
if (uptime > 4) { PzemAcEverySecond(); } // Fix start up issue #5875
|
if (TasmotaGlobal.uptime > 4) { PzemAcEverySecond(); } // Fix start up issue #5875
|
||||||
break;
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = PzemAcCommand();
|
result = PzemAcCommand();
|
||||||
|
@ -78,7 +78,7 @@ void PzemDcEverySecond(void)
|
|||||||
PzemDc.energy += (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]); // 4294967295 Wh
|
PzemDc.energy += (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]); // 4294967295 Wh
|
||||||
if (PzemDc.channel == Energy.phase_count -1) {
|
if (PzemDc.channel == Energy.phase_count -1) {
|
||||||
if (PzemDc.energy > PzemDc.last_energy) { // Handle missed channel
|
if (PzemDc.energy > PzemDc.last_energy) { // Handle missed channel
|
||||||
if (uptime > PZEM_DC_STABILIZE) {
|
if (TasmotaGlobal.uptime > PZEM_DC_STABILIZE) {
|
||||||
EnergyUpdateTotal(PzemDc.energy, false);
|
EnergyUpdateTotal(PzemDc.energy, false);
|
||||||
}
|
}
|
||||||
PzemDc.last_energy = PzemDc.energy;
|
PzemDc.last_energy = PzemDc.energy;
|
||||||
@ -105,7 +105,7 @@ void PzemDcEverySecond(void)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PzemDc.send_retry--;
|
PzemDc.send_retry--;
|
||||||
if ((Energy.phase_count > 1) && (0 == PzemDc.send_retry) && (uptime < PZEM_DC_STABILIZE)) {
|
if ((Energy.phase_count > 1) && (0 == PzemDc.send_retry) && (TasmotaGlobal.uptime < PZEM_DC_STABILIZE)) {
|
||||||
Energy.phase_count--; // Decrement channels if no response after retry within 30 seconds after restart
|
Energy.phase_count--; // Decrement channels if no response after retry within 30 seconds after restart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -155,7 +155,7 @@ bool Xnrg06(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_ENERGY_EVERY_SECOND:
|
case FUNC_ENERGY_EVERY_SECOND:
|
||||||
if (uptime > 4) { PzemDcEverySecond(); } // Fix start up issue #5875
|
if (TasmotaGlobal.uptime > 4) { PzemDcEverySecond(); } // Fix start up issue #5875
|
||||||
break;
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = PzemDcCommand();
|
result = PzemDcCommand();
|
||||||
|
@ -242,7 +242,7 @@ bool Xnrg08(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { SDM120Every250ms(); }
|
if (TasmotaGlobal.uptime > 4) { SDM120Every250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
Sdm220Show(1);
|
Sdm220Show(1);
|
||||||
|
@ -117,7 +117,7 @@ bool Xnrg09(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_ENERGY_EVERY_SECOND:
|
case FUNC_ENERGY_EVERY_SECOND:
|
||||||
if (uptime > 4) { Dds2382EverySecond(); }
|
if (TasmotaGlobal.uptime > 4) { Dds2382EverySecond(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
Dds2382SnsInit();
|
Dds2382SnsInit();
|
||||||
|
@ -242,7 +242,7 @@ bool Xnrg10(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { SDM630Every250ms(); }
|
if (TasmotaGlobal.uptime > 4) { SDM630Every250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
Sdm630SnsInit();
|
Sdm630SnsInit();
|
||||||
|
@ -159,7 +159,7 @@ bool Xnrg11(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { DDSU666Every250ms(); }
|
if (TasmotaGlobal.uptime > 4) { DDSU666Every250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
Ddsu666SnsInit();
|
Ddsu666SnsInit();
|
||||||
|
@ -505,7 +505,7 @@ bool Xnrg12(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { solaxX1250MSecond(); }
|
if (TasmotaGlobal.uptime > 4) { solaxX1250MSecond(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
solaxX1Show(1);
|
solaxX1Show(1);
|
||||||
|
@ -269,7 +269,7 @@ bool Xnrg13(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) {
|
if (TasmotaGlobal.uptime > 4) {
|
||||||
FifLEEvery250ms();
|
FifLEEvery250ms();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -20,73 +20,73 @@
|
|||||||
#ifdef USE_ENERGY_SENSOR
|
#ifdef USE_ENERGY_SENSOR
|
||||||
#ifdef USE_TELEINFO
|
#ifdef USE_TELEINFO
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Teleinfo : French energy provider metering telemety data
|
* Teleinfo : French energy provider metering telemety data
|
||||||
* Source: http://hallard.me/category/tinfo/
|
* Source: http://hallard.me/category/tinfo/
|
||||||
*
|
*
|
||||||
* Denky ESP32 Teleinfo Template
|
* Denky ESP32 Teleinfo Template
|
||||||
* {"NAME":"Denky (Teleinfo)","GPIO":[1,1,1,1,5664,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1376,1,1,0,0,0,0,1,5632,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
* {"NAME":"Denky (Teleinfo)","GPIO":[1,1,1,1,5664,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1376,1,1,0,0,0,0,1,5632,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||||
*
|
*
|
||||||
* Denky (aka WifInfo) ESP8266 Teleinfo Template
|
* Denky (aka WifInfo) ESP8266 Teleinfo Template
|
||||||
* {"NAME":"WifInfo v1.0a","GPIO":[17,255,255,255,6,5,255,255,7,210,255,255,255],"FLAG":15,"BASE":18}
|
* {"NAME":"WifInfo v1.0a","GPIO":[17,255,255,255,6,5,255,255,7,210,255,255,255],"FLAG":15,"BASE":18}
|
||||||
* {"NAME":"WifInfo","GPIO":[7,255,255,210,6,5,255,255,255,255,255,255,255],"FLAG":15,"BASE":18}
|
* {"NAME":"WifInfo","GPIO":[7,255,255,210,6,5,255,255,255,255,255,255,255],"FLAG":15,"BASE":18}
|
||||||
*
|
*
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
#define XNRG_15 15
|
#define XNRG_15 15
|
||||||
|
|
||||||
#include "LibTeleinfo.h"
|
#include "LibTeleinfo.h"
|
||||||
#include <TasmotaSerial.h>
|
#include <TasmotaSerial.h>
|
||||||
|
|
||||||
#define TINFO_READ_TIMEOUT 400
|
#define TINFO_READ_TIMEOUT 400
|
||||||
|
|
||||||
// All contract type for legacy, standard mode has in clear text
|
// All contract type for legacy, standard mode has in clear text
|
||||||
enum TInfoContrat{
|
enum TInfoContrat{
|
||||||
CONTRAT_BAS = 1, // BASE => Option Base.
|
CONTRAT_BAS = 1, // BASE => Option Base.
|
||||||
CONTRAT_HC, // HC.. => Option Heures Creuses.
|
CONTRAT_HC, // HC.. => Option Heures Creuses.
|
||||||
CONTRAT_EJP, // EJP. => Option EJP.
|
CONTRAT_EJP, // EJP. => Option EJP.
|
||||||
CONTRAT_BBR, // BBRx => Option Tempo
|
CONTRAT_BBR, // BBRx => Option Tempo
|
||||||
CONTRAT_END
|
CONTRAT_END
|
||||||
};
|
};
|
||||||
|
|
||||||
// contract displayed name for legacy, standard mode has in clear text
|
// contract displayed name for legacy, standard mode has in clear text
|
||||||
const char kContratName[] PROGMEM =
|
const char kContratName[] PROGMEM =
|
||||||
"|Base|Heures Creuses|EJP|Bleu Blanc Rouge"
|
"|Base|Heures Creuses|EJP|Bleu Blanc Rouge"
|
||||||
;
|
;
|
||||||
|
|
||||||
// Received current contract value for legacy, standard mode has in clear text
|
// Received current contract value for legacy, standard mode has in clear text
|
||||||
const char kContratValue[] PROGMEM =
|
const char kContratValue[] PROGMEM =
|
||||||
"|BASE|HC..|EJP.|BBR"
|
"|BASE|HC..|EJP.|BBR"
|
||||||
;
|
;
|
||||||
|
|
||||||
// all tariff type for legacy, standard mode has in clear text
|
// all tariff type for legacy, standard mode has in clear text
|
||||||
enum TInfoTarif{
|
enum TInfoTarif{
|
||||||
TARIF_TH = 1,
|
TARIF_TH = 1,
|
||||||
TARIF_HC, TARIF_HP,
|
TARIF_HC, TARIF_HP,
|
||||||
TARIF_HN, TARIF_PM,
|
TARIF_HN, TARIF_PM,
|
||||||
TARIF_CB, TARIF_CW, TARIF_CR,
|
TARIF_CB, TARIF_CW, TARIF_CR,
|
||||||
TARIF_PB, TARIF_PW, TARIF_PR,
|
TARIF_PB, TARIF_PW, TARIF_PR,
|
||||||
TARIF_END
|
TARIF_END
|
||||||
};
|
};
|
||||||
|
|
||||||
// Received current tariff values
|
// Received current tariff values
|
||||||
// for legacy, standard mode has in clear text
|
// for legacy, standard mode has in clear text
|
||||||
const char kTarifValue[] PROGMEM =
|
const char kTarifValue[] PROGMEM =
|
||||||
"|TH..|HC..|HP.."
|
"|TH..|HC..|HP.."
|
||||||
"|HN..|PM.."
|
"|HN..|PM.."
|
||||||
"|HCJB|HCJW|HCJR"
|
"|HCJB|HCJW|HCJR"
|
||||||
"|HPJB|HPJW|HPJR"
|
"|HPJB|HPJW|HPJR"
|
||||||
;
|
;
|
||||||
|
|
||||||
// tariff displayed name (for legacy, standard mode has in clear text)
|
// tariff displayed name (for legacy, standard mode has in clear text)
|
||||||
const char kTarifName[] PROGMEM =
|
const char kTarifName[] PROGMEM =
|
||||||
"|Toutes|Creuses|Pleines"
|
"|Toutes|Creuses|Pleines"
|
||||||
"|Normales|Pointe Mobile"
|
"|Normales|Pointe Mobile"
|
||||||
"|Creuses Bleu|Creuses Blanc|Creuse Rouges"
|
"|Creuses Bleu|Creuses Blanc|Creuse Rouges"
|
||||||
"|Pleines Bleu|Pleines Blanc|Pleines Rouges"
|
"|Pleines Bleu|Pleines Blanc|Pleines Rouges"
|
||||||
;
|
;
|
||||||
|
|
||||||
// Label used to do some post processing and/or calculation
|
// Label used to do some post processing and/or calculation
|
||||||
enum TInfoLabel{
|
enum TInfoLabel{
|
||||||
LABEL_BASE = 1,
|
LABEL_BASE = 1,
|
||||||
LABEL_ADCO, LABEL_ADSC,
|
LABEL_ADCO, LABEL_ADSC,
|
||||||
LABEL_HCHC, LABEL_HCHP, LABEL_EAST, LABEL_EASF01, LABEL_EASF02,
|
LABEL_HCHC, LABEL_HCHP, LABEL_EAST, LABEL_EASF01, LABEL_EASF02,
|
||||||
LABEL_OPTARIF, LABEL_NGTF, LABEL_ISOUSC, LABEL_PREF, LABEL_PTEC, LABEL_LTARF, LABEL_NTARF,
|
LABEL_OPTARIF, LABEL_NGTF, LABEL_ISOUSC, LABEL_PREF, LABEL_PTEC, LABEL_LTARF, LABEL_NTARF,
|
||||||
@ -96,7 +96,7 @@ enum TInfoLabel{
|
|||||||
LABEL_END
|
LABEL_END
|
||||||
};
|
};
|
||||||
|
|
||||||
const char kLabel[] PROGMEM =
|
const char kLabel[] PROGMEM =
|
||||||
"|BASE|ADCO|ADSC"
|
"|BASE|ADCO|ADSC"
|
||||||
"|HCHC|HCHP|EAST|EASF01|EASF02"
|
"|HCHC|HCHP|EAST|EASF01|EASF02"
|
||||||
"|OPTARIF|NGTF|ISOUSC|PREF|PTEC|LTARF|NTARF"
|
"|OPTARIF|NGTF|ISOUSC|PREF|PTEC|LTARF|NTARF"
|
||||||
@ -117,7 +117,7 @@ int isousc;
|
|||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: getValueFromLabelIndex
|
Function: getValueFromLabelIndex
|
||||||
Purpose : return label value from label index
|
Purpose : return label value from label index
|
||||||
Input : label index to search for
|
Input : label index to search for
|
||||||
Output : value filled
|
Output : value filled
|
||||||
@ -133,14 +133,14 @@ char * getValueFromLabelIndex(int labelIndex, char * value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: ADPSCallback
|
Function: ADPSCallback
|
||||||
Purpose : called by library when we detected a ADPS on any phased
|
Purpose : called by library when we detected a ADPS on any phased
|
||||||
Input : phase number
|
Input : phase number
|
||||||
0 for ADPS (monophase)
|
0 for ADPS (monophase)
|
||||||
1 for ADIR1 triphase
|
1 for ADIR1 triphase
|
||||||
2 for ADIR2 triphase
|
2 for ADIR2 triphase
|
||||||
3 for ADIR3 triphase
|
3 for ADIR3 triphase
|
||||||
Output : -
|
Output : -
|
||||||
Comments: should have been initialised with a
|
Comments: should have been initialised with a
|
||||||
tinfo.attachADPSCallback(ADPSCallback())
|
tinfo.attachADPSCallback(ADPSCallback())
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
@ -162,11 +162,11 @@ void ADPSCallback(uint8_t phase)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: DataCallback
|
Function: DataCallback
|
||||||
Purpose : callback when we detected new or modified data received
|
Purpose : callback when we detected new or modified data received
|
||||||
Input : linked list pointer on the concerned data
|
Input : linked list pointer on the concerned data
|
||||||
current flags value
|
current flags value
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void DataCallback(struct _ValueList * me, uint8_t flags)
|
void DataCallback(struct _ValueList * me, uint8_t flags)
|
||||||
@ -180,7 +180,7 @@ void DataCallback(struct _ValueList * me, uint8_t flags)
|
|||||||
// Find the label index
|
// Find the label index
|
||||||
for ( ilabel = 1 ; ilabel < LABEL_END ; ilabel++) {
|
for ( ilabel = 1 ; ilabel < LABEL_END ; ilabel++) {
|
||||||
GetTextIndexed(labelName, sizeof(labelName), ilabel, kLabel);
|
GetTextIndexed(labelName, sizeof(labelName), ilabel, kLabel);
|
||||||
if (!strcmp(labelName, me->name)) {
|
if (!strcmp(labelName, me->name)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,24 +198,24 @@ void DataCallback(struct _ValueList * me, uint8_t flags)
|
|||||||
// Find the tariff index
|
// Find the tariff index
|
||||||
for (tarif = TARIF_TH ; tarif < TARIF_END ; tarif++) {
|
for (tarif = TARIF_TH ; tarif < TARIF_END ; tarif++) {
|
||||||
GetTextIndexed(tarif_value, sizeof(tarif_value), tarif-1, kTarifValue);
|
GetTextIndexed(tarif_value, sizeof(tarif_value), tarif-1, kTarifValue);
|
||||||
if (!strcmp(tarif_value, me->value)) {
|
if (!strcmp(tarif_value, me->value)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif changed, now '%s' (%d)"), me->value, tarif);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif changed, now '%s' (%d)"), me->value, tarif);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Current tariff (standard is in clear text in value)
|
// Current tariff (standard is in clear text in value)
|
||||||
else if (ilabel == LABEL_LTARF)
|
else if (ilabel == LABEL_LTARF)
|
||||||
{
|
{
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif name changed, now '%s'"), me->value);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif name changed, now '%s'"), me->value);
|
||||||
}
|
}
|
||||||
// Current tariff (standard index is is in clear text in value)
|
// Current tariff (standard index is is in clear text in value)
|
||||||
else if (ilabel == LABEL_NTARF)
|
else if (ilabel == LABEL_NTARF)
|
||||||
{
|
{
|
||||||
tarif = atoi(me->value);
|
tarif = atoi(me->value);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif index changed, now '%d'"), tarif);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Tarif index changed, now '%d'"), tarif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Voltage V (not present on all Smart Meter)
|
// Voltage V (not present on all Smart Meter)
|
||||||
@ -257,14 +257,14 @@ void DataCallback(struct _ValueList * me, uint8_t flags)
|
|||||||
// Heures creuses get heures pleines
|
// Heures creuses get heures pleines
|
||||||
if (ilabel == LABEL_HCHC) {
|
if (ilabel == LABEL_HCHC) {
|
||||||
hc = atoi(me->value);
|
hc = atoi(me->value);
|
||||||
if ( getValueFromLabelIndex(LABEL_HCHP, value) ) {
|
if ( getValueFromLabelIndex(LABEL_HCHP, value) ) {
|
||||||
hp = atoi(value);
|
hp = atoi(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Heures pleines, get heures creuses
|
// Heures pleines, get heures creuses
|
||||||
} else if (ilabel == LABEL_HCHP) {
|
} else if (ilabel == LABEL_HCHP) {
|
||||||
hp = atoi(me->value);
|
hp = atoi(me->value);
|
||||||
if ( getValueFromLabelIndex(LABEL_HCHC, value) ) {
|
if ( getValueFromLabelIndex(LABEL_HCHC, value) ) {
|
||||||
hc = atoi(value);
|
hc = atoi(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -272,17 +272,17 @@ void DataCallback(struct _ValueList * me, uint8_t flags)
|
|||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: HC:%u HP:%u Total:%u"), hc, hp, total);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: HC:%u HP:%u Total:%u"), hc, hp, total);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Settings.flag4.teleinfo_rawdata) {
|
if (!Settings.flag4.teleinfo_rawdata) {
|
||||||
EnergyUpdateTotal(total/1000.0f, true);
|
EnergyUpdateTotal(total/1000.0f, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wh total index (standard)
|
// Wh total index (standard)
|
||||||
else if ( ilabel == LABEL_EAST)
|
else if ( ilabel == LABEL_EAST)
|
||||||
{
|
{
|
||||||
uint32_t total = atoi(me->value);
|
uint32_t total = atoi(me->value);
|
||||||
if (!Settings.flag4.teleinfo_rawdata) {
|
if (!Settings.flag4.teleinfo_rawdata) {
|
||||||
EnergyUpdateTotal(total/1000.0f, true);
|
EnergyUpdateTotal(total/1000.0f, true);
|
||||||
}
|
}
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Total:%uWh"), total);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Total:%uWh"), total);
|
||||||
}
|
}
|
||||||
@ -304,45 +304,45 @@ void DataCallback(struct _ValueList * me, uint8_t flags)
|
|||||||
// Find the contract index
|
// Find the contract index
|
||||||
for (contrat = CONTRAT_BAS ; contrat < CONTRAT_END ; contrat++) {
|
for (contrat = CONTRAT_BAS ; contrat < CONTRAT_END ; contrat++) {
|
||||||
GetTextIndexed(contrat_value, sizeof(contrat_value), contrat, kContratValue);
|
GetTextIndexed(contrat_value, sizeof(contrat_value), contrat, kContratValue);
|
||||||
if (!strcmp(contrat_value, me->value)) {
|
if (!strcmp(contrat_value, me->value)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Contract changed, now '%s' (%d)"), me->value, contrat);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Contract changed, now '%s' (%d)"), me->value, contrat);
|
||||||
}
|
}
|
||||||
// Contract subscribed (standard is in clear text in value)
|
// Contract subscribed (standard is in clear text in value)
|
||||||
else if (ilabel == LABEL_NGTF)
|
else if (ilabel == LABEL_NGTF)
|
||||||
{
|
{
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Contract changed, now '%s'"), me->value);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: Contract changed, now '%s'"), me->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contract subscribed (Power)
|
// Contract subscribed (Power)
|
||||||
else if (ilabel == LABEL_ISOUSC || ilabel == LABEL_PREF)
|
else if (ilabel == LABEL_ISOUSC || ilabel == LABEL_PREF)
|
||||||
{
|
{
|
||||||
isousc = atoi( me->value);
|
isousc = atoi( me->value);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: ISousc set to %d"), isousc);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: ISousc set to %d"), isousc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Serial Number of device
|
// Serial Number of device
|
||||||
else if (ilabel == LABEL_ADCO || ilabel == LABEL_ADSC)
|
else if (ilabel == LABEL_ADCO || ilabel == LABEL_ADSC)
|
||||||
{
|
{
|
||||||
strcpy(serialNumber, me->value);
|
strcpy(serialNumber, me->value);
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: %s set to %s"), me->name, serialNumber);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: %s set to %s"), me->name, serialNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: responseDumpTInfo
|
Function: responseDumpTInfo
|
||||||
Purpose : add teleinfo values into JSON response
|
Purpose : add teleinfo values into JSON response
|
||||||
Input : 1st separator space if begining of JSON, else comma
|
Input : 1st separator space if begining of JSON, else comma
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void ResponseAppendTInfo(char sep)
|
void ResponseAppendTInfo(char sep)
|
||||||
@ -383,17 +383,17 @@ void ResponseAppendTInfo(char sep)
|
|||||||
ResponseAppend_P( PSTR("%d"), atoi(me->value));
|
ResponseAppend_P( PSTR("%d"), atoi(me->value));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now JSON separator is needed
|
// Now JSON separator is needed
|
||||||
sep =',';
|
sep =',';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: NewFrameCallback
|
Function: NewFrameCallback
|
||||||
Purpose : callback when we received a complete Teleinfo frama
|
Purpose : callback when we received a complete Teleinfo frama
|
||||||
Input : linked list pointer on the concerned data
|
Input : linked list pointer on the concerned data
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void NewFrameCallback(struct _ValueList * me)
|
void NewFrameCallback(struct _ValueList * me)
|
||||||
@ -403,7 +403,7 @@ void NewFrameCallback(struct _ValueList * me)
|
|||||||
|
|
||||||
// send teleinfo full frame only if setup like that
|
// send teleinfo full frame only if setup like that
|
||||||
// see setOption108
|
// see setOption108
|
||||||
if (Settings.flag4.teleinfo_rawdata) {
|
if (Settings.flag4.teleinfo_rawdata) {
|
||||||
Response_P(PSTR("{"));
|
Response_P(PSTR("{"));
|
||||||
ResponseAppendTInfo(' ');
|
ResponseAppendTInfo(' ');
|
||||||
ResponseJsonEnd();
|
ResponseJsonEnd();
|
||||||
@ -414,10 +414,10 @@ void NewFrameCallback(struct _ValueList * me)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: TInfoDrvInit
|
Function: TInfoDrvInit
|
||||||
Purpose : Tasmota core driver init
|
Purpose : Tasmota core driver init
|
||||||
Input : -
|
Input : -
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void TInfoDrvInit(void) {
|
void TInfoDrvInit(void) {
|
||||||
@ -428,10 +428,10 @@ void TInfoDrvInit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: TInfoInit
|
Function: TInfoInit
|
||||||
Purpose : Tasmota core device init
|
Purpose : Tasmota core device init
|
||||||
Input : -
|
Input : -
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void TInfoInit(void)
|
void TInfoInit(void)
|
||||||
@ -439,16 +439,16 @@ void TInfoInit(void)
|
|||||||
int baudrate;
|
int baudrate;
|
||||||
|
|
||||||
// SetOption102 - Set Baud rate for Teleinfo serial communication (0 = 1200 or 1 = 9600)
|
// SetOption102 - Set Baud rate for Teleinfo serial communication (0 = 1200 or 1 = 9600)
|
||||||
if (Settings.flag4.teleinfo_baudrate) {
|
if (Settings.flag4.teleinfo_baudrate) {
|
||||||
baudrate = 9600;
|
baudrate = 9600;
|
||||||
tinfo_mode = TINFO_MODE_STANDARD;
|
tinfo_mode = TINFO_MODE_STANDARD;
|
||||||
} else {
|
} else {
|
||||||
baudrate = 1200;
|
baudrate = 1200;
|
||||||
tinfo_mode = TINFO_MODE_HISTORIQUE;
|
tinfo_mode = TINFO_MODE_HISTORIQUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: inferface speed %d bps"),baudrate);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TIC: inferface speed %d bps"),baudrate);
|
||||||
|
|
||||||
if (PinUsed(GPIO_TELEINFO_RX)) {
|
if (PinUsed(GPIO_TELEINFO_RX)) {
|
||||||
uint8_t rx_pin = Pin(GPIO_TELEINFO_RX);
|
uint8_t rx_pin = Pin(GPIO_TELEINFO_RX);
|
||||||
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: RX on GPIO%d"), rx_pin);
|
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: RX on GPIO%d"), rx_pin);
|
||||||
@ -456,7 +456,7 @@ void TInfoInit(void)
|
|||||||
// Enable Teleinfo pin used, control it
|
// Enable Teleinfo pin used, control it
|
||||||
if (PinUsed(GPIO_TELEINFO_ENABLE)) {
|
if (PinUsed(GPIO_TELEINFO_ENABLE)) {
|
||||||
uint8_t en_pin = Pin(GPIO_TELEINFO_ENABLE);
|
uint8_t en_pin = Pin(GPIO_TELEINFO_ENABLE);
|
||||||
pinMode(en_pin, OUTPUT);
|
pinMode(en_pin, OUTPUT);
|
||||||
digitalWrite(en_pin, HIGH);
|
digitalWrite(en_pin, HIGH);
|
||||||
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: Enable with GPIO%d"), en_pin);
|
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: Enable with GPIO%d"), en_pin);
|
||||||
} else {
|
} else {
|
||||||
@ -472,7 +472,7 @@ void TInfoInit(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Trick here even using SERIAL_7E1 or TS_SERIAL_7E1
|
// Trick here even using SERIAL_7E1 or TS_SERIAL_7E1
|
||||||
// this is not working, need to call SetSerialConfig after
|
// this is not working, need to call SetSerialConfig after
|
||||||
if (TInfoSerial->begin(baudrate)) {
|
if (TInfoSerial->begin(baudrate)) {
|
||||||
|
|
||||||
|
|
||||||
@ -481,9 +481,9 @@ void TInfoInit(void)
|
|||||||
ClaimSerial();
|
ClaimSerial();
|
||||||
|
|
||||||
// This is a hack, looks like begin does not take into account
|
// This is a hack, looks like begin does not take into account
|
||||||
// the TS_SERIAL_7E1 configuration so on ESP8266 this is
|
// the TS_SERIAL_7E1 configuration so on ESP8266 this is
|
||||||
// working only on Serial RX pin (Hardware Serial) for now
|
// working only on Serial RX pin (Hardware Serial) for now
|
||||||
|
|
||||||
//SetSerialConfig(TS_SERIAL_7E1);
|
//SetSerialConfig(TS_SERIAL_7E1);
|
||||||
//TInfoSerial->setTimeout(TINFO_READ_TIMEOUT);
|
//TInfoSerial->setTimeout(TINFO_READ_TIMEOUT);
|
||||||
|
|
||||||
@ -499,8 +499,8 @@ void TInfoInit(void)
|
|||||||
tinfo.init(tinfo_mode);
|
tinfo.init(tinfo_mode);
|
||||||
// Attach needed callbacks
|
// Attach needed callbacks
|
||||||
tinfo.attachADPS(ADPSCallback);
|
tinfo.attachADPS(ADPSCallback);
|
||||||
tinfo.attachData(DataCallback);
|
tinfo.attachData(DataCallback);
|
||||||
tinfo.attachNewFrame(NewFrameCallback);
|
tinfo.attachNewFrame(NewFrameCallback);
|
||||||
tinfo_found = true;
|
tinfo_found = true;
|
||||||
|
|
||||||
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: Ready"));
|
AddLog_P2(LOG_LEVEL_INFO, PSTR("TIC: Ready"));
|
||||||
@ -509,10 +509,10 @@ void TInfoInit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: TInfoEvery250ms
|
Function: TInfoEvery250ms
|
||||||
Purpose : Tasmota callback executed every 250ms
|
Purpose : Tasmota callback executed every 250ms
|
||||||
Input : -
|
Input : -
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
void TInfoEvery250ms(void)
|
void TInfoEvery250ms(void)
|
||||||
@ -536,10 +536,10 @@ void TInfoEvery250ms(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ======================================================================
|
/* ======================================================================
|
||||||
Function: TInfoShow
|
Function: TInfoShow
|
||||||
Purpose : Tasmota callback executed to send telemetry or WEB display
|
Purpose : Tasmota callback executed to send telemetry or WEB display
|
||||||
Input : -
|
Input : -
|
||||||
Output : -
|
Output : -
|
||||||
Comments: -
|
Comments: -
|
||||||
====================================================================== */
|
====================================================================== */
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
@ -556,7 +556,7 @@ const char HTTP_ENERGY_PMAX_TELEINFO[] PROGMEM = "{s}" D_MAX_POWER "{m}%d" D_UN
|
|||||||
|
|
||||||
void TInfoShow(bool json)
|
void TInfoShow(bool json)
|
||||||
{
|
{
|
||||||
// Since it's an Energy device , current, voltage and power are
|
// Since it's an Energy device , current, voltage and power are
|
||||||
// already present on the telemetry frame. No need to add here
|
// already present on the telemetry frame. No need to add here
|
||||||
// Just add the raw label/values of the teleinfo frame
|
// Just add the raw label/values of the teleinfo frame
|
||||||
if (json)
|
if (json)
|
||||||
@ -567,7 +567,7 @@ void TInfoShow(bool json)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add teleinfo full frame only if no teleinfo raw data setup
|
// add teleinfo full frame only if no teleinfo raw data setup
|
||||||
if (!Settings.flag4.teleinfo_rawdata) {
|
if (!Settings.flag4.teleinfo_rawdata) {
|
||||||
ResponseAppendTInfo(',');
|
ResponseAppendTInfo(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,7 +640,7 @@ bool Xnrg15(uint8_t function)
|
|||||||
switch (function)
|
switch (function)
|
||||||
{
|
{
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { TInfoEvery250ms(); }
|
if (TasmotaGlobal.uptime > 4) { TInfoEvery250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_JSON_APPEND:
|
case FUNC_JSON_APPEND:
|
||||||
TInfoShow(1);
|
TInfoShow(1);
|
||||||
|
@ -192,7 +192,7 @@ bool Xnrg16(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { IEM3000Every250ms(); }
|
if (TasmotaGlobal.uptime > 4) { IEM3000Every250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
Iem3000SnsInit();
|
Iem3000SnsInit();
|
||||||
|
@ -216,7 +216,7 @@ bool Xnrg17(uint8_t function)
|
|||||||
|
|
||||||
switch (function) {
|
switch (function) {
|
||||||
case FUNC_EVERY_250_MSECOND:
|
case FUNC_EVERY_250_MSECOND:
|
||||||
if (uptime > 4) { WE517Every250ms(); }
|
if (TasmotaGlobal.uptime > 4) { WE517Every250ms(); }
|
||||||
break;
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
We517SnsInit();
|
We517SnsInit();
|
||||||
|
@ -457,7 +457,7 @@ void Ds18x20EverySecond(void)
|
|||||||
if (now < w1_power_until)
|
if (now < w1_power_until)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
if (uptime & 1
|
if (TasmotaGlobal.uptime & 1
|
||||||
#ifdef W1_PARASITE_POWER
|
#ifdef W1_PARASITE_POWER
|
||||||
// if more than 1 sensor and only parasite power: convert every cycle
|
// if more than 1 sensor and only parasite power: convert every cycle
|
||||||
|| ds18x20_sensors >= 2
|
|| ds18x20_sensors >= 2
|
||||||
|
@ -167,7 +167,7 @@ void Ds18x20EverySecond(void)
|
|||||||
{
|
{
|
||||||
if (!ds18x20_sensors) { return; }
|
if (!ds18x20_sensors) { return; }
|
||||||
|
|
||||||
if (uptime & 1) {
|
if (TasmotaGlobal.uptime & 1) {
|
||||||
// 2mS
|
// 2mS
|
||||||
// Ds18x20Search(); // Check for changes in sensors number
|
// Ds18x20Search(); // Check for changes in sensors number
|
||||||
Ds18x20Convert(); // Start Conversion, takes up to one second
|
Ds18x20Convert(); // Start Conversion, takes up to one second
|
||||||
|
@ -228,7 +228,7 @@ void DhtInit(void)
|
|||||||
|
|
||||||
void DhtEverySecond(void)
|
void DhtEverySecond(void)
|
||||||
{
|
{
|
||||||
if (uptime &1) { // Every 2 seconds
|
if (TasmotaGlobal.uptime &1) { // Every 2 seconds
|
||||||
for (uint32_t sensor = 0; sensor < dht_sensors; sensor++) {
|
for (uint32_t sensor = 0; sensor < dht_sensors; sensor++) {
|
||||||
// DHT11 and AM2301 25mS per sensor, SI7021 5mS per sensor
|
// DHT11 and AM2301 25mS per sensor, SI7021 5mS per sensor
|
||||||
if (!DhtRead(sensor)) {
|
if (!DhtRead(sensor)) {
|
||||||
|
@ -172,7 +172,7 @@ void ShtDetect(void)
|
|||||||
|
|
||||||
void ShtEverySecond(void)
|
void ShtEverySecond(void)
|
||||||
{
|
{
|
||||||
if (!(uptime %4)) { // Every 4 seconds
|
if (!(TasmotaGlobal.uptime %4)) { // Every 4 seconds
|
||||||
// 344mS
|
// 344mS
|
||||||
if (!ShtRead()) {
|
if (!ShtRead()) {
|
||||||
AddLogMissed(sht_types, sht_valid);
|
AddLogMissed(sht_types, sht_valid);
|
||||||
|
@ -236,7 +236,7 @@ void HtuDetect(void)
|
|||||||
|
|
||||||
void HtuEverySecond(void)
|
void HtuEverySecond(void)
|
||||||
{
|
{
|
||||||
if (uptime &1) { // Every 2 seconds
|
if (TasmotaGlobal.uptime &1) { // Every 2 seconds
|
||||||
// HTU21: 68mS, SI70xx: 37mS
|
// HTU21: 68mS, SI70xx: 37mS
|
||||||
if (!HtuRead()) {
|
if (!HtuRead()) {
|
||||||
AddLogMissed(Htu.types, Htu.valid);
|
AddLogMissed(Htu.types, Htu.valid);
|
||||||
|
@ -82,7 +82,7 @@ void Tsl2561Detect(void)
|
|||||||
|
|
||||||
void Tsl2561EverySecond(void)
|
void Tsl2561EverySecond(void)
|
||||||
{
|
{
|
||||||
if (!(uptime %2)) { // Every 2 seconds
|
if (!(TasmotaGlobal.uptime %2)) { // Every 2 seconds
|
||||||
// ?mS - 4Sec
|
// ?mS - 4Sec
|
||||||
if (!Tsl2561Read()) {
|
if (!Tsl2561Read()) {
|
||||||
AddLogMissed(tsl2561_types, tsl2561_valid);
|
AddLogMissed(tsl2561_types, tsl2561_valid);
|
||||||
|
@ -83,7 +83,7 @@ void Sgp30Update(void) // Perform every second to ensure proper operation of th
|
|||||||
if (!sgp.IAQmeasure()) {
|
if (!sgp.IAQmeasure()) {
|
||||||
return; // Measurement failed
|
return; // Measurement failed
|
||||||
}
|
}
|
||||||
if (global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
if (TasmotaGlobal.global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
||||||
// abs hum in mg/m3
|
// abs hum in mg/m3
|
||||||
sgp30_abshum = sgp30_AbsoluteHumidity(global_temperature_celsius, global_humidity);
|
sgp30_abshum = sgp30_AbsoluteHumidity(global_temperature_celsius, global_humidity);
|
||||||
sgp.setHumidity(sgp30_abshum*1000);
|
sgp.setHumidity(sgp30_abshum*1000);
|
||||||
@ -91,7 +91,7 @@ void Sgp30Update(void) // Perform every second to ensure proper operation of th
|
|||||||
sgp30_ready = true;
|
sgp30_ready = true;
|
||||||
|
|
||||||
// these should normally be stored permanently and used for fast restart
|
// these should normally be stored permanently and used for fast restart
|
||||||
if (!(uptime%SAVE_PERIOD)) {
|
if (!(TasmotaGlobal.uptime%SAVE_PERIOD)) {
|
||||||
// store settings every N seconds
|
// store settings every N seconds
|
||||||
uint16_t TVOC_base;
|
uint16_t TVOC_base;
|
||||||
uint16_t eCO2_base;
|
uint16_t eCO2_base;
|
||||||
@ -115,13 +115,13 @@ void Sgp30Show(bool json)
|
|||||||
if (sgp30_ready) {
|
if (sgp30_ready) {
|
||||||
char abs_hum[33];
|
char abs_hum[33];
|
||||||
|
|
||||||
if (global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
if (TasmotaGlobal.global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
||||||
// has humidity + temperature
|
// has humidity + temperature
|
||||||
dtostrfd(sgp30_abshum,4,abs_hum);
|
dtostrfd(sgp30_abshum,4,abs_hum);
|
||||||
}
|
}
|
||||||
if (json) {
|
if (json) {
|
||||||
ResponseAppend_P(PSTR(",\"SGP30\":{\"" D_JSON_ECO2 "\":%d,\"" D_JSON_TVOC "\":%d"), sgp.eCO2, sgp.TVOC);
|
ResponseAppend_P(PSTR(",\"SGP30\":{\"" D_JSON_ECO2 "\":%d,\"" D_JSON_TVOC "\":%d"), sgp.eCO2, sgp.TVOC);
|
||||||
if (global_update && global_humidity>0 && !isnan(global_temperature_celsius)) {
|
if (TasmotaGlobal.global_update && global_humidity>0 && !isnan(global_temperature_celsius)) {
|
||||||
ResponseAppend_P(PSTR(",\"" D_JSON_AHUM "\":%s"),abs_hum);
|
ResponseAppend_P(PSTR(",\"" D_JSON_AHUM "\":%s"),abs_hum);
|
||||||
}
|
}
|
||||||
ResponseJsonEnd();
|
ResponseJsonEnd();
|
||||||
@ -131,7 +131,7 @@ void Sgp30Show(bool json)
|
|||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
} else {
|
} else {
|
||||||
WSContentSend_PD(HTTP_SNS_SGP30, sgp.eCO2, sgp.TVOC);
|
WSContentSend_PD(HTTP_SNS_SGP30, sgp.eCO2, sgp.TVOC);
|
||||||
if (global_update) {
|
if (TasmotaGlobal.global_update) {
|
||||||
WSContentSend_PD(HTTP_SNS_AHUM, abs_hum);
|
WSContentSend_PD(HTTP_SNS_AHUM, abs_hum);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,7 +65,7 @@ void CCS811Update(void) // Perform every n second
|
|||||||
TVOC = ccs.getTVOC();
|
TVOC = ccs.getTVOC();
|
||||||
eCO2 = ccs.geteCO2();
|
eCO2 = ccs.geteCO2();
|
||||||
CCS811_ready = 1;
|
CCS811_ready = 1;
|
||||||
if (global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
if (TasmotaGlobal.global_update && (global_humidity > 0) && !isnan(global_temperature_celsius)) {
|
||||||
ccs.setEnvironmentalData((uint8_t)global_humidity, global_temperature_celsius);
|
ccs.setEnvironmentalData((uint8_t)global_humidity, global_temperature_celsius);
|
||||||
}
|
}
|
||||||
ecnt = 0;
|
ecnt = 0;
|
||||||
|
@ -238,7 +238,7 @@ void ICACHE_RAM_ATTR TX2xStartRead(void)
|
|||||||
#else
|
#else
|
||||||
if ((chk == tx2x_sd) && (tx2x_sb==tx2x_se) && (tx2x_sc==tx2x_sf) && (tx2x_sc < 511)) {
|
if ((chk == tx2x_sd) && (tx2x_sb==tx2x_se) && (tx2x_sc==tx2x_sf) && (tx2x_sc < 511)) {
|
||||||
#endif
|
#endif
|
||||||
tx2x_last_available = uptime;
|
tx2x_last_available = TasmotaGlobal.uptime;
|
||||||
// Wind speed spec: 0 to 180 km/h (0 to 50 m/s)
|
// Wind speed spec: 0 to 180 km/h (0 to 50 m/s)
|
||||||
tx2x_wind_speed = tx2x_sc;
|
tx2x_wind_speed = tx2x_sc;
|
||||||
tx2x_wind_direction = tx2x_sb;
|
tx2x_wind_direction = tx2x_sb;
|
||||||
@ -264,7 +264,7 @@ void ICACHE_RAM_ATTR TX2xStartRead(void)
|
|||||||
|
|
||||||
bool Tx2xAvailable(void)
|
bool Tx2xAvailable(void)
|
||||||
{
|
{
|
||||||
return ((uptime - tx2x_last_available) < TX2X_TIMEOUT);
|
return ((TasmotaGlobal.uptime - tx2x_last_available) < TX2X_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
#ifndef USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
||||||
@ -306,7 +306,7 @@ void Tx2xCheckSampleCount(void)
|
|||||||
void Tx2xResetStat(void)
|
void Tx2xResetStat(void)
|
||||||
{
|
{
|
||||||
DEBUG_SENSOR_LOG(PSTR(D_TX2x_NAME ": reset statistics"));
|
DEBUG_SENSOR_LOG(PSTR(D_TX2x_NAME ": reset statistics"));
|
||||||
tx2x_last_uptime = uptime;
|
tx2x_last_uptime = TasmotaGlobal.uptime;
|
||||||
Tx2xResetStatData();
|
Tx2xResetStatData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,13 +330,13 @@ void Tx2xRead(void)
|
|||||||
//
|
//
|
||||||
// note: TX23 speed calculation is unstable when conversion starts
|
// note: TX23 speed calculation is unstable when conversion starts
|
||||||
// less than 2 seconds after last request
|
// less than 2 seconds after last request
|
||||||
if ((uptime % TX23_READ_INTERVAL)==0) {
|
if ((TasmotaGlobal.uptime % TX23_READ_INTERVAL)==0) {
|
||||||
// TX23 start transmission by pulling down TxD line for at minimum 500ms
|
// TX23 start transmission by pulling down TxD line for at minimum 500ms
|
||||||
// so we pull TxD signal to low every 3 seconds
|
// so we pull TxD signal to low every 3 seconds
|
||||||
tx23_stage = 0;
|
tx23_stage = 0;
|
||||||
pinMode(Pin(GPIO_TX2X_TXD_BLACK), OUTPUT);
|
pinMode(Pin(GPIO_TX2X_TXD_BLACK), OUTPUT);
|
||||||
digitalWrite(Pin(GPIO_TX2X_TXD_BLACK), LOW);
|
digitalWrite(Pin(GPIO_TX2X_TXD_BLACK), LOW);
|
||||||
} else if ((uptime % TX23_READ_INTERVAL)==1) {
|
} else if ((TasmotaGlobal.uptime % TX23_READ_INTERVAL)==1) {
|
||||||
// after pulling down TxD: pull-up TxD every x+1 seconds
|
// after pulling down TxD: pull-up TxD every x+1 seconds
|
||||||
// to trigger TX23 start transmission
|
// to trigger TX23 start transmission
|
||||||
tx23_stage = 1; // first rising signal is invalid
|
tx23_stage = 1; // first rising signal is invalid
|
||||||
@ -419,7 +419,7 @@ void Tx2xRead(void)
|
|||||||
char siny[FLOATSZ];
|
char siny[FLOATSZ];
|
||||||
dtostrfd(tx2x_wind_direction_avg_y, 1, siny);
|
dtostrfd(tx2x_wind_direction_avg_y, 1, siny);
|
||||||
DEBUG_SENSOR_LOG(PSTR(D_TX2x_NAME ": dir stat - counter=%ld, actint=%ld, avgint=%ld, avg=%s (cosx=%s, siny=%s), min %d, max %d"),
|
DEBUG_SENSOR_LOG(PSTR(D_TX2x_NAME ": dir stat - counter=%ld, actint=%ld, avgint=%ld, avg=%s (cosx=%s, siny=%s), min %d, max %d"),
|
||||||
(uptime-tx2x_last_uptime),
|
(TasmotaGlobal.uptime-tx2x_last_uptime),
|
||||||
tx2x_wind_direction,
|
tx2x_wind_direction,
|
||||||
tx2x_wind_direction_avg_int,
|
tx2x_wind_direction_avg_int,
|
||||||
diravg,
|
diravg,
|
||||||
@ -443,7 +443,7 @@ void Tx2xRead(void)
|
|||||||
|
|
||||||
#ifndef USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
#ifndef USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
||||||
Tx2xCheckSampleCount();
|
Tx2xCheckSampleCount();
|
||||||
if (0==Settings.tele_period && (uptime-tx2x_last_uptime)>=tx2x_avg_samples) {
|
if (0==Settings.tele_period && (TasmotaGlobal.uptime-tx2x_last_uptime)>=tx2x_avg_samples) {
|
||||||
Tx2xResetStat();
|
Tx2xResetStat();
|
||||||
}
|
}
|
||||||
#endif // USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
#endif // USE_TX2X_WIND_SENSOR_NOSTATISTICS
|
||||||
|
@ -137,7 +137,7 @@ void hreEvery50ms(void)
|
|||||||
switch (hre_state)
|
switch (hre_state)
|
||||||
{
|
{
|
||||||
case hre_sync:
|
case hre_sync:
|
||||||
if (uptime < 10)
|
if (TasmotaGlobal.uptime < 10)
|
||||||
break;
|
break;
|
||||||
sync_run = 0;
|
sync_run = 0;
|
||||||
sync_counter = 0;
|
sync_counter = 0;
|
||||||
@ -174,7 +174,7 @@ void hreEvery50ms(void)
|
|||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_HRE "sync_run:%d, sync_counter:%d"), sync_run, sync_counter);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_HRE "sync_run:%d, sync_counter:%d"), sync_run, sync_counter);
|
||||||
read_counter = 0;
|
read_counter = 0;
|
||||||
parity_errors = 0;
|
parity_errors = 0;
|
||||||
curr_start = uptime;
|
curr_start = TasmotaGlobal.uptime;
|
||||||
memset(buff, 0, sizeof(buff));
|
memset(buff, 0, sizeof(buff));
|
||||||
hre_state = hre_reading;
|
hre_state = hre_reading;
|
||||||
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HRE "hre_state:hre_reading"));
|
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HRE "hre_state:hre_reading"));
|
||||||
@ -223,7 +223,7 @@ void hreEvery50ms(void)
|
|||||||
case hre_sleeping:
|
case hre_sleeping:
|
||||||
// If there isn't some delay between readings, rate calculations
|
// If there isn't some delay between readings, rate calculations
|
||||||
// aren't as accurate. 27 seconds will give about a 30 second refresh rate
|
// aren't as accurate. 27 seconds will give about a 30 second refresh rate
|
||||||
if (uptime - hre_usage_time >= 27)
|
if (TasmotaGlobal.uptime - hre_usage_time >= 27)
|
||||||
hre_state = hre_sync;
|
hre_state = hre_sync;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,7 @@ const char HTTP_SNS_SPS30_c[] PROGMEM ="{s}SPS30 " "TYPSIZ" "{m}%s " "um" "{e}";
|
|||||||
void SPS30_Every_Second() {
|
void SPS30_Every_Second() {
|
||||||
if (!sps30_running) return;
|
if (!sps30_running) return;
|
||||||
|
|
||||||
if (uptime%10==0) {
|
if (TasmotaGlobal.uptime%10==0) {
|
||||||
uint8_t vars[sizeof(float)*10];
|
uint8_t vars[sizeof(float)*10];
|
||||||
sps30_get_data(SPS_CMD_READ_MEASUREMENT,vars,sizeof(vars));
|
sps30_get_data(SPS_CMD_READ_MEASUREMENT,vars,sizeof(vars));
|
||||||
float *fp=&sps30_result.PM1_0;
|
float *fp=&sps30_result.PM1_0;
|
||||||
@ -178,7 +178,7 @@ void SPS30_Every_Second() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uptime%3600==0 && uptime>60) {
|
if (TasmotaGlobal.uptime%3600==0 && TasmotaGlobal.uptime>60) {
|
||||||
// should auto clean once per week runtime
|
// should auto clean once per week runtime
|
||||||
// so count hours, should be in Settings
|
// so count hours, should be in Settings
|
||||||
SPS30_HOURS++;
|
SPS30_HOURS++;
|
||||||
|
@ -119,7 +119,7 @@ void hm17_every_second(void) {
|
|||||||
if (!IBEACON_Serial) return;
|
if (!IBEACON_Serial) return;
|
||||||
|
|
||||||
if (hm17_found) {
|
if (hm17_found) {
|
||||||
if (IB_UPDATE_TIME && (uptime%IB_UPDATE_TIME==0)) {
|
if (IB_UPDATE_TIME && (TasmotaGlobal.uptime%IB_UPDATE_TIME==0)) {
|
||||||
if (hm17_cmd!=99) {
|
if (hm17_cmd!=99) {
|
||||||
if (hm17_flag&2) {
|
if (hm17_flag&2) {
|
||||||
ib_sendbeep();
|
ib_sendbeep();
|
||||||
@ -140,7 +140,7 @@ void hm17_every_second(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (uptime%20==0) {
|
if (TasmotaGlobal.uptime%20==0) {
|
||||||
hm17_sendcmd(HM17_TEST);
|
hm17_sendcmd(HM17_TEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ void Hih6Detect(void)
|
|||||||
{
|
{
|
||||||
if (I2cActive(HIH6_ADDR)) { return; }
|
if (I2cActive(HIH6_ADDR)) { return; }
|
||||||
|
|
||||||
if (uptime < 2) { delay(20); } // Skip entering power on comand mode
|
if (TasmotaGlobal.uptime < 2) { delay(20); } // Skip entering power on comand mode
|
||||||
Hih6.type = Hih6Read();
|
Hih6.type = Hih6Read();
|
||||||
if (Hih6.type) {
|
if (Hih6.type) {
|
||||||
I2cSetActiveFound(HIH6_ADDR, Hih6.types);
|
I2cSetActiveFound(HIH6_ADDR, Hih6.types);
|
||||||
@ -85,7 +85,7 @@ void Hih6Detect(void)
|
|||||||
|
|
||||||
void Hih6EverySecond(void)
|
void Hih6EverySecond(void)
|
||||||
{
|
{
|
||||||
if (uptime &1) {
|
if (TasmotaGlobal.uptime &1) {
|
||||||
// HIH6130: 30mS
|
// HIH6130: 30mS
|
||||||
if (!Hih6Read()) {
|
if (!Hih6Read()) {
|
||||||
AddLogMissed(Hih6.types, Hih6.valid);
|
AddLogMissed(Hih6.types, Hih6.valid);
|
||||||
|
@ -79,7 +79,7 @@ void Dht12Detect(void)
|
|||||||
|
|
||||||
void Dht12EverySecond(void)
|
void Dht12EverySecond(void)
|
||||||
{
|
{
|
||||||
if (uptime &1) {
|
if (TasmotaGlobal.uptime &1) {
|
||||||
// DHT12: 55mS
|
// DHT12: 55mS
|
||||||
if (!Dht12Read()) {
|
if (!Dht12Read()) {
|
||||||
AddLogMissed(Dht12.name, Dht12.valid);
|
AddLogMissed(Dht12.name, Dht12.valid);
|
||||||
|
@ -259,7 +259,7 @@ void HdcDetect(void) {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void HdcEverySecond(void) {
|
void HdcEverySecond(void) {
|
||||||
if (uptime &1) { // Every 2 seconds
|
if (TasmotaGlobal.uptime &1) { // Every 2 seconds
|
||||||
if (!HdcTriggerRead()) {
|
if (!HdcTriggerRead()) {
|
||||||
AddLogMissed((char*) hdc_type_name, hdc_valid);
|
AddLogMissed((char*) hdc_type_name, hdc_valid);
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ void HP303B_Detect(void) {
|
|||||||
|
|
||||||
void HP303B_EverySecond(void) {
|
void HP303B_EverySecond(void) {
|
||||||
for (uint32_t i = 0; i < hp303b_cfg.count; i++) {
|
for (uint32_t i = 0; i < hp303b_cfg.count; i++) {
|
||||||
if (uptime &1) {
|
if (TasmotaGlobal.uptime &1) {
|
||||||
if (!HP303B_Read(i)) {
|
if (!HP303B_Read(i)) {
|
||||||
AddLogMissed(hp303b_cfg.types, hp303b_sensor[i].valid);
|
AddLogMissed(hp303b_cfg.types, hp303b_sensor[i].valid);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ void HandleMetrics(void)
|
|||||||
// Pseudo-metric providing metadata about the running firmware version.
|
// Pseudo-metric providing metadata about the running firmware version.
|
||||||
WSContentSend_P(PSTR("# TYPE tasmota_info gauge\ntasmota_info{version=\"%s\",image=\"%s\",build_timestamp=\"%s\"} 1\n"),
|
WSContentSend_P(PSTR("# TYPE tasmota_info gauge\ntasmota_info{version=\"%s\",image=\"%s\",build_timestamp=\"%s\"} 1\n"),
|
||||||
my_version, my_image, GetBuildDateAndTime().c_str());
|
my_version, my_image, GetBuildDateAndTime().c_str());
|
||||||
WSContentSend_P(PSTR("# TYPE tasmota_uptime_seconds gauge\ntasmota_uptime_seconds %d\n"), uptime);
|
WSContentSend_P(PSTR("# TYPE tasmota_uptime_seconds gauge\ntasmota_uptime_seconds %d\n"), TasmotaGlobal.uptime);
|
||||||
WSContentSend_P(PSTR("# TYPE tasmota_boot_count counter\ntasmota_boot_count %d\n"), Settings.bootcount);
|
WSContentSend_P(PSTR("# TYPE tasmota_boot_count counter\ntasmota_boot_count %d\n"), Settings.bootcount);
|
||||||
WSContentSend_P(PSTR("# TYPE tasmota_flash_writes_total counter\ntasmota_flash_writes_total %d\n"), Settings.save_flag);
|
WSContentSend_P(PSTR("# TYPE tasmota_flash_writes_total counter\ntasmota_flash_writes_total %d\n"), Settings.save_flag);
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ struct EZOCO2 : public EZOStruct {
|
|||||||
EZOStruct::ProcessMeasurement(data, sizeof(data), EZO_CO2_READ_LATENCY);
|
EZOStruct::ProcessMeasurement(data, sizeof(data), EZO_CO2_READ_LATENCY);
|
||||||
|
|
||||||
// sensor has a 10s warmup period
|
// sensor has a 10s warmup period
|
||||||
if (uptime >= 10) {
|
if (TasmotaGlobal.uptime >= 10) {
|
||||||
CO2 = atoi(data);
|
CO2 = atoi(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,7 +42,7 @@ struct EZOCO2 : public EZOStruct {
|
|||||||
if (json) {
|
if (json) {
|
||||||
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_CO2 "\":%d}" ), name, CO2);
|
ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_CO2 "\":%d}" ), name, CO2);
|
||||||
}
|
}
|
||||||
#ifdef USE_WEBSERVER
|
#ifdef USE_WEBSERVER
|
||||||
else {
|
else {
|
||||||
WSContentSend_PD(HTTP_SNS_CO2, name, CO2);
|
WSContentSend_PD(HTTP_SNS_CO2, name, CO2);
|
||||||
#endif // USE_WEBSERVER
|
#endif // USE_WEBSERVER
|
||||||
|
@ -138,12 +138,12 @@ struct EZOManager {
|
|||||||
// Do we have to deal with the 2 stage booting process?
|
// Do we have to deal with the 2 stage booting process?
|
||||||
if (count < 0) {
|
if (count < 0) {
|
||||||
// EZO devices take 2s to boot
|
// EZO devices take 2s to boot
|
||||||
if (uptime >= next) {
|
if (TasmotaGlobal.uptime >= next) {
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
if (count == -1) {
|
if (count == -1) {
|
||||||
DetectRequest();
|
DetectRequest();
|
||||||
next = uptime + 1;
|
next = TasmotaGlobal.uptime + 1;
|
||||||
} else if (count == 0) {
|
} else if (count == 0) {
|
||||||
ProcessDetection();
|
ProcessDetection();
|
||||||
}
|
}
|
||||||
|
@ -917,7 +917,7 @@ bool XsnsCall(uint8_t Function)
|
|||||||
uint32_t profile_millis = millis() - profile_start_millis;
|
uint32_t profile_millis = millis() - profile_start_millis;
|
||||||
if (profile_millis) {
|
if (profile_millis) {
|
||||||
if (FUNC_EVERY_SECOND == Function) {
|
if (FUNC_EVERY_SECOND == Function) {
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PRF: At %08u XsnsCall %d to Sensor %d took %u mS"), uptime, Function, x, profile_millis);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PRF: At %08u XsnsCall %d to Sensor %d took %u mS"), TasmotaGlobal.uptime, Function, x, profile_millis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // PROFILE_XSNS_SENSOR_EVERY_SECOND
|
#endif // PROFILE_XSNS_SENSOR_EVERY_SECOND
|
||||||
@ -937,7 +937,7 @@ bool XsnsCall(uint8_t Function)
|
|||||||
uint32_t profile_millis = millis() - profile_start_millis;
|
uint32_t profile_millis = millis() - profile_start_millis;
|
||||||
if (profile_millis) {
|
if (profile_millis) {
|
||||||
if (FUNC_EVERY_SECOND == Function) {
|
if (FUNC_EVERY_SECOND == Function) {
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PRF: At %08u XsnsCall %d took %u mS"), uptime, Function, profile_millis);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR("PRF: At %08u XsnsCall %d took %u mS"), TasmotaGlobal.uptime, Function, profile_millis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // PROFILE_XSNS_EVERY_SECOND
|
#endif // PROFILE_XSNS_EVERY_SECOND
|
||||||
|
Loading…
x
Reference in New Issue
Block a user