feat: added settings for status led gpio, opentherm rx led gpio, emergency treshold time

This commit is contained in:
Yurii
2024-04-11 23:53:15 +03:00
parent 31dfc21d69
commit fbc43dc535
8 changed files with 200 additions and 85 deletions

View File

@@ -78,39 +78,44 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Serial</legend> <label for="system-status-led-gpio">
Status LED GPIO
<label for="system-serial-enable"> <input type="number" inputmode="numeric" id="system-status-led-gpio" name="system[statusLedGpio]" min="0" max="254" step="1">
<input type="checkbox" id="system-serial-enable" name="system[serial][enable]" value="true"> <small>blank - not use</small>
Enable
</label>
<label for="system-serial-baudrate">
Baud rate
<input type="number" inputmode="numeric" id="system-serial-baudrate" name="system[serial][baudrate]" min="9600" max="115200" step="1" required>
<small>(Available: 9600, 19200, 38400, 57600, 74880, 115200)</small>
</label> </label>
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>Telnet</legend> <legend>Diagnostic</legend>
<label for="system-telnet-enable">
<input type="checkbox" id="system-telnet-enable" name="system[telnet][enable]" value="true">
Enable
</label>
<label for="system-telnet-port">
Port
<input type="number" inputmode="numeric" id="system-telnet-port" name="system[telnet][port]" min="1" max="65535" step="1" required>
</label>
</fieldset>
<fieldset>
<label for="system-debug"> <label for="system-debug">
<input type="checkbox" id="system-debug" name="system[debug]" value="true"> <input type="checkbox" id="system-debug" name="system[debug]" value="true">
Debug mode Debug mode
</label> </label>
<label for="system-serial-enable">
<input type="checkbox" id="system-serial-enable" name="system[serial][enable]" value="true">
Enable Serial port
</label>
<label for="system-telnet-enable">
<input type="checkbox" id="system-telnet-enable" name="system[telnet][enable]" value="true">
Enable Telnet
</label>
<div class="grid">
<label for="system-serial-baudrate">
Serial port baud rate
<input type="number" inputmode="numeric" id="system-serial-baudrate" name="system[serial][baudrate]" min="9600" max="115200" step="1" required>
<small>Available: 9600, 19200, 38400, 57600, 74880, 115200</small>
</label>
<label for="system-telnet-port">
Telnet port
<input type="number" inputmode="numeric" id="system-telnet-port" name="system[telnet][port]" min="1" max="65535" step="1" required>
<small>Default: 23</small>
</label>
</div>
</fieldset> </fieldset>
<fieldset> <fieldset>
@@ -201,7 +206,7 @@
</small> </small>
</fieldset> </fieldset>
<fieldset> <div class="grid">
<label for="emergency-target"> <label for="emergency-target">
Target temperature Target temperature
<input type="number" inputmode="numeric" id="emergency-target" name="emergency[target]" min="0" max="0" step="1" required> <input type="number" inputmode="numeric" id="emergency-target" name="emergency[target]" min="0" max="0" step="1" required>
@@ -210,7 +215,12 @@
<u>Heat carrier temperature</u> if Equitherm and PID <b>is disabled</b> <u>Heat carrier temperature</u> if Equitherm and PID <b>is disabled</b>
</small> </small>
</label> </label>
</fieldset>
<label for="emergency-treshold-time">
Treshold time <small>(sec)</small>
<input type="number" inputmode="numeric" id="emergency-treshold-time" name="emergency[tresholdTime]" min="60" max="1800" step="1" required>
</label>
</div>
<fieldset> <fieldset>
<legend>Events</legend> <legend>Events</legend>
@@ -371,6 +381,14 @@
Out GPIO Out GPIO
<input type="number" inputmode="numeric" id="opentherm-out-gpio" name="opentherm[outGpio]" min="0" max="254" step="1"> <input type="number" inputmode="numeric" id="opentherm-out-gpio" name="opentherm[outGpio]" min="0" max="254" step="1">
</label> </label>
</div>
<div class="grid">
<label for="opentherm-rx-led-gpio">
RX LED GPIO
<input type="number" inputmode="numeric" id="opentherm-rx-led-gpio" name="opentherm[rxLedGpio]" min="0" max="254" step="1">
<small>blank - not use</small>
</label>
<label for="opentherm-member-id-code"> <label for="opentherm-member-id-code">
Master MemberID code Master MemberID code
@@ -638,6 +656,7 @@
setCheckboxValue('#system-telnet-enable', data.system.telnet.enable); setCheckboxValue('#system-telnet-enable', data.system.telnet.enable);
setInputValue('#system-telnet-port', data.system.telnet.port); setInputValue('#system-telnet-port', data.system.telnet.port);
setRadioValue('#system-unit-system', data.system.unitSystem); setRadioValue('#system-unit-system', data.system.unitSystem);
setInputValue('#system-status-led-gpio', data.system.statusLedGpio < 255 ? data.system.statusLedGpio : '');
setBusy('#system-settings-busy', '#system-settings', false); setBusy('#system-settings-busy', '#system-settings', false);
// Portal // Portal
@@ -650,6 +669,7 @@
setRadioValue('#opentherm-unit-system', data.opentherm.unitSystem); setRadioValue('#opentherm-unit-system', data.opentherm.unitSystem);
setInputValue('#opentherm-in-gpio', data.opentherm.inGpio < 255 ? data.opentherm.inGpio : ''); setInputValue('#opentherm-in-gpio', data.opentherm.inGpio < 255 ? data.opentherm.inGpio : '');
setInputValue('#opentherm-out-gpio', data.opentherm.outGpio < 255 ? data.opentherm.outGpio : ''); setInputValue('#opentherm-out-gpio', data.opentherm.outGpio < 255 ? data.opentherm.outGpio : '');
setInputValue('#opentherm-rx-led-gpio', data.opentherm.rxLedGpio < 255 ? data.opentherm.rxLedGpio : '');
setInputValue('#opentherm-member-id-code', data.opentherm.memberIdCode); setInputValue('#opentherm-member-id-code', data.opentherm.memberIdCode);
setCheckboxValue('#opentherm-dhw-present', data.opentherm.dhwPresent); setCheckboxValue('#opentherm-dhw-present', data.opentherm.dhwPresent);
setCheckboxValue('#opentherm-sw-mode', data.opentherm.summerWinterMode); setCheckboxValue('#opentherm-sw-mode', data.opentherm.summerWinterMode);
@@ -718,6 +738,7 @@
// Emergency mode // Emergency mode
setCheckboxValue('#emergency-enable', data.emergency.enable); setCheckboxValue('#emergency-enable', data.emergency.enable);
setInputValue('#emergency-treshold-time', data.emergency.tresholdTime);
setCheckboxValue('#emergency-use-equitherm', data.emergency.useEquitherm); setCheckboxValue('#emergency-use-equitherm', data.emergency.useEquitherm);
setCheckboxValue('#emergency-use-pid', data.emergency.usePid); setCheckboxValue('#emergency-use-pid', data.emergency.usePid);
setCheckboxValue('#emergency-on-network-fault', data.emergency.onNetworkFault); setCheckboxValue('#emergency-on-network-fault', data.emergency.onNetworkFault);

