From d5e55cf0ae798269d7eaa8c8753a0ebe74f304e9 Mon Sep 17 00:00:00 2001 From: Menno de Graaf Date: Thu, 7 Dec 2023 10:40:04 +0100 Subject: [PATCH 1/4] Improve opentherm handling * First try setBoilerStatus, if it fails there is no need to request other info * Do not retry to get/set non-essential parameters that the boiler does not support --- src/OpenThermTask.h | 89 ++++++++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index bfd5bf0..f074ce4 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -23,6 +23,10 @@ protected: unsigned short heatingSetTempInterval = 60000; bool pump = true; + bool tryGetSlaveVersion = true; + bool trySetMasterVersion = true; + bool tryGetSlaveConfig = true; + bool trySetMasterConfig = true; unsigned long prevUpdateNonEssentialVars = 0; unsigned long startupTime = millis(); unsigned long dhwSetTempTime = 0; @@ -61,39 +65,6 @@ protected: static byte currentHeatingTemp, currentDhwTemp = 0; unsigned long localResponse; - if (millis() - prevUpdateNonEssentialVars > 60000) { - if (updateSlaveVersion()) { - Log.straceln(FPSTR(S_OT), F("Slave version: %u, type: %u"), vars.parameters.slaveVersion, vars.parameters.slaveType); - - } else { - Log.swarningln(FPSTR(S_OT), F("Get slave version failed")); - } - - // 0x013F - if (setMasterVersion(0x3F, 0x01)) { - Log.straceln(FPSTR(S_OT), F("Master version: %u, type: %u"), vars.parameters.masterVersion, vars.parameters.masterType); - - } else { - Log.swarningln(FPSTR(S_OT), F("Set master version failed")); - } - - if (updateSlaveConfig()) { - Log.straceln(FPSTR(S_OT), F("Slave member id: %u, flags: %u"), vars.parameters.slaveMemberId, vars.parameters.slaveFlags); - - } else { - Log.swarningln(FPSTR(S_OT), F("Get slave config failed")); - } - - if (setMasterConfig(settings.opentherm.memberIdCode & 0xFF, (settings.opentherm.memberIdCode & 0xFFFF) >> 8)) { - Log.straceln(FPSTR(S_OT), F("Master member id: %u, flags: %u"), vars.parameters.masterMemberId, vars.parameters.masterFlags); - - } else { - Log.swarningln(FPSTR(S_OT), F("Set master config failed")); - } - - //yield(); - } - bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && pump && isReady(); bool heatingCh2Enabled = settings.opentherm.heatingCh2Enabled; if (settings.opentherm.heatingCh1ToCh2) { @@ -115,6 +86,11 @@ protected: if (!ot->isValidResponse(localResponse)) { Log.swarningln(FPSTR(S_OT), F("Invalid response after setBoilerStatus: %s"), ot->statusToString(ot->getLastResponseStatus())); + // Boiler is disconnected, try to get these variables when it becomes connected again + bool tryGetSlaveVersion = true; + bool trySetMasterVersion = true; + bool tryGetSlaveConfig = true; + bool trySetMasterConfig = true; return; } @@ -130,8 +106,53 @@ protected: vars.states.fault = ot->isFault(localResponse); vars.states.diagnostic = ot->isDiagnostic(localResponse); + // These parameters will be updated every minute + // Not all boilers support these, so only try once if not supported + if (millis() - prevUpdateNonEssentialVars > 60000) { + if (tryGetSlaveVersion) { + if (updateSlaveVersion()) { + Log.straceln(FPSTR(S_OT), F("Slave version: %u, type: %u"), vars.parameters.slaveVersion, vars.parameters.slaveType); + + } else { + Log.swarningln(FPSTR(S_OT), F("Get slave version failed")); + tryGetSlaveVersion = false; + } + } + + // 0x013F + if (trySetMasterVersion) { + if (setMasterVersion(0x3F, 0x01)) { + Log.straceln(FPSTR(S_OT), F("Master version: %u, type: %u"), vars.parameters.masterVersion, vars.parameters.masterType); + + } else { + Log.swarningln(FPSTR(S_OT), F("Set master version failed")); + trySetMasterVersion = false; + } + } + + if (tryGetSlaveConfig) { + if (updateSlaveConfig()) { + Log.straceln(FPSTR(S_OT), F("Slave member id: %u, flags: %u"), vars.parameters.slaveMemberId, vars.parameters.slaveFlags); + + } else { + Log.swarningln(FPSTR(S_OT), F("Get slave config failed")); + tryGetSlaveConfig = false; + } + } + + if (trySetMasterConfig) { + if (setMasterConfig(settings.opentherm.memberIdCode & 0xFF, (settings.opentherm.memberIdCode & 0xFFFF) >> 8)) { + Log.straceln(FPSTR(S_OT), F("Master member id: %u, flags: %u"), vars.parameters.masterMemberId, vars.parameters.masterFlags); + + } else { + Log.swarningln(FPSTR(S_OT), F("Set master config failed")); + trySetMasterConfig = false; + } + } + + //yield(); + } - // // These parameters will be updated every minute if (millis() - prevUpdateNonEssentialVars > 60000) { if (!heatingEnabled && settings.opentherm.modulationSyncWithHeating) { From a5581f377813e0af6d9b65c9b9b046cb18679a48 Mon Sep 17 00:00:00 2001 From: Menno de Graaf Date: Fri, 15 Dec 2023 12:42:22 +0100 Subject: [PATCH 2/4] Add master/slave set/get to `initBoiler()` --- src/OpenThermTask.h | 103 ++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index f074ce4..33b7476 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -23,10 +23,7 @@ protected: unsigned short heatingSetTempInterval = 60000; bool pump = true; - bool tryGetSlaveVersion = true; - bool trySetMasterVersion = true; - bool tryGetSlaveConfig = true; - bool trySetMasterConfig = true; + bool prevOtStatus = false; unsigned long prevUpdateNonEssentialVars = 0; unsigned long startupTime = millis(); unsigned long dhwSetTempTime = 0; @@ -61,6 +58,39 @@ protected: #endif } + void initBoiler() { + // Not all boilers support these, only try once when the boiler becomes connected + if (updateSlaveVersion()) { + Log.straceln(FPSTR(S_OT), F("Slave version: %u, type: %u"), vars.parameters.slaveVersion, vars.parameters.slaveType); + + } else { + Log.swarningln(FPSTR(S_OT), F("Get slave version failed")); + } + + // 0x013F + if (setMasterVersion(0x3F, 0x01)) { + Log.straceln(FPSTR(S_OT), F("Master version: %u, type: %u"), vars.parameters.masterVersion, vars.parameters.masterType); + + } else { + Log.swarningln(FPSTR(S_OT), F("Set master version failed")); + } + + if (updateSlaveConfig()) { + Log.straceln(FPSTR(S_OT), F("Slave member id: %u, flags: %u"), vars.parameters.slaveMemberId, vars.parameters.slaveFlags); + + } else { + Log.swarningln(FPSTR(S_OT), F("Get slave config failed")); + } + + if (setMasterConfig(settings.opentherm.memberIdCode & 0xFF, (settings.opentherm.memberIdCode & 0xFFFF) >> 8)) { + Log.straceln(FPSTR(S_OT), F("Master member id: %u, flags: %u"), vars.parameters.masterMemberId, vars.parameters.masterFlags); + + } else { + Log.swarningln(FPSTR(S_OT), F("Set master config failed")); + } + + } + void loop() { static byte currentHeatingTemp, currentDhwTemp = 0; unsigned long localResponse; @@ -86,14 +116,20 @@ protected: if (!ot->isValidResponse(localResponse)) { Log.swarningln(FPSTR(S_OT), F("Invalid response after setBoilerStatus: %s"), ot->statusToString(ot->getLastResponseStatus())); - // Boiler is disconnected, try to get these variables when it becomes connected again - bool tryGetSlaveVersion = true; - bool trySetMasterVersion = true; - bool tryGetSlaveConfig = true; - bool trySetMasterConfig = true; - return; } + if (this->prevOtStatus != vars.states.otStatus) { + if (vars.states.otStatus) { + this->initBoiler(); + } + this->prevOtStatus = vars.states.otStatus; + } + + if (!vars.states.otStatus) { + // Boiler is disconnected, no need try setting other OT stuff + return; + } + if (vars.parameters.heatingEnabled != heatingEnabled) { prevUpdateNonEssentialVars = 0; vars.parameters.heatingEnabled = heatingEnabled; @@ -106,53 +142,6 @@ protected: vars.states.fault = ot->isFault(localResponse); vars.states.diagnostic = ot->isDiagnostic(localResponse); - // These parameters will be updated every minute - // Not all boilers support these, so only try once if not supported - if (millis() - prevUpdateNonEssentialVars > 60000) { - if (tryGetSlaveVersion) { - if (updateSlaveVersion()) { - Log.straceln(FPSTR(S_OT), F("Slave version: %u, type: %u"), vars.parameters.slaveVersion, vars.parameters.slaveType); - - } else { - Log.swarningln(FPSTR(S_OT), F("Get slave version failed")); - tryGetSlaveVersion = false; - } - } - - // 0x013F - if (trySetMasterVersion) { - if (setMasterVersion(0x3F, 0x01)) { - Log.straceln(FPSTR(S_OT), F("Master version: %u, type: %u"), vars.parameters.masterVersion, vars.parameters.masterType); - - } else { - Log.swarningln(FPSTR(S_OT), F("Set master version failed")); - trySetMasterVersion = false; - } - } - - if (tryGetSlaveConfig) { - if (updateSlaveConfig()) { - Log.straceln(FPSTR(S_OT), F("Slave member id: %u, flags: %u"), vars.parameters.slaveMemberId, vars.parameters.slaveFlags); - - } else { - Log.swarningln(FPSTR(S_OT), F("Get slave config failed")); - tryGetSlaveConfig = false; - } - } - - if (trySetMasterConfig) { - if (setMasterConfig(settings.opentherm.memberIdCode & 0xFF, (settings.opentherm.memberIdCode & 0xFFFF) >> 8)) { - Log.straceln(FPSTR(S_OT), F("Master member id: %u, flags: %u"), vars.parameters.masterMemberId, vars.parameters.masterFlags); - - } else { - Log.swarningln(FPSTR(S_OT), F("Set master config failed")); - trySetMasterConfig = false; - } - } - - //yield(); - } - // These parameters will be updated every minute if (millis() - prevUpdateNonEssentialVars > 60000) { if (!heatingEnabled && settings.opentherm.modulationSyncWithHeating) { From 15645f4d3027205948fdbf0033c71c057a350efe Mon Sep 17 00:00:00 2001 From: Menno de Graaf Date: Fri, 15 Dec 2023 14:46:35 +0100 Subject: [PATCH 3/4] Add log info --- src/OpenThermTask.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 33b7476..10fd6fe 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -120,8 +120,12 @@ protected: if (this->prevOtStatus != vars.states.otStatus) { if (vars.states.otStatus) { + Log.sinfoln(FPSTR(S_OT), F("Boiler connected...initializing")); this->initBoiler(); } + else { + Log.swarningln(FPSTR(S_OT), F("Boiler disconnected")); + } this->prevOtStatus = vars.states.otStatus; } @@ -129,7 +133,7 @@ protected: // Boiler is disconnected, no need try setting other OT stuff return; } - + if (vars.parameters.heatingEnabled != heatingEnabled) { prevUpdateNonEssentialVars = 0; vars.parameters.heatingEnabled = heatingEnabled; From 47879d54864b51d3a25dd874d196a9e498578485 Mon Sep 17 00:00:00 2001 From: Laxilef <34578544+Laxilef@users.noreply.github.com> Date: Sat, 16 Dec 2023 00:42:17 +0300 Subject: [PATCH 4/4] Update OpenThermTask.h --- src/OpenThermTask.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 10fd6fe..c1c22d2 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -118,15 +118,15 @@ protected: Log.swarningln(FPSTR(S_OT), F("Invalid response after setBoilerStatus: %s"), ot->statusToString(ot->getLastResponseStatus())); } - if (this->prevOtStatus != vars.states.otStatus) { - if (vars.states.otStatus) { - Log.sinfoln(FPSTR(S_OT), F("Boiler connected...initializing")); - this->initBoiler(); - } - else { - Log.swarningln(FPSTR(S_OT), F("Boiler disconnected")); - } + if (vars.states.otStatus && !this->prevOtStatus) { this->prevOtStatus = vars.states.otStatus; + + Log.sinfoln(FPSTR(S_OT), F("Connected. Initializing")); + this->initBoiler(); + + } else if (!vars.states.otStatus && this->prevOtStatus) { + this->prevOtStatus = vars.states.otStatus; + Log.swarningln(FPSTR(S_OT), F("Disconnected")); } if (!vars.states.otStatus) {