diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 1b2e03a..95e012b 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -229,7 +229,13 @@ protected: vars.slave.flame = CustomOpenTherm::isFlameOn(response); vars.slave.cooling = CustomOpenTherm::isCoolingActive(response); vars.slave.fault.active = CustomOpenTherm::isFault(response); - vars.slave.diag.active = CustomOpenTherm::isDiagnostic(response); + + if (!settings.opentherm.options.ignoreDiagState) { + vars.slave.diag.active = CustomOpenTherm::isDiagnostic(response); + + } else if (vars.slave.diag.active) { + vars.slave.diag.active = false; + } Log.snoticeln( FPSTR(L_OT), F("Received boiler status. Heating: %hhu; DHW: %hhu; flame: %hhu; cooling: %hhu; fault: %hhu; diag: %hhu"), @@ -501,6 +507,16 @@ protected: vars.slave.diag.code = 0; } + // Auto fault reset + if (settings.opentherm.options.autoFaultReset && vars.slave.fault.active && !vars.actions.resetFault) { + vars.actions.resetFault = true; + } + + // Auto diag reset + if (settings.opentherm.options.autoDiagReset && vars.slave.diag.active && !vars.actions.resetDiagnostic) { + vars.actions.resetDiagnostic = true; + } + this->prevUpdateNonEssentialVars = millis(); } diff --git a/src/Settings.h b/src/Settings.h index 4bc37b9..b705aba 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -73,6 +73,9 @@ struct Settings { bool dhwBlocking = false; bool maxTempSyncWithTargetTemp = true; bool getMinMaxTemp = true; + bool ignoreDiagState = false; + bool autoFaultReset = false; + bool autoDiagReset = false; bool nativeHeatingControl = false; bool immergasFix = false; } options; diff --git a/src/strings.h b/src/strings.h index 64cf680..641a906 100644 --- a/src/strings.h +++ b/src/strings.h @@ -42,6 +42,8 @@ const char S_ANTI_STUCK_TIME[] PROGMEM = "antiStuckTime"; const char S_AP[] PROGMEM = "ap"; const char S_APP_VERSION[] PROGMEM = "appVersion"; const char S_AUTH[] PROGMEM = "auth"; +const char S_AUTO_DIAG_RESET[] PROGMEM = "autoDiagReset"; +const char S_AUTO_FAULT_RESET[] PROGMEM = "autoFaultReset"; const char S_BACKTRACE[] PROGMEM = "backtrace"; const char S_BATTERY[] PROGMEM = "battery"; const char S_BAUDRATE[] PROGMEM = "baudrate"; @@ -101,6 +103,7 @@ const char S_HOSTNAME[] PROGMEM = "hostname"; const char S_HUMIDITY[] PROGMEM = "humidity"; const char S_HYSTERESIS[] PROGMEM = "hysteresis"; const char S_ID[] PROGMEM = "id"; +const char S_IGNORE_DIAG_STATE[] PROGMEM = "ignoreDiagState"; const char S_IMMERGAS_FIX[] PROGMEM = "immergasFix"; const char S_INDOOR_TEMP[] PROGMEM = "indoorTemp"; const char S_INDOOR_TEMP_CONTROL[] PROGMEM = "indoorTempControl"; diff --git a/src/utils.h b/src/utils.h index b3ef87b..6759195 100644 --- a/src/utils.h +++ b/src/utils.h @@ -463,6 +463,9 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) { otOptions[FPSTR(S_DHW_BLOCKING)] = src.opentherm.options.dhwBlocking; otOptions[FPSTR(S_MAX_TEMP_SYNC_WITH_TARGET_TEMP)] = src.opentherm.options.maxTempSyncWithTargetTemp; otOptions[FPSTR(S_GET_MIN_MAX_TEMP)] = src.opentherm.options.getMinMaxTemp; + otOptions[FPSTR(S_IGNORE_DIAG_STATE)] = src.opentherm.options.ignoreDiagState; + otOptions[FPSTR(S_AUTO_FAULT_RESET)] = src.opentherm.options.autoFaultReset; + otOptions[FPSTR(S_AUTO_DIAG_RESET)] = src.opentherm.options.autoDiagReset; otOptions[FPSTR(S_NATIVE_HEATING_CONTROL)] = src.opentherm.options.nativeHeatingControl; otOptions[FPSTR(S_IMMERGAS_FIX)] = src.opentherm.options.immergasFix; @@ -937,6 +940,33 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false } } + if (src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_IGNORE_DIAG_STATE)].is()) { + bool value = src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_IGNORE_DIAG_STATE)].as(); + + if (value != dst.opentherm.options.ignoreDiagState) { + dst.opentherm.options.ignoreDiagState = value; + changed = true; + } + } + + if (src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_AUTO_FAULT_RESET)].is()) { + bool value = src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_AUTO_FAULT_RESET)].as(); + + if (value != dst.opentherm.options.autoFaultReset) { + dst.opentherm.options.autoFaultReset = value; + changed = true; + } + } + + if (src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_AUTO_DIAG_RESET)].is()) { + bool value = src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_AUTO_DIAG_RESET)].as(); + + if (value != dst.opentherm.options.autoDiagReset) { + dst.opentherm.options.autoDiagReset = value; + changed = true; + } + } + if (src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_NATIVE_HEATING_CONTROL)].is()) { bool value = src[FPSTR(S_OPENTHERM)][FPSTR(S_OPTIONS)][FPSTR(S_NATIVE_HEATING_CONTROL)].as(); diff --git a/src_data/locales/en.json b/src_data/locales/en.json index 2c4f394..fef099b 100644 --- a/src_data/locales/en.json +++ b/src_data/locales/en.json @@ -397,6 +397,9 @@ "dhwBlocking": "DHW blocking", "maxTempSyncWithTargetTemp": "Sync max heating temp with target temp", "getMinMaxTemp": "Get min/max temp from boiler", + "ignoreDiagState": "Ignore diag state", + "autoFaultReset": "Auto fault reset (not recommended!)", + "autoDiagReset": "Auto diag reset (not recommended!)", "immergasFix": "Fix for Immergas boilers" }, diff --git a/src_data/locales/it.json b/src_data/locales/it.json index 36ff42a..0ee8854 100644 --- a/src_data/locales/it.json +++ b/src_data/locales/it.json @@ -397,6 +397,9 @@ "dhwBlocking": "Bloccare ACS", "maxTempSyncWithTargetTemp": "Sincronizza la temperatura massima di riscaldamento con la temperatura target", "getMinMaxTemp": "Prendi temp min/max dalla caldaia", + "ignoreDiagState": "Ignora lo stato diagnostico", + "autoFaultReset": "Ripristino automatico degli errori (sconsigliato!)", + "autoDiagReset": "Ripristino diagnostico automatica (sconsigliato!)", "immergasFix": "Fix per caldiaie Immergas" }, diff --git a/src_data/locales/ru.json b/src_data/locales/ru.json index acc3a90..07a3d11 100644 --- a/src_data/locales/ru.json +++ b/src_data/locales/ru.json @@ -397,6 +397,9 @@ "dhwBlocking": "DHW blocking", "maxTempSyncWithTargetTemp": "Синхронизировать макс. темп. отопления с целевой темп.", "getMinMaxTemp": "Получать мин. и макс. температуру от котла", + "ignoreDiagState": "Игнорировать состояние диагностики", + "autoFaultReset": "Автоматический сброс ошибок (не рекомендуется!)", + "autoDiagReset": "Автоматический сброс диагностики (не рекомендуется!)", "immergasFix": "Фикс для котлов Immergas" }, diff --git a/src_data/pages/settings.html b/src_data/pages/settings.html index 453a894..3df4da0 100644 --- a/src_data/pages/settings.html +++ b/src_data/pages/settings.html @@ -536,6 +536,21 @@ settings.ot.options.getMinMaxTemp + + + + + +