diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 68fc2947e..f0588c826 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -8,6 +8,9 @@
- Add support for Lolin C3 mini [#620](https://github.com/emsesp/EMS-ESP32/pull/620)
- Add Greenstar 30Ri boiler
- Add program memory info
+- Add min/max setting to customizations
+- Adapt min/max if ems-value is not in this range
+- Add heatpump settings for inputs and limits
## Fixed
@@ -20,5 +23,4 @@
## **BREAKING CHANGES:**
-
- When upgrading from 3.4.x you may need to erase the flash on the ESP32 before uploading the firmware. Make sure you make a backup of the settings and customizations via the WebUI (System->Upload/Download)
diff --git a/interface/.typesafe-i18n.json b/interface/.typesafe-i18n.json
index 66dd583a4..d3f04322e 100644
--- a/interface/.typesafe-i18n.json
+++ b/interface/.typesafe-i18n.json
@@ -1,5 +1,5 @@
{
- "adapter": "react",
- "baseLocale": "en",
- "$schema": "https://unpkg.com/typesafe-i18n@5.13.0/schema/typesafe-i18n.json"
-}
+ "adapter": "react",
+ "baseLocale": "en",
+ "$schema": "https://unpkg.com/typesafe-i18n@5.14.0/schema/typesafe-i18n.json"
+}
\ No newline at end of file
diff --git a/interface/package-lock.json b/interface/package-lock.json
index 330de6a46..2dad40071 100644
--- a/interface/package-lock.json
+++ b/interface/package-lock.json
@@ -66,28 +66,28 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz",
- "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz",
+ "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz",
- "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz",
+ "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==",
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
- "@babel/helper-compilation-targets": "^7.19.1",
+ "@babel/generator": "^7.19.3",
+ "@babel/helper-compilation-targets": "^7.19.3",
"@babel/helper-module-transforms": "^7.19.0",
"@babel/helpers": "^7.19.0",
- "@babel/parser": "^7.19.1",
+ "@babel/parser": "^7.19.3",
"@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/traverse": "^7.19.3",
+ "@babel/types": "^7.19.3",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -128,11 +128,11 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz",
- "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz",
+ "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==",
"dependencies": {
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.19.3",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
},
@@ -177,11 +177,11 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz",
- "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz",
+ "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==",
"dependencies": {
- "@babel/compat-data": "^7.19.1",
+ "@babel/compat-data": "^7.19.3",
"@babel/helper-validator-option": "^7.18.6",
"browserslist": "^4.21.3",
"semver": "^6.3.0"
@@ -475,9 +475,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz",
- "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz",
+ "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -564,9 +564,9 @@
}
},
"node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.1.tgz",
- "integrity": "sha512-LfIKNBBY7Q1OX5C4xAgRQffOg2OnhAo9fnbcOHgOC9Yytm2Sw+4XqHufRYU86tHomzepxtvuVaNO+3EVKR4ivw==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.3.tgz",
+ "integrity": "sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg==",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.19.0",
"@babel/helper-plugin-utils": "^7.19.0",
@@ -1580,9 +1580,9 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz",
- "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz",
+ "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.19.0",
"@babel/helper-plugin-utils": "^7.19.0",
@@ -1625,12 +1625,12 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz",
- "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz",
+ "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==",
"dependencies": {
- "@babel/compat-data": "^7.19.1",
- "@babel/helper-compilation-targets": "^7.19.1",
+ "@babel/compat-data": "^7.19.3",
+ "@babel/helper-compilation-targets": "^7.19.3",
"@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-validator-option": "^7.18.6",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
@@ -1698,7 +1698,7 @@
"@babel/plugin-transform-unicode-escapes": "^7.18.10",
"@babel/plugin-transform-unicode-regex": "^7.18.6",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.19.3",
"babel-plugin-polyfill-corejs2": "^0.3.3",
"babel-plugin-polyfill-corejs3": "^0.6.0",
"babel-plugin-polyfill-regenerator": "^0.4.1",
@@ -1799,18 +1799,18 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz",
- "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz",
+ "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==",
"dependencies": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
+ "@babel/generator": "^7.19.3",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/parser": "^7.19.3",
+ "@babel/types": "^7.19.3",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -1819,12 +1819,12 @@
}
},
"node_modules/@babel/types": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
- "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz",
+ "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==",
"dependencies": {
"@babel/helper-string-parser": "^7.18.10",
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -2316,9 +2316,9 @@
}
},
"node_modules/@humanwhocodes/config-array": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz",
- "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==",
+ "version": "0.10.7",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+ "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
"dependencies": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
@@ -3557,9 +3557,9 @@
"integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
},
"node_modules/@sinclair/typebox": {
- "version": "0.24.42",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.42.tgz",
- "integrity": "sha512-d+2AtrHGyWek2u2ITF0lHRIv6Tt7X0dEHW+0rP+5aDCEjC3fiN2RBjrLD0yU0at52BcZbRGxLbAtXiR0hFCjYw=="
+ "version": "0.24.44",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz",
+ "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg=="
},
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
@@ -3876,9 +3876,9 @@
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.18.1",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz",
- "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
+ "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
"dependencies": {
"@babel/types": "^7.3.0"
}
@@ -4039,9 +4039,9 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
},
"node_modules/@types/prettier": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz",
- "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A=="
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
+ "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow=="
},
"node_modules/@types/prop-types": {
"version": "15.7.5",
@@ -4191,13 +4191,13 @@
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz",
- "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz",
+ "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==",
"dependencies": {
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/type-utils": "5.38.0",
- "@typescript-eslint/utils": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/type-utils": "5.38.1",
+ "@typescript-eslint/utils": "5.38.1",
"debug": "^4.3.4",
"ignore": "^5.2.0",
"regexpp": "^3.2.0",
@@ -4236,11 +4236,11 @@
}
},
"node_modules/@typescript-eslint/experimental-utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.38.0.tgz",
- "integrity": "sha512-kzXBRfvGlicgGk4CYuRUqKvwc2s3wHXNssUWWJU18bhMRxriFm3BZWyQ6vEHBRpEIMKB6b7MIQHO+9lYlts19w==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.38.1.tgz",
+ "integrity": "sha512-Zv0EcU0iu64DiVG3pRZU0QYCgANO//U1fS3oEs3eqHD1eIVVcQsFd/T01ckaNbL2H2aCqRojY2xZuMAPcOArEA==",
"dependencies": {
- "@typescript-eslint/utils": "5.38.0"
+ "@typescript-eslint/utils": "5.38.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4254,13 +4254,13 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz",
- "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz",
+ "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==",
"dependencies": {
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/typescript-estree": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/typescript-estree": "5.38.1",
"debug": "^4.3.4"
},
"engines": {
@@ -4280,12 +4280,12 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz",
- "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz",
+ "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==",
"dependencies": {
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/visitor-keys": "5.38.0"
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/visitor-keys": "5.38.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4296,12 +4296,12 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz",
- "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz",
+ "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==",
"dependencies": {
- "@typescript-eslint/typescript-estree": "5.38.0",
- "@typescript-eslint/utils": "5.38.0",
+ "@typescript-eslint/typescript-estree": "5.38.1",
+ "@typescript-eslint/utils": "5.38.1",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
},
@@ -4322,9 +4322,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz",
- "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz",
+ "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg==",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -4334,12 +4334,12 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz",
- "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz",
+ "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==",
"dependencies": {
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/visitor-keys": "5.38.0",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/visitor-keys": "5.38.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -4374,14 +4374,14 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz",
- "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz",
+ "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==",
"dependencies": {
"@types/json-schema": "^7.0.9",
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/typescript-estree": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/typescript-estree": "5.38.1",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0"
},
@@ -4417,11 +4417,11 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz",
- "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz",
+ "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==",
"dependencies": {
- "@typescript-eslint/types": "5.38.0",
+ "@typescript-eslint/types": "5.38.1",
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
@@ -5561,9 +5561,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001410",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz",
- "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==",
+ "version": "1.0.30001414",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz",
+ "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==",
"funding": [
{
"type": "opencollective",
@@ -5904,9 +5904,9 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/core-js": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz",
- "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A==",
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz",
+ "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -5914,9 +5914,9 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz",
- "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==",
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.3.tgz",
+ "integrity": "sha512-xVtYpJQ5grszDHEUU9O7XbjjcZ0ccX3LgQsyqSvTnjX97ZqEgn9F5srmrwwwMtbKzDllyFPL+O+2OFMl1lU4TQ==",
"dependencies": {
"browserslist": "^4.21.4"
},
@@ -5926,9 +5926,9 @@
}
},
"node_modules/core-js-pure": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz",
- "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA==",
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.3.tgz",
+ "integrity": "sha512-T/7qvgv70MEvRkZ8p6BasLZmOVYKzOaWNBEHAU8FmveCJkl4nko2quqPQOmy6AJIp5MBanhz9no3A94NoRb0XA==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -6755,9 +6755,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.258",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.258.tgz",
- "integrity": "sha512-vutF4q0dTUXoAFI7Vbtdwen/BJVwPgj8GRg/SElOodfH7VTX+svUe62A5BG41QRQGk5HsZPB0M++KH1lAlOt0A=="
+ "version": "1.4.270",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz",
+ "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg=="
},
"node_modules/emittery": {
"version": "0.8.1",
@@ -7000,12 +7000,12 @@
}
},
"node_modules/eslint": {
- "version": "8.23.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz",
- "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==",
+ "version": "8.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
+ "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
"dependencies": {
"@eslint/eslintrc": "^1.3.2",
- "@humanwhocodes/config-array": "^0.10.4",
+ "@humanwhocodes/config-array": "^0.10.5",
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
"@humanwhocodes/module-importer": "^1.0.1",
"ajv": "^6.10.0",
@@ -9110,9 +9110,9 @@
}
},
"node_modules/is-callable": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz",
- "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q==",
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"engines": {
"node": ">= 0.4"
},
@@ -11055,9 +11055,9 @@
}
},
"node_modules/jest-watch-typeahead/node_modules/@types/yargs": {
- "version": "17.0.12",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz",
- "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==",
+ "version": "17.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
+ "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
"dependencies": {
"@types/yargs-parser": "*"
}
@@ -11430,9 +11430,9 @@
}
},
"node_modules/js-sdsl": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
- "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+ "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
},
"node_modules/js-tokens": {
"version": "4.0.0",
@@ -12853,9 +12853,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.16",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
- "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
+ "version": "8.4.17",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz",
+ "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==",
"funding": [
{
"type": "opencollective",
@@ -17595,25 +17595,25 @@
}
},
"@babel/compat-data": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz",
- "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg=="
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz",
+ "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw=="
},
"@babel/core": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz",
- "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz",
+ "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==",
"requires": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
- "@babel/helper-compilation-targets": "^7.19.1",
+ "@babel/generator": "^7.19.3",
+ "@babel/helper-compilation-targets": "^7.19.3",
"@babel/helper-module-transforms": "^7.19.0",
"@babel/helpers": "^7.19.0",
- "@babel/parser": "^7.19.1",
+ "@babel/parser": "^7.19.3",
"@babel/template": "^7.18.10",
- "@babel/traverse": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/traverse": "^7.19.3",
+ "@babel/types": "^7.19.3",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -17639,11 +17639,11 @@
}
},
"@babel/generator": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz",
- "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz",
+ "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==",
"requires": {
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.19.3",
"@jridgewell/gen-mapping": "^0.3.2",
"jsesc": "^2.5.1"
},
@@ -17678,11 +17678,11 @@
}
},
"@babel/helper-compilation-targets": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz",
- "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz",
+ "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==",
"requires": {
- "@babel/compat-data": "^7.19.1",
+ "@babel/compat-data": "^7.19.3",
"@babel/helper-validator-option": "^7.18.6",
"browserslist": "^4.21.3",
"semver": "^6.3.0"
@@ -17892,9 +17892,9 @@
}
},
"@babel/parser": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz",
- "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A=="
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz",
+ "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6",
@@ -17945,9 +17945,9 @@
}
},
"@babel/plugin-proposal-decorators": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.1.tgz",
- "integrity": "sha512-LfIKNBBY7Q1OX5C4xAgRQffOg2OnhAo9fnbcOHgOC9Yytm2Sw+4XqHufRYU86tHomzepxtvuVaNO+3EVKR4ivw==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.19.3.tgz",
+ "integrity": "sha512-MbgXtNXqo7RTKYIXVchVJGPvaVufQH3pxvQyfbGvNw1DObIhph+PesYXJTcd8J4DdWibvf6Z2eanOyItX8WnJg==",
"requires": {
"@babel/helper-create-class-features-plugin": "^7.19.0",
"@babel/helper-plugin-utils": "^7.19.0",
@@ -18574,9 +18574,9 @@
}
},
"@babel/plugin-transform-typescript": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz",
- "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz",
+ "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==",
"requires": {
"@babel/helper-create-class-features-plugin": "^7.19.0",
"@babel/helper-plugin-utils": "^7.19.0",
@@ -18601,12 +18601,12 @@
}
},
"@babel/preset-env": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz",
- "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.3.tgz",
+ "integrity": "sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==",
"requires": {
- "@babel/compat-data": "^7.19.1",
- "@babel/helper-compilation-targets": "^7.19.1",
+ "@babel/compat-data": "^7.19.3",
+ "@babel/helper-compilation-targets": "^7.19.3",
"@babel/helper-plugin-utils": "^7.19.0",
"@babel/helper-validator-option": "^7.18.6",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
@@ -18674,7 +18674,7 @@
"@babel/plugin-transform-unicode-escapes": "^7.18.10",
"@babel/plugin-transform-unicode-regex": "^7.18.6",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.19.0",
+ "@babel/types": "^7.19.3",
"babel-plugin-polyfill-corejs2": "^0.3.3",
"babel-plugin-polyfill-corejs3": "^0.6.0",
"babel-plugin-polyfill-regenerator": "^0.4.1",
@@ -18745,29 +18745,29 @@
}
},
"@babel/traverse": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz",
- "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz",
+ "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==",
"requires": {
"@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.19.0",
+ "@babel/generator": "^7.19.3",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.19.1",
- "@babel/types": "^7.19.0",
+ "@babel/parser": "^7.19.3",
+ "@babel/types": "^7.19.3",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz",
- "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==",
+ "version": "7.19.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz",
+ "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==",
"requires": {
"@babel/helper-string-parser": "^7.18.10",
- "@babel/helper-validator-identifier": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
@@ -19062,9 +19062,9 @@
}
},
"@humanwhocodes/config-array": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz",
- "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==",
+ "version": "0.10.7",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+ "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
"requires": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
@@ -19877,9 +19877,9 @@
"integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg=="
},
"@sinclair/typebox": {
- "version": "0.24.42",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.42.tgz",
- "integrity": "sha512-d+2AtrHGyWek2u2ITF0lHRIv6Tt7X0dEHW+0rP+5aDCEjC3fiN2RBjrLD0yU0at52BcZbRGxLbAtXiR0hFCjYw=="
+ "version": "0.24.44",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.44.tgz",
+ "integrity": "sha512-ka0W0KN5i6LfrSocduwliMMpqVgohtPFidKdMEOUjoOFCHcOOYkKsPRxfs5f15oPNHTm6ERAm0GV/+/LTKeiWg=="
},
"@sinonjs/commons": {
"version": "1.8.3",
@@ -20080,9 +20080,9 @@
}
},
"@types/babel__traverse": {
- "version": "7.18.1",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.1.tgz",
- "integrity": "sha512-FSdLaZh2UxaMuLp9lixWaHq/golWTRWOnRsAXzDTDSDOQLuZb1nsdCt6pJSPWSEQt2eFZ2YVk3oYhn+1kLMeMA==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
+ "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
"requires": {
"@babel/types": "^7.3.0"
}
@@ -20243,9 +20243,9 @@
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
},
"@types/prettier": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz",
- "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A=="
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
+ "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow=="
},
"@types/prop-types": {
"version": "15.7.5",
@@ -20395,13 +20395,13 @@
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
},
"@typescript-eslint/eslint-plugin": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz",
- "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.1.tgz",
+ "integrity": "sha512-ky7EFzPhqz3XlhS7vPOoMDaQnQMn+9o5ICR9CPr/6bw8HrFkzhMSxuA3gRfiJVvs7geYrSeawGJjZoZQKCOglQ==",
"requires": {
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/type-utils": "5.38.0",
- "@typescript-eslint/utils": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/type-utils": "5.38.1",
+ "@typescript-eslint/utils": "5.38.1",
"debug": "^4.3.4",
"ignore": "^5.2.0",
"regexpp": "^3.2.0",
@@ -20420,56 +20420,56 @@
}
},
"@typescript-eslint/experimental-utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.38.0.tgz",
- "integrity": "sha512-kzXBRfvGlicgGk4CYuRUqKvwc2s3wHXNssUWWJU18bhMRxriFm3BZWyQ6vEHBRpEIMKB6b7MIQHO+9lYlts19w==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.38.1.tgz",
+ "integrity": "sha512-Zv0EcU0iu64DiVG3pRZU0QYCgANO//U1fS3oEs3eqHD1eIVVcQsFd/T01ckaNbL2H2aCqRojY2xZuMAPcOArEA==",
"requires": {
- "@typescript-eslint/utils": "5.38.0"
+ "@typescript-eslint/utils": "5.38.1"
}
},
"@typescript-eslint/parser": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz",
- "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.1.tgz",
+ "integrity": "sha512-LDqxZBVFFQnQRz9rUZJhLmox+Ep5kdUmLatLQnCRR6523YV+XhRjfYzStQ4MheFA8kMAfUlclHSbu+RKdRwQKw==",
"requires": {
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/typescript-estree": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/typescript-estree": "5.38.1",
"debug": "^4.3.4"
}
},
"@typescript-eslint/scope-manager": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz",
- "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.1.tgz",
+ "integrity": "sha512-BfRDq5RidVU3RbqApKmS7RFMtkyWMM50qWnDAkKgQiezRtLKsoyRKIvz1Ok5ilRWeD9IuHvaidaLxvGx/2eqTQ==",
"requires": {
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/visitor-keys": "5.38.0"
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/visitor-keys": "5.38.1"
}
},
"@typescript-eslint/type-utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz",
- "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.1.tgz",
+ "integrity": "sha512-UU3j43TM66gYtzo15ivK2ZFoDFKKP0k03MItzLdq0zV92CeGCXRfXlfQX5ILdd4/DSpHkSjIgLLLh1NtkOJOAw==",
"requires": {
- "@typescript-eslint/typescript-estree": "5.38.0",
- "@typescript-eslint/utils": "5.38.0",
+ "@typescript-eslint/typescript-estree": "5.38.1",
+ "@typescript-eslint/utils": "5.38.1",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
}
},
"@typescript-eslint/types": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz",
- "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA=="
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.1.tgz",
+ "integrity": "sha512-QTW1iHq1Tffp9lNfbfPm4WJabbvpyaehQ0SrvVK2yfV79SytD9XDVxqiPvdrv2LK7DGSFo91TB2FgWanbJAZXg=="
},
"@typescript-eslint/typescript-estree": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz",
- "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.1.tgz",
+ "integrity": "sha512-99b5e/Enoe8fKMLdSuwrfH/C0EIbpUWmeEKHmQlGZb8msY33qn1KlkFww0z26o5Omx7EVjzVDCWEfrfCDHfE7g==",
"requires": {
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/visitor-keys": "5.38.0",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/visitor-keys": "5.38.1",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -20488,14 +20488,14 @@
}
},
"@typescript-eslint/utils": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz",
- "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.1.tgz",
+ "integrity": "sha512-oIuUiVxPBsndrN81oP8tXnFa/+EcZ03qLqPDfSZ5xIJVm7A9V0rlkQwwBOAGtrdN70ZKDlKv+l1BeT4eSFxwXA==",
"requires": {
"@types/json-schema": "^7.0.9",
- "@typescript-eslint/scope-manager": "5.38.0",
- "@typescript-eslint/types": "5.38.0",
- "@typescript-eslint/typescript-estree": "5.38.0",
+ "@typescript-eslint/scope-manager": "5.38.1",
+ "@typescript-eslint/types": "5.38.1",
+ "@typescript-eslint/typescript-estree": "5.38.1",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0"
},
@@ -20517,11 +20517,11 @@
}
},
"@typescript-eslint/visitor-keys": {
- "version": "5.38.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz",
- "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==",
+ "version": "5.38.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.1.tgz",
+ "integrity": "sha512-bSHr1rRxXt54+j2n4k54p4fj8AHJ49VDWtjpImOpzQj4qjAiOpPni+V1Tyajh19Api1i844F757cur8wH3YvOA==",
"requires": {
- "@typescript-eslint/types": "5.38.0",
+ "@typescript-eslint/types": "5.38.1",
"eslint-visitor-keys": "^3.3.0"
}
},
@@ -21399,9 +21399,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001410",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz",
- "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ=="
+ "version": "1.0.30001414",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz",
+ "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg=="
},
"case-sensitive-paths-webpack-plugin": {
"version": "2.4.0",
@@ -21657,22 +21657,22 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"core-js": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.2.tgz",
- "integrity": "sha512-YB4IAT1bjEfxTJ1XYy11hJAKskO+qmhuDBM8/guIfMz4JvdsAQAqvyb97zXX7JgSrfPLG5mRGFWJwJD39ruq2A=="
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.3.tgz",
+ "integrity": "sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ=="
},
"core-js-compat": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.2.tgz",
- "integrity": "sha512-TxfyECD4smdn3/CjWxczVtJqVLEEC2up7/82t7vC0AzNogr+4nQ8vyF7abxAuTXWvjTClSbvGhU0RgqA4ToQaQ==",
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.3.tgz",
+ "integrity": "sha512-xVtYpJQ5grszDHEUU9O7XbjjcZ0ccX3LgQsyqSvTnjX97ZqEgn9F5srmrwwwMtbKzDllyFPL+O+2OFMl1lU4TQ==",
"requires": {
"browserslist": "^4.21.4"
}
},
"core-js-pure": {
- "version": "3.25.2",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.2.tgz",
- "integrity": "sha512-ItD7YpW1cUB4jaqFLZXe1AXkyqIxz6GqPnsDV4uF4hVcWh/WAGIqSqw5p0/WdsILM0Xht9s3Koyw05R3K6RtiA=="
+ "version": "3.25.3",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.3.tgz",
+ "integrity": "sha512-T/7qvgv70MEvRkZ8p6BasLZmOVYKzOaWNBEHAU8FmveCJkl4nko2quqPQOmy6AJIp5MBanhz9no3A94NoRb0XA=="
},
"core-util-is": {
"version": "1.0.3",
@@ -22255,9 +22255,9 @@
}
},
"electron-to-chromium": {
- "version": "1.4.258",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.258.tgz",
- "integrity": "sha512-vutF4q0dTUXoAFI7Vbtdwen/BJVwPgj8GRg/SElOodfH7VTX+svUe62A5BG41QRQGk5HsZPB0M++KH1lAlOt0A=="
+ "version": "1.4.270",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz",
+ "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg=="
},
"emittery": {
"version": "0.8.1",
@@ -22439,12 +22439,12 @@
}
},
"eslint": {
- "version": "8.23.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz",
- "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==",
+ "version": "8.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
+ "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
"requires": {
"@eslint/eslintrc": "^1.3.2",
- "@humanwhocodes/config-array": "^0.10.4",
+ "@humanwhocodes/config-array": "^0.10.5",
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
"@humanwhocodes/module-importer": "^1.0.1",
"ajv": "^6.10.0",
@@ -23950,9 +23950,9 @@
}
},
"is-callable": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.6.tgz",
- "integrity": "sha512-krO72EO2NptOGAX2KYyqbP9vYMlNAXdB53rq6f8LXY6RY7JdSR/3BD6wLUlPHSAesmY9vstNrjvqGaCiRK/91Q=="
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
},
"is-core-module": {
"version": "2.10.0",
@@ -25343,9 +25343,9 @@
}
},
"@types/yargs": {
- "version": "17.0.12",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.12.tgz",
- "integrity": "sha512-Nz4MPhecOFArtm81gFQvQqdV7XYCrWKx5uUt6GNHredFHn1i2mtWqXTON7EPXMtNi1qjtjEM/VCHDhcHsAMLXQ==",
+ "version": "17.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
+ "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
"requires": {
"@types/yargs-parser": "*"
}
@@ -25614,9 +25614,9 @@
}
},
"js-sdsl": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
- "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw=="
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+ "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
},
"js-tokens": {
"version": "4.0.0",
@@ -26649,9 +26649,9 @@
}
},
"postcss": {
- "version": "8.4.16",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
- "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
+ "version": "8.4.17",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz",
+ "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==",
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 8d28c4940..76247ae22 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -179,7 +179,7 @@ const de: Translation = {
PLATFORM: 'Platform (Platform / SDK)',
UPTIME: 'System Betriebszeit',
CPU_FREQ: 'CPU Frequenz',
- HEAP: 'RAM Speicher (Frei / Max Belegt)',
+ HEAP: 'RAM freier Speicher (Gesamt / max. Block)',
PSRAM: 'PSRAM (Größe / Frei)',
FLASH: 'Flash Speicher (Größe / Geschwindigkeit)',
APPSIZE: 'Programm (Genutzt / Frei)',
@@ -263,7 +263,7 @@ const de: Translation = {
GUEST: 'Gast',
NEW: 'Neuer',
RENAME: 'Ändere',
- ENTITY: 'Einheit'
+ ENTITY: 'Entität'
};
export default de;
diff --git a/interface/src/i18n/i18n-types.ts b/interface/src/i18n/i18n-types.ts
index 9417632e0..3100b6a1a 100644
--- a/interface/src/i18n/i18n-types.ts
+++ b/interface/src/i18n/i18n-types.ts
@@ -19,1030 +19,1030 @@ export type Translations = RootTranslation
type RootTranslation = {
/**
- * Language
+ * Language
*/
LANGUAGE: string
/**
- * Retry
+ * Retry
*/
RETRY: string
/**
- * Loading
+ * Loading
*/
LOADING: string
/**
- * is required
+ * is required
*/
IS_REQUIRED: string
/**
- * Sign In
+ * Sign In
*/
SIGN_IN: string
/**
- * Sign Out
+ * Sign Out
*/
SIGN_OUT: string
/**
- * Username
+ * Username
*/
USERNAME: string
/**
- * Password
+ * Password
*/
PASSWORD: string
/**
- * Dashboard
+ * Dashboard
*/
DASHBOARD: string
/**
- * Settings
+ * Settings
*/
SETTINGS: string
/**
- * saved
+ * saved
*/
SAVED: string
/**
- * Help
+ * Help
*/
HELP: string
/**
- * Logged in as {name}
+ * Logged in as {name}
* @param {unknown} name
*/
LOGGED_IN: RequiredParams<'name'>
/**
- * Please sign in to continue
+ * Please sign in to continue
*/
PLEASE_SIGNIN: string
/**
- * Upload successful
+ * Upload successful
*/
UPLOAD_SUCCESSFUL: string
/**
- * Download successful
+ * Download successful
*/
DOWNLOAD_SUCCESSFUL: string
/**
- * Invalid login details
+ * Invalid login details
*/
INVALID_LOGIN: string
/**
- * Network
+ * Network
*/
NETWORK: string
/**
- * Security
+ * Security
*/
SECURITY: string
/**
- * ON/OFF
+ * ON/OFF
*/
ONOFF_CAP: string
/**
- * on/off
+ * on/off
*/
ONOFF: string
/**
- * Type
+ * Type
*/
TYPE: string
/**
- * Description
+ * Description
*/
DESCRIPTION: string
/**
- * Entities
+ * Entities
*/
ENTITIES: string
/**
- * Refresh
+ * Refresh
*/
REFRESH: string
/**
- * Export
+ * Export
*/
EXPORT: string
/**
- * Device Details
+ * Device Details
*/
DEVICE_DETAILS: string
/**
- * Brand
+ * Brand
*/
BRAND: string
/**
- * Entity Name
+ * Entity Name
*/
ENTITY_NAME: string
/**
- * Value
+ * Value
*/
VALUE: string
/**
- * only show favorites
+ * only show favorites
*/
SHOW_FAV: string
/**
- * Device and Sensor Data
+ * Device and Sensor Data
*/
DEVICE_SENSOR_DATA: string
/**
- * Devices & Sensors
+ * Devices & Sensors
*/
DEVICES_SENSORS: string
/**
- * Attached EMS-ESP Sensors
+ * Attached EMS-ESP Sensors
*/
ATTACHED_SENSORS: string
/**
- * Call Command
+ * Call Command
*/
RUN_COMMAND: string
/**
- * Change Value
+ * Change Value
*/
CHANGE_VALUE: string
/**
- * Cancel
+ * Cancel
*/
CANCEL: string
/**
- * Reset
+ * Reset
*/
RESET: string
/**
- * Send
+ * Send
*/
SEND: string
/**
- * Save
+ * Save
*/
SAVE: string
/**
- * Remove
+ * Remove
*/
REMOVE: string
/**
- * Problem updating
+ * Problem updating
*/
PROBLEM_UPDATING: string
/**
- * Problem loading
+ * Problem loading
*/
PROBLEM_LOADING: string
/**
- * Access Denied
+ * Access Denied
*/
ACCESS_DENIED: string
/**
- * Analog Sensor
+ * Analog Sensor
*/
ANALOG_SENSOR: string
/**
- * Analog Sensors
+ * Analog Sensors
*/
ANALOG_SENSORS: string
/**
- * Updated
+ * Updated
*/
UPDATED: string
/**
- * Update
+ * Update
*/
UPDATE: string
/**
- * Removed
+ * Removed
*/
REMOVED: string
/**
- * Deletion
+ * Deletion
*/
DELETION: string
/**
- * Offset
+ * Offset
*/
OFFSET: string
/**
- * Factor
+ * Factor
*/
FACTOR: string
/**
- * Frequency
+ * Frequency
*/
FREQ: string
/**
- * Start value
+ * Start value
*/
STARTVALUE: string
/**
- * Warning: be careful when assigning a GPIO!
+ * Warning: be careful when assigning a GPIO!
*/
WARN_GPIO: string
/**
- * Edit
+ * Edit
*/
EDIT: string
/**
- * Temperature Sensor
+ * Temperature Sensor
*/
TEMP_SENSOR: string
/**
- * Temperature Sensors
+ * Temperature Sensors
*/
TEMP_SENSORS: string
/**
- * Write command {cmd}
+ * Write command {cmd}
* @param {unknown} cmd
*/
WRITE_COMMAND: RequiredParams<'cmd'>
/**
- * EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile
+ * EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile
*/
EMS_BUS_WARNING: string
/**
- * Scanning for EMS devices...
+ * Scanning for EMS devices...
*/
EMS_BUS_SCANNING: string
/**
- * Connected
+ * Connected
*/
CONNECTED: string
/**
- * Tx issues - try a different Tx Mode
+ * Tx issues - try a different Tx Mode
*/
TX_ISSUES: string
/**
- * Disconnected
+ * Disconnected
*/
DISCONNECTED: string
/**
- * Are you sure you want to initiate a full device scan of the EMS bus?
+ * Are you sure you want to initiate a full device scan of the EMS bus?
*/
EMS_SCAN: string
/**
- * EMS Bus Status
+ * EMS Bus Status
*/
EMS_BUS_STATUS: string
/**
- * Active Devices & Sensors
+ * Active Devices & Sensors
*/
ACTIVE_DEVICES: string
/**
- * Device
+ * Device
*/
DEVICE: string
/**
- * SUCCESS
+ * SUCCESS
*/
SUCCESS: string
/**
- * FAIL
+ * FAIL
*/
FAIL: string
/**
- * QUALITY
+ * QUALITY
*/
QUALITY: string
/**
- * Scan for new devices
+ * Scan for new devices
*/
SCAN_DEVICES: string
/**
- * EMS Bus & Activity Status
+ * EMS Bus & Activity Status
*/
EMS_BUS_STATUS_TITLE: string
/**
- * Scan
+ * Scan
*/
SCAN: string
STATUS_NAMES: {
/**
- * EMS Telegrams Received (Rx)
+ * EMS Telegrams Received (Rx)
*/
'0': string
/**
- * EMS Reads (Tx)
+ * EMS Reads (Tx)
*/
'1': string
/**
- * EMS Writes (Tx)
+ * EMS Writes (Tx)
*/
'2': string
/**
- * Temperature Sensor Reads
+ * Temperature Sensor Reads
*/
'3': string
/**
- * Analog Sensor Reads
+ * Analog Sensor Reads
*/
'4': string
/**
- * MQTT Publishes
+ * MQTT Publishes
*/
'5': string
/**
- * API Calls
+ * API Calls
*/
'6': string
/**
- * Syslog Messages
+ * Syslog Messages
*/
'7': string
}
/**
- * {num} Device{{s}}
+ * {num} Device{{s}}
* @param {string | number | boolean} num
*/
NUM_DEVICES: RequiredParams<'num'>
/**
- * {num} Temperature Sensor{{s}}
+ * {num} Temperature Sensor{{s}}
* @param {string | number | boolean} num
*/
NUM_TEMP_SENSORS: RequiredParams<'num'>
/**
- * {num} Analog Sensor{{s}}
+ * {num} Analog Sensor{{s}}
* @param {string | number | boolean} num
*/
NUM_ANALOG_SENSORS: RequiredParams<'num'>
/**
- * {num} Day{{s}}
+ * {num} Day{{s}}
* @param {string | number | boolean} num
*/
NUM_DAYS: RequiredParams<'num'>
/**
- * {num} Second{{s}}
+ * {num} Second{{s}}
* @param {string | number | boolean} num
*/
NUM_SECONDS: RequiredParams<'num'>
/**
- * {num} Hour{{s}}
+ * {num} Hour{{s}}
* @param {string | number | boolean} num
*/
NUM_HOURS: RequiredParams<'num'>
/**
- * {num} Minute{{s}}
+ * {num} Minute{{s}}
* @param {string | number | boolean} num
*/
NUM_MINUTES: RequiredParams<'num'>
/**
- * Application Settings
+ * Application Settings
*/
APPLICATION_SETTINGS: string
/**
- * Customization
+ * Customization
*/
CUSTOMIZATION: string
/**
- * EMS-ESP is restarting
+ * EMS-ESP is restarting
*/
APPLICATION_RESTARTING: string
/**
- * Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings
+ * Select a pre-configured interface board profile from the list below or choose Custom to configure your own hardware settings
*/
BOARD_PROFILE_TEXT: string
/**
- * Board Profile
+ * Board Profile
*/
BOARD_PROFILE: string
/**
- * Button
+ * Button
*/
BUTTON: string
/**
- * Temperature
+ * Temperature
*/
TEMPERATURE: string
/**
- * disabled
+ * disabled
*/
DISABLED: string
/**
- * General Options
+ * General Options
*/
GENERAL_OPTIONS: string
/**
- * Language (for device entities)
+ * Language (for device entities)
*/
LANGUAGE_ENTITIES: string
/**
- * Hide LED
+ * Hide LED
*/
HIDE_LED: string
/**
- * Enable Telnet Console
+ * Enable Telnet Console
*/
ENABLE_TELNET: string
/**
- * Enable Analog Sensors
+ * Enable Analog Sensors
*/
ENABLE_ANALOG: string
/**
- * Convert temperature values to Fahrenheit
+ * Convert temperature values to Fahrenheit
*/
CONVERT_FAHRENHEIT: string
/**
- * Bypass Access Token authorization on API calls
+ * Bypass Access Token authorization on API calls
*/
BYPASS_TOKEN: string
/**
- * Enable read-only mode (blocks all outgoing EMS Tx Write commands)
+ * Enable read-only mode (blocks all outgoing EMS Tx Write commands)
*/
READONLY: string
/**
- * Underclock CPU speed
+ * Underclock CPU speed
*/
UNDERCLOCK_CPU: string
/**
- * Enable Shower Timer
+ * Enable Shower Timer
*/
ENABLE_SHOWER_TIMER: string
/**
- * Enable Shower Alert
+ * Enable Shower Alert
*/
ENABLE_SHOWER_ALERT: string
/**
- * Trigger Time
+ * Trigger Time
*/
TRIGGER_TIME: string
/**
- * Cold Shot Duration
+ * Cold Shot Duration
*/
COLD_SHOT_DURATION: string
/**
- * Formatting Options
+ * Formatting Options
*/
FORMATTING_OPTIONS: string
/**
- * Boolean Format Dashboard
+ * Boolean Format Dashboard
*/
BOOLEAN_FORMAT_DASHBOARD: string
/**
- * Boolean Format API/MQTT
+ * Boolean Format API/MQTT
*/
BOOLEAN_FORMAT_API: string
/**
- * Enum Format API/MQTT
+ * Enum Format API/MQTT
*/
ENUM_FORMAT: string
/**
- * Index
+ * Index
*/
INDEX: string
/**
- * Enable parasite power
+ * Enable parasite power
*/
ENABLE_PARASITE: string
/**
- * Logging
+ * Logging
*/
LOGGING: string
/**
- * Log EMS telegrams in hexadecimal
+ * Log EMS telegrams in hexadecimal
*/
LOG_HEX: string
/**
- * Enable Syslog
+ * Enable Syslog
*/
ENABLE_SYSLOG: string
/**
- * Mark Interval
+ * Mark Interval
*/
MARK_INTERVAL: string
/**
- * seconds
+ * seconds
*/
SECONDS: string
/**
- * minutes
+ * minutes
*/
MINUTES: string
/**
- * Restart
+ * Restart
*/
RESTART: string
/**
- * hours
+ * hours
*/
HOURS: string
/**
- * EMS-ESP needs to be restarted to apply changed system settings
+ * EMS-ESP needs to be restarted to apply changed system settings
*/
RESTART_TEXT: string
/**
- * Are you sure you want to restart EMS-ESP?
+ * Are you sure you want to restart EMS-ESP?
*/
RESTART_CONFIRM: string
/**
- * Command
+ * Command
*/
COMMAND: string
/**
- * All customizations have been removed. Restarting...
+ * All customizations have been removed. Restarting...
*/
CUSTOMIZATIONS_RESTART: string
/**
- * Selected entities exceeded limit. Please save in batches
+ * Selected entities exceeded limit. Please save in batches
*/
CUSTOMIZATIONS_FULL: string
/**
- * Customizations saved
+ * Customizations saved
*/
CUSTOMIZATIONS_SAVED: string
/**
- * Select a device and customize the entities options or click to rename
+ * Select a device and customize the entities options or click to rename
*/
CUSTOMIZATIONS_HELP_1: string
/**
- * mark as favorite
+ * mark as favorite
*/
CUSTOMIZATIONS_HELP_2: string
/**
- * disable write action
+ * disable write action
*/
CUSTOMIZATIONS_HELP_3: string
/**
- * exclude from MQTT and API
+ * exclude from MQTT and API
*/
CUSTOMIZATIONS_HELP_4: string
/**
- * hide from Dashboard
+ * hide from Dashboard
*/
CUSTOMIZATIONS_HELP_5: string
/**
- * Select a device
+ * Select a device
*/
SELECT_DEVICE: string
/**
- * set all
+ * set all
*/
SET_ALL: string
/**
- * Options
+ * Options
*/
OPTIONS: string
/**
- * Name
+ * Name
*/
NAME: string
/**
- * Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?
+ * Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?
*/
CUSTOMIZATIONS_RESET: string
/**
- * Device Entities
+ * Device Entities
*/
DEVICE_ENTITIES: string
/**
- * User Customization
+ * User Customization
*/
USER_CUSTOMIZATION: string
/**
- * Support Information
+ * Support Information
*/
SUPPORT_INFORMATION: string
/**
- * Click Here
+ * Click Here
*/
CLICK_HERE: string
/**
- * Visit the online wiki to get instructions on how to configure EMS-ESP
+ * Visit the online wiki to get instructions on how to configure EMS-ESP
*/
HELP_INFORMATION_1: string
/**
- * For live community chat join our Discord server
+ * For live community chat join our Discord server
*/
HELP_INFORMATION_2: string
/**
- * To request a feature or report a bug
+ * To request a feature or report a bug
*/
HELP_INFORMATION_3: string
/**
- * remember to download and attach your system information for a faster response when reporting an issue
+ * remember to download and attach your system information for a faster response when reporting an issue
*/
HELP_INFORMATION_4: string
/**
- * EMS-ESP is a free and open-source project. Please support its future development by giving it a star on Github!
+ * EMS-ESP is a free and open-source project. Please support its future development by giving it a star on Github!
*/
HELP_INFORMATION_5: string
/**
- * Support Info
+ * Support Info
*/
SUPPORT_INFO: string
/**
- * Upload
+ * Upload
*/
UPLOAD: string
/**
- * Download
+ * Download
*/
DOWNLOAD: string
/**
- * aborted
+ * aborted
*/
ABORTED: string
/**
- * failed
+ * failed
*/
FAILED: string
/**
- * successful
+ * successful
*/
SUCCESSFUL: string
/**
- * System
+ * System
*/
SYSTEM: string
/**
- * Log
+ * Log
*/
LOG: string
/**
- * Status
+ * Status
*/
STATUS: string
/**
- * Upload/Download
+ * Upload/Download
*/
UPLOAD_DOWNLOAD: string
/**
- * You are currently running version
+ * You are currently running version
*/
SYSTEM_VERSION_RUNNING: string
/**
- * to apply the new firmware
+ * to apply the new firmware
*/
SYSTEM_APPLY_FIRMWARE: string
/**
- * Close
+ * Close
*/
CLOSE: string
/**
- * Use
+ * Use
*/
USE: string
/**
- * Factory Reset
+ * Factory Reset
*/
FACTORY_RESET: string
/**
- * Device has been factory reset and will now restart
+ * Device has been factory reset and will now restart
*/
SYSTEM_FACTORY_TEXT: string
/**
- * Are you sure you want to reset the device to its factory defaults?
+ * Are you sure you want to reset the device to its factory defaults?
*/
SYSTEM_FACTORY_TEXT_DIALOG: string
/**
- * Version Check
+ * Version Check
*/
VERSION_CHECK: string
/**
- * The latest
+ * The latest
*/
THE_LATEST: string
/**
- * version is
+ * version is
*/
VERSION_IS: string
/**
- * Device (Platform / SDK)
+ * Device (Platform / SDK)
*/
PLATFORM: string
/**
- * System Uptime
+ * System Uptime
*/
UPTIME: string
/**
- * CPU Frequency
+ * CPU Frequency
*/
CPU_FREQ: string
/**
- * Heap (Free / Max Alloc)
+ * Heap (Free / Max Alloc)
*/
HEAP: string
/**
- * PSRAM (Size / Free)
+ * PSRAM (Size / Free)
*/
PSRAM: string
/**
- * Flash Chip (Size / Speed)
+ * Flash Chip (Size / Speed)
*/
FLASH: string
/**
- * Application (Used / Free)
+ * Application (Used / Free)
*/
APPSIZE: string
/**
- * File System (Used / Free)
+ * File System (Used / Free)
*/
FILESYSTEM: string
/**
- * Buffer Size
+ * Buffer Size
*/
BUFFER_SIZE: string
/**
- * Compact
+ * Compact
*/
COMPACT: string
/**
- * Enable OTA Updates
+ * Enable OTA Updates
*/
ENABLE_OTA: string
/**
- * Download the entity customizations
+ * Download the entity customizations
*/
DOWNLOAD_CUSTOMIZATION_TEXT: string
/**
- * Download the application settings. Be careful when sharing your settings as this file contains passwords and other sensitive system information
+ * Download the application settings. Be careful when sharing your settings as this file contains passwords and other sensitive system information
*/
DOWNLOAD_SETTINGS_TEXT: string
/**
- * Upload a new firmware (.bin) file, settings or customizations (.json) file below
+ * Upload a new firmware (.bin) file, settings or customizations (.json) file below
*/
UPLOAD_TEXT: string
/**
- * Uploading
+ * Uploading
*/
UPLOADING: string
/**
- * Drop file or click here
+ * Drop file or click here
*/
UPLOAD_DROP_TEXT: string
/**
- * Unexpected Error, please try again
+ * Unexpected Error, please try again
*/
ERROR: string
/**
- * Time set
+ * Time set
*/
TIME_SET: string
/**
- * Manage Users
+ * Manage Users
*/
MANAGE_USERS: string
/**
- * is Admin
+ * is Admin
*/
IS_ADMIN: string
/**
- * You must have at least one admin user configured
+ * You must have at least one admin user configured
*/
USER_WARNING: string
/**
- * Add
+ * Add
*/
ADD: string
/**
- * Access Token for
+ * Access Token for
*/
ACCESS_TOKEN_FOR: string
/**
- * The token below is used with REST API calls that require authorization. It can be passed either as a Bearer token in the Authorization header or in the access_token URL query parameter.
+ * The token below is used with REST API calls that require authorization. It can be passed either as a Bearer token in the Authorization header or in the access_token URL query parameter.
*/
ACCESS_TOKEN_TEXT: string
/**
- * Generating token
+ * Generating token
*/
GENERATING_TOKEN: string
/**
- * User
+ * User
*/
USER: string
/**
- * Modify
+ * Modify
*/
MODIFY: string
/**
- * The su (super user) password is used to sign authentication tokens and also enable admin privileges within the Console.
+ * The su (super user) password is used to sign authentication tokens and also enable admin privileges within the Console.
*/
SU_TEXT: string
/**
- * Not enabled
+ * Not enabled
*/
NOT_ENABLED: string
/**
- * Errors
+ * Errors
*/
ERRORS: string
/**
- * Disconnect Reason
+ * Disconnect Reason
*/
DISCONNECT_REASON: string
/**
- * Enable MQTT
+ * Enable MQTT
*/
ENABLE_MQTT: string
/**
- * Optional
+ * Optional
*/
OPTIONAL: string
/**
- * Formatting
+ * Formatting
*/
FORMATTING: string
/**
- * Format
+ * Format
*/
FORMAT: string
/**
- * Nested in a single topic
+ * Nested in a single topic
*/
MQTT_NEST_1: string
/**
- * As individual topics
+ * As individual topics
*/
MQTT_NEST_2: string
/**
- * Publish command output to a `response` topic
+ * Publish command output to a `response` topic
*/
MQTT_RESPONSE: string
/**
- * Publish single value topics on change
+ * Publish single value topics on change
*/
MQTT_PUBLISH_TEXT_1: string
/**
- * Publish to command topics (ioBroker)
+ * Publish to command topics (ioBroker)
*/
MQTT_PUBLISH_TEXT_2: string
/**
- * Enable MQTT Discovery (Home Assistant, Domoticz)
+ * Enable MQTT Discovery (Home Assistant, Domoticz)
*/
MQTT_PUBLISH_TEXT_3: string
/**
- * Prefix for the Discovery topics
+ * Prefix for the Discovery topics
*/
MQTT_PUBLISH_TEXT_4: string
/**
- * Publish Intervals
+ * Publish Intervals
*/
MQTT_PUBLISH_INTERVALS: string
/**
- * Boilers and Heat Pumps
+ * Boilers and Heat Pumps
*/
MQTT_INT_BOILER: string
/**
- * Thermostats
+ * Thermostats
*/
MQTT_INT_THERMOSTATS: string
/**
- * Solar Modules
+ * Solar Modules
*/
MQTT_INT_SOLAR: string
/**
- * Mixer Modules
+ * Mixer Modules
*/
MQTT_INT_MIXER: string
/**
- * Default
+ * Default
*/
DEFAULT: string
/**
- * Set Clean Session
+ * Set Clean Session
*/
MQTT_CLEAN_SESSION: string
/**
- * Always set Retain flag
+ * Always set Retain flag
*/
MQTT_RETAIN_FLAG: string
/**
- * Inactive
+ * Inactive
*/
INACTIVE: string
/**
- * Active
+ * Active
*/
ACTIVE: string
/**
- * Unknown
+ * Unknown
*/
UNKNOWN: string
/**
- * Set Time
+ * Set Time
*/
SET_TIME: string
/**
- * Enter local date and time below to set the time
+ * Enter local date and time below to set the time
*/
SET_TIME_TEXT: string
/**
- * Local Time
+ * Local Time
*/
LOCAL_TIME: string
/**
- * UTC Time
+ * UTC Time
*/
UTC_TIME: string
/**
- * Enable NTP
+ * Enable NTP
*/
ENABLE_NTP: string
/**
- * Time Zone
+ * Time Zone
*/
TIME_ZONE: string
/**
- * Access Point
+ * Access Point
*/
ACCESS_POINT: string
/**
- * Enable Access Point
+ * Enable Access Point
*/
AP_PROVIDE: string
/**
- * always
+ * always
*/
AP_PROVIDE_TEXT_1: string
/**
- * when WiFi is disconnected
+ * when WiFi is disconnected
*/
AP_PROVIDE_TEXT_2: string
/**
- * never
+ * never
*/
AP_PROVIDE_TEXT_3: string
/**
- * Preferred Channel
+ * Preferred Channel
*/
AP_PREFERRED_CHANNEL: string
/**
- * Hide SSID
+ * Hide SSID
*/
AP_HIDE_SSID: string
/**
- * Scan WiFi Networks
+ * Scan WiFi Networks
*/
NETWORK_SCAN: string
/**
- * Idle
+ * Idle
*/
IDLE: string
/**
- * Lost
+ * Lost
*/
LOST: string
/**
- * Scanning
+ * Scanning
*/
SCANNING: string
/**
- * Scan again
+ * Scan again
*/
SCAN_AGAIN: string
/**
- * Network Scanner
+ * Network Scanner
*/
NETWORK_SCANNER: string
/**
- * No WiFi networks found
+ * No WiFi networks found
*/
NETWORK_NO_WIFI: string
/**
- * leave blank to disable WiFi
+ * leave blank to disable WiFi
*/
NETWORK_BLANK_SSID: string
/**
- * Power
+ * Power
*/
POWER: string
/**
- * Disable WiFi Sleep Mode
+ * Disable WiFi Sleep Mode
*/
NETWORK_DISABLE_SLEEP: string
/**
- * Use Lower WiFi Bandwidth
+ * Use Lower WiFi Bandwidth
*/
NETWORK_LOW_BAND: string
/**
- * Enable mDNS Service
+ * Enable mDNS Service
*/
NETWORK_USE_DNS: string
/**
- * Enable IPv6 support
+ * Enable IPv6 support
*/
NETWORK_ENABLE_IPV6: string
/**
- * Use Fixed IP address
+ * Use Fixed IP address
*/
NETWORK_FIXED_IP: string
/**
- * Admin
+ * Admin
*/
ADMIN: string
/**
- * Guest
+ * Guest
*/
GUEST: string
/**
- * New
+ * New
*/
NEW: string
/**
- * Rename
+ * Rename
*/
RENAME: string
/**
- * Entity
+ * Entity
*/
ENTITY: string
}
diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx
index c2895e291..424e9f102 100644
--- a/interface/src/project/SettingsCustomization.tsx
+++ b/interface/src/project/SettingsCustomization.tsx
@@ -137,7 +137,7 @@ const SettingsCustomization: FC = () => {
}, [LL]);
const setInitialMask = (data: DeviceEntity[]) => {
- setDeviceEntities(data.map((de) => ({ ...de, o_m: de.m, o_cn: de.cn })));
+ setDeviceEntities(data.map((de) => ({ ...de, o_m: de.m, o_cn: de.cn, o_mi: de.mi, o_ma: de.ma })));
};
const fetchDeviceEntities = async (unique_id: number) => {
@@ -249,8 +249,16 @@ const SettingsCustomization: FC = () => {
const saveCustomization = async () => {
if (devices && deviceEntities && selectedDevice !== -1) {
const masked_entities = deviceEntities
- .filter((de) => de.m !== de.o_m || de.cn !== de.o_cn)
- .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.id + (new_de.cn ? '|' + new_de.cn : ''));
+ .filter((de) => de.m !== de.o_m || de.cn !== de.o_cn || de.ma !== de.o_ma || de.mi !== de.o_mi)
+ .map(
+ (new_de) =>
+ new_de.m.toString(16).padStart(2, '0') +
+ new_de.id +
+ (new_de.cn || new_de.mi || new_de.ma ? '|' : '') +
+ (new_de.cn ? new_de.cn : '') +
+ (new_de.mi ? '>' + new_de.mi : '') +
+ (new_de.ma ? '<' + new_de.ma : '')
+ );
// check size in bytes to match buffer in CPP, which is 4096
const bytes = new TextEncoder().encode(JSON.stringify(masked_entities)).length;
@@ -331,7 +339,7 @@ const SettingsCustomization: FC = () => {
setDeviceEntities((prevState) => {
const newState = prevState.map((obj) => {
if (obj.id === deviceEntity.id) {
- return { ...obj, cn: deviceEntity.cn };
+ return { ...obj, cn: deviceEntity.cn, mi: deviceEntity.mi, ma: deviceEntity.ma };
}
return obj;
});
@@ -627,6 +635,28 @@ const SettingsCustomization: FC = () => {
onChange={updateValue(setDeviceEntity)}
/>
+ {typeof de.v === 'number' && de.w && (
+ <>
+
+
+
+
+
+
+ >
+ )}
diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts
index 7cac14bd7..5241cb315 100644
--- a/interface/src/project/types.ts
+++ b/interface/src/project/types.ts
@@ -142,6 +142,10 @@ export interface DeviceEntity {
o_m?: number; // original mask before edits
o_cn?: string; // original cn before edits
w: boolean; // writeable
+ mi?: string; // min value
+ ma?: string; // max value
+ o_mi?: string;
+ o_ma?: string;
}
export interface CustomEntities {
diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp
index 13f6c8ed6..e35571d5f 100644
--- a/src/devices/boiler.cpp
+++ b/src/devices/boiler.cpp
@@ -29,11 +29,11 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
// alternative heatsource special messages
if (device_id == EMSdevice::EMS_DEVICE_ID_AM200) {
- register_telegram_type(0x54D, ("AmTemperatures"), false, MAKE_PF_CB(process_amTempMessage));
- register_telegram_type(0x54E, ("AmStatus"), false, MAKE_PF_CB(process_amStatusMessage));
- register_telegram_type(0x54F, ("AmCommand"), false, MAKE_PF_CB(process_amCommandMessage)); // not broadcasted, but actually not used
- register_telegram_type(0x550, ("AmExtra"), false, MAKE_PF_CB(process_amExtraMessage));
- register_telegram_type(0x54C, ("AmSettings"), true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted
+ register_telegram_type(0x54D, "AmTemperatures", false, MAKE_PF_CB(process_amTempMessage));
+ register_telegram_type(0x54E, "AmStatus", false, MAKE_PF_CB(process_amStatusMessage));
+ register_telegram_type(0x54F, "AmCommand", false, MAKE_PF_CB(process_amCommandMessage)); // not broadcasted, but actually not used
+ register_telegram_type(0x550, "AmExtra", false, MAKE_PF_CB(process_amExtraMessage));
+ register_telegram_type(0x54C, "AmSettings", true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted
register_device_value(DeviceValueTAG::TAG_AHS,
&curFlowTemp_,
@@ -113,12 +113,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
if (device_id >= EMSdevice::EMS_DEVICE_ID_BOILER_1) {
uint8_t hs = device_id - EMSdevice::EMS_DEVICE_ID_BOILER_1; // heating source id, count from 0
// Runtime of each heatingsource in 0x06DC, ff
- register_telegram_type(0x6DC + hs, ("CascadeMessage"), false, MAKE_PF_CB(process_CascadeMessage));
+ register_telegram_type(0x6DC + hs, "CascadeMessage", false, MAKE_PF_CB(process_CascadeMessage));
register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, FL_(burnWorkMin), DeviceValueUOM::MINUTES);
// selBurnpower in D2 and E4
- // register_telegram_type(0xD2, ("CascadePowerMessage"), false, MAKE_PF_CB(process_CascadePowerMessage));
+ // register_telegram_type(0xD2, "CascadePowerMessage", false, MAKE_PF_CB(process_CascadePowerMessage));
// individual Flowtemps and powervalues for each heatingsource in E4
- register_telegram_type(0xE4, ("UBAMonitorFastPlus"), false, MAKE_PF_CB(process_UBAMonitorFastPlus));
+ register_telegram_type(0xE4, "UBAMonitorFastPlus", false, MAKE_PF_CB(process_UBAMonitorFastPlus));
register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selFlowTemp_, DeviceValueType::UINT, FL_(selFlowTemp), DeviceValueUOM::DEGREES);
register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, FL_(selBurnPow), DeviceValueUOM::PERCENT);
register_device_value(DeviceValueTAG::TAG_HS1 + hs,
@@ -136,48 +136,51 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
// the telegram handlers...
// common for all boilers
- register_telegram_type(0xBF, ("ErrorMessage"), false, MAKE_PF_CB(process_ErrorMessage));
- register_telegram_type(0x10, ("UBAErrorMessage1"), false, MAKE_PF_CB(process_UBAErrorMessage));
- register_telegram_type(0x11, ("UBAErrorMessage2"), false, MAKE_PF_CB(process_UBAErrorMessage));
- register_telegram_type(0xC2, ("UBAErrorMessage3"), false, MAKE_PF_CB(process_UBAErrorMessage2));
- register_telegram_type(0x14, ("UBATotalUptime"), true, MAKE_PF_CB(process_UBATotalUptime));
- register_telegram_type(0x15, ("UBAMaintenanceData"), false, MAKE_PF_CB(process_UBAMaintenanceData));
- register_telegram_type(0x1C, ("UBAMaintenanceStatus"), false, MAKE_PF_CB(process_UBAMaintenanceStatus));
+ register_telegram_type(0xBF, "ErrorMessage", false, MAKE_PF_CB(process_ErrorMessage));
+ register_telegram_type(0x10, "UBAErrorMessage1", false, MAKE_PF_CB(process_UBAErrorMessage));
+ register_telegram_type(0x11, "UBAErrorMessage2", false, MAKE_PF_CB(process_UBAErrorMessage));
+ register_telegram_type(0xC2, "UBAErrorMessage3", false, MAKE_PF_CB(process_UBAErrorMessage2));
+ register_telegram_type(0x14, "UBATotalUptime", true, MAKE_PF_CB(process_UBATotalUptime));
+ register_telegram_type(0x15, "UBAMaintenanceData", false, MAKE_PF_CB(process_UBAMaintenanceData));
+ register_telegram_type(0x1C, "UBAMaintenanceStatus", false, MAKE_PF_CB(process_UBAMaintenanceStatus));
// EMS1.0 and maybe EMS+?
- register_telegram_type(0x18, ("UBAMonitorFast"), false, MAKE_PF_CB(process_UBAMonitorFast));
- register_telegram_type(0x19, ("UBAMonitorSlow"), false, MAKE_PF_CB(process_UBAMonitorSlow));
- register_telegram_type(0x1A, ("UBASetPoints"), false, MAKE_PF_CB(process_UBASetPoints));
- register_telegram_type(0x35, ("UBAFlags"), false, MAKE_PF_CB(process_UBAFlags));
+ register_telegram_type(0x18, "UBAMonitorFast", false, MAKE_PF_CB(process_UBAMonitorFast));
+ register_telegram_type(0x19, "UBAMonitorSlow", false, MAKE_PF_CB(process_UBAMonitorSlow));
+ register_telegram_type(0x1A, "UBASetPoints", false, MAKE_PF_CB(process_UBASetPoints));
+ register_telegram_type(0x35, "UBAFlags", false, MAKE_PF_CB(process_UBAFlags));
// only EMS 1.0
- register_telegram_type(0x16, ("UBAParameters"), true, MAKE_PF_CB(process_UBAParameters));
- register_telegram_type(0x33, ("UBAParameterWW"), true, MAKE_PF_CB(process_UBAParameterWW));
- register_telegram_type(0x34, ("UBAMonitorWW"), false, MAKE_PF_CB(process_UBAMonitorWW));
+ register_telegram_type(0x16, "UBAParameters", true, MAKE_PF_CB(process_UBAParameters));
+ register_telegram_type(0x33, "UBAParameterWW", true, MAKE_PF_CB(process_UBAParameterWW));
+ register_telegram_type(0x34, "UBAMonitorWW", false, MAKE_PF_CB(process_UBAMonitorWW));
// not ems1.0, but HT3
if (model() != EMSdevice::EMS_DEVICE_FLAG_EMS) {
- register_telegram_type(0x26, ("UBASettingsWW"), true, MAKE_PF_CB(process_UBASettingsWW));
- register_telegram_type(0x2A, ("MC110Status"), false, MAKE_PF_CB(process_MC110Status));
+ register_telegram_type(0x26, "UBASettingsWW", true, MAKE_PF_CB(process_UBASettingsWW));
+ register_telegram_type(0x2A, "MC110Status", false, MAKE_PF_CB(process_MC110Status));
}
// only EMS+
if (model() != EMSdevice::EMS_DEVICE_FLAG_EMS && model() != EMSdevice::EMS_DEVICE_FLAG_HT3 && model() != EMSdevice::EMS_DEVICE_FLAG_HYBRID) {
- register_telegram_type(0xD1, ("UBAOutdoorTemp"), false, MAKE_PF_CB(process_UBAOutdoorTemp));
- register_telegram_type(0xE3, ("UBAMonitorSlowPlus2"), false, MAKE_PF_CB(process_UBAMonitorSlowPlus2));
- register_telegram_type(0xE4, ("UBAMonitorFastPlus"), false, MAKE_PF_CB(process_UBAMonitorFastPlus));
- register_telegram_type(0xE5, ("UBAMonitorSlowPlus"), false, MAKE_PF_CB(process_UBAMonitorSlowPlus));
- register_telegram_type(0xE6, ("UBAParametersPlus"), true, MAKE_PF_CB(process_UBAParametersPlus));
- register_telegram_type(0xE9, ("UBAMonitorWWPlus"), false, MAKE_PF_CB(process_UBAMonitorWWPlus));
- register_telegram_type(0xEA, ("UBAParameterWWPlus"), true, MAKE_PF_CB(process_UBAParameterWWPlus));
+ register_telegram_type(0xD1, "UBAOutdoorTemp", false, MAKE_PF_CB(process_UBAOutdoorTemp));
+ register_telegram_type(0xE3, "UBAMonitorSlowPlus2", false, MAKE_PF_CB(process_UBAMonitorSlowPlus2));
+ register_telegram_type(0xE4, "UBAMonitorFastPlus", false, MAKE_PF_CB(process_UBAMonitorFastPlus));
+ register_telegram_type(0xE5, "UBAMonitorSlowPlus", false, MAKE_PF_CB(process_UBAMonitorSlowPlus));
+ register_telegram_type(0xE6, "UBAParametersPlus", true, MAKE_PF_CB(process_UBAParametersPlus));
+ register_telegram_type(0xE9, "UBAMonitorWWPlus", false, MAKE_PF_CB(process_UBAMonitorWWPlus));
+ register_telegram_type(0xEA, "UBAParameterWWPlus", true, MAKE_PF_CB(process_UBAParameterWWPlus));
}
if (model() == EMSdevice::EMS_DEVICE_FLAG_HEATPUMP) {
- register_telegram_type(0x494, ("UBAEnergySupplied"), false, MAKE_PF_CB(process_UBAEnergySupplied));
- register_telegram_type(0x495, ("UBAInformation"), false, MAKE_PF_CB(process_UBAInformation));
- register_telegram_type(0x48D, ("HpPower"), true, MAKE_PF_CB(process_HpPower));
- register_telegram_type(0x48F, ("HpOutdoor"), false, MAKE_PF_CB(process_HpOutdoor));
- register_telegram_type(0x48A, ("HpPool"), true, MAKE_PF_CB(process_HpPool));
+ register_telegram_type(0x494, "UBAEnergySupplied", false, MAKE_PF_CB(process_UBAEnergySupplied));
+ register_telegram_type(0x495, "UBAInformation", false, MAKE_PF_CB(process_UBAInformation));
+ register_telegram_type(0x48D, "HpPower", true, MAKE_PF_CB(process_HpPower));
+ register_telegram_type(0x48F, "HpOutdoor", false, MAKE_PF_CB(process_HpOutdoor));
+ register_telegram_type(0x48A, "HpPool", true, MAKE_PF_CB(process_HpPool));
+ register_telegram_type(0x4A2, "HpInput", false, MAKE_PF_CB(process_HpInput));
+ register_telegram_type(0x486, "HpInConfig", false, MAKE_PF_CB(process_HpInConfig));
+ register_telegram_type(0x492, "HpHeaterConfig", false, MAKE_PF_CB(process_HpHeaterConfig));
}
/*
@@ -186,7 +189,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
* enable settings here if no thermostat is used in system
*
if (model() == EMSdevice::EMS_DEVICE_FLAG_HYBRID) {
- register_telegram_type(0xBB, ("HybridHp"), true, MAKE_PF_CB(process_HybridHp));
+ register_telegram_type(0xBB, "HybridHp", true, MAKE_PF_CB(process_HybridHp));
}
*/
@@ -497,6 +500,59 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
FL_(poolSetTemp),
DeviceValueUOM::DEGREES,
MAKE_CF_CB(set_pool_temp));
+ // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpInput[0].state, DeviceValueType::BOOL, FL_(hpInput1), DeviceValueUOM::NONE);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &hpInput[0].option,
+ DeviceValueType::STRING,
+ FL_(tpl_input),
+ FL_(hpIn1Opt),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_HpIn1Logic));
+ // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpInput[1].state, DeviceValueType::BOOL, FL_(hpInput2), DeviceValueUOM::NONE);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &hpInput[1].option,
+ DeviceValueType::STRING,
+ FL_(tpl_input),
+ FL_(hpIn2Opt),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_HpIn2Logic));
+ // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpInput[2].state, DeviceValueType::BOOL, FL_(hpInput3), DeviceValueUOM::NONE);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &hpInput[2].option,
+ DeviceValueType::STRING,
+ FL_(tpl_input),
+ FL_(hpIn3Opt),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_HpIn3Logic));
+ // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpInput[3].state, DeviceValueType::BOOL, FL_(hpInput4), DeviceValueUOM::NONE);
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &hpInput[3].option,
+ DeviceValueType::STRING,
+ FL_(tpl_input4),
+ FL_(hpIn4Opt),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_HpIn4Logic));
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatComp_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatComp),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatComp));
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatHeat_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatHeat),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatHeat));
+ register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
+ &maxHeatDhw_,
+ DeviceValueType::ENUM,
+ FL_(enum_maxHeat),
+ FL_(maxHeatDhw),
+ DeviceValueUOM::NONE,
+ MAKE_CF_CB(set_maxHeatDhw));
}
// dhw - DEVICE_DATA_ww topic
@@ -1093,6 +1149,44 @@ void Boiler::process_HpPool(std::shared_ptr telegram) {
has_update(telegram, poolSetTemp_, 1);
}
+// Heatpump inputs - type 0x4A2
+// Boiler(0x08) -> All(0x00), ?(0x04A2), data: 02 01 01 00 01 00
+void Boiler::process_HpInput(std::shared_ptr telegram) {
+ has_update(telegram, hpInput[0].state, 2);
+ has_update(telegram, hpInput[1].state, 3);
+ has_update(telegram, hpInput[2].state, 4);
+ has_update(telegram, hpInput[3].state, 5);
+}
+
+// Heatpump inputs settings- type 0x486
+// Boiler(0x08) -> All(0x00), ?(0x0486), data: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+// Boiler(0x08) -> All(0x00), ?(0x0486), data: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 (offset 25)
+// Boiler(0x08) -> All(0x00), ?(0x0486), data: 00 00 (offset 51)
+void Boiler::process_HpInConfig(std::shared_ptr telegram) {
+ char option[12];
+ for (uint8_t i = 0; i < 2; i++) {
+ for (uint8_t j = 0; j < 11; j++) {
+ option[j] = hpInput[i].option[j] - '0';
+ telegram->read_value(option[j], j * 4 + i);
+ option[j] = option[j] ? '1' : '0';
+ }
+ option[11] = '\0'; // terminate string
+ has_update(hpInput[i].option, option, 12);
+ }
+ for (uint8_t j = 0; j < 9; j++) {
+ option[j] = hpInput[3].option[j] - '0';
+ telegram->read_value(option[j], 42 + j);
+ option[j] = option[j] ? '1' : '0';
+ }
+ option[9] = '\0'; // terminate string
+ has_update(hpInput[3].option, option, 12);
+}
+
+void Boiler::process_HpHeaterConfig(std::shared_ptr telegram) {
+ has_update(maxHeatComp_, 2);
+ has_update(maxHeatHeat_, 3);
+ has_update(maxHeatDhw_, 4);
+}
// 0x2A - MC110Status
// e.g. 88 00 2A 00 00 00 00 00 00 00 00 00 D2 00 00 80 00 00 01 08 80 00 02 47 00
@@ -1335,6 +1429,9 @@ void Boiler::process_amCommandMessage(std::shared_ptr telegram)
// pos 6: boiler blocking 0-off, 1-on
}
+// 0x0550 AM200 broadcasted message, all 27 bytes unkown
+// Rx: 60 00 FF 00 04 50 00 FF 00 FF FF 00 0D 00 01 00 00 00 00 01 03 01 00 03 00 2D 19 C8 02 94 00 4A
+// Rx: 60 00 FF 19 04 50 00 FF FF 39
void Boiler::process_amExtraMessage(std::shared_ptr telegram) {
}
@@ -2241,4 +2338,48 @@ bool Boiler::set_emergency_ops(const char * value, const int8_t id) {
return true;
}
+bool Boiler::set_HpInLogic(const char * value, const int8_t id) {
+ if (id == 0 || id > 4) {
+ return false;
+ }
+ bool v;
+ if (Helpers::value2bool(value, v)) {
+ write_command(0x486, id == 4 ? 42 : id - 1, v ? 1 : 0, 0x486);
+ return true;
+ }
+ if (strlen(value) == 11 && id != 4) {
+ uint8_t v[11];
+ for (uint8_t i = 0; i < 11; i++) {
+ v[i] = value[i] - '0';
+ if (v[i] > 1) {
+ return false;
+ }
+ write_command(0x486, i * 3 + id - 1, v[i]);
+ }
+ return true;
+ }
+ // input 4
+ if (strlen(value) == 8 && id == 4) {
+ uint8_t v[11];
+ for (uint8_t i = 0; i < 8; i++) {
+ v[i] = value[i] - '0';
+ if (v[i] > 1) {
+ return false;
+ }
+ write_command(0x486, 42 + i, v[i]);
+ }
+ return true;
+ }
+ return false;
+}
+
+bool Boiler::set_maxHeat(const char * value, const int8_t id) {
+ uint8_t v;
+ if (!Helpers::value2enum(value, v, FL_(enum_maxHeat))) {
+ return false;
+ }
+ write_command(0x492, id, v, 0x492);
+ return true;
+}
+
} // namespace emsesp
diff --git a/src/devices/boiler.h b/src/devices/boiler.h
index 932fade40..8f35b147b 100644
--- a/src/devices/boiler.h
+++ b/src/devices/boiler.h
@@ -198,6 +198,17 @@ class Boiler : public EMSdevice {
// Pool unit
int8_t poolSetTemp_;
+ // Inputs
+ struct {
+ uint8_t state;
+ char option[12]; // logic, block_comp, block_dhw, block_heat, block_cool, overheat_protect, evu_blocktime1,2,3, block_heater, Solar
+ } hpInput[4];
+
+ // Heater limits
+ uint8_t maxHeatComp_;
+ uint8_t maxHeatHeat_;
+ uint8_t maxHeatDhw_;
+
// Alternative Heatsource AM200
int16_t cylTopTemp_; // TB1
int16_t cylCenterTemp_; // TB2
@@ -269,6 +280,9 @@ class Boiler : public EMSdevice {
void process_HpPower(std::shared_ptr telegram);
void process_HpOutdoor(std::shared_ptr telegram);
void process_HpPool(std::shared_ptr telegram);
+ void process_HpInput(std::shared_ptr telegram);
+ void process_HpInConfig(std::shared_ptr telegram);
+ void process_HpHeaterConfig(std::shared_ptr telegram);
void process_HybridHp(std::shared_ptr telegram);
void process_amTempMessage(std::shared_ptr telegram);
void process_amStatusMessage(std::shared_ptr telegram);
@@ -331,6 +345,29 @@ class Boiler : public EMSdevice {
bool set_blockTerm(const char * value, const int8_t id); // pos 17: Config of block terminal: NO(00), NC(01)
bool set_blockHyst(const char * value, const int8_t id); // pos 14?: Hyst. for bolier block (K)
bool set_releaseWait(const char * value, const int8_t id); // pos 15: Boiler release wait time (min)
+ bool set_HpInLogic(const char * value, const int8_t id);
+ bool set_HpIn1Logic(const char * value, const int8_t id) {
+ return set_HpInLogic(value, 1);
+ }
+ bool set_HpIn2Logic(const char * value, const int8_t id) {
+ return set_HpInLogic(value, 2);
+ }
+ bool set_HpIn3Logic(const char * value, const int8_t id) {
+ return set_HpInLogic(value, 3);
+ }
+ bool set_HpIn4Logic(const char * value, const int8_t id) {
+ return set_HpInLogic(value, 4);
+ }
+ bool set_maxHeat(const char * value, const int8_t id);
+ bool set_maxHeatComp(const char * value, const int8_t id) {
+ return set_maxHeat(value, 2);
+ }
+ bool set_maxHeatHeat(const char * value, const int8_t id) {
+ return set_maxHeat(value, 3);
+ }
+ bool set_maxHeatDhw(const char * value, const int8_t id) {
+ return set_maxHeat(value, 4);
+ }
/*
bool set_hybridStrategy(const char * value, const int8_t id);
diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp
index 3e1b74c0c..d4c6748ce 100644
--- a/src/devices/controller.cpp
+++ b/src/devices/controller.cpp
@@ -26,7 +26,7 @@ Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_i
: EMSdevice(device_type, device_id, product_id, version, name, flags, brand) {
// IVT broadcasts Thermostat time from controller (0x09) if display is off.
if ((flags & 0x0F) == EMS_DEVICE_FLAG_IVT) {
- register_telegram_type(0x06, ("RCTime"), false, MAKE_PF_CB(process_dateTime));
+ register_telegram_type(0x06, "RCTime", false, MAKE_PF_CB(process_dateTime));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE);
}
}
diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp
index de49f3be0..b88287b70 100644
--- a/src/devices/heatpump.cpp
+++ b/src/devices/heatpump.cpp
@@ -25,8 +25,8 @@ REGISTER_FACTORY(Heatpump, EMSdevice::DeviceType::HEATPUMP);
Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand)
: EMSdevice(device_type, device_id, product_id, version, name, flags, brand) {
// telegram handlers
- register_telegram_type(0x042B, ("HP1"), false, MAKE_PF_CB(process_HPMonitor1));
- register_telegram_type(0x047B, ("HP2"), false, MAKE_PF_CB(process_HPMonitor2));
+ register_telegram_type(0x042B, "HP1", false, MAKE_PF_CB(process_HPMonitor1));
+ register_telegram_type(0x047B, "HP2", false, MAKE_PF_CB(process_HPMonitor2));
// device values
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &airHumidity_, DeviceValueType::UINT, FL_(airHumidity), DeviceValueUOM::PERCENT);
diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp
index d68a12d85..35221c73e 100644
--- a/src/devices/mixer.cpp
+++ b/src/devices/mixer.cpp
@@ -28,7 +28,7 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
: EMSdevice(device_type, device_id, product_id, version, name, flags, brand) {
// Pool module
if (flags == EMSdevice::EMS_DEVICE_FLAG_MP) {
- register_telegram_type(0x5BA, ("HpPoolStatus"), true, MAKE_PF_CB(process_HpPoolStatus));
+ register_telegram_type(0x5BA, "HpPoolStatus", true, MAKE_PF_CB(process_HpPoolStatus));
type_ = Type::MP;
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&poolTemp_,
@@ -43,8 +43,8 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
// EMS+
if (flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) {
if (device_id >= 0x20 && device_id <= 0x27) {
- register_telegram_type(device_id - 0x20 + 0x02D7, ("MMPLUSStatusMessage_HC"), false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC));
- // register_telegram_type(device_id - 0x20 + 0x02E1, ("MMPLUSStetMessage_HC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_HC));
+ register_telegram_type(device_id - 0x20 + 0x02D7, "MMPLUSStatusMessage_HC", false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC));
+ // register_telegram_type(device_id - 0x20 + 0x02E1, "MMPLUSStetMessage_HC", true, MAKE_PF_CB(process_MMPLUSSetMessage_HC));
type_ = Type::HC;
hc_ = device_id - 0x20 + 1;
uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1;
@@ -53,9 +53,9 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp));
register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump));
} else if (device_id >= 0x28 && device_id <= 0x29) {
- register_telegram_type(device_id - 0x28 + 0x0331, ("MMPLUSStatusMessage_WWC"), false, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC));
- register_telegram_type(device_id - 0x28 + 0x0313, ("MMPLUSConfigMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSConfigMessage_WWC));
- // register_telegram_type(device_id - 0x28 + 0x033B, ("MMPLUSSetMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_WWC));
+ register_telegram_type(device_id - 0x28 + 0x0331, "MMPLUSStatusMessage_WWC", false, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC));
+ register_telegram_type(device_id - 0x28 + 0x0313, "MMPLUSConfigMessage_WWC", true, MAKE_PF_CB(process_MMPLUSConfigMessage_WWC));
+ // register_telegram_type(device_id - 0x28 + 0x033B, "MMPLUSSetMessage_WWC", true, MAKE_PF_CB(process_MMPLUSSetMessage_WWC));
type_ = Type::WWC;
hc_ = device_id - 0x28 + 1;
uint8_t tag = DeviceValueTAG::TAG_WWC1 + hc_ - 1;
@@ -85,9 +85,9 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
// EMS 1.0
if (flags == EMSdevice::EMS_DEVICE_FLAG_MM10) {
- register_telegram_type(0x00AA, ("MMConfigMessage"), true, MAKE_PF_CB(process_MMConfigMessage));
- register_telegram_type(0x00AB, ("MMStatusMessage"), false, MAKE_PF_CB(process_MMStatusMessage));
- register_telegram_type(0x00AC, ("MMSetMessage"), false, MAKE_PF_CB(process_MMSetMessage));
+ register_telegram_type(0x00AA, "MMConfigMessage", true, MAKE_PF_CB(process_MMConfigMessage));
+ register_telegram_type(0x00AB, "MMStatusMessage", false, MAKE_PF_CB(process_MMStatusMessage));
+ register_telegram_type(0x00AC, "MMSetMessage", false, MAKE_PF_CB(process_MMSetMessage));
type_ = Type::HC;
hc_ = device_id - 0x20 + 1;
uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1;
@@ -110,10 +110,10 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
// HT3
if (flags == EMSdevice::EMS_DEVICE_FLAG_IPM) {
if (device_id >= 0x40) { // special DHW pos 10
- register_telegram_type(0x34, ("UBAMonitorWW"), false, MAKE_PF_CB(process_IPMMonitorWW));
- register_telegram_type(0x1E, ("HydrTemp"), false, MAKE_PF_CB(process_IPMHydrTemp));
- register_telegram_type(0x33, ("UBAParameterWW"), true, MAKE_PF_CB(process_IPMParameterWW));
- // register_telegram_type(0x10D, ("wwNTCStatus"), false, MAKE_PF_CB(process_wwNTCStatus));
+ register_telegram_type(0x34, "UBAMonitorWW", false, MAKE_PF_CB(process_IPMMonitorWW));
+ register_telegram_type(0x1E, "HydrTemp", false, MAKE_PF_CB(process_IPMHydrTemp));
+ register_telegram_type(0x33, "UBAParameterWW", true, MAKE_PF_CB(process_IPMParameterWW));
+ // register_telegram_type(0x10D, "wwNTCStatus", false, MAKE_PF_CB(process_wwNTCStatus));
type_ = Type::WWC;
hc_ = device_id - 0x40 + 1;
uint8_t tag = DeviceValueTAG::TAG_WWC9 + hc_ - 1;
@@ -139,9 +139,9 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
MAKE_CF_CB(set_wwCircPump));
register_device_value(tag, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircMode));
} else {
- register_telegram_type(0x010C, ("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage));
- register_telegram_type(0x011E, ("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage));
- // register_telegram_type(0x0123, ("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage));
+ register_telegram_type(0x010C, "IPMStatusMessage", false, MAKE_PF_CB(process_IPMStatusMessage));
+ register_telegram_type(0x011E, "IPMTempMessage", false, MAKE_PF_CB(process_IPMTempMessage));
+ // register_telegram_type(0x0123, "IPMSetMessage", false, MAKE_PF_CB(process_IPMSetMessage));
type_ = Type::HC;
hc_ = device_id - 0x20 + 1;
uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1;
diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp
index 0bdbbf2d5..0b7cdad67 100644
--- a/src/devices/solar.cpp
+++ b/src/devices/solar.cpp
@@ -28,44 +28,44 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c
: EMSdevice(device_type, device_id, product_id, version, name, flags, brand) {
// telegram handlers
if (flags == EMSdevice::EMS_DEVICE_FLAG_SM10) {
- register_telegram_type(0x97, ("SM10Monitor"), false, MAKE_PF_CB(process_SM10Monitor));
- register_telegram_type(0x96, ("SM10Config"), true, MAKE_PF_CB(process_SM10Config));
+ register_telegram_type(0x97, "SM10Monitor", false, MAKE_PF_CB(process_SM10Monitor));
+ register_telegram_type(0x96, "SM10Config", true, MAKE_PF_CB(process_SM10Config));
EMSESP::send_read_request(0x97, device_id);
}
if (flags == EMSdevice::EMS_DEVICE_FLAG_SM100) {
if (device_id == 0x2A) { // SM100 DHW
- register_telegram_type(0x07D6, ("SM100wwTemperature"), false, MAKE_PF_CB(process_SM100wwTemperature));
- register_telegram_type(0x07AA, ("SM100wwStatus"), false, MAKE_PF_CB(process_SM100wwStatus));
- register_telegram_type(0x07AB, ("SM100wwCommand"), false, MAKE_PF_CB(process_SM100wwCommand));
- register_telegram_type(0x07A5, ("SM100wwCirc"), true, MAKE_PF_CB(process_SM100wwCirc));
- register_telegram_type(0x07A6, ("SM100wwParam"), true, MAKE_PF_CB(process_SM100wwParam));
- register_telegram_type(0x07AE, ("SM100wwKeepWarm"), true, MAKE_PF_CB(process_SM100wwKeepWarm));
- register_telegram_type(0x07E0, ("SM100wwStatus2"), true, MAKE_PF_CB(process_SM100wwStatus2));
+ register_telegram_type(0x07D6, "SM100wwTemperature", false, MAKE_PF_CB(process_SM100wwTemperature));
+ register_telegram_type(0x07AA, "SM100wwStatus", false, MAKE_PF_CB(process_SM100wwStatus));
+ register_telegram_type(0x07AB, "SM100wwCommand", false, MAKE_PF_CB(process_SM100wwCommand));
+ register_telegram_type(0x07A5, "SM100wwCirc", true, MAKE_PF_CB(process_SM100wwCirc));
+ register_telegram_type(0x07A6, "SM100wwParam", true, MAKE_PF_CB(process_SM100wwParam));
+ register_telegram_type(0x07AE, "SM100wwKeepWarm", true, MAKE_PF_CB(process_SM100wwKeepWarm));
+ register_telegram_type(0x07E0, "SM100wwStatus2", true, MAKE_PF_CB(process_SM100wwStatus2));
} else {
// F9 is not a telegram type, it's a flag for configure
- // register_telegram_type(0xF9, ("ParamCfg"), false, MAKE_PF_CB(process_SM100ParamCfg));
- register_telegram_type(0x0358, ("SM100SystemConfig"), true, MAKE_PF_CB(process_SM100SystemConfig));
- register_telegram_type(0x035A, ("SM100CircuitConfig"), true, MAKE_PF_CB(process_SM100CircuitConfig));
- register_telegram_type(0x035D, ("SM100Circuit2Config"), true, MAKE_PF_CB(process_SM100Circuit2Config));
- register_telegram_type(0x0362, ("SM100Monitor"), false, MAKE_PF_CB(process_SM100Monitor));
- register_telegram_type(0x0363, ("SM100Monitor2"), false, MAKE_PF_CB(process_SM100Monitor2));
- register_telegram_type(0x0366, ("SM100Config"), false, MAKE_PF_CB(process_SM100Config));
- register_telegram_type(0x0364, ("SM100Status"), false, MAKE_PF_CB(process_SM100Status));
- register_telegram_type(0x036A, ("SM100Status2"), false, MAKE_PF_CB(process_SM100Status2));
- register_telegram_type(0x0380, ("SM100CollectorConfig"), true, MAKE_PF_CB(process_SM100CollectorConfig));
- register_telegram_type(0x038E, ("SM100Energy"), true, MAKE_PF_CB(process_SM100Energy));
- register_telegram_type(0x0391, ("SM100Time"), true, MAKE_PF_CB(process_SM100Time));
- register_telegram_type(0x035F, ("SM100Config1"), true, MAKE_PF_CB(process_SM100Config1));
- register_telegram_type(0x035C, ("SM100HeatAssist"), true, MAKE_PF_CB(process_SM100HeatAssist));
- register_telegram_type(0x0361, ("SM100Differential"), true, MAKE_PF_CB(process_SM100Differential));
+ // register_telegram_type(0xF9, "ParamCfg", false, MAKE_PF_CB(process_SM100ParamCfg));
+ register_telegram_type(0x0358, "SM100SystemConfig", true, MAKE_PF_CB(process_SM100SystemConfig));
+ register_telegram_type(0x035A, "SM100CircuitConfig", true, MAKE_PF_CB(process_SM100CircuitConfig));
+ register_telegram_type(0x035D, "SM100Circuit2Config", true, MAKE_PF_CB(process_SM100Circuit2Config));
+ register_telegram_type(0x0362, "SM100Monitor", false, MAKE_PF_CB(process_SM100Monitor));
+ register_telegram_type(0x0363, "SM100Monitor2", false, MAKE_PF_CB(process_SM100Monitor2));
+ register_telegram_type(0x0366, "SM100Config", false, MAKE_PF_CB(process_SM100Config));
+ register_telegram_type(0x0364, "SM100Status", false, MAKE_PF_CB(process_SM100Status));
+ register_telegram_type(0x036A, "SM100Status2", false, MAKE_PF_CB(process_SM100Status2));
+ register_telegram_type(0x0380, "SM100CollectorConfig", true, MAKE_PF_CB(process_SM100CollectorConfig));
+ register_telegram_type(0x038E, "SM100Energy", true, MAKE_PF_CB(process_SM100Energy));
+ register_telegram_type(0x0391, "SM100Time", true, MAKE_PF_CB(process_SM100Time));
+ register_telegram_type(0x035F, "SM100Config1", true, MAKE_PF_CB(process_SM100Config1));
+ register_telegram_type(0x035C, "SM100HeatAssist", true, MAKE_PF_CB(process_SM100HeatAssist));
+ register_telegram_type(0x0361, "SM100Differential", true, MAKE_PF_CB(process_SM100Differential));
}
}
if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) {
- register_telegram_type(0x0103, ("ISM1StatusMessage"), true, MAKE_PF_CB(process_ISM1StatusMessage));
- register_telegram_type(0x0101, ("ISM1Set"), true, MAKE_PF_CB(process_ISM1Set));
- register_telegram_type(0x0104, ("ISM2StatusMessage"), false, MAKE_PF_CB(process_ISM2StatusMessage));
+ register_telegram_type(0x0103, "ISM1StatusMessage", true, MAKE_PF_CB(process_ISM1StatusMessage));
+ register_telegram_type(0x0101, "ISM1Set", true, MAKE_PF_CB(process_ISM1Set));
+ register_telegram_type(0x0104, "ISM2StatusMessage", false, MAKE_PF_CB(process_ISM2StatusMessage));
}
// device values...
diff --git a/src/devices/switch.cpp b/src/devices/switch.cpp
index 4f2edd589..8ccca2cde 100644
--- a/src/devices/switch.cpp
+++ b/src/devices/switch.cpp
@@ -25,9 +25,9 @@ REGISTER_FACTORY(Switch, EMSdevice::DeviceType::SWITCH);
Switch::Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand)
: EMSdevice(device_type, device_id, product_id, version, name, flags, brand) {
// WM10 module, device_id 0x11
- register_telegram_type(0x9C, ("WM10MonitorMessage"), false, MAKE_PF_CB(process_WM10MonitorMessage));
- register_telegram_type(0x9D, ("WM10SetMessage"), false, MAKE_PF_CB(process_WM10SetMessage));
- register_telegram_type(0x1E, ("WM10TempMessage"), false, MAKE_PF_CB(process_WM10TempMessage));
+ register_telegram_type(0x9C, "WM10MonitorMessage", false, MAKE_PF_CB(process_WM10MonitorMessage));
+ register_telegram_type(0x9D, "WM10SetMessage", false, MAKE_PF_CB(process_WM10SetMessage));
+ register_telegram_type(0x1E, "WM10TempMessage", false, MAKE_PF_CB(process_WM10TempMessage));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &activated_, DeviceValueType::BOOL, FL_(activated), DeviceValueUOM::NONE);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp
index c0661977d..2d6708042 100644
--- a/src/devices/thermostat.cpp
+++ b/src/devices/thermostat.cpp
@@ -30,31 +30,31 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
// RF remote sensor seen at 0x40, maybe this is also for different hc with id 0x40 - 0x47? emsesp.cpp maps only 0x40
if (device_id >= 0x40 && device_id <= 0x47) {
- register_telegram_type(0x0435, ("RFTemp"), false, MAKE_PF_CB(process_RemoteTemp));
+ register_telegram_type(0x0435, "RFTemp", false, MAKE_PF_CB(process_RemoteTemp));
return;
}
// remote thermostats with humidity: RC100H remote
if (device_id >= 0x38 && device_id <= 0x3F) {
- register_telegram_type(0x042B, ("RemoteTemp"), false, MAKE_PF_CB(process_RemoteTemp));
- register_telegram_type(0x047B, ("RemoteHumidity"), false, MAKE_PF_CB(process_RemoteHumidity));
- register_telegram_type(0x0273, ("RemoteCorrection"), true, MAKE_PF_CB(process_RemoteCorrection));
+ register_telegram_type(0x042B, "RemoteTemp", false, MAKE_PF_CB(process_RemoteTemp));
+ register_telegram_type(0x047B, "RemoteHumidity", false, MAKE_PF_CB(process_RemoteHumidity));
+ register_telegram_type(0x0273, "RemoteCorrection", true, MAKE_PF_CB(process_RemoteCorrection));
register_device_values(); // register device values for common values (not heating circuit)
return; // no values to add
}
// common telegram handlers
- register_telegram_type(EMS_TYPE_RCOutdoorTemp, ("RCOutdoorTemp"), false, MAKE_PF_CB(process_RCOutdoorTemp));
- register_telegram_type(EMS_TYPE_RCTime, ("RCTime"), false, MAKE_PF_CB(process_RCTime));
- register_telegram_type(0xA2, ("RCError"), false, MAKE_PF_CB(process_RCError));
- register_telegram_type(0x12, ("RCErrorMessage"), false, MAKE_PF_CB(process_RCErrorMessage));
- register_telegram_type(0x13, ("RCErrorMessage2"), false, MAKE_PF_CB(process_RCErrorMessage));
+ register_telegram_type(EMS_TYPE_RCOutdoorTemp, "RCOutdoorTemp", false, MAKE_PF_CB(process_RCOutdoorTemp));
+ register_telegram_type(EMS_TYPE_RCTime, "RCTime", false, MAKE_PF_CB(process_RCTime));
+ register_telegram_type(0xA2, "RCError", false, MAKE_PF_CB(process_RCError));
+ register_telegram_type(0x12, "RCErrorMessage", false, MAKE_PF_CB(process_RCErrorMessage));
+ register_telegram_type(0x13, "RCErrorMessage2", false, MAKE_PF_CB(process_RCErrorMessage));
// RC10
if (model == EMSdevice::EMS_DEVICE_FLAG_RC10) {
monitor_typeids = {0xB1};
set_typeids = {0xB0};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC10Monitor"), false, MAKE_PF_CB(process_RC10Monitor));
- register_telegram_type(set_typeids[i], ("RC10Set"), false, MAKE_PF_CB(process_RC10Set));
+ register_telegram_type(monitor_typeids[i], "RC10Monitor", false, MAKE_PF_CB(process_RC10Monitor));
+ register_telegram_type(set_typeids[i], "RC10Set", false, MAKE_PF_CB(process_RC10Set));
}
// RC35
@@ -64,15 +64,15 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
timer_typeids = {0x3F, 0x49, 0x53, 0x5D};
timer2_typeids = {0x42, 0x4C, 0x56, 0x60};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC35Monitor"), false, MAKE_PF_CB(process_RC35Monitor));
- register_telegram_type(set_typeids[i], ("RC35Set"), false, MAKE_PF_CB(process_RC35Set));
- register_telegram_type(timer_typeids[i], ("RC35Timer"), false, MAKE_PF_CB(process_RC35Timer));
- register_telegram_type(timer2_typeids[i], ("RC35Timer2"), false, MAKE_PF_CB(process_RC35Timer));
+ register_telegram_type(monitor_typeids[i], "RC35Monitor", false, MAKE_PF_CB(process_RC35Monitor));
+ register_telegram_type(set_typeids[i], "RC35Set", false, MAKE_PF_CB(process_RC35Set));
+ register_telegram_type(timer_typeids[i], "RC35Timer", false, MAKE_PF_CB(process_RC35Timer));
+ register_telegram_type(timer2_typeids[i], "RC35Timer2", false, MAKE_PF_CB(process_RC35Timer));
}
- register_telegram_type(EMS_TYPE_IBASettings, ("IBASettings"), true, MAKE_PF_CB(process_IBASettings));
- register_telegram_type(EMS_TYPE_wwSettings, ("WWSettings"), true, MAKE_PF_CB(process_RC35wwSettings));
- register_telegram_type(0x38, ("WWTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
- register_telegram_type(0x39, ("WWCircTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
+ register_telegram_type(EMS_TYPE_IBASettings, "IBASettings", true, MAKE_PF_CB(process_IBASettings));
+ register_telegram_type(EMS_TYPE_wwSettings, "WWSettings", true, MAKE_PF_CB(process_RC35wwSettings));
+ register_telegram_type(0x38, "WWTimer", true, MAKE_PF_CB(process_RC35wwTimer));
+ register_telegram_type(0x39, "WWCircTimer", true, MAKE_PF_CB(process_RC35wwTimer));
// RC20
} else if (model == EMSdevice::EMS_DEVICE_FLAG_RC20) {
@@ -81,22 +81,22 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
curve_typeids = {0x90};
timer_typeids = {0x8F};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC20Monitor"), false, MAKE_PF_CB(process_RC20Monitor));
- register_telegram_type(set_typeids[i], ("RC20Set"), false, MAKE_PF_CB(process_RC20Set));
- register_telegram_type(curve_typeids[i], ("RC20Temp"), false, MAKE_PF_CB(process_RC20Temp));
- register_telegram_type(timer_typeids[i], ("RC20Timer"), false, MAKE_PF_CB(process_RC20Timer));
+ register_telegram_type(monitor_typeids[i], "RC20Monitor", false, MAKE_PF_CB(process_RC20Monitor));
+ register_telegram_type(set_typeids[i], "RC20Set", false, MAKE_PF_CB(process_RC20Set));
+ register_telegram_type(curve_typeids[i], "RC20Temp", false, MAKE_PF_CB(process_RC20Temp));
+ register_telegram_type(timer_typeids[i], "RC20Timer", false, MAKE_PF_CB(process_RC20Timer));
}
// remote thermostat uses only 0xAF
- register_telegram_type(0xAF, ("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote));
+ register_telegram_type(0xAF, "RC20Remote", false, MAKE_PF_CB(process_RC20Remote));
// RC20 newer
} else if ((model == EMSdevice::EMS_DEVICE_FLAG_RC20_N) || (model == EMSdevice::EMS_DEVICE_FLAG_RC25)) {
monitor_typeids = {0xAE};
set_typeids = {0xAD};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC20Monitor"), false, MAKE_PF_CB(process_RC20Monitor_2));
- register_telegram_type(set_typeids[i], ("RC20Set"), false, MAKE_PF_CB(process_RC20Set_2));
+ register_telegram_type(monitor_typeids[i], "RC20Monitor", false, MAKE_PF_CB(process_RC20Monitor_2));
+ register_telegram_type(set_typeids[i], "RC20Set", false, MAKE_PF_CB(process_RC20Set_2));
}
- register_telegram_type(0xAF, ("RC20Remote"), false, MAKE_PF_CB(process_RC20Remote));
+ register_telegram_type(0xAF, "RC20Remote", false, MAKE_PF_CB(process_RC20Remote));
// RC30
} else if (model == EMSdevice::EMS_DEVICE_FLAG_RC30) {
monitor_typeids = {0x41};
@@ -104,27 +104,27 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
curve_typeids = {0x40};
timer_typeids = {0x3F};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC30Monitor"), false, MAKE_PF_CB(process_RC30Monitor));
- register_telegram_type(set_typeids[i], ("RC30Set"), false, MAKE_PF_CB(process_RC30Set));
- register_telegram_type(curve_typeids[i], ("RC30Temp"), false, MAKE_PF_CB(process_RC30Temp));
- register_telegram_type(timer_typeids[i], ("RC30Timer"), false, MAKE_PF_CB(process_RC35Timer));
+ register_telegram_type(monitor_typeids[i], "RC30Monitor", false, MAKE_PF_CB(process_RC30Monitor));
+ register_telegram_type(set_typeids[i], "RC30Set", false, MAKE_PF_CB(process_RC30Set));
+ register_telegram_type(curve_typeids[i], "RC30Temp", false, MAKE_PF_CB(process_RC30Temp));
+ register_telegram_type(timer_typeids[i], "RC30Timer", false, MAKE_PF_CB(process_RC35Timer));
}
- register_telegram_type(EMS_TYPE_RC30wwSettings, ("RC30WWSettings"), true, MAKE_PF_CB(process_RC30wwSettings));
- register_telegram_type(0x38, ("WWTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
- register_telegram_type(0x39, ("WWCircTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
+ register_telegram_type(EMS_TYPE_RC30wwSettings, "RC30WWSettings", true, MAKE_PF_CB(process_RC30wwSettings));
+ register_telegram_type(0x38, "WWTimer", true, MAKE_PF_CB(process_RC35wwTimer));
+ register_telegram_type(0x39, "WWCircTimer", true, MAKE_PF_CB(process_RC35wwTimer));
// EASY
} else if (model == EMSdevice::EMS_DEVICE_FLAG_EASY) {
monitor_typeids = {0x0A};
set_typeids = {};
- register_telegram_type(monitor_typeids[0], ("EasyMonitor"), true, MAKE_PF_CB(process_EasyMonitor));
+ register_telegram_type(monitor_typeids[0], "EasyMonitor", true, MAKE_PF_CB(process_EasyMonitor));
// CRF
} else if (model == EMSdevice::EMS_DEVICE_FLAG_CRF) {
monitor_typeids = {0x02A5, 0x02A6, 0x02A7, 0x02A8};
set_typeids = {};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("CRFMonitor"), false, MAKE_PF_CB(process_CRFMonitor));
+ register_telegram_type(monitor_typeids[i], "CRFMonitor", false, MAKE_PF_CB(process_CRFMonitor));
}
// RC300/RC100
@@ -136,46 +136,46 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
curve_typeids = {0x029B, 0x029C, 0x029D, 0x029E, 0x029F, 0x02A0, 0x02A1, 0x02A2};
summer2_typeids = {0x0471, 0x0472, 0x0473, 0x0474, 0x0475, 0x0476, 0x0477, 0x0478};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("RC300Monitor"), false, MAKE_PF_CB(process_RC300Monitor));
- register_telegram_type(set_typeids[i], ("RC300Set"), false, MAKE_PF_CB(process_RC300Set));
- register_telegram_type(summer_typeids[i], ("RC300Summer"), false, MAKE_PF_CB(process_RC300Summer));
- register_telegram_type(curve_typeids[i], ("RC300Curves"), false, MAKE_PF_CB(process_RC300Curve));
- register_telegram_type(summer2_typeids[i], ("RC300Summer2"), false, MAKE_PF_CB(process_RC300Summer2));
+ register_telegram_type(monitor_typeids[i], "RC300Monitor", false, MAKE_PF_CB(process_RC300Monitor));
+ register_telegram_type(set_typeids[i], "RC300Set", false, MAKE_PF_CB(process_RC300Set));
+ register_telegram_type(summer_typeids[i], "RC300Summer", false, MAKE_PF_CB(process_RC300Summer));
+ register_telegram_type(curve_typeids[i], "RC300Curves", false, MAKE_PF_CB(process_RC300Curve));
+ register_telegram_type(summer2_typeids[i], "RC300Summer2", false, MAKE_PF_CB(process_RC300Summer2));
}
for (uint8_t i = 0; i < set2_typeids.size(); i++) {
- register_telegram_type(set2_typeids[i], ("RC300Set2"), false, MAKE_PF_CB(process_RC300Set2));
+ register_telegram_type(set2_typeids[i], "RC300Set2", false, MAKE_PF_CB(process_RC300Set2));
}
- register_telegram_type(0x2F5, ("RC300WWmode"), true, MAKE_PF_CB(process_RC300WWmode));
- register_telegram_type(0x31B, ("RC300WWtemp"), true, MAKE_PF_CB(process_RC300WWtemp));
- register_telegram_type(0x31D, ("RC300WWmode2"), false, MAKE_PF_CB(process_RC300WWmode2));
- register_telegram_type(0x31E, ("RC300WWmode2"), false, MAKE_PF_CB(process_RC300WWmode2));
- register_telegram_type(0x23A, ("RC300OutdoorTemp"), true, MAKE_PF_CB(process_RC300OutdoorTemp));
- register_telegram_type(0x267, ("RC300Floordry"), false, MAKE_PF_CB(process_RC300Floordry));
- register_telegram_type(0x240, ("RC300Settings"), true, MAKE_PF_CB(process_RC300Settings));
+ register_telegram_type(0x2F5, "RC300WWmode", true, MAKE_PF_CB(process_RC300WWmode));
+ register_telegram_type(0x31B, "RC300WWtemp", true, MAKE_PF_CB(process_RC300WWtemp));
+ register_telegram_type(0x31D, "RC300WWmode2", false, MAKE_PF_CB(process_RC300WWmode2));
+ register_telegram_type(0x31E, "RC300WWmode2", false, MAKE_PF_CB(process_RC300WWmode2));
+ register_telegram_type(0x23A, "RC300OutdoorTemp", true, MAKE_PF_CB(process_RC300OutdoorTemp));
+ register_telegram_type(0x267, "RC300Floordry", false, MAKE_PF_CB(process_RC300Floordry));
+ register_telegram_type(0x240, "RC300Settings", true, MAKE_PF_CB(process_RC300Settings));
// JUNKERS/HT3
} else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) {
monitor_typeids = {0x016F, 0x0170, 0x0171, 0x0172};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(monitor_typeids[i], ("JunkersMonitor"), false, MAKE_PF_CB(process_JunkersMonitor));
+ register_telegram_type(monitor_typeids[i], "JunkersMonitor", false, MAKE_PF_CB(process_JunkersMonitor));
}
if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) {
// FR120, FR100
set_typeids = {0x0179, 0x017A, 0x017B, 0x017C};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(set_typeids[i], ("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet2));
+ register_telegram_type(set_typeids[i], "JunkersSet", false, MAKE_PF_CB(process_JunkersSet2));
}
} else {
set_typeids = {0x0165, 0x0166, 0x0167, 0x0168};
for (uint8_t i = 0; i < monitor_typeids.size(); i++) {
- register_telegram_type(set_typeids[i], ("JunkersSet"), false, MAKE_PF_CB(process_JunkersSet));
+ register_telegram_type(set_typeids[i], "JunkersSet", false, MAKE_PF_CB(process_JunkersSet));
}
}
- register_telegram_type(0xBB, ("HybridSettings"), true, MAKE_PF_CB(process_JunkersHybridSettings));
- register_telegram_type(0x23, ("JunkersSetMixer"), true, MAKE_PF_CB(process_JunkersSetMixer));
- register_telegram_type(0x123, ("JunkersRemote"), false, MAKE_PF_CB(process_JunkersRemoteMonitor));
- register_telegram_type(0x1D3, ("JunkersDhw"), true, MAKE_PF_CB(process_JunkersWW));
+ register_telegram_type(0xBB, "HybridSettings", true, MAKE_PF_CB(process_JunkersHybridSettings));
+ register_telegram_type(0x23, "JunkersSetMixer", true, MAKE_PF_CB(process_JunkersSetMixer));
+ register_telegram_type(0x123, "JunkersRemote", false, MAKE_PF_CB(process_JunkersRemoteMonitor));
+ register_telegram_type(0x1D3, "JunkersDhw", true, MAKE_PF_CB(process_JunkersWW));
}
// register device values for common values (not heating circuit)
@@ -686,6 +686,7 @@ void Thermostat::process_JunkersSet(std::shared_ptr telegram) {
has_update(telegram, hc->control, 1); // remote: 0-off, 1-FB10, 2-FB100
has_enumupdate(telegram, hc->program, 13, 1); // 1-6: 1 = A, 2 = B,...
has_enumupdate(telegram, hc->mode, 14, 1); // 0 = nofrost, 1 = eco, 2 = heat, 3 = auto
+ has_update(telegram, hc->roomsensor, 9); // 1-intern, 2-extern, 3-autoselect the lower value
}
// type 0x0179, ff
@@ -1702,6 +1703,24 @@ bool Thermostat::set_control(const char * value, const int8_t id) {
return false;
}
+// Set sensor for Junkers, 1-external (from remote), 2-internal, 3-minimum value from int/ext
+bool Thermostat::set_roomsensor(const char * value, const int8_t id) {
+ uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
+ std::shared_ptr hc = heating_circuit(hc_num);
+ if (hc == nullptr) {
+ return false;
+ }
+
+ uint8_t ctrl = 0;
+ if (model() == EMS_DEVICE_FLAG_JUNKERS && !has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) {
+ if (Helpers::value2enum(value, ctrl, FL_(enum_roomsensor))) {
+ write_command(set_typeids[hc->hc()], 9, ctrl);
+ return true;
+ }
+ }
+ return false;
+}
+
// sets the thermostat ww working mode, where mode is a string, ems and ems+
bool Thermostat::set_wwmode(const char * value, const int8_t id) {
uint8_t set = 0xFF;
@@ -3715,7 +3734,9 @@ void Thermostat::register_device_values() {
DeviceValueType::INT,
FL_(ibaMinExtTemperature),
DeviceValueUOM::DEGREES,
- MAKE_CF_CB(set_minexttemp));
+ MAKE_CF_CB(set_minexttemp),
+ -30,
+ 0);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&tempsensor1_,
DeviceValueType::SHORT,
@@ -3781,12 +3802,8 @@ void Thermostat::register_device_values() {
MAKE_CF_CB(set_wwDisinfectHour),
0,
23);
- register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
- &wwMaxTemp_,
- DeviceValueType::UINT,
- FL_(wwMaxTemp),
- DeviceValueUOM::DEGREES,
- MAKE_CF_CB(set_wwMaxTemp));
+ register_device_value(
+ DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp), 60, 80);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
&wwOneTimeKey_,
DeviceValueType::BOOL,
@@ -3930,7 +3947,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrselTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES);
} else {
- register_device_value(tag, &hc->selTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 0, 29);
+ register_device_value(tag, &hc->selTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_temp), 0, 30);
}
register_device_value(tag, &hc->roomTemp, DeviceValueType::SHORT, roomtemp_divider, FL_(roomTemp), DeviceValueUOM::DEGREES);
register_device_value(tag, &hc->climate, DeviceValueType::ENUM, FL_(enum_climate), FL_(climate), DeviceValueUOM::NONE);
@@ -4121,14 +4138,16 @@ void Thermostat::register_device_values_hc(std::shared_ptrdaytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp));
register_device_value(
tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp));
- register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp));
+ register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp), 30, 90);
register_device_value(tag,
&hc->offsettemp,
DeviceValueType::INT,
DeviceValueNumOp::DV_NUMOP_DIV2,
FL_(offsettemp),
DeviceValueUOM::DEGREES_R,
- MAKE_CF_CB(set_offsettemp));
+ MAKE_CF_CB(set_offsettemp),
+ -5,
+ 5);
register_device_value(tag,
&hc->holidaytemp,
DeviceValueType::UINT,
@@ -4140,13 +4159,13 @@ void Thermostat::register_device_values_hc(std::shared_ptrsummertemp, DeviceValueType::UINT, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 9, 25);
register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE);
register_device_value(tag, &hc->holidaymode, DeviceValueType::BOOL, FL_(holidaymode), DeviceValueUOM::NONE);
- register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp));
+ register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp), -20, 10);
register_device_value(
tag, &hc->nofrostmode, DeviceValueType::ENUM, FL_(enum_nofrostmode), FL_(nofrostmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_nofrostmode));
- register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence));
- register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp));
- register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp));
- register_device_value(tag, &hc->flowtempoffset, DeviceValueType::UINT, FL_(flowtempoffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_flowtempoffset));
+ register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence), 0, 10);
+ register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp), 5, 70);
+ register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp), 30, 90);
+ register_device_value(tag, &hc->flowtempoffset, DeviceValueType::UINT, FL_(flowtempoffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_flowtempoffset), 0, 20);
register_device_value(
tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype));
register_device_value(tag, &hc->reducemode, DeviceValueType::ENUM, FL_(enum_reducemode), FL_(reducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_reducemode));
@@ -4156,8 +4175,8 @@ void Thermostat::register_device_values_hc(std::shared_ptrholiday, DeviceValueType::STRING, FL_(tpl_holidays), FL_(holidays), DeviceValueUOM::NONE, MAKE_CF_CB(set_holiday));
register_device_value(tag, &hc->vacation, DeviceValueType::STRING, FL_(tpl_holidays), FL_(vacations), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacation));
register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode2), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program));
- register_device_value(tag, &hc->pause, DeviceValueType::UINT, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause));
- register_device_value(tag, &hc->party, DeviceValueType::UINT, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party));
+ register_device_value(tag, &hc->pause, DeviceValueType::UINT, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause), 0, 99);
+ register_device_value(tag, &hc->party, DeviceValueType::UINT, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party), 0, 99);
register_device_value(tag,
&hc->tempautotemp,
DeviceValueType::UINT,
@@ -4165,9 +4184,9 @@ void Thermostat::register_device_values_hc(std::shared_ptrnoreducetemp, DeviceValueType::INT, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp));
- register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp));
- register_device_value(tag, &hc->vacreducetemp, DeviceValueType::INT, FL_(vacreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_vacreducetemp));
+ register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp), -30, 10);
+ register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp), -20, 10);
+ register_device_value(tag, &hc->vacreducetemp, DeviceValueType::INT, FL_(vacreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_vacreducetemp), -20, 10);
register_device_value(
tag, &hc->vacreducemode, DeviceValueType::ENUM, FL_(enum_reducemode), FL_(vacreducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacreducemode));
register_device_value(tag,
@@ -4201,6 +4220,7 @@ void Thermostat::register_device_values_hc(std::shared_ptrprogram, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program));
register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(remotetemp), DeviceValueUOM::DEGREES);
register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, FL_(targetflowtemp), DeviceValueUOM::DEGREES);
+ register_device_value(tag, &hc->roomsensor, DeviceValueType::ENUM, FL_(enum_roomsensor), FL_(roomsensor), DeviceValueUOM::NONE, MAKE_CF_CB(set_roomsensor));
break;
default:
break;
diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h
index 37170e13b..074f98ca8 100644
--- a/src/devices/thermostat.h
+++ b/src/devices/thermostat.h
@@ -84,10 +84,11 @@ class Thermostat : public EMSdevice {
uint8_t climate;
uint8_t switchonoptimization;
uint8_t statusbyte; // from RC300monitor
-
// RC 10
uint8_t reducehours; // night reduce duration
uint16_t reduceminutes; // remaining minutes to night->day
+ // FW100 temperature
+ uint8_t roomsensor; // 1-intern, 2-extern, 3-autoselect the lower value
uint8_t hc_num() const {
return hc_num_;
@@ -489,6 +490,7 @@ class Thermostat : public EMSdevice {
bool set_electricFactor(const char * value, const int8_t id);
bool set_delayBoiler(const char * value, const int8_t id);
bool set_tempDiffBoiler(const char * value, const int8_t id);
+ bool set_roomsensor(const char * value, const int8_t id);
};
} // namespace emsesp
diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp
index 30699a031..f6845b22a 100644
--- a/src/emsdevice.cpp
+++ b/src/emsdevice.cpp
@@ -478,6 +478,7 @@ void EMSdevice::add_device_value(uint8_t tag,
// add the device entity
devicevalues_.emplace_back(
device_type_, tag, value_p, type, options, options_single, numeric_operator, short_name, fullname, custom_fullname, uom, has_cmd, min, max, state);
+ devicevalues_.back().set_custom_minmax();
// add a new command if it has a function attached
if (!has_cmd) {
@@ -864,9 +865,10 @@ void EMSdevice::generate_values_web(JsonObject & output) {
// as generate_values_web() but stripped down to only show all entities and their state
// this is used only for WebCustomizationService::device_entities()
void EMSdevice::generate_values_web_customization(JsonArray & output) {
- for (const auto & dv : devicevalues_) {
+ for (auto & dv : devicevalues_) {
// also show commands and entities that have an empty full name
- JsonObject obj = output.createNestedObject();
+ JsonObject obj = output.createNestedObject();
+ uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0;
// create the value
if (dv.hasValue()) {
@@ -910,13 +912,13 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) {
}
if (dv.type == DeviceValueType::INT) {
- obj["v"] = make_float ? Helpers::transformNumFloat(*(int8_t *)(dv.value_p), num_op) : *(int8_t *)(dv.value_p) * num_op;
+ obj["v"] = make_float ? Helpers::transformNumFloat(*(int8_t *)(dv.value_p), num_op, fahrenheit) : *(int8_t *)(dv.value_p) * num_op;
} else if (dv.type == DeviceValueType::UINT) {
- obj["v"] = make_float ? Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), num_op) : *(uint8_t *)(dv.value_p) * num_op;
+ obj["v"] = make_float ? Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), num_op, fahrenheit) : *(uint8_t *)(dv.value_p) * num_op;
} else if (dv.type == DeviceValueType::SHORT) {
- obj["v"] = make_float ? Helpers::transformNumFloat(*(int16_t *)(dv.value_p), num_op) : *(int16_t *)(dv.value_p) * num_op;
+ obj["v"] = make_float ? Helpers::transformNumFloat(*(int16_t *)(dv.value_p), num_op, fahrenheit) : *(int16_t *)(dv.value_p) * num_op;
} else if (dv.type == DeviceValueType::USHORT) {
- obj["v"] = make_float ? Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), num_op) : *(uint16_t *)(dv.value_p) * num_op;
+ obj["v"] = make_float ? Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), num_op, fahrenheit) : *(uint16_t *)(dv.value_p) * num_op;
} else if (dv.type == DeviceValueType::ULONG) {
obj["v"] = make_float ? Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op) : *(uint32_t *)(dv.value_p) * num_op;
} else if (dv.type == DeviceValueType::TIME) {
@@ -947,6 +949,12 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) {
obj["n"] = name;
}
}
+
+ // add the custom name, is optional
+ std::string custom_fullname = dv.get_custom_fullname();
+ if (!custom_fullname.empty()) {
+ obj["cn"] = custom_fullname;
+ }
} else {
obj["n"] = "!" + fullname; // prefix commands with a !
}
@@ -958,6 +966,18 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) {
obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble
obj["w"] = dv.has_cmd; // if writable
+
+ if (dv.has_cmd) {
+ // set the custom min and max values if there are any
+ int16_t dv_set_min;
+ uint16_t dv_set_max;
+ if (dv.get_custom_min(dv_set_min)) {
+ obj["mi"] = fahrenheit ? (int)(dv_set_min * 1.8 + 32 * (fahrenheit - 1)) : dv_set_min;
+ }
+ if (dv.get_custom_max(dv_set_max)) {
+ obj["ma"] = fahrenheit ? (int)(dv_set_max * 1.8 + 32 * (fahrenheit - 1)) : dv_set_max;
+ }
+ }
}
}
@@ -998,7 +1018,7 @@ void EMSdevice::setCustomEntity(const std::string & entity_id) {
} else {
dv.custom_fullname = "";
}
-
+ dv.set_custom_minmax();
return;
}
}
@@ -1393,6 +1413,24 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c
// else if (dv.type == DeviceValueType::CMD && output_target != EMSdevice::OUTPUT_TARGET::MQTT) {
// json[name] = "";
// }
+
+ // check for value outside min/max range and adapt the limits to avoid HA complains
+ // Should this also check for api output?
+ if ((output_target == OUTPUT_TARGET::MQTT) && (dv.min != 0 || dv.max != 0)) {
+ if (json[name].is() || json[name].is()) {
+ int v = json[name];
+ if (fahrenheit) {
+ v = (v - (32 * (fahrenheit - 1))) / 1.8; // reset to °C
+ }
+ if (v < dv.min) {
+ dv.min = v;
+ dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED);
+ } else if (v > dv.max) {
+ dv.max = v;
+ dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED);
+ }
+ }
+ }
}
}
}
diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp
index 0e369c6cd..95e72c99f 100644
--- a/src/emsdevicevalue.cpp
+++ b/src/emsdevicevalue.cpp
@@ -326,13 +326,66 @@ bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) {
return false; // nothing changed, not supported
}
-// returns the translated fullname or the custom fullname (if provided)
-// always returns a std::string
-std::string DeviceValue::get_fullname() const {
- if (custom_fullname.empty()) {
- return Helpers::translated_word(fullname);
+// extract custom min from custom_fullname
+bool DeviceValue::get_custom_min(int16_t & val) {
+ auto min_pos = custom_fullname.find('>');
+ bool has_min = (min_pos != std::string::npos);
+ uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0;
+ if (has_min) {
+ int v = Helpers::atoint(custom_fullname.substr(min_pos + 1).c_str());
+ if (fahrenheit) {
+ v = (v - (32 * (fahrenheit - 1))) / 1.8; // reset to °C
+ }
+ if (v > max) {
+ return false;
+ }
+ val = v;
+ }
+ return has_min;
+}
+
+// extract custom max from custom_fullname
+bool DeviceValue::get_custom_max(uint16_t & val) {
+ auto max_pos = custom_fullname.find('<');
+ bool has_max = (max_pos != std::string::npos);
+ uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0;
+ if (has_max) {
+ int v = Helpers::atoint(custom_fullname.substr(max_pos + 1).c_str());
+ if (fahrenheit) {
+ v = (v - (32 * (fahrenheit - 1))) / 1.8; // reset to °C
+ }
+ if (v < 0 || v < min) {
+ return false;
+ }
+ val = v;
+ }
+ return has_max;
+}
+
+// sets min max to stored custom values (if set)
+void DeviceValue::set_custom_minmax() {
+ get_custom_min(min);
+ get_custom_max(max);
+}
+
+std::string DeviceValue::get_custom_fullname() const {
+ auto min_pos = custom_fullname.find('>');
+ auto max_pos = custom_fullname.find('<');
+ auto minmax_pos = min_pos < max_pos ? min_pos : max_pos;
+ if (minmax_pos != std::string::npos) {
+ return custom_fullname.substr(0, minmax_pos);
}
return custom_fullname;
}
+// returns the translated fullname or the custom fullname (if provided)
+// always returns a std::string
+std::string DeviceValue::get_fullname() const {
+ std::string customname = get_custom_fullname();
+ if (customname.empty()) {
+ return Helpers::translated_word(fullname);
+ }
+ return customname;
+}
+
} // namespace emsesp
diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h
index 2f6722ca8..a36795e46 100644
--- a/src/emsdevicevalue.h
+++ b/src/emsdevicevalue.h
@@ -178,6 +178,10 @@ class DeviceValue {
bool hasValue() const;
bool get_min_max(int16_t & dv_set_min, int16_t & dv_set_max);
+ void set_custom_minmax();
+ bool get_custom_min(int16_t & val);
+ bool get_custom_max(uint16_t & val);
+ std::string get_custom_fullname() const;
std::string get_fullname() const;
// dv state flags
diff --git a/src/locale_common.h b/src/locale_common.h
index 471fd097e..6c3966490 100644
--- a/src/locale_common.h
+++ b/src/locale_common.h
@@ -177,13 +177,22 @@ MAKE_PSTR_LIST(progc, "prog c")
MAKE_PSTR_LIST(progd, "prog d")
MAKE_PSTR_LIST(proge, "prog e")
MAKE_PSTR_LIST(progf, "prog f")
+MAKE_PSTR_LIST(rc35, "RC35")
+MAKE_PSTR_LIST(0kW, "0 kW")
+MAKE_PSTR_LIST(2kW, "2 kW")
+MAKE_PSTR_LIST(3kW, "3 kW")
+MAKE_PSTR_LIST(4kW, "4 kW")
+MAKE_PSTR_LIST(6kW, "6 kW")
+MAKE_PSTR_LIST(9kW, "9 kW")
-// templates - this are not translated and will be saved under optons_single
+// templates - this are not translated and will be saved under options_single
MAKE_PSTR_LIST(tpl_datetime, "Format: < NTP | dd.mm.yyyy-hh:mm:ss-day(0-6)-dst(0/1) >")
MAKE_PSTR_LIST(tpl_switchtime, "Format: [ not_set | day hh:mm on|off ]")
MAKE_PSTR_LIST(tpl_switchtime1, "Format: [ not_set | day hh:mm Tn ]")
MAKE_PSTR_LIST(tpl_holidays, "Format: < dd.mm.yyyy-dd.mm.yyyy >")
MAKE_PSTR_LIST(tpl_date, "Format: < dd.mm.yyyy >")
+MAKE_PSTR_LIST(tpl_input, "Format: []")
+MAKE_PSTR_LIST(tpl_input4, "Format: []")
// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp
// These don't need translating, it will mess up HA and the API
@@ -290,6 +299,7 @@ MAKE_PSTR_ENUM(enum_comfort, FL_(hot), FL_(eco), FL_(intelligent))
MAKE_PSTR_ENUM(enum_comfort1, FL_(high_comfort), FL_(eco))
MAKE_PSTR_ENUM(enum_flow, FL_(off), FL_(flow), FL_(bufferedflow), FL_(buffer), FL_(layeredbuffer))
MAKE_PSTR_ENUM(enum_reset, FL_(dash), FL_(maintenance), FL_(error))
+MAKE_PSTR_ENUM(enum_maxHeat, FL_(0kW), FL_(2kW), FL_(3kW), FL_(4kW), FL_(6kW), FL_(9kW))
// thermostat lists
MAKE_PSTR_ENUM(enum_ibaMainDisplay,
@@ -339,6 +349,7 @@ MAKE_PSTR_ENUM(enum_controlmode1, FL_(weather_compensated), FL_(outside_basepoin
MAKE_PSTR_ENUM(enum_controlmode2, FL_(outdoor), FL_(room))
MAKE_PSTR_ENUM(enum_control, FL_(off), FL_(rc20), FL_(rc3x))
MAKE_PSTR_ENUM(enum_j_control, FL_(off), FL_(fb10), FL_(fb100))
+MAKE_PSTR_ENUM(enum_roomsensor, FL_(extern), FL_(intern), FL_(auto))
MAKE_PSTR_ENUM(enum_switchmode, FL_(off), FL_(eco), FL_(comfort), FL_(heat))
diff --git a/src/locale_translations.h b/src/locale_translations.h
index 28563790f..10d661500 100644
--- a/src/locale_translations.h
+++ b/src/locale_translations.h
@@ -74,6 +74,9 @@ MAKE_PSTR_LIST(co2_cost_mix, "co2 cost mix", "Kostenmix", "Kostenmix", "Kostnads
MAKE_PSTR_LIST(analog, "analog", "analog", "analoog", "analog")
MAKE_PSTR_LIST(normal, "normal", "normal", "normaal", "normal")
MAKE_PSTR_LIST(blocking, "blocking", "Blockierung", "Blokkering", "Blockering")
+MAKE_PSTR_LIST(extern, "extern", "extern", "extern", "extern")
+MAKE_PSTR_LIST(intern, "intern", "intern", "intern", "intern")
+MAKE_PSTR_LIST(lower, "lower", "niedirger", "lager", "lägre")
// boiler
MAKE_PSTR_LIST(time, "time", "Zeit", "Tijd", "Tid")
@@ -367,6 +370,9 @@ MAKE_PSTR_LIST(hpIn1Opt, "hpin1opt", "input 1 options", "Eingang 1 Einstellung",
MAKE_PSTR_LIST(hpIn2Opt, "hpin2opt", "input 2 options", "Eingang 2 Einstellung", "Instelling input 2", "Inställningar Ingång 2")
MAKE_PSTR_LIST(hpIn3Opt, "hpin3opt", "input 3 options", "Eingang 3 Einstellung", "Instelling input 3", "Inställningar Ingång 3")
MAKE_PSTR_LIST(hpIn4Opt, "hpin4opt", "input 4 options", "Eingang 4 Einstellung", "Instelling input 4", "Inställningar Ingång 4")
+MAKE_PSTR_LIST(maxHeatComp, "maxheatcomp", "heat limit compressor", "Heizgrenze Kompressor", "heat limit compressor", "heat limit compressor")
+MAKE_PSTR_LIST(maxHeatHeat, "maxheatheat", "heat limit heating", "Heizgrenze Heizen", "heat limit heating", "heat limit heating")
+MAKE_PSTR_LIST(maxHeatDhw, "maxheatdhw", "heat limit dhw", "Heizgrenze Warmwasser", "heat limit dhw", "heat limit dhw")
// hybrid heatpump
MAKE_PSTR_LIST(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi")
@@ -444,7 +450,7 @@ MAKE_PSTR_LIST(wwSelTempSingle,
MAKE_PSTR_LIST(wwCylMiddleTemp,
"wwcylmiddletemp",
"cylinder middle temperature (TS3)",
- "Speichertemperature Mitte",
+ "Speichertemperatur Mitte",
"Buffer temperatuur midden",
"Cylinder Temperatur Mitten (TS3)")
@@ -470,14 +476,14 @@ MAKE_PSTR_LIST(wwOneTime, "wwonetime", "one time charging", "Einmalladung", "Buf
MAKE_PSTR_LIST(wwDisinfecting, "wwdisinfecting", "disinfecting", "Desinfizieren", "Desinfectie", "Desinficerar")
MAKE_PSTR_LIST(wwCharging, "wwcharging", "charging", "Laden", "Laden", "Laddar")
MAKE_PSTR_LIST(wwChargeOptimization, "wwchargeoptimization", "charge optimization", "Ladungsoptimierung", "laadoptimalisatie", "Laddningsoptimering")
-MAKE_PSTR_LIST(wwRecharging, "wwrecharging", "recharging", "Nachladen", "herladen", "Omladdar")
+MAKE_PSTR_LIST(wwRecharging, "wwrecharging", "recharging", "Nachladen", "herladen", "Laddar om")
MAKE_PSTR_LIST(wwTempOK, "wwtempok", "temperature ok", "Temperatur ok", "Temperatuur OK", "Temperatur OK")
MAKE_PSTR_LIST(wwActive, "wwactive", "active", "aktiv", "Actief", "Aktiv")
-MAKE_PSTR_LIST(ww3wayValve, "ww3wayvalve", "3-way valve active", "3-Wegeventil aktiv", "3-wegklep actief", "Trevägsventil Aktiv")
+MAKE_PSTR_LIST(ww3wayValve, "ww3wayvalve", "3-way valve active", "3-Wegeventil aktiv", "3-wegklep actief", "Trevägsventil aktiv")
MAKE_PSTR_LIST(wwSetPumpPower, "wwsetpumppower", "set pump power", "Soll Pumpenleistung", "Streefwaarde pompvermogen", "Vald pumpeffekt")
MAKE_PSTR_LIST(wwMixerTemp, "wwmixertemp", "mixer temperature", "Mischertemperatur", "Mixertemperatuur", "Blandningsventil-tempertur")
-MAKE_PSTR_LIST(wwStarts, "wwstarts", "starts", "Anzahl Starts", "Aantal starts", "Antal Starter")
-MAKE_PSTR_LIST(wwStarts2, "wwstarts2", "control starts2", "Kreis 2 Anzahl Starts", "Aantal starts circuit 2", "Antal Starter Krets 2")
+MAKE_PSTR_LIST(wwStarts, "wwstarts", "starts", "Anzahl Starts", "Aantal starts", "Antal starter")
+MAKE_PSTR_LIST(wwStarts2, "wwstarts2", "control starts2", "Kreis 2 Anzahl Starts", "Aantal starts circuit 2", "Antal starter Krets 2")
MAKE_PSTR_LIST(wwWorkM, "wwworkm", "active time", "aktive Zeit", "Actieve tijd", "Aktiv Tid")
MAKE_PSTR_LIST(wwHystOn, "wwhyston", "hysteresis on temperature", "Einschalttemperaturdifferenz", "Inschakeltemperatuurverschil", "Hysteres PÅ-temperatur")
MAKE_PSTR_LIST(wwHystOff, "wwhystoff", "hysteresis off temperature", "Ausschalttemperaturdifferenz", "Uitschakeltemperatuurverschil", "Hysteres AV-temperatur")
@@ -583,12 +589,13 @@ MAKE_PSTR_LIST(roominfl_factor, "roominflfactor", "room influence factor", "Raum
MAKE_PSTR_LIST(curroominfl, "curroominfl", "current room influence", "aktueller Raumeinfluss", "Huidige ruimteinvloed", "Aktuell Rumspåverkan")
MAKE_PSTR_LIST(nofrosttemp, "nofrosttemp", "nofrost temperature", "Frostschutztemperatur", "Temperatuur vorstbeveiliging", "Temperatur Frostskydd")
MAKE_PSTR_LIST(targetflowtemp, "targetflowtemp", "target flow temperature", "berechnete Vorlauftemperatur", "Berekende aanvoertemperatuur", "Målvärde Flödestemperatur")
-MAKE_PSTR_LIST(heatingtype, "heatingtype", "heating type", "Heizungstyp", "Verwarmingstype", "Uppvärmningstyp")
+MAKE_PSTR_LIST(heatingtype, "heatingtype", "heating type", "Heizungstyp", "Verwarmingstype", "Värmesystem")
MAKE_PSTR_LIST(summersetmode, "summersetmode", "set summer mode", "Einstellung Sommerbetrieb", "Instelling zomerbedrijf", "Aktivera Sommarläge")
MAKE_PSTR_LIST(hpoperatingmode, "hpoperatingmode", "heatpump operating mode", "Wärmepumpe Betriebsmodus", "Bedrijfsmodus warmtepomp", "Värmepump Driftläge")
MAKE_PSTR_LIST(hpoperatingstate, "hpoperatingstate", "heatpump operating state", "WP Arbeitsweise", "Huidige modus warmtepomp", "Värmepump Driftstatus")
MAKE_PSTR_LIST(controlmode, "controlmode", "control mode", "Kontrollmodus", "Comtrolemodus", "Kontrolläge")
MAKE_PSTR_LIST(control, "control", "control device", "Fernsteuerung", "Afstandsbedieding", "Kontrollenhet")
+MAKE_PSTR_LIST(roomsensor, "roomsensor", "room sensor", "Raumsensor", "Ruimtesensor", "Rumssensor")
MAKE_PSTR_LIST(program, "program", "program", "Programm", "Programma", "Program")
MAKE_PSTR_LIST(pause, "pause", "pause time", "Pausenzeit", "Pausetijd", "Paustid")
MAKE_PSTR_LIST(party, "party", "party time", "Partyzeit", "Partytijd", "Partytid")