diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 10af112ae..cc8ecfb8d 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -7,11 +7,13 @@
## Added
- humidity for ventilation devices
-- telegrams for RC100H, hc2
+- telegrams for RC100H, hc2 (seen on discord)
+- names for BC400, GB192i, read temperatures for low loss header and heatblock [#1317](https://github.com/emsesp/EMS-ESP32/discussions/1317)
+- option for `forceheatingoff` [#1262](https://github.com/emsesp/EMS-ESP32/issues/1262)
## Fixed
## Changed
-- update to arduion 2.0.13 / idf 4.4.6
+- update to arduino 2.0.14 / idf 4.4.6
- small changes for arduino 3.0.0 / idf 5.1 compatibility
diff --git a/interface/package.json b/interface/package.json
index 94fc65eed..971fa141a 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -22,13 +22,13 @@
"@alova/adapter-xhr": "^1.0.1",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
- "@mui/icons-material": "^5.14.11",
- "@mui/material": "^5.14.11",
+ "@mui/icons-material": "^5.14.12",
+ "@mui/material": "^5.14.12",
"@table-library/react-table-library": "4.1.7",
"@types/lodash-es": "^4.17.9",
- "@types/node": "^20.8.2",
- "@types/react": "^18.2.24",
- "@types/react-dom": "^18.2.8",
+ "@types/node": "^20.8.3",
+ "@types/react": "^18.2.25",
+ "@types/react-dom": "^18.2.11",
"@types/react-router-dom": "^5.3.3",
"alova": "^2.13.1",
"async-validator": "^4.2.5",
@@ -53,7 +53,7 @@
"@types/babel__core": "^7",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
- "eslint": "^8.50.0",
+ "eslint": "^8.51.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-prettier": "^9.0.0",
@@ -69,7 +69,7 @@
"prettier": "^3.0.3",
"rollup-plugin-visualizer": "^5.9.2",
"terser": "^5.21.0",
- "vite": "^4.4.10",
+ "vite": "^4.4.11",
"vite-plugin-svgr": "^4.1.0",
"vite-tsconfig-paths": "^4.2.1"
},
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 52c149107..011ca2b14 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -126,6 +126,7 @@ const de: Translation = {
BYPASS_TOKEN: 'Zugriffstoken-Autorisierung bei API-Aufrufen umgehen',
READONLY: 'Nur-Lese-Modus aktivieren (blockiert alle ausgehenden EMS Tx Write-Befehle)',
UNDERCLOCK_CPU: 'CPU-Geschwindigkeit untertakten',
+ HEATINGOFF: 'Heizen ausschalten beim EMS-ESP Start',
ENABLE_SHOWER_TIMER: 'Duschtimer aktivieren',
ENABLE_SHOWER_ALERT: 'Duschalarm aktivieren',
TRIGGER_TIME: 'Auslösezeit',
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index bbf506d57..61a14cf1e 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -126,6 +126,7 @@ const en: Translation = {
BYPASS_TOKEN: 'Bypass Access Token authorization on API calls',
READONLY: 'Enable read-only mode (blocks all outgoing EMS Tx Write commands)',
UNDERCLOCK_CPU: 'Underclock CPU speed',
+ HEATINGOFF: 'Start boiler with forced heating off',
ENABLE_SHOWER_TIMER: 'Enable Shower Timer',
ENABLE_SHOWER_ALERT: 'Enable Shower Alert',
TRIGGER_TIME: 'Trigger Time',
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index d7af38ef0..69784aadd 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -126,6 +126,7 @@ const fr: Translation = {
BYPASS_TOKEN: 'Contourner l\'autorisation du jeton d\'accès sur les appels API',
READONLY: 'Activer le mode lecture uniquement (bloque toutes les commandes EMS sortantes en écriture Tx)',
UNDERCLOCK_CPU: 'Underclock du CPU',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Activer la minuterie de la douche',
ENABLE_SHOWER_ALERT: 'Activer les alertes de durée de douche',
TRIGGER_TIME: 'Durée avant déclenchement',
diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts
index 238f18347..6a1a433f2 100644
--- a/interface/src/i18n/it/index.ts
+++ b/interface/src/i18n/it/index.ts
@@ -128,6 +128,7 @@ const it: Translation = {
BYPASS_TOKEN: 'Ignora autorizzazione del token di accesso sulle chiamate API',
READONLY: 'Abilita modalità sola-lettura (blocca tutti i comandi di scrittura EMS Tx in uscita)',
UNDERCLOCK_CPU: 'Abbassa velocità della CPU',
+ HEATINGOFF: 'Avviamento caldaia con riscaldamento forzato spento',
ENABLE_SHOWER_TIMER: 'Abilita timer doccia',
ENABLE_SHOWER_ALERT: 'Abilita avviso doccia',
TRIGGER_TIME: 'Tempo di avvio',
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index c28555ae9..3007ba17b 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -126,6 +126,7 @@ const nl: Translation = {
BYPASS_TOKEN: 'API Access Token authenticatie uitschakelen',
READONLY: 'Activeer read-only modus (blokkeert alle outgaande EMS Tx schrijf commandos)',
UNDERCLOCK_CPU: 'Underclock CPU snelheid',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Activeer Douche Timer (tijdmeting)',
ENABLE_SHOWER_ALERT: 'Activeer Douchemelding',
TRIGGER_TIME: 'Trigger tijd',
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index a14df03e4..404e31978 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -126,6 +126,7 @@ const no: Translation = {
BYPASS_TOKEN: 'Utelat Aksess Token authorisering av API kall',
READONLY: 'Aktiver read-only modus (blokker all EMS Tx Skriving)',
UNDERCLOCK_CPU: 'Underklokking av prosessorhastighet',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Aktiver Dusjtimer',
ENABLE_SHOWER_ALERT: 'Aktiver Dusj-varsling',
TRIGGER_TIME: 'Aktiveringstid',
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index 5a4f1d170..4d073f702 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -126,6 +126,7 @@ const pl: BaseTranslation = {
BYPASS_TOKEN: 'Pomiń autoryzację tokenem w wywołaniach API',
READONLY: 'Tryb pracy "tylko do odczytu" (blokuje wszystkie komendy zapisu na magistralę EMS)',
UNDERCLOCK_CPU: 'Obniż taktowanie CPU',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Aktywuj minutnik prysznica',
ENABLE_SHOWER_ALERT: 'Aktywuj alarm prysznica',
TRIGGER_TIME: 'Wyzwalaj po czasie',
diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts
index 90e5dc265..881fc728f 100644
--- a/interface/src/i18n/sv/index.ts
+++ b/interface/src/i18n/sv/index.ts
@@ -126,6 +126,7 @@ const sv: Translation = {
BYPASS_TOKEN: 'Inaktivera Token-autensiering för API-anrop',
READONLY: 'Aktivera read-only (blockerar alla utgående skrivkommandon mot EMS-bussen)',
UNDERCLOCK_CPU: 'Nedklocka Processorhastighet',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Aktivera Dusch-timer',
ENABLE_SHOWER_ALERT: 'Aktivera Dusch-varning',
TRIGGER_TIME: 'Aktiveringstid',
diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts
index a9464d2a3..ee03575c8 100644
--- a/interface/src/i18n/tr/index.ts
+++ b/interface/src/i18n/tr/index.ts
@@ -126,6 +126,7 @@ const tr: Translation = {
BYPASS_TOKEN: 'API bağlantılarında Erişim Jeton onaylamasını geç',
READONLY: 'Salt okunur modu devreye al (bütün giden EMS Tx Yazma komutlarını engeller)',
UNDERCLOCK_CPU: 'İşlemci hızını düşür',
+ HEATINGOFF: 'Start boiler with forced heating off', // TODO translate
ENABLE_SHOWER_TIMER: 'Duş Sayacını Devreye Al',
ENABLE_SHOWER_ALERT: 'Duş Alarmını Devreye Al',
TRIGGER_TIME: 'Tetikleme Zamanı',
diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx
index 8ac035068..1f145af17 100644
--- a/interface/src/project/SettingsApplication.tsx
+++ b/interface/src/project/SettingsApplication.tsx
@@ -425,6 +425,11 @@ const SettingsApplication: FC = () => {
label={LL.UNDERCLOCK_CPU()}
disabled={saving}
/>
+ }
+ label={LL.HEATINGOFF()}
+ disabled={saving}
+ />
}
diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts
index 611dbc7fd..74f0dded6 100644
--- a/interface/src/project/types.ts
+++ b/interface/src/project/types.ts
@@ -7,6 +7,7 @@ export interface Settings {
syslog_mark_interval: number;
syslog_host: string;
syslog_port: number;
+ boiler_heatingoff: boolean;
shower_timer: boolean;
shower_alert: boolean;
shower_alert_coldshot: number;
diff --git a/interface/yarn.lock b/interface/yarn.lock
index 451dd1143..b2b675036 100644
--- a/interface/yarn.lock
+++ b/interface/yarn.lock
@@ -347,7 +347,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.22.15, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7":
+"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7":
version: 7.22.15
resolution: "@babel/runtime@npm:7.22.15"
dependencies:
@@ -356,6 +356,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/runtime@npm:^7.23.1":
+ version: 7.23.1
+ resolution: "@babel/runtime@npm:7.23.1"
+ dependencies:
+ regenerator-runtime: ^0.14.0
+ checksum: e57ab1436d4845efe67c3f76d578508bb584173690ecfeac105bc4e09d64b2aa6a53c1e03bca3c97cc238e5390a804e5a4ded211e6350243b735905ca45a4822
+ languageName: node
+ linkType: hard
+
"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5":
version: 7.22.15
resolution: "@babel/template@npm:7.22.15"
@@ -760,10 +769,10 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/js@npm:8.50.0":
- version: 8.50.0
- resolution: "@eslint/js@npm:8.50.0"
- checksum: 92cb0a823869e85f287bd172f14a6a20d7d65c3f4db886a0356a9efebfe8fe519e9ead84a5687bd18f45eca417bdcce96e3b83fe3feae8baf0f8f44d14073bae
+"@eslint/js@npm:8.51.0":
+ version: 8.51.0
+ resolution: "@eslint/js@npm:8.51.0"
+ checksum: c126d15213d938c72062b8f04388c084ba778771f2409ce508aa4b78152bf57e442b4c7996f632577b642101da5b41df101aece775fcc213a3159f55bcc4bdee
languageName: node
linkType: hard
@@ -896,14 +905,14 @@ __metadata:
languageName: node
linkType: hard
-"@mui/base@npm:5.0.0-beta.17":
- version: 5.0.0-beta.17
- resolution: "@mui/base@npm:5.0.0-beta.17"
+"@mui/base@npm:5.0.0-beta.18":
+ version: 5.0.0-beta.18
+ resolution: "@mui/base@npm:5.0.0-beta.18"
dependencies:
- "@babel/runtime": ^7.22.15
+ "@babel/runtime": ^7.23.1
"@floating-ui/react-dom": ^2.0.2
- "@mui/types": ^7.2.4
- "@mui/utils": ^5.14.11
+ "@mui/types": ^7.2.5
+ "@mui/utils": ^5.14.12
"@popperjs/core": ^2.11.8
clsx: ^2.0.0
prop-types: ^15.8.1
@@ -914,22 +923,22 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 7d0b67a279f9b63e88cd74426153fae129b3bbe670ccc06ba293357edb5466df01e8f953d86944a1ba500a8cf7cb2c2f3af0691b62b1a8e983dfbe19abc93717
+ checksum: 0d8f3743a69508b5259d7cd595acc3717f4ad60e1606bd7e1c58b82886ae74747151f6492a14f994ef5f88698fb02f95c84bf94a72dc71160f79965920f490bd
languageName: node
linkType: hard
-"@mui/core-downloads-tracker@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/core-downloads-tracker@npm:5.14.11"
- checksum: 206e74991d1fb1ce83f915d8761d08e793462a98213f433368a085b4715292580efcd4df5368266d7da1a2f7cc851e6f3762db27f24958d214aedbae6e562abd
+"@mui/core-downloads-tracker@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/core-downloads-tracker@npm:5.14.12"
+ checksum: 0cfd7e96f39b585cf58f98476e21240f92cd0a3b2b70e027d5483e1a10593426a05573f1802e9d8dc7723c54ce322a9496b2765987aaf0d5ab37b55787bfa512
languageName: node
linkType: hard
-"@mui/icons-material@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/icons-material@npm:5.14.11"
+"@mui/icons-material@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/icons-material@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
+ "@babel/runtime": ^7.23.1
peerDependencies:
"@mui/material": ^5.0.0
"@types/react": ^17.0.0 || ^18.0.0
@@ -937,20 +946,20 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: f956b48b8ac83318a8e5e93a084f4f62ce82694e591a611e40d35c7c41d6395339bbde0416d0b80927e1ed3a051d4984076a090c2f8655046ac281bc5ca6466e
+ checksum: 06e63cdcb1ca9aa66d4d0c1d31d4e10135b9a342997e9e1da29cde529ceff5fb2471f20892769bf6163ae934d941e494bdd769a622c7d0ed7474728b4ce45e2b
languageName: node
linkType: hard
-"@mui/material@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/material@npm:5.14.11"
+"@mui/material@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/material@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
- "@mui/base": 5.0.0-beta.17
- "@mui/core-downloads-tracker": ^5.14.11
- "@mui/system": ^5.14.11
- "@mui/types": ^7.2.4
- "@mui/utils": ^5.14.11
+ "@babel/runtime": ^7.23.1
+ "@mui/base": 5.0.0-beta.18
+ "@mui/core-downloads-tracker": ^5.14.12
+ "@mui/system": ^5.14.12
+ "@mui/types": ^7.2.5
+ "@mui/utils": ^5.14.12
"@types/react-transition-group": ^4.4.6
clsx: ^2.0.0
csstype: ^3.1.2
@@ -970,16 +979,16 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 53b5ba0732cee87c82c16a64c3bc145f1fd88ae014c5d1dab9f84c24a212375f75cf1cb44b0ceca80135e009ec4f1fe13a8a3ca2079a55bbe5a15f22a706429c
+ checksum: 65c868b1fc9b73e2afa17c12f4e9b410dccb9f5ac21b6d37f913811ec19e84c50bc724b40c67a51bbfeb699550ad10c7f8b265c2518d846dfe8056cb0203ec1c
languageName: node
linkType: hard
-"@mui/private-theming@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/private-theming@npm:5.14.11"
+"@mui/private-theming@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/private-theming@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
- "@mui/utils": ^5.14.11
+ "@babel/runtime": ^7.23.1
+ "@mui/utils": ^5.14.12
prop-types: ^15.8.1
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0
@@ -987,15 +996,15 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: e9b96b86355685a9dcbf95e617f3d86b33c502e005a5c6cd9b9cc64d102742b00b960560666d49b0ef0c4f4dac2d7a17f81ca6a745ff893b64e22515b53bd8fc
+ checksum: dbd24ffd3ff0d514c44b043c3fa34035403fdb9ccf459efb5c15fff127d6cc01471b7e748798c37c324ff20fd985f5923807271a5e3b857254c2e51a39ab8e4f
languageName: node
linkType: hard
-"@mui/styled-engine@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/styled-engine@npm:5.14.11"
+"@mui/styled-engine@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/styled-engine@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
+ "@babel/runtime": ^7.23.1
"@emotion/cache": ^11.11.0
csstype: ^3.1.2
prop-types: ^15.8.1
@@ -1008,19 +1017,19 @@ __metadata:
optional: true
"@emotion/styled":
optional: true
- checksum: b71cf3d9d0377bc5cdba01f4f72153147310b4d054fb10b6e5899b5307d05cc44770bcd8ba61069806c35bd367e5241328fbce7a7e91c7ec11e483fdb79fbc49
+ checksum: 55e4b7a0990a5f92248e2e1e622ca6306decb42757e8aa1abe2687e2b46b8ee1d7fbfcef402ea705ac286efaf085d1aed526af6aa346ae5048d8376bb696aa3d
languageName: node
linkType: hard
-"@mui/system@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/system@npm:5.14.11"
+"@mui/system@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/system@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
- "@mui/private-theming": ^5.14.11
- "@mui/styled-engine": ^5.14.11
- "@mui/types": ^7.2.4
- "@mui/utils": ^5.14.11
+ "@babel/runtime": ^7.23.1
+ "@mui/private-theming": ^5.14.12
+ "@mui/styled-engine": ^5.14.12
+ "@mui/types": ^7.2.5
+ "@mui/utils": ^5.14.12
clsx: ^2.0.0
csstype: ^3.1.2
prop-types: ^15.8.1
@@ -1036,28 +1045,28 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 3677dce2b1c010d5679f96a8c9cd54d803558b9ac881e4adec480ae7c3136b54895f5850131abf31b7d16493964a048d5261128332cecf2e3944c9dd58814bf1
+ checksum: 93f77c7a0673a116efe92d3f290886033278d915386c5aa29056c4a4557540db2865c4405140e669c7be801d6cba3dd3ddea2bb63bfc7eedd18e5b829a13ab80
languageName: node
linkType: hard
-"@mui/types@npm:^7.2.4":
- version: 7.2.4
- resolution: "@mui/types@npm:7.2.4"
+"@mui/types@npm:^7.2.5":
+ version: 7.2.5
+ resolution: "@mui/types@npm:7.2.5"
peerDependencies:
- "@types/react": "*"
+ "@types/react": ^17.0.0 || ^18.0.0
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 17411effd184eff34d6a1a55b2249c7e1ef195bb30c48154f0b16fdce428ff55be4ec5dde8b4a556c01eda2d34e3dcc18d925f8fdee606f5bc15f91167f0ecbc
+ checksum: df381cb230b1335d46315517da3535fa362bb53388a9d6e87964ee77991685442a6cb5a8f39cbd878d89176a152fe699aa6ecc681957ecf4695b85db0d2abe83
languageName: node
linkType: hard
-"@mui/utils@npm:^5.14.11":
- version: 5.14.11
- resolution: "@mui/utils@npm:5.14.11"
+"@mui/utils@npm:^5.14.12":
+ version: 5.14.12
+ resolution: "@mui/utils@npm:5.14.12"
dependencies:
- "@babel/runtime": ^7.22.15
- "@types/prop-types": ^15.7.5
+ "@babel/runtime": ^7.23.1
+ "@types/prop-types": ^15.7.7
prop-types: ^15.8.1
react-is: ^18.2.0
peerDependencies:
@@ -1066,7 +1075,7 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 21048b65e482e2f4279bf2b0e1619f026ed605bfe71818f6373b6362abc5062ea293ab7791691da1275de2d72b16cc5dafca70c2169359eca0b1c46c52aba879
+ checksum: 1204e6699ddc508a3d46ec86b0cb31abea59cf41ce3bcbff18f651731783ced0217b7274452662ec7bf4a230c9b1bebd184b34a8729e43ceb3a6a0e50e72bcdf
languageName: node
linkType: hard
@@ -1468,10 +1477,10 @@ __metadata:
languageName: node
linkType: hard
-"@types/node@npm:^20.8.2":
- version: 20.8.2
- resolution: "@types/node@npm:20.8.2"
- checksum: e9952db222dd3e1cca1107d1b2aaec4e93b4af8b4fc32b42dd4fac3719f98c14edb8c591829c972d2f6e2b527bbb34af53608f6a7973f4a7dbd1d3bc929bbe8d
+"@types/node@npm:^20.8.3":
+ version: 20.8.3
+ resolution: "@types/node@npm:20.8.3"
+ checksum: 83511d7c310100f3fddbbf3a28f0049d60da6ffc4255231845b2e2189d7ff104727647d2b05d2a29b0af2ad61b529a4897056b3798e0cba027c629f3b13d7e82
languageName: node
linkType: hard
@@ -1482,19 +1491,26 @@ __metadata:
languageName: node
linkType: hard
-"@types/prop-types@npm:*, @types/prop-types@npm:^15.7.5":
+"@types/prop-types@npm:*":
version: 15.7.7
resolution: "@types/prop-types@npm:15.7.7"
checksum: 26d565ebae8c28dede71547d687367ce74eeccc645fdbef2d38478fe293996be24784fa6190586ba303ccd274aa94d8a631d36a5d9b8e0c08f5647ff3244d72c
languageName: node
linkType: hard
-"@types/react-dom@npm:^18.2.8":
- version: 18.2.8
- resolution: "@types/react-dom@npm:18.2.8"
+"@types/prop-types@npm:^15.7.7":
+ version: 15.7.8
+ resolution: "@types/prop-types@npm:15.7.8"
+ checksum: 706b3de6faa5c1a4763fc90069f25ddc54108e8b43e9724e22f510b103c418571bf14b34b241fcacd6875650959c8374af7f4633f80ec6e33e7525cb42ef6a30
+ languageName: node
+ linkType: hard
+
+"@types/react-dom@npm:^18.2.11":
+ version: 18.2.11
+ resolution: "@types/react-dom@npm:18.2.11"
dependencies:
"@types/react": "*"
- checksum: a2afa9f626751f2314ddbecb5503122912ff646827b1c81b7b230ce04083c43b71c82b02244526eb88c1795019033364a4afee0f7f719e46116a51ca8e287613
+ checksum: 3ba42df0dc1e8a26baed9668b9e2b5aea7c8e28289cf5baa656c1a07c6f83cd3c3360a374e00f96c01ce914950105d14d3ecd59be75cf215b8d3657b0b5d7785
languageName: node
linkType: hard
@@ -1539,14 +1555,14 @@ __metadata:
languageName: node
linkType: hard
-"@types/react@npm:^18.2.24":
- version: 18.2.24
- resolution: "@types/react@npm:18.2.24"
+"@types/react@npm:^18.2.25":
+ version: 18.2.25
+ resolution: "@types/react@npm:18.2.25"
dependencies:
"@types/prop-types": "*"
"@types/scheduler": "*"
csstype: ^3.0.2
- checksum: a83c7ae0010b265012ef038e3e00e4708c27c523f0aa0631e44f934e9c5338a51b6db1901f91d8ba10d3dc292a3a200b2cb5e47430cde58fbf988969866fe75a
+ checksum: 17559ab8e9a3347b466eb782e21fe45f841e0e39d3f656e4711693cb6d193f948a9913c9e96b64bc4700eb24b34c47f15adbddcc39c596b4b3b79c99619b83bf
languageName: node
linkType: hard
@@ -1694,22 +1710,22 @@ __metadata:
"@babel/core": ^7.23.0
"@emotion/react": ^11.11.1
"@emotion/styled": ^11.11.0
- "@mui/icons-material": ^5.14.11
- "@mui/material": ^5.14.11
+ "@mui/icons-material": ^5.14.12
+ "@mui/material": ^5.14.12
"@preact/compat": ^17.1.2
"@preact/preset-vite": ^2.5.0
"@table-library/react-table-library": 4.1.7
"@types/babel__core": ^7
"@types/lodash-es": ^4.17.9
- "@types/node": ^20.8.2
- "@types/react": ^18.2.24
- "@types/react-dom": ^18.2.8
+ "@types/node": ^20.8.3
+ "@types/react": ^18.2.25
+ "@types/react-dom": ^18.2.11
"@types/react-router-dom": ^5.3.3
"@typescript-eslint/eslint-plugin": ^6.7.4
"@typescript-eslint/parser": ^6.7.4
alova: ^2.13.1
async-validator: ^4.2.5
- eslint: ^8.50.0
+ eslint: ^8.51.0
eslint-config-airbnb: ^19.0.4
eslint-config-airbnb-typescript: ^17.1.0
eslint-config-prettier: ^9.0.0
@@ -1738,7 +1754,7 @@ __metadata:
terser: ^5.21.0
typesafe-i18n: ^5.26.2
typescript: ^5.2.2
- vite: ^4.4.10
+ vite: ^4.4.11
vite-plugin-svgr: ^4.1.0
vite-tsconfig-paths: ^4.2.1
languageName: unknown
@@ -3072,14 +3088,14 @@ eslint-plugin-prettier@alpha:
languageName: node
linkType: hard
-"eslint@npm:^8.50.0":
- version: 8.50.0
- resolution: "eslint@npm:8.50.0"
+"eslint@npm:^8.51.0":
+ version: 8.51.0
+ resolution: "eslint@npm:8.51.0"
dependencies:
"@eslint-community/eslint-utils": ^4.2.0
"@eslint-community/regexpp": ^4.6.1
"@eslint/eslintrc": ^2.1.2
- "@eslint/js": 8.50.0
+ "@eslint/js": 8.51.0
"@humanwhocodes/config-array": ^0.11.11
"@humanwhocodes/module-importer": ^1.0.1
"@nodelib/fs.walk": ^1.2.8
@@ -3115,7 +3131,7 @@ eslint-plugin-prettier@alpha:
text-table: ^0.2.0
bin:
eslint: bin/eslint.js
- checksum: 91629528cb240bc61b25480574d35cd54ed444cb61a70fa76f7d5ab26af2b637b94bf8fba94403c9052c1baa944a169b6ab9cc8070496e925f7eeef730ff9038
+ checksum: b534962c60cb2ad219d20a33f93c80e8ea5dd89f390f7bab44c80df32134db0a87e73e7ccd2928d87498c0595128ee29b4dba8a1f1abbbb3da9c3fb0418ecdcc
languageName: node
linkType: hard
@@ -6262,9 +6278,9 @@ react@latest:
languageName: node
linkType: hard
-"vite@npm:^4.4.10":
- version: 4.4.10
- resolution: "vite@npm:4.4.10"
+"vite@npm:^4.4.11":
+ version: 4.4.11
+ resolution: "vite@npm:4.4.11"
dependencies:
esbuild: ^0.18.10
fsevents: ~2.3.2
@@ -6298,7 +6314,7 @@ react@latest:
optional: true
bin:
vite: bin/vite.js
- checksum: d1359f147eb84aad9922460848184f14295e76f335ab03f90a585886ff070e1a7c74996022b3bb07da0a3130c9829565b5556e6eb1d0db12a8aad26f3694d445
+ checksum: 550af0f67b600f603d0c129b74ac18dfa674d19e2b7dba28f4214d5edeba217a91fb7b8f4f47037aa0297f142d22360780a0a4533b27dbaacd2894030f61e5f4
languageName: node
linkType: hard
diff --git a/src/default_settings.h b/src/default_settings.h
index 009a5f25e..92ae49a8e 100644
--- a/src/default_settings.h
+++ b/src/default_settings.h
@@ -61,6 +61,10 @@
#define EMSESP_DEFAULT_TRACELOG_RAW false
#endif
+#ifndef EMSESP_DEFAULT_BOILER_HEATINGOFF
+#define EMSESP_DEFAULT_BOILER_HEATINGOFF false
+#endif
+
#ifndef EMSESP_DEFAULT_SHOWER_TIMER
#define EMSESP_DEFAULT_SHOWER_TIMER false
#endif
diff --git a/src/device_library.h b/src/device_library.h
index 84bc0fa66..6f35b79e7 100644
--- a/src/device_library.h
+++ b/src/device_library.h
@@ -42,7 +42,7 @@
{170, DeviceType::BOILER, "Logano GB212", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{172, DeviceType::BOILER, "Enviline/Compress 6000AW/Hybrid 3000-7000iAW/SupraEco/Geo 5xx/WLW196i/WSW196i", DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP},
{173, DeviceType::BOILER, "Geo 5xx", DeviceFlags::EMS_DEVICE_FLAG_HEATPUMP},
-{195, DeviceType::BOILER, "Condens 5000i/Greenstar 8000/GC9800IW", DeviceFlags::EMS_DEVICE_FLAG_NONE},
+{195, DeviceType::BOILER, "Condens 5000i/Greenstar 8000/GC9800IW/GB192i.2", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{203, DeviceType::BOILER, "Logamax U122/Cerapur", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{206, DeviceType::BOILER, "Ecomline Excellent", DeviceFlags::EMS_DEVICE_FLAG_NONE},
{208, DeviceType::BOILER, "Logamax Plus/GB192/Condens GC9000/Greenstar ErP", DeviceFlags::EMS_DEVICE_FLAG_NONE},
@@ -81,7 +81,7 @@
{203, DeviceType::THERMOSTAT, "EasyControl CT200", DeviceFlags::EMS_DEVICE_FLAG_EASY | DeviceFlags::EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
// Thermostat - Buderus/Nefit/Bosch specific - 0x17 / 0x10 / 0x18 / 0x19-0x1B for hc2-4 / 0x38
-{ 4, DeviceType::THERMOSTAT, "UI800", DeviceFlags::EMS_DEVICE_FLAG_RC300}, // 0x10
+{ 4, DeviceType::THERMOSTAT, "UI800/BC400", DeviceFlags::EMS_DEVICE_FLAG_RC300}, // 0x10
{ 65, DeviceType::THERMOSTAT, "RC10", DeviceFlags::EMS_DEVICE_FLAG_RC20_N},// 0x17
{ 67, DeviceType::THERMOSTAT, "RC30", DeviceFlags::EMS_DEVICE_FLAG_RC30_N},// 0x10 - based on RC35
{ 77, DeviceType::THERMOSTAT, "RC20/Moduline 300", DeviceFlags::EMS_DEVICE_FLAG_RC20},// 0x17
diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp
index e601d3d96..7e016ae8d 100644
--- a/src/devices/boiler.cpp
+++ b/src/devices/boiler.cpp
@@ -119,7 +119,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
// reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset));
has_update(reset_, 0);
-
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &forceHeatingOff_,
+ DeviceValueType::BOOL,
+ FL_(forceHeatingOff),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_forceHeatingOff));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingActive_, DeviceValueType::BOOL, FL_(heatingActive), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tapwaterActive_, DeviceValueType::BOOL, FL_(tapwaterActive), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &selFlowTemp_, DeviceValueType::UINT, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp));
@@ -156,6 +161,18 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
DeviceValueNumOp::DV_NUMOP_DIV10,
FL_(exhaustTemp),
DeviceValueUOM::DEGREES);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &heatblock_,
+ DeviceValueType::USHORT,
+ DeviceValueNumOp::DV_NUMOP_DIV10,
+ FL_(heatblock),
+ DeviceValueUOM::DEGREES);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &headertemp_,
+ DeviceValueType::USHORT,
+ DeviceValueNumOp::DV_NUMOP_DIV10,
+ FL_(headertemp),
+ DeviceValueUOM::DEGREES);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas_, DeviceValueType::BOOL, FL_(burnGas), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas2_, DeviceValueType::BOOL, FL_(burnGas2), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &flameCurr_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flameCurr), DeviceValueUOM::UA);
@@ -951,6 +968,11 @@ void Boiler::check_active() {
EMSESP::tap_water_active(b); // let EMS-ESP know, used in the Shower class
}
+ if (!Helpers::hasValue(forceHeatingOff_, EMS_VALUE_BOOL)) {
+ EMSESP::webSettingsService.read([&](WebSettings & settings) { forceHeatingOff_ = (settings.boiler_heatingoff || selFlowTemp_ == 0) ? 1 : 0; });
+ has_update(&forceHeatingOff_);
+ }
+
// calculate energy for boiler 0x08 from stored modulation an time in units of 0.01 Wh
if (model() != EMS_DEVICE_FLAG_HEATPUMP) {
// remember values from last call
@@ -1158,6 +1180,8 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram
has_update(telegram, sysPress_, 21);
//has_update(telegram, temperatur_, 13); // unknown temperature
+ has_update(telegram, heatblock_, 23); // see #1317
+ has_update(telegram, headertemp_, 25); // see #1317
//has_update(telegram, temperatur_, 27); // unknown temperature
has_update(telegram, exhaustTemp_, 31);
@@ -1206,6 +1230,11 @@ void Boiler::process_UBAMonitorSlow(std::shared_ptr telegram) {
has_update(telegram, burn2WorkMin_, 16, 3); // force to 3 bytes
has_update(telegram, heatWorkMin_, 19, 3); // force to 3 bytes
has_update(telegram, heatStarts_, 22, 3); // force to 3 bytes
+
+ if (forceHeatingOff_ == EMS_VALUE_BOOL_ON && telegram->dest == 0) {
+ uint8_t data[] = {0, 0, 0, 0};
+ write_command(EMS_TYPE_UBASetPoints, 0, data, sizeof(data), 0);
+ }
}
/*
@@ -1236,6 +1265,11 @@ void Boiler::process_UBAMonitorSlowPlus(std::shared_ptr telegram
has_update(telegram, heatStarts_, 22, 3); // force to 3 bytes
has_update(telegram, heatingPumpMod_, 25);
// temperature measurements at 4, see #620
+
+ if (forceHeatingOff_ == EMS_VALUE_BOOL_ON && telegram->dest == 0) {
+ uint8_t data[] = {0, 0, 0, 0};
+ write_command(EMS_TYPE_UBASetPoints, 0, data, sizeof(data), 0);
+ }
}
/*
@@ -1485,6 +1519,12 @@ void Boiler::process_UBASetPoints(std::shared_ptr telegram) {
has_update(telegram, setFlowTemp_, 0); // boiler set temp from thermostat
has_update(telegram, setBurnPow_, 1); // max burner power in %
has_update(telegram, wwSetPumpPower_, 2); // ww pump speed/power?
+
+ // overwrite other settings on receive?
+ if (forceHeatingOff_ == EMS_VALUE_BOOL_ON && telegram->dest == 0x08) {
+ uint8_t data[] = {0, 0, 0, 0};
+ write_command(EMS_TYPE_UBASetPoints, 0, data, sizeof(data), 0);
+ }
}
#pragma GCC diagnostic push
@@ -2035,9 +2075,6 @@ bool Boiler::set_ww_chargeOptimization(const char * value, const int8_t id) {
return true;
}
-
-
-
// set dhw max power
bool Boiler::set_ww_maxpower(const char * value, const int8_t id) {
int v;
@@ -2346,12 +2383,10 @@ bool Boiler::set_reset(const char * value, const int8_t id) {
} else if (num == 1) {
// LOG_INFO("Reset boiler maintenance message");
write_command(0x05, 0x08, 0xFF, 0x1C);
- has_update(&reset_);
return true;
} else if (num == 2) {
// LOG_INFO("Reset boiler error message");
write_command(0x05, 0x00, 0x5A); // error reset
- has_update(&reset_);
return true;
}
return false;
@@ -2754,6 +2789,22 @@ bool Boiler::set_wwAltOpPrio(const char * value, const int8_t id) {
return false;
}
+bool Boiler::set_forceHeatingOff(const char * value, const int8_t id) {
+ bool v;
+ if (Helpers::value2bool(value, v)) {
+ has_update(forceHeatingOff_, v);
+ if (!v && Helpers::hasValue(heatingTemp_)) {
+ uint8_t data[] = {heatingTemp_,
+ (Helpers::hasValue(burnMaxPower_) ? burnMaxPower_ : (uint8_t)100),
+ (Helpers::hasValue(pumpModMax_) ? pumpModMax_ : (uint8_t)0),
+ 0};
+ write_command(EMS_TYPE_UBASetPoints, 0, data, sizeof(data), 0);
+ }
+ return true;
+ }
+ return false;
+}
+
// energy counters. Setting an invalid value does not update, but trigger a store.
bool Boiler::set_nrgHeat(const char * value, const int8_t id) {
float v;
diff --git a/src/devices/boiler.h b/src/devices/boiler.h
index 3f99acbee..26bbc8ce1 100644
--- a/src/devices/boiler.h
+++ b/src/devices/boiler.h
@@ -88,7 +88,6 @@ class Boiler : public EMSdevice {
uint32_t wwWorkM_; // DHW minutes
int8_t wwHystOn_;
int8_t wwHystOff_;
- uint8_t wwTapActivated_; // maintenance-mode to switch DHW off
uint16_t wwMixerTemp_; // mixing temperature
uint16_t wwCylMiddleTemp_; // Cyl middle temperature (TS3)
uint16_t wwSolarTemp_;
@@ -96,6 +95,10 @@ class Boiler : public EMSdevice {
uint8_t wwAltOpPrioHeat_; // alternating operation, prioritize heat time
uint8_t wwAltOpPrioWw_; // alternating operation, prioritize dhw time
+ // special function
+ uint8_t forceHeatingOff_;
+ uint8_t wwTapActivated_; // maintenance-mode to switch DHW off
+
// main
uint8_t reset_; // for reset command
uint8_t heatingActive_; // Central heating is on/off
@@ -145,6 +148,8 @@ class Boiler : public EMSdevice {
uint16_t serviceCodeNumber_; // error/service code
uint8_t emergencyOps_;
uint8_t emergencyTemp_;
+ uint16_t headertemp_; // see #1317
+ uint16_t heatblock_; // see #1317
// info
uint32_t upTimeControl_; // Operating time control
@@ -468,6 +473,8 @@ class Boiler : public EMSdevice {
inline bool set_wwAltOpPrioWw(const char * value, const int8_t id) {
return set_wwAltOpPrio(value, 3);
}
+ bool set_forceHeatingOff(const char * value, const int8_t id);
+
/*
bool set_hybridStrategy(const char * value, const int8_t id);
bool set_switchOverTemp(const char * value, const int8_t id);
diff --git a/src/locale_translations.h b/src/locale_translations.h
index c8cb83a74..e8add620b 100644
--- a/src/locale_translations.h
+++ b/src/locale_translations.h
@@ -283,6 +283,7 @@ MAKE_TRANSLATION(haclimate, "haclimate", "Discovery current room temperature", "
// Entity translations: tag, mqtt, en, de, nl, sv, pl, no, fr, tr, it
// Boiler
+MAKE_TRANSLATION(forceHeatingOff, "heatingoff", "force heating off", "Heizen abschalten", "", "", "", "", "", "", "") // TODO translate
MAKE_TRANSLATION(wwtapactivated, "wwtapactivated", "turn on/off", "Durchlauferhitzer aktiv", "zet aan/uit", "på/av", "system przygotowywania", "Varmtvann active", "ecs activée", "aç/kapa", "commuta on/off")
MAKE_TRANSLATION(reset, "reset", "reset", "Reset", "Reset", "Nollställ", "kasowanie komunikatu", "nullstill", "reset", "Sıfırla", "Reset")
MAKE_TRANSLATION(oilPreHeat, "oilpreheat", "oil preheating", "Ölvorwärmung", "Olie voorverwarming", "Förvärmning olja", "podgrzewanie oleju", "oljeforvarming", "préchauffage de l'huile", "Yakıt Ön ısıtma devrede", "preriscaldamento olio")
@@ -336,6 +337,8 @@ MAKE_TRANSLATION(maintenanceTime, "maintenancetime", "time to next maintenance",
MAKE_TRANSLATION(emergencyOps, "emergencyops", "emergency operation", "Notoperation", "Noodoperatie", "Nöddrift", "praca w trybie awaryjnym", "nøddrift", "opération d'urgence", "acil durum çalışması", "operazione di emergenza")
MAKE_TRANSLATION(emergencyTemp, "emergencytemp", "emergency temperature", "Nottemperatur", "Noodtemperatuur", "Nöddrift temperatur", "temperatura w trybie awaryjnym", "nødtemperatur", "température d'urgence", "acil durum sıcaklığı", "temperatura di emergenza")
MAKE_TRANSLATION(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpen Modus", "Ketelpomp modus", "", "tryb pracy pompy kotła", "pumpemodus", "", "pompa modu", "modalità pompa caldaia") // TODO translate
+MAKE_TRANSLATION(headertemp, "headertemp", "low loss header", "Hydr. Weiche", "open verdeler", "", "", "", " bouteille de déc. hydr.", "isı bloğu gidiş suyu sıc.", "comp. idr.") // TODO translate
+MAKE_TRANSLATION(heatblock, "heatblock", "heating block", "Wärmezelle", "Aanvoertemp. warmtecel", "", "", "", "départ corps de chauffe", "Hid.denge kabı sıcaklığı", "mandata scamb. pr.") // TODO translate
// heatpump/compress specific
MAKE_TRANSLATION(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "total driftstid", "durée totale de fonctionnement chauffage", "ısınma toplam işletme süresi", "Tempo di funzionamento totale riscaldamento")
diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp
index 73db24fb3..8aa6a1fa3 100644
--- a/src/web/WebSettingsService.cpp
+++ b/src/web/WebSettingsService.cpp
@@ -46,6 +46,7 @@ void WebSettings::read(WebSettings & settings, JsonObject & root) {
root["syslog_mark_interval"] = settings.syslog_mark_interval;
root["syslog_host"] = settings.syslog_host;
root["syslog_port"] = settings.syslog_port;
+ root["boiler_heatingoff"] = settings.boiler_heatingoff;
root["shower_timer"] = settings.shower_timer;
root["shower_alert"] = settings.shower_alert;
root["shower_alert_coldshot"] = settings.shower_alert_coldshot;
@@ -273,8 +274,9 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings)
settings.trace_raw = root["trace_raw"] | EMSESP_DEFAULT_TRACELOG_RAW;
EMSESP::trace_raw(settings.trace_raw);
- settings.notoken_api = root["notoken_api"] | EMSESP_DEFAULT_NOTOKEN_API;
- settings.solar_maxflow = root["solar_maxflow"] | EMSESP_DEFAULT_SOLAR_MAXFLOW;
+ settings.notoken_api = root["notoken_api"] | EMSESP_DEFAULT_NOTOKEN_API;
+ settings.solar_maxflow = root["solar_maxflow"] | EMSESP_DEFAULT_SOLAR_MAXFLOW;
+ settings.boiler_heatingoff = root["boiler_heatingoff"] | EMSESP_DEFAULT_BOILER_HEATINGOFF;
settings.fahrenheit = root["fahrenheit"];
EMSESP::system_.fahrenheit(settings.fahrenheit);
diff --git a/src/web/WebSettingsService.h b/src/web/WebSettingsService.h
index 0e892328e..c887cdf09 100644
--- a/src/web/WebSettingsService.h
+++ b/src/web/WebSettingsService.h
@@ -33,6 +33,7 @@ class WebSettings {
String locale;
uint8_t tx_mode;
uint8_t ems_bus_id;
+ bool boiler_heatingoff;
bool shower_timer;
bool shower_alert;
uint8_t shower_alert_trigger;