From 92ca257d328db6df137799cb997011c2328a7fad Mon Sep 17 00:00:00 2001 From: Yurii Date: Sun, 7 Apr 2024 22:59:43 +0300 Subject: [PATCH] feat: added slave parameters to index page on portal; added poll ID125 (opentherm protocol version) --- data/index.html | 15 ++++++++++++++ data/static/app.js.gz | Bin 4122 -> 4622 bytes src/OpenThermTask.h | 7 +++++++ src/utils.h | 6 ++++++ src_data/static/app.js | 45 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 72 insertions(+), 1 deletion(-) diff --git a/data/index.html b/data/index.html index ae9b4a8..d431514 100644 --- a/data/index.html +++ b/data/index.html @@ -206,6 +206,21 @@ Exhaust temp: + + + + Slave parameters: + +
Vendor:          
+Member ID:       
+Flags:           
+Type:            
+Version:         
+OT version:      
+Heating limits:  ... 
+DHW limits:      ... 
+ + diff --git a/data/static/app.js.gz b/data/static/app.js.gz index c1dc8fe1b8ab9b7301d128a770f4309c59ba0990..1b62381334f26587e71d80d4f542274d0c392336 100644 GIT binary patch literal 4622 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 YznRE2!R8y44aA=LUrCcrJ{ME~09)VZmH+?% diff --git a/src/OpenThermTask.h b/src/OpenThermTask.h index 304e8fe..4a4922c 100644 --- a/src/OpenThermTask.h +++ b/src/OpenThermTask.h @@ -425,6 +425,13 @@ protected: Log.swarningln(FPSTR(L_OT), F("Set master version failed")); } + if (this->updateSlaveOtVersion()) { + Log.straceln(FPSTR(L_OT), F("Slave OT version: %f"), vars.parameters.slaveOtVersion); + + } else { + Log.swarningln(FPSTR(L_OT), F("Get slave OT version failed")); + } + if (this->updateSlaveConfig()) { Log.straceln(FPSTR(L_OT), F("Slave member id: %u, flags: %u"), vars.parameters.slaveMemberId, vars.parameters.slaveFlags); diff --git a/src/utils.h b/src/utils.h index 991b18b..3064355 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1137,6 +1137,12 @@ void varsToJson(const Variables& src, JsonVariant dst) { dst["parameters"]["heatingSetpoint"] = src.parameters.heatingSetpoint; dst["parameters"]["dhwMinTemp"] = src.parameters.dhwMinTemp; dst["parameters"]["dhwMaxTemp"] = src.parameters.dhwMaxTemp; + + dst["parameters"]["slaveMemberId"] = src.parameters.slaveMemberId; + dst["parameters"]["slaveFlags"] = src.parameters.slaveFlags; + dst["parameters"]["slaveType"] = src.parameters.slaveType; + dst["parameters"]["slaveVersion"] = src.parameters.slaveVersion; + dst["parameters"]["slaveOtVersion"] = src.parameters.slaveOtVersion; } bool jsonToVars(const JsonVariantConst src, Variables& dst) { diff --git a/src_data/static/app.js b/src_data/static/app.js index f7063b8..0af1818 100644 --- a/src_data/static/app.js +++ b/src_data/static/app.js @@ -575,11 +575,24 @@ async function loadVars() { setValue('.indoor-temp', result.temperatures.indoor); setValue('.outdoor-temp', result.temperatures.outdoor); setValue('.heating-temp', result.temperatures.heating); - setValue('.heating-setpoint-temp', result.parameters.heatingSetpoint); setValue('.heating-return-temp', result.temperatures.heatingReturn); setValue('.dhw-temp', result.temperatures.dhw); setValue('.exhaust-temp', result.temperatures.exhaust); + setValue('.heating-min-temp', result.parameters.heatingMinTemp); + setValue('.heating-max-temp', result.parameters.heatingMaxTemp); + setValue('.heating-setpoint-temp', result.parameters.heatingSetpoint); + setValue('.dhw-min-temp', result.parameters.dhwMinTemp); + setValue('.dhw-max-temp', result.parameters.dhwMaxTemp); + + setValue('.slave-member-id', result.parameters.slaveMemberId); + setValue('.slave-vendor', memberIdToVendor(result.parameters.slaveMemberId)); + + setValue('.slave-flags', result.parameters.slaveFlags); + setValue('.slave-type', result.parameters.slaveType); + setValue('.slave-version', result.parameters.slaveVersion); + setValue('.slave-ot-version', result.parameters.slaveOtVersion); + setBusy('.ot-busy', '.ot-table', false); setValue('.temp-unit', tempUnitStr); @@ -670,6 +683,36 @@ function setInputValue(selector, value) { } +function memberIdToVendor(memberId) { + // https://github.com/Jeroen88/EasyOpenTherm/blob/main/src/EasyOpenTherm.h + // https://github.com/Evgen2/SmartTherm/blob/v0.7/src/Web.cpp + const vendorList = { + 1: "Baxi Fourtech/Luna 3", + 2: "AWB/Brink", + 4: "ATAG/Brötje/ELCO/GEMINOX", + 5: "Itho Daalderop", + 6: "IDEAL", + 8: "Buderus/Bosch/Hoval", + 9: "Ferroli", + 11: "Remeha/De Dietrich", + 16: "Unical", + 24: "Vaillant/Bulex", + 27: "Baxi", + 29: "Itho Daalderop", + 33: "Viessmann", + 56: "Baxi Luna Duo-Tec", + 131: "Nefit", + 148: "Navien", + 173: "Intergas", + 247: "Baxi Ampera", + 248: "Zota Lux-X" + }; + + return (memberId in vendorList) + ? vendorList[memberId] + : "unknown vendor"; +} + function form2json(data) { let method = function (object, pair) { let keys = pair[0].replace(/\]/g, '').split('[');