View File

@@ -94,8 +94,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=5 -D DEFAULT_OT_OUT_GPIO=5
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12 -D DEFAULT_SENSOR_OUTDOOR_GPIO=12
-D DEFAULT_SENSOR_INDOOR_GPIO=14 -D DEFAULT_SENSOR_INDOOR_GPIO=14
-D LED_STATUS_GPIO=13 -D DEFAULT_STATUS_LED_GPIO=13
-D LED_OT_RX_GPIO=15 -D DEFAULT_OT_RX_LED_GPIO=15
[env:d1_mini_lite] [env:d1_mini_lite]
platform = ${esp8266_defaults.platform} platform = ${esp8266_defaults.platform}
@@ -110,8 +110,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=5 -D DEFAULT_OT_OUT_GPIO=5
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12 -D DEFAULT_SENSOR_OUTDOOR_GPIO=12
-D DEFAULT_SENSOR_INDOOR_GPIO=14 -D DEFAULT_SENSOR_INDOOR_GPIO=14
-D LED_STATUS_GPIO=13 -D DEFAULT_STATUS_LED_GPIO=13
-D LED_OT_RX_GPIO=15 -D DEFAULT_OT_RX_LED_GPIO=15
[env:d1_mini_pro] [env:d1_mini_pro]
platform = ${esp8266_defaults.platform} platform = ${esp8266_defaults.platform}
@@ -126,8 +126,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=5 -D DEFAULT_OT_OUT_GPIO=5
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12 -D DEFAULT_SENSOR_OUTDOOR_GPIO=12
-D DEFAULT_SENSOR_INDOOR_GPIO=14 -D DEFAULT_SENSOR_INDOOR_GPIO=14
-D LED_STATUS_GPIO=13 -D DEFAULT_STATUS_LED_GPIO=13
-D LED_OT_RX_GPIO=15 -D DEFAULT_OT_RX_LED_GPIO=15
[env:s2_mini] [env:s2_mini]
platform = ${esp32_defaults.platform} platform = ${esp32_defaults.platform}
@@ -142,8 +142,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=35 -D DEFAULT_OT_OUT_GPIO=35
-D DEFAULT_SENSOR_OUTDOOR_GPIO=9 -D DEFAULT_SENSOR_OUTDOOR_GPIO=9
-D DEFAULT_SENSOR_INDOOR_GPIO=7 -D DEFAULT_SENSOR_INDOOR_GPIO=7
-D LED_STATUS_GPIO=11 -D DEFAULT_STATUS_LED_GPIO=11
-D LED_OT_RX_GPIO=12 -D DEFAULT_OT_RX_LED_GPIO=12
[env:s3_mini] [env:s3_mini]
platform = ${esp32_defaults.platform} platform = ${esp32_defaults.platform}
@@ -161,8 +161,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=36 -D DEFAULT_OT_OUT_GPIO=36
-D DEFAULT_SENSOR_OUTDOOR_GPIO=13 -D DEFAULT_SENSOR_OUTDOOR_GPIO=13
-D DEFAULT_SENSOR_INDOOR_GPIO=12 -D DEFAULT_SENSOR_INDOOR_GPIO=12
-D LED_STATUS_GPIO=11 -D DEFAULT_STATUS_LED_GPIO=11
-D LED_OT_RX_GPIO=10 -D DEFAULT_OT_RX_LED_GPIO=10
[env:c3_mini] [env:c3_mini]
platform = ${esp32_defaults.platform} platform = ${esp32_defaults.platform}
@@ -182,8 +182,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=10 -D DEFAULT_OT_OUT_GPIO=10
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0 -D DEFAULT_SENSOR_OUTDOOR_GPIO=0
-D DEFAULT_SENSOR_INDOOR_GPIO=1 -D DEFAULT_SENSOR_INDOOR_GPIO=1
-D LED_STATUS_GPIO=4 -D DEFAULT_STATUS_LED_GPIO=4
-D LED_OT_RX_GPIO=5 -D DEFAULT_OT_RX_LED_GPIO=5
[env:nodemcu_32s] [env:nodemcu_32s]
platform = ${esp32_defaults.platform} platform = ${esp32_defaults.platform}
@@ -201,8 +201,8 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=22 -D DEFAULT_OT_OUT_GPIO=22
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12 -D DEFAULT_SENSOR_OUTDOOR_GPIO=12
-D DEFAULT_SENSOR_INDOOR_GPIO=13 -D DEFAULT_SENSOR_INDOOR_GPIO=13
-D LED_STATUS_GPIO=2 ; 18 -D DEFAULT_STATUS_LED_GPIO=2 ; 18
-D LED_OT_RX_GPIO=19 -D DEFAULT_OT_RX_LED_GPIO=19
;-D WOKWI=1 ;-D WOKWI=1
[env:d1_mini32] [env:d1_mini32]
@@ -221,5 +221,5 @@ build_flags =
-D DEFAULT_OT_OUT_GPIO=22 -D DEFAULT_OT_OUT_GPIO=22
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12 -D DEFAULT_SENSOR_OUTDOOR_GPIO=12
-D DEFAULT_SENSOR_INDOOR_GPIO=18 -D DEFAULT_SENSOR_INDOOR_GPIO=18
-D LED_STATUS_GPIO=2 -D DEFAULT_STATUS_LED_GPIO=2
-D LED_OT_RX_GPIO=19 -D DEFAULT_OT_RX_LED_GPIO=19

