diff --git a/src/MainTask.h b/src/MainTask.h index af02b60..8d746e0 100644 --- a/src/MainTask.h +++ b/src/MainTask.h @@ -609,7 +609,12 @@ protected: if (GPIO_IS_VALID(settings.externalPump.gpio)) { configuredGpio = settings.externalPump.gpio; pinMode(configuredGpio, OUTPUT); - digitalWrite(configuredGpio, LOW); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? HIGH + : LOW + ); } else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) { configuredGpio = GPIO_IS_NOT_CONFIGURED; @@ -637,7 +642,12 @@ protected: if (!settings.externalPump.use) { if (vars.externalPump.state) { - digitalWrite(configuredGpio, LOW); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? HIGH + : LOW + ); vars.externalPump.state = false; vars.externalPump.lastEnabledTime = millis(); @@ -650,7 +660,12 @@ protected: if (vars.externalPump.state && !this->heatingEnabled) { if (this->extPumpStartReason == MainTask::PumpStartReason::HEATING && millis() - this->heatingDisabledTime > (settings.externalPump.postCirculationTime * 1000u)) { - digitalWrite(configuredGpio, LOW); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? HIGH + : LOW + ); vars.externalPump.state = false; vars.externalPump.lastEnabledTime = millis(); @@ -658,7 +673,12 @@ protected: Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: expired post circulation time")); } else if (this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK && millis() - this->externalPumpStartTime >= (settings.externalPump.antiStuckTime * 1000u)) { - digitalWrite(configuredGpio, LOW); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? HIGH + : LOW + ); vars.externalPump.state = false; vars.externalPump.lastEnabledTime = millis(); @@ -674,7 +694,12 @@ protected: this->externalPumpStartTime = millis(); this->extPumpStartReason = MainTask::PumpStartReason::HEATING; - digitalWrite(configuredGpio, HIGH); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? LOW + : HIGH + ); Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: heating on")); @@ -683,7 +708,12 @@ protected: this->externalPumpStartTime = millis(); this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK; - digitalWrite(configuredGpio, HIGH); + digitalWrite( + configuredGpio, + settings.externalPump.invertState + ? LOW + : HIGH + ); Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: anti stuck")); } diff --git a/src/Settings.h b/src/Settings.h index 80ab827..ecb4d15 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -162,6 +162,7 @@ struct Settings { struct { bool use = false; uint8_t gpio = DEFAULT_EXT_PUMP_GPIO; + bool invertState = false; unsigned short postCirculationTime = 600; unsigned int antiStuckInterval = 2592000; unsigned short antiStuckTime = 300; diff --git a/src/utils.h b/src/utils.h index 5824c2f..8442dbf 100644 --- a/src/utils.h +++ b/src/utils.h @@ -542,6 +542,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) { auto externalPump = dst[FPSTR(S_EXTERNAL_PUMP)].to(); externalPump[FPSTR(S_USE)] = src.externalPump.use; externalPump[FPSTR(S_GPIO)] = src.externalPump.gpio; + externalPump[FPSTR(S_INVERT_STATE)] = src.externalPump.invertState; externalPump[FPSTR(S_POST_CIRCULATION_TIME)] = roundf(src.externalPump.postCirculationTime / 60, 0); externalPump[FPSTR(S_ANTI_STUCK_INTERVAL)] = roundf(src.externalPump.antiStuckInterval / 86400, 0); externalPump[FPSTR(S_ANTI_STUCK_TIME)] = roundf(src.externalPump.antiStuckTime / 60, 0); @@ -1492,6 +1493,15 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false } } + if (src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_INVERT_STATE)].is()) { + bool value = src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_INVERT_STATE)].as(); + + if (value != dst.externalPump.invertState) { + dst.externalPump.invertState = value; + changed = true; + } + } + if (!src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_POST_CIRCULATION_TIME)].isNull()) { unsigned short value = src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_POST_CIRCULATION_TIME)].as(); diff --git a/src_data/locales/cn.json b/src_data/locales/cn.json index abf02f8..10a3a6b 100644 --- a/src_data/locales/cn.json +++ b/src_data/locales/cn.json @@ -455,6 +455,7 @@ "extPump": { "use": "使用外置循环泵", "gpio": "继电器 GPIO引脚", + "invertState": "切换 GPIO 状态", "postCirculationTime": "后循环时间 (分钟)", "antiStuckInterval": "防卡死间隔时间(天)", "antiStuckTime": "防卡死运行时长(分钟)" diff --git a/src_data/locales/en.json b/src_data/locales/en.json index c3f880d..24ac153 100644 --- a/src_data/locales/en.json +++ b/src_data/locales/en.json @@ -455,6 +455,7 @@ "extPump": { "use": "Use external pump", "gpio": "Relay GPIO", + "invertState": "Invert GPIO state", "postCirculationTime": "Post circulation time (min)", "antiStuckInterval": "Anti stuck interval (days)", "antiStuckTime": "Anti stuck time (min)" diff --git a/src_data/locales/it.json b/src_data/locales/it.json index 454fb8e..2e4f15c 100644 --- a/src_data/locales/it.json +++ b/src_data/locales/it.json @@ -455,6 +455,7 @@ "extPump": { "use": "Usa pompa/circolatore esterno", "gpio": "GPIO relè", + "invertState": "Inverti stato GPIO", "postCirculationTime": "Tempo di post circolazione (min)", "antiStuckInterval": "Intervallo antiblocco (days)", "antiStuckTime": "Tempo antiblocco (min)" diff --git a/src_data/locales/nl.json b/src_data/locales/nl.json index 70cacd3..65ff5a3 100644 --- a/src_data/locales/nl.json +++ b/src_data/locales/nl.json @@ -417,6 +417,7 @@ "extPump": { "use": "Gebruik externe pomp", "gpio": "Relais GPIO", + "invertState": "Inverteer GPIO-status", "postCirculationTime": "Nacirculatietijd (min)", "antiStuckInterval": "Anti-vastloopinterval (dagen)", "antiStuckTime": "Anti-vastlooptijd (min)" diff --git a/src_data/locales/ru.json b/src_data/locales/ru.json index b712c3c..7a6e627 100644 --- a/src_data/locales/ru.json +++ b/src_data/locales/ru.json @@ -455,6 +455,7 @@ "extPump": { "use": "Использовать доп. насос", "gpio": "GPIO реле", + "invertState": "Инвертировать состояние GPIO", "postCirculationTime": "Время постциркуляции (в минутах)", "antiStuckInterval": "Интервал защиты от блокировки (в днях)", "antiStuckTime": "Время работы насоса (в минутах)" diff --git a/src_data/pages/settings.html b/src_data/pages/settings.html index cec0087..f5c4494 100644 --- a/src_data/pages/settings.html +++ b/src_data/pages/settings.html @@ -731,6 +731,11 @@ settings.extPump.use + +
@@ -928,6 +933,7 @@ // Extpump setCheckboxValue("[name='externalPump[use]']", data.externalPump.use); setInputValue("[name='externalPump[gpio]']", data.externalPump.gpio < 255 ? data.externalPump.gpio : ''); + setCheckboxValue("[name='externalPump[invertState]']", data.externalPump.invertState); setInputValue("[name='externalPump[postCirculationTime]']", data.externalPump.postCirculationTime); setInputValue("[name='externalPump[antiStuckInterval]']", data.externalPump.antiStuckInterval); setInputValue("[name='externalPump[antiStuckTime]']", data.externalPump.antiStuckTime);