feat: added GPIO inversion setting for extpump

This commit is contained in:
Yurii
2025-10-31 21:08:35 +03:00
parent 5667199988
commit b9010643f0
9 changed files with 58 additions and 6 deletions

View File

@@ -609,7 +609,12 @@ protected:
if (GPIO_IS_VALID(settings.externalPump.gpio)) { if (GPIO_IS_VALID(settings.externalPump.gpio)) {
configuredGpio = settings.externalPump.gpio; configuredGpio = settings.externalPump.gpio;
pinMode(configuredGpio, OUTPUT); pinMode(configuredGpio, OUTPUT);
digitalWrite(configuredGpio, LOW); digitalWrite(
configuredGpio,
settings.externalPump.invertState
? HIGH
: LOW
);
} else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) { } else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
configuredGpio = GPIO_IS_NOT_CONFIGURED; configuredGpio = GPIO_IS_NOT_CONFIGURED;
@@ -637,7 +642,12 @@ protected:
if (!settings.externalPump.use) { if (!settings.externalPump.use) {
if (vars.externalPump.state) { if (vars.externalPump.state) {
digitalWrite(configuredGpio, LOW); digitalWrite(
configuredGpio,
settings.externalPump.invertState
? HIGH
: LOW
);
vars.externalPump.state = false; vars.externalPump.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
@@ -650,7 +660,12 @@ protected:
if (vars.externalPump.state && !this->heatingEnabled) { if (vars.externalPump.state && !this->heatingEnabled) {
if (this->extPumpStartReason == MainTask::PumpStartReason::HEATING && millis() - this->heatingDisabledTime > (settings.externalPump.postCirculationTime * 1000u)) { 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.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
@@ -658,7 +673,12 @@ protected:
Log.sinfoln(FPSTR(L_EXTPUMP), F("Disabled: expired post circulation time")); 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)) { } 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.state = false;
vars.externalPump.lastEnabledTime = millis(); vars.externalPump.lastEnabledTime = millis();
@@ -674,7 +694,12 @@ protected:
this->externalPumpStartTime = millis(); this->externalPumpStartTime = millis();
this->extPumpStartReason = MainTask::PumpStartReason::HEATING; this->extPumpStartReason = MainTask::PumpStartReason::HEATING;
digitalWrite(configuredGpio, HIGH); digitalWrite(
configuredGpio,
settings.externalPump.invertState
? LOW
: HIGH
);
Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: heating on")); Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: heating on"));
@@ -683,7 +708,12 @@ protected:
this->externalPumpStartTime = millis(); this->externalPumpStartTime = millis();
this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK; this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK;
digitalWrite(configuredGpio, HIGH); digitalWrite(
configuredGpio,
settings.externalPump.invertState
? LOW
: HIGH
);
Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: anti stuck")); Log.sinfoln(FPSTR(L_EXTPUMP), F("Enabled: anti stuck"));
} }

View File

@@ -162,6 +162,7 @@ struct Settings {
struct { struct {
bool use = false; bool use = false;
uint8_t gpio = DEFAULT_EXT_PUMP_GPIO; uint8_t gpio = DEFAULT_EXT_PUMP_GPIO;
bool invertState = false;
unsigned short postCirculationTime = 600; unsigned short postCirculationTime = 600;
unsigned int antiStuckInterval = 2592000; unsigned int antiStuckInterval = 2592000;
unsigned short antiStuckTime = 300; unsigned short antiStuckTime = 300;

View File

@@ -542,6 +542,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
auto externalPump = dst[FPSTR(S_EXTERNAL_PUMP)].to<JsonObject>(); auto externalPump = dst[FPSTR(S_EXTERNAL_PUMP)].to<JsonObject>();
externalPump[FPSTR(S_USE)] = src.externalPump.use; externalPump[FPSTR(S_USE)] = src.externalPump.use;
externalPump[FPSTR(S_GPIO)] = src.externalPump.gpio; 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_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_INTERVAL)] = roundf(src.externalPump.antiStuckInterval / 86400, 0);
externalPump[FPSTR(S_ANTI_STUCK_TIME)] = roundf(src.externalPump.antiStuckTime / 60, 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>()) {
bool value = src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_INVERT_STATE)].as<bool>();
if (value != dst.externalPump.invertState) {
dst.externalPump.invertState = value;
changed = true;
}
}
if (!src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_POST_CIRCULATION_TIME)].isNull()) { 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<unsigned short>(); unsigned short value = src[FPSTR(S_EXTERNAL_PUMP)][FPSTR(S_POST_CIRCULATION_TIME)].as<unsigned short>();

View File

@@ -455,6 +455,7 @@
"extPump": { "extPump": {
"use": "使用外置循环泵", "use": "使用外置循环泵",
"gpio": "继电器 GPIO引脚", "gpio": "继电器 GPIO引脚",
"invertState": "切换 GPIO 状态",
"postCirculationTime": "后循环时间 <small>(分钟)</small>", "postCirculationTime": "后循环时间 <small>(分钟)</small>",
"antiStuckInterval": "防卡死间隔时间<small>(天)</small>", "antiStuckInterval": "防卡死间隔时间<small>(天)</small>",
"antiStuckTime": "防卡死运行时长<small>(分钟)</small>" "antiStuckTime": "防卡死运行时长<small>(分钟)</small>"

View File

@@ -455,6 +455,7 @@
"extPump": { "extPump": {
"use": "Use external pump", "use": "Use external pump",
"gpio": "Relay GPIO", "gpio": "Relay GPIO",
"invertState": "Invert GPIO state",
"postCirculationTime": "Post circulation time <small>(min)</small>", "postCirculationTime": "Post circulation time <small>(min)</small>",
"antiStuckInterval": "Anti stuck interval <small>(days)</small>", "antiStuckInterval": "Anti stuck interval <small>(days)</small>",
"antiStuckTime": "Anti stuck time <small>(min)</small>" "antiStuckTime": "Anti stuck time <small>(min)</small>"

View File

@@ -455,6 +455,7 @@
"extPump": { "extPump": {
"use": "Usa pompa/circolatore esterno", "use": "Usa pompa/circolatore esterno",
"gpio": "GPIO relè", "gpio": "GPIO relè",
"invertState": "Inverti stato GPIO",
"postCirculationTime": "Tempo di post circolazione <small>(min)</small>", "postCirculationTime": "Tempo di post circolazione <small>(min)</small>",
"antiStuckInterval": "Intervallo antiblocco <small>(days)</small>", "antiStuckInterval": "Intervallo antiblocco <small>(days)</small>",
"antiStuckTime": "Tempo antiblocco <small>(min)</small>" "antiStuckTime": "Tempo antiblocco <small>(min)</small>"

View File

@@ -417,6 +417,7 @@
"extPump": { "extPump": {
"use": "Gebruik externe pomp", "use": "Gebruik externe pomp",
"gpio": "Relais GPIO", "gpio": "Relais GPIO",
"invertState": "Inverteer GPIO-status",
"postCirculationTime": "Nacirculatietijd <small>(min)</small>", "postCirculationTime": "Nacirculatietijd <small>(min)</small>",
"antiStuckInterval": "Anti-vastloopinterval <small>(dagen)</small>", "antiStuckInterval": "Anti-vastloopinterval <small>(dagen)</small>",
"antiStuckTime": "Anti-vastlooptijd <small>(min)</small>" "antiStuckTime": "Anti-vastlooptijd <small>(min)</small>"

View File

@@ -455,6 +455,7 @@
"extPump": { "extPump": {
"use": "Использовать доп. насос", "use": "Использовать доп. насос",
"gpio": "GPIO реле", "gpio": "GPIO реле",
"invertState": "Инвертировать состояние GPIO",
"postCirculationTime": "Время постциркуляции <small>(в минутах)</small>", "postCirculationTime": "Время постциркуляции <small>(в минутах)</small>",
"antiStuckInterval": "Интервал защиты от блокировки <small>(в днях)</small>", "antiStuckInterval": "Интервал защиты от блокировки <small>(в днях)</small>",
"antiStuckTime": "Время работы насоса <small>(в минутах)</small>" "antiStuckTime": "Время работы насоса <small>(в минутах)</small>"

View File

@@ -731,6 +731,11 @@
<input type="checkbox" name="externalPump[use]" value="true"> <input type="checkbox" name="externalPump[use]" value="true">
<span data-i18n>settings.extPump.use</span> <span data-i18n>settings.extPump.use</span>
</label> </label>
<label>
<input type="checkbox" name="externalPump[invertState]" value="true">
<span data-i18n>settings.externalPump.invertState</span>
</label>
</fieldset> </fieldset>
<div class="grid"> <div class="grid">
@@ -928,6 +933,7 @@
// Extpump // Extpump
setCheckboxValue("[name='externalPump[use]']", data.externalPump.use); setCheckboxValue("[name='externalPump[use]']", data.externalPump.use);
setInputValue("[name='externalPump[gpio]']", data.externalPump.gpio < 255 ? data.externalPump.gpio : ''); 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[postCirculationTime]']", data.externalPump.postCirculationTime);
setInputValue("[name='externalPump[antiStuckInterval]']", data.externalPump.antiStuckInterval); setInputValue("[name='externalPump[antiStuckInterval]']", data.externalPump.antiStuckInterval);
setInputValue("[name='externalPump[antiStuckTime]']", data.externalPump.antiStuckTime); setInputValue("[name='externalPump[antiStuckTime]']", data.externalPump.antiStuckTime);