View File

@@ -27,7 +27,6 @@ protected:
enum class PumpStartReason {NONE, HEATING, ANTISTUCK}; enum class PumpStartReason {NONE, HEATING, ANTISTUCK};
Blinker* blinker = nullptr; Blinker* blinker = nullptr;
bool blinkerInitialized = false;
unsigned long firstFailConnect = 0; unsigned long firstFailConnect = 0;
unsigned long lastHeapInfo = 0; unsigned long lastHeapInfo = 0;
unsigned int minFreeHeap = 0; unsigned int minFreeHeap = 0;
@@ -51,17 +50,7 @@ protected:
return 3; return 3;
} }
void setup() { void setup() {}
#ifdef LED_STATUS_GPIO
pinMode(LED_STATUS_GPIO, OUTPUT);
digitalWrite(LED_STATUS_GPIO, LOW);
#endif
if (GPIO_IS_VALID(settings.externalPump.gpio)) {
pinMode(settings.externalPump.gpio, OUTPUT);
digitalWrite(settings.externalPump.gpio, LOW);
}
}
void loop() { void loop() {
network->loop(); network->loop();
@@ -111,7 +100,7 @@ protected:
if (!vars.states.emergency && settings.emergency.enable && settings.emergency.onMqttFault && !tMqtt->isEnabled()) { if (!vars.states.emergency && settings.emergency.enable && settings.emergency.onMqttFault && !tMqtt->isEnabled()) {
vars.states.emergency = true; vars.states.emergency = true;
} else if (vars.states.emergency && !settings.emergency.onMqttFault) { } else if (vars.states.emergency && !settings.emergency.onMqttFault) {
vars.states.emergency = false; vars.states.emergency = false;
} }
@@ -142,7 +131,7 @@ protected:
this->firstFailConnect = millis(); this->firstFailConnect = millis();
} }
if (millis() - this->firstFailConnect > EMERGENCY_TIME_TRESHOLD) { if (millis() - this->firstFailConnect > (settings.emergency.tresholdTime * 1000)) {
vars.states.emergency = true; vars.states.emergency = true;
Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode enabled")); Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode enabled"));
} }
@@ -151,9 +140,7 @@ protected:
this->yield(); this->yield();
#ifdef LED_STATUS_GPIO this->ledStatus();
this->ledStatus(LED_STATUS_GPIO);
#endif
this->externalPump(); this->externalPump();
this->yield(); this->yield();
@@ -222,16 +209,32 @@ protected:
} }
} }
void ledStatus(uint8_t gpio) { void ledStatus() {
uint8_t errors[4]; uint8_t errors[4];
uint8_t errCount = 0; uint8_t errCount = 0;
static uint8_t errPos = 0; static uint8_t errPos = 0;
static unsigned long endBlinkTime = 0; static unsigned long endBlinkTime = 0;
static bool ledOn = false; static bool ledOn = false;
static uint8_t configuredGpio = GPIO_IS_NOT_CONFIGURED;
if (!this->blinkerInitialized) { if (settings.system.statusLedGpio != configuredGpio) {
this->blinker->init(gpio); if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
this->blinkerInitialized = true; digitalWrite(configuredGpio, LOW);
}
if (GPIO_IS_VALID(settings.system.statusLedGpio)) {
configuredGpio = settings.system.statusLedGpio;
pinMode(configuredGpio, OUTPUT);
digitalWrite(configuredGpio, LOW);
this->blinker->init(configuredGpio);
} else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
configuredGpio = GPIO_IS_NOT_CONFIGURED;
}
}
if (configuredGpio == GPIO_IS_NOT_CONFIGURED) {
return;
} }
if (!network->isConnected()) { if (!network->isConnected()) {
@@ -258,14 +261,14 @@ protected:
if (!this->blinker->running() && millis() - endBlinkTime >= 5000) { if (!this->blinker->running() && millis() - endBlinkTime >= 5000) {
if (errCount == 0) { if (errCount == 0) {
if (!ledOn) { if (!ledOn) {
digitalWrite(gpio, HIGH); digitalWrite(configuredGpio, HIGH);
ledOn = true; ledOn = true;
} }
return; return;
} else if (ledOn) { } else if (ledOn) {
digitalWrite(gpio, LOW); digitalWrite(configuredGpio, LOW);
ledOn = false; ledOn = false;
endBlinkTime = millis(); endBlinkTime = millis();
return; return;
@@ -286,6 +289,34 @@ protected:
} }
void externalPump() { void externalPump() {
static uint8_t configuredGpio = GPIO_IS_NOT_CONFIGURED;
if (settings.externalPump.gpio != configuredGpio) {
if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
digitalWrite(configuredGpio, LOW);
}
if (GPIO_IS_VALID(settings.externalPump.gpio)) {
configuredGpio = settings.externalPump.gpio;
pinMode(configuredGpio, OUTPUT);
digitalWrite(configuredGpio, LOW);
} else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
configuredGpio = GPIO_IS_NOT_CONFIGURED;
}
}
if (configuredGpio == GPIO_IS_NOT_CONFIGURED) {
if (vars.states.externalPump) {
vars.states.externalPump = false;
vars.parameters.extPumpLastEnableTime = millis();
Log.sinfoln("EXTPUMP", F("Disabled: use = off"));
}
return;
}
if (!vars.states.heating && this->heatingEnabled) { if (!vars.states.heating && this->heatingEnabled) {
this->heatingEnabled = false; this->heatingEnabled = false;
this->heatingDisabledTime = millis(); this->heatingDisabledTime = millis();
@@ -294,11 +325,9 @@ protected:
this->heatingEnabled = true; this->heatingEnabled = true;
} }
if (!settings.externalPump.use || !GPIO_IS_VALID(settings.externalPump.gpio)) { if (!settings.externalPump.use) {
if (vars.states.externalPump) { if (vars.states.externalPump) {
if (GPIO_IS_VALID(settings.externalPump.gpio)) { digitalWrite(configuredGpio, LOW);
digitalWrite(settings.externalPump.gpio, LOW);
}
vars.states.externalPump = false; vars.states.externalPump = false;
vars.parameters.extPumpLastEnableTime = millis(); vars.parameters.extPumpLastEnableTime = millis();
@@ -311,7 +340,7 @@ protected:
if (vars.states.externalPump && !this->heatingEnabled) { if (vars.states.externalPump && !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(settings.externalPump.gpio, LOW); digitalWrite(configuredGpio, LOW);
vars.states.externalPump = false; vars.states.externalPump = false;
vars.parameters.extPumpLastEnableTime = millis(); vars.parameters.extPumpLastEnableTime = millis();
@@ -319,7 +348,7 @@ protected:
Log.sinfoln("EXTPUMP", F("Disabled: expired post circulation time")); Log.sinfoln("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(settings.externalPump.gpio, LOW); digitalWrite(configuredGpio, LOW);
vars.states.externalPump = false; vars.states.externalPump = false;
vars.parameters.extPumpLastEnableTime = millis(); vars.parameters.extPumpLastEnableTime = millis();
@@ -335,7 +364,7 @@ protected:
this->externalPumpStartTime = millis(); this->externalPumpStartTime = millis();
this->extPumpStartReason = MainTask::PumpStartReason::HEATING; this->extPumpStartReason = MainTask::PumpStartReason::HEATING;
digitalWrite(settings.externalPump.gpio, HIGH); digitalWrite(configuredGpio, HIGH);
Log.sinfoln("EXTPUMP", F("Enabled: heating on")); Log.sinfoln("EXTPUMP", F("Enabled: heating on"));
@@ -344,7 +373,7 @@ protected:
this->externalPumpStartTime = millis(); this->externalPumpStartTime = millis();
this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK; this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK;
digitalWrite(settings.externalPump.gpio, HIGH); digitalWrite(configuredGpio, HIGH);
Log.sinfoln("EXTPUMP", F("Enabled: anti stuck")); Log.sinfoln("EXTPUMP", F("Enabled: anti stuck"));
} }

View File

@@ -188,7 +188,7 @@ protected:
} }
if (settings.emergency.enable && settings.emergency.onMqttFault) { if (settings.emergency.enable && settings.emergency.onMqttFault) {
if (!this->connected && !vars.states.emergency && millis() - this->disconnectedTime > EMERGENCY_TIME_TRESHOLD) { if (!this->connected && !vars.states.emergency && millis() - this->disconnectedTime > (settings.emergency.tresholdTime * 1000)) {
vars.states.emergency = true; vars.states.emergency = true;
Log.sinfoln(FPSTR(L_MQTT), F("Emergency mode enabled")); Log.sinfoln(FPSTR(L_MQTT), F("Emergency mode enabled"));

View File

@@ -29,6 +29,7 @@ protected:
unsigned long prevUpdateNonEssentialVars = 0; unsigned long prevUpdateNonEssentialVars = 0;
unsigned long dhwSetTempTime = 0; unsigned long dhwSetTempTime = 0;
unsigned long heatingSetTempTime = 0; unsigned long heatingSetTempTime = 0;
byte configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED;
const char* getTaskName() { const char* getTaskName() {
@@ -50,11 +51,6 @@ protected:
vars.parameters.dhwMinTemp = convertTemp(vars.parameters.dhwMinTemp, UnitSystem::METRIC, settings.system.unitSystem); vars.parameters.dhwMinTemp = convertTemp(vars.parameters.dhwMinTemp, UnitSystem::METRIC, settings.system.unitSystem);
vars.parameters.dhwMaxTemp = convertTemp(vars.parameters.dhwMaxTemp, UnitSystem::METRIC, settings.system.unitSystem); vars.parameters.dhwMaxTemp = convertTemp(vars.parameters.dhwMaxTemp, UnitSystem::METRIC, settings.system.unitSystem);
} }
#ifdef LED_OT_RX_GPIO
pinMode(LED_OT_RX_GPIO, OUTPUT);
digitalWrite(LED_OT_RX_GPIO, LOW);
#endif
// delete instance // delete instance
if (this->instance != nullptr) { if (this->instance != nullptr) {
@@ -89,13 +85,11 @@ protected:
if (status == OpenThermResponseStatus::SUCCESS) { if (status == OpenThermResponseStatus::SUCCESS) {
this->lastSuccessResponse = millis(); this->lastSuccessResponse = millis();
#ifdef LED_OT_RX_GPIO if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
{ digitalWrite(this->configuredRxLedGpio, HIGH);
digitalWrite(LED_OT_RX_GPIO, HIGH);
delayMicroseconds(2000); delayMicroseconds(2000);
digitalWrite(LED_OT_RX_GPIO, LOW); digitalWrite(this->configuredRxLedGpio, LOW);
} }
#endif
} }
}); });
@@ -121,6 +115,21 @@ protected:
return; return;
} }
if (settings.opentherm.rxLedGpio != this->configuredRxLedGpio) {
if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
digitalWrite(this->configuredRxLedGpio, LOW);
}
if (GPIO_IS_VALID(settings.opentherm.rxLedGpio)) {
this->configuredRxLedGpio = settings.opentherm.rxLedGpio;
pinMode(this->configuredRxLedGpio, OUTPUT);
digitalWrite(this->configuredRxLedGpio, LOW);
} else if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
this->configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED;
}
}
bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && this->pump && this->isReady(); bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && this->pump && this->isReady();
bool heatingCh2Enabled = settings.opentherm.heatingCh2Enabled; bool heatingCh2Enabled = settings.opentherm.heatingCh2Enabled;
if (settings.opentherm.heatingCh1ToCh2) { if (settings.opentherm.heatingCh1ToCh2) {

View File

@@ -37,6 +37,7 @@ struct Settings {
} telnet; } telnet;
UnitSystem unitSystem = UnitSystem::METRIC; UnitSystem unitSystem = UnitSystem::METRIC;
byte statusLedGpio = DEFAULT_STATUS_LED_GPIO;
} system; } system;
struct { struct {
@@ -49,6 +50,7 @@ struct Settings {
UnitSystem unitSystem = UnitSystem::METRIC; UnitSystem unitSystem = UnitSystem::METRIC;
byte inGpio = DEFAULT_OT_IN_GPIO; byte inGpio = DEFAULT_OT_IN_GPIO;
byte outGpio = DEFAULT_OT_OUT_GPIO; byte outGpio = DEFAULT_OT_OUT_GPIO;
byte rxLedGpio = DEFAULT_OT_RX_LED_GPIO;
unsigned int memberIdCode = 0; unsigned int memberIdCode = 0;
bool dhwPresent = true; bool dhwPresent = true;
bool summerWinterMode = false; bool summerWinterMode = false;
@@ -73,6 +75,7 @@ struct Settings {
struct { struct {
bool enable = true; bool enable = true;
float target = 40.0f; float target = 40.0f;
unsigned short tresholdTime = 120;
bool useEquitherm = false; bool useEquitherm = false;
bool usePid = false; bool usePid = false;
bool onNetworkFault = true; bool onNetworkFault = true;

View File

@@ -2,7 +2,6 @@
#define PROJECT_VERSION "1.4.0-rc.21" #define PROJECT_VERSION "1.4.0-rc.21"
#define PROJECT_REPO "https://github.com/Laxilef/OTGateway" #define PROJECT_REPO "https://github.com/Laxilef/OTGateway"
#define EMERGENCY_TIME_TRESHOLD 120000
#define MQTT_RECONNECT_INTERVAL 15000 #define MQTT_RECONNECT_INTERVAL 15000
#define EXT_SENSORS_INTERVAL 5000 #define EXT_SENSORS_INTERVAL 5000
@@ -53,6 +52,10 @@
#define DEBUG_BY_DEFAULT false #define DEBUG_BY_DEFAULT false
#endif #endif
#ifndef DEFAULT_STATUS_LED_GPIO
#define DEFAULT_STATUS_LED_GPIO GPIO_IS_NOT_CONFIGURED
#endif
#ifndef DEFAULT_PORTAL_LOGIN #ifndef DEFAULT_PORTAL_LOGIN
#define DEFAULT_PORTAL_LOGIN "" #define DEFAULT_PORTAL_LOGIN ""
#endif #endif
@@ -89,6 +92,10 @@
#define DEFAULT_OT_OUT_GPIO GPIO_IS_NOT_CONFIGURED #define DEFAULT_OT_OUT_GPIO GPIO_IS_NOT_CONFIGURED
#endif #endif
#ifndef DEFAULT_OT_RX_LED_GPIO
#define DEFAULT_OT_RX_LED_GPIO GPIO_IS_NOT_CONFIGURED
#endif
#ifndef DEFAULT_SENSOR_OUTDOOR_GPIO #ifndef DEFAULT_SENSOR_OUTDOOR_GPIO
#define DEFAULT_SENSOR_OUTDOOR_GPIO GPIO_IS_NOT_CONFIGURED #define DEFAULT_SENSOR_OUTDOOR_GPIO GPIO_IS_NOT_CONFIGURED
#endif #endif

View File

@@ -332,6 +332,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
dst["system"]["telnet"]["enable"] = src.system.telnet.enable; dst["system"]["telnet"]["enable"] = src.system.telnet.enable;
dst["system"]["telnet"]["port"] = src.system.telnet.port; dst["system"]["telnet"]["port"] = src.system.telnet.port;
dst["system"]["unitSystem"] = static_cast<byte>(src.system.unitSystem); dst["system"]["unitSystem"] = static_cast<byte>(src.system.unitSystem);
dst["system"]["statusLedGpio"] = src.system.statusLedGpio;
dst["portal"]["auth"] = src.portal.auth; dst["portal"]["auth"] = src.portal.auth;
dst["portal"]["login"] = src.portal.login; dst["portal"]["login"] = src.portal.login;
@@ -340,6 +341,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
dst["opentherm"]["unitSystem"] = static_cast<byte>(src.opentherm.unitSystem); dst["opentherm"]["unitSystem"] = static_cast<byte>(src.opentherm.unitSystem);
dst["opentherm"]["inGpio"] = src.opentherm.inGpio; dst["opentherm"]["inGpio"] = src.opentherm.inGpio;
dst["opentherm"]["outGpio"] = src.opentherm.outGpio; dst["opentherm"]["outGpio"] = src.opentherm.outGpio;
dst["opentherm"]["rxLedGpio"] = src.opentherm.rxLedGpio;
dst["opentherm"]["memberIdCode"] = src.opentherm.memberIdCode; dst["opentherm"]["memberIdCode"] = src.opentherm.memberIdCode;
dst["opentherm"]["dhwPresent"] = src.opentherm.dhwPresent; dst["opentherm"]["dhwPresent"] = src.opentherm.dhwPresent;
dst["opentherm"]["summerWinterMode"] = src.opentherm.summerWinterMode; dst["opentherm"]["summerWinterMode"] = src.opentherm.summerWinterMode;
@@ -361,6 +363,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
dst["emergency"]["enable"] = src.emergency.enable; dst["emergency"]["enable"] = src.emergency.enable;
dst["emergency"]["target"] = roundd(src.emergency.target, 2); dst["emergency"]["target"] = roundd(src.emergency.target, 2);
dst["emergency"]["tresholdTime"] = src.emergency.tresholdTime;
dst["emergency"]["useEquitherm"] = src.emergency.useEquitherm; dst["emergency"]["useEquitherm"] = src.emergency.useEquitherm;
dst["emergency"]["usePid"] = src.emergency.usePid; dst["emergency"]["usePid"] = src.emergency.usePid;
dst["emergency"]["onNetworkFault"] = src.emergency.onNetworkFault; dst["emergency"]["onNetworkFault"] = src.emergency.onNetworkFault;
@@ -497,6 +500,23 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
} }
} }
if (!src["system"]["statusLedGpio"].isNull()) {
if (src["system"]["statusLedGpio"].is<JsonString>() && src["system"]["statusLedGpio"].as<JsonString>().size() == 0) {
if (dst.system.statusLedGpio != GPIO_IS_NOT_CONFIGURED) {
dst.system.statusLedGpio = GPIO_IS_NOT_CONFIGURED;
changed = true;
}
} else {
unsigned char value = src["system"]["statusLedGpio"].as<unsigned char>();
if (value >= 0 && value <= 254) {
dst.system.statusLedGpio = value;
changed = true;
}
}
}
// portal // portal
if (src["portal"]["auth"].is<bool>()) { if (src["portal"]["auth"].is<bool>()) {
@@ -577,6 +597,23 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
} }
} }
if (!src["opentherm"]["rxLedGpio"].isNull()) {
if (src["opentherm"]["rxLedGpio"].is<JsonString>() && src["opentherm"]["rxLedGpio"].as<JsonString>().size() == 0) {
if (dst.opentherm.rxLedGpio != GPIO_IS_NOT_CONFIGURED) {
dst.opentherm.rxLedGpio = GPIO_IS_NOT_CONFIGURED;
changed = true;
}
} else {
unsigned char value = src["opentherm"]["rxLedGpio"].as<unsigned char>();
if (value >= 0 && value <= 254) {
dst.opentherm.rxLedGpio = value;
changed = true;
}
}
}
if (!src["opentherm"]["memberIdCode"].isNull()) { if (!src["opentherm"]["memberIdCode"].isNull()) {
unsigned int value = src["opentherm"]["memberIdCode"].as<unsigned int>(); unsigned int value = src["opentherm"]["memberIdCode"].as<unsigned int>();
@@ -713,6 +750,15 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
changed = true; changed = true;
} }
if (!src["emergency"]["tresholdTime"].isNull()) {
unsigned short value = src["emergency"]["tresholdTime"].as<unsigned short>();
if (value >= 60 && value <= 1800) {
dst.emergency.tresholdTime = value;
changed = true;
}
}
if (src["emergency"]["useEquitherm"].is<bool>()) { if (src["emergency"]["useEquitherm"].is<bool>()) {
if (dst.sensors.outdoor.type != SensorType::MANUAL) { if (dst.sensors.outdoor.type != SensorType::MANUAL) {
dst.emergency.useEquitherm = src["emergency"]["useEquitherm"].as<bool>(); dst.emergency.useEquitherm = src["emergency"]["useEquitherm"].as<bool>();