From 1a4ce643fcdda05602408ca5fbabe46cef927fc9 Mon Sep 17 00:00:00 2001 From: Proddy Date: Wed, 24 Aug 2022 21:50:19 +0200 Subject: [PATCH] Multi-language/I18n support #22 --- .github/workflows/pre_release.yml | 2 +- .github/workflows/tagged_release.yml | 2 +- CHANGELOG_LATEST.md | 12 + esp32_partition_16M.csv | 6 + esp32_partition_4M.csv | 6 + esp32_partition_app1984k_spiffs64k.csv | 6 - interface/.typesafe-i18n.json | 5 + interface/package-lock.json | 3206 ++++++++++------- interface/package.json | 20 +- interface/src/App.tsx | 51 +- interface/src/AppRouting.tsx | 7 +- interface/src/SignIn.tsx | 51 +- .../src/components/layout/LayoutMenu.tsx | 9 +- .../authentication/Authentication.tsx | 6 +- .../src/framework/mqtt/MqttSettingsForm.tsx | 29 +- .../framework/network/NetworkConnection.tsx | 8 +- .../framework/network/NetworkSettingsForm.tsx | 8 +- interface/src/framework/ntp/NetworkTime.tsx | 5 +- interface/src/framework/security/Security.tsx | 5 +- .../framework/system/GeneralFileUpload.tsx | 6 +- interface/src/i18n/de/index.ts | 49 + interface/src/i18n/en/index.ts | 49 + interface/src/i18n/formatters.ts | 11 + interface/src/i18n/i18n-react.tsx | 16 + interface/src/i18n/i18n-types.ts | 362 ++ interface/src/i18n/i18n-util.async.ts | 27 + interface/src/i18n/i18n-util.sync.ts | 26 + interface/src/i18n/i18n-util.ts | 31 + interface/src/project/Dashboard.tsx | 8 +- interface/src/project/DashboardData.tsx | 90 +- interface/src/project/Help.tsx | 6 +- interface/src/project/ProjectMenu.tsx | 9 +- interface/src/project/Settings.tsx | 6 +- interface/src/project/SettingsApplication.tsx | 65 +- .../src/project/SettingsCustomization.tsx | 2 +- interface/src/project/types.ts | 1 + interface/src/validators/authentication.ts | 2 - lib/ESPAsyncWebServer/AsyncWebSocket.cpp | 5 + lib/OneWire/OneWire.cpp | 5 +- lib/framework/FSPersistence.h | 17 + lib_standalone/ESP8266React.h | 1 + mock-api/server.js | 19 +- pio_local.ini_example | 25 +- platformio.ini | 23 +- scripts/rename_fw.py | 11 +- scripts/run_sonar.sh | 0 sonar-project.properties | 2 +- src/analogsensor.cpp | 4 +- src/common.h | 64 + src/console.cpp | 7 +- src/console.h | 41 +- src/dallassensor.cpp | 14 +- src/default_settings.h | 25 +- src/devices/boiler.cpp | 533 +-- src/devices/boiler.h | 14 +- src/devices/controller.cpp | 2 +- src/devices/generic.cpp | 7 +- src/devices/heatpump.cpp | 4 +- src/devices/mixer.cpp | 83 +- src/devices/solar.cpp | 252 +- src/devices/switch.cpp | 11 +- src/devices/thermostat.cpp | 518 +-- src/emsdevice.cpp | 424 ++- src/emsdevice.h | 81 +- src/emsdevicevalue.cpp | 131 +- src/emsdevicevalue.h | 89 +- src/emsesp.cpp | 14 +- src/emsesp.h | 2 + src/helpers.cpp | 128 +- src/helpers.h | 16 +- src/locale_DE.h | 858 ----- src/locale_EN.h | 848 ----- src/locale_common.h | 370 ++ src/locale_translations.h | 588 +++ src/mqtt.cpp | 115 +- src/mqtt.h | 28 +- src/system.cpp | 49 +- src/system.h | 11 + src/telegram.cpp | 2 + src/test/test.cpp | 11 +- src/version.h | 2 +- src/web/WebDataService.cpp | 2 +- src/web/WebSettingsService.cpp | 20 +- src/web/WebSettingsService.h | 2 + 84 files changed, 5499 insertions(+), 4189 deletions(-) create mode 100644 esp32_partition_16M.csv create mode 100644 esp32_partition_4M.csv delete mode 100644 esp32_partition_app1984k_spiffs64k.csv create mode 100644 interface/.typesafe-i18n.json create mode 100644 interface/src/i18n/de/index.ts create mode 100644 interface/src/i18n/en/index.ts create mode 100644 interface/src/i18n/formatters.ts create mode 100644 interface/src/i18n/i18n-react.tsx create mode 100644 interface/src/i18n/i18n-types.ts create mode 100644 interface/src/i18n/i18n-util.async.ts create mode 100644 interface/src/i18n/i18n-util.sync.ts create mode 100644 interface/src/i18n/i18n-util.ts mode change 100755 => 100644 scripts/run_sonar.sh create mode 100644 src/common.h delete mode 100644 src/locale_DE.h delete mode 100644 src/locale_EN.h create mode 100644 src/locale_common.h create mode 100644 src/locale_translations.h diff --git a/.github/workflows/pre_release.yml b/.github/workflows/pre_release.yml index 852e95909..11a8a07df 100644 --- a/.github/workflows/pre_release.yml +++ b/.github/workflows/pre_release.yml @@ -31,7 +31,7 @@ jobs: python -m pip install --upgrade pip pip install -U platformio platformio upgrade - platformio update + pio pkg update - name: Build WebUI run: | diff --git a/.github/workflows/tagged_release.yml b/.github/workflows/tagged_release.yml index f9169eac9..bdb623b8a 100644 --- a/.github/workflows/tagged_release.yml +++ b/.github/workflows/tagged_release.yml @@ -24,7 +24,7 @@ jobs: python -m pip install --upgrade pip pip install -U platformio platformio upgrade - platformio update + pio pkg update - name: Build WebUI run: | diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 0a7f332e7..6d6ec4d4f 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -1,5 +1,17 @@ # Changelog +# [3.5.0] + +## Added + +- Translations in Web UI and all device entity names to German. [#22](https://github.com/emsesp/EMS-ESP32/issues/22) + +## Fixed + +## Changed + +## **BREAKING CHANGES:** + # [3.4.2] ## Added diff --git a/esp32_partition_16M.csv b/esp32_partition_16M.csv new file mode 100644 index 000000000..014e72909 --- /dev/null +++ b/esp32_partition_16M.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, , 0x2000, +app0, app, ota_0, , 0x7F0000, +app1, app, ota_1, , 0x7F0000, +spiffs, data, spiffs, , 64K, \ No newline at end of file diff --git a/esp32_partition_4M.csv b/esp32_partition_4M.csv new file mode 100644 index 000000000..aa1a70df5 --- /dev/null +++ b/esp32_partition_4M.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, , 0x2000, +app0, app, ota_0, , 0x1F0000, +app1, app, ota_1, , 0x1F0000, +spiffs, data, spiffs, , 64K, \ No newline at end of file diff --git a/esp32_partition_app1984k_spiffs64k.csv b/esp32_partition_app1984k_spiffs64k.csv deleted file mode 100644 index 7eaebdbc1..000000000 --- a/esp32_partition_app1984k_spiffs64k.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x5000, -otadata, data, ota, 0xE000, 0x2000, -app0, app, ota_0, 0x10000, 0x1F0000, -app1, app, ota_1, 0x200000, 0x1F0000, -spiffs, data, spiffs, 0x3F0000, 0x10000, diff --git a/interface/.typesafe-i18n.json b/interface/.typesafe-i18n.json new file mode 100644 index 000000000..8148f73a8 --- /dev/null +++ b/interface/.typesafe-i18n.json @@ -0,0 +1,5 @@ +{ + "adapter": "react", + "baseLocale": "en", + "$schema": "https://unpkg.com/typesafe-i18n@5.12.0/schema/typesafe-i18n.json" +} \ No newline at end of file diff --git a/interface/package-lock.json b/interface/package-lock.json index 5c4c0af1a..ccef4c477 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -1,22 +1,22 @@ { "name": "EMS-ESP", - "version": "3.4.0", + "version": "3.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "EMS-ESP", - "version": "3.4.0", + "version": "3.5.0", "dependencies": { "@emotion/react": "^11.10.0", "@emotion/styled": "^11.10.0", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.8.4", - "@mui/material": "^5.9.3", - "@table-library/react-table-library": "4.0.10", - "@types/lodash": "^4.14.182", - "@types/node": "^18.6.3", - "@types/react": "^18.0.15", + "@mui/icons-material": "^5.10.2", + "@mui/material": "^5.10.2", + "@table-library/react-table-library": "4.0.12", + "@types/lodash": "^4.14.184", + "@types/node": "^18.7.13", + "@types/react": "^18.0.17", "@types/react-dom": "^18.0.6", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.2.5", @@ -34,6 +34,7 @@ "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "sockette": "^2.0.6", + "typesafe-i18n": "^5.12.0", "typescript": "^4.7.4" }, "devDependencies": { @@ -73,20 +74,20 @@ } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -102,9 +103,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", - "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", + "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", "dependencies": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -147,11 +148,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.18.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -184,23 +185,23 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", "dependencies": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" @@ -213,16 +214,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -248,12 +249,14 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -264,9 +267,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", "engines": { "node": ">=6.9.0" } @@ -283,12 +286,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", "dependencies": { "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -306,11 +309,11 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -328,18 +331,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", + "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.8", + "@babel/types": "^7.18.8" }, "engines": { "node": ">=6.9.0" @@ -357,22 +360,22 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -382,15 +385,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -408,11 +411,11 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -429,14 +432,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", @@ -454,27 +449,27 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", - "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", "dependencies": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -494,9 +489,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", - "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", + "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -519,13 +514,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -535,13 +530,13 @@ } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -583,13 +578,13 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz", + "integrity": "sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/plugin-syntax-decorators": "^7.18.6" }, @@ -616,11 +611,11 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -646,11 +641,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -691,15 +686,15 @@ } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/plugin-transform-parameters": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -724,12 +719,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1086,11 +1081,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1100,16 +1095,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz", + "integrity": "sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, @@ -1121,11 +1116,11 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1135,11 +1130,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1164,11 +1159,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1193,11 +1188,11 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz", - "integrity": "sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz", + "integrity": "sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-flow": "^7.18.6" }, "engines": { @@ -1222,13 +1217,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1238,11 +1233,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1299,13 +1294,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, @@ -1404,11 +1399,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz", - "integrity": "sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz", + "integrity": "sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1432,15 +1427,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1508,15 +1503,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", "dependencies": { "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "semver": "^6.3.0" }, "engines": { @@ -1541,12 +1536,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1570,11 +1565,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1584,11 +1579,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1598,12 +1593,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.10.tgz", - "integrity": "sha512-j2HQCJuMbi88QftIb5zlRu3c7PU+sXNnscqsrjqegoGiCgXR569pEdben9vly5QHKL2ilYkfnSwu64zsZo/VYQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz", + "integrity": "sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-typescript": "^7.18.6" }, "engines": { @@ -1614,11 +1609,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1643,28 +1638,28 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -1686,40 +1681,40 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-parameters": "^7.18.6", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.18.6", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "core-js-compat": "^3.22.1", "semver": "^6.3.0" }, @@ -1781,9 +1776,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1792,9 +1787,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz", + "integrity": "sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==", "dependencies": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" @@ -1804,31 +1799,31 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", - "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", + "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/generator": "^7.18.7", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.18.8", + "@babel/types": "^7.18.8", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1837,11 +1832,10 @@ } }, "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", + "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", "dependencies": { - "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, @@ -2112,9 +2106,9 @@ } }, "node_modules/@emotion/cache": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.1.tgz", - "integrity": "sha512-uZTj3Yz5D69GE25iFZcIQtibnVCFsc/6+XIozyL3ycgWvEdif2uEw9wlUt6umjLr4Keg9K6xRPHmD8LGi+6p1A==", + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", + "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", "dependencies": { "@emotion/memoize": "^0.8.0", "@emotion/sheet": "^1.2.0", @@ -2249,9 +2243,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2285,9 +2279,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -2297,15 +2291,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -2747,11 +2732,11 @@ } }, "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.23.3" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" @@ -3060,15 +3045,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.92", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.92.tgz", - "integrity": "sha512-ZgnSLrTXL4iUdLQhjp01dAOTQPQlnwrqjZRwDT3E6LZXEYn6cMv1MY6LZkWcF/zxrUnyasnsyMAgZ5d8AXS7bA==", + "version": "5.0.0-alpha.94", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.94.tgz", + "integrity": "sha512-IJXmgTF07H1Iv5zjDV7zJZGUmb9cN8ERzd2dgA1akh6NWZgwyIGyQx+Au9+QSDoM5vN3FqZvU/0YCU6inUwgeQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@emotion/is-prop-valid": "^1.1.3", + "@emotion/is-prop-valid": "^1.2.0", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", - "@popperjs/core": "^2.11.5", + "@popperjs/core": "^2.11.6", "clsx": "^1.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -3091,10 +3076,19 @@ } } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.2.tgz", + "integrity": "sha512-1guoGvL3QZ7VjA3y9zye9Rpm+jz18rVZIo3AauTGyW5ntDMxr/cR0M18nuc/NH2KqpMt+coh4NwPEO1uPuKM5w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, "node_modules/@mui/icons-material": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.8.4.tgz", - "integrity": "sha512-9Z/vyj2szvEhGWDvb+gG875bOGm8b8rlHBKOD1+nA3PcgC3fV6W1AU6pfOorPeBfH2X4mb9Boe97vHvaSndQvA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.10.2.tgz", + "integrity": "sha512-p7ku+43JeKRz0ONGzPZbRXZRbE7vCKP1Cr8l/Yj9sUIGVQ6CM/m37u6udacJZkDXD+G2FoxJPixrVvvjx6f64w==", "dependencies": { "@babel/runtime": "^7.17.2" }, @@ -3117,13 +3111,14 @@ } }, "node_modules/@mui/material": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.9.3.tgz", - "integrity": "sha512-idDJajnfnDr+2pI6h2tzWtWoZJmVHNk6aSjISirMuVOGy0ugWpsCE+KW4++GS7aTCujXm9+cl5bWAyXvGjiPIQ==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.2.tgz", + "integrity": "sha512-ay43fuQLXROXkxFd6tqbj394Hu8BlbmpCdEDFtAisijulla2ZLfQa24pjhdX+56HrHReB3cZsf/sRq+DSfIgiA==", "dependencies": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.92", - "@mui/system": "^5.9.3", + "@mui/base": "5.0.0-alpha.94", + "@mui/core-downloads-tracker": "^5.10.2", + "@mui/system": "^5.10.2", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", "@types/react-transition-group": "^4.4.5", @@ -3186,12 +3181,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.7.tgz", - "integrity": "sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.2.tgz", + "integrity": "sha512-YqnptNQ2E0cWwOTmLCEvrddiiR/neUfn2AD/4TDUXZu8B2n7NfDb9d3bAUfWZV+KmulQdAedoaZDqyXBFGLdbQ==", "dependencies": { "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.9.3", + "@emotion/cache": "^11.10.1", "csstype": "^3.1.0", "prop-types": "^15.8.1" }, @@ -3217,13 +3212,13 @@ } }, "node_modules/@mui/system": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.9.3.tgz", - "integrity": "sha512-EXQV2POwncstHLYII+G4VSYdEFun1TjBbQSBDK76DbIkug8nPjtjAZ+3Kgk3/NoFIigW+vQ9cDVUZtlbRH6YMQ==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.2.tgz", + "integrity": "sha512-YudwJhLcEoQiwCAmzeMr9P3ISiVGNsxBIIPzFxaGwJ8+mMrx3qoPVOV2sfm0ZuNiQuABshEw4KqHa5ftNC+pOQ==", "dependencies": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.9.3", - "@mui/styled-engine": "^5.8.7", + "@mui/styled-engine": "^5.10.2", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", "clsx": "^1.2.1", @@ -3380,9 +3375,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3468,9 +3463,9 @@ "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==" }, "node_modules/@sinclair/typebox": { - "version": "0.24.26", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.26.tgz", - "integrity": "sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg==" + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==" }, "node_modules/@sinonjs/commons": { "version": "1.8.3", @@ -3634,6 +3629,21 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", @@ -3684,6 +3694,21 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@svgr/webpack": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", @@ -3707,9 +3732,9 @@ } }, "node_modules/@table-library/react-table-library": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-4.0.10.tgz", - "integrity": "sha512-BGuByIEGfnup59DPGxxg/d4YlSmHOzy1xIbmd6gKj3iBTNeSTlYOKWTsl3ZkWljjZwvbzMaKPA1brnVJwt0doA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-4.0.12.tgz", + "integrity": "sha512-TA4YCIysqdu94lgGafV8lWpLUtK/gqPZJE+YtZeGf+GHblS3M2v2yESDOVDP57bH/hL2fIwR0RLqgSzzYFQL7A==", "dependencies": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", @@ -3847,9 +3872,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.52.tgz", + "integrity": "sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -3863,9 +3888,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3930,19 +3955,19 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==" }, "node_modules/@types/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-fccbsHKqFDXClBZTDLA43zl0+TbxyIwyzIzwwhvoJvhNjOErCdeX2xJbURimv2EbSVUGav001PaCJg4mZxMl4w==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "18.6.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", - "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==" + "version": "18.7.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", + "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3950,9 +3975,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.4.tgz", - "integrity": "sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==" }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -3975,9 +4000,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "18.0.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", + "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4054,11 +4079,11 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "dependencies": { - "@types/mime": "*", + "@types/mime": "^1", "@types/node": "*" } }, @@ -4102,13 +4127,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", + "integrity": "sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw==", "dependencies": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/type-utils": "5.30.7", + "@typescript-eslint/utils": "5.30.7", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -4133,6 +4158,119 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", + "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -4148,11 +4286,11 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.32.0.tgz", - "integrity": "sha512-/x72MkqLAoOQSOHFxdm17irJ1PNDWtdrMmfacaYniGT26nibak8vxEf9xmoVE+yTYL8N77I2icPtw89Yx6HvNg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.6.tgz", + "integrity": "sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ==", "dependencies": { - "@typescript-eslint/utils": "5.32.0" + "@typescript-eslint/utils": "5.30.6" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4166,13 +4304,13 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.32.0.tgz", - "integrity": "sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz", + "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==", "dependencies": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", "debug": "^4.3.4" }, "engines": { @@ -4191,13 +4329,97 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4208,11 +4430,11 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz", + "integrity": "sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw==", "dependencies": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/utils": "5.30.7", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4232,10 +4454,137 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", + "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "dependencies": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4245,12 +4594,12 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", "dependencies": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4285,14 +4634,14 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -4328,11 +4677,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", "dependencies": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.30.6", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4508,9 +4857,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "bin": { "acorn": "bin/acorn" }, @@ -4879,9 +5228,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "funding": [ { "type": "opencollective", @@ -4893,8 +5242,8 @@ } ], "dependencies": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4911,11 +5260,11 @@ } }, "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==", "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/axios": { @@ -5103,6 +5452,21 @@ "npm": ">=6" } }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/babel-plugin-named-asset-import": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", @@ -5112,12 +5476,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "peerDependencies": { @@ -5125,11 +5489,11 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" }, "peerDependencies": { @@ -5137,11 +5501,11 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -5354,9 +5718,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", "funding": [ { "type": "opencollective", @@ -5368,10 +5732,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" }, "bin": { "browserslist": "cli.js" @@ -5472,9 +5836,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "version": "1.0.30001365", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz", + "integrity": "sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q==", "funding": [ { "type": "opencollective", @@ -5573,9 +5937,9 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "node_modules/clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dependencies": { "source-map": "~0.6.0" }, @@ -5815,9 +6179,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==", + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.4.tgz", + "integrity": "sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5825,11 +6189,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.4.tgz", + "integrity": "sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==", "dependencies": { - "browserslist": "^4.21.3", + "browserslist": "^4.21.1", "semver": "7.0.0" }, "funding": { @@ -5846,9 +6210,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", - "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.4.tgz", + "integrity": "sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5861,18 +6225,18 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", + "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.10.0" + "yaml": "^1.7.2" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/cross-spawn": { @@ -6675,9 +7039,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.208.tgz", - "integrity": "sha512-diMr4t69FigAGUk2KovP0bygEtN/9AkqEVkzjEp0cu+zFFbZMVvwACpTTfuj1mAmFR5kNoSW8wGKDFWIvmThiQ==" + "version": "1.4.186", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.186.tgz", + "integrity": "sha512-YoVeFrGd/7ROjz4R9uPoND1K/hSRC/xADy9639ZmIZeJSaBnKdYx3I6LMPsY7CXLpK7JFgKQVzeZ/dk2br6Eaw==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6919,13 +7283,12 @@ } }, "node_modules/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", "dependencies": { "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -6935,17 +7298,14 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -7189,20 +7549,20 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", + "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", "dependencies": { - "@babel/runtime": "^7.18.9", + "@babel/runtime": "^7.18.3", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", + "axe-core": "^4.4.2", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", + "jsx-ast-utils": "^3.3.1", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" @@ -7280,9 +7640,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz", - "integrity": "sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz", + "integrity": "sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==", "dependencies": { "@typescript-eslint/utils": "^5.13.0" }, @@ -7397,9 +7757,9 @@ } }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz", + "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7521,9 +7881,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "dependencies": { "type-fest": "^0.20.2" }, @@ -7617,19 +7977,16 @@ } }, "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -8213,21 +8570,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8571,11 +8913,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" - }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -8937,9 +9274,9 @@ } }, "node_modules/idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", @@ -9440,9 +9777,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -10990,15 +11327,15 @@ } }, "node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz", + "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", "slash": "^3.0.0" }, "engines": { @@ -11014,12 +11351,12 @@ } }, "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -11028,11 +11365,11 @@ } }, "node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^28.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -11116,17 +11453,17 @@ } }, "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^28.1.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -11151,11 +11488,11 @@ } }, "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", "dependencies": { - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -11167,17 +11504,17 @@ } }, "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz", + "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "jest-util": "^28.1.1", "string-length": "^4.0.1" }, "engines": { @@ -11208,11 +11545,11 @@ } }, "node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", "dependencies": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^28.0.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" @@ -11553,9 +11890,9 @@ } }, "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", "engines": { "node": ">=0.10.0" } @@ -13338,6 +13675,21 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/postcss-loader/node_modules/semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -15032,9 +15384,9 @@ } }, "node_modules/rollup": { - "version": "2.77.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", - "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz", + "integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -15996,9 +16348,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tailwindcss": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", - "integrity": "sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", + "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==", "dependencies": { "arg": "^5.0.2", "chokidar": "^3.5.3", @@ -16009,7 +16361,7 @@ "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "lilconfig": "^2.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", @@ -16110,9 +16462,9 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -16377,6 +16729,21 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typesafe-i18n": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/typesafe-i18n/-/typesafe-i18n-5.12.0.tgz", + "integrity": "sha512-9QUVOZcxzRMhY3W7BJq0s87sSjXmHo9K9uyyrYPLxx5YWzDG7SgPJQ6XHvB7RXTkRrr6ixAIiqBS9uAaKJpmFg==", + "bin": { + "typesafe-i18n": "cli/typesafe-i18n.mjs" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ivanhofer" + }, + "peerDependencies": { + "typescript": ">=3.5.1" + } + }, "node_modules/typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -16487,9 +16854,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", "funding": [ { "type": "opencollective", @@ -16659,20 +17026,20 @@ } }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", + "acorn": "^8.4.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -16685,7 +17052,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "watchpack": "^2.3.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -16879,9 +17246,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "engines": { "node": ">=10.0.0" }, @@ -17064,26 +17431,26 @@ } }, "node_modules/workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", + "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" + "idb": "^6.1.4", + "workbox-core": "6.5.3" } }, "node_modules/workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", + "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz", + "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -17107,21 +17474,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" + "workbox-background-sync": "6.5.3", + "workbox-broadcast-update": "6.5.3", + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-google-analytics": "6.5.3", + "workbox-navigation-preload": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-range-requests": "6.5.3", + "workbox-recipes": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3", + "workbox-streams": "6.5.3", + "workbox-sw": "6.5.3", + "workbox-window": "6.5.3" }, "engines": { "node": ">=10.0.0" @@ -17212,117 +17579,117 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", + "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", + "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==" }, "node_modules/workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", + "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" + "idb": "^6.1.4", + "workbox-core": "6.5.3" } }, "node_modules/workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", + "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", "dependencies": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-background-sync": "6.5.3", + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "node_modules/workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", + "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", + "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "node_modules/workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", + "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz", + "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==", "dependencies": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "node_modules/workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", + "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", + "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", "dependencies": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", + "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", "dependencies": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3" } }, "node_modules/workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz", + "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==" }, "node_modules/workbox-webpack-plugin": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz", - "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.4" + "workbox-build": "6.5.3" }, "engines": { "node": ">=10.0.0" @@ -17349,12 +17716,12 @@ } }, "node_modules/workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz", + "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "node_modules/wrap-ansi": { @@ -17420,9 +17787,9 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", "engines": { "node": ">=8.3.0" }, @@ -17539,20 +17906,20 @@ "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" }, "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", + "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/generator": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helpers": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -17561,9 +17928,9 @@ } }, "@babel/eslint-parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", - "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", + "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", "requires": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -17592,11 +17959,11 @@ } }, "@babel/generator": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.7.tgz", + "integrity": "sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==", "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.18.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -17622,36 +17989,36 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", + "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" } }, "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", + "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", "requires": { - "@babel/compat-data": "^7.18.8", + "@babel/compat-data": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", + "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -17665,12 +18032,14 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -17678,9 +18047,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", + "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", @@ -17691,12 +18060,12 @@ } }, "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", + "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", "requires": { "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" } }, "@babel/helper-hoist-variables": { @@ -17708,11 +18077,11 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", + "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { @@ -17724,18 +18093,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.8.tgz", + "integrity": "sha512-che3jvZwIcZxrwh63VfnFTUzcAM9v/lznYkkRxIBGMPt1SudOKHAEec0SIRCfiuIzTcF7VGj/CaTT6gY4eWxvA==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.8", + "@babel/types": "^7.18.8" } }, "@babel/helper-optimise-call-expression": { @@ -17747,31 +18116,31 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", + "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-wrap-function": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", + "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-member-expression-to-functions": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helper-simple-access": { @@ -17783,11 +18152,11 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", + "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { @@ -17798,11 +18167,6 @@ "@babel/types": "^7.18.6" } }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" - }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", @@ -17814,24 +18178,24 @@ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz", - "integrity": "sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", + "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", "requires": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/helper-function-name": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", + "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", "requires": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/highlight": { @@ -17845,9 +18209,9 @@ } }, "@babel/parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.10.tgz", - "integrity": "sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==" + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.8.tgz", + "integrity": "sha512-RSKRfYX20dyH+elbJK2uqAkVyucL+xXzhqlMD5/ZXx+dAAwpyB7HsvnHe/ZUGOF+xLr5Wx9/JoXVTj6BQE2/oA==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -17858,23 +18222,23 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", + "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.6" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -17898,13 +18262,13 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.6.tgz", + "integrity": "sha512-gAdhsjaYmiZVxx5vTMiRfj31nB7LhwBJFMSLzeDxc7X4tKLixup0+k9ughn0RcpBrv9E3PBaXJW7jF5TCihAOg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/plugin-syntax-decorators": "^7.18.6" } @@ -17919,11 +18283,11 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", + "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -17937,11 +18301,11 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", + "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -17964,15 +18328,15 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", + "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/plugin-transform-parameters": "^7.18.6" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -17985,12 +18349,12 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", + "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -18218,42 +18582,42 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", + "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.8.tgz", + "integrity": "sha512-RySDoXdF6hgHSHuAW4aLGyVQdmvEX/iJtjVre52k0pxRq4hzqze+rAVP++NmNv596brBpYmaiKgTZby7ziBnVg==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", + "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", + "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-dotall-regex": { @@ -18266,11 +18630,11 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", + "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -18283,11 +18647,11 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz", - "integrity": "sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz", + "integrity": "sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-flow": "^7.18.6" } }, @@ -18300,21 +18664,21 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", + "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", + "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-member-expression-literals": { @@ -18347,13 +18711,13 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", + "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" } @@ -18410,11 +18774,11 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.9.tgz", - "integrity": "sha512-IrTYh1I3YCEL1trjknnlLKTp5JggjzhKl/d3ibzPc97JhpFcDTr38Jdek/oX4cFbS6By0bXJcOkpRvJ5ZHK2wQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz", + "integrity": "sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-display-name": { @@ -18426,15 +18790,15 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/types": "^7.18.6" } }, "@babel/plugin-transform-react-jsx-development": { @@ -18472,15 +18836,15 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz", + "integrity": "sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==", "requires": { "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "semver": "^6.3.0" } }, @@ -18493,12 +18857,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", + "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" } }, "@babel/plugin-transform-sticky-regex": { @@ -18510,37 +18874,37 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", + "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", + "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-typescript": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.10.tgz", - "integrity": "sha512-j2HQCJuMbi88QftIb5zlRu3c7PU+sXNnscqsrjqegoGiCgXR569pEdben9vly5QHKL2ilYkfnSwu64zsZo/VYQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz", + "integrity": "sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-typescript": "^7.18.6" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-unicode-regex": { @@ -18553,28 +18917,28 @@ } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", + "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/compat-data": "^7.18.6", + "@babel/helper-compilation-targets": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-export-namespace-from": "^7.18.6", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-object-rest-spread": "^7.18.6", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.6", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -18596,40 +18960,40 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-block-scoping": "^7.18.6", + "@babel/plugin-transform-classes": "^7.18.6", + "@babel/plugin-transform-computed-properties": "^7.18.6", + "@babel/plugin-transform-destructuring": "^7.18.6", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-duplicate-keys": "^7.18.6", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-for-of": "^7.18.6", + "@babel/plugin-transform-function-name": "^7.18.6", + "@babel/plugin-transform-literals": "^7.18.6", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-systemjs": "^7.18.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-parameters": "^7.18.6", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-spread": "^7.18.6", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-template-literals": "^7.18.6", + "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", + "@babel/types": "^7.18.6", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", "core-js-compat": "^3.22.1", "semver": "^6.3.0" } @@ -18670,55 +19034,54 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", + "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz", + "integrity": "sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==", "requires": { "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/traverse": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.10.tgz", - "integrity": "sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.8.tgz", + "integrity": "sha512-UNg/AcSySJYR/+mIcJQDCv00T+AqRO7j/ZEJLzpaYtgM48rMg5MnkJgyNqkzo88+p4tfRvZJCEiwwfG6h4jkRg==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", + "@babel/generator": "^7.18.7", + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-function-name": "^7.18.6", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10", + "@babel/parser": "^7.18.8", + "@babel/types": "^7.18.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.8.tgz", + "integrity": "sha512-qwpdsmraq0aJ3osLJRApsc2ouSJCdnMeZwB0DhbtHAtRpZNZCdlbRnHIgcRKzdE1g0iOGg644fzjOBcdOz9cPw==", "requires": { - "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } @@ -18858,9 +19221,9 @@ } }, "@emotion/cache": { - "version": "11.10.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.1.tgz", - "integrity": "sha512-uZTj3Yz5D69GE25iFZcIQtibnVCFsc/6+XIozyL3ycgWvEdif2uEw9wlUt6umjLr4Keg9K6xRPHmD8LGi+6p1A==", + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", + "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", "requires": { "@emotion/memoize": "^0.8.0", "@emotion/sheet": "^1.2.0", @@ -18967,9 +19330,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "requires": { "type-fest": "^0.20.2" } @@ -18990,20 +19353,15 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==" - }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -19326,11 +19684,11 @@ } }, "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", + "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", "requires": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.23.3" } }, "@jest/source-map": { @@ -19566,36 +19924,42 @@ "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" }, "@mui/base": { - "version": "5.0.0-alpha.92", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.92.tgz", - "integrity": "sha512-ZgnSLrTXL4iUdLQhjp01dAOTQPQlnwrqjZRwDT3E6LZXEYn6cMv1MY6LZkWcF/zxrUnyasnsyMAgZ5d8AXS7bA==", + "version": "5.0.0-alpha.94", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.94.tgz", + "integrity": "sha512-IJXmgTF07H1Iv5zjDV7zJZGUmb9cN8ERzd2dgA1akh6NWZgwyIGyQx+Au9+QSDoM5vN3FqZvU/0YCU6inUwgeQ==", "requires": { "@babel/runtime": "^7.17.2", - "@emotion/is-prop-valid": "^1.1.3", + "@emotion/is-prop-valid": "^1.2.0", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", - "@popperjs/core": "^2.11.5", + "@popperjs/core": "^2.11.6", "clsx": "^1.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" } }, + "@mui/core-downloads-tracker": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.2.tgz", + "integrity": "sha512-1guoGvL3QZ7VjA3y9zye9Rpm+jz18rVZIo3AauTGyW5ntDMxr/cR0M18nuc/NH2KqpMt+coh4NwPEO1uPuKM5w==" + }, "@mui/icons-material": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.8.4.tgz", - "integrity": "sha512-9Z/vyj2szvEhGWDvb+gG875bOGm8b8rlHBKOD1+nA3PcgC3fV6W1AU6pfOorPeBfH2X4mb9Boe97vHvaSndQvA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.10.2.tgz", + "integrity": "sha512-p7ku+43JeKRz0ONGzPZbRXZRbE7vCKP1Cr8l/Yj9sUIGVQ6CM/m37u6udacJZkDXD+G2FoxJPixrVvvjx6f64w==", "requires": { "@babel/runtime": "^7.17.2" } }, "@mui/material": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.9.3.tgz", - "integrity": "sha512-idDJajnfnDr+2pI6h2tzWtWoZJmVHNk6aSjISirMuVOGy0ugWpsCE+KW4++GS7aTCujXm9+cl5bWAyXvGjiPIQ==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.2.tgz", + "integrity": "sha512-ay43fuQLXROXkxFd6tqbj394Hu8BlbmpCdEDFtAisijulla2ZLfQa24pjhdX+56HrHReB3cZsf/sRq+DSfIgiA==", "requires": { "@babel/runtime": "^7.17.2", - "@mui/base": "5.0.0-alpha.92", - "@mui/system": "^5.9.3", + "@mui/base": "5.0.0-alpha.94", + "@mui/core-downloads-tracker": "^5.10.2", + "@mui/system": "^5.10.2", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", "@types/react-transition-group": "^4.4.5", @@ -19617,24 +19981,24 @@ } }, "@mui/styled-engine": { - "version": "5.8.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.8.7.tgz", - "integrity": "sha512-tVqtowjbYmiRq+qcqXK731L9eWoL9H8xTRhuTgaDGKdch1zlt4I2UwInUe1w2N9N/u3/jHsFbLcl1Un3uOwpQg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.2.tgz", + "integrity": "sha512-YqnptNQ2E0cWwOTmLCEvrddiiR/neUfn2AD/4TDUXZu8B2n7NfDb9d3bAUfWZV+KmulQdAedoaZDqyXBFGLdbQ==", "requires": { "@babel/runtime": "^7.17.2", - "@emotion/cache": "^11.9.3", + "@emotion/cache": "^11.10.1", "csstype": "^3.1.0", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.9.3.tgz", - "integrity": "sha512-EXQV2POwncstHLYII+G4VSYdEFun1TjBbQSBDK76DbIkug8nPjtjAZ+3Kgk3/NoFIigW+vQ9cDVUZtlbRH6YMQ==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.2.tgz", + "integrity": "sha512-YudwJhLcEoQiwCAmzeMr9P3ISiVGNsxBIIPzFxaGwJ8+mMrx3qoPVOV2sfm0ZuNiQuABshEw4KqHa5ftNC+pOQ==", "requires": { "@babel/runtime": "^7.17.2", "@mui/private-theming": "^5.9.3", - "@mui/styled-engine": "^5.8.7", + "@mui/styled-engine": "^5.10.2", "@mui/types": "^7.1.5", "@mui/utils": "^5.9.3", "clsx": "^1.2.1", @@ -19707,9 +20071,9 @@ } }, "@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@rollup/plugin-babel": { "version": "5.3.1", @@ -19765,9 +20129,9 @@ "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==" }, "@sinclair/typebox": { - "version": "0.24.26", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.26.tgz", - "integrity": "sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg==" + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", + "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==" }, "@sinonjs/commons": { "version": "1.8.3", @@ -19859,6 +20223,20 @@ "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } } }, "@svgr/hast-util-to-babel-ast": { @@ -19888,6 +20266,20 @@ "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", "svgo": "^1.2.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } } }, "@svgr/webpack": { @@ -19906,9 +20298,9 @@ } }, "@table-library/react-table-library": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-4.0.10.tgz", - "integrity": "sha512-BGuByIEGfnup59DPGxxg/d4YlSmHOzy1xIbmd6gKj3iBTNeSTlYOKWTsl3ZkWljjZwvbzMaKPA1brnVJwt0doA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@table-library/react-table-library/-/react-table-library-4.0.12.tgz", + "integrity": "sha512-TA4YCIysqdu94lgGafV8lWpLUtK/gqPZJE+YtZeGf+GHblS3M2v2yESDOVDP57bH/hL2fIwR0RLqgSzzYFQL7A==", "requires": { "clsx": "1.1.1", "react-virtualized-auto-sizer": "1.0.6", @@ -20028,9 +20420,9 @@ } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "0.0.52", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.52.tgz", + "integrity": "sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ==" }, "@types/express": { "version": "4.17.13", @@ -20044,9 +20436,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -20111,19 +20503,19 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==" + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==" }, "@types/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-fccbsHKqFDXClBZTDLA43zl0+TbxyIwyzIzwwhvoJvhNjOErCdeX2xJbURimv2EbSVUGav001PaCJg4mZxMl4w==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "18.6.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", - "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==" + "version": "18.7.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.13.tgz", + "integrity": "sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==" }, "@types/parse-json": { "version": "4.0.0", @@ -20131,9 +20523,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.4.tgz", - "integrity": "sha512-fOwvpvQYStpb/zHMx0Cauwywu9yLDmzWiiQBC7gJyq5tYLUXFZvDG7VK1B7WBxxjBJNKFOZ0zLoOQn8vmATbhw==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz", + "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==" }, "@types/prop-types": { "version": "15.7.5", @@ -20156,9 +20548,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "18.0.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.17.tgz", + "integrity": "sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -20235,11 +20627,11 @@ } }, "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", "requires": { - "@types/mime": "*", + "@types/mime": "^1", "@types/node": "*" } }, @@ -20283,13 +20675,13 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz", - "integrity": "sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.7.tgz", + "integrity": "sha512-l4L6Do+tfeM2OK0GJsU7TUcM/1oN/N25xHm3Jb4z3OiDU4Lj8dIuxX9LpVMS9riSXQs42D1ieX7b85/r16H9Fw==", "requires": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/type-utils": "5.32.0", - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/type-utils": "5.30.7", + "@typescript-eslint/utils": "5.30.7", "debug": "^4.3.4", "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", @@ -20298,6 +20690,70 @@ "tsutils": "^3.21.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + } + }, + "@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", + "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -20309,55 +20765,176 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.32.0.tgz", - "integrity": "sha512-/x72MkqLAoOQSOHFxdm17irJ1PNDWtdrMmfacaYniGT26nibak8vxEf9xmoVE+yTYL8N77I2icPtw89Yx6HvNg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.30.6.tgz", + "integrity": "sha512-bqvT+0L8IjtW7MCrMgm9oVNxs4g7mESro1mm5c1/SNfTnHuFTf9OUX1WzVkTz75M9cp//UrTrSmGvK48NEKshQ==", "requires": { - "@typescript-eslint/utils": "5.32.0" + "@typescript-eslint/utils": "5.30.6" } }, "@typescript-eslint/parser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.32.0.tgz", - "integrity": "sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz", + "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==", "requires": { - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + } + }, + "@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/scope-manager": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.32.0.tgz", - "integrity": "sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz", + "integrity": "sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g==", "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0" + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6" } }, "@typescript-eslint/type-utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz", - "integrity": "sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==", + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.7.tgz", + "integrity": "sha512-nD5qAE2aJX/YLyKMvOU5jvJyku4QN5XBVsoTynFrjQZaDgDV6i7QHFiYCx10wvn7hFvfuqIRNBtsgaLe0DbWhw==", "requires": { - "@typescript-eslint/utils": "5.32.0", + "@typescript-eslint/utils": "5.30.7", "debug": "^4.3.4", "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz", + "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7" + } + }, + "@typescript-eslint/types": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz", + "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz", + "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/visitor-keys": "5.30.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.7.tgz", + "integrity": "sha512-Z3pHdbFw+ftZiGUnm1GZhkJgVqsDL5CYW2yj+TB2mfXDFOMqtbzQi2dNJIyPqPbx9mv2kUxS1gU+r2gKlKi1rQ==", + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.7", + "@typescript-eslint/types": "5.30.7", + "@typescript-eslint/typescript-estree": "5.30.7", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.7", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz", + "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==", + "requires": { + "@typescript-eslint/types": "5.30.7", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/types": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.32.0.tgz", - "integrity": "sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==" + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.6.tgz", + "integrity": "sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg==" }, "@typescript-eslint/typescript-estree": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.32.0.tgz", - "integrity": "sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz", + "integrity": "sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A==", "requires": { - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/visitor-keys": "5.32.0", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/visitor-keys": "5.30.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -20376,14 +20953,14 @@ } }, "@typescript-eslint/utils": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.32.0.tgz", - "integrity": "sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.6.tgz", + "integrity": "sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA==", "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.32.0", - "@typescript-eslint/types": "5.32.0", - "@typescript-eslint/typescript-estree": "5.32.0", + "@typescript-eslint/scope-manager": "5.30.6", + "@typescript-eslint/types": "5.30.6", + "@typescript-eslint/typescript-estree": "5.30.6", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -20405,11 +20982,11 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.32.0.tgz", - "integrity": "sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==", + "version": "5.30.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz", + "integrity": "sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA==", "requires": { - "@typescript-eslint/types": "5.32.0", + "@typescript-eslint/types": "5.30.6", "eslint-visitor-keys": "^3.3.0" } }, @@ -20575,9 +21152,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-globals": { "version": "6.0.0", @@ -20843,12 +21420,12 @@ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" }, "autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "requires": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -20856,9 +21433,9 @@ } }, "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==" + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz", + "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==" }, "axios": { "version": "0.27.2", @@ -20996,6 +21573,20 @@ "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } } }, "babel-plugin-named-asset-import": { @@ -21005,30 +21596,30 @@ "requires": {} }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "babel-plugin-transform-react-remove-prop-types": { @@ -21209,14 +21800,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", + "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001359", + "electron-to-chromium": "^1.4.172", + "node-releases": "^2.0.5", + "update-browserslist-db": "^1.0.4" } }, "bser": { @@ -21287,9 +21878,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==" + "version": "1.0.30001365", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001365.tgz", + "integrity": "sha512-VDQZ8OtpuIPMBA4YYvZXECtXbddMCUFJk1qu8Mqxfm/SZJNSr1cy4IuLCOL7RJ/YASrvJcYg1Zh+UEUQ5m6z8Q==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -21354,9 +21945,9 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" }, "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "requires": { "source-map": "~0.6.0" }, @@ -21545,16 +22136,16 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "core-js": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.24.1.tgz", - "integrity": "sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==" + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.23.4.tgz", + "integrity": "sha512-vjsKqRc1RyAJC3Ye2kYqgfdThb3zYnx9CrqoCcjMOENMtQPC7ZViBvlDxwYU/2z2NI/IPuiXw5mT4hWhddqjzQ==" }, "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.4.tgz", + "integrity": "sha512-RkSRPe+JYEoflcsuxJWaiMPhnZoFS51FcIxm53k4KzhISCBTmaGlto9dTIrYuk0hnJc3G6pKufAKepHnBq6B6Q==", "requires": { - "browserslist": "^4.21.3", + "browserslist": "^4.21.1", "semver": "7.0.0" }, "dependencies": { @@ -21566,9 +22157,9 @@ } }, "core-js-pure": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", - "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==" + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.23.4.tgz", + "integrity": "sha512-lizxkcgj3XDmi7TUBFe+bQ1vNpD5E4t76BrBWI3HdUxdw/Mq1VF4CkiHzIKyieECKtcODK2asJttoofEeUKICQ==" }, "core-util-is": { "version": "1.0.3", @@ -21576,15 +22167,15 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", + "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.10.0" + "yaml": "^1.7.2" } }, "cross-spawn": { @@ -22151,9 +22742,9 @@ } }, "electron-to-chromium": { - "version": "1.4.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.208.tgz", - "integrity": "sha512-diMr4t69FigAGUk2KovP0bygEtN/9AkqEVkzjEp0cu+zFFbZMVvwACpTTfuj1mAmFR5kNoSW8wGKDFWIvmThiQ==" + "version": "1.4.186", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.186.tgz", + "integrity": "sha512-YoVeFrGd/7ROjz4R9uPoND1K/hSRC/xADy9639ZmIZeJSaBnKdYx3I6LMPsY7CXLpK7JFgKQVzeZ/dk2br6Eaw==" }, "emittery": { "version": "0.8.1", @@ -22334,13 +22925,12 @@ } }, "eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", "requires": { "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -22350,17 +22940,14 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", + "espree": "^9.3.2", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -22433,9 +23020,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.16.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", + "integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "requires": { "type-fest": "^0.20.2" } @@ -22657,20 +23244,20 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.0.tgz", + "integrity": "sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==", "requires": { - "@babel/runtime": "^7.18.9", + "@babel/runtime": "^7.18.3", "aria-query": "^4.2.2", "array-includes": "^3.1.5", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", + "axe-core": "^4.4.2", "axobject-query": "^2.2.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", + "jsx-ast-utils": "^3.3.1", "language-tags": "^1.0.5", "minimatch": "^3.1.2", "semver": "^6.3.0" @@ -22724,9 +23311,9 @@ "requires": {} }, "eslint-plugin-testing-library": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz", - "integrity": "sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz", + "integrity": "sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==", "requires": { "@typescript-eslint/utils": "^5.13.0" } @@ -22797,9 +23384,9 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz", + "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -22833,11 +23420,11 @@ } }, "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "requires": { - "acorn": "^8.8.0", + "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -23263,18 +23850,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -23512,11 +24087,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" - }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -23786,9 +24356,9 @@ "requires": {} }, "idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/idb/-/idb-6.1.5.tgz", + "integrity": "sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==" }, "identity-obj-proxy": { "version": "3.0.0", @@ -24127,9 +24697,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -25251,15 +25821,15 @@ }, "dependencies": { "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz", + "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==", "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", + "jest-message-util": "^28.1.1", + "jest-util": "^28.1.1", "slash": "^3.0.0" }, "dependencies": { @@ -25271,22 +25841,22 @@ } }, "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz", + "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==", "requires": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^28.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -25343,17 +25913,17 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz", + "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==", "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", + "pretty-format": "^28.1.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -25371,11 +25941,11 @@ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==" }, "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", "requires": { - "@jest/types": "^28.1.3", + "@jest/types": "^28.1.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -25384,17 +25954,17 @@ } }, "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz", + "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==", "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", + "@jest/test-result": "^28.1.1", + "@jest/types": "^28.1.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.10.2", - "jest-util": "^28.1.3", + "jest-util": "^28.1.1", "string-length": "^4.0.1" }, "dependencies": { @@ -25418,11 +25988,11 @@ } }, "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz", + "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==", "requires": { - "@jest/schemas": "^28.1.3", + "@jest/schemas": "^28.0.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" @@ -25671,9 +26241,9 @@ } }, "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==" }, "jsx-ast-utils": { "version": "3.3.2", @@ -26847,6 +27417,18 @@ "semver": "^7.3.5" }, "dependencies": { + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, "semver": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", @@ -28004,9 +28586,9 @@ } }, "rollup": { - "version": "2.77.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", - "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", + "version": "2.76.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.76.0.tgz", + "integrity": "sha512-9jwRIEY1jOzKLj3nsY/yot41r19ITdQrhs+q3ggNWhr9TQgduHqANvPpS32RNpzGklJu3G1AJfvlZLi/6wFgWA==", "requires": { "fsevents": "~2.3.2" } @@ -28746,9 +29328,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "tailwindcss": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", - "integrity": "sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.6.tgz", + "integrity": "sha512-7skAOY56erZAFQssT1xkpk+kWt2NrO45kORlxFPXUt3CiGsVPhH1smuH5XoDH6sGPXLyBv+zgCKA2HWBsgCytg==", "requires": { "arg": "^5.0.2", "chokidar": "^3.5.3", @@ -28759,7 +29341,7 @@ "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "lilconfig": "^2.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", @@ -28827,9 +29409,9 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", + "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -29024,6 +29606,12 @@ "is-typedarray": "^1.0.0" } }, + "typesafe-i18n": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/typesafe-i18n/-/typesafe-i18n-5.12.0.tgz", + "integrity": "sha512-9QUVOZcxzRMhY3W7BJq0s87sSjXmHo9K9uyyrYPLxx5YWzDG7SgPJQ6XHvB7RXTkRrr6ixAIiqBS9uAaKJpmFg==", + "requires": {} + }, "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", @@ -29099,9 +29687,9 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", + "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -29230,20 +29818,20 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", + "acorn": "^8.4.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -29256,7 +29844,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "watchpack": "^2.3.1", "webpack-sources": "^3.2.3" }, "dependencies": { @@ -29402,9 +29990,9 @@ } }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "requires": {} } } @@ -29518,26 +30106,26 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workbox-background-sync": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz", - "integrity": "sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz", + "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==", "requires": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" + "idb": "^6.1.4", + "workbox-core": "6.5.3" } }, "workbox-broadcast-update": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz", - "integrity": "sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz", + "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-build": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.4.tgz", - "integrity": "sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz", + "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==", "requires": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -29561,21 +30149,21 @@ "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.5.4", - "workbox-broadcast-update": "6.5.4", - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-google-analytics": "6.5.4", - "workbox-navigation-preload": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-range-requests": "6.5.4", - "workbox-recipes": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4", - "workbox-streams": "6.5.4", - "workbox-sw": "6.5.4", - "workbox-window": "6.5.4" + "workbox-background-sync": "6.5.3", + "workbox-broadcast-update": "6.5.3", + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-google-analytics": "6.5.3", + "workbox-navigation-preload": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-range-requests": "6.5.3", + "workbox-recipes": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3", + "workbox-streams": "6.5.3", + "workbox-sw": "6.5.3", + "workbox-window": "6.5.3" }, "dependencies": { "@apideck/better-ajv-errors": { @@ -29649,117 +30237,117 @@ } }, "workbox-cacheable-response": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz", - "integrity": "sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz", + "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-core": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.4.tgz", - "integrity": "sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz", + "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==" }, "workbox-expiration": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.4.tgz", - "integrity": "sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz", + "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==", "requires": { - "idb": "^7.0.1", - "workbox-core": "6.5.4" + "idb": "^6.1.4", + "workbox-core": "6.5.3" } }, "workbox-google-analytics": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz", - "integrity": "sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz", + "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==", "requires": { - "workbox-background-sync": "6.5.4", - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-background-sync": "6.5.3", + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "workbox-navigation-preload": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz", - "integrity": "sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz", + "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-precaching": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.4.tgz", - "integrity": "sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz", + "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==", "requires": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "workbox-range-requests": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz", - "integrity": "sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz", + "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-recipes": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.4.tgz", - "integrity": "sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz", + "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==", "requires": { - "workbox-cacheable-response": "6.5.4", - "workbox-core": "6.5.4", - "workbox-expiration": "6.5.4", - "workbox-precaching": "6.5.4", - "workbox-routing": "6.5.4", - "workbox-strategies": "6.5.4" + "workbox-cacheable-response": "6.5.3", + "workbox-core": "6.5.3", + "workbox-expiration": "6.5.3", + "workbox-precaching": "6.5.3", + "workbox-routing": "6.5.3", + "workbox-strategies": "6.5.3" } }, "workbox-routing": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.4.tgz", - "integrity": "sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz", + "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-strategies": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.4.tgz", - "integrity": "sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz", + "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==", "requires": { - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "workbox-streams": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.4.tgz", - "integrity": "sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz", + "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==", "requires": { - "workbox-core": "6.5.4", - "workbox-routing": "6.5.4" + "workbox-core": "6.5.3", + "workbox-routing": "6.5.3" } }, "workbox-sw": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.4.tgz", - "integrity": "sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz", + "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==" }, "workbox-webpack-plugin": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz", - "integrity": "sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==", "requires": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", - "workbox-build": "6.5.4" + "workbox-build": "6.5.3" }, "dependencies": { "source-map": { @@ -29779,12 +30367,12 @@ } }, "workbox-window": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.4.tgz", - "integrity": "sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz", + "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==", "requires": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.5.4" + "workbox-core": "6.5.3" } }, "wrap-ansi": { @@ -29837,9 +30425,9 @@ } }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", + "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", "requires": {} }, "xml-name-validator": { diff --git a/interface/package.json b/interface/package.json index bb954293f..f98843217 100644 --- a/interface/package.json +++ b/interface/package.json @@ -1,18 +1,18 @@ { "name": "EMS-ESP", - "version": "3.4.0", + "version": "3.5.0", "private": true, "proxy": "http://localhost:3080", "dependencies": { "@emotion/react": "^11.10.0", "@emotion/styled": "^11.10.0", "@msgpack/msgpack": "^2.7.2", - "@mui/icons-material": "^5.8.4", - "@mui/material": "^5.9.3", - "@table-library/react-table-library": "4.0.10", - "@types/lodash": "^4.14.182", - "@types/node": "^18.6.3", - "@types/react": "^18.0.15", + "@mui/icons-material": "^5.10.2", + "@mui/material": "^5.10.2", + "@table-library/react-table-library": "4.0.12", + "@types/lodash": "^4.14.184", + "@types/node": "^18.7.13", + "@types/react": "^18.0.17", "@types/react-dom": "^18.0.6", "@types/react-router-dom": "^5.3.3", "async-validator": "^4.2.5", @@ -30,6 +30,7 @@ "react-router-dom": "^6.3.0", "react-scripts": "5.0.1", "sockette": "^2.0.6", + "typesafe-i18n": "^5.12.0", "typescript": "^4.7.4" }, "scripts": { @@ -41,8 +42,9 @@ "build-hosted": "env-cmd -f .env.hosted npm run build", "build-localhost": "PUBLIC_URL=/ react-app-rewired build", "mock-api": "nodemon --watch ../mock-api ../mock-api/server.js", - "standalone": "npm-run-all -p start mock-api", - "lint": "eslint . --ext .ts,.tsx" + "standalone": "npm-run-all -p start typesafe-i18n mock-api", + "lint": "eslint . --ext .ts,.tsx", + "typesafe-i18n": "typesafe-i18n" }, "eslintConfig": { "extends": [ diff --git a/interface/src/App.tsx b/interface/src/App.tsx index 6427f07f9..d18e86252 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,4 +1,4 @@ -import { FC, createRef, createContext, useContext, RefObject } from 'react'; +import { FC, createRef, createContext, useContext, useEffect, useState, RefObject } from 'react'; import { SnackbarProvider } from 'notistack'; import { IconButton } from '@mui/material'; @@ -9,6 +9,13 @@ import { FeaturesLoader } from './contexts/features'; import CustomTheme from './CustomTheme'; import AppRouting from './AppRouting'; +import { localStorageDetector } from 'typesafe-i18n/detectors'; +import TypesafeI18n from './i18n/i18n-react'; +import { detectLocale } from './i18n/i18n-util'; +import { loadLocaleAsync } from './i18n/i18n-util.async'; + +const detectedLocale = detectLocale(localStorageDetector); + const App: FC = () => { const notistackRef: RefObject = createRef(); @@ -20,24 +27,34 @@ const App: FC = () => { const colorMode = useContext(ColorModeContext); + const [wasLoaded, setWasLoaded] = useState(false); + + useEffect(() => { + loadLocaleAsync(detectedLocale).then(() => setWasLoaded(true)); + }, []); + + if (!wasLoaded) return null; + return ( - - ( - - - - )} - > - - - - - + + + ( + + + + )} + > + + + + + + ); }; diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index 4861c715d..eac179b57 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -2,6 +2,8 @@ import { FC, useContext, useEffect } from 'react'; import { Navigate, Routes, Route, useLocation } from 'react-router-dom'; import { useSnackbar, VariantType } from 'notistack'; +import { useI18nContext } from './i18n/i18n-react'; + import { Authentication, AuthenticationContext } from './contexts/authentication'; import { FeaturesContext } from './contexts/features'; import { RequireAuthenticated, RequireUnauthenticated } from './components'; @@ -41,13 +43,14 @@ export const RemoveTrailingSlashes = () => { const AppRouting: FC = () => { const { features } = useContext(FeaturesContext); + const { LL } = useI18nContext(); return ( - } /> - } /> + } /> + } /> {features.security && ( { const authenticationContext = useContext(AuthenticationContext); const { enqueueSnackbar } = useSnackbar(); @@ -31,6 +36,9 @@ const SignIn: FC = () => { const validateAndSignIn = async () => { setProcessing(true); + SIGN_IN_REQUEST_VALIDATOR.messages({ + required: '%s ' + LL.IS_REQUIRED() + }); try { await validate(SIGN_IN_REQUEST_VALIDATOR, signInRequest); signIn(); @@ -47,7 +55,7 @@ const SignIn: FC = () => { } catch (error: unknown) { if (error instanceof AxiosError) { if (error.response?.status === 401) { - enqueueSnackbar('Invalid login details', { variant: 'warning' }); + enqueueSnackbar(LL.INVALID_LOGIN(), { variant: 'warning' }); } } else { enqueueSnackbar(extractErrorMessage(error, 'Unexpected error, please try again'), { variant: 'error' }); @@ -58,6 +66,15 @@ const SignIn: FC = () => { const submitOnEnter = onEnterCallback(signIn); + const { locale, LL, setLocale } = useContext(I18nContext); + + const onLocaleSelected: ChangeEventHandler = async ({ target }) => { + const loc = target.value as Locales; + localStorage.setItem('lang', loc); + await loadLocaleAsync(loc); + setLocale(loc); + }; + return ( { })} > {PROJECT_NAME} + + + {locales.map((loc) => ( + + {loc} + + ))} + + { disabled={processing} type="password" name="password" - label="Password" + label={LL.PASSWORD()} value={signInRequest.password} onChange={updateLoginRequestValue} onKeyDown={submitOnEnter} @@ -107,7 +146,7 @@ const SignIn: FC = () => { /> - Sign In + {LL.SIGN_IN()} diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx index f3e1bfb6d..502f78f0d 100644 --- a/interface/src/components/layout/LayoutMenu.tsx +++ b/interface/src/components/layout/LayoutMenu.tsx @@ -15,9 +15,12 @@ import ProjectMenu from '../../project/ProjectMenu'; import LayoutMenuItem from './LayoutMenuItem'; import { AuthenticatedContext } from '../../contexts/authentication'; +import { useI18nContext } from '../../i18n/i18n-react'; + const LayoutMenu: FC = () => { const { features } = useContext(FeaturesContext); const authenticatedContext = useContext(AuthenticatedContext); + const { LL } = useI18nContext(); return ( <> @@ -28,11 +31,11 @@ const LayoutMenu: FC = () => { )} - + - {features.ntp && } + {features.ntp && } {features.mqtt && } - + diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index a1310e894..7bb3c87cf 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -2,6 +2,8 @@ import { FC, useCallback, useContext, useEffect, useState } from 'react'; import { useSnackbar } from 'notistack'; import { useNavigate } from 'react-router-dom'; +import { useI18nContext } from '../../i18n/i18n-react'; + import * as AuthenticationApi from '../../api/authentication'; import { ACCESS_TOKEN } from '../../api/endpoints'; import { RequiredChildrenProps } from '../../utils'; @@ -12,6 +14,8 @@ import { AuthenticationContext } from './context'; const Authentication: FC = ({ children }) => { const { features } = useContext(FeaturesContext); + const { LL } = useI18nContext(); + const navigate = useNavigate(); const { enqueueSnackbar } = useSnackbar(); @@ -23,7 +27,7 @@ const Authentication: FC = ({ children }) => { AuthenticationApi.getStorage().setItem(ACCESS_TOKEN, accessToken); const decodedMe = AuthenticationApi.decodeMeJWT(accessToken); setMe(decodedMe); - enqueueSnackbar(`Logged in as ${decodedMe.username}`, { variant: 'success' }); + enqueueSnackbar(LL.LOGGED_IN({ name: decodedMe.username }), { variant: 'success' }); } catch (error: unknown) { setMe(undefined); throw new Error('Failed to parse JWT'); diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index fe4f59fd8..9997fb77b 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -1,7 +1,7 @@ import { FC, useState } from 'react'; import { ValidateFieldsError } from 'async-validator'; -import { Button, Checkbox, MenuItem, Grid, Typography } from '@mui/material'; +import { Button, Checkbox, MenuItem, Grid, Typography, InputAdornment } from '@mui/material'; import SaveIcon from '@mui/icons-material/Save'; import { MQTT_SETTINGS_VALIDATOR, validate } from '../../validators'; @@ -129,7 +129,10 @@ const MqttSettingsForm: FC = () => { seconds + }} fullWidth variant="outlined" value={numberValue(data.keep_alive)} @@ -149,7 +152,7 @@ const MqttSettingsForm: FC = () => { margin="normal" select > - 0 (default) + 0 1 2 @@ -227,7 +230,7 @@ const MqttSettingsForm: FC = () => { )} - Publish Intervals (in seconds, 0=automatic) + Publish Intervals (0=auto) @@ -235,6 +238,9 @@ const MqttSettingsForm: FC = () => { fieldErrors={fieldErrors} name="publish_time_boiler" label="Boilers and Heat Pumps" + InputProps={{ + endAdornment: seconds + }} fullWidth variant="outlined" value={numberValue(data.publish_time_boiler)} @@ -248,6 +254,9 @@ const MqttSettingsForm: FC = () => { fieldErrors={fieldErrors} name="publish_time_thermostat" label="Thermostats" + InputProps={{ + endAdornment: seconds + }} fullWidth variant="outlined" value={numberValue(data.publish_time_thermostat)} @@ -261,6 +270,9 @@ const MqttSettingsForm: FC = () => { fieldErrors={fieldErrors} name="publish_time_solar" label="Solar Modules" + InputProps={{ + endAdornment: seconds + }} fullWidth variant="outlined" value={numberValue(data.publish_time_solar)} @@ -274,6 +286,9 @@ const MqttSettingsForm: FC = () => { fieldErrors={fieldErrors} name="publish_time_mixer" label="Mixer Modules" + InputProps={{ + endAdornment: seconds + }} fullWidth variant="outlined" value={numberValue(data.publish_time_mixer)} @@ -287,6 +302,9 @@ const MqttSettingsForm: FC = () => { fieldErrors={fieldErrors} name="publish_time_sensor" label="Temperature Sensors" + InputProps={{ + endAdornment: seconds + }} fullWidth variant="outlined" value={numberValue(data.publish_time_sensor)} @@ -299,6 +317,9 @@ const MqttSettingsForm: FC = () => { seconds + }} label="Default" fullWidth variant="outlined" diff --git a/interface/src/framework/network/NetworkConnection.tsx b/interface/src/framework/network/NetworkConnection.tsx index 27bf6d8cb..b069eb45f 100644 --- a/interface/src/framework/network/NetworkConnection.tsx +++ b/interface/src/framework/network/NetworkConnection.tsx @@ -11,12 +11,16 @@ import NetworkStatusForm from './NetworkStatusForm'; import WiFiNetworkScanner from './WiFiNetworkScanner'; import NetworkSettingsForm from './NetworkSettingsForm'; +import { useI18nContext } from '../../i18n/i18n-react'; + const NetworkConnection: FC = () => { - useLayoutTitle('Network Connection'); + const { LL } = useI18nContext(); + useLayoutTitle(LL.NETWORK_CONNECTION()); + + const { routerTab } = useRouterTab(); const authenticatedContext = useContext(AuthenticatedContext); const navigate = useNavigate(); - const { routerTab } = useRouterTab(); const [selectedNetwork, setSelectedNetwork] = useState(); diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index c1221713d..3c67d4b1c 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -10,7 +10,8 @@ import { ListItemAvatar, ListItemSecondaryAction, ListItemText, - Typography + Typography, + InputAdornment } from '@mui/material'; import LockOpenIcon from '@mui/icons-material/LockOpen'; @@ -135,7 +136,10 @@ const WiFiSettingsForm: FC = () => { dBm + }} fullWidth variant="outlined" value={numberValue(data.tx_power)} diff --git a/interface/src/framework/ntp/NetworkTime.tsx b/interface/src/framework/ntp/NetworkTime.tsx index 309edff75..b58fdbb9d 100644 --- a/interface/src/framework/ntp/NetworkTime.tsx +++ b/interface/src/framework/ntp/NetworkTime.tsx @@ -9,8 +9,11 @@ import { AuthenticatedContext } from '../../contexts/authentication'; import NTPStatusForm from './NTPStatusForm'; import NTPSettingsForm from './NTPSettingsForm'; +import { useI18nContext } from '../../i18n/i18n-react'; + const NetworkTime: FC = () => { - useLayoutTitle('Network Time'); + const { LL } = useI18nContext(); + useLayoutTitle(LL.NETWORK_TIME()); const authenticatedContext = useContext(AuthenticatedContext); const { routerTab } = useRouterTab(); diff --git a/interface/src/framework/security/Security.tsx b/interface/src/framework/security/Security.tsx index f4f892407..1615c8e76 100644 --- a/interface/src/framework/security/Security.tsx +++ b/interface/src/framework/security/Security.tsx @@ -8,8 +8,11 @@ import { RouterTabs, useRouterTab, useLayoutTitle } from '../../components'; import SecuritySettingsForm from './SecuritySettingsForm'; import ManageUsersForm from './ManageUsersForm'; +import { useI18nContext } from '../../i18n/i18n-react'; + const Security: FC = () => { - useLayoutTitle('Security'); + const { LL } = useI18nContext(); + useLayoutTitle(LL.SECURITY()); const { routerTab } = useRouterTab(); diff --git a/interface/src/framework/system/GeneralFileUpload.tsx b/interface/src/framework/system/GeneralFileUpload.tsx index d634a7f11..aa41d1e91 100644 --- a/interface/src/framework/system/GeneralFileUpload.tsx +++ b/interface/src/framework/system/GeneralFileUpload.tsx @@ -72,7 +72,7 @@ const GeneralFileUpload: FC = ({ uploadGeneralFile }) => { {!uploading && ( - Upload a new firmware (.bin) file, settings or customizations (.json) file below. + Upload a new firmware (.bin) file, settings or customizations (.json) file below )} @@ -86,7 +86,7 @@ const GeneralFileUpload: FC = ({ uploadGeneralFile }) => { Download the application settings. Be careful when sharing your settings as this file contains passwords - and other sensitive system information. + and other sensitive system information @@ -521,15 +530,15 @@ const DashboardData: FC = () => { offset: sensor.o }); if (response.status === 204) { - enqueueSnackbar('Sensor change failed', { variant: 'error' }); + enqueueSnackbar(LL.TEMP_SENSOR({ cmd: 'change failed' }), { variant: 'error' }); } else if (response.status === 403) { - enqueueSnackbar('Access denied', { variant: 'error' }); + enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); } else { - enqueueSnackbar('Sensor updated', { variant: 'success' }); + enqueueSnackbar(LL.TEMP_SENSOR({ cmd: 'removed' }), { variant: 'success' }); } setSensor(undefined); } catch (error: unknown) { - enqueueSnackbar(extractErrorMessage(error, 'Problem updating sensor'), { variant: 'error' }); + enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); } finally { setSensor(undefined); fetchSensorData(); @@ -581,7 +590,7 @@ const DashboardData: FC = () => { onClick={() => setSensor(undefined)} color="secondary" > - Cancel + {LL.CANCEL()} @@ -640,17 +649,20 @@ const DashboardData: FC = () => { const renderCoreData = () => ( - {!coreData.connected && } - {coreData.connected && coreData.devices.length === 0 && } + {!coreData.connected && } + {coreData.connected && coreData.devices.length === 0 && ( + + )} + {(tableList: any) => ( <>
- TYPE - DESCRIPTION - ENTITIES + {LL.TYPE()} + {LL.DESCRIPTION()} + {LL.ENTITIES()}
@@ -676,7 +688,7 @@ const DashboardData: FC = () => { Sensors - Attached EMS-ESP Sensors + {LL.ATTACHED_SENSORS()} {coreData.active_sensors} addAnalogSensor()}> @@ -723,7 +735,7 @@ const DashboardData: FC = () => { control={ setOnlyFav(!onlyFav)} />} label={ - only show favorites  + {LL.SHOW_FAV()}  } @@ -749,7 +761,7 @@ const DashboardData: FC = () => { endIcon={getSortIcon(dv_sort.state, 'NAME')} onClick={() => dv_sort.fns.onToggleSort({ sortKey: 'NAME' })} > - ENTITY NAME + {LL.ENTITY_NAME()} @@ -759,7 +771,7 @@ const DashboardData: FC = () => { endIcon={getSortIcon(dv_sort.state, 'VALUE')} onClick={() => dv_sort.fns.onToggleSort({ sortKey: 'VALUE' })} > - VALUE + {LL.VALUE()} @@ -943,14 +955,14 @@ const DashboardData: FC = () => { }); if (response.status === 204) { - enqueueSnackbar('Analog deletion failed', { variant: 'error' }); + enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'deletion failed' }), { variant: 'error' }); } else if (response.status === 403) { - enqueueSnackbar('Access denied', { variant: 'error' }); + enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); } else { - enqueueSnackbar('Analog sensor removed', { variant: 'success' }); + enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'removed' }), { variant: 'success' }); } } catch (error: unknown) { - enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog sensor'), { variant: 'error' }); + enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); } finally { setAnalog(undefined); fetchSensorData(); @@ -971,14 +983,14 @@ const DashboardData: FC = () => { }); if (response.status === 204) { - enqueueSnackbar('Analog sensor update failed', { variant: 'error' }); + enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'update failed' }), { variant: 'error' }); } else if (response.status === 403) { - enqueueSnackbar('Access denied', { variant: 'error' }); + enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); } else { - enqueueSnackbar('Analog sensor updated', { variant: 'success' }); + enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'updated' }), { variant: 'success' }); } } catch (error: unknown) { - enqueueSnackbar(extractErrorMessage(error, 'Problem updating analog'), { variant: 'error' }); + enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); } finally { setAnalog(undefined); fetchSensorData(); @@ -1131,7 +1143,7 @@ const DashboardData: FC = () => { { @@ -1180,7 +1192,7 @@ const DashboardData: FC = () => { }; return ( - + {renderCoreData()} {renderDeviceData()} {renderDeviceDialog()} @@ -1191,11 +1203,11 @@ const DashboardData: FC = () => { {renderAnalogDialog()} {device_select.state.id && device_select.state.id !== 'sensor' && ( )} diff --git a/interface/src/project/Help.tsx b/interface/src/project/Help.tsx index 924f936bd..494d9959c 100644 --- a/interface/src/project/Help.tsx +++ b/interface/src/project/Help.tsx @@ -5,12 +5,16 @@ import { Tab } from '@mui/material'; import { RouterTabs, useRouterTab, useLayoutTitle } from '../components'; +import { useI18nContext } from '../i18n/i18n-react'; + import HelpInformation from './HelpInformation'; const Help: FC = () => { - useLayoutTitle('Help'); + const { LL } = useI18nContext(); const { routerTab } = useRouterTab(); + useLayoutTitle(LL.HELP()); + return ( <> diff --git a/interface/src/project/ProjectMenu.tsx b/interface/src/project/ProjectMenu.tsx index d03324eb1..fb5350e5e 100644 --- a/interface/src/project/ProjectMenu.tsx +++ b/interface/src/project/ProjectMenu.tsx @@ -6,6 +6,8 @@ import { AuthenticatedContext } from '../contexts/authentication'; import { PROJECT_PATH } from '../api/env'; +import { useI18nContext } from '../i18n/i18n-react'; + import TuneIcon from '@mui/icons-material/Tune'; import DashboardIcon from '@mui/icons-material/Dashboard'; import LayoutMenuItem from '../components/layout/LayoutMenuItem'; @@ -13,17 +15,18 @@ import InfoIcon from '@mui/icons-material/Info'; const ProjectMenu: FC = () => { const authenticatedContext = useContext(AuthenticatedContext); + const { LL } = useI18nContext(); return ( - + - + ); }; diff --git a/interface/src/project/Settings.tsx b/interface/src/project/Settings.tsx index 3ce59f639..a4547fd86 100644 --- a/interface/src/project/Settings.tsx +++ b/interface/src/project/Settings.tsx @@ -5,13 +5,17 @@ import { Tab } from '@mui/material'; import { RouterTabs, useRouterTab, useLayoutTitle } from '../components'; +import { useI18nContext } from '../i18n/i18n-react'; + import SettingsApplication from './SettingsApplication'; import SettingsCustomization from './SettingsCustomization'; const Settings: FC = () => { - useLayoutTitle('Settings'); + const { LL } = useI18nContext(); const { routerTab } = useRouterTab(); + useLayoutTitle(LL.SETTINGS()); + return ( <> diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx index 945dfa137..38efae3e3 100644 --- a/interface/src/project/SettingsApplication.tsx +++ b/interface/src/project/SettingsApplication.tsx @@ -3,7 +3,7 @@ import { ValidateFieldsError } from 'async-validator'; import { useSnackbar } from 'notistack'; -import { Box, Button, Checkbox, MenuItem, Grid, Typography, Divider } from '@mui/material'; +import { Box, Button, Checkbox, MenuItem, Grid, Typography, Divider, InputAdornment } from '@mui/material'; import SaveIcon from '@mui/icons-material/Save'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; @@ -24,6 +24,8 @@ import { numberValue, extractErrorMessage, updateValue, useRest } from '../utils import * as EMSESP from './api'; import { Settings, BOARD_PROFILES } from './types'; +import { useI18nContext } from '../i18n/i18n-react'; + export function boardProfileSelectItems() { return Object.keys(BOARD_PROFILES).map((code) => ( @@ -38,6 +40,8 @@ const SettingsApplication: FC = () => { update: EMSESP.writeSettings }); + const { LL } = useI18nContext(); + const { enqueueSnackbar } = useSnackbar(); const updateFormValue = updateValue(setData); @@ -116,7 +120,7 @@ const SettingsApplication: FC = () => { Select a pre-configured interface board profile from the list below or choose "Custom" to configure your own - hardware settings. + hardware settings { General Options + + + English + Deutsch + + {data.led_gpio !== 0 && ( } @@ -350,7 +374,7 @@ const SettingsApplication: FC = () => { /> } - label="Enable Read only mode (blocks all outgoing EMS Tx write commands)" + label="Enable read-only mode (blocks all outgoing EMS Tx Write commands)" disabled={saving} /> { /> {data.shower_alert && ( <> - + minutes + }} variant="outlined" value={data.shower_alert_trigger} type="number" @@ -383,11 +410,14 @@ const SettingsApplication: FC = () => { disabled={!data.shower_timer} /> - + seconds + }} variant="outlined" value={data.shower_alert_coldshot} type="number" @@ -413,8 +443,8 @@ const SettingsApplication: FC = () => { margin="normal" select > - on/off - ON/OFF + {LL.ONOFF()} + {LL.ONOFF_CAP()} true/false 1/0 @@ -430,8 +460,8 @@ const SettingsApplication: FC = () => { margin="normal" select > - "on"/"off" - "ON"/"OFF" + {LL.ONOFF()} + {LL.ONOFF_CAP()} "true"/"false" true/false "1"/"0" @@ -487,7 +517,7 @@ const SettingsApplication: FC = () => { /> {data.syslog_enabled && ( - + { disabled={saving} /> - + { disabled={saving} /> - + { ALL - + seconds + }} fullWidth variant="outlined" value={data.syslog_mark_interval} diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index cdaeec26d..a314d45e9 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -294,7 +294,7 @@ const SettingsCustomization: FC = () => { return ( <> - Select a device and customize each of its entities using the options: + Select a device and customize the entities using the options: =mark as favorite   diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index d990e7381..7aab6237a 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -1,4 +1,5 @@ export interface Settings { + locale: string; tx_mode: number; ems_bus_id: number; syslog_enabled: boolean; diff --git a/interface/src/validators/authentication.ts b/interface/src/validators/authentication.ts index ebf42fb68..96712b288 100644 --- a/interface/src/validators/authentication.ts +++ b/interface/src/validators/authentication.ts @@ -3,10 +3,8 @@ import Schema from 'async-validator'; export const SIGN_IN_REQUEST_VALIDATOR = new Schema({ username: { required: true, - message: 'Please provide a username' }, password: { required: true, - message: 'Please provide a password' } }); diff --git a/lib/ESPAsyncWebServer/AsyncWebSocket.cpp b/lib/ESPAsyncWebServer/AsyncWebSocket.cpp index 48baab476..b4425000b 100644 --- a/lib/ESPAsyncWebServer/AsyncWebSocket.cpp +++ b/lib/ESPAsyncWebServer/AsyncWebSocket.cpp @@ -704,8 +704,13 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ } else if(_pinfo.opcode == WS_PING){ _queueControl(new AsyncWebSocketControl(WS_PONG, data, datalen)); } else if(_pinfo.opcode == WS_PONG){ + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" if(datalen != AWSC_PING_PAYLOAD_LEN || memcmp_P(data, AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN) != 0) _server->_handleEvent(this, WS_EVT_PONG, NULL, data, datalen); +#pragma GCC diagnostic pop + } else if(_pinfo.opcode < 8){//continuation or text/binary frame _server->_handleEvent(this, WS_EVT_DATA, (void *)&_pinfo, data, datalen); } diff --git a/lib/OneWire/OneWire.cpp b/lib/OneWire/OneWire.cpp index 38bf4ee2d..3ac6ddd81 100644 --- a/lib/OneWire/OneWire.cpp +++ b/lib/OneWire/OneWire.cpp @@ -143,6 +143,7 @@ sample code bearing this copyright. #include "OneWire.h" #include "util/OneWire_direct_gpio.h" +#pragma GCC diagnostic ignored "-Wunused-variable" void OneWire::begin(uint8_t pin) { @@ -154,7 +155,6 @@ void OneWire::begin(uint8_t pin) #endif } - // Perform the onewire reset function. We will wait up to 250uS for // the bus to come high, if it doesn't then it is broken or shorted // and we return a 0; @@ -578,3 +578,6 @@ uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc) #endif #endif + +#pragma GCC diagnostic pop + diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index 52c96d7ed..fb77e99ad 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -68,11 +68,28 @@ class FSPersistence { JsonObject jsonObject = jsonDocument.to(); _statefulService->read(jsonObject, _stateReader); + // make directories if required, for new IDF4.2 & LittleFS + String path(_filePath); + int index = 0; + while ((index = path.indexOf('/', index + 1)) != -1) { + String segment = path.substring(0, index); + if (!_fs->exists(segment)) { + _fs->mkdir(segment); + } + } + // serialize it to filesystem File settingsFile = _fs->open(_filePath, "w"); // failed to open file, return false if (!settingsFile) { +#if defined(EMSESP_DEBUG) +#if defined(EMSESP_USE_SERIAL) + Serial.println(); + Serial.printf("Cannot write to file system."); + Serial.println(); +#endif +#endif return false; } diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 1514fa1e3..4c17cc4aa 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -26,6 +26,7 @@ class DummySettings { public: + String locale = "en"; uint8_t tx_mode = 1; uint8_t ems_bus_id = 0x0B; bool syslog_enabled = false; diff --git a/mock-api/server.js b/mock-api/server.js index 1e6ebef3a..4706b288f 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -253,7 +253,7 @@ const UPLOAD_FILE_ENDPOINT = REST_ENDPOINT_ROOT + 'uploadFile' const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn' const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken' const system_status = { - emsesp_version: '3.4demo', + emsesp_version: '3.5demo', esp_platform: 'ESP32', max_alloc_heap: 113792, psram_size: 0, @@ -306,7 +306,8 @@ const EMSESP_MASKED_ENTITIES_ENDPOINT = REST_ENDPOINT_ROOT + 'maskedEntities' const EMSESP_RESET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'resetCustomizations' settings = { - tx_mode: 1, + locale: 'en', + tx_mode: 4, ems_bus_id: 11, syslog_enabled: false, syslog_level: 3, @@ -344,29 +345,24 @@ const emsesp_devices = { devices: [ { i: 1, - d: 23, - p: 77, s: 'Thermostat (RC20/Moduline 300)', - t: 'thermostat1', + t: 'thermostat', }, { i: 2, - d: 8, - p: 123, s: 'Boiler (Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i)', t: 'boiler', }, { i: 4, - d: 16, - p: 165, s: 'Thermostat (RC100/Moduline 1000/1010)', - t: 'thermostat2', + t: 'thermostat', }, ], } const emsesp_coredata = { + connected: true, // devices: [], devices: [ { @@ -852,6 +848,7 @@ rest_server.post(UPLOAD_FILE_ENDPOINT, (req, res) => { res.sendStatus(200) }) rest_server.post(SIGN_IN_ENDPOINT, (req, res) => { + console.log('Signed in as ' + req.body.username) res.json(signin) }) rest_server.get(GENERATE_TOKEN_ENDPOINT, (req, res) => { @@ -1135,7 +1132,7 @@ rest_server.post(EMSESP_BOARDPROFILE_ENDPOINT, (req, res) => { // EMS-ESP API specific const emsesp_info = { System: { - version: '3.4.2', + version: '3.5.0', uptime: '001+06:40:34.018', 'uptime (seconds)': 110434, freemem: 131, diff --git a/pio_local.ini_example b/pio_local.ini_example index 9c2db40f8..6172ddb2c 100644 --- a/pio_local.ini_example +++ b/pio_local.ini_example @@ -8,16 +8,27 @@ ; my_build_flags = -DEMSESP_DEBUG -DEMSESP_USE_SERIAL ; my_build_flags = -DEMSESP_DEBUG -DCORE_DEBUG_LEVEL=5 ; 5=verbose, 4=debug, 3=info -[env:esp32] +[env:esp32_4M] ; if using OTA enter your details below -; upload_protocol = espota -; upload_flags = -; --port=8266 -; --auth=ems-esp-neo -; upload_port = ems-esp.local +; upload_protocol = espota +; upload_flags = +; --port=8266 +; --auth=ems-esp-neo +; upload_port = ems-esp.local +; for USB use +upload_port = /dev/ttyUSB* +; upload_port = COM3 extra_scripts = - pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + ; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time + scripts/rename_fw.py + +[env:esp32_16M] +upload_port = /dev/ttyUSB* +; upload_port = COM3 + +extra_scripts = + ; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time scripts/rename_fw.py ; pio run -e debug diff --git a/platformio.ini b/platformio.ini index 915333874..444bf4039 100644 --- a/platformio.ini +++ b/platformio.ini @@ -2,7 +2,8 @@ ; override any settings with your own local ones in pio_local.ini [platformio] -default_envs = esp32 +default_envs = esp32_4M +; default_envs = esp32_16M extra_configs = factory_settings.ini @@ -37,9 +38,11 @@ unbuild_flags = [env] framework = arduino monitor_speed = 115200 +monitor_raw = yes upload_speed = 921600 build_type = release lib_ldf_mode = chain+ +debug_build_flags = -Os # optimize for size check_tool = cppcheck, clangtidy check_severity = high, medium @@ -53,16 +56,28 @@ check_flags = extra_scripts = scripts/rename_fw.py board = esp32dev platform = espressif32 -board_build.partitions = esp32_partition_app1984k_spiffs64k.csv +board_build.partitions = esp32_partition_4M.csv build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} -[env:esp32] +[env:esp32_4M] extra_scripts = pre:scripts/build_interface.py scripts/rename_fw.py board = esp32dev platform = espressif32 -board_build.partitions = esp32_partition_app1984k_spiffs64k.csv +board_upload.flash_size = 4MB +board_build.partitions = esp32_partition_4M.csv +build_flags = ${common.build_flags} +build_unflags = ${common.unbuild_flags} + +[env:esp32_16M] +extra_scripts = + pre:scripts/build_interface.py + scripts/rename_fw.py +board = esp32dev +platform = espressif32 +board_upload.flash_size = 16MB +board_build.partitions = esp32_partition_16M.csv build_flags = ${common.build_flags} build_unflags = ${common.unbuild_flags} diff --git a/scripts/rename_fw.py b/scripts/rename_fw.py index 2f8804a55..6c7612b5a 100644 --- a/scripts/rename_fw.py +++ b/scripts/rename_fw.py @@ -5,7 +5,6 @@ OUTPUT_DIR = "build{}".format(os.path.sep) - def bin_copy(source, target, env): # get the build info @@ -21,20 +20,23 @@ def bin_copy(source, target, env): app_version = bag.get('app_version') platform = "ESP32" + flash_size = env["PIOENV"].split('_')[1] + # print(env.Dump()) # my_flags = env.ParseFlags(env['BUILD_FLAGS']) # defines = {k: v for (k, v) in my_flags.get("CPPDEFINES")} # print(my_flags) # print((my_flags.get("CPPDEFINES")) - # alternatively take platfrom from the pio target + # alternatively take platform from the pio target # platform = str(target[0]).split(os.path.sep)[2] print("app version: "+app_version) print("platform: "+platform) + print("flash size: "+flash_size) # convert . to _ so Windows doesn't complain - variant = "EMS-ESP-" + app_version.replace(".", "_") + "-" + platform + variant = "EMS-ESP-" + app_version.replace(".", "_") + "-" + platform + "_" + flash_size # check if output directories exist and create if necessary if not os.path.isdir(OUTPUT_DIR): @@ -52,10 +54,9 @@ def bin_copy(source, target, env): if os.path.isfile(f): os.remove(f) - print("renaming file to "+bin_file) + print("Renaming file to "+bin_file) # copy firmware.bin to firmware/.bin shutil.copy(str(target[0]), bin_file) - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_copy]) diff --git a/scripts/run_sonar.sh b/scripts/run_sonar.sh old mode 100755 new mode 100644 diff --git a/sonar-project.properties b/sonar-project.properties index cd8e24393..98756864a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,7 +1,7 @@ sonar.organization=emsesp sonar.projectKey=emsesp_EMS-ESP32 sonar.projectName=EMS-ESP32 -sonar.projectVersion=3.4 +sonar.projectVersion=3.5.0 sonar.sources=./src sonar.cfamily.build-wrapper-output=build_wrapper_output_directory sonar.sourceEncoding=UTF-8 diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 0851a62e3..233f33061 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -459,7 +459,7 @@ bool AnalogSensor::get_value_info(JsonObject & output, const char * cmd, const i output["gpio"] = sensor.gpio(); output["name"] = sensor.name(); output["type"] = F_(number); - output["analog"] = FL_(enum_sensortype)[sensor.type()]; + output["analog"] = FL_(list_sensortype)[sensor.type()]; output["uom"] = EMSdevice::uom_to_string(sensor.uom()); output["offset"] = sensor.offset(); output["factor"] = sensor.factor(); @@ -497,7 +497,7 @@ bool AnalogSensor::command_info(const char * value, const int8_t id, JsonObject JsonObject dataSensor = output.createNestedObject(sensor.name()); dataSensor["gpio"] = sensor.gpio(); dataSensor["type"] = F_(number); - dataSensor["analog"] = FL_(enum_sensortype)[sensor.type()]; + dataSensor["analog"] = FL_(list_sensortype)[sensor.type()]; if (sensor.type() == AnalogType::ADC) { dataSensor["uom"] = EMSdevice::uom_to_string(sensor.uom()); dataSensor["offset"] = sensor.offset(); diff --git a/src/common.h b/src/common.h new file mode 100644 index 000000000..0e476c26e --- /dev/null +++ b/src/common.h @@ -0,0 +1,64 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_COMMON_H +#define EMSESP_COMMON_H + +// logging +#include + +using uuid::log::Level; +#define LOG_DEBUG(...) logger_.debug(__VA_ARGS__) +#define LOG_INFO(...) logger_.info(__VA_ARGS__) +#define LOG_TRACE(...) logger_.trace(__VA_ARGS__) +#define LOG_NOTICE(...) logger_.notice(__VA_ARGS__) +#define LOG_WARNING(...) logger_.warning(__VA_ARGS__) +#define LOG_ERROR(...) logger_.err(__VA_ARGS__) + +// flash strings +using uuid::flash_string_vector; +using uuid::read_flash_string; + +#ifdef FPSTR +#undef FPSTR +#endif + +#define FJSON(x) x +// #define FJSON(x) F(x) + +// clang-format off + +#define MAKE_STR(string_name, string_literal) static constexpr const char * __str__##string_name = string_literal; + +#define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) +#define F_(string_name) FPSTR(__pstr__##string_name) + +#define MAKE_PSTR(string_name, string_literal) static const char __pstr__##string_name[] __attribute__((__aligned__(sizeof(uint32_t)))) PROGMEM = string_literal; +#define MAKE_PSTR_WORD(string_name) MAKE_PSTR(string_name, #string_name) + +#define FL_(list_name) (__pstr__L_##list_name) +#define MAKE_PSTR_LIST(list_name, ...) static const __FlashStringHelper * const __pstr__L_##list_name[] PROGMEM = {__VA_ARGS__, nullptr}; +#define MAKE_PSTR_ENUM(enum_name, ...) static const __FlashStringHelper * const * __pstr__L_##enum_name[] PROGMEM = {__VA_ARGS__, nullptr}; + +// clang-format on + +// load translations +#include "locale_translations.h" +#include "locale_common.h" + +#endif diff --git a/src/console.cpp b/src/console.cpp index 3ebbc8ab0..ddc1c0e07 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -225,6 +225,7 @@ void EMSESPShell::add_console_commands() { flash_string_vector{F_(set)}, [](Shell & shell, const std::vector & arguments __attribute__((unused))) { EMSESP::webSettingsService.read([&](WebSettings & settings) { + shell.printfln(F("Language: %s"), settings.locale.c_str()); shell.printfln(F_(tx_mode_fmt), settings.tx_mode); shell.printfln(F_(bus_id_fmt), settings.ems_bus_id); shell.printfln(F_(board_profile_fmt), settings.board_profile.c_str()); @@ -280,11 +281,11 @@ void EMSESPShell::add_console_commands() { // get raw/pretty if (arguments[0] == read_flash_string(F_(raw))) { EMSESP::watch(EMSESP::WATCH_RAW); // raw - } else if (arguments[0] == read_flash_string(F_(on))) { + } else if (arguments[0] == Helpers::translated_word(FL_(on))) { EMSESP::watch(EMSESP::WATCH_ON); // on - } else if (arguments[0] == read_flash_string(F_(off))) { + } else if (arguments[0] == Helpers::translated_word(FL_(off))) { EMSESP::watch(EMSESP::WATCH_OFF); // off - } else if (arguments[0] == read_flash_string(F_(unknown))) { + } else if (arguments[0] == Helpers::translated_word(FL_(unknown))) { EMSESP::watch(EMSESP::WATCH_UNKNOWN); // unknown watch_id = WATCH_ID_NONE; } else { diff --git a/src/console.h b/src/console.h index 025255944..3f5d649be 100644 --- a/src/console.h +++ b/src/console.h @@ -26,36 +26,8 @@ #include "system.h" #include "mqtt.h" -using uuid::flash_string_vector; -using uuid::read_flash_string; using uuid::console::Commands; using uuid::console::Shell; -using uuid::log::Level; - -#define LOG_DEBUG(...) logger_.debug(__VA_ARGS__) -#define LOG_INFO(...) logger_.info(__VA_ARGS__) -#define LOG_TRACE(...) logger_.trace(__VA_ARGS__) -#define LOG_NOTICE(...) logger_.notice(__VA_ARGS__) -#define LOG_WARNING(...) logger_.warning(__VA_ARGS__) -#define LOG_ERROR(...) logger_.err(__VA_ARGS__) - -// clang-format off -// strings stored 32 bit aligned on ESP8266/ESP32 -#define MAKE_STR(string_name, string_literal) static constexpr const char * __str__##string_name = string_literal; -#define MAKE_PSTR(string_name, string_literal) static const char __pstr__##string_name[] __attribute__((__aligned__(sizeof(uint32_t)))) PROGMEM = string_literal; -#define MAKE_PSTR_WORD(string_name) MAKE_PSTR(string_name, #string_name) -#define F_(string_name) FPSTR(__pstr__##string_name) -#define FSTR_(string_name) __str__##string_name -#define MAKE_PSTR_LIST(list_name, ...) static const __FlashStringHelper * const __pstr__##list_name[] PROGMEM = {__VA_ARGS__, nullptr}; -#define FL_(list_name) (__pstr__##list_name) -// clang-format on - -// localizations -#include "locale_EN.h" - -#ifdef LOCAL -#undef LOCAL -#endif static constexpr uint32_t INVALID_PASSWORD_DELAY_MS = 2000; @@ -64,19 +36,14 @@ namespace emsesp { using LogLevel = ::uuid::log::Level; using LogFacility = ::uuid::log::Facility; -enum CommandFlags : uint8_t { - - USER = 0, - ADMIN = (1 << 0), - LOCAL = (1 << 1) - -}; +#ifdef LOCAL +#undef LOCAL +#endif +enum CommandFlags : uint8_t { USER = 0, ADMIN = (1 << 0), LOCAL = (1 << 1) }; enum ShellContext : uint8_t { - MAIN = 0, SYSTEM, - }; class EMSESPShell : virtual public uuid::console::Shell { diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 6fb35951b..e0e663fcc 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -363,10 +363,10 @@ bool DallasSensor::command_info(const char * value, const int8_t id, JsonObject JsonObject dataSensor = output.createNestedObject(sensor.name()); dataSensor["id"] = sensor.id(); if (Helpers::hasValue(sensor.temperature_c)) { - dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); + dataSensor["temp"] = Helpers::transformNumFloat((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } else if (Helpers::hasValue(sensor.temperature_c)) { - output[sensor.name()] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); + output[sensor.name()] = Helpers::transformNumFloat((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } @@ -392,11 +392,11 @@ bool DallasSensor::get_value_info(JsonObject & output, const char * cmd, const i output["id"] = sensor.id(); output["name"] = sensor.name(); if (Helpers::hasValue(sensor.temperature_c)) { - output["value"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); + output["value"] = Helpers::transformNumFloat((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } output["type"] = F_(number); - output["min"] = Helpers::round2(-55, 0, EMSESP::system_.fahrenheit() ? 2 : 0); - output["max"] = Helpers::round2(125, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + output["min"] = Helpers::transformNumFloat(-55, 0, EMSESP::system_.fahrenheit() ? 2 : 0); + output["max"] = Helpers::transformNumFloat(125, 0, EMSESP::system_.fahrenheit() ? 2 : 0); output["uom"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); output["writeable"] = false; // if we're filtering on an attribute, go find it @@ -472,10 +472,10 @@ void DallasSensor::publish_values(const bool force) { JsonObject dataSensor = doc.createNestedObject(sensor.id()); dataSensor["name"] = sensor.name(); if (has_value) { - dataSensor["temp"] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); + dataSensor["temp"] = Helpers::transformNumFloat((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } } else if (has_value) { - doc[sensor.name()] = Helpers::round2((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); + doc[sensor.name()] = Helpers::transformNumFloat((float)(sensor.temperature_c), 10, EMSESP::system_.fahrenheit() ? 2 : 0); } // create the HA MQTT config diff --git a/src/default_settings.h b/src/default_settings.h index 7ea40d574..70d373aaf 100644 --- a/src/default_settings.h +++ b/src/default_settings.h @@ -15,11 +15,20 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #ifndef EMSESP_DEFAULT_SETTINGS_H #define EMSESP_DEFAULT_SETTINGS_H // GENERAL SETTINGS +#ifndef EMSESP_STANDALONE +#define EMSESP_DEFAULT_LOCALE EMSESP_LOCALE_EN // English +#else +// this is for debugging different languages in standalone version +#define EMSESP_DEFAULT_LOCALE EMSESP_LOCALE_DE // German +// #define EMSESP_DEFAULT_LOCALE EMSESP_LOCALE_EN // English +#endif + #ifndef EMSESP_DEFAULT_TX_MODE #define EMSESP_DEFAULT_TX_MODE 1 // EMS1.0 #endif @@ -199,19 +208,19 @@ // matches Web UI settings enum { - BOOL_FORMAT_ONOFF_STR = 1, - BOOL_FORMAT_ONOFF_STR_CAP, - BOOL_FORMAT_TRUEFALSE_STR, - BOOL_FORMAT_TRUEFALSE, - BOOL_FORMAT_10_STR, - BOOL_FORMAT_10 + BOOL_FORMAT_ONOFF_STR = 1, // 1 + BOOL_FORMAT_ONOFF_STR_CAP, // 2 + BOOL_FORMAT_TRUEFALSE_STR, // 3 + BOOL_FORMAT_TRUEFALSE, // 4 + BOOL_FORMAT_10_STR, // 5 + BOOL_FORMAT_10 // 6 }; enum { - ENUM_FORMAT_VALUE = 1, - ENUM_FORMAT_INDEX // 2 + ENUM_FORMAT_VALUE = 1, // 1 + ENUM_FORMAT_INDEX // 2 }; diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 9f9a55d66..54b87ed2e 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -27,6 +27,7 @@ uuid::log::Logger Boiler::logger_{F_(boiler), uuid::log::Facility::CONSOLE}; Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const char * version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { // alternative heatsource special messages + if (device_id == EMSdevice::EMS_DEVICE_ID_AM200) { register_telegram_type(0x54D, F("AmTemperatures"), false, MAKE_PF_CB(process_amTempMessage)); register_telegram_type(0x54E, F("AmStatus"), false, MAKE_PF_CB(process_amStatusMessage)); @@ -34,25 +35,43 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x550, F("AmExtra"), false, MAKE_PF_CB(process_amExtraMessage)); register_telegram_type(0x54C, F("AmSettings"), true, MAKE_PF_CB(process_amSettingMessage)); // not broadcasted - register_device_value(DeviceValueTAG::TAG_AHS, &curFlowTemp_, DeviceValueType::SHORT, FL_(div10), FL_(sysFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &retTemp_, DeviceValueType::SHORT, FL_(div10), FL_(sysRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &aFlowTemp_, DeviceValueType::SHORT, FL_(div10), FL_(aFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &aRetTemp_, DeviceValueType::SHORT, FL_(div10), FL_(aRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &cylTopTemp_, DeviceValueType::SHORT, FL_(div10), FL_(aCylTopTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &cylCenterTemp_, DeviceValueType::SHORT, FL_(div10), FL_(aCylCenterTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_AHS, &cylBottomTemp_, DeviceValueType::SHORT, FL_(div10), FL_(aCylBottomTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, + &curFlowTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(sysFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, &retTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, &aFlowTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, &aRetTemp_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(aRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, + &cylTopTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylTopTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, + &cylCenterTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylCenterTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_AHS, + &cylBottomTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(aCylBottomTemp), + DeviceValueUOM::DEGREES); // register_device_value(DeviceValueTAG::TAG_AHS, &valveByPass_, DeviceValueType::BOOL, nullptr, FL_(valveByPass), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_AHS, &valveBuffer_, DeviceValueType::UINT, nullptr, FL_(valveBuffer), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_AHS, &valveReturn_, DeviceValueType::UINT, nullptr, FL_(valveReturn), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_AHS, &aPumpMod_, DeviceValueType::UINT, nullptr, FL_(aPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_AHS, &valveBuffer_, DeviceValueType::UINT, FL_(valveBuffer), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_AHS, &valveReturn_, DeviceValueType::UINT, FL_(valveReturn), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_AHS, &aPumpMod_, DeviceValueType::UINT, FL_(aPumpMod), DeviceValueUOM::PERCENT); // register_device_value(DeviceValueTAG::TAG_AHS, &heatSource_, DeviceValueType::BOOL, nullptr, FL_(heatSource), DeviceValueUOM::NONE); // Settings: register_device_value( DeviceValueTAG::TAG_AHS, &vr2Config_, DeviceValueType::ENUM, FL_(enum_vr2Config), FL_(vr2Config), DeviceValueUOM::NONE, MAKE_CF_CB(set_vr2Config)); - register_device_value( - DeviceValueTAG::TAG_AHS, &ahsActivated_, DeviceValueType::BOOL, nullptr, FL_(ahsActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ahsActivated)); - register_device_value( - DeviceValueTAG::TAG_AHS, &aPumpConfig_, DeviceValueType::BOOL, nullptr, FL_(aPumpConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpConfig)); + register_device_value(DeviceValueTAG::TAG_AHS, &ahsActivated_, DeviceValueType::BOOL, FL_(ahsActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ahsActivated)); + register_device_value(DeviceValueTAG::TAG_AHS, &aPumpConfig_, DeviceValueType::BOOL, FL_(aPumpConfig), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpConfig)); register_device_value(DeviceValueTAG::TAG_AHS, &aPumpSignal_, DeviceValueType::ENUM, @@ -60,35 +79,19 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(aPumpSignal), DeviceValueUOM::NONE, MAKE_CF_CB(set_aPumpSignal)); + register_device_value(DeviceValueTAG::TAG_AHS, &aPumpMin_, DeviceValueType::UINT, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); + register_device_value(DeviceValueTAG::TAG_AHS, &tempRise_, DeviceValueType::BOOL, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); register_device_value( - DeviceValueTAG::TAG_AHS, &aPumpMin_, DeviceValueType::UINT, nullptr, FL_(aPumpMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_aPumpMin), 12, 50); - register_device_value(DeviceValueTAG::TAG_AHS, &tempRise_, DeviceValueType::BOOL, nullptr, FL_(tempRise), DeviceValueUOM::NONE, MAKE_CF_CB(set_tempRise)); - register_device_value(DeviceValueTAG::TAG_AHS, - &setReturnTemp_, - DeviceValueType::UINT, - nullptr, - FL_(setReturnTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_setReturnTemp), - 40, - 75); + DeviceValueTAG::TAG_AHS, &setReturnTemp_, DeviceValueType::UINT, FL_(setReturnTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setReturnTemp), 40, 75); register_device_value( - DeviceValueTAG::TAG_AHS, &mixRuntime_, DeviceValueType::USHORT, nullptr, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); - register_device_value(DeviceValueTAG::TAG_AHS, - &setFlowTemp_, - DeviceValueType::UINT, - nullptr, - FL_(setFlowTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_setFlowTemp), - 40, - 75); + DeviceValueTAG::TAG_AHS, &mixRuntime_, DeviceValueType::USHORT, FL_(mixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_mixRuntime), 0, 600); + register_device_value( + DeviceValueTAG::TAG_AHS, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_setFlowTemp), 40, 75); register_device_value( DeviceValueTAG::TAG_AHS, &bufBypass_, DeviceValueType::ENUM, FL_(enum_bufBypass), FL_(bufBypass), DeviceValueUOM::NONE, MAKE_CF_CB(set_bufBypass)); register_device_value(DeviceValueTAG::TAG_AHS, &bufMixRuntime_, DeviceValueType::USHORT, - nullptr, FL_(bufMixRuntime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_bufMixRuntime), @@ -100,33 +103,31 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueTAG::TAG_AHS, &blockMode_, DeviceValueType::ENUM, FL_(enum_blockMode), FL_(blockMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockMode)); register_device_value( DeviceValueTAG::TAG_AHS, &blockTerm_, DeviceValueType::ENUM, FL_(enum_blockTerm), FL_(blockTerm), DeviceValueUOM::NONE, MAKE_CF_CB(set_blockTerm)); + register_device_value(DeviceValueTAG::TAG_AHS, &blockHyst_, DeviceValueType::INT, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); register_device_value( - DeviceValueTAG::TAG_AHS, &blockHyst_, DeviceValueType::INT, nullptr, FL_(blockHyst), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_blockHyst), 0, 50); - register_device_value(DeviceValueTAG::TAG_AHS, - &releaseWait_, - DeviceValueType::UINT, - nullptr, - FL_(releaseWait), - DeviceValueUOM::MINUTES, - MAKE_CF_CB(set_releaseWait), - 0, - 240); + DeviceValueTAG::TAG_AHS, &releaseWait_, DeviceValueType::UINT, FL_(releaseWait), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_releaseWait), 0, 240); return; } - // cascaded heatingsources, only some values per individual heatsource (hs) + + // cascaded heating sources, only some values per individual heatsource (hs) 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, F("CascadeMessage"), false, MAKE_PF_CB(process_CascadeMessage)); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &burnWorkMin_, DeviceValueType::TIME, FL_(burnWorkMin), DeviceValueUOM::MINUTES); // selBurnpower in D2 and E4 // register_telegram_type(0xD2, F("CascadePowerMessage"), false, MAKE_PF_CB(process_CascadePowerMessage)); // individual Flowtemps and powervalues for each heatingsource in E4 register_telegram_type(0xE4, F("UBAMonitorFastPlus"), false, MAKE_PF_CB(process_UBAMonitorFastPlus)); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &selBurnPow_, DeviceValueType::UINT, nullptr, FL_(selBurnPow), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); + 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, + &curFlowTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(curFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_HS1 + hs, &curBurnPow_, DeviceValueType::UINT, FL_(curBurnPow), DeviceValueUOM::PERCENT); return; } @@ -142,15 +143,18 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0x14, F("UBATotalUptime"), true, MAKE_PF_CB(process_UBATotalUptime)); register_telegram_type(0x15, F("UBAMaintenanceData"), false, MAKE_PF_CB(process_UBAMaintenanceData)); register_telegram_type(0x1C, F("UBAMaintenanceStatus"), false, MAKE_PF_CB(process_UBAMaintenanceStatus)); + // EMS1.0 and maybe EMS+? register_telegram_type(0x18, F("UBAMonitorFast"), false, MAKE_PF_CB(process_UBAMonitorFast)); register_telegram_type(0x19, F("UBAMonitorSlow"), false, MAKE_PF_CB(process_UBAMonitorSlow)); register_telegram_type(0x1A, F("UBASetPoints"), false, MAKE_PF_CB(process_UBASetPoints)); register_telegram_type(0x35, F("UBAFlags"), false, MAKE_PF_CB(process_UBAFlags)); + // only EMS 1.0 register_telegram_type(0x16, F("UBAParameters"), true, MAKE_PF_CB(process_UBAParameters)); register_telegram_type(0x33, F("UBAParameterWW"), true, MAKE_PF_CB(process_UBAParameterWW)); register_telegram_type(0x34, F("UBAMonitorWW"), false, MAKE_PF_CB(process_UBAMonitorWW)); + // not ems1.0, but HT3 if (model() != EMSdevice::EMS_DEVICE_FLAG_EMS) { register_telegram_type(0x26, F("UBASettingsWW"), true, MAKE_PF_CB(process_UBASettingsWW)); @@ -185,93 +189,100 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_telegram_type(0xBB, F("HybridHp"), true, MAKE_PF_CB(process_HybridHp)); } */ + // reset is a command uses a dummy variable which is always zero, shown as blank, but provides command enum options register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &reset_, DeviceValueType::CMD, FL_(enum_reset), FL_(reset), DeviceValueUOM::NONE, MAKE_CF_CB(set_reset)); has_update(reset_, 0); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingActive_, DeviceValueType::BOOL, nullptr, FL_(heatingActive), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tapwaterActive_, DeviceValueType::BOOL, nullptr, FL_(tapwaterActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingActive_, DeviceValueType::BOOL, FL_(heatingActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tapwaterActive_, DeviceValueType::BOOL, FL_(tapwaterActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &selFlowTemp_, DeviceValueType::UINT, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &selFlowTemp_, DeviceValueType::UINT, nullptr, FL_(selFlowTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flow_temp)); + DeviceValueTAG::TAG_DEVICE_DATA, &selBurnPow_, DeviceValueType::UINT, FL_(selBurnPow), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_burn_power), 0, 254); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPumpMod_, DeviceValueType::UINT, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPump2Mod_, DeviceValueType::UINT, FL_(heatingPump2Mod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &selBurnPow_, - DeviceValueType::UINT, - nullptr, - FL_(selBurnPow), - DeviceValueUOM::PERCENT, - MAKE_CF_CB(set_burn_power), - 0, - 254); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPumpMod_, DeviceValueType::UINT, nullptr, FL_(heatingPumpMod), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPump2Mod_, DeviceValueType::UINT, nullptr, FL_(heatingPump2Mod), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &outdoorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(outdoorTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &curFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(curFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::USHORT, FL_(div10), FL_(retTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &switchTemp_, DeviceValueType::USHORT, FL_(div10), FL_(switchTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &sysPress_, DeviceValueType::UINT, FL_(div10), FL_(sysPress), DeviceValueUOM::BAR); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &boilTemp_, DeviceValueType::USHORT, FL_(div10), FL_(boilTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &exhaustTemp_, DeviceValueType::USHORT, FL_(div10), FL_(exhaustTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas_, DeviceValueType::BOOL, nullptr, FL_(burnGas), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas2_, DeviceValueType::BOOL, nullptr, FL_(burnGas2), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &flameCurr_, DeviceValueType::USHORT, FL_(div10), FL_(flameCurr), DeviceValueUOM::UA); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPump_, DeviceValueType::BOOL, nullptr, FL_(heatingPump), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fanWork_, DeviceValueType::BOOL, nullptr, FL_(fanWork), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ignWork_, DeviceValueType::BOOL, nullptr, FL_(ignWork), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &oilPreHeat_, DeviceValueType::BOOL, nullptr, FL_(oilPreHeat), DeviceValueUOM::NONE); + &outdoorTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(outdoorTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &curFlowTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(curFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retTemp_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(retTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &switchTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(switchTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &sysPress_, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(sysPress), DeviceValueUOM::BAR); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &boilTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(boilTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &exhaustTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(exhaustTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas_, DeviceValueType::BOOL, FL_(burnGas), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnGas2_, DeviceValueType::BOOL, FL_(burnGas2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &flameCurr_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flameCurr), DeviceValueUOM::UA); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingPump_, DeviceValueType::BOOL, FL_(heatingPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fanWork_, DeviceValueType::BOOL, FL_(fanWork), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ignWork_, DeviceValueType::BOOL, FL_(ignWork), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &oilPreHeat_, DeviceValueType::BOOL, FL_(oilPreHeat), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingActivated_, DeviceValueType::BOOL, - nullptr, FL_(heatingActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_heating_activated)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingTemp_, DeviceValueType::UINT, - nullptr, FL_(heatingTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_heating_temp)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMax_, DeviceValueType::UINT, nullptr, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMin_, DeviceValueType::UINT, nullptr, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &pumpDelay_, DeviceValueType::UINT, nullptr, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMax_, DeviceValueType::UINT, FL_(pumpModMax), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_pump)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpModMin_, DeviceValueType::UINT, FL_(pumpModMin), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_pump)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpDelay_, DeviceValueType::UINT, FL_(pumpDelay), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_pump_delay)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnMinPeriod_, DeviceValueType::UINT, - nullptr, FL_(burnMinPeriod), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_burn_period)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &burnMinPower_, DeviceValueType::UINT, nullptr, FL_(burnMinPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_min_power)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &burnMaxPower_, + &burnMinPower_, DeviceValueType::UINT, - nullptr, - FL_(burnMaxPower), + FL_(burnMinPower), DeviceValueUOM::PERCENT, - MAKE_CF_CB(set_max_power), - 0, - 254); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &boilHystOn_, DeviceValueType::INT, nullptr, FL_(boilHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_on)); + MAKE_CF_CB(set_min_power)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &boilHystOff_, DeviceValueType::INT, nullptr, FL_(boilHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_off)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setFlowTemp_, DeviceValueType::UINT, nullptr, FL_(setFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setBurnPow_, DeviceValueType::UINT, nullptr, FL_(setBurnPow), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &curBurnPow_, DeviceValueType::UINT, nullptr, FL_(curBurnPow), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnStarts_, DeviceValueType::ULONG, nullptr, FL_(burnStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnWorkMin_, DeviceValueType::TIME, nullptr, FL_(burnWorkMin), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burn2WorkMin_, DeviceValueType::TIME, nullptr, FL_(burn2WorkMin), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatWorkMin_, DeviceValueType::TIME, nullptr, FL_(heatWorkMin), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &UBAuptime_, DeviceValueType::TIME, nullptr, FL_(UBAuptime), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &serviceCode_, DeviceValueType::STRING, nullptr, FL_(serviceCode), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &serviceCodeNumber_, DeviceValueType::USHORT, nullptr, FL_(serviceCodeNumber), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maintenanceMessage_, DeviceValueType::STRING, nullptr, FL_(maintenanceMessage), DeviceValueUOM::NONE); + DeviceValueTAG::TAG_DEVICE_DATA, &burnMaxPower_, DeviceValueType::UINT, FL_(burnMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_max_power), 0, 254); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &boilHystOn_, DeviceValueType::INT, FL_(boilHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_on)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &boilHystOff_, DeviceValueType::INT, FL_(boilHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_hyst_off)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setFlowTemp_, DeviceValueType::UINT, FL_(setFlowTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &setBurnPow_, DeviceValueType::UINT, FL_(setBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &curBurnPow_, DeviceValueType::UINT, FL_(curBurnPow), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnStarts_, DeviceValueType::ULONG, FL_(burnStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burnWorkMin_, DeviceValueType::TIME, FL_(burnWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &burn2WorkMin_, DeviceValueType::TIME, FL_(burn2WorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatWorkMin_, DeviceValueType::TIME, FL_(heatWorkMin), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &UBAuptime_, DeviceValueType::TIME, FL_(UBAuptime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &lastCode_, DeviceValueType::STRING, FL_(lastCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &serviceCode_, DeviceValueType::STRING, FL_(serviceCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &serviceCodeNumber_, DeviceValueType::USHORT, FL_(serviceCodeNumber), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maintenanceMessage_, DeviceValueType::STRING, FL_(maintenanceMessage), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maintenanceType_, DeviceValueType::ENUM, @@ -282,7 +293,6 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &maintenanceTime_, DeviceValueType::USHORT, - nullptr, FL_(maintenanceTime), DeviceValueUOM::HOURS, MAKE_CF_CB(set_maintenancetime)); @@ -296,14 +306,12 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &emergencyOps_, DeviceValueType::BOOL, - nullptr, FL_(emergencyOps), DeviceValueUOM::NONE, MAKE_CF_CB(set_emergency_ops)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &emergencyTemp_, DeviceValueType::UINT, - nullptr, FL_(emergencyTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_emergency_temp), @@ -336,7 +344,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyCostRatio_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(energyCostRatio), DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), @@ -345,7 +353,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fossileFactor_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(fossileFactor), DeviceValueUOM::NONE, MAKE_CF_CB(set_fossileFactor), @@ -354,7 +362,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &electricFactor_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(electricFactor), DeviceValueUOM::NONE, MAKE_CF_CB(set_electricFactor), @@ -382,81 +390,110 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const */ // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &upTimeControl_, DeviceValueType::TIME, FL_(div60), FL_(upTimeControl), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &upTimeCompHeating_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompHeating), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &upTimeCompCooling_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompCooling), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &upTimeCompWw_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompWw), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &upTimeCompPool_, DeviceValueType::TIME, FL_(div60), FL_(upTimeCompPool), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &totalCompStarts_, DeviceValueType::ULONG, nullptr, FL_(totalCompStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingStarts_, DeviceValueType::ULONG, nullptr, FL_(heatingStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &coolingStarts_, DeviceValueType::ULONG, nullptr, FL_(coolingStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStarts2_, DeviceValueType::ULONG, nullptr, FL_(wwStarts2), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolStarts_, DeviceValueType::ULONG, nullptr, FL_(poolStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsTotal), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompTotal), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompHeating), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompWw_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompWw), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompCooling), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompPool_, DeviceValueType::ULONG, nullptr, FL_(nrgConsCompPool), DeviceValueUOM::KWH); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &auxElecHeatNrgConsTotal_, - DeviceValueType::ULONG, - nullptr, - FL_(auxElecHeatNrgConsTotal), - DeviceValueUOM::KWH); + &upTimeControl_, + DeviceValueType::TIME, + DeviceValueNumOp::DV_NUMOP_DIV60, + FL_(upTimeControl), + DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &upTimeCompHeating_, + DeviceValueType::TIME, + DeviceValueNumOp::DV_NUMOP_DIV60, + FL_(upTimeCompHeating), + DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &upTimeCompCooling_, + DeviceValueType::TIME, + DeviceValueNumOp::DV_NUMOP_DIV60, + FL_(upTimeCompCooling), + DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &upTimeCompWw_, + DeviceValueType::TIME, + DeviceValueNumOp::DV_NUMOP_DIV60, + FL_(upTimeCompWw), + DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &upTimeCompPool_, + DeviceValueType::TIME, + DeviceValueNumOp::DV_NUMOP_DIV60, + FL_(upTimeCompPool), + DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &totalCompStarts_, DeviceValueType::ULONG, FL_(totalCompStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatingStarts_, DeviceValueType::ULONG, FL_(heatingStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &coolingStarts_, DeviceValueType::ULONG, FL_(coolingStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStarts2_, DeviceValueType::ULONG, FL_(wwStarts2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolStarts_, DeviceValueType::ULONG, FL_(poolStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsTotal_, DeviceValueType::ULONG, FL_(nrgConsTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompTotal_, DeviceValueType::ULONG, FL_(nrgConsCompTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompHeating_, DeviceValueType::ULONG, FL_(nrgConsCompHeating), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompWw_, DeviceValueType::ULONG, FL_(nrgConsCompWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompCooling_, DeviceValueType::ULONG, FL_(nrgConsCompCooling), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgConsCompPool_, DeviceValueType::ULONG, FL_(nrgConsCompPool), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxElecHeatNrgConsTotal_, DeviceValueType::ULONG, FL_(auxElecHeatNrgConsTotal), DeviceValueUOM::KWH); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxElecHeatNrgConsHeating_, DeviceValueType::ULONG, - nullptr, FL_(auxElecHeatNrgConsHeating), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxElecHeatNrgConsWW_, DeviceValueType::ULONG, FL_(auxElecHeatNrgConsWW), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &auxElecHeatNrgConsPool_, DeviceValueType::ULONG, FL_(auxElecHeatNrgConsPool), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppTotal_, DeviceValueType::ULONG, FL_(nrgSuppTotal), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppHeating_, DeviceValueType::ULONG, FL_(nrgSuppHeating), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppWw_, DeviceValueType::ULONG, FL_(nrgSuppWw), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppCooling_, DeviceValueType::ULONG, FL_(nrgSuppCooling), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppPool_, DeviceValueType::ULONG, FL_(nrgSuppPool), DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPower_, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpPower), DeviceValueUOM::KW); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCompOn_, DeviceValueType::BOOL, FL_(hpCompOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpActivity_, DeviceValueType::ENUM, FL_(enum_hpactivity), FL_(hpActivity), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpHeatingOn_, DeviceValueType::BOOL, FL_(hpHeatingOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCoolingOn_, DeviceValueType::BOOL, FL_(hpCoolingOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpWwOn_, DeviceValueType::BOOL, FL_(hpWwOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPoolOn_, DeviceValueType::BOOL, FL_(hpPoolOn), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpBrinePumpSpd_, DeviceValueType::UINT, FL_(hpBrinePumpSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpSwitchValve_, DeviceValueType::BOOL, FL_(hpSwitchValve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCompSpd_, DeviceValueType::UINT, FL_(hpCompSpd), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCircSpd_, DeviceValueType::UINT, FL_(hpCircSpd), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &auxElecHeatNrgConsWW_, - DeviceValueType::ULONG, - nullptr, - FL_(auxElecHeatNrgConsWW), - DeviceValueUOM::KWH); + &hpBrineIn_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(hpBrineIn), + DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &auxElecHeatNrgConsPool_, - DeviceValueType::ULONG, - nullptr, - FL_(auxElecHeatNrgConsPool), - DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppTotal_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppTotal), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppHeating_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppHeating), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppWw_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppWw), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppCooling_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppCooling), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgSuppPool_, DeviceValueType::ULONG, nullptr, FL_(nrgSuppPool), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPower_, DeviceValueType::UINT, FL_(div10), FL_(hpPower), DeviceValueUOM::KW); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCompOn_, DeviceValueType::BOOL, nullptr, FL_(hpCompOn), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpActivity_, DeviceValueType::ENUM, FL_(enum_hpactivity), FL_(hpActivity), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpHeatingOn_, DeviceValueType::BOOL, nullptr, FL_(hpHeatingOn), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCoolingOn_, DeviceValueType::BOOL, nullptr, FL_(hpCoolingOn), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpWwOn_, DeviceValueType::BOOL, nullptr, FL_(hpWwOn), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPoolOn_, DeviceValueType::BOOL, nullptr, FL_(hpPoolOn), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpBrinePumpSpd_, DeviceValueType::UINT, nullptr, FL_(hpBrinePumpSpd), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpSwitchValve_, DeviceValueType::BOOL, nullptr, FL_(hpSwitchValve), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCompSpd_, DeviceValueType::UINT, nullptr, FL_(hpCompSpd), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpCircSpd_, DeviceValueType::UINT, nullptr, FL_(hpCircSpd), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpBrineIn_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineIn), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpBrineOut_, DeviceValueType::SHORT, FL_(div10), FL_(hpBrineOut), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpSuctionGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpSuctionGas), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpHotGas_, DeviceValueType::SHORT, FL_(div10), FL_(hpHotGas), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc0_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc0), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc1_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTc3), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr3_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr3), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr4_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr4), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr5_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr5), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr6_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr6), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr7_, DeviceValueType::SHORT, FL_(div10), FL_(hpTr7), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTl2_, DeviceValueType::SHORT, FL_(div10), FL_(hpTl2), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPl1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPl1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPh1_, DeviceValueType::SHORT, FL_(div10), FL_(hpPh1), DeviceValueUOM::DEGREES); + &hpBrineOut_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(hpBrineOut), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &hpSuctionGas_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(hpSuctionGas), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &hpHotGas_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(hpHotGas), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc0_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTc0), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTc1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTc3_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTc3), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr3_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr3), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr4_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr4), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr5_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr5), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr6_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr6), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTr7_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTr7), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpTl2_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpTl2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPl1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpPl1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &hpPh1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hpPh1), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolSetTemp_, DeviceValueType::UINT, - FL_(div2), + DeviceValueNumOp::DV_NUMOP_DIV2, FL_(poolSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_pool_temp)); @@ -466,25 +503,21 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwTapActivated_, DeviceValueType::BOOL, - nullptr, FL_(wwtapactivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_tapwarmwater_activated)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, FL_(wwSetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTempLow_, DeviceValueType::UINT, - nullptr, FL_(wwSelTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp_low)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTempOff_, DeviceValueType::UINT, nullptr, FL_(wwSelTempOff), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTempOff_, DeviceValueType::UINT, FL_(wwSelTempOff), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSelTempSingle_, DeviceValueType::UINT, - nullptr, FL_(wwSelTempSingle), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_temp_single)); @@ -506,7 +539,6 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwFlowTempOffset_, DeviceValueType::UINT, - nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_flowTempOffset), @@ -515,44 +547,30 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwChargeOptimization_, DeviceValueType::BOOL, - nullptr, FL_(wwChargeOptimization), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_chargeOptimization)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, - &wwMaxPower_, - DeviceValueType::UINT, - nullptr, - FL_(wwMaxPower), - DeviceValueUOM::PERCENT, - MAKE_CF_CB(set_ww_maxpower), - 0, - 254); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, - &wwMaxTemp_, - DeviceValueType::UINT, - nullptr, - FL_(wwMaxTemp), - DeviceValueUOM::DEGREES, - MAKE_CF_CB(set_ww_maxtemp), - 0, - 70); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, FL_(wwMaxPower), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_ww_maxpower), 0, 254); + register_device_value( + DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_maxtemp), 0, 70); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, - nullptr, FL_(wwCircPump), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation_pump)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwChargeType_, DeviceValueType::ENUM, FL_(enum_charge), FL_(wwChargeType), DeviceValueUOM::NONE); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwHystOn_, DeviceValueType::INT, nullptr, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_hyst_on)); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwHystOff_, DeviceValueType::INT, nullptr, FL_(wwHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_hyst_off)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwHystOn_, DeviceValueType::INT, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_ww_hyst_on)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwHystOff_, + DeviceValueType::INT, + FL_(wwHystOff), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_ww_hyst_off)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwDisinfectionTemp_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectionTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ww_disinfect_temp)); @@ -563,45 +581,76 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation_mode)); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCirc_, DeviceValueType::BOOL, nullptr, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCurTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCurTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCurFlow_, DeviceValueType::UINT, FL_(div10), FL_(wwCurFlow), DeviceValueUOM::LMIN); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStorageTemp1_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStorageTemp2_, DeviceValueType::USHORT, FL_(div10), FL_(wwStorageTemp2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCirc_, DeviceValueType::BOOL, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_circulation)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwCurTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwCurTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwCurTemp2_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwCurTemp2), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwCurFlow_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwCurFlow), + DeviceValueUOM::LMIN); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwStorageTemp1_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwStorageTemp1), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwStorageTemp2_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwStorageTemp2), + DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwActivated_, DeviceValueType::BOOL, - nullptr, FL_(wwActivated), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_activated)); - register_device_value( - DeviceValueTAG::TAG_BOILER_DATA_WW, &wwOneTime_, DeviceValueType::BOOL, nullptr, FL_(wwOneTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_onetime)); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwOneTime_, DeviceValueType::BOOL, FL_(wwOneTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_onetime)); register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwDisinfect_, DeviceValueType::BOOL, - nullptr, FL_(wwDisinfecting), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_disinfect)); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCharging_, DeviceValueType::BOOL, nullptr, FL_(wwCharging), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwRecharging_, DeviceValueType::BOOL, nullptr, FL_(wwRecharging), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwTempOK_, DeviceValueType::BOOL, nullptr, FL_(wwTempOK), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwActive_, DeviceValueType::BOOL, nullptr, FL_(wwActive), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &ww3wayValve_, DeviceValueType::BOOL, nullptr, FL_(ww3wayValve), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSetPumpPower_, DeviceValueType::UINT, nullptr, FL_(wwSetPumpPower), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwMixerTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwMixerTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCylMiddleTemp_, DeviceValueType::USHORT, FL_(div10), FL_(wwCylMiddleTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStarts_, DeviceValueType::ULONG, nullptr, FL_(wwStarts), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwWorkM_, DeviceValueType::TIME, nullptr, FL_(wwWorkM), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwCharging_, DeviceValueType::BOOL, FL_(wwCharging), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwRecharging_, DeviceValueType::BOOL, FL_(wwRecharging), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwTempOK_, DeviceValueType::BOOL, FL_(wwTempOK), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwActive_, DeviceValueType::BOOL, FL_(wwActive), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &ww3wayValve_, DeviceValueType::BOOL, FL_(ww3wayValve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwSetPumpPower_, DeviceValueType::UINT, FL_(wwSetPumpPower), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwMixerTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwMixerTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, + &wwCylMiddleTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwCylMiddleTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwStarts_, DeviceValueType::ULONG, FL_(wwStarts), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_BOILER_DATA_WW, &wwWorkM_, DeviceValueType::TIME, FL_(wwWorkM), DeviceValueUOM::MINUTES); // fetch some initial data EMSESP::send_read_request(0x10, device_id); // read last errorcode on start (only published on errors) EMSESP::send_read_request(0x11, device_id); // read last errorcode on start (only published on errors) - EMSESP::send_read_request(0x15, device_id); // read maintenace data on start (only published on change) - EMSESP::send_read_request(0x1C, device_id); // read maintenace status on start (only published on change) + EMSESP::send_read_request(0x15, device_id); // read maintenance data on start (only published on change) + EMSESP::send_read_request(0x1C, device_id); // read maintenance status on start (only published on change) EMSESP::send_read_request(0xC2, device_id); // read last errorcode on start (only published on errors) } @@ -1286,9 +1335,6 @@ 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) { } @@ -1458,6 +1504,11 @@ bool Boiler::set_releaseWait(const char * value, const int8_t id) { return true; } + +// 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 + /* * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat * thermostat always overwrites settings in boiler @@ -2079,7 +2130,7 @@ bool Boiler::set_maintenance(const char * value, const int8_t id) { std::string s; if (Helpers::value2string(value, s)) { - if (s == Helpers::toLower(read_flash_string(F_(reset)))) { + if (s == Helpers::translated_word(FL_(reset))) { // LOG_INFO(F("Reset boiler maintenance message")); write_command(0x05, 0x08, 0xFF, 0x1C); return true; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index ff5b1cfe5..78ea8c729 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -227,15 +227,11 @@ class Boiler : public EMSdevice { int8_t blockHyst_; // pos 14?: Hyst. for bolier block (K) uint8_t releaseWait_; // pos 15: Boiler release wait time (min) - - - /* - * Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat - * thermostat always overwrites settings in boiler - * enable settings here if no thermostat is used in system - * -// HybridHP + // Hybrid heatpump with telegram 0xBB is readable and writeable in boiler and thermostat + // thermostat always overwrites settings in boiler + //enable settings here if no thermostat is used in system + // HybridHP uint8_t hybridStrategy_; // cost = 2, temperature = 3, mix = 4 int8_t switchOverTemp_; // degrees uint8_t energyCostRatio_; // is *10 @@ -243,7 +239,7 @@ class Boiler : public EMSdevice { uint8_t electricFactor_; // is * 10 uint8_t delayBoiler_; // minutes uint8_t tempDiffBoiler_; // relative temperature degrees - */ + */ void process_UBAParameterWW(std::shared_ptr telegram); void process_UBAMonitorFast(std::shared_ptr telegram); diff --git a/src/devices/controller.cpp b/src/devices/controller.cpp index 0922cf764..03e90a4a4 100644 --- a/src/devices/controller.cpp +++ b/src/devices/controller.cpp @@ -27,7 +27,7 @@ Controller::Controller(uint8_t device_type, uint8_t device_id, uint8_t product_i // IVT broadcasts Thermostat time from controller (0x09) if display is off. if ((flags & 0x0F) == EMS_DEVICE_FLAG_IVT) { register_telegram_type(0x06, F("RCTime"), false, MAKE_PF_CB(process_dateTime)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); } } diff --git a/src/devices/generic.cpp b/src/devices/generic.cpp index c992195ac..81d17defb 100644 --- a/src/devices/generic.cpp +++ b/src/devices/generic.cpp @@ -29,7 +29,12 @@ Generic::Generic(uint8_t device_type, uint8_t device_id, uint8_t product_id, con // RF-Sensor 0x40 sending temperature in telegram 0x435, see https://github.com/emsesp/EMS-ESP32/issues/103 if (device_id == 0x40) { register_telegram_type(0x435, F("RFSensorMessage"), false, MAKE_PF_CB(process_RFSensorMessage)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &rfTemp_, DeviceValueType::SHORT, FL_(div10), FL_(RFTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &rfTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(RFTemp), + DeviceValueUOM::DEGREES); } } diff --git a/src/devices/heatpump.cpp b/src/devices/heatpump.cpp index 9ada1ce1b..cbb5d1ec2 100644 --- a/src/devices/heatpump.cpp +++ b/src/devices/heatpump.cpp @@ -29,8 +29,8 @@ Heatpump::Heatpump(uint8_t device_type, uint8_t device_id, uint8_t product_id, c register_telegram_type(0x047B, F("HP2"), false, MAKE_PF_CB(process_HPMonitor2)); // device values - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &airHumidity_, DeviceValueType::UINT, nullptr, FL_(airHumidity), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dewTemperature_, DeviceValueType::UINT, nullptr, FL_(dewTemperature), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &airHumidity_, DeviceValueType::UINT, FL_(airHumidity), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dewTemperature_, DeviceValueType::UINT, FL_(dewTemperature), DeviceValueUOM::DEGREES); } /* diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index b6954880b..cbde2d4bb 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -30,9 +30,14 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c if (flags == EMSdevice::EMS_DEVICE_FLAG_MP) { register_telegram_type(0x5BA, F("HpPoolStatus"), true, MAKE_PF_CB(process_HpPoolStatus)); type_ = Type::MP; - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolTemp_, DeviceValueType::SHORT, FL_(div10), FL_(poolTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &poolTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(poolTemp), + DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolShuntStatus_, DeviceValueType::ENUM, FL_(enum_shunt), FL_(poolShuntStatus), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolShunt_, DeviceValueType::UINT, nullptr, FL_(poolShunt), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &poolShunt_, DeviceValueType::UINT, FL_(poolShunt), DeviceValueUOM::PERCENT); } // EMS+ @@ -43,10 +48,10 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; - register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); - register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, FL_(mixerStatus), DeviceValueUOM::PERCENT); + 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, F("MMPLUSStatusMessage_WWC"), false, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); register_telegram_type(device_id - 0x28 + 0x0313, F("MMPLUSConfigMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSConfigMessage_WWC)); @@ -54,25 +59,23 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c type_ = Type::WWC; hc_ = device_id - 0x28 + 1; uint8_t tag = DeviceValueTAG::TAG_WWC1 + hc_ - 1; - register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(wwPumpStatus), DeviceValueUOM::NONE); - register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(wwTempStatus), DeviceValueUOM::NONE); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(wwTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, FL_(wwPumpStatus), DeviceValueUOM::NONE); + register_device_value(tag, &status_, DeviceValueType::INT, FL_(wwTempStatus), DeviceValueUOM::NONE); - register_device_value(tag, &wwMaxTemp_, DeviceValueType::UINT, nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); - register_device_value(tag, &wwDiffTemp_, DeviceValueType::INT, nullptr, FL_(wwDiffTemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwDiffTemp)); + register_device_value(tag, &wwMaxTemp_, DeviceValueType::UINT, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); + register_device_value(tag, &wwDiffTemp_, DeviceValueType::INT, FL_(wwDiffTemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwDiffTemp)); register_device_value(tag, &wwDisinfectionTemp_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectionTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwDisinfectionTemp)); - register_device_value(tag, &wwReducedTemp_, DeviceValueType::UINT, nullptr, FL_(wwRedTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwReducedTemp)); - register_device_value(tag, &wwRequiredTemp_, DeviceValueType::UINT, nullptr, FL_(wwRequiredTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwRequiredTemp)); + register_device_value(tag, &wwReducedTemp_, DeviceValueType::UINT, FL_(wwRedTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwReducedTemp)); + register_device_value(tag, &wwRequiredTemp_, DeviceValueType::UINT, FL_(wwRequiredTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwRequiredTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, - nullptr, FL_(wwCircPump), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircPump)); @@ -88,13 +91,20 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; - register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); - register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); - register_device_value(tag, &activated_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_activated)); - register_device_value( - tag, &setValveTime_, DeviceValueType::UINT, FL_(mul10), FL_(mixerSetTime), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_setValveTime), 10, 120); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, FL_(mixerStatus), DeviceValueUOM::PERCENT); + 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)); + register_device_value(tag, &activated_, DeviceValueType::BOOL, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_activated)); + register_device_value(tag, + &setValveTime_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL10, + FL_(mixerSetTime), + DeviceValueUOM::SECONDS, + MAKE_CF_CB(set_setValveTime), + 10, + 120); } // HT3 @@ -107,26 +117,23 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c type_ = Type::WWC; hc_ = device_id - 0x40 + 1; uint8_t tag = DeviceValueTAG::TAG_WWC9 + hc_ - 1; - register_device_value(tag, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); - register_device_value(tag, &wwCurTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &wwCurTemp_2_, DeviceValueType::USHORT, FL_(div10), FL_(wwCurTemp2), DeviceValueUOM::DEGREES); - register_device_value(tag, &HydrTemp_, DeviceValueType::USHORT, FL_(div10), FL_(hydrTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE); - register_device_value( - tag, &wwFlowTempOffset_, DeviceValueType::UINT, nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwFlowTempOffset)); - register_device_value(tag, &wwHystOn_, DeviceValueType::INT, nullptr, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOn)); - register_device_value(tag, &wwHystOff_, DeviceValueType::INT, nullptr, FL_(wwHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOff)); + register_device_value(tag, &wwSelTemp_, DeviceValueType::UINT, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); + register_device_value(tag, &wwCurTemp_1_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(wwCurTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &wwCurTemp_2_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(wwCurTemp2), DeviceValueUOM::DEGREES); + register_device_value(tag, &HydrTemp_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(hydrTemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, FL_(pumpStatus), DeviceValueUOM::NONE); + register_device_value(tag, &wwFlowTempOffset_, DeviceValueType::UINT, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwFlowTempOffset)); + register_device_value(tag, &wwHystOn_, DeviceValueType::INT, FL_(wwHystOn), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOn)); + register_device_value(tag, &wwHystOff_, DeviceValueType::INT, FL_(wwHystOff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_wwHystOff)); register_device_value(tag, &wwDisinfectionTemp_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectionTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwDisinfectionTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCircPump_, DeviceValueType::BOOL, - nullptr, FL_(wwCircPump), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCircPump)); @@ -138,11 +145,11 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; - register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); - register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); - register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, FL_(mixerStatus), DeviceValueUOM::PERCENT); + 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)); + register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(flowTempVf), DeviceValueUOM::DEGREES); } } } diff --git a/src/devices/solar.cpp b/src/devices/solar.cpp index 186b06f90..a06893747 100644 --- a/src/devices/solar.cpp +++ b/src/devices/solar.cpp @@ -71,48 +71,68 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c // device values... // special case for a SM100 DHW device_id with 0x2A where it's not actual a solar module if (device_id == 0x2A) { - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_1_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_3_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp3), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_4_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp4), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_5_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp5), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwTemp_7_, DeviceValueType::USHORT, FL_(div10), FL_(wwTemp7), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPump_, DeviceValueType::BOOL, nullptr, FL_(wwPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTemp_1_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwTemp1), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTemp_3_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwTemp3), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTemp_4_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwTemp4), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTemp_5_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwTemp5), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwTemp_7_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwTemp7), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPump_, DeviceValueType::BOOL, FL_(wwPump), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, - nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, - nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwSelTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwRedTemp_, DeviceValueType::UINT, - nullptr, FL_(wwRedTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwRedTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDailyTemp_, DeviceValueType::UINT, - nullptr, FL_(wwDailyTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwDailyTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectionTemp_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectionTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwDisinfectionTemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCirc_, DeviceValueType::BOOL, nullptr, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCirc)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCirc_, DeviceValueType::BOOL, FL_(wwCirc), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwCirc)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCircMode_, DeviceValueType::ENUM, @@ -123,65 +143,83 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwKeepWarm_, DeviceValueType::BOOL, - nullptr, FL_(wwKeepWarm), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwKeepWarm)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwStatus2_, DeviceValueType::ENUM, FL_(enum_wwStatus2), FL_(wwStatus2), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPumpMod_, DeviceValueType::UINT, nullptr, FL_(wwPumpMod), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwFlow_, DeviceValueType::UINT, FL_(div10), FL_(wwFlow), DeviceValueUOM::LMIN); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwPumpMod_, DeviceValueType::UINT, FL_(wwPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwFlow_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(wwFlow), + DeviceValueUOM::LMIN); return; } // common solar values for all modules (except dhw) - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorTemp_, DeviceValueType::SHORT, FL_(div10), FL_(collectorTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylBottomTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylBottomTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump_, DeviceValueType::BOOL, nullptr, FL_(solarPump), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpWorkTime_, DeviceValueType::TIME, nullptr, FL_(pumpWorkTime), DeviceValueUOM::MINUTES); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &cylMaxTemp_, DeviceValueType::UINT, nullptr, FL_(cylMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_cylMaxTemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylHeated_, DeviceValueType::BOOL, nullptr, FL_(cylHeated), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &collectorTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(collectorTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylBottomTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(cylBottomTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump_, DeviceValueType::BOOL, FL_(solarPump), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pumpWorkTime_, DeviceValueType::TIME, FL_(pumpWorkTime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylMaxTemp_, DeviceValueType::UINT, FL_(cylMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_cylMaxTemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorShutdown_, DeviceValueType::BOOL, FL_(collectorShutdown), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylHeated_, DeviceValueType::BOOL, FL_(cylHeated), DeviceValueUOM::NONE); // values per device flag if (flags == EMSdevice::EMS_DEVICE_FLAG_SM10) { - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMod_, DeviceValueType::UINT, nullptr, FL_(solarPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMod_, DeviceValueType::UINT, FL_(solarPumpMod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMinMod_, DeviceValueType::UINT, - nullptr, FL_(pumpMinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_PumpMinMod)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpTurnonDiff_, DeviceValueType::UINT, - nullptr, FL_(solarPumpTurnonDiff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_TurnonDiff)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpTurnoffDiff_, DeviceValueType::UINT, - nullptr, FL_(solarPumpTurnoffDiff), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_TurnoffDiff)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPower_, DeviceValueType::SHORT, nullptr, FL_(solarPower), DeviceValueUOM::W); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &maxFlow_, DeviceValueType::UINT, FL_(div10), FL_(maxFlow), DeviceValueUOM::LMIN, MAKE_CF_CB(set_SM10MaxFlow)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPower_, DeviceValueType::SHORT, FL_(solarPower), DeviceValueUOM::W); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &energyLastHour_, + DeviceValueType::ULONG, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(energyLastHour), + DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &maxFlow_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(maxFlow), + DeviceValueUOM::LMIN, + MAKE_CF_CB(set_SM10MaxFlow)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMinTemp_, DeviceValueType::UINT, - nullptr, FL_(wwMinTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMinTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarIsEnabled_, DeviceValueType::BOOL, - nullptr, FL_(solarIsEnabled), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); @@ -198,106 +236,144 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c */ } if (flags == EMSdevice::EMS_DEVICE_FLAG_ISM) { - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylMiddleTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylMiddleTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retHeatAssist_, DeviceValueType::SHORT, FL_(div10), FL_(retHeatAssist), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Valve_, DeviceValueType::BOOL, nullptr, FL_(m1Valve), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylMiddleTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(cylMiddleTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &retHeatAssist_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(retHeatAssist), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Valve_, DeviceValueType::BOOL, FL_(m1Valve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &energyLastHour_, + DeviceValueType::ULONG, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(energyLastHour), + DeviceValueUOM::WH); } if (flags == EMSdevice::EMS_DEVICE_FLAG_SM100) { - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMod_, DeviceValueType::UINT, nullptr, FL_(solarPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMod_, DeviceValueType::UINT, FL_(solarPumpMod), DeviceValueUOM::PERCENT); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpMinMod_, DeviceValueType::UINT, - FL_(mul5), + DeviceValueNumOp::DV_NUMOP_MUL5, FL_(pumpMinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_PumpMinMod)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpTurnonDiff_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(solarPumpTurnonDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnonDiff)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpTurnoffDiff_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(solarPumpTurnoffDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnoffDiff)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collector2Temp_, DeviceValueType::SHORT, FL_(div10), FL_(collector2Temp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylMiddleTemp_, DeviceValueType::SHORT, FL_(div10), FL_(cylMiddleTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &retHeatAssist_, DeviceValueType::SHORT, FL_(div10), FL_(retHeatAssist), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Valve_, DeviceValueType::BOOL, nullptr, FL_(m1Valve), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Power_, DeviceValueType::UINT, nullptr, FL_(m1Power), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2_, DeviceValueType::BOOL, nullptr, FL_(solarPump2), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2Mod_, DeviceValueType::UINT, nullptr, FL_(solarPump2Mod), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylBottomTemp2_, DeviceValueType::SHORT, FL_(div10), FL_(cyl2BottomTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &collector2Temp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(collector2Temp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylMiddleTemp_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(cylMiddleTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &retHeatAssist_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(retHeatAssist), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Valve_, DeviceValueType::BOOL, FL_(m1Valve), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1Power_, DeviceValueType::UINT, FL_(m1Power), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2_, DeviceValueType::BOOL, FL_(solarPump2), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2Mod_, DeviceValueType::UINT, FL_(solarPump2Mod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &cylBottomTemp2_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(cyl2BottomTemp), + DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatExchangerTemp_, DeviceValueType::SHORT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(heatExchangerTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylPumpMod_, DeviceValueType::UINT, nullptr, FL_(cylPumpMod), DeviceValueUOM::PERCENT); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveStatus_, DeviceValueType::BOOL, nullptr, FL_(valveStatus), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylHeated_, DeviceValueType::BOOL, nullptr, FL_(cylHeated), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorShutdown_, DeviceValueType::BOOL, nullptr, FL_(collectorShutdown), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylPumpMod_, DeviceValueType::UINT, FL_(cylPumpMod), DeviceValueUOM::PERCENT); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &valveStatus_, DeviceValueType::BOOL, FL_(valveStatus), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cylHeated_, DeviceValueType::BOOL, FL_(cylHeated), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorShutdown_, DeviceValueType::BOOL, FL_(collectorShutdown), DeviceValueUOM::NONE); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorMaxTemp_, DeviceValueType::UINT, - nullptr, FL_(collectorMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_CollectorMaxTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collectorMinTemp_, DeviceValueType::UINT, - nullptr, FL_(collectorMinTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_CollectorMinTemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyLastHour_, DeviceValueType::ULONG, FL_(div10), FL_(energyLastHour), DeviceValueUOM::WH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyToday_, DeviceValueType::ULONG, nullptr, FL_(energyToday), DeviceValueUOM::WH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyTotal_, DeviceValueType::ULONG, FL_(div10), FL_(energyTotal), DeviceValueUOM::KWH); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pump2WorkTime_, DeviceValueType::TIME, nullptr, FL_(pump2WorkTime), DeviceValueUOM::MINUTES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1WorkTime_, DeviceValueType::TIME, nullptr, FL_(m1WorkTime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &energyLastHour_, + DeviceValueType::ULONG, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(energyLastHour), + DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyToday_, DeviceValueType::ULONG, FL_(energyToday), DeviceValueUOM::WH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &energyTotal_, + DeviceValueType::ULONG, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(energyTotal), + DeviceValueUOM::KWH); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &pump2WorkTime_, DeviceValueType::TIME, FL_(pump2WorkTime), DeviceValueUOM::MINUTES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &m1WorkTime_, DeviceValueType::TIME, FL_(m1WorkTime), DeviceValueUOM::MINUTES); // register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &cyl2MaxTemp_, DeviceValueType::UINT, nullptr, FL_(cyl2MaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_cyl2MaxTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatTransferSystem_, DeviceValueType::BOOL, - nullptr, FL_(heatTransferSystem), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatTransferSystem)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &externalCyl_, DeviceValueType::BOOL, - nullptr, FL_(externalCyl), DeviceValueUOM::NONE, MAKE_CF_CB(set_externalCyl)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &thermalDisinfect_, DeviceValueType::BOOL, - nullptr, FL_(thermalDisinfect), DeviceValueUOM::NONE, MAKE_CF_CB(set_thermalDisinfect)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatMetering_, DeviceValueType::BOOL, - nullptr, FL_(heatMetering), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatMetering)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarIsEnabled_, DeviceValueType::BOOL, - nullptr, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarEnabled)); @@ -314,7 +390,6 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueTAG::TAG_DEVICE_DATA, &solarPumpKick_, DeviceValueType::BOOL, - nullptr, FL_(solarPumpKick), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarPumpKick)); @@ -322,7 +397,6 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueTAG::TAG_DEVICE_DATA, &plainWaterMode_, DeviceValueType::BOOL, - nullptr, FL_(plainWaterMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_plainWaterMode)); @@ -330,7 +404,6 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueTAG::TAG_DEVICE_DATA, &doubleMatchFlow_, DeviceValueType::BOOL, - nullptr, FL_(doubleMatchFlow), DeviceValueUOM::NONE, MAKE_CF_CB(set_doubleMatchFlow)); @@ -338,21 +411,20 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2MinMod_, DeviceValueType::UINT, - nullptr, FL_(pump2MinMod), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_Pump2MinMod)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2TurnonDiff_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(solarPump2TurnonDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnonDiff2)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2TurnoffDiff_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(solarPump2TurnoffDiff), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_TurnoffDiff2)); @@ -360,7 +432,6 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c DeviceValueTAG::TAG_DEVICE_DATA, &solarPump2Kick_, DeviceValueType::BOOL, - nullptr, FL_(solarPump2Kick), DeviceValueUOM::NONE, MAKE_CF_CB(set_solarPump2Kick)); @@ -369,14 +440,13 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &climateZone_, DeviceValueType::UINT, - nullptr, FL_(climateZone), DeviceValueUOM::NONE, MAKE_CF_CB(set_climateZone)); // climate zone identifier register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collector1Area_, DeviceValueType::USHORT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(collector1Area), DeviceValueUOM::SQM, MAKE_CF_CB(set_collector1Area)); // Area of collector field 1 @@ -390,7 +460,7 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &collector2Area_, DeviceValueType::USHORT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(collector2Area), DeviceValueUOM::SQM, MAKE_CF_CB(set_collector2Area)); // Area of collector field 2 @@ -408,11 +478,31 @@ Solar::Solar(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c FL_(cylPriority), DeviceValueUOM::NONE, MAKE_CF_CB(set_cylPriority)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCntFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(heatCntFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCntRetTemp_, DeviceValueType::USHORT, FL_(div10), FL_(heatCntRetTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCnt_, DeviceValueType::UINT, nullptr, FL_(heatCnt), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &swapFlowTemp_, DeviceValueType::USHORT, FL_(div10), FL_(swapFlowTemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &swapRetTemp_, DeviceValueType::USHORT, FL_(div10), FL_(swapRetTemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &heatCntFlowTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(heatCntFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &heatCntRetTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(heatCntRetTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCnt_, DeviceValueType::UINT, FL_(heatCnt), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &swapFlowTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(swapFlowTemp), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &swapRetTemp_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(swapRetTemp), + DeviceValueUOM::DEGREES); } } diff --git a/src/devices/switch.cpp b/src/devices/switch.cpp index 29fc78490..12deddba7 100644 --- a/src/devices/switch.cpp +++ b/src/devices/switch.cpp @@ -29,9 +29,14 @@ Switch::Switch(uint8_t device_type, uint8_t device_id, uint8_t product_id, const register_telegram_type(0x9D, F("WM10SetMessage"), false, MAKE_PF_CB(process_WM10SetMessage)); register_telegram_type(0x1E, F("WM10TempMessage"), false, MAKE_PF_CB(process_WM10TempMessage)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &activated_, DeviceValueType::BOOL, nullptr, FL_(activated), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &status_, DeviceValueType::INT, nullptr, FL_(status), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &activated_, DeviceValueType::BOOL, FL_(activated), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &flowTempHc_, + DeviceValueType::USHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(flowTempHc), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &status_, DeviceValueType::INT, FL_(status), DeviceValueUOM::NONE); } // message 0x9D switch on/off diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 264777f04..8e344de04 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -34,8 +34,9 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i register_telegram_type(0x047B, F("RemoteHumidity"), false, MAKE_PF_CB(process_RemoteHumidity)); register_telegram_type(0x0273, F("RemoteCorrection"), true, MAKE_PF_CB(process_RemoteCorrection)); register_device_values(); // register device values for common values (not heating circuit) - return; // no values to add + return; // no values to add } + // common telegram handlers register_telegram_type(EMS_TYPE_RCOutdoorTemp, F("RCOutdoorTemp"), false, MAKE_PF_CB(process_RCOutdoorTemp)); register_telegram_type(EMS_TYPE_RCTime, F("RCTime"), false, MAKE_PF_CB(process_RCTime)); @@ -347,6 +348,7 @@ std::shared_ptr Thermostat::heating_circuit(std::sha // set the flag saying we want its data during the next auto fetch // monitor is broadcasted, but not frequently in some thermostats (IVT, #356) + if (monitor_typeids.size()) { toggle_fetch(monitor_typeids[hc_num - 1], toggle_); } @@ -494,45 +496,45 @@ uint8_t Thermostat::HeatingCircuit::get_mode_type() const { std::string Thermostat::mode_tostring(uint8_t mode) { switch (mode) { case HeatingCircuit::Mode::OFF: - return read_flash_string(F_(off)); + return Helpers::translated_word(FL_(off)); case HeatingCircuit::Mode::MANUAL: - return read_flash_string(F_(manual)); + return Helpers::translated_word(FL_(manual)); case HeatingCircuit::Mode::DAY: - return read_flash_string(F_(day)); + return Helpers::translated_word(FL_(day)); case HeatingCircuit::Mode::NIGHT: - return read_flash_string(F_(night)); + return Helpers::translated_word(FL_(night)); case HeatingCircuit::Mode::ECO: - return read_flash_string(F_(eco)); + return Helpers::translated_word(FL_(eco)); case HeatingCircuit::Mode::COMFORT: - return read_flash_string(F_(comfort)); + return Helpers::translated_word(FL_(comfort)); case HeatingCircuit::Mode::HEAT: - return read_flash_string(F_(heat)); + return Helpers::translated_word(FL_(heat)); case HeatingCircuit::Mode::HOLIDAY: - return read_flash_string(F_(holiday)); + return Helpers::translated_word(FL_(holiday)); case HeatingCircuit::Mode::NOFROST: - return read_flash_string(F_(nofrost)); + return Helpers::translated_word(FL_(nofrost)); case HeatingCircuit::Mode::AUTO: - return read_flash_string(F_(auto)); + return Helpers::translated_word(FL_(auto)); case HeatingCircuit::Mode::SUMMER: - return read_flash_string(F_(summer)); + return Helpers::translated_word(FL_(summer)); case HeatingCircuit::Mode::OFFSET: - return read_flash_string(F_(offset)); + return Helpers::translated_word(FL_(offset)); case HeatingCircuit::Mode::DESIGN: - return read_flash_string(F_(design)); + return Helpers::translated_word(FL_(design)); case HeatingCircuit::Mode::MINFLOW: - return read_flash_string(F_(minflow)); + return Helpers::translated_word(FL_(minflow)); case HeatingCircuit::Mode::MAXFLOW: - return read_flash_string(F_(maxflow)); + return Helpers::translated_word(FL_(maxflow)); case HeatingCircuit::Mode::ROOMINFLUENCE: - return read_flash_string(F_(roominfluence[0])); + return Helpers::translated_word(FL_(roominfluence)); case HeatingCircuit::Mode::FLOWOFFSET: - return read_flash_string(F_(flowtempoffset[0])); + return Helpers::translated_word(FL_(flowtempoffset)); case HeatingCircuit::Mode::TEMPAUTO: - return read_flash_string(F_(tempauto)); + return Helpers::translated_word(FL_(tempauto)); case HeatingCircuit::Mode::NOREDUCE: - return read_flash_string(F_(noreduce)); + return Helpers::translated_word(FL_(noreduce)); default: - return read_flash_string(F_(unknown)); + return Helpers::translated_word(FL_(unknown)); } } @@ -630,7 +632,8 @@ void Thermostat::process_RC20Timer(std::shared_ptr telegram) { uint8_t temp = telegram->message_data[0] & 7; uint8_t time = telegram->message_data[1]; - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + std::string sday = Helpers::translated_word(FL_(enum_dayOfWeek)[day]); + if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); } else { @@ -828,12 +831,18 @@ void Thermostat::process_RC35wwTimer(std::shared_ptr telegram) { uint8_t on = telegram->message_data[0] & 1; uint8_t time = telegram->message_data[1]; - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); - char data[sizeof(wwSwitchTime_)]; + char data[sizeof(wwSwitchTime_)]; if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); } else { - snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + snprintf(data, + sizeof(data), + "%02d %s %02d:%02d %s", + no, + Helpers::translated_word(FL_(enum_dayOfWeek)[day]).c_str(), + time / 6, + 10 * (time % 6), + on ? (Helpers::translated_word(FL_(on))).c_str() : (Helpers::translated_word(FL_(on))).c_str()); } if (telegram->type_id == 0x38) { strlcpy(wwSwitchTime_, data, sizeof(wwSwitchTime_)); @@ -1217,7 +1226,8 @@ void Thermostat::process_RC30Timer(std::shared_ptr telegram) { uint8_t temp = telegram->message_data[0] & 7; uint8_t time = telegram->message_data[1]; - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + std::string sday = Helpers::translated_word(FL_(enum_dayOfWeek)[day]); + if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); } else { @@ -1352,11 +1362,17 @@ void Thermostat::process_RC35Timer(std::shared_ptr telegram) { uint8_t on = telegram->message_data[0] & 1; uint8_t time = telegram->message_data[1]; - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); if (day == 7) { snprintf(data, sizeof(data), "%02d not_set", no); } else { - snprintf(data, sizeof(data), "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + snprintf(data, + sizeof(data), + "%02d %s %02d:%02d %s", + no, + Helpers::translated_word(FL_(enum_dayOfWeek)[day]).c_str(), + time / 6, + 10 * (time % 6), + on ? Helpers::translated_word(FL_(on)).c_str() : Helpers::translated_word(FL_(on)).c_str()); } if (!prog) { strlcpy(hc->switchtime1, data, sizeof(hc->switchtime1)); @@ -2264,27 +2280,27 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { uint8_t num = value[0] - '0'; switch (model()) { case EMSdevice::EMS_DEVICE_FLAG_RC10: - mode = read_flash_string(FL_(enum_mode6)[num]); + mode = Helpers::translated_word(FL_(enum_mode6)[num]); break; case EMSdevice::EMS_DEVICE_FLAG_RC20: case EMSdevice::EMS_DEVICE_FLAG_RC20_N: - mode = read_flash_string(FL_(enum_mode2)[num]); + mode = Helpers::translated_word(FL_(enum_mode2)[num]); break; case EMSdevice::EMS_DEVICE_FLAG_RC25: case EMSdevice::EMS_DEVICE_FLAG_RC30: case EMSdevice::EMS_DEVICE_FLAG_RC35: case EMSdevice::EMS_DEVICE_FLAG_RC30_N: - mode = read_flash_string(FL_(enum_mode3)[num]); + mode = Helpers::translated_word(FL_(enum_mode3)[num]); break; case EMSdevice::EMS_DEVICE_FLAG_RC300: case EMSdevice::EMS_DEVICE_FLAG_RC100: - mode = read_flash_string(FL_(enum_mode)[num]); + mode = Helpers::translated_word(FL_(enum_mode)[num]); break; case EMSdevice::EMS_DEVICE_FLAG_JUNKERS: - mode = read_flash_string(FL_(enum_mode4)[num]); + mode = Helpers::translated_word(FL_(enum_mode4)[num]); break; case EMSdevice::EMS_DEVICE_FLAG_CRF: - mode = read_flash_string(FL_(enum_mode5)[num]); + mode = Helpers::translated_word(FL_(enum_mode5)[num]); break; default: return false; @@ -2294,6 +2310,7 @@ bool Thermostat::set_mode(const char * value, const int8_t id) { } uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; + if (mode_tostring(HeatingCircuit::Mode::OFF) == mode) { return set_mode_n(HeatingCircuit::Mode::OFF, hc_num); } @@ -2707,9 +2724,15 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char } if (strlen(value) > 4) { for (uint8_t i = 0; i < 7; i++) { - if (!strncmp(&value[3], read_flash_string(FL_(enum_dayOfWeek)[i]).c_str(), 2)) { + // we use EN settings for the day abbreviation + if (!strncmp(&value[3], read_flash_string(FL_(enum_dayOfWeek)[i][0]).c_str(), 2)) { day = i; } + + // auto translated_dow = Helpers::translated_word(FL_(enum_dayOfWeek)[i]); + // if (!strncmp(&value[3], translated_dow.c_str(), translated_dow.length())) { + // day = i; + // } } } if (strlen(value) > 10) { @@ -2747,13 +2770,20 @@ bool Thermostat::set_switchtime(const char * value, const uint16_t type_id, char return false; } if (data[0] != 0xE7) { - std::string sday = read_flash_string(FL_(enum_dayOfWeek)[day]); + std::string sday = Helpers::translated_word(FL_(enum_dayOfWeek)[day]); if (model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_N) { - snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), on ? "on" : "off"); + snprintf(out, + len, + "%02d %s %02d:%02d %s", + no, + sday.c_str(), + time / 6, + 10 * (time % 6), + on ? Helpers::translated_word(FL_(on)).c_str() : Helpers::translated_word(FL_(on)).c_str()); } else if ((model() == EMS_DEVICE_FLAG_RC20) || (model() == EMS_DEVICE_FLAG_RC30)) { snprintf(out, len, "%02d %s %02d:%02d T%d", no, sday.c_str(), time / 6, 10 * (time % 6), on); } else { - std::string son = read_flash_string(FL_(enum_switchmode)[on]); + std::string son = Helpers::translated_word(FL_(enum_switchmode)[on]); snprintf(out, len, "%02d %s %02d:%02d %s", no, sday.c_str(), time / 6, 10 * (time % 6), son.c_str()); } } else { @@ -3378,17 +3408,22 @@ void Thermostat::register_device_values() { if (device_id() >= 0x38 && device_id() <= 0x3F) { // each device controls only one hc, so we tag the values uint8_t tag = DeviceValueTAG::TAG_HC1 + device_id() - 0x38; - register_device_value(tag, &tempsensor1_, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &dewtemperature_, DeviceValueType::INT, nullptr, FL_(dewTemperature), DeviceValueUOM::DEGREES); - register_device_value(tag, &humidity_, DeviceValueType::INT, nullptr, FL_(airHumidity), DeviceValueUOM::PERCENT); - register_device_value( - tag, &ibaCalIntTemperature_, DeviceValueType::INT, FL_(div10), FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); + register_device_value(tag, &tempsensor1_, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(remotetemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &dewtemperature_, DeviceValueType::INT, FL_(dewTemperature), DeviceValueUOM::DEGREES); + register_device_value(tag, &humidity_, DeviceValueType::INT, FL_(airHumidity), DeviceValueUOM::PERCENT); + register_device_value(tag, + &ibaCalIntTemperature_, + DeviceValueType::INT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(ibaCalIntTemperature), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_calinttemp)); return; } // Common for all thermostats - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &errorCode_, DeviceValueType::STRING, nullptr, FL_(errorCode), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &lastCode_, DeviceValueType::STRING, nullptr, FL_(lastCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &errorCode_, DeviceValueType::STRING, FL_(errorCode), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &lastCode_, DeviceValueType::STRING, FL_(lastCode), DeviceValueUOM::NONE); switch (this->model()) { case EMS_DEVICE_FLAG_RC100: @@ -3409,10 +3444,10 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dampedoutdoortemp2_, DeviceValueType::SHORT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &floordrytemp_, DeviceValueType::UINT, nullptr, FL_(floordrytemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &floordrytemp_, DeviceValueType::UINT, FL_(floordrytemp), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaBuildingType_, DeviceValueType::ENUM, @@ -3423,20 +3458,16 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, - nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &ibaDamping_, DeviceValueType::BOOL, nullptr, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaDamping_, DeviceValueType::BOOL, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); register_device_value( DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwSetTempLow_, DeviceValueType::UINT, - nullptr, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow)); @@ -3450,18 +3481,16 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwChargeDuration_, DeviceValueType::UINT, - FL_(mul15), + DeviceValueNumOp::DV_NUMOP_MUL15, FL_(wwChargeDuration), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_wwchargeduration)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCharge_, DeviceValueType::BOOL, nullptr, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra1_, DeviceValueType::UINT, nullptr, FL_(wwExtra1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra2_, DeviceValueType::UINT, nullptr, FL_(wwExtra2), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwCharge_, DeviceValueType::BOOL, FL_(wwCharge), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcharge)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra1_, DeviceValueType::UINT, FL_(wwExtra1), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwExtra2_, DeviceValueType::UINT, FL_(wwExtra2), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfecting_, DeviceValueType::BOOL, - nullptr, FL_(wwDisinfecting), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); @@ -3475,7 +3504,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, - FL_(mul15), + DeviceValueNumOp::DV_NUMOP_MUL15, FL_(wwDisinfectTime), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_wwDisinfectHour), @@ -3486,7 +3515,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); @@ -3497,35 +3526,32 @@ void Thermostat::register_device_values() { FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &backlight_, DeviceValueType::BOOL, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); register_device_value( DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); break; case EMS_DEVICE_FLAG_RC20_N: case EMS_DEVICE_FLAG_RC25: - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, - nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); break; case EMS_DEVICE_FLAG_RC20: - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; case EMS_DEVICE_FLAG_RC30: - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaClockOffset_, DeviceValueType::INT, - nullptr, FL_(ibaClockOffset), DeviceValueUOM::SECONDS, MAKE_CF_CB(set_clockoffset)); // offset (in sec) to clock, 0xff=-1s, 0x02=2s - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &autodst_, DeviceValueType::BOOL, nullptr, FL_(autodst), DeviceValueUOM::NONE, MAKE_CF_CB(set_autodst)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &autodst_, DeviceValueType::BOOL, FL_(autodst), DeviceValueUOM::NONE, MAKE_CF_CB(set_autodst)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaLanguage_, DeviceValueType::ENUM, @@ -3539,26 +3565,11 @@ void Thermostat::register_device_values() { FL_(enum_ibaMainDisplay), FL_(ibaMainDisplay), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &backlight_, DeviceValueType::BOOL, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &backlight_, DeviceValueType::BOOL, nullptr, FL_(backlight), DeviceValueUOM::NONE, MAKE_CF_CB(set_backlight)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &brightness_, - DeviceValueType::INT, - nullptr, - FL_(brightness), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_brightness), - -15, - 15); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &mixingvalves_, - DeviceValueType::UINT, - nullptr, - FL_(mixingvalves), - DeviceValueUOM::NONE, - MAKE_CF_CB(set_mixingvalves), - 0, - 2); + DeviceValueTAG::TAG_DEVICE_DATA, &brightness_, DeviceValueType::INT, FL_(brightness), DeviceValueUOM::NONE, MAKE_CF_CB(set_brightness), -15, 15); + register_device_value( + DeviceValueTAG::TAG_DEVICE_DATA, &mixingvalves_, DeviceValueType::UINT, FL_(mixingvalves), DeviceValueUOM::NONE, MAKE_CF_CB(set_mixingvalves), 0, 2); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaBuildingType_, DeviceValueType::ENUM, @@ -3573,30 +3584,34 @@ void Thermostat::register_device_values() { FL_(heatingPID), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingpid)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &preheating_, DeviceValueType::BOOL, nullptr, FL_(preheating), DeviceValueUOM::NONE, MAKE_CF_CB(set_preheating)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &preheating_, DeviceValueType::BOOL, FL_(preheating), DeviceValueUOM::NONE, MAKE_CF_CB(set_preheating)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &offtemp_, DeviceValueType::UINT, FL_(div2), FL_(offtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_offtemp), 5, 30); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &offtemp_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(offtemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_offtemp), + 5, + 30); register_device_value( DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode3), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwWhenModeOff_, DeviceValueType::BOOL, - nullptr, FL_(wwWhenModeOff), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwwhenmodeoff)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfecting_, DeviceValueType::BOOL, - nullptr, FL_(wwDisinfecting), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); @@ -3610,7 +3625,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectHour), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), @@ -3632,7 +3646,7 @@ void Thermostat::register_device_values() { MAKE_CF_CB(set_wwVacation)); break; case EMS_DEVICE_FLAG_RC30_N: - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaMainDisplay_, DeviceValueType::ENUM, @@ -3643,24 +3657,22 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaClockOffset_, DeviceValueType::INT, - nullptr, FL_(ibaClockOffset), DeviceValueUOM::SECONDS); // offset (in sec) to clock, 0xff=-1s, 0x02=2s register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, - nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dampedoutdoortemp_, DeviceValueType::INT, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaBuildingType_, DeviceValueType::ENUM, @@ -3694,7 +3706,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfecting_, DeviceValueType::BOOL, - nullptr, FL_(wwDisinfecting), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); @@ -3708,7 +3719,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectHour), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), @@ -3717,14 +3727,12 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, - nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwOneTimeKey_, DeviceValueType::BOOL, - nullptr, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); @@ -3768,7 +3776,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaCalIntTemperature_, DeviceValueType::INT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(ibaCalIntTemperature), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_calinttemp), @@ -3777,15 +3785,23 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaMinExtTemperature_, DeviceValueType::INT, - nullptr, FL_(ibaMinExtTemperature), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minexttemp)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tempsensor1_, DeviceValueType::SHORT, FL_(div10), FL_(tempsensor1), DeviceValueUOM::DEGREES); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tempsensor2_, DeviceValueType::SHORT, FL_(div10), FL_(tempsensor2), DeviceValueUOM::DEGREES); - register_device_value( - DeviceValueTAG::TAG_DEVICE_DATA, &ibaDamping_, DeviceValueType::BOOL, nullptr, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dampedoutdoortemp_, DeviceValueType::INT, nullptr, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &tempsensor1_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(tempsensor1), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &tempsensor2_, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(tempsensor2), + DeviceValueUOM::DEGREES); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaDamping_, DeviceValueType::BOOL, FL_(damping), DeviceValueUOM::NONE, MAKE_CF_CB(set_damping)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dampedoutdoortemp_, DeviceValueType::INT, FL_(dampedoutdoortemp), DeviceValueUOM::DEGREES); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &ibaBuildingType_, DeviceValueType::ENUM, @@ -3819,7 +3835,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfecting_, DeviceValueType::BOOL, - nullptr, FL_(wwDisinfecting), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfect)); @@ -3833,7 +3848,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwDisinfectHour_, DeviceValueType::UINT, - nullptr, FL_(wwDisinfectHour), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), @@ -3842,14 +3856,12 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxTemp_, DeviceValueType::UINT, - nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwOneTimeKey_, DeviceValueType::BOOL, - nullptr, FL_(wwOneTimeKey), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwOneTimeKey)); @@ -3905,7 +3917,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &switchOverTemp_, DeviceValueType::INT, - nullptr, FL_(switchOverTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_switchOverTemp), @@ -3914,7 +3925,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &energyCostRatio_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(energyCostRatio), DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), @@ -3923,7 +3934,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &fossileFactor_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(fossileFactor), DeviceValueUOM::NONE, MAKE_CF_CB(set_fossileFactor), @@ -3932,7 +3943,7 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &electricFactor_, DeviceValueType::UINT, - FL_(div10), + DeviceValueNumOp::DV_NUMOP_DIV10, FL_(electricFactor), DeviceValueUOM::NONE, MAKE_CF_CB(set_electricFactor), @@ -3941,7 +3952,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &delayBoiler_, DeviceValueType::UINT, - nullptr, FL_(delayBoiler), DeviceValueUOM::MINUTES, MAKE_CF_CB(set_delayBoiler), @@ -3950,7 +3960,6 @@ void Thermostat::register_device_values() { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &tempDiffBoiler_, DeviceValueType::UINT, - nullptr, FL_(tempDiffBoiler), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_tempDiffBoiler), @@ -3959,11 +3968,11 @@ void Thermostat::register_device_values() { break; case EMS_DEVICE_FLAG_EASY: // Easy TC100 have no date/time, see issue #100, not sure about CT200, so leave it. - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; case EMS_DEVICE_FLAG_CRF: default: - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime break; } } @@ -3976,18 +3985,18 @@ void Thermostat::register_device_values_hc(std::shared_ptrhc(); // different logic on how temperature values are stored, depending on model - const __FlashStringHelper * const * seltemp_divider; - const __FlashStringHelper * const * roomtemp_divider; + uint8_t seltemp_divider; + uint8_t roomtemp_divider; if (model == EMS_DEVICE_FLAG_EASY) { - seltemp_divider = FL_(div100); - roomtemp_divider = FL_(div100); + seltemp_divider = DeviceValueNumOp::DV_NUMOP_DIV100; + roomtemp_divider = DeviceValueNumOp::DV_NUMOP_DIV100; } else if (model == EMS_DEVICE_FLAG_JUNKERS) { - seltemp_divider = FL_(div10); - roomtemp_divider = FL_(div10); + seltemp_divider = DeviceValueNumOp::DV_NUMOP_DIV10; + roomtemp_divider = DeviceValueNumOp::DV_NUMOP_DIV10; } else { - seltemp_divider = FL_(div2); - roomtemp_divider = FL_(div10); + seltemp_divider = DeviceValueNumOp::DV_NUMOP_DIV2; + roomtemp_divider = DeviceValueNumOp::DV_NUMOP_DIV10; } if (has_flags(EMS_DEVICE_FLAG_NO_WRITE)) { register_device_value(tag, &hc->selTemp, DeviceValueType::SHORT, seltemp_divider, FL_(selRoomTemp), DeviceValueUOM::DEGREES); @@ -4000,31 +4009,41 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode6), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); - register_device_value(tag, &hc->reducehours, DeviceValueType::UINT, nullptr, FL_(reducehours), DeviceValueUOM::HOURS, MAKE_CF_CB(set_reducehours)); - register_device_value(tag, &hc->reduceminutes, DeviceValueType::USHORT, nullptr, FL_(reduceminutes), DeviceValueUOM::MINUTES); + register_device_value( + tag, &hc->daytemp, 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->reducehours, DeviceValueType::UINT, FL_(reducehours), DeviceValueUOM::HOURS, MAKE_CF_CB(set_reducehours)); + register_device_value(tag, &hc->reduceminutes, DeviceValueType::USHORT, FL_(reduceminutes), DeviceValueUOM::MINUTES); break; case EMS_DEVICE_FLAG_RC100: case EMS_DEVICE_FLAG_RC300: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(ecotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ecotemp)); - register_device_value(tag, &hc->manualtemp, DeviceValueType::UINT, FL_(div2), FL_(manualtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_manualtemp)); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(comforttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_comforttemp)); - register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 10, 30); - register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, nullptr, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp)); - register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, nullptr, FL_(offsettemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_offsettemp)); - register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); - register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); register_device_value( - tag, &hc->roominfl_factor, DeviceValueType::UINT, FL_(div10), FL_(roominfl_factor), DeviceValueUOM::NONE, MAKE_CF_CB(set_roominfl_factor)); - register_device_value(tag, &hc->curroominfl, DeviceValueType::SHORT, FL_(div10), FL_(curroominfl), DeviceValueUOM::DEGREES_R); + tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(ecotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ecotemp)); + register_device_value( + tag, &hc->manualtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(manualtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_manualtemp)); + register_device_value( + tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(comforttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_comforttemp)); + register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 10, 30); + register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp)); + register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, FL_(offsettemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_offsettemp)); + 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->roominfluence, DeviceValueType::UINT, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); + register_device_value(tag, + &hc->roominfl_factor, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(roominfl_factor), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_roominfl_factor)); + register_device_value(tag, &hc->curroominfl, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(curroominfl), DeviceValueUOM::DEGREES_R); register_device_value( tag, &hc->nofrostmode, DeviceValueType::ENUM, FL_(enum_nofrostmode1), FL_(nofrostmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_nofrostmode)); - register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); - register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); + register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, FL_(targetflowtemp), DeviceValueUOM::DEGREES); register_device_value( tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( @@ -4041,65 +4060,99 @@ void Thermostat::register_device_values_hc(std::shared_ptrcontrolmode, DeviceValueType::ENUM, FL_(enum_controlmode1), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - register_device_value( - tag, &hc->tempautotemp, DeviceValueType::INT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp), -1, 30); - register_device_value( - tag, &hc->remoteseltemp, DeviceValueType::INT, FL_(div2), FL_(remoteseltemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remoteseltemp), -1, 30); - register_device_value(tag, &hc->fastHeatup, DeviceValueType::UINT, nullptr, FL_(fastheatup), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_fastheatup)); + register_device_value(tag, + &hc->tempautotemp, + DeviceValueType::INT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(tempautotemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_tempautotemp), + -1, + 30); + register_device_value(tag, + &hc->remoteseltemp, + DeviceValueType::INT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(remoteseltemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_remoteseltemp), + -1, + 30); + register_device_value(tag, &hc->fastHeatup, DeviceValueType::UINT, FL_(fastheatup), DeviceValueUOM::PERCENT, MAKE_CF_CB(set_fastheatup)); register_device_value(tag, &hc->switchonoptimization, DeviceValueType::BOOL, - nullptr, FL_(switchonoptimization), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchonoptimization)); register_device_value(tag, &hc->reducemode, DeviceValueType::ENUM, FL_(enum_reducemode1), FL_(reducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_reducemode)); - register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp)); - register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, nullptr, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp)); - register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, nullptr, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); + register_device_value(tag, &hc->noreducetemp, 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->wwprio, DeviceValueType::BOOL, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); break; case EMS_DEVICE_FLAG_CRF: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode5), FL_(mode), DeviceValueUOM::NONE); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype5), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, FL_(targetflowtemp), DeviceValueUOM::DEGREES); break; case EMS_DEVICE_FLAG_RC20: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); - register_device_value(tag, &hc->manualtemp, DeviceValueType::UINT, FL_(div2), FL_(manualtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_manualtemp)); - register_device_value(tag, &hc->daylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); - register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value( + tag, &hc->manualtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(manualtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_manualtemp)); + register_device_value( + tag, &hc->daylowtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); + register_device_value( + tag, &hc->daymidtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); + register_device_value( + tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); + register_device_value( + tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); register_device_value( tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime1), FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); break; case EMS_DEVICE_FLAG_RC20_N: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value( + tag, &hc->daytemp, 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->program, DeviceValueType::ENUM, FL_(enum_progMode3), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); - register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); + 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->tempautotemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(tempautotemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_tempautotemp)); 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->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 10, 30); + register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 10, 30); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); - register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(remotetemp), DeviceValueUOM::DEGREES); break; case EMS_DEVICE_FLAG_RC25: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value( + tag, &hc->daytemp, 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->program, DeviceValueType::ENUM, FL_(enum_progMode3), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); - register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); + 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->tempautotemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(tempautotemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_tempautotemp)); 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->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 9, 25); + register_device_value(tag, &hc->summertemp, 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); break; case EMS_DEVICE_FLAG_RC30: @@ -4107,41 +4160,64 @@ 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, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); - register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, 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)); + register_device_value(tag, &hc->party, DeviceValueType::UINT, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); register_device_value( tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime1), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); 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->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode2), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); - register_device_value(tag, &hc->holidaytemp, DeviceValueType::UINT, FL_(div2), FL_(holidaytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_holidaytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); - register_device_value(tag, &hc->daylowtemp, DeviceValueType::UINT, FL_(div2), FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); - register_device_value(tag, &hc->daymidtemp, DeviceValueType::UINT, FL_(div2), FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); + register_device_value(tag, + &hc->holidaytemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(holidaytemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_holidaytemp)); + register_device_value( + tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(nighttemp2), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); + register_device_value( + tag, &hc->daylowtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daylowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daylowtemp)); + register_device_value( + tag, &hc->daymidtemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(daymidtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daymidtemp)); + register_device_value( + tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(dayhightemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); break; case EMS_DEVICE_FLAG_RC30_N: case EMS_DEVICE_FLAG_RC35: register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode3), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype3), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(daytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_daytemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(nighttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nighttemp)); - register_device_value(tag, &hc->designtemp, DeviceValueType::UINT, nullptr, FL_(designtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_designtemp)); - register_device_value(tag, &hc->offsettemp, DeviceValueType::INT, FL_(div2), FL_(offsettemp), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_offsettemp)); - register_device_value(tag, &hc->holidaytemp, DeviceValueType::UINT, FL_(div2), FL_(holidaytemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_holidaytemp)); - register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &hc->summertemp, DeviceValueType::UINT, nullptr, FL_(summertemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_summertemp), 9, 25); + register_device_value( + tag, &hc->daytemp, 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->offsettemp, + DeviceValueType::INT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(offsettemp), + DeviceValueUOM::DEGREES_R, + MAKE_CF_CB(set_offsettemp)); + register_device_value(tag, + &hc->holidaytemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(holidaytemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_holidaytemp)); + register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, FL_(targetflowtemp), DeviceValueUOM::DEGREES); + register_device_value(tag, &hc->summertemp, 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, nullptr, FL_(holidaymode), DeviceValueUOM::NONE); - register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, nullptr, FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); + 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->nofrostmode, DeviceValueType::ENUM, FL_(enum_nofrostmode), FL_(nofrostmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_nofrostmode)); - register_device_value(tag, &hc->roominfluence, DeviceValueType::UINT, nullptr, FL_(roominfluence), DeviceValueUOM::DEGREES_R, MAKE_CF_CB(set_roominfluence)); - register_device_value(tag, &hc->minflowtemp, DeviceValueType::UINT, nullptr, FL_(minflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_minflowtemp)); - register_device_value(tag, &hc->maxflowtemp, DeviceValueType::UINT, nullptr, FL_(maxflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_maxflowtemp)); - register_device_value( - tag, &hc->flowtempoffset, DeviceValueType::UINT, nullptr, 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)); + 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->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)); @@ -4151,16 +4227,28 @@ 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, nullptr, FL_(pause), DeviceValueUOM::HOURS, MAKE_CF_CB(set_pause)); - register_device_value(tag, &hc->party, DeviceValueType::UINT, nullptr, FL_(party), DeviceValueUOM::HOURS, MAKE_CF_CB(set_party)); - register_device_value(tag, &hc->tempautotemp, DeviceValueType::UINT, FL_(div2), FL_(tempautotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_tempautotemp)); - register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp)); - register_device_value(tag, &hc->reducetemp, DeviceValueType::INT, nullptr, FL_(reducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_reducetemp)); - register_device_value(tag, &hc->vacreducetemp, DeviceValueType::INT, nullptr, FL_(vacreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_vacreducetemp)); + 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->tempautotemp, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(tempautotemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_tempautotemp)); + register_device_value(tag, &hc->noreducetemp, 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->vacreducemode, DeviceValueType::ENUM, FL_(enum_reducemode), FL_(vacreducemode), DeviceValueUOM::NONE, MAKE_CF_CB(set_vacreducemode)); - register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); - register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, nullptr, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); + register_device_value(tag, + &hc->remotetemp, + DeviceValueType::SHORT, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(remotetemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_remotetemp)); + register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, FL_(wwprio), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwprio)); register_device_value( tag, &hc->switchtime1, DeviceValueType::STRING, FL_(tpl_switchtime), FL_(switchtime1), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime1)); register_device_value( @@ -4169,13 +4257,21 @@ void Thermostat::register_device_values_hc(std::shared_ptrmode, DeviceValueType::ENUM, FL_(enum_mode4), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->modetype, DeviceValueType::ENUM, FL_(enum_modetype4), FL_(modetype), DeviceValueUOM::NONE); - register_device_value(tag, &hc->daytemp, DeviceValueType::UINT, FL_(div2), FL_(heattemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_heattemp)); - register_device_value(tag, &hc->nighttemp, DeviceValueType::UINT, FL_(div2), FL_(ecotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ecotemp)); - register_device_value(tag, &hc->nofrosttemp, DeviceValueType::INT, FL_(div2), FL_(nofrosttemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_nofrosttemp)); + register_device_value( + tag, &hc->daytemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(heattemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_heattemp)); + register_device_value( + tag, &hc->nighttemp, DeviceValueType::UINT, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(ecotemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_ecotemp)); + register_device_value(tag, + &hc->nofrosttemp, + DeviceValueType::INT, + DeviceValueNumOp::DV_NUMOP_DIV2, + FL_(nofrosttemp), + DeviceValueUOM::DEGREES, + MAKE_CF_CB(set_nofrosttemp)); register_device_value(tag, &hc->control, DeviceValueType::ENUM, FL_(enum_j_control), FL_(control), DeviceValueUOM::NONE, MAKE_CF_CB(set_control)); register_device_value(tag, &hc->program, DeviceValueType::ENUM, FL_(enum_progMode4), FL_(program), DeviceValueUOM::NONE, MAKE_CF_CB(set_program)); - register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &hc->targetflowtemp, DeviceValueType::UINT, nullptr, FL_(targetflowtemp), DeviceValueUOM::DEGREES); + 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); break; default: break; diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index c3ab9e431..9f1f2eb69 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -51,6 +51,7 @@ std::string EMSdevice::tag_to_mqtt(uint8_t tag) { return read_flash_string(DeviceValue::DeviceValueTAG_mqtt[tag]); } +// convert UOM to a string - these don't need translating std::string EMSdevice::uom_to_string(uint8_t uom) { if (EMSESP::system_.fahrenheit() && (uom == DeviceValueUOM::DEGREES || uom == DeviceValueUOM::DEGREES_R)) { return read_flash_string(DeviceValue::DeviceValueUOM_s[DeviceValueUOM::FAHRENHEIT]); @@ -107,7 +108,7 @@ std::string EMSdevice::device_type_2_device_name(const uint8_t device_type) { case DeviceType::GATEWAY: return read_flash_string(F_(gateway)); default: - return read_flash_string(F_(unknown)); + return Helpers::translated_word(FL_(unknown)); } } @@ -258,7 +259,8 @@ bool EMSdevice::has_tag(const uint8_t tag) const { // called from the command 'entities' void EMSdevice::list_device_entries(JsonObject & output) const { for (const auto & dv : devicevalues_) { - if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.type != DeviceValueType::CMD && dv.full_name) { + auto fullname = Helpers::translated_fword(dv.fullname); + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.type != DeviceValueType::CMD && fullname) { // if we have a tag prefix it char key[50]; if (!EMSdevice::tag_to_mqtt(dv.tag).empty()) { @@ -270,7 +272,7 @@ void EMSdevice::list_device_entries(JsonObject & output) const { JsonArray details = output.createNestedArray(key); // add the full name description - details.add(dv.full_name); + details.add(fullname); // add uom if (!uom_to_string(dv.uom).empty() && uom_to_string(dv.uom) != " ") { @@ -386,23 +388,31 @@ void EMSdevice::register_telegram_type(const uint16_t telegram_type_id, const __ // tag: to be used to group mqtt together, either as separate topics as a nested object // value_p: pointer to the value from the .h file // type: one of DeviceValueType -// options: options for enum or a divider for int (e.g. F("10")) +// options: options for enum, which are translated as a list of lists +// options_single: list of names +// numeric_operatpr: to divide or multiply, see DeviceValueNumOps:: // short_name: used in Mqtt as keys -// full_name: used in Web and Console unless empty (nullptr) +// fullname: used in Web and Console unless empty (nullptr) - can be translated // uom: unit of measure from DeviceValueUOM // has_cmd: true if this is an associated command // min: min allowed value // max: max allowed value -void EMSdevice::register_device_value(uint8_t tag, - void * value_p, - uint8_t type, - const __FlashStringHelper * const * options, - const __FlashStringHelper * short_name, - const __FlashStringHelper * full_name, - uint8_t uom, - bool has_cmd, - int16_t min, - uint16_t max) { +void EMSdevice::add_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * options_single, + int8_t numeric_operator, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max) { + bool has_cmd = (f != nullptr); + + auto short_name = name[0]; + const class __FlashStringHelper * const * fullname = &name[1]; // translations start at index 1 + // initialize the device value depending on it's type if (type == DeviceValueType::STRING) { *(char *)(value_p) = {'\0'}; // this is important for string functions like strlen() to work later @@ -420,15 +430,6 @@ void EMSdevice::register_device_value(uint8_t tag, *(uint8_t *)(value_p) = EMS_VALUE_UINT_NOTSET; // enums behave as uint8_t } - // count #options - uint8_t options_size = 0; - if (options != nullptr) { - uint8_t i = 0; - while (options[i++]) { - options_size++; - } - } - // determine state uint8_t state = DeviceValueState::DV_DEFAULT; @@ -448,28 +449,11 @@ void EMSdevice::register_device_value(uint8_t tag, } }); - // add the device - devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_size, short_name, full_name, uom, 0, has_cmd, min, max, state); -} - -// function with min and max values -// adds a new command to the command list -void EMSdevice::register_device_value(uint8_t tag, - void * value_p, - uint8_t type, - const __FlashStringHelper * const * options, - const __FlashStringHelper * const * name, - uint8_t uom, - const cmd_function_p f, - int16_t min, - uint16_t max) { - auto short_name = name[0]; - auto full_name = name[1]; - - register_device_value(tag, value_p, type, options, short_name, full_name, uom, (f != nullptr), min, max); + // add the device entity + devicevalues_.emplace_back(device_type_, tag, value_p, type, options, options_single, numeric_operator, short_name, fullname, uom, has_cmd, min, max, state); // add a new command if it has a function attached - if (f == nullptr) { + if (!has_cmd) { return; } @@ -484,29 +468,109 @@ void EMSdevice::register_device_value(uint8_t tag, } // add the command to our library - // cmd is the short_name and the description is the full_name - Command::add(device_type_, short_name, f, full_name, flags); + // cmd is the short_name and the description is the fullname + Command::add(device_type_, short_name, f, Helpers::translated_fword(fullname), flags); } -// function with no min and max values (set to 0) +// single list of options +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const * options_single, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f) { + // create a multi-list from the options + add_device_value(tag, value_p, type, nullptr, options_single, 0, name, uom, f, 0, 0); +}; + +// single list of options, with no translations, with min and max +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const * options_single, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max) { + // create a multi-list from the options + add_device_value(tag, value_p, type, nullptr, options_single, 0, name, uom, f, min, max); +}; + void EMSdevice::register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, + int8_t numeric_operator, const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f) { - register_device_value(tag, value_p, type, options, name, uom, f, 0, 0); + add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, 0, 0); } -// no associated command function, or min/max values void EMSdevice::register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, + int8_t numeric_operator, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max) { + add_device_value(tag, value_p, type, nullptr, nullptr, numeric_operator, name, uom, f, min, max); +} + +// no options, no function +void EMSdevice::register_device_value(uint8_t tag, void * value_p, uint8_t type, const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f) { + add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, 0, 0); +}; + +// no options, with min/max +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, const __FlashStringHelper * const * name, - uint8_t uom) { - register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max) { + add_device_value(tag, value_p, type, nullptr, nullptr, 0, name, uom, f, min, max); +}; + +// function with min and max values +// adds a new command to the command list +// in this function we separate out the short and long names and take any translations +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max) { + add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, min, max); +} + +// function with no min and max values (set to 0) +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f) { + add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, f, 0, 0); +} + +// no associated command function, or min/max values +void EMSdevice::register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom) { + add_device_value(tag, value_p, type, options, nullptr, 0, name, uom, nullptr, 0, 0); } // check if value is readable via mqtt/api @@ -572,7 +636,8 @@ void EMSdevice::publish_value(void * value_p) const { snprintf(topic, sizeof(topic), "%s/%s", Mqtt::tag_to_topic(device_type_, dv.tag).c_str(), read_flash_string(dv.short_name).c_str()); } - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + int8_t num_op = dv.numeric_operator; + char payload[55] = {'\0'}; uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; @@ -585,32 +650,32 @@ void EMSdevice::publish_value(void * value_p) const { if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { Helpers::render_value(payload, *(uint8_t *)(value_p), 0); } else { - strlcpy(payload, read_flash_string(dv.options[*(uint8_t *)(value_p)]).c_str(), sizeof(payload)); + auto enum_str = Helpers::translated_word(dv.options[*(uint8_t *)(value_p)]); + strlcpy(payload, enum_str.c_str(), sizeof(payload)); } } break; } case DeviceValueType::USHORT: - Helpers::render_value(payload, *(uint16_t *)(value_p), divider, fahrenheit); + Helpers::render_value(payload, *(uint16_t *)(value_p), num_op, fahrenheit); break; case DeviceValueType::UINT: - Helpers::render_value(payload, *(uint8_t *)(value_p), divider, fahrenheit); + Helpers::render_value(payload, *(uint8_t *)(value_p), num_op, fahrenheit); break; case DeviceValueType::SHORT: - Helpers::render_value(payload, *(int16_t *)(value_p), divider, fahrenheit); + Helpers::render_value(payload, *(int16_t *)(value_p), num_op, fahrenheit); break; case DeviceValueType::INT: - Helpers::render_value(payload, *(int8_t *)(value_p), divider, fahrenheit); + Helpers::render_value(payload, *(int8_t *)(value_p), num_op, fahrenheit); break; case DeviceValueType::ULONG: - Helpers::render_value(payload, *(uint32_t *)(value_p), divider, fahrenheit); + Helpers::render_value(payload, *(uint32_t *)(value_p), num_op, fahrenheit); break; - case DeviceValueType::BOOL: { + case DeviceValueType::BOOL: Helpers::render_boolean(payload, (bool)*(uint8_t *)(value_p)); break; - } case DeviceValueType::TIME: - Helpers::render_value(payload, *(uint32_t *)(value_p), divider); + Helpers::render_value(payload, *(uint32_t *)(value_p), num_op); break; case DeviceValueType::STRING: if (Helpers::hasValue((char *)(value_p))) { @@ -648,7 +713,8 @@ std::string EMSdevice::get_value_uom(const char * key) const { // look up key in our device value list for (const auto & dv : devicevalues_) { - if ((!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name) && (read_flash_string(dv.full_name) == key_p)) { + auto fullname = Helpers::translated_fword(dv.fullname); + if ((!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && fullname) && (read_flash_string(fullname) == key_p)) { // ignore TIME since "minutes" is already added to the string value if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { break; @@ -669,11 +735,13 @@ void EMSdevice::generate_values_web(JsonObject & output) { JsonArray data = output.createNestedArray("data"); for (auto & dv : devicevalues_) { + auto fullname = Helpers::translated_fword(dv.fullname); + // check conditions: - // 1. full_name cannot be empty + // 1. fullname cannot be empty // 2. it must have a valid value, if it is not a command like 'reset' // 3. show favorites first - if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { + if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && fullname && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value uint8_t fahrenheit = 0; @@ -691,33 +759,28 @@ void EMSdevice::generate_values_web(JsonObject & output) { // handle ENUMs else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + obj["v"] = Helpers::translated_word(dv.options[*(uint8_t *)(dv.value_p)]); } // handle numbers else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + // note, the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler + fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + obj["v"] = Helpers::transformNumFloat(*(int8_t *)(dv.value_p), dv.numeric_operator, fahrenheit); } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + obj["v"] = Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), dv.numeric_operator, fahrenheit); } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + obj["v"] = Helpers::transformNumFloat(*(int16_t *)(dv.value_p), dv.numeric_operator, fahrenheit); } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + obj["v"] = Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), dv.numeric_operator, fahrenheit); } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - obj["v"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); + obj["v"] = Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), dv.numeric_operator, fahrenheit); } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - obj["v"] = (divider > 0) ? time_value / divider : time_value; // sometimes we need to divide by 60 + obj["v"] = dv.numeric_operator ? (*(uint32_t *)(dv.value_p) / dv.numeric_operator) : *(uint32_t *)(dv.value_p); } else { - // must have a value for sorting to work - obj["v"] = ""; + obj["v"] = ""; // must have a value for sorting to work } } @@ -728,9 +791,9 @@ void EMSdevice::generate_values_web(JsonObject & output) { // add name, prefixing the tag if it exists. This is the id used in the WebUI table and must be unique if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["id"] = mask + read_flash_string(dv.full_name); + obj["id"] = mask + Helpers::translated_word(dv.fullname); } else { - obj["id"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + obj["id"] = mask + tag_to_string(dv.tag) + " " + Helpers::translated_word(dv.fullname); } // add commands and options @@ -741,12 +804,14 @@ void EMSdevice::generate_values_web(JsonObject & output) { } else { obj["c"] = dv.short_name; } + // add the Command options if (dv.type == DeviceValueType::ENUM || (dv.type == DeviceValueType::CMD && dv.options_size > 1)) { JsonArray l = obj.createNestedArray("l"); for (uint8_t i = 0; i < dv.options_size; i++) { - if (!read_flash_string(dv.options[i]).empty()) { - l.add(read_flash_string(dv.options[i])); + auto enum_str = Helpers::translated_word(dv.options[i]); + if (!enum_str.empty()) { + l.add(enum_str); } } } else if (dv.type == DeviceValueType::BOOL) { @@ -758,18 +823,19 @@ void EMSdevice::generate_values_web(JsonObject & output) { // add command help template else if (dv.type == DeviceValueType::STRING || dv.type == DeviceValueType::CMD) { if (dv.options_size == 1) { - obj["h"] = dv.options[0]; + obj["h"] = dv.options_single[0]; // NOT translated } } - // add steps to numeric values with divider/multiplier + // handle INTs + // add steps to numeric values with numeric_operator else { - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; - char s[10]; - if (divider > 0) { - obj["s"] = Helpers::render_value(s, (float)1 / divider, 1); - } else if (divider < 0) { - obj["s"] = Helpers::render_value(s, (-1) * divider, 0); + char s[10]; + if (dv.numeric_operator > 0) { + obj["s"] = Helpers::render_value(s, (float)1 / dv.numeric_operator, 1); + } else if (dv.numeric_operator < 0) { + obj["s"] = Helpers::render_value(s, (-1) * dv.numeric_operator, 0); } + int16_t dv_set_min, dv_set_max; if (dv.get_min_max(dv_set_min, dv_set_max)) { obj["m"] = Helpers::render_value(s, dv_set_min, 0); @@ -804,39 +870,45 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { // handle ENUMs else if ((dv.type == DeviceValueType::ENUM) && (*(uint8_t *)(dv.value_p) < dv.options_size)) { - obj["v"] = dv.options[*(uint8_t *)(dv.value_p)]; + obj["v"] = Helpers::translated_word(dv.options[*(uint8_t *)(dv.value_p)]); } // handle Integers and Floats else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - // the nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler - uint8_t divider = 0; - uint8_t factor = 1; - if (dv.options_size == 1) { - auto s_str = read_flash_string(dv.options[0]); // prevent object backing the pointer will be destroyed at the end of the full-expression - const char * s = s_str.c_str(); - if (s[0] == '*') { - factor = Helpers::atoint(&s[1]); - } else { - divider = Helpers::atoint(s); - } + int8_t num_op = dv.numeric_operator; + bool make_float; + if (num_op == 0) { + // no changes to number + make_float = false; + num_op = 1; // so it gets *1 + } else if (num_op < 0) { + // negative numbers, convert to a positive multiplier + make_float = false; + num_op *= -1; + } else { + // has a divider, make it a float + make_float = true; + } + + // always convert temperatures to floats with 1 decimal place + if ((dv.uom == DeviceValueUOM::DEGREES) || (dv.uom == DeviceValueUOM::DEGREES_R)) { + make_float = true; } if (dv.type == DeviceValueType::INT) { - obj["v"] = divider ? Helpers::round2(*(int8_t *)(dv.value_p), divider) : *(int8_t *)(dv.value_p) * factor; + obj["v"] = make_float ? Helpers::transformNumFloat(*(int8_t *)(dv.value_p), num_op) : *(int8_t *)(dv.value_p) * num_op; } else if (dv.type == DeviceValueType::UINT) { - obj["v"] = divider ? Helpers::round2(*(uint8_t *)(dv.value_p), divider) : *(uint8_t *)(dv.value_p) * factor; + obj["v"] = make_float ? Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), num_op) : *(uint8_t *)(dv.value_p) * num_op; } else if (dv.type == DeviceValueType::SHORT) { - obj["v"] = divider ? Helpers::round2(*(int16_t *)(dv.value_p), divider) : *(int16_t *)(dv.value_p) * factor; + obj["v"] = make_float ? Helpers::transformNumFloat(*(int16_t *)(dv.value_p), num_op) : *(int16_t *)(dv.value_p) * num_op; } else if (dv.type == DeviceValueType::USHORT) { - obj["v"] = divider ? Helpers::round2(*(uint16_t *)(dv.value_p), divider) : *(uint16_t *)(dv.value_p) * factor; + obj["v"] = make_float ? Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), num_op) : *(uint16_t *)(dv.value_p) * num_op; } else if (dv.type == DeviceValueType::ULONG) { - obj["v"] = divider ? Helpers::round2(*(uint32_t *)(dv.value_p), divider) : *(uint32_t *)(dv.value_p) * factor; + 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) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 + // sometimes we need to divide by 60 + obj["v"] = (num_op == DeviceValueNumOp::DV_NUMOP_DIV60) ? (uint32_t)Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op) + : *(uint32_t *)(dv.value_p); } } } @@ -850,13 +922,14 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { // n is the fullname, and can be optional // don't add the fullname if its a command + auto translated_full_name = Helpers::translated_fword(dv.fullname); if (dv.type != DeviceValueType::CMD) { - if (dv.full_name) { + if (translated_full_name) { if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["n"] = dv.full_name; + obj["n"] = read_flash_string(translated_full_name); } else { char name[50]; - snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); + snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(translated_full_name).c_str()); obj["n"] = name; } } @@ -930,7 +1003,8 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 // search device value with this tag for (auto & dv : devicevalues_) { if (strcmp(command_s, Helpers::toLower(read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag)) { - int8_t divider = (dv.options_size == 1) ? Helpers::atoint(read_flash_string(dv.options[0]).c_str()) : 0; + int8_t num_op = dv.numeric_operator; + uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; const char * type = "type"; @@ -938,12 +1012,12 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 json["name"] = dv.short_name; - if (dv.full_name != nullptr) { - const char * fullname = "fullname"; + auto fullname = Helpers::translated_fword(dv.fullname); + if (fullname != nullptr) { if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - json[fullname] = dv.full_name; + json["fullname"] = fullname; } else { - json[fullname] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); + json["fullname"] = tag_to_string(dv.tag) + " " + read_flash_string(fullname); } } @@ -957,48 +1031,48 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { json[value] = (uint8_t)(*(uint8_t *)(dv.value_p)); } else { - json[value] = dv.options[*(uint8_t *)(dv.value_p)]; // text + json[value] = Helpers::translated_word(dv.options[*(uint8_t *)(dv.value_p)]); // text } } json[type] = F_(enum); JsonArray enum_ = json.createNestedArray(F_(enum)); for (uint8_t i = 0; i < dv.options_size; i++) { - enum_.add(dv.options[i]); + enum_.add(Helpers::translated_word(dv.options[i])); } break; } case DeviceValueType::USHORT: if (Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + json[value] = Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), num_op, fahrenheit); } json[type] = F_(number); break; case DeviceValueType::UINT: if (Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + json[value] = Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), num_op, fahrenheit); } json[type] = F_(number); break; case DeviceValueType::SHORT: if (Helpers::hasValue(*(int16_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + json[value] = Helpers::transformNumFloat(*(int16_t *)(dv.value_p), num_op, fahrenheit); } json[type] = F_(number); break; case DeviceValueType::INT: if (Helpers::hasValue(*(int8_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + json[value] = Helpers::transformNumFloat(*(int8_t *)(dv.value_p), num_op, fahrenheit); } json[type] = F_(number); break; case DeviceValueType::ULONG: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); + json[value] = Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op); } json[type] = F_(number); break; @@ -1020,7 +1094,7 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 case DeviceValueType::TIME: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json[value] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); + json[value] = Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op); } json[type] = F_(number); break; @@ -1037,13 +1111,13 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8 if (dv.options_size > 1) { JsonArray enum_ = json.createNestedArray(F_(enum)); for (uint8_t i = 0; i < dv.options_size; i++) { - enum_.add(dv.options[i]); + enum_.add(Helpers::translated_word(dv.options[i])); } } break; default: - json[type] = F_(unknown); + json[type] = Helpers::translated_word(FL_(unknown)); break; } @@ -1122,12 +1196,14 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c dv.remove_state(DeviceValueState::DV_ACTIVE); } + auto fullname = Helpers::translated_fword(dv.fullname); + // check conditions: // 1. it must have a valid value (state is active) // 2. it must have a visible flag // 3. it must match the given tag filter or have an empty tag // 4. it must not have the exclude flag set or outputs to console - if (dv.has_state(DeviceValueState::DV_ACTIVE) && dv.full_name && (tag_filter == DeviceValueTAG::TAG_NONE || tag_filter == dv.tag) + if (dv.has_state(DeviceValueState::DV_ACTIVE) && fullname && (tag_filter == DeviceValueTAG::TAG_NONE || tag_filter == dv.tag) && (output_target == OUTPUT_TARGET::CONSOLE || !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE))) { has_values = true; // flagged if we actually have data @@ -1136,11 +1212,12 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // create the name for the JSON key char name[80]; + if (output_target == OUTPUT_TARGET::API_VERBOSE || output_target == OUTPUT_TARGET::CONSOLE) { if (have_tag) { - snprintf(name, 80, "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); // prefix the tag + snprintf(name, 80, "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(fullname).c_str()); // prefix the tag } else { - strlcpy(name, read_flash_string(dv.full_name).c_str(), sizeof(name)); // use full name + strlcpy(name, read_flash_string(fullname).c_str(), sizeof(name)); // use full name } } else { strlcpy(name, read_flash_string(dv.short_name).c_str(), sizeof(name)); // use short name @@ -1184,82 +1261,87 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c if (EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX) { json[name] = (uint8_t)(*(uint8_t *)(dv.value_p)); } else { - json[name] = dv.options[*(uint8_t *)(dv.value_p)]; + json[name] = Helpers::translated_word(dv.options[*(uint8_t *)(dv.value_p)]); } } // handle Numbers - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as a whole integer - // note: the strange nested if's is necessary due to the way the ArduinoJson templates are pre-processed by the compiler else { - // If a divider is specified, do the division to 2 decimals places and send back as double/float - // otherwise force as an integer whole - uint8_t divider = 0; - uint8_t factor = 1; - if (dv.options_size == 1) { - auto s_str = read_flash_string(dv.options[0]); // prevent object backing the pointer will be destroyed at the end of the full-expression - const char * s = s_str.c_str(); - if (s[0] == '*') { - factor = Helpers::atoint(&s[1]); - } else { - divider = Helpers::atoint(s); - } - } - - // fahrenheit, 0 is no converstion other 1 or 2. not sure why? + // fahrenheit, 0 is no conversion other 1 or 2. not sure why? uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; + int8_t num_op = dv.numeric_operator; + bool make_float; + if (num_op == 0) { + // no changes to number + make_float = false; + num_op = 1; // so it gets *1 + } else if (num_op < 0) { + // negative numbers, convert to a positive multiplier + make_float = false; + num_op *= -1; + } else { + // has a divider, make it a float + make_float = true; + } + // always convert temperatures to floats with 1 decimal place - bool make_float = (divider || (dv.uom == DeviceValueUOM::DEGREES) || (dv.uom == DeviceValueUOM::DEGREES_R)); + if ((dv.uom == DeviceValueUOM::DEGREES) || (dv.uom == DeviceValueUOM::DEGREES_R)) { + make_float = true; + } if (dv.type == DeviceValueType::INT) { if (make_float) { - json[name] = Helpers::round2(*(int8_t *)(dv.value_p), divider, fahrenheit); + json[name] = Helpers::transformNumFloat(*(int8_t *)(dv.value_p), num_op, fahrenheit); } else { - json[name] = *(int8_t *)(dv.value_p) * factor; + json[name] = *(int8_t *)(dv.value_p) * num_op; } } else if (dv.type == DeviceValueType::UINT) { if (make_float) { - json[name] = Helpers::round2(*(uint8_t *)(dv.value_p), divider, fahrenheit); + json[name] = Helpers::transformNumFloat(*(uint8_t *)(dv.value_p), num_op, fahrenheit); } else { - json[name] = *(uint8_t *)(dv.value_p) * factor; + json[name] = *(uint8_t *)(dv.value_p) * num_op; } } else if (dv.type == DeviceValueType::SHORT) { if (make_float) { - json[name] = Helpers::round2(*(int16_t *)(dv.value_p), divider, fahrenheit); + json[name] = Helpers::transformNumFloat(*(int16_t *)(dv.value_p), num_op, fahrenheit); } else { - json[name] = *(int16_t *)(dv.value_p) * factor; + json[name] = *(int16_t *)(dv.value_p) * num_op; } } else if (dv.type == DeviceValueType::USHORT) { if (make_float) { - json[name] = Helpers::round2(*(uint16_t *)(dv.value_p), divider, fahrenheit); + json[name] = Helpers::transformNumFloat(*(uint16_t *)(dv.value_p), num_op, fahrenheit); } else { - json[name] = *(uint16_t *)(dv.value_p) * factor; + json[name] = *(uint16_t *)(dv.value_p) * num_op; } } else if (dv.type == DeviceValueType::ULONG) { if (make_float) { - json[name] = Helpers::round2(*(uint32_t *)(dv.value_p), divider, fahrenheit); + json[name] = Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op, fahrenheit); } else { - json[name] = *(uint32_t *)(dv.value_p) * factor; + json[name] = *(uint32_t *)(dv.value_p) * num_op; } } else if ((dv.type == DeviceValueType::TIME) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - uint32_t time_value = *(uint32_t *)(dv.value_p); - time_value = Helpers::round2(time_value, divider); // sometimes we need to divide by 60 + uint32_t time_value; + if (num_op == DeviceValueNumOp::DV_NUMOP_DIV60) { + // sometimes we need to divide by 60 + time_value = Helpers::transformNumFloat(*(uint32_t *)(dv.value_p), num_op); + } else { + time_value = *(uint32_t *)(dv.value_p); + } if (output_target == OUTPUT_TARGET::API_VERBOSE || output_target == OUTPUT_TARGET::CONSOLE) { - char time_s[40]; + char time_s[60]; snprintf(time_s, sizeof(time_s), "%d %s %d %s %d %s", (time_value / 1440), - read_flash_string(F_(days)).c_str(), + Helpers::translated_word(FL_(days)).c_str(), ((time_value % 1440) / 60), - read_flash_string(F_(hours)).c_str(), + Helpers::translated_word(FL_(hours)).c_str(), (time_value % 60), - read_flash_string(F_(minutes)).c_str()); + Helpers::translated_word(FL_(minutes)).c_str()); json[name] = time_s; } else { json[name] = time_value; diff --git a/src/emsdevice.h b/src/emsdevice.h index dad865d1c..43bad299a 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -204,41 +204,93 @@ class EMSdevice { void generate_values_web(JsonObject & output); void generate_values_web_customization(JsonArray & output); + void add_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * options_single, + int8_t numeric_operator, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max); + + void register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max); + + void register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f); + + void register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * name, + uint8_t uom); + void register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, - const __FlashStringHelper * short_name, - const __FlashStringHelper * full_name, + int8_t numeric_operator, + const __FlashStringHelper * const * name, uint8_t uom, - bool has_cmd, - int16_t min, - uint16_t max); + const cmd_function_p f = nullptr); void register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, + int8_t numeric_operator, const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f, int16_t min, uint16_t max); + // single list of options + void register_device_value(uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const * options_single, + const __FlashStringHelper * const * name, + uint8_t uom, + const cmd_function_p f = nullptr); + + // single list of options, with no translations, with min and max void register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, + const __FlashStringHelper * const * options_single, const __FlashStringHelper * const * name, uint8_t uom, - const cmd_function_p f); + const cmd_function_p f, + int16_t min, + uint16_t max); + // no options, optional function f + void register_device_value(uint8_t tag, void * value_p, uint8_t type, const __FlashStringHelper * const * name, uint8_t uom, const cmd_function_p f = nullptr); + + // no options, with min/max void register_device_value(uint8_t tag, void * value_p, uint8_t type, - const __FlashStringHelper * const * options, const __FlashStringHelper * const * name, - uint8_t uom); + uint8_t uom, + const cmd_function_p f, + int16_t min, + uint16_t max); void write_command(const uint16_t type_id, const uint8_t offset, uint8_t * message_data, const uint8_t message_length, const uint16_t validate_typeid) const; void write_command(const uint16_t type_id, const uint8_t offset, const uint8_t value, const uint16_t validate_typeid) const; @@ -390,10 +442,13 @@ class EMSdevice { } }; +#ifdef EMSESP_STANDALONE + void debug_print_dv(const char * shortname); +#endif + std::vector telegram_functions_; // each EMS device has its own set of registered telegram types - // device values - std::vector devicevalues_; + std::vector devicevalues_; // all the device values std::vector handlers_ignored_; }; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 79d5d3cf0..4402f4920 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -22,30 +22,97 @@ namespace emsesp { +// constructor +DeviceValue::DeviceValue(uint8_t device_type, + uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * options_single, + int8_t numeric_operator, + const __FlashStringHelper * const short_name, + const __FlashStringHelper * const * fullname, + uint8_t uom, + bool has_cmd, + int16_t min, + uint16_t max, + uint8_t state) + : device_type(device_type) + , tag(tag) + , value_p(value_p) + , type(type) + , options(options) + , options_single(options_single) + , numeric_operator(numeric_operator) + , short_name(short_name) + , fullname(fullname) + , uom(uom) + , has_cmd(has_cmd) + , min(min) + , max(max) + , state(state) { + // calculate #options in options list + if (options_single) { + options_size = 1; + } else { + options_size = Helpers::count_items(options); + } + +#ifdef EMSESP_STANDALONE + // only added for debugging + Serial.print("registering entity: "); + Serial.print(read_flash_string(short_name).c_str()); + Serial.print("/"); + auto trans_fullname = Helpers::translated_word(fullname); + Serial.print(trans_fullname.c_str()); + Serial.print(" (#options="); + Serial.print(options_size); + Serial.print(",numop="); + Serial.print(numeric_operator); + Serial.print(") "); + if (options != nullptr) { + uint8_t i = 0; + while (i < options_size) { + Serial.print(" option"); + Serial.print(i + 1); + Serial.print(":"); + auto str = Helpers::translated_fword(options[i]); + Serial.print(read_flash_string(str).c_str()); + i++; + } + } else if (options_single != nullptr) { + Serial.print("option1:!"); + Serial.print(read_flash_string(options_single[0]).c_str()); + Serial.print("!"); + } + Serial.println(""); +#endif +} + // mapping of UOM, to match order in DeviceValueUOM enum emsdevice.h // also maps to DeviceValueUOM in interface/src/project/types.ts for the Web UI // must be an int of 4 bytes, 32bit aligned const __FlashStringHelper * DeviceValue::DeviceValueUOM_s[] __attribute__((__aligned__(sizeof(uint32_t)))) PROGMEM = { - F_(blank), - F_(degrees), - F_(degrees), - F_(percent), - F_(lmin), - F_(kwh), - F_(wh), - F_(hours), - F_(minutes), - F_(ua), - F_(bar), - F_(kw), - F_(w), - F_(kb), - F_(seconds), - F_(dbm), - F_(fahrenheit), - F_(mv), - F_(sqm) + F_(uom_blank), + F_(uom_degrees), + F_(uom_degrees), + F_(uom_percent), + F_(uom_lmin), + F_(uom_kwh), + F_(uom_wh), + F_(uom_hours), + F_(uom_minutes), + F_(uom_ua), + F_(uom_bar), + F_(uom_kw), + F_(uom_w), + F_(uom_kb), + F_(uom_seconds), + F_(uom_dbm), + F_(uom_fahrenheit), + F_(uom_mv), + F_(uom_sqm) }; @@ -196,10 +263,10 @@ bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; // if we have individual limits set already, just do the conversion - // limits are not scaled with divider and temperatures are °C + // limits are not scaled with num operator and temperatures are °C if (min != 0 || max != 0) { - dv_set_min = Helpers::round2(min, 0, fahrenheit); - dv_set_max = Helpers::round2(max, 0, fahrenheit); + dv_set_min = Helpers::transformNumFloat(min, 0, fahrenheit); + dv_set_max = Helpers::transformNumFloat(max, 0, fahrenheit); return true; } @@ -207,17 +274,15 @@ bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { dv_set_min = 0; dv_set_max = 0; - int8_t divider = (options_size == 1) ? Helpers::atoint(uuid::read_flash_string(options[0]).c_str()) : 0; - if (type == DeviceValueType::USHORT) { - dv_set_min = Helpers::round2(0, divider, fahrenheit); - dv_set_max = Helpers::round2(EMS_VALUE_USHORT_NOTSET, divider, fahrenheit); + dv_set_min = Helpers::transformNumFloat(0, numeric_operator, fahrenheit); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_USHORT_NOTSET, numeric_operator, fahrenheit); return true; } if (type == DeviceValueType::SHORT) { - dv_set_min = Helpers::round2(-EMS_VALUE_SHORT_NOTSET, divider, fahrenheit); - dv_set_max = Helpers::round2(EMS_VALUE_SHORT_NOTSET, divider, fahrenheit); + dv_set_min = Helpers::transformNumFloat(-EMS_VALUE_SHORT_NOTSET, numeric_operator, fahrenheit); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_SHORT_NOTSET, numeric_operator, fahrenheit); return true; } @@ -225,7 +290,7 @@ bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { if (uom == DeviceValueUOM::PERCENT) { dv_set_max = 100; } else { - dv_set_max = Helpers::round2(EMS_VALUE_UINT_NOTSET, divider, fahrenheit); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_UINT_NOTSET, numeric_operator, fahrenheit); } return true; } @@ -235,19 +300,19 @@ bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { dv_set_min = -100; dv_set_max = 100; } else { - dv_set_min = Helpers::round2(-EMS_VALUE_INT_NOTSET, divider, fahrenheit); - dv_set_max = Helpers::round2(EMS_VALUE_INT_NOTSET, divider, fahrenheit); + dv_set_min = Helpers::transformNumFloat(-EMS_VALUE_INT_NOTSET, numeric_operator, fahrenheit); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_INT_NOTSET, numeric_operator, fahrenheit); } return true; } if (type == DeviceValueType::ULONG) { - dv_set_max = Helpers::round2(EMS_VALUE_ULONG_NOTSET, divider); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_ULONG_NOTSET, numeric_operator); return true; } if (type == DeviceValueType::TIME) { - dv_set_max = Helpers::round2(EMS_VALUE_ULONG_NOTSET, divider); + dv_set_max = Helpers::transformNumFloat(EMS_VALUE_ULONG_NOTSET, numeric_operator); return true; } diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index cff8519f6..81cad53aa 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -130,55 +130,54 @@ class DeviceValue { DV_FAVORITE = (1 << 7) // 128 - sort to front }; - uint8_t device_type; // EMSdevice::DeviceType - uint8_t tag; // DeviceValueTAG::* - void * value_p; // pointer to variable of any type - uint8_t type; // DeviceValueType::* - const __FlashStringHelper * const * options; // options as a flash char array - uint8_t options_size; // number of options in the char array, calculated - const __FlashStringHelper * short_name; // used in MQTT - const __FlashStringHelper * full_name; // used in Web and Console - uint8_t uom; // DeviceValueUOM::* - uint8_t ha; // DevcieValueHA:: - bool has_cmd; // true if there is a Console/MQTT command which matches the short_name - int16_t min; // min range - uint16_t max; // max range - uint8_t state; // DeviceValueState::* - - DeviceValue(uint8_t device_type, - uint8_t tag, - void * value_p, - uint8_t type, - const __FlashStringHelper * const * options, - uint8_t options_size, - const __FlashStringHelper * short_name, - const __FlashStringHelper * full_name, - uint8_t uom, - uint8_t ha, - bool has_cmd, - int16_t min, - uint16_t max, - uint8_t state) - : device_type(device_type) - , tag(tag) - , value_p(value_p) - , type(type) - , options(options) - , options_size(options_size) - , short_name(short_name) - , full_name(full_name) - , uom(uom) - , ha(ha) - , has_cmd(has_cmd) - , min(min) - , max(max) - , state(state) { - } + // numeric operators + // negative numbers used for multipliers + enum DeviceValueNumOp : int8_t { + DV_NUMOP_NONE = 0, // default + DV_NUMOP_DIV2 = 2, + DV_NUMOP_DIV10 = 10, + DV_NUMOP_DIV60 = 60, + DV_NUMOP_DIV100 = 100, + DV_NUMOP_MUL5 = -5, + DV_NUMOP_MUL10 = -10, + DV_NUMOP_MUL15 = -15 + }; + + uint8_t device_type; // EMSdevice::DeviceType + uint8_t tag; // DeviceValueTAG::* + void * value_p; // pointer to variable of any type + uint8_t type; // DeviceValueType::* + const __FlashStringHelper * const ** options; // options as a flash char array + const __FlashStringHelper * const * options_single; // options are not translated + int8_t numeric_operator; + uint8_t options_size; // number of options in the char array, calculated + const __FlashStringHelper * const short_name; // used in MQTT and API + const __FlashStringHelper * const * fullname; // used in Web and Console, is translated + uint8_t uom; // DeviceValueUOM::* + bool has_cmd; // true if there is a Console/MQTT command which matches the short_name + int16_t min; // min range + uint16_t max; // max range + uint8_t state; // DeviceValueState::* + + DeviceValue(uint8_t device_type, + uint8_t tag, + void * value_p, + uint8_t type, + const __FlashStringHelper * const ** options, + const __FlashStringHelper * const * options_single, + int8_t numeric_operator, + const __FlashStringHelper * const short_name, + const __FlashStringHelper * const * fullname, + uint8_t uom, + bool has_cmd, + int16_t min, + uint16_t max, + uint8_t state); bool hasValue() const; bool get_min_max(int16_t & dv_set_min, int16_t & dv_set_max); - // state flags + // dv state flags void add_state(uint8_t s) { state |= s; } diff --git a/src/emsesp.cpp b/src/emsesp.cpp index ca64b0e7e..847c0fd36 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -299,7 +299,6 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { } // show EMS device values to the shell console -// generate_values_json is called in verbose mode void EMSESP::show_device_values(uuid::console::Shell & shell) { if (emsdevices.empty()) { shell.printfln(F("No EMS devices detected.")); @@ -317,7 +316,7 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { DynamicJsonDocument doc(EMSESP_JSON_SIZE_XXLARGE_DYN); // use max size JsonObject json = doc.to(); - emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::CONSOLE); // verbose mode and nested + emsdevice->generate_values(json, DeviceValueTAG::TAG_NONE, true, EMSdevice::OUTPUT_TARGET::CONSOLE); // print line uint8_t id = 0; @@ -334,7 +333,7 @@ void EMSESP::show_device_values(uuid::console::Shell & shell) { char s[10]; shell.print(Helpers::render_value(s, data.as(), 1)); } else if (data.is()) { - shell.print(data.as() ? F_(on) : F_(off)); + shell.print(data.as() ? Helpers::translated_word(FL_(on)) : Helpers::translated_word(FL_(off))); } // if there is a uom print it @@ -488,6 +487,8 @@ void EMSESP::reset_mqtt_ha() { for (const auto & emsdevice : emsdevices) { emsdevice->ha_config_clear(); } + + // force the re-creating of the dallas and analog sensor topics (for HA) dallassensor_.reload(); analogsensor_.reload(); } @@ -1291,11 +1292,16 @@ void EMSESP::start() { esp8266React.begin(); // loads core system services settings (network, mqtt, ap, ntp etc) webLogService.begin(); // start web log service. now we can start capturing logs to the web log + +#ifdef EMSESP_DEBUG + LOG_NOTICE(F("System is running in Debug mode")); +#endif + LOG_INFO(F("Last system reset reason Core0: %s, Core1: %s"), system_.reset_reason(0).c_str(), system_.reset_reason(1).c_str()); // do any system upgrades if (system_.check_upgrade()) { - LOG_INFO(F("System will be restarted to apply upgrade")); + LOG_INFO(F("System needs a restart to apply new settings. Please wait.")); system_.system_restart(); }; diff --git a/src/emsesp.h b/src/emsesp.h index 1098a10d0..0835f2034 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -92,6 +92,8 @@ using DeviceValueUOM = emsesp::DeviceValue::DeviceValueUOM; using DeviceValueType = emsesp::DeviceValue::DeviceValueType; using DeviceValueState = emsesp::DeviceValue::DeviceValueState; using DeviceValueTAG = emsesp::DeviceValue::DeviceValueTAG; +using DeviceValueNumOp = emsesp::DeviceValue::DeviceValueNumOp; + class Shower; // forward declaration for compiler diff --git a/src/helpers.cpp b/src/helpers.cpp index 5058d0938..822b53cfa 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -177,10 +177,11 @@ char * Helpers::smallitoa(char * result, const uint16_t value) { // for strings only char * Helpers::render_boolean(char * result, const bool value, const bool dashboard) { uint8_t bool_format_ = dashboard ? EMSESP::system_.bool_dashboard() : EMSESP::system_.bool_format(); + if (bool_format_ == BOOL_FORMAT_ONOFF_STR) { - strlcpy(result, value ? read_flash_string(F_(on)).c_str() : read_flash_string(F_(off)).c_str(), 5); + strlcpy(result, value ? translated_word(FL_(on)).c_str() : translated_word(FL_(off)).c_str(), 5); } else if (bool_format_ == BOOL_FORMAT_ONOFF_STR_CAP) { - strlcpy(result, value ? read_flash_string(F_(ON)).c_str() : read_flash_string(F_(OFF)).c_str(), 5); + strlcpy(result, value ? translated_word(FL_(ON)).c_str() : translated_word(FL_(OFF)).c_str(), 5); } else if ((bool_format_ == BOOL_FORMAT_10) || (bool_format_ == BOOL_FORMAT_10_STR)) { strlcpy(result, value ? "1" : "0", 2); } else { @@ -439,17 +440,41 @@ int Helpers::atoint(const char * value) { // The conversion to Fahrenheit is different for absolute temperatures and relative temperatures like hysteresis. // fahrenheit=0 - off, no conversion // fahrenheit=1 - relative, 1.8t -// fahrenheit=2 - absolute, 1.8t + 32(fahrenheit-1). -float Helpers::round2(float value, const int8_t divider, const uint8_t fahrenheit) { - float val = (value * 100 + 0.5); - if (divider > 0) { - val = ((value / divider) * 100 + 0.5); - } else if (divider < 0) { - val = value * -100 * divider; +// fahrenheit=2 - absolute, 1.8t + 32(fahrenheit-1) +float Helpers::transformNumFloat(float value, const int8_t numeric_operator, const uint8_t fahrenheit) { + float val; + + switch (numeric_operator) { + case DeviceValueNumOp::DV_NUMOP_DIV2: + val = ((value / 2) * 100 + 0.5); + break; + case DeviceValueNumOp::DV_NUMOP_DIV10: + val = ((value / 10) * 100 + 0.5); + break; + case DeviceValueNumOp::DV_NUMOP_DIV60: + val = ((value / 60) * 100 + 0.5); + break; + case DeviceValueNumOp::DV_NUMOP_DIV100: + val = ((value / 100) * 100 + 0.5); + break; + case DeviceValueNumOp::DV_NUMOP_MUL5: + val = value * -100 * 5; + break; + case DeviceValueNumOp::DV_NUMOP_MUL10: + val = value * -100 * 10; + break; + case DeviceValueNumOp::DV_NUMOP_MUL15: + val = value * -100 * 15; + break; + default: + val = (value * 100 + 0.5); // no ops + break; } + if (value < 0) { // negative rounding val = val - 1; } + if (fahrenheit) { val = val * 1.8 + 3200 * (fahrenheit - 1); } @@ -568,12 +593,12 @@ bool Helpers::value2bool(const char * value, bool & value_b) { std::string bool_str = toLower(value); // convert to lower case - if ((bool_str == read_flash_string(F_(on))) || (bool_str == "1") || (bool_str == "true")) { + if ((bool_str == Helpers::translated_word(FL_(on))) || (bool_str == "1") || (bool_str == "true")) { value_b = true; return true; // is a bool } - if ((bool_str == read_flash_string(F_(off))) || (bool_str == "0") || (bool_str == "false")) { + if ((bool_str == Helpers::translated_word(FL_(off))) || (bool_str == "0") || (bool_str == "false")) { value_b = false; return true; // is a bool } @@ -582,20 +607,42 @@ bool Helpers::value2bool(const char * value, bool & value_b) { } // checks to see if a string is member of a vector and return the index, also allow true/false for on/off -bool Helpers::value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const * strs) { +// this for a list of lists, when using translated strings +bool Helpers::value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const ** strs) { if ((value == nullptr) || (strlen(value) == 0)) { return false; } std::string str = toLower(value); for (value_ui = 0; strs[value_ui]; value_ui++) { - std::string str1 = toLower(read_flash_string(strs[value_ui])); + std::string str1 = toLower(Helpers::translated_word(strs[value_ui])); if ((str1 != "") - && ((str1 == read_flash_string(F_(off)) && str == "false") || (str1 == read_flash_string(F_(on)) && str == "true") || (str == str1) + && ((str1 == Helpers::translated_word(FL_(off)) && str == "false") || (str1 == Helpers::translated_word(FL_(on)) && str == "true") || (str == str1) || (value[0] == ('0' + value_ui) && value[1] == '\0'))) { return true; } } + + return false; +} + +// checks to see if a string is member of a vector and return the index, also allow true/false for on/off +bool Helpers::value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const * strs) { + if ((value == nullptr) || (strlen(value) == 0)) { + return false; + } + std::string str = toLower(value); + + for (value_ui = 0; strs[value_ui]; value_ui++) { + std::string enum_str = toLower(read_flash_string(strs[value_ui])); + + if ((enum_str != "") + && ((enum_str == Helpers::translated_word(FL_(off)) && str == "false") || (enum_str == Helpers::translated_word(FL_(on)) && str == "true") + || (str == enum_str) || (value[0] == ('0' + value_ui) && value[1] == '\0'))) { + return true; + } + } + return false; } @@ -617,7 +664,7 @@ void Helpers::replace_char(char * str, char find, char replace) { int i = 0; while (str[i] != '\0') { - /*Replace the matched character...*/ + // Replace the matched character... if (str[i] == find) str[i] = replace; @@ -625,4 +672,55 @@ void Helpers::replace_char(char * str, char find, char replace) { } } +// count number of items in a list +// the end of a list has a nullptr +uint8_t Helpers::count_items(const __FlashStringHelper * const * list) { + uint8_t list_size = 0; + if (list != nullptr) { + while (list[list_size]) { + list_size++; + } + } + return list_size; +} + +// count number of items in a list of lists +// the end of a list has a nullptr +uint8_t Helpers::count_items(const __FlashStringHelper * const ** list) { + uint8_t list_size = 0; + if (list != nullptr) { + while (list[list_size]) { + list_size++; + } + } + return list_size; +} + +// return translated string as a std::string, optionally converting to lowercase (for console commands) +// takes a FL(...) +std::string Helpers::translated_word(const __FlashStringHelper * const * strings, bool to_lower) { + uint8_t language_index = EMSESP::system_.language_index(); + uint8_t index = 0; + + // see how many translations we have for this entity. if there is no translation for this, revert to EN + if (Helpers::count_items(strings) >= language_index + 1) { + index = language_index; + } + + return to_lower ? toLower(read_flash_string(strings[index])) : read_flash_string(strings[index]); +} + +// return translated string +// takes a F(...) +const __FlashStringHelper * Helpers::translated_fword(const __FlashStringHelper * const * strings) { + uint8_t language_index = EMSESP::system_.language_index(); + uint8_t index = 0; + + // see how many translations we have for this entity. if there is no translation for this, revert to EN + if (Helpers::count_items(strings) >= language_index + 1) { + index = language_index; + } + return strings[index]; +} + } // namespace emsesp diff --git a/src/helpers.h b/src/helpers.h index 29ef108b8..396baa960 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -21,13 +21,10 @@ #include "telegram.h" // for EMS_VALUE_* settings -#define FJSON(x) x -// #define FJSON(x) F(x) +#include "common.h" namespace emsesp { -using flash_string_vector = std::vector; - class Helpers { public: static char * render_value(char * result, const float value, const int8_t format); // format is the precision @@ -52,7 +49,9 @@ class Helpers { static int atoint(const char * value); static bool check_abs(const int32_t i); static uint32_t abs(const int32_t i); - static float round2(float value, const int8_t divider, const uint8_t fahrenheit = 0); + + static float transformNumFloat(float value, const int8_t numeric_operator, const uint8_t fahrenheit = 0); + static std::string toLower(std::string const & s); static std::string toUpper(std::string const & s); static void replace_char(char * str, char find, char replace); @@ -68,10 +67,17 @@ class Helpers { static bool value2float(const char * value, float & value_f); static bool value2bool(const char * value, bool & value_b); static bool value2string(const char * value, std::string & value_s); + static bool value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const ** strs); static bool value2enum(const char * value, uint8_t & value_ui, const __FlashStringHelper * const * strs); static bool value2temperature(const char * value, float & value_f, bool relative = false); static bool value2temperature(const char * value, int & value_i, const bool relative = false, const int min = -2147483648, const int max = 2147483647); + static uint8_t count_items(const __FlashStringHelper * const ** list); + static uint8_t count_items(const __FlashStringHelper * const * list); + + static std::string translated_word(const __FlashStringHelper * const * strings, bool to_lower = false); + static const __FlashStringHelper * translated_fword(const __FlashStringHelper * const * strings); + #ifdef EMSESP_STANDALONE static char * ultostr(char * ptr, uint32_t value, const uint8_t base); #endif diff --git a/src/locale_DE.h b/src/locale_DE.h deleted file mode 100644 index 103703568..000000000 --- a/src/locale_DE.h +++ /dev/null @@ -1,858 +0,0 @@ -/* - * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020 Paul Derbyshire - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -// common words -MAKE_PSTR_WORD(debug) -MAKE_PSTR_WORD(exit) -MAKE_PSTR_WORD(help) -MAKE_PSTR_WORD(log) -MAKE_PSTR_WORD(logout) -MAKE_PSTR_WORD(enabled) -MAKE_PSTR_WORD(disabled) -MAKE_PSTR_WORD(set) -MAKE_PSTR_WORD(show) -MAKE_PSTR_WORD(on) -MAKE_PSTR_WORD(off) -MAKE_PSTR_WORD(ON) -MAKE_PSTR_WORD(OFF) -MAKE_PSTR_WORD(su) -MAKE_PSTR_WORD(name) -MAKE_PSTR_WORD(auto) -MAKE_PSTR_WORD(scan) -MAKE_PSTR_WORD(password) -MAKE_PSTR_WORD(read) -MAKE_PSTR_WORD(version) -MAKE_PSTR_WORD(values) -MAKE_PSTR_WORD(system) -MAKE_PSTR_WORD(fetch) -MAKE_PSTR_WORD(restart) -MAKE_PSTR_WORD(format) -MAKE_PSTR_WORD(raw) -MAKE_PSTR_WORD(watch) -MAKE_PSTR_WORD(syslog) -MAKE_PSTR_WORD(send) -MAKE_PSTR_WORD(telegram) -MAKE_PSTR_WORD(bus_id) -MAKE_PSTR_WORD(tx_mode) -MAKE_PSTR_WORD(ems) -MAKE_PSTR_WORD(devices) -MAKE_PSTR_WORD(shower) -MAKE_PSTR_WORD(mqtt) -MAKE_PSTR_WORD(emsesp) -MAKE_PSTR_WORD(connected) -MAKE_PSTR_WORD(disconnected) -MAKE_PSTR_WORD(passwd) -MAKE_PSTR_WORD(hostname) -MAKE_PSTR_WORD(wifi) -MAKE_PSTR_WORD(reconnect) -MAKE_PSTR_WORD(ssid) -MAKE_PSTR_WORD(heartbeat) -MAKE_PSTR_WORD(users) -MAKE_PSTR_WORD(publish) -MAKE_PSTR_WORD(timeout) -MAKE_PSTR_WORD(board_profile) -MAKE_PSTR_WORD(setvalue) - -// for commands -MAKE_PSTR_WORD(call) -MAKE_PSTR_WORD(cmd) -MAKE_PSTR_WORD(id) -MAKE_PSTR_WORD(hc) -MAKE_PSTR_WORD(wwc) -MAKE_PSTR_WORD(device) -MAKE_PSTR_WORD(data) -MAKE_PSTR_WORD(command) -MAKE_PSTR_WORD(commands) -MAKE_PSTR_WORD(info) -MAKE_PSTR_WORD(settings) -MAKE_PSTR_WORD(customizations) -MAKE_PSTR_WORD(value) -MAKE_PSTR_WORD(error) -MAKE_PSTR_WORD(entities) - -// devices -MAKE_PSTR_WORD(boiler) -MAKE_PSTR_WORD(thermostat) -MAKE_PSTR_WORD(switch) -MAKE_PSTR_WORD(solar) -MAKE_PSTR_WORD(mixer) -MAKE_PSTR_WORD(gateway) -MAKE_PSTR_WORD(controller) -MAKE_PSTR_WORD(connect) -MAKE_PSTR_WORD(heatpump) -MAKE_PSTR_WORD(generic) -MAKE_PSTR_WORD(analogsensor) -MAKE_PSTR_WORD(unknown) -MAKE_PSTR_WORD(dallassensor) - -// format strings -MAKE_PSTR(host_fmt, "Host: %s") -MAKE_PSTR(port_fmt, "Port: %d") -MAKE_PSTR(hostname_fmt, "Hostname: %s") -MAKE_PSTR(board_profile_fmt, "Board Profile: %s") -MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") -MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") -MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") -MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") -MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") -MAKE_PSTR(log_level_fmt, "Log level: %s") - -MAKE_STR(productid_fmt, "%s EMS ProductID") - -MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) -MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) -MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc"), F("timer"), F("rate"), F("digital out"), F("pwm 0"), F("pwm 1"), F("pwm 2")) - -// strings -MAKE_PSTR(EMSESP, "EMS-ESP") -MAKE_PSTR(cmd_optional, "[cmd]") -MAKE_PSTR(ha_optional, "[ha]") -MAKE_PSTR(deep_optional, "[deep]") -MAKE_PSTR(watchid_optional, "[ID]") -MAKE_PSTR(watch_format_optional, "[off | on | raw | unknown]") -MAKE_PSTR(invalid_watch, "Invalid watch type") -MAKE_PSTR(data_mandatory, "\"XX XX ...\"") -MAKE_PSTR(asterisks, "********") -MAKE_PSTR(n_mandatory, "") -MAKE_PSTR(sensorid_optional, "[sensor ID]") -MAKE_PSTR(id_optional, "[id|hc]") -MAKE_PSTR(data_optional, "[data]") -MAKE_PSTR(offset_optional, "[offset]") -MAKE_PSTR(length_optional, "[length]") -MAKE_PSTR(typeid_mandatory, "") -MAKE_PSTR(deviceid_mandatory, "") -MAKE_PSTR(device_type_optional, "[device]") -MAKE_PSTR(invalid_log_level, "Invalid log level") -MAKE_PSTR(log_level_optional, "[level]") -MAKE_PSTR(name_mandatory, "") -MAKE_PSTR(name_optional, "[name]") -MAKE_PSTR(new_password_prompt1, "Enter new password: ") -MAKE_PSTR(new_password_prompt2, "Retype new password: ") -MAKE_PSTR(password_prompt, "Password: ") -MAKE_PSTR(unset, "") - -// command descriptions -MAKE_PSTR(info_cmd, "lists all values") -MAKE_PSTR(commands_cmd, "lists all commands") -MAKE_PSTR(entities_cmd, "lists all entities") - -MAKE_PSTR_WORD(number) -MAKE_PSTR_WORD(enum) -MAKE_PSTR_WORD(text) - -MAKE_PSTR_WORD(2) -MAKE_PSTR_WORD(4) -MAKE_PSTR_WORD(10) -MAKE_PSTR_WORD(100) -MAKE_PSTR_WORD(60) - -MAKE_PSTR_LIST(div2, F_(2)) -MAKE_PSTR_LIST(div4, F_(4)) -MAKE_PSTR_LIST(div10, F_(10)) -MAKE_PSTR_LIST(div60, F_(60)) -MAKE_PSTR_LIST(div100, F_(100)) -MAKE_PSTR_LIST(mul5, F("-5")) -MAKE_PSTR_LIST(mul10, F("-10")) -MAKE_PSTR_LIST(mul15, F("-15")) - -// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp -// uom - also used with HA see https://github.com/home-assistant/core/blob/d7ac4bd65379e11461c7ce0893d3533d8d8b8cbf/homeassistant/const.py#L384 -MAKE_PSTR(blank, " ") -MAKE_PSTR(percent, "%") -MAKE_PSTR(degrees, "°C") -MAKE_PSTR(kwh, "kWh") -MAKE_PSTR(wh, "Wh") -MAKE_PSTR(bar, "bar") -MAKE_PSTR(minutes, "Minuten") -MAKE_PSTR(hours, "Stunden") -MAKE_PSTR(days, "Tage") -MAKE_PSTR(ua, "uA") -MAKE_PSTR(lmin, "l/min") -MAKE_PSTR(kw, "kW") -MAKE_PSTR(w, "W") -MAKE_PSTR(kb, "KB") -MAKE_PSTR(seconds, "seconds") -MAKE_PSTR(dbm, "dBm") -MAKE_PSTR(fahrenheit, "°F") -MAKE_PSTR(mv, "mV") -MAKE_PSTR(sqm, "sqm") -MAKE_PSTR(m3, "m3") -MAKE_PSTR(l, "l") -// MAKE_PSTR(times, "mal") -// MAKE_PSTR(oclock, "Uhr") - -// TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp -// use empty string if want to suppress showing tags -// mqtt tags must not have spaces -MAKE_PSTR(tag_none, "") -MAKE_PSTR(tag_heartbeat, "") -MAKE_PSTR(tag_boiler_data_ww, "ww") -MAKE_PSTR(tag_device_data, "") -MAKE_PSTR(tag_device_data_ww, "ww") -MAKE_PSTR(tag_hc1, "hc1") -MAKE_PSTR(tag_hc2, "hc2") -MAKE_PSTR(tag_hc3, "hc3") -MAKE_PSTR(tag_hc4, "hc4") -MAKE_PSTR(tag_hc5, "hc5") -MAKE_PSTR(tag_hc6, "hc6") -MAKE_PSTR(tag_hc7, "hc7") -MAKE_PSTR(tag_hc8, "hc8") -MAKE_PSTR(tag_wwc1, "wwc1") -MAKE_PSTR(tag_wwc2, "wwc2") -MAKE_PSTR(tag_wwc3, "wwc3") -MAKE_PSTR(tag_wwc4, "wwc4") -MAKE_PSTR(tag_wwc5, "wwc5") -MAKE_PSTR(tag_wwc6, "wwc6") -MAKE_PSTR(tag_wwc7, "wwc7") -MAKE_PSTR(tag_wwc8, "wwc8") -MAKE_PSTR(tag_wwc9, "wwc9") -MAKE_PSTR(tag_wwc10, "wwc10") -MAKE_PSTR(tag_ahs, "ahs") -MAKE_PSTR(tag_hs1, "hs1") -MAKE_PSTR(tag_hs2, "hs2") -MAKE_PSTR(tag_hs3, "hs3") -MAKE_PSTR(tag_hs4, "hs4") -MAKE_PSTR(tag_hs5, "hs5") -MAKE_PSTR(tag_hs6, "hs6") -MAKE_PSTR(tag_hs7, "hs7") -MAKE_PSTR(tag_hs8, "hs8") -MAKE_PSTR(tag_hs9, "hs9") -MAKE_PSTR(tag_hs10, "hs10") -MAKE_PSTR(tag_hs11, "hs11") -MAKE_PSTR(tag_hs12, "hs12") -MAKE_PSTR(tag_hs13, "hs13") -MAKE_PSTR(tag_hs14, "hs14") -MAKE_PSTR(tag_hs15, "hs15") -MAKE_PSTR(tag_hs16, "hs16") - -// MQTT topic names -// MAKE_PSTR(tag_heartbeat_mqtt, "heartbeat") -// MAKE_PSTR(tag_boiler_data_mqtt, "") -MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww") -MAKE_PSTR(tag_device_data_ww_mqtt, "") - -// boiler -MAKE_PSTR(time, "Zeit") -MAKE_PSTR(date, "Datum") -MAKE_PSTR_WORD(1x3min) -MAKE_PSTR_WORD(2x3min) -MAKE_PSTR_WORD(3x3min) -MAKE_PSTR_WORD(4x3min) -MAKE_PSTR_WORD(5x3min) -MAKE_PSTR_WORD(6x3min) -MAKE_PSTR_(continuos, "kontinuierlich") -MAKE_PSTR(3wayvalve, "3-Wege Ventil") -MAKE_PSTR(chargepump, "Ladepumpe") -MAKE_PSTR(hot, "Heiss") -MAKE_PSTR(high_comfort, "Heiss Komfort") -MAKE_PSTR(eco, "Eco") -MAKE_PSTR(intelligent, "Intelligent") -MAKE_PSTR_(flow, "Fluss") -MAKE_PSTR(manual, "Manuell") -MAKE_PSTR_(buffer, "Speicher") -MAKE_PSTR(bufferedflow, "Durchlaufspeicher") -MAKE_PSTR(layeredbuffer, "Schichtspeicher") -MAKE_PSTR(maintenance, "Wartung") -MAKE_PSTR(heating, "Heizen") -MAKE_PSTR(cooling, "K�hlen") - -// boiler lists -MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) // template for text input -MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual)) -MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) -MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) -MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) -MAKE_PSTR_LIST(enum_comfort1, F_(high_comfort), F_(eco)) -MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) -MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) -// MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) - -// AM200 lists -MAKE_PSTR_LIST(enum_vr2Config, F_(off), F("bypass")); -MAKE_PSTR_LIST(enum_aPumpSignal, F_(off), F("pwm"), F("pwm_invers")); -MAKE_PSTR_LIST(enum_bufBypass, F("no"), F_(mixer), F("valve")); -MAKE_PSTR_LIST(enum_bufConfig, F("monovalent"), F("bivalent")); -MAKE_PSTR_LIST(enum_blockMode, F_(off), F_(auto), F("blocking")); -MAKE_PSTR_LIST(enum_blockTerm, F("n_o"), F("n_c")); - -//heatpump -MAKE_PSTR_LIST(enum_hpactivity, F("Kein"), F("Heizen"), F("Kühlen"), F("Warmwasser"), F("Pool")) - -// mixer -MAKE_PSTR_LIST(enum_shunt, F("gestoppt"), F("öffnen"), F("schließen"), F("Offen"), F("Geschlossen")) - -// thermostat -MAKE_PSTR(light, "Leicht") -MAKE_PSTR(medium, "Mittel") -MAKE_PSTR(heavy, "Schwer") -MAKE_PSTR(own_prog, "Eigenprog") -MAKE_PSTR(start, "Start") -MAKE_PSTR(heat, "Heizen") -MAKE_PSTR(hold, "Halten") -MAKE_PSTR(cool, "Kühl") -MAKE_PSTR(end, "Ende") -MAKE_PSTR(german, "Deutsch") -MAKE_PSTR(dutch, "Niederländisch") -MAKE_PSTR(french, "Französisch") -MAKE_PSTR(italian, "Italienisch") -MAKE_PSTR(high, "hoch") -MAKE_PSTR(low, "niedrig") -MAKE_PSTR(radiator, "Heizkörper") -MAKE_PSTR(convector, "Konvektor") -MAKE_PSTR(floor, "Fussboden") -MAKE_PSTR(summer, "Sommer") -MAKE_PSTR(winter, "Winter") -MAKE_PSTR(outdoor, "Aussentemperatur") -MAKE_PSTR_WORD(mpc) -MAKE_PSTR(room, "Raum") -MAKE_PSTR(room_outdoor, "Raum+Au�en") -MAKE_PSTR(power, "Leistung") -MAKE_PSTR(constant, "konstant") -MAKE_PSTR(simple, "einfach") -MAKE_PSTR(optimized, "optimiert") -MAKE_PSTR(nofrost, "Frostschutz") -MAKE_PSTR(comfort, "Komfort") -MAKE_PSTR(night, "Nacht") -MAKE_PSTR(day, "Tag") -MAKE_PSTR(holiday, "Urlaub") -MAKE_PSTR(reduce, "reduziert") -MAKE_PSTR(noreduce, "unreduziert") -MAKE_PSTR(offset, "Anhebung") -MAKE_PSTR(design, "Auslegung") -MAKE_PSTR_WORD(tempauto) -MAKE_PSTR(minflow, "minfluss") -MAKE_PSTR(maxflow, "maxfluss") -MAKE_PSTR_WORD(rc3x) -MAKE_PSTR_WORD(rc20) - -MAKE_PSTR(internal_temperature, "interne Temperatur") -MAKE_PSTR(internal_setpoint, "interner Sollwert") -MAKE_PSTR(external_temperature, "externe Temperatur") -MAKE_PSTR(burner_temperature, "Kesseltemperatur") -MAKE_PSTR(ww_temperature, "Wassertemperatur") -MAKE_PSTR(functioning_mode, "functioning mode") -MAKE_PSTR(smoke_temperature, "Abgastemperatur") - -// thermostat lists -MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-dw-dst >")) -MAKE_PSTR_LIST(tpl_switchtime, F("Format: < nn.d.o.hh:mm >")) -MAKE_PSTR_LIST(tpl_switchtime1, F("Format: [ not_set | day hh:mm Tn ]")) -MAKE_PSTR_LIST(tpl_holidays, F("Format: < dd.mm.yyyy-dd.mm.yyyy >")) -MAKE_PSTR_LIST(enum_ibaMainDisplay, - F_(internal_temperature), - F_(internal_setpoint), - F_(external_temperature), - F_(burner_temperature), - F_(ww_temperature), - F_(functioning_mode), - F_(time), - F_(date), - F_(smoke_temperature)) -MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) -MAKE_PSTR_LIST(enum_ibaLanguage_RC30, F_(german), F_(dutch)) -MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) -MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) // RC300 -MAKE_PSTR_LIST(enum_PID, F("fast"), F_(medium), F("slow")) -MAKE_PSTR_LIST(enum_wwMode, F_(off), F("normal"), F_(comfort), F_(auto), F_(own_prog), F_(eco)) -MAKE_PSTR_LIST(enum_wwCircMode, F_(off), F_(on), F_(auto), F_(own_prog)) -MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) -MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) -MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) -MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) -MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F("heizen"), F("kühlen")) -MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) -MAKE_PSTR_LIST(enum_operatingstate, F_(heating), F_(off), F_(cooling)) - -MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 -MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) // RC20 -MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC30, RC25 -MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS -MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF -MAKE_PSTR_LIST(enum_mode6, F_(nofrost), F_(night), F_(day)) // RC10 - -MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) -// MAKE_PSTR_LIST(enum_modetype2, F_(day)) -MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) -MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) -MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) - -MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) -MAKE_PSTR_LIST(enum_reducemode1, F_(outdoor), F_(room), F_(reduce)) // RC310 values: 1-3 -MAKE_PSTR_LIST(enum_nofrostmode, F_(off), F_(room), F_(outdoor)) -MAKE_PSTR_LIST(enum_nofrostmode1, F_(room), F_(outdoor), F_(room_outdoor)) - -MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) -MAKE_PSTR_LIST(enum_controlmode1, F("weather-compensated"), F("outside-basepoint"), F("n/a"), F_(room)) // RC310 1-4 -MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) -// MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) -MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) -MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb110")) - -MAKE_PSTR_LIST(enum_wwProgMode, F("std Prog"), F_(own_prog)) -MAKE_PSTR_LIST(enum_dayOfWeek, F("Mo"), F("Di"), F("Mi"), F("Do"), F("Fr"), F("Sa"), F("So"), F("Alle")) -MAKE_PSTR_LIST(enum_progMode, F("Prog_1"), F("Prog_2")) -MAKE_PSTR_LIST(enum_progMode2, - F("Eigen_1"), - F("Familie"), - F("Morgends"), - F("Abends"), - F("Vormittag"), - F("Nachmittag"), - F("Mittag"), - F("Singles"), - F("Senioren"), - F("Neu"), - F("Eigen_2")) -MAKE_PSTR_LIST(enum_progMode3, F("Familie"), F("Morgends"), F("Abends"), F("Vormittag"), F("Nachmittag"), F("Mittag"), F("Singles"), F("Senioren")) -MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) - -MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) -MAKE_PSTR_LIST(enum_climate, F("Solltemperature"), F("Raumtemperatur")) - -// solar list -MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) -MAKE_PSTR_LIST(enum_collectortype, F("flach"), F("vakuum")) -MAKE_PSTR_LIST(enum_cylprio, F("Zyl_1"), F("Zyl_2")) - -// id used to store the device ID, goes into MQTT payload -MAKE_PSTR_LIST(ID, F_(id)) - -// Boiler -// extra commands -MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("Aktiviere Warmwasser im Wartungsmodus")) -MAKE_PSTR_LIST(reset, F("reset"), F("Reset")) - -// single mqtt topics -MAKE_PSTR_WORD(heating_active) -MAKE_PSTR_WORD(tapwater_active) -MAKE_PSTR_WORD(response) - -// mqtt, commands and text -MAKE_PSTR_LIST(heatingActive, F("heatingactive"), F("Heizung aktiv")) -MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("Warmwasser aktiv")) -MAKE_PSTR_LIST(selFlowTemp, F("selflowtemp"), F("Sollwert Flusstemperatur")) -MAKE_PSTR_LIST(selBurnPow, F("selburnpow"), F("Sollwert Brennerleistung")) -MAKE_PSTR_LIST(heatingPumpMod, F("heatingpumpmod"), F("Heizungspumpe 1 Modulation")) -MAKE_PSTR_LIST(heatingPump2Mod, F("heatingpump2mod"), F("Heizungspumpe 2 Modulation")) -MAKE_PSTR_LIST(outdoorTemp, F("outdoortemp"), F("Aussentemperatur")) -MAKE_PSTR_LIST(curFlowTemp, F("curflowtemp"), F("aktuelle Flusstemperatur")) -MAKE_PSTR_LIST(retTemp, F("rettemp"), F("Rücklauftemperatur")) -MAKE_PSTR_LIST(switchTemp, F("switchtemp"), F("Mischer Schalttemperatur")) -MAKE_PSTR_LIST(sysPress, F("syspress"), F("Systemdruck")) -MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("Kesseltemperatur")) -MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("Auslasstemperatur")) -MAKE_PSTR_LIST(burnGas, F("burngas"), F("Gas")) -MAKE_PSTR_LIST(burnGas2, F("burngas2"), F("Gas Stufe 2")) -MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("Flammstrom")) -MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("Heizungspumpe")) -MAKE_PSTR_LIST(fanWork, F("fanwork"), F("Gebläse")) -MAKE_PSTR_LIST(ignWork, F("ignwork"), F("Zündung")) -MAKE_PSTR_LIST(oilPreHeat, F("oilpreheat"), F("oil preheating")) -MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("Heizen aktiviert")) -MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("Kesseltemperatur")) -MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("Kesselpumpen Maximalleistung")) -MAKE_PSTR_LIST(pumpModMin, F("pumpmodmin"), F("Kesselpumpen Minmalleistung")) -MAKE_PSTR_LIST(pumpDelay, F("pumpdelay"), F("Pumpennachlauf")) -MAKE_PSTR_LIST(burnMinPeriod, F("burnminperiod"), F("Antipendelzeit")) -MAKE_PSTR_LIST(burnMinPower, F("burnminpower"), F("minimale Brennerleistung")) -MAKE_PSTR_LIST(burnMaxPower, F("burnmaxpower"), F("maximale Brennerleistung")) -MAKE_PSTR_LIST(boilHystOn, F("boilhyston"), F("Hysterese ein temperatur")) -MAKE_PSTR_LIST(boilHystOff, F("boilhystoff"), F("Hysterese aus temperatur")) -MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("Sollwert Flusstemperatur")) -MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("Sollwert Brennerleistung")) -MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("Brennerleistung")) -MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("Brenner # starts")) -MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("Brenner Laufzeit")) -MAKE_PSTR_LIST(burn2WorkMin, F("burn2workmin"), F("Brenner Stufe 2 Laufzeit")) -MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("Heizung Laufzeit")) -MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("gesamte Laufzeit")) -MAKE_PSTR_LIST(lastCode, F("lastcode"), F("Fehlerspeicher")) -MAKE_PSTR_LIST(serviceCode, F("servicecode"), F("Statusmeldung")) -MAKE_PSTR_LIST(serviceCodeNumber, F("servicecodenumber"), F("Statusmeldungsnummer")) -MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("Wartungsmeldung")) -MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("Wartungsdatum")) -MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("Wartungsplan")) -MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("Wartung in")) -MAKE_PSTR_LIST(emergencyOps, F("emergencyops"), F("emergency operation")) -MAKE_PSTR_LIST(emergencyTemp, F("emergencytemp"), F("emergency temperature")) - -// heatpump/compress specific -MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("Betriebszeit total heizen")) -MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("Betriebszeit Kompressor heizen")) -MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("Betriebszeit Kompressor kühlen")) -MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("Betriebszeit Kompressor")) -MAKE_PSTR_LIST(upTimeCompPool, F("uptimecomppool"), F("Betriebszeit Kompressor Pool")) -MAKE_PSTR_LIST(totalCompStarts, F("totalcompstarts"), F("gesamt Kompressor Starts")) -MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("Heizen Starts")) -MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("Kühlen Starts")) -MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("Pool Starts")) -MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("totaler Energieverbrauch")) -MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("Energieverbrauch Kompressor total")) -MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("Energieverbrauch Kompressor heizen")) -MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("Energieverbrauch Kompressor")) -MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("Energieverbrauch Kompressor kühlen")) -MAKE_PSTR_LIST(nrgConsCompPool, F("nrgconscomppool"), F("Energieverbrauch Kompressor Pool")) -MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("gesamte Energieabgabe")) -MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("gesamte Energieabgabe heizen")) -MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("gesamte Energieabgabe")) -MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("gesamte Energieabgabe kühlen")) -MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("gesamte Energieabgabe Pool")) -MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("Energieverbrauch el. Zusatzheizung")) -MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("Energieverbrauch el. Zusatzheizung Heizen")) -MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("Energieverbrauch el. Zusatzheizung")) -MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("Energieverbrauch el. Zusatzheizung Pool")) - -MAKE_PSTR_LIST(hpPower, F("hppower"), F("Leistung Wärmepumpe")) -MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("HP Compressor")) -MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("HP Heating")) -MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("HP Cooling")) -MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("HP dhw")) -MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("HP Pool")) -MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("Brine Pump Speed")) -MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("Compressor Speed")) -MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("Circulation pump Speed")) -MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("Brine in/Evaporator")) -MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("Brine out/Condenser")) -MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("Suction gas")) -MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("Hot gas/Compressed")) -MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("Switch Valve")) -MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("Compressor Activity")) -MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("Wärmeträgerflüssigkeit Eingang (TC0)")) -MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("Wärmeträgerflüssigkeit Ausgang (TC1)")) -MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("Verflüssigertemperatur (TC3)")) -MAKE_PSTR_LIST(hpTr3, F("hptr3"), F(" Temperaturfühler Kältemittel (Flüssigkeit) (TR3)")) -MAKE_PSTR_LIST(hpTr4, F("hptr4"), F("Verdampfer Eintritt (TR4)")) -MAKE_PSTR_LIST(hpTr5, F("hptr5"), F("Temperaturfühler Kompessoransaugleitung (TR5)")) -MAKE_PSTR_LIST(hpTr6, F("hptr6"), F("Temperaturfühler Kompressorausgangsleitung (TR6)")) -MAKE_PSTR_LIST(hpTr7, F("hptr7"), F("Temperaturfühler Kältemittel (Gas) (TR7)")) -MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("Außenlufttemperaturfühler (TL2)")) -MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("Niedrigdruckfühler (PL1)")) -MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("Hochdruckfühler (PH1)")) - -// hybrid heatpump -MAKE_PSTR_LIST(enum_hybridStrategy, F("co2-optimized"), F("cost-optimized"), F("outside-temp-switched"), F("co2-cost-mix")) -MAKE_PSTR_LIST(hybridStrategy, F("hybridstrategy"), F("hybrid control strategy")) -MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("outside switchover temperature")) -MAKE_PSTR_LIST(energyCostRatio, F("energycostratio"), F("energy cost ratio")) -MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile energy factor")) -MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric energy factor")) -MAKE_PSTR_LIST(delayBoiler, F("delayboiler"), F("delay boiler support")) -MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("tempediff boiler support")) - -// alternative heatsource AM200 -MAKE_PSTR_LIST(aCylTopTemp, F("cyltoptemp"), F("Zylinder oben Temperatur")) -MAKE_PSTR_LIST(aCylCenterTemp, F("cylcentertemp"), F("Zylinder mitte Temperatur")) -MAKE_PSTR_LIST(aCylBottomTemp, F("cylbottomtemp"), F("Zylinder unten Temperatur")) -MAKE_PSTR_LIST(aFlowTemp, F("altflowtemp"), F("Alternativ hs Flusstemperatur")) -MAKE_PSTR_LIST(aRetTemp, F("altrettemp"), F("Alternativ hs Rücktemperatur")) -MAKE_PSTR_LIST(sysFlowTemp, F("sysflowtemp"), F("System Flusstemperature")) -MAKE_PSTR_LIST(sysRetTemp, F("sysrettemp"), F("System Rücktemperature")) -MAKE_PSTR_LIST(valveByPass, F("valvebypass"), F("bypass Ventil")) -MAKE_PSTR_LIST(valveBuffer, F("valvebuffer"), F("Puffer Ventil")) -MAKE_PSTR_LIST(valveReturn, F("valvereturn"), F("Rückfluss Ventil")) -MAKE_PSTR_LIST(aPumpMod, F("altpumpmod"), F("Alternativ hs Pumpenmodulation")) -MAKE_PSTR_LIST(heatSource, F("heatsource"), F("Alternativ Heizung")) - -MAKE_PSTR_LIST(vr2Config, F("vr2config"), F("vr2 configuration")) -MAKE_PSTR_LIST(ahsActivated, F("ahsactivated"), F("alternate heat source activation")) -MAKE_PSTR_LIST(aPumpConfig, F("apumpconfig"), F("primary pump config")) -MAKE_PSTR_LIST(aPumpSignal, F("apumpsignal"), F("output for pr1 pump")) -MAKE_PSTR_LIST(aPumpMin, F("apumpmin"), F("min output pump pr1")) -MAKE_PSTR_LIST(tempRise, F("temprise"), F("ahs return temp rise")) -MAKE_PSTR_LIST(setReturnTemp, F("setreturntemp"), F("set temp return")) -MAKE_PSTR_LIST(mixRuntime, F("mixruntime"), F("mixer run time")) -// MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("set flow temp")) -MAKE_PSTR_LIST(bufBypass, F("bufbypass"), F("buffer bypass config")) -MAKE_PSTR_LIST(bufMixRuntime, F("bufmixruntime"), F("bypass mixer run time")) -MAKE_PSTR_LIST(bufConfig, F("bufconfig"), F("dhw buffer config")) -MAKE_PSTR_LIST(blockMode, F("blockmode"), F("config htg. blocking mode")) -MAKE_PSTR_LIST(blockTerm, F("blockterm"), F("config of block terminal")) -MAKE_PSTR_LIST(blockHyst, F("blockhyst"), F("hyst. for bolier block")) -MAKE_PSTR_LIST(releaseWait, F("releasewait"), F("boiler release wait time")) - -// the following are dhw for the boiler and automatically tagged with 'ww' -MAKE_PSTR_LIST(wWSelTemp, F("wwseltemp"), F("gewählte Temperatur")) -MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) -MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off")) -MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperature")) -MAKE_PSTR_LIST(wWSetTemp, F("wwsettemp"), F("Solltemperatur")) -MAKE_PSTR_LIST(wWType, F("wwtype"), F("Typ")) -MAKE_PSTR_LIST(wWComfort, F("wwcomfort"), F("Komfort")) -MAKE_PSTR_LIST(wWFlowTempOffset, F("wwflowtempoffset"), F("Flusstemperaturanhebung")) -MAKE_PSTR_LIST(wWMaxPower, F("wwmaxpower"), F("max Leistung")) -MAKE_PSTR_LIST(wWCircPump, F("wwcircpump"), F("Zirkulationspumpe vorhanden")) -MAKE_PSTR_LIST(wWChargeType, F("wwchargetype"), F("Ladungstyp")) -MAKE_PSTR_LIST(wWDisinfectionTemp, F("wwdisinfectiontemp"), F("Desinfectionstemperatur")) -MAKE_PSTR_LIST(wWCircMode, F("wwcircmode"), F("Zirkulationspumpenfrequenz")) -MAKE_PSTR_LIST(wWCirc, F("wwcirc"), F("Zirkulation aktiv")) -MAKE_PSTR_LIST(wWCurTemp, F("wwcurtemp"), F("aktuelle Warmwasser Temperatur intern")) -MAKE_PSTR_LIST(wWCurTemp2, F("wwcurtemp2"), F("aktuelle Warmwaser Temperatur extern")) -MAKE_PSTR_LIST(wWCurFlow, F("wwcurflow"), F("aktueller Durchfluss")) -MAKE_PSTR_LIST(wWStorageTemp1, F("wwstoragetemp1"), F("interne Speichertemperature")) -MAKE_PSTR_LIST(wWStorageTemp2, F("wwstoragetemp2"), F("externer Speichertemperatur")) -MAKE_PSTR_LIST(wWActivated, F("wwactivated"), F("aktiviert")) -MAKE_PSTR_LIST(wWOneTime, F("wwonetime"), F("Einmalladung")) -MAKE_PSTR_LIST(wWDisinfecting, F("wwdisinfect"), F("Desinfizieren")) -MAKE_PSTR_LIST(wWCharging, F("wwcharging"), F("Laden")) -MAKE_PSTR_LIST(wWRecharging, F("wwrecharging"), F("Nachladen")) -MAKE_PSTR_LIST(wWTempOK, F("wwtempok"), F("Temperatur ok")) -MAKE_PSTR_LIST(wWActive, F("wwactive"), F("aktiv")) -MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("Temperatur ok")) -MAKE_PSTR_LIST(wwActive, F("wwactive"), F("aktiv")) -MAKE_PSTR_LIST(ww3wayValve, F("ww3wayvalve"), F("3-Wegeventil aktiv")) -MAKE_PSTR_LIST(wWSetPumpPower, F("wwsetpumppower"), F("Soll Pumpenleistung")) -MAKE_PSTR_LIST(mixerTemp, F("mixertemp"), F("Mischertemperatur")) -MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) -MAKE_PSTR_LIST(wWStarts, F("wwstarts"), F("Anzahl starts")) -MAKE_PSTR_LIST(wWStarts2, F("wwstarts2"), F("Kreis 2 Anzahl Starts")) -MAKE_PSTR_LIST(wWWorkM, F("wwworkm"), F("aktive Zeit")) -MAKE_PSTR_LIST(wWHystOn, F("wwhyston"), F("Hysterese Einschalttemperatur")) -MAKE_PSTR_LIST(wWHystOff, F("wwhystoff"), F("Hysterese Ausschalttemperatur")) -MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("Programmmodus")) -MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("Zirkulationsprogramm")) -MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("Maximale Temperatur")) -MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("Einmalladungstaste")) - -// mqtt values / commands -MAKE_PSTR_LIST(switchtime, F("switchtime"), F("Program Schaltzeit")) -MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("Program 1 Schaltzeit")) -MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("Programm 2 Schaltzeit")) -MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("Programm Schaltzeit")) -MAKE_PSTR_LIST(wwcircswitchtime, F("wwcircswitchtime"), F("Zirculationsprogramm Schaltzeit")) -MAKE_PSTR_LIST(dateTime, F("datetime"), F("Datum/Zeit")) -MAKE_PSTR_LIST(errorCode, F("errorcode"), F("Fehlermeldung")) -MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("Anzeige")) -MAKE_PSTR_LIST(ibaLanguage, F("language"), F("Sprache")) -MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("Uhrkorrektur")) -MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("Gebäude")) -MAKE_PSTR_LIST(heatingPID, F("heatingpid"), F("heating PID")) -MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("Korrektur interner Temperatur")) -MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("min Aussentemperatur")) -MAKE_PSTR_LIST(backlight, F("backlight"), F("key backlight")) -MAKE_PSTR_LIST(damping, F("damping"), F("Dämpfung der Außentemperatur")) -MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("Temperatursensor 1")) -MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("Temperatursensor 2")) -MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("gedämpfte Aussentemperatur")) -MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("Estrichtrocknung")) -MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("Estrichtrocknungs Temperatur")) -MAKE_PSTR_LIST(brightness, F("brightness"), F("bildschirmhelligkeit")) -MAKE_PSTR_LIST(autodst, F("autodst"), F("automatische sommerzeit umstellung")) -MAKE_PSTR_LIST(preheating, F("preheating"), F("vorheizen im uhrenprogramm")) -MAKE_PSTR_LIST(offtemp, F("offtemp"), F("temperatur bei ausgeschaltetem modus")) -MAKE_PSTR_LIST(mixingvalves, F("mixingvalves"), F("mischventile")) -// thermostat ww -MAKE_PSTR_LIST(wwMode, F("wwmode"), F("modus")) -MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("untere Solltemperatur")) -MAKE_PSTR_LIST(wwCharge, F("wwcharge"), F("charge")) -MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) -MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) -MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) -MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) -MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) -MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("Kreis 1 Extra")) -MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("Kreis 2 Extra")) -MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) -MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) -MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("wenn Thermostatmodus ist aus")) -// thermostat hc -MAKE_PSTR_LIST(climate, F("climate")) -MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("Sollwert Raumtemperatur")) -MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("aktuelle Raumtemperatur")) -MAKE_PSTR_LIST(mode, F("mode"), F("modus")) -MAKE_PSTR_LIST(modetype, F("modetype"), F("modus Typ")) -MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) -MAKE_PSTR_LIST(daytemp, F("daytemp"), F("Tagestemperatur")) -MAKE_PSTR_LIST(daylowtemp, F("daytemp2"), F("Tagestemperatur T2")) -MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("Tagestemperatur T3")) -MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("Tagestemperatur T4")) -MAKE_PSTR_LIST(heattemp, F("heattemp"), F("Heizen Temperatur")) -MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("Nachttemperatur")) -MAKE_PSTR_LIST(nighttemp2, F("nighttemp"), F("Nachttemperatur T1")) -MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco Temperatur")) -MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manuelle Temperatur")) -MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("zwischenzeitliche Solltemperatur")) -MAKE_PSTR_LIST(comforttemp, F("comforttemp"), F("Komforttemperatur")) -MAKE_PSTR_LIST(summertemp, F("summertemp"), F("Sommertemperatur")) -MAKE_PSTR_LIST(designtemp, F("designtemp"), F("design-Temperatur")) -MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("Temperaturanhebung")) -MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min Flusstemperatur")) -MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max Flusstemperatur")) -MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("Raumeinfluss")) -MAKE_PSTR_LIST(roominfl_factor, F("roominflfactor"), F("Raumeinfluss Factor")) -MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("aktueller Raumeinfluss")) -MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur")) -MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur")) -MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp")) -MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb")) -MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("Wärmepumpe Betriebsmodus")) -MAKE_PSTR_LIST(hpoperatingstate, F("hpoperatingstate"), F("heatpump operating state")) -MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus")) -MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung")) -MAKE_PSTR_LIST(wwHolidays, F("wwholidays"), F("holiday dates")) -MAKE_PSTR_LIST(wwVacations, F("wwvacations"), F("vacation dates")) -MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) -MAKE_PSTR_LIST(vacations, F("vacations"), F("vacation dates")) -MAKE_PSTR_LIST(program, F("program"), F("Programm")) -MAKE_PSTR_LIST(pause, F("pause"), F("Pausenzeit")) -MAKE_PSTR_LIST(party, F("party"), F("Partyzeit")) -MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) -MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("Urlaubstemperatur")) -MAKE_PSTR_LIST(summermode, F("summermode"), F("Sommerbetrieb")) -MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("Urlaubsbetrieb")) -MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("Flusstemperaturanhebung")) -MAKE_PSTR_LIST(reducemode, F("reducemode"), F("Absenkmodus")) -MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("Absenkung unterbrechen unter Temperatur")) -MAKE_PSTR_LIST(reducetemp, F("reducetemp"), F("Absenkmodus unter Temperatur")) -MAKE_PSTR_LIST(vacreducetemp, F("vacreducetemp"), F("Urlaub Absenkmodus unter Temperatur")) -MAKE_PSTR_LIST(vacreducemode, F("vacreducemode"), F("Urlaub Absenkmodus")) -MAKE_PSTR_LIST(nofrostmode, F("nofrostmode"), F("Frostschutz Modus")) -MAKE_PSTR_LIST(nofrostmode1, F("nofrostmode1"), F("nofrost mode")) // RC310 -MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("Raumtemperatur der Fernsteuerung")) -MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) -MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) -MAKE_PSTR_LIST(switchonoptimization, F("switchonoptimization"), F("switch-on optimization")) - -// heatpump -MAKE_PSTR_LIST(airHumidity, F("airhumidity"), F("relative Luftfeuchte")) -MAKE_PSTR_LIST(dewTemperature, F("dewtemperature"), F("Taupunkttemperatur")) - -// mixer -MAKE_PSTR_LIST(flowSetTemp, F("flowsettemp"), F("Sollwert Flusstemperatur")) -MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("Flusstemperatur des hk (TC1)")) -MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("Pumpenstatus des hk (PC1)")) -MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("Mischerventil Position (VC1)")) -MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("Flusstemperatur am Kessel (T0/Vf)")) -MAKE_PSTR_LIST(mixerSetTime, F("valvesettime"), F("time to set valve")) -// mixer prefixed with wwc -MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("Pumpenstatus des wwk (PC1)")) -MAKE_PSTR_LIST(wwTempStatus, F("tempstatus"), F("Temperaturschalter des wwk (MC1)")) -MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("aktuelle Temperatur")) -// mixer pool -MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) -MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) -MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) -MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) -MAKE_PSTR_LIST(hydrTemp, F("hydrTemp"), F("hydraulic header temperature")) - -// solar -MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("Kollektortemperatur (TS1)")) -MAKE_PSTR_LIST(collector2Temp, F("collector2temp"), F("collector 2 temperature (TS7)")) -MAKE_PSTR_LIST(cylBottomTemp, F("cylbottomtemp"), F("Speicher Bodentemperatur (TS2)")) -MAKE_PSTR_LIST(cyl2BottomTemp, F("cyl2bottomtemp"), F("2. Speicher Bodentemperatur (TS5)")) -MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("wärmetauscher Temperatur (TS6)")) -MAKE_PSTR_LIST(cylMiddleTemp, F("cylmiddletemp"), F("cylinder middle temperature (TS3)")) -MAKE_PSTR_LIST(retHeatAssist, F("retheatassist"), F("return temperature heat assistance (TS4)")) -// correct name for M1? value not found, try this: -MAKE_PSTR_LIST(m1Valve, F("heatassistvalve"), F("heat assistance valve (M1)")) -MAKE_PSTR_LIST(m1Power, F("heatassistpower"), F("heat assistance valve power (M1)")) -MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximale Kollektortemperatur")) -MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimale Kollektortemperatur")) -MAKE_PSTR_LIST(cylMaxTemp, F("cylmaxtemp"), F("maximale Speichertemperatur")) -// MAKE_PSTR_LIST(cyl2MaxTemp, F("cyl2maxtemp"), F("maximum cylinder 2 temperature")) -MAKE_PSTR_LIST(solarPumpMod, F("solarpumpmod"), F("Pumpenmodulation (PS1)")) -MAKE_PSTR_LIST(cylPumpMod, F("cylpumpmod"), F("Speicherpumpenmodulation (PS5)")) -MAKE_PSTR_LIST(solarPump, F("solarpump"), F("Pumpe (PS1)")) -MAKE_PSTR_LIST(solarPump2, F("solarpump2"), F("pump 2 (PS4)")) -MAKE_PSTR_LIST(solarPump2Mod, F("solarpump2mod"), F("pump 2 modulation (PS4)")) -MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("ventilstatus")) -MAKE_PSTR_LIST(cylHeated, F("cylheated"), F("Speichertemperatur erreicht")) -MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("Kollektorabschaltung")) -MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("Pumpenlaufzeit")) -MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("Pumpe 2 Laufzeit")) -MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("Differenzregelung Arbeitszeit")) -MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("Energie letzte Std")) -MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("Gesamtenergie")) -MAKE_PSTR_LIST(energyToday, F("energytoday"), F("Energie heute")) -MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) -MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) -MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) -MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) -MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) -MAKE_PSTR_LIST(pump2MinMod, F("pump2minmod"), F("minimum pump 2 modulation")) -MAKE_PSTR_LIST(solarPump2TurnonDiff, F("turnondiff2"), F("pump 2 turn on difference")) -MAKE_PSTR_LIST(solarPump2TurnoffDiff, F("turnoffdiff2"), F("pump 2 turn off difference")) - -// solar ww -MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("Temperatur 1")) -MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("Temperatur 3")) -MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("Temperatur 4")) -MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("Temperatur 5")) -MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("Temperatur 7")) -MAKE_PSTR_LIST(wwPump, F("wwpump"), F("Pumpe")) -// solar ww and mixer wwc -MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimale Temperatur")) -MAKE_PSTR_LIST(wwRedTemp, F("wwredtemp"), F("redizierte Temperatur")) -MAKE_PSTR_LIST(wwDailyTemp, F("wwdailytemp"), F("tägl. Temperatur")) -MAKE_PSTR_LIST(wwKeepWarm, F("wwkeepwarm"), F("Warmhalten")) -MAKE_PSTR_LIST(wwStatus2, F("wwstatus2"), F("Status 2")) -MAKE_PSTR_LIST(enum_wwStatus2, F(""), F(""), F(""), F("no_heat"), F(""), F(""), F("heatrequest"), F(""), F("disinfecting"), F("hold")) -MAKE_PSTR_LIST(wwPumpMod, F("wwpumpmod"), F("Pumpen Modulation")) -MAKE_PSTR_LIST(wwFlow, F("wwflow"), F("Flussrate")) -// extra mixer ww -MAKE_PSTR_LIST(wwRequiredTemp, F("wwrequiredtemp"), F("benötigte Temperatur")) -MAKE_PSTR_LIST(wwDiffTemp, F("wwdifftemp"), F("Start Differential Temperatur")) - -//SM100 -MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("Wärmetransfer System")) -MAKE_PSTR_LIST(externalCyl, F("externalcyl"), F("Externer Speicher")) -MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("Thermische Desinfektion")) -MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("Wärmemessung")) -MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("Solarmodul aktiviert")) - -// telegram 0x035A -MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("solar Pumpen Einst.")) -MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pumpkick")) -MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode")) -MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow")) -MAKE_PSTR_LIST(solarPump2Mode, F("pump2mode"), F("pump 2 mode")) -MAKE_PSTR_LIST(solarPump2Kick, F("pump2kick"), F("pumpkick 2")) - -// telegram 0x035F -MAKE_PSTR_LIST(cylPriority, F("cylpriority"), F("Speicher Priorität")) - -// telegram 0x380 -MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone")) -MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("Kollektor 1 Fläche")) -MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("Kollektor 1 Type")) -MAKE_PSTR_LIST(collector2Area, F("collector2area"), F("Kollektor 2 Fläche")) -MAKE_PSTR_LIST(collector2Type, F("collector2type"), F("Kollektor 2 Type")) - -// telegram 0x0363 heatCounter -MAKE_PSTR_LIST(heatCntFlowTemp, F("heatcntflowtemp"), F("Wärmezähler Fluss-Temperatur")) -MAKE_PSTR_LIST(heatCntRetTemp, F("heatcntrettemp"), F("Wärmezähler Rückfluss-Temperatur")) -MAKE_PSTR_LIST(heatCnt, F("heatcnt"), F("Wärmezäler Impulse")) -MAKE_PSTR_LIST(swapFlowTemp, F("swapflowtemp"), F("Austausch Fluss-Temperatur (TS14)")) -MAKE_PSTR_LIST(swapRetTemp, F("swaprettemp"), F("Austausch Rückfluss-Temperatur (TS15)")) - -// switch -MAKE_PSTR_LIST(activated, F("activated"), F("aktiviert")) -MAKE_PSTR_LIST(status, F("status"), F("Status")) - -// unknown fields to track (SM10) -MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) -MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) -MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) -MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) -MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) -MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) -MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) - -// RF sensor, id 0x40, telegram 0x435 -MAKE_PSTR_LIST(RFTemp, F("rftemp"), F("RF Raumtemperatur Sensor")); diff --git a/src/locale_EN.h b/src/locale_EN.h deleted file mode 100644 index 93b9b8248..000000000 --- a/src/locale_EN.h +++ /dev/null @@ -1,848 +0,0 @@ -/* - * EMS-ESP - https://github.com/emsesp/EMS-ESP - * Copyright 2020 Paul Derbyshire - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -// common words -MAKE_PSTR_WORD(debug) -MAKE_PSTR_WORD(exit) -MAKE_PSTR_WORD(help) -MAKE_PSTR_WORD(log) -MAKE_PSTR_WORD(logout) -MAKE_PSTR_WORD(enabled) -MAKE_PSTR_WORD(disabled) -MAKE_PSTR_WORD(set) -MAKE_PSTR_WORD(show) -MAKE_PSTR_WORD(on) -MAKE_PSTR_WORD(off) -MAKE_PSTR_WORD(ON) -MAKE_PSTR_WORD(OFF) -MAKE_PSTR_WORD(su) -MAKE_PSTR_WORD(name) -MAKE_PSTR_WORD(auto) -MAKE_PSTR_WORD(scan) -MAKE_PSTR_WORD(password) -MAKE_PSTR_WORD(read) -MAKE_PSTR_WORD(version) -MAKE_PSTR_WORD(values) -MAKE_PSTR_WORD(system) -MAKE_PSTR_WORD(fetch) -MAKE_PSTR_WORD(restart) -MAKE_PSTR_WORD(format) -MAKE_PSTR_WORD(raw) -MAKE_PSTR_WORD(watch) -MAKE_PSTR_WORD(syslog) -MAKE_PSTR_WORD(send) -MAKE_PSTR_WORD(telegram) -MAKE_PSTR_WORD(bus_id) -MAKE_PSTR_WORD(tx_mode) -MAKE_PSTR_WORD(ems) -MAKE_PSTR_WORD(devices) -MAKE_PSTR_WORD(shower) -MAKE_PSTR_WORD(mqtt) -MAKE_PSTR_WORD(emsesp) -MAKE_PSTR_WORD(connected) -MAKE_PSTR_WORD(disconnected) -MAKE_PSTR_WORD(passwd) -MAKE_PSTR_WORD(hostname) -MAKE_PSTR_WORD(wifi) -MAKE_PSTR_WORD(reconnect) -MAKE_PSTR_WORD(ssid) -MAKE_PSTR_WORD(heartbeat) -MAKE_PSTR_WORD(users) -MAKE_PSTR_WORD(publish) -MAKE_PSTR_WORD(timeout) -MAKE_PSTR_WORD(board_profile) -MAKE_PSTR_WORD(setvalue) - -// for commands -MAKE_PSTR_WORD(call) -MAKE_PSTR_WORD(cmd) -MAKE_PSTR_WORD(id) -MAKE_PSTR_WORD(hc) -MAKE_PSTR_WORD(wwc) -MAKE_PSTR_WORD(device) -MAKE_PSTR_WORD(data) -MAKE_PSTR_WORD(command) -MAKE_PSTR_WORD(commands) -MAKE_PSTR_WORD(info) -MAKE_PSTR_WORD(settings) -MAKE_PSTR_WORD(customizations) -MAKE_PSTR_WORD(value) -MAKE_PSTR_WORD(error) -MAKE_PSTR_WORD(entities) - -// devices -MAKE_PSTR_WORD(boiler) -MAKE_PSTR_WORD(thermostat) -MAKE_PSTR_WORD(switch) -MAKE_PSTR_WORD(solar) -MAKE_PSTR_WORD(mixer) -MAKE_PSTR_WORD(gateway) -MAKE_PSTR_WORD(controller) -MAKE_PSTR_WORD(connect) -MAKE_PSTR_WORD(heatpump) -MAKE_PSTR_WORD(generic) -MAKE_PSTR_WORD(analogsensor) -MAKE_PSTR_WORD(unknown) -MAKE_PSTR_WORD(dallassensor) - -// format strings -MAKE_PSTR(host_fmt, "Host: %s") -MAKE_PSTR(port_fmt, "Port: %d") -MAKE_PSTR(hostname_fmt, "Hostname: %s") -MAKE_PSTR(board_profile_fmt, "Board Profile: %s") -MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") -MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") -MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") -MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") -MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") -MAKE_PSTR(log_level_fmt, "Log level: %s") - -MAKE_STR(productid_fmt, "%s EMS ProductID") - -MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) -MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) -MAKE_PSTR_LIST(enum_sensortype, F("none"), F("digital in"), F("counter"), F("adc"), F("timer"), F("rate"), F("digital out"), F("pwm 0"), F("pwm 1"), F("pwm 2")) - -// strings -MAKE_PSTR(EMSESP, "EMS-ESP") -MAKE_PSTR(cmd_optional, "[cmd]") -MAKE_PSTR(ha_optional, "[ha]") -MAKE_PSTR(deep_optional, "[deep]") -MAKE_PSTR(watchid_optional, "[ID]") -MAKE_PSTR(watch_format_optional, "[off | on | raw | unknown]") -MAKE_PSTR(invalid_watch, "Invalid watch type") -MAKE_PSTR(data_mandatory, "\"XX XX ...\"") -MAKE_PSTR(asterisks, "********") -MAKE_PSTR(n_mandatory, "") -MAKE_PSTR(sensorid_optional, "[sensor ID]") -MAKE_PSTR(id_optional, "[id|hc]") -MAKE_PSTR(data_optional, "[data]") -MAKE_PSTR(offset_optional, "[offset]") -MAKE_PSTR(length_optional, "[length]") -MAKE_PSTR(typeid_mandatory, "") -MAKE_PSTR(deviceid_mandatory, "") -MAKE_PSTR(device_type_optional, "[device]") -MAKE_PSTR(invalid_log_level, "Invalid log level") -MAKE_PSTR(log_level_optional, "[level]") -MAKE_PSTR(name_mandatory, "") -MAKE_PSTR(name_optional, "[name]") -MAKE_PSTR(new_password_prompt1, "Enter new password: ") -MAKE_PSTR(new_password_prompt2, "Retype new password: ") -MAKE_PSTR(password_prompt, "Password: ") -MAKE_PSTR(unset, "") - -// command descriptions -MAKE_PSTR(info_cmd, "lists all values") -MAKE_PSTR(commands_cmd, "lists all commands") -MAKE_PSTR(entities_cmd, "lists all entities") - -MAKE_PSTR_WORD(number) -MAKE_PSTR_WORD(enum) -MAKE_PSTR_WORD(text) - -MAKE_PSTR_WORD(2) -MAKE_PSTR_WORD(4) -MAKE_PSTR_WORD(10) -MAKE_PSTR_WORD(100) -MAKE_PSTR_WORD(60) - -MAKE_PSTR_LIST(div2, F_(2)) -MAKE_PSTR_LIST(div4, F_(4)) -MAKE_PSTR_LIST(div10, F_(10)) -MAKE_PSTR_LIST(div60, F_(60)) -MAKE_PSTR_LIST(div100, F_(100)) -MAKE_PSTR_LIST(mul5, F("-5")) -MAKE_PSTR_LIST(mul10, F("-10")) -MAKE_PSTR_LIST(mul15, F("-15")) - -// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp -// uom - also used with HA see https://github.com/home-assistant/core/blob/d7ac4bd65379e11461c7ce0893d3533d8d8b8cbf/homeassistant/const.py#L384 -MAKE_PSTR(blank, " ") -MAKE_PSTR(percent, "%") -MAKE_PSTR(degrees, "°C") -MAKE_PSTR(kwh, "kWh") -MAKE_PSTR(wh, "Wh") -MAKE_PSTR(bar, "bar") -MAKE_PSTR(minutes, "minutes") -MAKE_PSTR(hours, "hours") -MAKE_PSTR(days, "days") -MAKE_PSTR(ua, "uA") -MAKE_PSTR(lmin, "l/min") -MAKE_PSTR(kw, "kW") -MAKE_PSTR(w, "W") -MAKE_PSTR(kb, "KB") -MAKE_PSTR(seconds, "seconds") -MAKE_PSTR(dbm, "dBm") -MAKE_PSTR(fahrenheit, "°F") -MAKE_PSTR(mv, "mV") -MAKE_PSTR(sqm, "sqm") -MAKE_PSTR(m3, "m3") -MAKE_PSTR(l, "l") -// MAKE_PSTR(times, "times") -// MAKE_PSTR(oclock, "o'clock") - -// TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp -// use empty string if want to suppress showing tags -// mqtt tags must not have spaces -MAKE_PSTR(tag_none, "") -MAKE_PSTR(tag_heartbeat, "") -MAKE_PSTR(tag_boiler_data_ww, "dhw") -MAKE_PSTR(tag_device_data, "") -MAKE_PSTR(tag_device_data_ww, "dhw") -MAKE_PSTR(tag_hc1, "hc1") -MAKE_PSTR(tag_hc2, "hc2") -MAKE_PSTR(tag_hc3, "hc3") -MAKE_PSTR(tag_hc4, "hc4") -MAKE_PSTR(tag_hc5, "hc5") -MAKE_PSTR(tag_hc6, "hc6") -MAKE_PSTR(tag_hc7, "hc7") -MAKE_PSTR(tag_hc8, "hc8") -MAKE_PSTR(tag_wwc1, "wwc1") -MAKE_PSTR(tag_wwc2, "wwc2") -MAKE_PSTR(tag_wwc3, "wwc3") -MAKE_PSTR(tag_wwc4, "wwc4") -MAKE_PSTR(tag_wwc5, "wwc5") -MAKE_PSTR(tag_wwc6, "wwc6") -MAKE_PSTR(tag_wwc7, "wwc7") -MAKE_PSTR(tag_wwc8, "wwc8") -MAKE_PSTR(tag_wwc9, "wwc9") -MAKE_PSTR(tag_wwc10, "wwc10") -MAKE_PSTR(tag_ahs, "ahs") -MAKE_PSTR(tag_hs1, "hs1") -MAKE_PSTR(tag_hs2, "hs2") -MAKE_PSTR(tag_hs3, "hs3") -MAKE_PSTR(tag_hs4, "hs4") -MAKE_PSTR(tag_hs5, "hs5") -MAKE_PSTR(tag_hs6, "hs6") -MAKE_PSTR(tag_hs7, "hs7") -MAKE_PSTR(tag_hs8, "hs8") -MAKE_PSTR(tag_hs9, "hs9") -MAKE_PSTR(tag_hs10, "hs10") -MAKE_PSTR(tag_hs11, "hs11") -MAKE_PSTR(tag_hs12, "hs12") -MAKE_PSTR(tag_hs13, "hs13") -MAKE_PSTR(tag_hs14, "hs14") -MAKE_PSTR(tag_hs15, "hs15") -MAKE_PSTR(tag_hs16, "hs16") - -// MQTT topic names -// MAKE_PSTR(tag_heartbeat_mqtt, "heartbeat") -// MAKE_PSTR(tag_boiler_data_mqtt, "") -MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww") -MAKE_PSTR(tag_device_data_ww_mqtt, "") - -// boiler -MAKE_PSTR_WORD(time) -MAKE_PSTR_WORD(date) -MAKE_PSTR_WORD(1x3min) -MAKE_PSTR_WORD(2x3min) -MAKE_PSTR_WORD(3x3min) -MAKE_PSTR_WORD(4x3min) -MAKE_PSTR_WORD(5x3min) -MAKE_PSTR_WORD(6x3min) -MAKE_PSTR_WORD(continuous) -MAKE_PSTR(3wayvalve, "3-way valve") -MAKE_PSTR(chargepump, "charge pump") -MAKE_PSTR_WORD(hot) -MAKE_PSTR_WORD(high_comfort) -MAKE_PSTR_WORD(eco) -MAKE_PSTR_WORD(intelligent) -MAKE_PSTR_WORD(flow) -MAKE_PSTR_WORD(manual) -MAKE_PSTR_WORD(buffer) -MAKE_PSTR(bufferedflow, "buffered flow") -MAKE_PSTR(layeredbuffer, "layered buffer") -MAKE_PSTR_WORD(maintenance) -MAKE_PSTR_WORD(heating) -MAKE_PSTR_WORD(cooling) - -// boiler lists -MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) // template for text input -MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual)) -MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) -MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) -MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) -MAKE_PSTR_LIST(enum_comfort1, F_(high_comfort), F_(eco)) -MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) -MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) -// MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) - -// AM200 lists -MAKE_PSTR_LIST(enum_vr2Config, F_(off), F("bypass")); -MAKE_PSTR_LIST(enum_aPumpSignal, F_(off), F("pwm"), F("pwm_invers")); -MAKE_PSTR_LIST(enum_bufBypass, F("no"), F_(mixer), F("valve")); -MAKE_PSTR_LIST(enum_bufConfig, F("monovalent"), F("bivalent")); -MAKE_PSTR_LIST(enum_blockMode, F_(off), F_(auto), F("blocking")); -MAKE_PSTR_LIST(enum_blockTerm, F("n_o"), F("n_c")); - -//heatpump -MAKE_PSTR_LIST(enum_hpactivity, F("none"), F_(heating), F_(cooling), F("hot_water"), F("pool")) - -// mixer -MAKE_PSTR_LIST(enum_shunt, F("stopped"), F("opening"), F("closing"), F("open"), F("close")) - -// thermostat -MAKE_PSTR_WORD(light) -MAKE_PSTR_WORD(medium) -MAKE_PSTR_WORD(heavy) -MAKE_PSTR_WORD(own_prog) -MAKE_PSTR_WORD(start) -MAKE_PSTR_WORD(heat) -MAKE_PSTR_WORD(hold) -MAKE_PSTR_WORD(cool) -MAKE_PSTR_WORD(end) -MAKE_PSTR_WORD(german) -MAKE_PSTR_WORD(dutch) -MAKE_PSTR_WORD(french) -MAKE_PSTR_WORD(italian) -MAKE_PSTR_WORD(high) -MAKE_PSTR_WORD(low) -MAKE_PSTR_WORD(radiator) -MAKE_PSTR_WORD(convector) -MAKE_PSTR_WORD(floor) -MAKE_PSTR_WORD(summer) -MAKE_PSTR_WORD(winter) -MAKE_PSTR_WORD(outdoor) -MAKE_PSTR_WORD(mpc) -MAKE_PSTR_WORD(room) -MAKE_PSTR_WORD(room_outdoor) -MAKE_PSTR_WORD(power) -MAKE_PSTR_WORD(constant) -MAKE_PSTR_WORD(simple) -MAKE_PSTR_WORD(optimized) -MAKE_PSTR_WORD(nofrost) -MAKE_PSTR_WORD(comfort) -MAKE_PSTR_WORD(night) -MAKE_PSTR_WORD(day) -MAKE_PSTR_WORD(holiday) -MAKE_PSTR_WORD(reduce) -MAKE_PSTR_WORD(noreduce) -MAKE_PSTR_WORD(offset) -MAKE_PSTR_WORD(design) -MAKE_PSTR_WORD(tempauto) -MAKE_PSTR_WORD(minflow) -MAKE_PSTR_WORD(maxflow) -MAKE_PSTR_WORD(rc3x) -MAKE_PSTR_WORD(rc20) - -MAKE_PSTR(internal_temperature, "internal temperature") -MAKE_PSTR(internal_setpoint, "internal setpoint") -MAKE_PSTR(external_temperature, "external temperature") -MAKE_PSTR(burner_temperature, "burner temperature") -MAKE_PSTR(ww_temperature, "ww temperature") -MAKE_PSTR(functioning_mode, "functioning mode") -MAKE_PSTR(smoke_temperature, "smoke temperature") - -// thermostat lists -MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-day(0-6)-dst(0/1) >")) -MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) -MAKE_PSTR_LIST(tpl_switchtime1, F("Format: [ not_set | day hh:mm Tn ]")) -MAKE_PSTR_LIST(tpl_holidays, F("format: < dd.mm.yyyy-dd.mm.yyyy >")) -MAKE_PSTR_LIST(enum_ibaMainDisplay, - F_(internal_temperature), - F_(internal_setpoint), - F_(external_temperature), - F_(burner_temperature), - F_(ww_temperature), - F_(functioning_mode), - F_(time), - F_(date), - F_(smoke_temperature)) -MAKE_PSTR_LIST(enum_ibaLanguage, F_(german), F_(dutch), F_(french), F_(italian)) -MAKE_PSTR_LIST(enum_ibaLanguage_RC30, F_(german), F_(dutch)) -MAKE_PSTR_LIST(enum_floordrystatus, F_(off), F_(start), F_(heat), F_(hold), F_(cool), F_(end)) -MAKE_PSTR_LIST(enum_ibaBuildingType, F_(light), F_(medium), F_(heavy)) -MAKE_PSTR_LIST(enum_PID, F("fast"), F_(medium), F("slow")) -MAKE_PSTR_LIST(enum_wwMode, F_(off), F("normal"), F_(comfort), F_(auto), F_(own_prog), F_(eco)) -MAKE_PSTR_LIST(enum_wwCircMode, F_(off), F_(on), F_(auto), F_(own_prog)) -MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto)) -MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto)) -MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor)) -MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter)) -MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F_(heating), F_(cooling)) -MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer)) -MAKE_PSTR_LIST(enum_operatingstate, F_(heating), F_(off), F_(cooling)) - -MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310 -MAKE_PSTR_LIST(enum_mode2, F_(off), F_(manual), F_(auto)) // RC20 -MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC30, RC25 -MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS -MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF -MAKE_PSTR_LIST(enum_mode6, F_(nofrost), F_(night), F_(day)) // RC10 - -MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) -// MAKE_PSTR_LIST(enum_modetype2, F_(day)) -MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) -MAKE_PSTR_LIST(enum_modetype4, F_(nofrost), F_(eco), F_(heat)) -MAKE_PSTR_LIST(enum_modetype5, F_(off), F_(on)) - -MAKE_PSTR_LIST(enum_reducemode, F_(nofrost), F_(reduce), F_(room), F_(outdoor)) -MAKE_PSTR_LIST(enum_reducemode1, F_(outdoor), F_(room), F_(reduce)) // RC310 values: 1-3 -MAKE_PSTR_LIST(enum_nofrostmode, F_(off), F_(room), F_(outdoor)) -MAKE_PSTR_LIST(enum_nofrostmode1, F_(room), F_(outdoor), F_(room_outdoor)) - -MAKE_PSTR_LIST(enum_controlmode, F_(off), F_(optimized), F_(simple), F_(mpc), F_(room), F_(power), F_(constant)) -MAKE_PSTR_LIST(enum_controlmode1, F("weather-compensated"), F("outside-basepoint"), F("n/a"), F_(room)) // RC310 1-4 -MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room)) -// MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) -MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) -MAKE_PSTR_LIST(enum_j_control, F_(off), F("fb10"), F("fb100")) - -MAKE_PSTR_LIST(enum_wwProgMode, F("std_prog"), F_(own_prog)) -MAKE_PSTR_LIST(enum_dayOfWeek, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("su"), F("all")) -MAKE_PSTR_LIST(enum_progMode, F("prog_1"), F("prog_2")) -MAKE_PSTR_LIST(enum_progMode2, F("own_1"), F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors"), F("new"), F("own_2")) -MAKE_PSTR_LIST(enum_progMode3, F("family"), F("morning"), F("evening"), F("am"), F("pm"), F("midday"), F("singles"), F("seniors")) -MAKE_PSTR_LIST(enum_progMode4, F("prog_a"), F("prog_b"), F("prog_c"), F("prog_d"), F("prog_e"), F("prog_f")) - -MAKE_PSTR_LIST(enum_switchmode, F_(off), F_(eco), F_(comfort), F_(heat)) -MAKE_PSTR_LIST(enum_climate, F("selTemp"), F("roomTemp")) - -// solar list -MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) -MAKE_PSTR_LIST(enum_collectortype, F("flat"), F("vacuum")) -MAKE_PSTR_LIST(enum_cylprio, F("cyl_1"), F("cyl_2")) - -// id used to store the device ID. empty full name so only gets displayed in the MQTT payload -MAKE_PSTR_LIST(ID, F_(id)) - -// Boiler -// extra commands, with no json output -MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("turn on/off")) -MAKE_PSTR_LIST(reset, F("reset"), F("reset")) - -// single mqtt topics -MAKE_PSTR_WORD(heating_active) -MAKE_PSTR_WORD(tapwater_active) -MAKE_PSTR_WORD(response) - -// mqtt, commands and text -MAKE_PSTR_LIST(heatingActive, F("heatingactive"), F("heating active")) -MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("tapwater active")) -MAKE_PSTR_LIST(selFlowTemp, F("selflowtemp"), F("selected flow temperature")) -MAKE_PSTR_LIST(selBurnPow, F("selburnpow"), F("burner selected max power")) -MAKE_PSTR_LIST(heatingPumpMod, F("heatingpumpmod"), F("heating pump modulation")) -MAKE_PSTR_LIST(heatingPump2Mod, F("heatingpump2mod"), F("heating pump 2 modulation")) -MAKE_PSTR_LIST(outdoorTemp, F("outdoortemp"), F("outside temperature")) -MAKE_PSTR_LIST(curFlowTemp, F("curflowtemp"), F("current flow temperature")) -MAKE_PSTR_LIST(retTemp, F("rettemp"), F("return temperature")) -MAKE_PSTR_LIST(switchTemp, F("switchtemp"), F("mixing switch temperature")) -MAKE_PSTR_LIST(sysPress, F("syspress"), F("system pressure")) -MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("actual boiler temperature")) -MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("exhaust temperature")) -MAKE_PSTR_LIST(burnGas, F("burngas"), F("gas")) -MAKE_PSTR_LIST(burnGas2, F("burngas2"), F("gas stage 2")) -MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("flame current")) -MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("heating pump")) -MAKE_PSTR_LIST(fanWork, F("fanwork"), F("fan")) -MAKE_PSTR_LIST(ignWork, F("ignwork"), F("ignition")) -MAKE_PSTR_LIST(oilPreHeat, F("oilpreheat"), F("oil preheating")) -MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("heating activated")) -MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("heating temperature")) -MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("burner pump max power")) -MAKE_PSTR_LIST(pumpModMin, F("pumpmodmin"), F("burner pump min power")) -MAKE_PSTR_LIST(pumpDelay, F("pumpdelay"), F("pump delay")) -MAKE_PSTR_LIST(burnMinPeriod, F("burnminperiod"), F("burner min period")) -MAKE_PSTR_LIST(burnMinPower, F("burnminpower"), F("burner min power")) -MAKE_PSTR_LIST(burnMaxPower, F("burnmaxpower"), F("burner max power")) -MAKE_PSTR_LIST(boilHystOn, F("boilhyston"), F("hysteresis on temperature")) -MAKE_PSTR_LIST(boilHystOff, F("boilhystoff"), F("hysteresis off temperature")) -MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("set flow temperature")) -MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("burner set power")) -MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("burner current power")) -MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("burner starts")) -MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("total burner operating time")) -MAKE_PSTR_LIST(burn2WorkMin, F("burn2workmin"), F("burner stage 2 operating time")) -MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("total heat operating time")) -MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("total UBA operating time")) -MAKE_PSTR_LIST(lastCode, F("lastcode"), F("last error code")) -MAKE_PSTR_LIST(serviceCode, F("servicecode"), F("service code")) -MAKE_PSTR_LIST(serviceCodeNumber, F("servicecodenumber"), F("service code number")) -MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("maintenance message")) -MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("next maintenance date")) -MAKE_PSTR_LIST(maintenanceType, F_(maintenance), F("maintenance scheduled")) -MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("time to next maintenance")) -MAKE_PSTR_LIST(emergencyOps, F("emergencyops"), F("emergency operation")) -MAKE_PSTR_LIST(emergencyTemp, F("emergencytemp"), F("emergency temperature")) - -// heatpump/compress specific -MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("total operating time heat")) -MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("operating time compressor heating")) -MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("operating time compressor cooling")) -MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("operating time compressor dhw")) -MAKE_PSTR_LIST(upTimeCompPool, F("uptimecomppool"), F("operating time compressor pool")) -MAKE_PSTR_LIST(totalCompStarts, F("totalcompstarts"), F("total compressor control starts")) -MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("heating control starts")) -MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("cooling control starts")) -MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("pool control starts")) -MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("total energy consumption")) -MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("total energy consumption compressor")) -MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("energy consumption compressor heating")) -MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("energy consumption compressor dhw")) -MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("energy consumption compressor cooling")) -MAKE_PSTR_LIST(nrgConsCompPool, F("nrgconscomppool"), F("energy consumption compressor pool")) -MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("total energy supplied")) -MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("total energy supplied heating")) -MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("total energy warm supplied dhw")) -MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("total energy supplied cooling")) -MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("total energy supplied pool")) -MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, F("auxelecheatnrgconstotal"), F("total auxiliary electrical heater energy consumption")) -MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, F("auxelecheatnrgconsheating"), F("auxiliary electrical heater energy consumption heating")) -MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption dhw")) -MAKE_PSTR_LIST(auxElecHeatNrgConsPool, F("auxelecheatnrgconspool"), F("auxiliary electrical heater energy consumption pool")) - -MAKE_PSTR_LIST(hpPower, F("hppower"), F("compressor power output")) -MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("hp compressor")) -MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("hp heating")) -MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("hp cooling")) -MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("hp dhw")) -MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("hp pool")) -MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("brine pump speed")) -MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("compressor speed")) -MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("circulation pump speed")) -MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("brine in/evaporator")) -MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("brine out/condenser")) -MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("suction gas")) -MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("hot gas/compressed")) -MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("switch valve")) -MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("compressor activity")) -MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("heat carrier return (TC0)")) -MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("heat carrier forward (TC1)")) -MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("condenser temperature (TC3)")) -MAKE_PSTR_LIST(hpTr3, F("hptr3"), F("refrigerant temperature liquid side (condenser output) (TR3)")) -MAKE_PSTR_LIST(hpTr4, F("hptr4"), F("evaporator inlet temperature (TR4)")) -MAKE_PSTR_LIST(hpTr5, F("hptr5"), F("compressor Inlet temperature (TR5)")) -MAKE_PSTR_LIST(hpTr6, F("hptr6"), F("compressor outlet temperature (TR6)")) -MAKE_PSTR_LIST(hpTr7, F("hptr7"), F("refrigerant temperature gas side (condenser input) (TR7)")) -MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("air inlet temperature (TL2)")) -MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("low pressure side temperature (PL1)")) -MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)")) - -// hybrid heatpump -MAKE_PSTR_LIST(enum_hybridStrategy, F("co2-optimized"), F("cost-optimized"), F("outside-temp-switched"), F("co2-cost-mix")) -MAKE_PSTR_LIST(hybridStrategy, F("hybridstrategy"), F("hybrid control strategy")) -MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("outside switchover temperature")) -MAKE_PSTR_LIST(energyCostRatio, F("energycostratio"), F("energy cost ratio")) -MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile energy factor")) -MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric energy factor")) -MAKE_PSTR_LIST(delayBoiler, F("delayboiler"), F("delay boiler support")) -MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("tempediff boiler support")) - -// alternative heatsource AM200 -MAKE_PSTR_LIST(aCylTopTemp, F("cyltoptemp"), F("cylinder top temperature")) -MAKE_PSTR_LIST(aCylCenterTemp, F("cylcentertemp"), F("cylinder center temperature")) -MAKE_PSTR_LIST(aCylBottomTemp, F("cylbottomtemp"), F("cylinder bottom temperature")) -MAKE_PSTR_LIST(aFlowTemp, F("altflowtemp"), F("alternative hs flow temperature")) -MAKE_PSTR_LIST(aRetTemp, F("altrettemp"), F("alternative hs return temperature")) -MAKE_PSTR_LIST(sysFlowTemp, F("sysflowtemp"), F("system flow temperature")) -MAKE_PSTR_LIST(sysRetTemp, F("sysrettemp"), F("system return temperature")) -MAKE_PSTR_LIST(valveByPass, F("valvebypass"), F("bypass valve")) -MAKE_PSTR_LIST(valveBuffer, F("valvebuffer"), F("buffer valve")) -MAKE_PSTR_LIST(valveReturn, F("valvereturn"), F("return valve")) -MAKE_PSTR_LIST(aPumpMod, F("altpumpmod"), F("alternative hs pump modulation")) -MAKE_PSTR_LIST(heatSource, F("heatsource"), F("alternative heating active")) - -MAKE_PSTR_LIST(vr2Config, F("vr2config"), F("vr2 configuration")) -MAKE_PSTR_LIST(ahsActivated, F("ahsactivated"), F("alternate heat source activation")) -MAKE_PSTR_LIST(aPumpConfig, F("apumpconfig"), F("primary pump config")) -MAKE_PSTR_LIST(aPumpSignal, F("apumpsignal"), F("output for pr1 pump")) -MAKE_PSTR_LIST(aPumpMin, F("apumpmin"), F("min output pump pr1")) -MAKE_PSTR_LIST(tempRise, F("temprise"), F("ahs return temp rise")) -MAKE_PSTR_LIST(setReturnTemp, F("setreturntemp"), F("set temp return")) -MAKE_PSTR_LIST(mixRuntime, F("mixruntime"), F("mixer run time")) -// MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("set flow temp")) -MAKE_PSTR_LIST(bufBypass, F("bufbypass"), F("buffer bypass config")) -MAKE_PSTR_LIST(bufMixRuntime, F("bufmixruntime"), F("bypass mixer run time")) -MAKE_PSTR_LIST(bufConfig, F("bufconfig"), F("dhw buffer config")) -MAKE_PSTR_LIST(blockMode, F("blockmode"), F("config htg. blocking mode")) -MAKE_PSTR_LIST(blockTerm, F("blockterm"), F("config of block terminal")) -MAKE_PSTR_LIST(blockHyst, F("blockhyst"), F("hyst. for bolier block")) -MAKE_PSTR_LIST(releaseWait, F("releasewait"), F("boiler release wait time")) - -// the following are dhw for the boiler and automatically tagged with 'ww' -MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature")) -MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) -MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off")) -MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperature")) -MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) -MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) -MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) -MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("comfort mode")) -MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset")) -MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) -MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) -MAKE_PSTR_LIST(wwChargeType, F("wwchargetype"), F("charging type")) -MAKE_PSTR_LIST(wwDisinfectionTemp, F("wwdisinfectiontemp"), F("disinfection temperature")) -MAKE_PSTR_LIST(wwCircMode, F("wwcircmode"), F("circulation pump mode")) // also used in thermostat -MAKE_PSTR_LIST(wwCirc, F("wwcirc"), F("circulation active")) -MAKE_PSTR_LIST(wwCurTemp, F("wwcurtemp"), F("current intern temperature")) -MAKE_PSTR_LIST(wwCurTemp2, F("wwcurtemp2"), F("current extern temperature")) -MAKE_PSTR_LIST(wwCurFlow, F("wwcurflow"), F("current tap water flow")) -MAKE_PSTR_LIST(wwStorageTemp1, F("wwstoragetemp1"), F("storage intern temperature")) -MAKE_PSTR_LIST(wwStorageTemp2, F("wwstoragetemp2"), F("storage extern temperature")) -MAKE_PSTR_LIST(wwActivated, F("wwactivated"), F("activated")) -MAKE_PSTR_LIST(wwOneTime, F("wwonetime"), F("one time charging")) -MAKE_PSTR_LIST(wwDisinfecting, F("wwdisinfecting"), F("disinfecting")) -MAKE_PSTR_LIST(wwCharging, F("wwcharging"), F("charging")) -MAKE_PSTR_LIST(wwChargeOptimization, F("wwchargeoptimization"), F("charge optimization")) -MAKE_PSTR_LIST(wwRecharging, F("wwrecharging"), F("recharging")) -MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("temperature ok")) -MAKE_PSTR_LIST(wwActive, F("wwactive"), F("active")) -MAKE_PSTR_LIST(ww3wayValve, F("ww3wayvalve"), F("3way valve active")) -MAKE_PSTR_LIST(wwSetPumpPower, F("wwsetpumppower"), F("set pump power")) -MAKE_PSTR_LIST(wwMixerTemp, F("wwmixertemp"), F("mixer temperature")) -MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) -MAKE_PSTR_LIST(wwStarts, F("wwstarts"), F("starts")) -MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("control starts2")) -MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time")) -MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature")) -MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature")) -MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("program")) -MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("circulation program")) -MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("maximum temperature")) -MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("one time key function")) - -// mqtt values / commands -MAKE_PSTR_LIST(switchtime, F("switchtime"), F("program switchtime")) -MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime")) -MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime")) -MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime")) -MAKE_PSTR_LIST(wwcircswitchtime, F("wwcircswitchtime"), F("circulation program switchtime")) -MAKE_PSTR_LIST(dateTime, F("datetime"), F("date/time")) -MAKE_PSTR_LIST(errorCode, F("errorcode"), F("error code")) -MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("display")) -MAKE_PSTR_LIST(ibaLanguage, F("language"), F("language")) -MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("clock offset")) -MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building type")) -MAKE_PSTR_LIST(heatingPID, F("heatingpid"), F("heating PID")) -MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("internal temperature offset")) -MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("minimal external temperature")) -MAKE_PSTR_LIST(backlight, F("backlight"), F("key backlight")) -MAKE_PSTR_LIST(damping, F("damping"), F("damping outdoor temperature")) -MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("temperature sensor 1")) -MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2")) -MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature")) -MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying")) -MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature")) -MAKE_PSTR_LIST(brightness, F("brightness"), F("screen brightness")) -MAKE_PSTR_LIST(autodst, F("autodst"), F("automatic change daylight saving time")) -MAKE_PSTR_LIST(preheating, F("preheating"), F("preheating in the clock program")) -MAKE_PSTR_LIST(offtemp, F("offtemp"), F("temperature when mode is off")) -MAKE_PSTR_LIST(mixingvalves, F("mixingvalves"), F("mixing valves")) -// thermostat ww -MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode")) -MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature")) -MAKE_PSTR_LIST(wwCharge, F("wwcharge"), F("charge")) -MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) -MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) -MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) -MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) -MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) -MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra")) -MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) -MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) -MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) -MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("when thermostat mode off")) -// thermostat hc -MAKE_PSTR_LIST(climate, F("HA climate config creation")) // no full-name, hidden, only for creation -MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature")) -MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("current room temperature")) -MAKE_PSTR_LIST(mode, F("mode"), F("mode")) -MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type")) -MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup")) -MAKE_PSTR_LIST(daytemp, F("daytemp"), F("day temperature")) -MAKE_PSTR_LIST(daylowtemp, F("daytemp2"), F("day temperature T2")) -MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3")) -MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4")) -MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) -MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) -MAKE_PSTR_LIST(nighttemp2, F("nighttemp"), F("night temperature T1")) -MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature")) -MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature")) -MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode")) -MAKE_PSTR_LIST(remoteseltemp, F("remoteseltemp"), F("temporary set temperature from remote")) -MAKE_PSTR_LIST(comforttemp, F("comforttemp"), F("comfort temperature")) -MAKE_PSTR_LIST(summertemp, F("summertemp"), F("summer temperature")) -MAKE_PSTR_LIST(designtemp, F("designtemp"), F("design temperature")) -MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("offset temperature")) -MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min flow temperature")) -MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max flow temperature")) -MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("room influence")) -MAKE_PSTR_LIST(roominfl_factor, F("roominflfactor"), F("room influence factor")) -MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("current room influence")) -MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature")) -MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature")) -MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("heating type")) -MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("set summer mode")) -MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("heatpump operating mode")) -MAKE_PSTR_LIST(hpoperatingstate, F("hpoperatingstate"), F("heatpump operating state")) -MAKE_PSTR_LIST(controlmode, F("controlmode"), F("control mode")) -MAKE_PSTR_LIST(control, F("control"), F("control device")) -MAKE_PSTR_LIST(wwHolidays, F("wwholidays"), F("holiday dates")) -MAKE_PSTR_LIST(wwVacations, F("wwvacations"), F("vacation dates")) -MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) -MAKE_PSTR_LIST(vacations, F("vacations"), F("vacation dates")) -MAKE_PSTR_LIST(program, F("program"), F("program")) -MAKE_PSTR_LIST(pause, F("pause"), F("pause time")) -MAKE_PSTR_LIST(party, F("party"), F("party time")) -MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) -MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("holiday temperature")) -MAKE_PSTR_LIST(summermode, F("summermode"), F("summer mode")) -MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("holiday mode")) -MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("flow temperature offset for mixer")) -MAKE_PSTR_LIST(reducemode, F("reducemode"), F("reduce mode")) -MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("no reduce below temperature")) -MAKE_PSTR_LIST(reducetemp, F("reducetemp"), F("off/reduce switch temperature")) -MAKE_PSTR_LIST(vacreducetemp, F("vacreducetemp"), F("vacations off/reduce switch temperature")) -MAKE_PSTR_LIST(vacreducemode, F("vacreducemode"), F("vacations reduce mode")) -MAKE_PSTR_LIST(nofrostmode, F("nofrostmode"), F("nofrost mode")) -MAKE_PSTR_LIST(nofrostmode1, F("nofrostmode1"), F("nofrost mode")) // RC310 -MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("room temperature from remote")) -MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) -MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) -MAKE_PSTR_LIST(switchonoptimization, F("switchonoptimization"), F("switch-on optimization")) - -// heatpump -MAKE_PSTR_LIST(airHumidity, F("airhumidity"), F("relative air humidity")) -MAKE_PSTR_LIST(dewTemperature, F("dewtemperature"), F("dew point temperature")) - -// mixer -MAKE_PSTR_LIST(flowSetTemp, F("flowsettemp"), F("setpoint flow temperature")) -MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("flow temperature (TC1)")) -MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("pump status (PC1)")) -MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("mixing valve actuator (VC1)")) -MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("flow temperature in header (T0/Vf)")) -MAKE_PSTR_LIST(mixerSetTime, F("valvesettime"), F("time to set valve")) -// mixer prefixed with wwc -MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("pump status in assigned wwc (PC1)")) -MAKE_PSTR_LIST(wwTempStatus, F("wwtempstatus"), F("temperature switch in assigned wwc (MC1)")) -MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("current temperature")) -// mixer pool -MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) -MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) -MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) -MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) -MAKE_PSTR_LIST(hydrTemp, F("hydrTemp"), F("hydraulic header temperature")) - -// solar -MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("collector temperature (TS1)")) -MAKE_PSTR_LIST(collector2Temp, F("collector2temp"), F("collector 2 temperature (TS7)")) -MAKE_PSTR_LIST(cylBottomTemp, F("cylbottomtemp"), F("cylinder bottom temperature (TS2)")) -MAKE_PSTR_LIST(cyl2BottomTemp, F("cyl2bottomtemp"), F("second cylinder bottom temperature (TS5)")) -MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("heat exchanger temperature (TS6)")) -MAKE_PSTR_LIST(cylMiddleTemp, F("cylmiddletemp"), F("cylinder middle temperature (TS3)")) -MAKE_PSTR_LIST(retHeatAssist, F("retheatassist"), F("return temperature heat assistance (TS4)")) -// correct name for M1? value not found, try this: -MAKE_PSTR_LIST(m1Valve, F("heatassistvalve"), F("heat assistance valve (M1)")) -MAKE_PSTR_LIST(m1Power, F("heatassistpower"), F("heat assistance valve power (M1)")) -MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximum collector temperature")) -MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimum collector temperature")) -MAKE_PSTR_LIST(cylMaxTemp, F("cylmaxtemp"), F("maximum cylinder temperature")) -// MAKE_PSTR_LIST(cyl2MaxTemp, F("cyl2maxtemp"), F("maximum cylinder 2 temperature")) -MAKE_PSTR_LIST(solarPumpMod, F("solarpumpmod"), F("pump modulation (PS1)")) -MAKE_PSTR_LIST(cylPumpMod, F("cylpumpmod"), F("cylinder pump modulation (PS5)")) -MAKE_PSTR_LIST(solarPump, F("solarpump"), F("pump (PS1)")) -MAKE_PSTR_LIST(solarPump2, F("solarpump2"), F("pump 2 (PS4)")) -MAKE_PSTR_LIST(solarPump2Mod, F("solarpump2mod"), F("pump 2 modulation (PS4)")) -MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("valve status")) -MAKE_PSTR_LIST(cylHeated, F("cylheated"), F("cyl heated")) -MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("collector shutdown")) -MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("pump working time")) -MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("pump 2 working time")) -MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("differential control working time")) -MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("energy last hour")) -MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("total energy")) -MAKE_PSTR_LIST(energyToday, F("energytoday"), F("total energy today")) -MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) -MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) -MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) -MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) -MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) -MAKE_PSTR_LIST(pump2MinMod, F("pump2minmod"), F("minimum pump 2 modulation")) -MAKE_PSTR_LIST(solarPump2TurnonDiff, F("turnondiff2"), F("pump 2 turn on difference")) -MAKE_PSTR_LIST(solarPump2TurnoffDiff, F("turnoffdiff2"), F("pump 2 turn off difference")) - -// solar ww -MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("temperature 1")) -MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("temperature 3")) -MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("temperature 4")) -MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("temperature 5")) -MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("temperature 7")) -MAKE_PSTR_LIST(wwPump, F("wwpump"), F("pump")) -// solar ww and mixer wwc -MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimum temperature")) -MAKE_PSTR_LIST(wwRedTemp, F("wwredtemp"), F("reduced temperature")) -MAKE_PSTR_LIST(wwDailyTemp, F("wwdailytemp"), F("daily temperature")) -MAKE_PSTR_LIST(wwKeepWarm, F("wwkeepwarm"), F("keep warm")) -MAKE_PSTR_LIST(wwStatus2, F("wwstatus2"), F("status 2")) -MAKE_PSTR_LIST(enum_wwStatus2, F(""), F(""), F(""), F("no_heat"), F(""), F(""), F("heatrequest"), F(""), F("disinfecting"), F("hold")) -MAKE_PSTR_LIST(wwPumpMod, F("wwpumpmod"), F("pump modulation")) -MAKE_PSTR_LIST(wwFlow, F("wwflow"), F("flow rate")) -// extra mixer ww -MAKE_PSTR_LIST(wwRequiredTemp, F("wwrequiredtemp"), F("required temperature")) -MAKE_PSTR_LIST(wwDiffTemp, F("wwdifftemp"), F("start differential temperature")) - -//SM100 -MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("heattransfer system")) -MAKE_PSTR_LIST(externalCyl, F("externalcyl"), F("external cylinder")) -MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("thermal disinfection")) -MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("heatmetering")) -MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("solarmodule enabled")) - -// telegram 0x035A -MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("pump mode")) -MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pumpkick")) -MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode")) -MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow")) -MAKE_PSTR_LIST(solarPump2Mode, F("pump2mode"), F("pump 2 mode")) -MAKE_PSTR_LIST(solarPump2Kick, F("pump2kick"), F("pumpkick 2")) - -// telegram 0x035F -MAKE_PSTR_LIST(cylPriority, F("cylpriority"), F("cylinder priority")) - -// telegram 0x380 -MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone")) -MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("collector 1 area")) -MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("collector 1 type")) -MAKE_PSTR_LIST(collector2Area, F("collector2area"), F("collector 2 area")) -MAKE_PSTR_LIST(collector2Type, F("collector2type"), F("collector 2 type")) - -// telegram 0x0363 heatCounter -MAKE_PSTR_LIST(heatCntFlowTemp, F("heatcntflowtemp"), F("heat counter flow temperature")) -MAKE_PSTR_LIST(heatCntRetTemp, F("heatcntrettemp"), F("heat counter return temperature")) -MAKE_PSTR_LIST(heatCnt, F("heatcnt"), F("heat counter impulses")) -MAKE_PSTR_LIST(swapFlowTemp, F("swapflowtemp"), F("swap flow temperature (TS14)")) -MAKE_PSTR_LIST(swapRetTemp, F("swaprettemp"), F("swap return temperature (TS15)")) - -// switch -MAKE_PSTR_LIST(activated, F("activated"), F("activated")) -MAKE_PSTR_LIST(status, F("status"), F("status")) - -// unknown fields to track (SM10) -MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) -MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) -MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) -MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) -MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) -MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) -MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) - -// RF sensor, id 0x40, telegram 0x435 -MAKE_PSTR_LIST(RFTemp, F("rftemp"), F("RF room temperature sensor")); diff --git a/src/locale_common.h b/src/locale_common.h new file mode 100644 index 000000000..b0d32323a --- /dev/null +++ b/src/locale_common.h @@ -0,0 +1,370 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-variable" + +/* + * THIS FILE CONTAINS STANDARD STRING LITERALS THAT DON'T NEED LANGUAGE TRANSLATIONS + */ + +// common words +MAKE_PSTR_WORD(debug) +MAKE_PSTR_WORD(exit) +MAKE_PSTR_WORD(help) +MAKE_PSTR_WORD(log) +MAKE_PSTR_WORD(logout) +MAKE_PSTR_WORD(enabled) +MAKE_PSTR_WORD(disabled) +MAKE_PSTR_WORD(set) +MAKE_PSTR_WORD(show) +MAKE_PSTR_WORD(su) +MAKE_PSTR_WORD(name) +MAKE_PSTR_WORD(scan) +MAKE_PSTR_WORD(password) +MAKE_PSTR_WORD(read) +MAKE_PSTR_WORD(version) +MAKE_PSTR_WORD(values) +MAKE_PSTR_WORD(system) +MAKE_PSTR_WORD(fetch) +MAKE_PSTR_WORD(restart) +MAKE_PSTR_WORD(format) +MAKE_PSTR_WORD(raw) +MAKE_PSTR_WORD(watch) +MAKE_PSTR_WORD(syslog) +MAKE_PSTR_WORD(send) +MAKE_PSTR_WORD(telegram) +MAKE_PSTR_WORD(bus_id) +MAKE_PSTR_WORD(tx_mode) +MAKE_PSTR_WORD(ems) +MAKE_PSTR_WORD(devices) +MAKE_PSTR_WORD(shower) +MAKE_PSTR_WORD(mqtt) +MAKE_PSTR_WORD(emsesp) +MAKE_PSTR_WORD(connected) +MAKE_PSTR_WORD(disconnected) +MAKE_PSTR_WORD(passwd) +MAKE_PSTR_WORD(hostname) +MAKE_PSTR_WORD(wifi) +MAKE_PSTR_WORD(reconnect) +MAKE_PSTR_WORD(ssid) +MAKE_PSTR_WORD(heartbeat) +MAKE_PSTR_WORD(users) +MAKE_PSTR_WORD(publish) +MAKE_PSTR_WORD(timeout) +MAKE_PSTR_WORD(board_profile) +MAKE_PSTR_WORD(setvalue) + +// for commands +MAKE_PSTR_WORD(call) +MAKE_PSTR_WORD(cmd) +MAKE_PSTR_WORD(id) +MAKE_PSTR_WORD(hc) +MAKE_PSTR_WORD(wwc) +MAKE_PSTR_WORD(device) +MAKE_PSTR_WORD(data) +MAKE_PSTR_WORD(command) +MAKE_PSTR_WORD(commands) +MAKE_PSTR_WORD(info) +MAKE_PSTR_WORD(settings) +MAKE_PSTR_WORD(customizations) +MAKE_PSTR_WORD(value) +MAKE_PSTR_WORD(entities) + +// devices +MAKE_PSTR_WORD(boiler) +MAKE_PSTR_WORD(thermostat) +MAKE_PSTR_WORD(switch) +MAKE_PSTR_WORD(solar) +MAKE_PSTR_WORD(mixer) +MAKE_PSTR_WORD(gateway) +MAKE_PSTR_WORD(controller) +MAKE_PSTR_WORD(connect) +MAKE_PSTR_WORD(heatpump) +MAKE_PSTR_WORD(generic) +MAKE_PSTR_WORD(analogsensor) +MAKE_PSTR_WORD(dallassensor) + +MAKE_PSTR(number, "number") +MAKE_PSTR(enum, "enum") +MAKE_PSTR(text, "text") + +// Console +MAKE_PSTR(EMSESP, "EMS-ESP") +MAKE_PSTR(host_fmt, "Host: %s") +MAKE_PSTR(port_fmt, "Port: %d") +MAKE_PSTR(hostname_fmt, "Hostname: %s") +MAKE_PSTR(board_profile_fmt, "Board Profile: %s") +MAKE_PSTR(mark_interval_fmt, "Mark interval: %lus") +MAKE_PSTR(wifi_ssid_fmt, "WiFi SSID: %s") +MAKE_PSTR(wifi_password_fmt, "WiFi Password: %S") +MAKE_PSTR(tx_mode_fmt, "Tx mode: %d") +MAKE_PSTR(bus_id_fmt, "Bus ID: %02X") +MAKE_PSTR(log_level_fmt, "Log level: %s") +MAKE_PSTR(cmd_optional, "[cmd]") +MAKE_PSTR(ha_optional, "[ha]") +MAKE_PSTR(deep_optional, "[deep]") +MAKE_PSTR(watchid_optional, "[ID]") +MAKE_PSTR(watch_format_optional, "[off | on | raw | unknown]") +MAKE_PSTR(invalid_watch, "Invalid watch type") +MAKE_PSTR(data_mandatory, "\"XX XX ...\"") +MAKE_PSTR(asterisks, "********") +MAKE_PSTR(n_mandatory, "") +MAKE_PSTR(sensorid_optional, "[sensor ID]") +MAKE_PSTR(id_optional, "[id|hc]") +MAKE_PSTR(data_optional, "[data]") +MAKE_PSTR(offset_optional, "[offset]") +MAKE_PSTR(length_optional, "[length]") +MAKE_PSTR(typeid_mandatory, "") +MAKE_PSTR(deviceid_mandatory, "") +MAKE_PSTR(device_type_optional, "[device]") +MAKE_PSTR(invalid_log_level, "Invalid log level") +MAKE_PSTR(log_level_optional, "[level]") +MAKE_PSTR(name_mandatory, "") +MAKE_PSTR(name_optional, "[name]") +MAKE_PSTR(new_password_prompt1, "Enter new password: ") +MAKE_PSTR(new_password_prompt2, "Retype new password: ") +MAKE_PSTR(password_prompt, "Password: ") +MAKE_PSTR(unset, "") + +// more common names that don't need translations +MAKE_PSTR_LIST(1x3min, F("1x3min")) +MAKE_PSTR_LIST(2x3min, F("2x3min")) +MAKE_PSTR_LIST(3x3min, F("3x3min")) +MAKE_PSTR_LIST(4x3min, F("4x3min")) +MAKE_PSTR_LIST(5x3min, F("5x3min")) +MAKE_PSTR_LIST(6x3min, F("6x3min")) +MAKE_PSTR_LIST(auto, F("auto")) +MAKE_PSTR_LIST(na, F("n/a")) +MAKE_PSTR_LIST(rc3x, F("rc3x")) +MAKE_PSTR_LIST(rc20, F("rc20")) +MAKE_PSTR_LIST(fb10, F("fb10")) +MAKE_PSTR_LIST(fb100, F("fb100")) +MAKE_PSTR_LIST(dash, F("-")) +MAKE_PSTR_LIST(error, F("error")) +MAKE_PSTR_LIST(BLANK, F("")) +MAKE_PSTR_LIST(pwm, F("pwm")) +MAKE_PSTR_LIST(pwm_invers, F("pwm inverse")) +MAKE_PSTR_LIST(mpc, F("mpc")) +MAKE_PSTR_LIST(tempauto, F("temp auto")) +MAKE_PSTR_LIST(bypass, F("bypass")) +MAKE_PSTR_LIST(mixer, F("mixer")) +MAKE_PSTR_LIST(monovalent, F("monovalent")) +MAKE_PSTR_LIST(bivalent, F("bivalent")) +MAKE_PSTR_LIST(n_o, F("n_o")) +MAKE_PSTR_LIST(n_c, F("n_c")) +MAKE_PSTR_LIST(prog1, F("prog 1")) +MAKE_PSTR_LIST(prog2, F("prog 2")) +MAKE_PSTR_LIST(proga, F("prog a")) +MAKE_PSTR_LIST(progb, F("prog b")) +MAKE_PSTR_LIST(progc, F("prog c")) +MAKE_PSTR_LIST(progd, F("prog d")) +MAKE_PSTR_LIST(proge, F("prog e")) +MAKE_PSTR_LIST(progf, F("prog f")) + +// templates - this are not translated and will be saved under optons_single +MAKE_PSTR_LIST(tpl_datetime, F("Format: < NTP | dd.mm.yyyy-hh:mm:ss-day(0-6)-dst(0/1) >")) +MAKE_PSTR_LIST(tpl_switchtime, F("Format: [ not_set | day hh:mm on|off ]")) +MAKE_PSTR_LIST(tpl_switchtime1, F("Format: [ not_set | day hh:mm Tn ]")) +MAKE_PSTR_LIST(tpl_holidays, F("Format: < dd.mm.yyyy-dd.mm.yyyy >")) +MAKE_PSTR_LIST(tpl_date, F("Format: < dd.mm.yyyy >")) + +// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp +// These don't need translating, it will mess up HA and the API +MAKE_PSTR(uom_blank, " ") +MAKE_PSTR(uom_percent, "%") +MAKE_PSTR(uom_degrees, "°C") +MAKE_PSTR(uom_hours, "hours") +MAKE_PSTR(uom_minutes, "minutes") +MAKE_PSTR(uom_seconds, "seconds") +MAKE_PSTR(uom_kwh, "kWh") +MAKE_PSTR(uom_wh, "Wh") +MAKE_PSTR(uom_bar, "bar") +MAKE_PSTR(uom_ua, "uA") +MAKE_PSTR(uom_lmin, "l/min") +MAKE_PSTR(uom_kw, "kW") +MAKE_PSTR(uom_w, "W") +MAKE_PSTR(uom_kb, "KB") +MAKE_PSTR(uom_dbm, "dBm") +MAKE_PSTR(uom_fahrenheit, "°F") +MAKE_PSTR(uom_mv, "mV") +MAKE_PSTR(uom_sqm, "sqm") +MAKE_PSTR(uom_m3, "m3") +MAKE_PSTR(uom_l, "l") + +// commands +MAKE_PSTR(info_cmd, "lists all values") +MAKE_PSTR(commands_cmd, "lists all commands") +MAKE_PSTR(entities_cmd, "lists all entities") + +// TAG mapping - maps to DeviceValueTAG_s in emsdevice.cpp +// use empty string if want to suppress showing tags +// mqtt tags must not have spaces +MAKE_PSTR(tag_none, "") +MAKE_PSTR(tag_heartbeat, "") +MAKE_PSTR(tag_boiler_data_ww, "dhw") +MAKE_PSTR(tag_device_data, "") +MAKE_PSTR(tag_device_data_ww, "dhw") +MAKE_PSTR(tag_hc1, "hc1") +MAKE_PSTR(tag_hc2, "hc2") +MAKE_PSTR(tag_hc3, "hc3") +MAKE_PSTR(tag_hc4, "hc4") +MAKE_PSTR(tag_hc5, "hc5") +MAKE_PSTR(tag_hc6, "hc6") +MAKE_PSTR(tag_hc7, "hc7") +MAKE_PSTR(tag_hc8, "hc8") +MAKE_PSTR(tag_wwc1, "wwc1") +MAKE_PSTR(tag_wwc2, "wwc2") +MAKE_PSTR(tag_wwc3, "wwc3") +MAKE_PSTR(tag_wwc4, "wwc4") +MAKE_PSTR(tag_wwc5, "wwc5") +MAKE_PSTR(tag_wwc6, "wwc6") +MAKE_PSTR(tag_wwc7, "wwc7") +MAKE_PSTR(tag_wwc8, "wwc8") +MAKE_PSTR(tag_wwc9, "wwc9") +MAKE_PSTR(tag_wwc10, "wwc10") +MAKE_PSTR(tag_ahs, "ahs") +MAKE_PSTR(tag_hs1, "hs1") +MAKE_PSTR(tag_hs2, "hs2") +MAKE_PSTR(tag_hs3, "hs3") +MAKE_PSTR(tag_hs4, "hs4") +MAKE_PSTR(tag_hs5, "hs5") +MAKE_PSTR(tag_hs6, "hs6") +MAKE_PSTR(tag_hs7, "hs7") +MAKE_PSTR(tag_hs8, "hs8") +MAKE_PSTR(tag_hs9, "hs9") +MAKE_PSTR(tag_hs10, "hs10") +MAKE_PSTR(tag_hs11, "hs11") +MAKE_PSTR(tag_hs12, "hs12") +MAKE_PSTR(tag_hs13, "hs13") +MAKE_PSTR(tag_hs14, "hs14") +MAKE_PSTR(tag_hs15, "hs15") +MAKE_PSTR(tag_hs16, "hs16") + +// MQTT topics and prefixes +MAKE_PSTR(heating_active, "heating_active") +MAKE_PSTR(tapwater_active, "tapwater_active") +MAKE_PSTR(response, "response") +MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww") +MAKE_PSTR(tag_device_data_ww_mqtt, "") + +MAKE_PSTR_LIST(climate, F("HA climate config creation")) + +// syslog +MAKE_PSTR_LIST(list_syslog_level, F("off"), F("emerg"), F("alert"), F("crit"), F("error"), F("warn"), F("notice"), F("info"), F("debug"), F("trace"), F("all")) + +// sensors +MAKE_PSTR_LIST(list_sensortype, F("none"), F("digital in"), F("counter"), F("adc"), F("timer"), F("rate"), F("digital out"), F("pwm 0"), F("pwm 1"), F("pwm 2")) + +// watch +MAKE_PSTR_LIST(list_watch, F("off"), F("on"), F("raw"), F("unknown")) + +/* + * The rest below are Enums and generated from translations lists + */ + +MAKE_PSTR_ENUM(enum_cylprio, FL_(cyl1), FL_(cyl2)) +MAKE_PSTR_ENUM(enum_progMode, FL_(prog1), FL_(prog2)) +MAKE_PSTR_ENUM(enum_progMode4, FL_(proga), FL_(progb), FL_(progc), FL_(progd), FL_(proge), FL_(progf)) +MAKE_PSTR_ENUM(enum_climate, FL_(seltemp), FL_(roomtemp)) +MAKE_PSTR_ENUM(enum_charge, FL_(chargepump), FL_(3wayvalve)) +MAKE_PSTR_ENUM(enum_freq, FL_(off), FL_(1x3min), FL_(2x3min), FL_(3x3min), FL_(4x3min), FL_(5x3min), FL_(6x3min), FL_(continuous)) +MAKE_PSTR_ENUM(enum_off_time_date_manual, FL_(off), FL_(time), FL_(date), FL_(manual)) +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)) + +// thermostat lists +MAKE_PSTR_ENUM(enum_ibaMainDisplay, + FL_(internal_temperature), + FL_(internal_setpoint), + FL_(external_temperature), + FL_(burner_temperature), + FL_(ww_temperature), + FL_(functioning_mode), + FL_(time), + FL_(date), + FL_(smoke_temperature)) +MAKE_PSTR_ENUM(enum_ibaLanguage, FL_(german), FL_(dutch), FL_(french), FL_(italian)) +MAKE_PSTR_ENUM(enum_ibaLanguage_RC30, FL_(german), FL_(dutch)) +MAKE_PSTR_ENUM(enum_floordrystatus, FL_(off), FL_(start), FL_(heat), FL_(hold), FL_(cool), FL_(end)) +MAKE_PSTR_ENUM(enum_ibaBuildingType, FL_(light), FL_(medium), FL_(heavy)) +MAKE_PSTR_ENUM(enum_PID, FL_(fast), FL_(medium), FL_(slow)) +MAKE_PSTR_ENUM(enum_wwMode, FL_(off), FL_(normal), FL_(comfort), FL_(auto), FL_(own_prog), FL_(eco)) +MAKE_PSTR_ENUM(enum_wwCircMode, FL_(off), FL_(on), FL_(auto), FL_(own_prog)) +MAKE_PSTR_ENUM(enum_wwMode2, FL_(off), FL_(on), FL_(auto)) +MAKE_PSTR_ENUM(enum_wwMode3, FL_(on), FL_(off), FL_(auto)) +MAKE_PSTR_ENUM(enum_heatingtype, FL_(off), FL_(radiator), FL_(convector), FL_(floor)) +MAKE_PSTR_ENUM(enum_summermode, FL_(summer), FL_(auto), FL_(winter)) +MAKE_PSTR_ENUM(enum_hpoperatingmode, FL_(off), FL_(auto), FL_(heating), FL_(cooling)) +MAKE_PSTR_ENUM(enum_summer, FL_(winter), FL_(summer)) +MAKE_PSTR_ENUM(enum_operatingstate, FL_(heating), FL_(off), FL_(cooling)) + +MAKE_PSTR_ENUM(enum_mode, FL_(manual), FL_(auto)) // RC100, RC300, RC310 +MAKE_PSTR_ENUM(enum_mode2, FL_(off), FL_(manual), FL_(auto)) // RC20 +MAKE_PSTR_ENUM(enum_mode3, FL_(night), FL_(day), FL_(auto)) // RC35, RC30, RC25 +MAKE_PSTR_ENUM(enum_mode4, FL_(nofrost), FL_(eco), FL_(heat), FL_(auto)) // JUNKERS +MAKE_PSTR_ENUM(enum_mode5, FL_(auto), FL_(off)) // CRF +MAKE_PSTR_ENUM(enum_mode6, FL_(nofrost), FL_(night), FL_(day)) // RC10 + +MAKE_PSTR_ENUM(enum_modetype, FL_(eco), FL_(comfort)) +MAKE_PSTR_ENUM(enum_modetype3, FL_(night), FL_(day)) +MAKE_PSTR_ENUM(enum_modetype4, FL_(nofrost), FL_(eco), FL_(heat)) +MAKE_PSTR_ENUM(enum_modetype5, FL_(off), FL_(on)) + +MAKE_PSTR_ENUM(enum_reducemode, FL_(nofrost), FL_(reduce), FL_(room), FL_(outdoor)) +MAKE_PSTR_ENUM(enum_reducemode1, FL_(outdoor), FL_(room), FL_(reduce)) // RC310 values: 1-3 +MAKE_PSTR_ENUM(enum_nofrostmode, FL_(off), FL_(room), FL_(outdoor)) +MAKE_PSTR_ENUM(enum_nofrostmode1, FL_(room), FL_(outdoor), FL_(room_outdoor)) + +MAKE_PSTR_ENUM(enum_controlmode, FL_(off), FL_(optimized), FL_(simple), FL_(mpc), FL_(room), FL_(power), FL_(constant)) +MAKE_PSTR_ENUM(enum_controlmode1, FL_(weather_compensated), FL_(outside_basepoint), FL_(na), FL_(room)) // RC310 1-4 +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_switchmode, FL_(off), FL_(eco), FL_(comfort), FL_(heat)) + +MAKE_PSTR_ENUM(enum_dayOfWeek, FL_(day_mo), FL_(day_tu), FL_(day_we), FL_(day_th), FL_(day_fr), FL_(day_sa), FL_(day_su), FL_(all)) +MAKE_PSTR_ENUM(enum_progMode2, FL_(own_1), FL_(family), FL_(morning), FL_(evening), FL_(am), FL_(pm), FL_(midday), FL_(singles), FL_(seniors), FL_(new), FL_(own_2)) +MAKE_PSTR_ENUM(enum_progMode3, FL_(family), FL_(morning), FL_(evening), FL_(am), FL_(pm), FL_(midday), FL_(singles), FL_(seniors)) +MAKE_PSTR_ENUM(enum_hybridStrategy, FL_(co2_optimized), FL_(cost_optimized), FL_(outside_temp_switched), FL_(co2_cost_mix)) + +// heat pump +MAKE_PSTR_ENUM(enum_hpactivity, FL_(none), FL_(heating), FL_(cooling), FL_(hot_water), FL_(pool)) + +// solar +MAKE_PSTR_ENUM(enum_solarmode, FL_(constant), FL_(pwm), FL_(analog)) +MAKE_PSTR_ENUM(enum_collectortype, FL_(flat), FL_(vacuum)) +MAKE_PSTR_ENUM(enum_wwStatus2, FL_(BLANK), FL_(BLANK), FL_(BLANK), FL_(no_heat), FL_(BLANK), FL_(BLANK), FL_(heatrequest), FL_(BLANK), FL_(disinfecting), FL_(hold)) + +// mixer +MAKE_PSTR_ENUM(enum_shunt, FL_(stopped), FL_(opening), FL_(closing), FL_(open), FL_(close)) +MAKE_PSTR_ENUM(enum_wwProgMode, FL_(std_prog), FL_(own_prog)) + +// AM200 lists +MAKE_PSTR_ENUM(enum_vr2Config, FL_(off), FL_(bypass)) +MAKE_PSTR_ENUM(enum_aPumpSignal, FL_(off), FL_(pwm), FL_(pwm_invers)) +MAKE_PSTR_ENUM(enum_bufBypass, FL_(no), FL_(mixer), FL_(valve)) +MAKE_PSTR_ENUM(enum_blockMode, FL_(off), FL_(auto), FL_(blocking)) +MAKE_PSTR_ENUM(enum_bufConfig, FL_(monovalent), FL_(bivalent)) +MAKE_PSTR_ENUM(enum_blockTerm, FL_(n_o), FL_(n_c)) + +#pragma GCC diagnostic pop diff --git a/src/locale_translations.h b/src/locale_translations.h new file mode 100644 index 000000000..e230f3d67 --- /dev/null +++ b/src/locale_translations.h @@ -0,0 +1,588 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#pragma once + +// Define languages here +// Makes sure they are also added in same order to languages[] in system.cpp +#define EMSESP_LOCALE_EN "en" +#define EMSESP_LOCALE_DE "de" + +// translations are in order en, de +// if there is no translation, it will default to en + +// General +MAKE_PSTR_LIST(on, F("on"), F("an")) +MAKE_PSTR_LIST(off, F("off"), F("aus")) +MAKE_PSTR_LIST(ON, F("ON"), F("AN")) +MAKE_PSTR_LIST(OFF, F("OFF"), F("AUS")) + +// Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp +// uom - also used with HA see https://github.com/home-assistant/core/blob/d7ac4bd65379e11461c7ce0893d3533d8d8b8cbf/homeassistant/const.py#L384 +MAKE_PSTR_LIST(minutes, F("minutes"), F("Minuten")) +MAKE_PSTR_LIST(hours, F("hours"), F("Stunden")) +MAKE_PSTR_LIST(days, F("days"), F("Tage")) +MAKE_PSTR_LIST(seconds, F("seconds"), F("Sekunden")) + +// general +MAKE_PSTR_LIST(day_mo, F("mo"), F("Mo")) +MAKE_PSTR_LIST(day_tu, F("tu"), F("Di")) +MAKE_PSTR_LIST(day_we, F("we"), F("Mi")) +MAKE_PSTR_LIST(day_th, F("th"), F("Do")) +MAKE_PSTR_LIST(day_fr, F("fr"), F("Fr")) +MAKE_PSTR_LIST(day_sa, F("sa"), F("Sa")) +MAKE_PSTR_LIST(day_su, F("su"), F("So")) +MAKE_PSTR_LIST(all, F("all"), F("Alle")) +MAKE_PSTR_LIST(own_1, F("own 1"), F("Eigen 1")) +MAKE_PSTR_LIST(family, F("family"), F("Familie")) +MAKE_PSTR_LIST(morning, F("morning"), F("Morgends")) +MAKE_PSTR_LIST(evening, F("evening"), F("Abends")) +MAKE_PSTR_LIST(seniors, F("seniors"), F("Senioren")) +MAKE_PSTR_LIST(no, F("no"), F("nein")) +MAKE_PSTR_LIST(new, F("new"), F("Neu")) +MAKE_PSTR_LIST(own_2, F("own 2"), F("Eigen 2")) +MAKE_PSTR_LIST(singles, F("singles"), F("Singles")) +MAKE_PSTR_LIST(am, F("am"), F("Vormittag")) +MAKE_PSTR_LIST(pm, F("pm"), F("Nachmittag")) +MAKE_PSTR_LIST(midday, F("midday"), F("Mittag")) +MAKE_PSTR_LIST(unknown, F("unknown"), F("Unbekannt")) +MAKE_PSTR_LIST(flat, F("flat"), F("flach")) +MAKE_PSTR_LIST(vacuum, F("vacuum"), F("vakuum")) +MAKE_PSTR_LIST(co2_optimized, F("co2 optimized"), F("CO2 optimiert")) +MAKE_PSTR_LIST(cost_optimized, F("cost optimized"), F("kostenoptimiert")) +MAKE_PSTR_LIST(outside_temp_switched, F("outside temp switched"), F("Außentemp geschaltet")) +MAKE_PSTR_LIST(co2_cost_mix, F("co2 cost mix"), F("Kostenmix")) +MAKE_PSTR_LIST(analog, F("analog"), F("analog")) +MAKE_PSTR_LIST(normal, F("normal"), F("normal")) +MAKE_PSTR_LIST(blocking, F("blocking"), F("Blockierung")) + +// boiler +MAKE_PSTR_LIST(time, F("time"), F("Zeit")) +MAKE_PSTR_LIST(date, F("date"), F("Datum")) +MAKE_PSTR_LIST(continuous, F("continuous"), F("kontinuierlich")) +MAKE_PSTR_LIST(3wayvalve, F("3-way valve"), F("3-Wege Ventil")) +MAKE_PSTR_LIST(chargepump, F("chargepump"), F("Ladepumpe")) +MAKE_PSTR_LIST(hot, F("hot"), F("Heiss")) +MAKE_PSTR_LIST(high_comfort, F("high comfort"), F("Heiss Komfort")) +MAKE_PSTR_LIST(eco, F("eco"), F("Eco")) +MAKE_PSTR_LIST(intelligent, F("intelligent"), F("Intellgent")) +MAKE_PSTR_LIST(flow, F("flow"), F("Fluss")) +MAKE_PSTR_LIST(manual, F("manual"), F("Manuell")) +MAKE_PSTR_LIST(buffer, F("buffer"), F("Speicher")) +MAKE_PSTR_LIST(bufferedflow, F("buffered flow"), F("Durchlaufspeicher")) +MAKE_PSTR_LIST(layeredbuffer, F("layered buffer"), F("Schichtspeicher")) +MAKE_PSTR_LIST(maintenance, F("maintenance"), F("Wartung")) +MAKE_PSTR_LIST(heating, F("heating"), F("Heizen")) +MAKE_PSTR_LIST(cooling, F("cooling"), F("K�hlen")) +MAKE_PSTR_LIST(disinfecting, F("disinfecting"), F("desinfizieren")) +MAKE_PSTR_LIST(no_heat, F("no heat"), F("keine Hitze")) +MAKE_PSTR_LIST(heatrequest, F("heat request"), F("Wärmeanforderung")) +MAKE_PSTR_LIST(valve, F("valve"), F("Ventil")) + +// heatpump +MAKE_PSTR_LIST(none, F("none"), F("keiner")) +MAKE_PSTR_LIST(hot_water, F("hot water"), F("heißes Wasser")) +MAKE_PSTR_LIST(pool, F("pool"), F("Schwimmbad")) + +// thermostat +MAKE_PSTR_LIST(seltemp, F("selTemp"), F("Solltemperature")) +MAKE_PSTR_LIST(roomtemp, F("roomTemp"), F("Raumtemperatur")) +MAKE_PSTR_LIST(own_prog, F("own prog"), F("Eigenprog")) +MAKE_PSTR_LIST(std_prog, F("std prog"), F("Standardprog")) +MAKE_PSTR_LIST(light, F("light"), F("Leicht")) +MAKE_PSTR_LIST(medium, F("medium"), F("Mittel")) +MAKE_PSTR_LIST(heavy, F("heavy"), F("Schwer")) +MAKE_PSTR_LIST(start, F("start"), F("Start")) +MAKE_PSTR_LIST(heat, F("heat"), F("Heizen")) +MAKE_PSTR_LIST(hold, F("hold"), F("Halten")) +MAKE_PSTR_LIST(cool, F("cool"), F("Kühl")) +MAKE_PSTR_LIST(end, F("end"), F("Ende")) +MAKE_PSTR_LIST(german, F("german"), F("Deutsch")) +MAKE_PSTR_LIST(dutch, F("dutch"), F("Niederländisch")) +MAKE_PSTR_LIST(french, F("french"), F("Französisch")) +MAKE_PSTR_LIST(italian, F("italian"), F("Italienisch")) +MAKE_PSTR_LIST(high, F("high"), F("hoch")) +MAKE_PSTR_LIST(low, F("low"), F("niedrig")) +MAKE_PSTR_LIST(radiator, F("radiator"), F("Heizkörper")) +MAKE_PSTR_LIST(convector, F("convector"), F("Konvektor")) +MAKE_PSTR_LIST(floor, F("floor"), F("Fussboden")) +MAKE_PSTR_LIST(summer, F("summer"), F("Sommer")) +MAKE_PSTR_LIST(winter, F("winter"), F("Winter")) +MAKE_PSTR_LIST(outdoor, F("outdoor"), F("Aussentemperatur")) +MAKE_PSTR_LIST(room, F("room"), F("Raum")) +MAKE_PSTR_LIST(room_outdoor, F("room outdoor"), F("Raum+Au�en")) +MAKE_PSTR_LIST(power, F("power"), F("Leistung")) +MAKE_PSTR_LIST(constant, F("constant"), F("konstant")) +MAKE_PSTR_LIST(simple, F("simple"), F("einfach")) +MAKE_PSTR_LIST(optimized, F("optimized"), F("optimiert")) +MAKE_PSTR_LIST(nofrost, F("nofrost"), F("Frostschutz")) +MAKE_PSTR_LIST(comfort, F("comfort"), F("Komfort")) +MAKE_PSTR_LIST(night, F("night"), F("Nacht")) +MAKE_PSTR_LIST(day, F("day"), F("Tag")) +MAKE_PSTR_LIST(holiday, F("holiday"), F("Urlaub")) +MAKE_PSTR_LIST(reduce, F("reduce"), F("reduziert")) +MAKE_PSTR_LIST(noreduce, F("no reduce"), F("unreduziert")) +MAKE_PSTR_LIST(offset, F("offset"), F("Anhebung")) +MAKE_PSTR_LIST(design, F("design"), F("Auslegung")) +MAKE_PSTR_LIST(minflow, F("min flow"), F("minfluss")) +MAKE_PSTR_LIST(maxflow, F("max flow"), F("maxfluss")) +MAKE_PSTR_LIST(fast, F("fast"), F("schnell")) +MAKE_PSTR_LIST(slow, F("slow"), F("langsam")) +MAKE_PSTR_LIST(internal_temperature, F("internal temperature"), F("Interne Temperatur")) +MAKE_PSTR_LIST(internal_setpoint, F("internal setpoint"), F("Interner Sollwert")) +MAKE_PSTR_LIST(external_temperature, F("external temperature"), F("Externe Temperatur")) +MAKE_PSTR_LIST(burner_temperature, F("burner temperature"), F("Kesseltemperatur")) +MAKE_PSTR_LIST(ww_temperature, F("ww temperature"), F("Wassertemperatur")) +MAKE_PSTR_LIST(smoke_temperature, F("smoke temperature"), F("Abgastemperatur")) +MAKE_PSTR_LIST(weather_compensated, F("weather compensated"), F("Wetter kompensiert")) +MAKE_PSTR_LIST(outside_basepoint, F("outside basepoint"), F("außerhalb des Basispunktes")) +MAKE_PSTR_LIST(functioning_mode, F("functioning mode"), F("Funktionsweise")) + +// mixer +MAKE_PSTR_LIST(stopped, F("stopped"), F("gestoppt")) +MAKE_PSTR_LIST(opening, F("opening"), F("öffnen")) +MAKE_PSTR_LIST(closing, F("closing"), F("schließen")) +MAKE_PSTR_LIST(open, F("open"), F("Offen")) +MAKE_PSTR_LIST(close, F("close"), F("Geschlossen")) + +// Boiler +MAKE_PSTR_LIST(wwtapactivated, F("wwtapactivated"), F("turn on/off"), F("Aktiviere Warmwasser im Wartungsmodus")) +MAKE_PSTR_LIST(reset, F("reset"), F("Reset")) +MAKE_PSTR_LIST(oilPreHeat, F("oilpreheat"), F("oil preheating"), F("Ölvorwärmung")) +MAKE_PSTR_LIST(heatingActive, F("heatingactive"), F("heating active"), F("Heizung aktiv")) +MAKE_PSTR_LIST(tapwaterActive, F("tapwateractive"), F("tapwater active"), F("Warmwasser aktiv")) +MAKE_PSTR_LIST(selFlowTemp, F("selflowtemp"), F("selected flow temperature"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(selBurnPow, F("selburnpow"), F("burner selected max power"), F("Sollwert Brennerleistung")) +MAKE_PSTR_LIST(heatingPumpMod, F("heatingpumpmod"), F("heating pump modulation"), F("Heizungspumpe 1 Modulation")) +MAKE_PSTR_LIST(heatingPump2Mod, F("heatingpump2mod"), F("heating pump 2 modulation"), F("Heizungspumpe 2 Modulation")) +MAKE_PSTR_LIST(outdoorTemp, F("outdoortemp"), F("outside temperature"), F("Aussentemperatur")) +MAKE_PSTR_LIST(curFlowTemp, F("curflowtemp"), F("current flow temperature"), F("aktuelle Flusstemperatur")) +MAKE_PSTR_LIST(retTemp, F("rettemp"), F("return temperature"), F("Rücklauftemperatur")) +MAKE_PSTR_LIST(switchTemp, F("switchtemp"), F("mixing switch temperature"), F("Mischer Schalttemperatur")) +MAKE_PSTR_LIST(sysPress, F("syspress"), F("system pressure"), F("Systemdruck")) +MAKE_PSTR_LIST(boilTemp, F("boiltemp"), F("actual boiler temperature"), F("Kesseltemperatur")) +MAKE_PSTR_LIST(exhaustTemp, F("exhausttemp"), F("exhaust temperature"), F("Auslasstemperatur")) +MAKE_PSTR_LIST(burnGas, F("burngas"), F("gas"), F("Gas")) +MAKE_PSTR_LIST(burnGas2, F("burngas2"), F("gas stage 2"), F("Gas Stufe 2")) +MAKE_PSTR_LIST(flameCurr, F("flamecurr"), F("flame current"), F("Flammstrom")) +MAKE_PSTR_LIST(heatingPump, F("heatingpump"), F("heating pump"), F("Heizungspumpe")) +MAKE_PSTR_LIST(fanWork, F("fanwork"), F("fan"), F("Gebläse")) +MAKE_PSTR_LIST(ignWork, F("ignwork"), F("ignition"), F("Zündung")) +MAKE_PSTR_LIST(heatingActivated, F("heatingactivated"), F("heating activated"), F("Heizen aktiviert")) +MAKE_PSTR_LIST(heatingTemp, F("heatingtemp"), F("heating temperature"), F("Kesseltemperatur")) +MAKE_PSTR_LIST(pumpModMax, F("pumpmodmax"), F("burner pump max power"), F("Kesselpumpen Maximalleistung")) +MAKE_PSTR_LIST(pumpModMin, F("pumpmodmin"), F("burner pump min power"), F("Kesselpumpen Minmalleistung")) +MAKE_PSTR_LIST(pumpDelay, F("pumpdelay"), F("pump delay"), F("Pumpennachlauf")) +MAKE_PSTR_LIST(burnMinPeriod, F("burnminperiod"), F("burner min period"), F("Antipendelzeit")) +MAKE_PSTR_LIST(burnMinPower, F("burnminpower"), F("burner min power"), F("minimale Brennerleistung")) +MAKE_PSTR_LIST(burnMaxPower, F("burnmaxpower"), F("burner max power"), F("maximale Brennerleistung")) +MAKE_PSTR_LIST(boilHystOn, F("boilhyston"), F("hysteresis on temperature"), F("Hysterese ein temperatur")) +MAKE_PSTR_LIST(boilHystOff, F("boilhystoff"), F("hysteresis off temperature"), F("Hysterese aus temperatur")) +MAKE_PSTR_LIST(setFlowTemp, F("setflowtemp"), F("set flow temperature"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(setBurnPow, F("setburnpow"), F("burner set power"), F("Sollwert Brennerleistung")) +MAKE_PSTR_LIST(curBurnPow, F("curburnpow"), F("burner current power"), F("Brennerleistung")) +MAKE_PSTR_LIST(burnStarts, F("burnstarts"), F("burner starts"), F("Brenner # starts")) +MAKE_PSTR_LIST(burnWorkMin, F("burnworkmin"), F("total burner operating time"), F("Brenner Laufzeit")) +MAKE_PSTR_LIST(burn2WorkMin, F("burn2workmin"), F("burner stage 2 operating time"), F("Brenner Stufe 2 Laufzeit")) +MAKE_PSTR_LIST(heatWorkMin, F("heatworkmin"), F("total heat operating time"), F("Heizung Laufzeit")) +MAKE_PSTR_LIST(UBAuptime, F("ubauptime"), F("total UBA operating time"), F("gesamte Laufzeit")) +MAKE_PSTR_LIST(lastCode, F("lastcode"), F("last error code"), F("Fehlerspeicher")) +MAKE_PSTR_LIST(serviceCode, F("servicecode"), F("service code"), F("Statusmeldung")) +MAKE_PSTR_LIST(serviceCodeNumber, F("servicecodenumber"), F("service code number"), F("Statusmeldungsnummer")) +MAKE_PSTR_LIST(maintenanceMessage, F("maintenancemessage"), F("maintenance message"), F("Wartungsmeldung")) +MAKE_PSTR_LIST(maintenanceDate, F("maintenancedate"), F("next maintenance date"), F("Wartungsdatum")) +MAKE_PSTR_LIST(maintenanceType, F("maintenance"), F("maintenance scheduled"), F("Wartungsplan")) +MAKE_PSTR_LIST(maintenanceTime, F("maintenancetime"), F("time to next maintenance"), F("Wartung in")) +MAKE_PSTR_LIST(emergencyOps, F("emergencyops"), F("emergency operation"), F("Notoperation")) +MAKE_PSTR_LIST(emergencyTemp, F("emergencytemp"), F("emergency temperature"), F("Nottemperatur")) + +// heatpump/compress specific +MAKE_PSTR_LIST(upTimeControl, F("uptimecontrol"), F("total operating time heat"), F("Betriebszeit total heizen")) +MAKE_PSTR_LIST(upTimeCompHeating, F("uptimecompheating"), F("operating time compressor heating"), F("Betriebszeit Kompressor heizen")) +MAKE_PSTR_LIST(upTimeCompCooling, F("uptimecompcooling"), F("operating time compressor cooling"), F("Betriebszeit Kompressor kühlen")) +MAKE_PSTR_LIST(upTimeCompWw, F("uptimecompww"), F("operating time compressor dhw"), F("Betriebszeit Kompressor")) +MAKE_PSTR_LIST(upTimeCompPool, F("uptimecomppool"), F("operating time compressor pool"), F("Betriebszeit Kompressor Pool")) +MAKE_PSTR_LIST(totalCompStarts, F("totalcompstarts"), F("total compressor control starts"), F("gesamt Kompressor Starts")) +MAKE_PSTR_LIST(heatingStarts, F("heatingstarts"), F("heating control starts"), F("Heizen Starts")) +MAKE_PSTR_LIST(coolingStarts, F("coolingstarts"), F("cooling control starts"), F("Kühlen Starts")) +MAKE_PSTR_LIST(poolStarts, F("poolstarts"), F("pool control starts"), F("Pool Starts")) +MAKE_PSTR_LIST(nrgConsTotal, F("nrgconstotal"), F("total energy consumption"), F("totaler Energieverbrauch"), F("totaler Energieverbrauch")) +MAKE_PSTR_LIST(nrgConsCompTotal, F("nrgconscomptotal"), F("total energy consumption compressor"), F("Energieverbrauch Kompressor total")) +MAKE_PSTR_LIST(nrgConsCompHeating, F("nrgconscompheating"), F("energy consumption compressor heating"), F("Energieverbrauch Kompressor heizen")) +MAKE_PSTR_LIST(nrgConsCompWw, F("nrgconscompww"), F("energy consumption compressor dhw"), F("Energieverbrauch Kompressor")) +MAKE_PSTR_LIST(nrgConsCompCooling, F("nrgconscompcooling"), F("energy consumption compressor cooling"), F("Energieverbrauch Kompressor kühlen")) +MAKE_PSTR_LIST(nrgConsCompPool, F("nrgconscomppool"), F("energy consumption compressor pool"), F("Energieverbrauch Kompressor Pool")) +MAKE_PSTR_LIST(nrgSuppTotal, F("nrgsupptotal"), F("total energy supplied"), F("gesamte Energieabgabe")) +MAKE_PSTR_LIST(nrgSuppHeating, F("nrgsuppheating"), F("total energy supplied heating"), F("gesamte Energieabgabe heizen")) +MAKE_PSTR_LIST(nrgSuppWw, F("nrgsuppww"), F("total energy warm supplied dhw"), F("gesamte Energieabgabe")) +MAKE_PSTR_LIST(nrgSuppCooling, F("nrgsuppcooling"), F("total energy supplied cooling"), F("gesamte Energieabgabe kühlen")) +MAKE_PSTR_LIST(nrgSuppPool, F("nrgsupppool"), F("total energy supplied pool"), F("gesamte Energieabgabe Pool")) +MAKE_PSTR_LIST(auxElecHeatNrgConsTotal, + F("auxelecheatnrgconstotal"), + F("total auxiliary electrical heater energy consumption"), + F("Energieverbrauch el. Zusatzheizung")) +MAKE_PSTR_LIST(auxElecHeatNrgConsHeating, + F("auxelecheatnrgconsheating"), + F("auxiliary electrical heater energy consumption heating"), + F("Energieverbrauch el. Zusatzheizung Heizen")) +MAKE_PSTR_LIST(auxElecHeatNrgConsWW, F("auxelecheatnrgconsww"), F("auxiliary electrical heater energy consumption dhw"), F("Energieverbrauch el. Zusatzheizung")) +MAKE_PSTR_LIST(auxElecHeatNrgConsPool, + F("auxelecheatnrgconspool"), + F("auxiliary electrical heater energy consumption pool"), + F("Energieverbrauch el. Zusatzheizung Pool")) + +MAKE_PSTR_LIST(hpCompOn, F("hpcompon"), F("hp compressor"), F("HP Compressor")) // need DE +MAKE_PSTR_LIST(hpHeatingOn, F("hpheatingon"), F("hp heating"), F("HP Heating")) // need DE +MAKE_PSTR_LIST(hpCoolingOn, F("hpcoolingon"), F("hp cooling"), F("HP Cooling")) // need DE +MAKE_PSTR_LIST(hpWwOn, F("hpwwon"), F("hp dhw"), F("HP dhw")) // need DE +MAKE_PSTR_LIST(hpPoolOn, F("hppoolon"), F("hp pool"), F("HP Pool")) // need DE +MAKE_PSTR_LIST(hpBrinePumpSpd, F("hpbrinepumpspd"), F("brine pump speed"), F("Brine Pump Speed")) // need DE +MAKE_PSTR_LIST(hpCompSpd, F("hpcompspd"), F("compressor speed"), F("Compressor Speed")) // need DE +MAKE_PSTR_LIST(hpCircSpd, F("hpcircspd"), F("circulation pump speed"), F("Circulation pump Speed")) // need DE +MAKE_PSTR_LIST(hpBrineIn, F("hpbrinein"), F("brine in/evaporator"), F("Brine in/Evaporator")) // need DE +MAKE_PSTR_LIST(hpBrineOut, F("hpbrineout"), F("brine out/condenser"), F("Brine out/Condenser")) // need DE +MAKE_PSTR_LIST(hpSuctionGas, F("hpsuctiongas"), F("suction gas"), F("Suction gas")) // need DE +MAKE_PSTR_LIST(hpHotGas, F("hphotgas"), F("hot gas/compressed"), F("Hot gas/Compressed")) // need DE +MAKE_PSTR_LIST(hpSwitchValve, F("hpswitchvalve"), F("switch valve"), F("Switch Valve")) // need DE +MAKE_PSTR_LIST(hpActivity, F("hpactivity"), F("compressor activity"), F("Compressor Activity")) // need DE + +MAKE_PSTR_LIST(hpPower, F("hppower"), F("compressor power output"), F("Leistung Wärmepumpe")) +MAKE_PSTR_LIST(hpTc0, F("hptc0"), F("heat carrier return (TC0)"), F("Wärmeträgerflüssigkeit Eingang (TC0)")) +MAKE_PSTR_LIST(hpTc1, F("hptc1"), F("heat carrier forward (TC1)"), F("Wärmeträgerflüssigkeit Ausgang (TC1)")) +MAKE_PSTR_LIST(hpTc3, F("hptc3"), F("condenser temperature (TC3)"), F("Verflüssigertemperatur (TC3)")) +MAKE_PSTR_LIST(hpTr3, F("hptr3"), F("refrigerant temperature liquid side (condenser output) (TR3)"), F("Temperaturfühler Kältemittel (Flüssigkeit) (TR3)")) +MAKE_PSTR_LIST(hpTr4, F("hptr4"), F("evaporator inlet temperature (TR4)"), F("Verdampfer Eintritt (TR4)")) +MAKE_PSTR_LIST(hpTr5, F("hptr5"), F("compressor Inlet temperature (TR5)"), F("Temperaturfühler Kompessoransaugleitung (TR5)")) +MAKE_PSTR_LIST(hpTr6, F("hptr6"), F("compressor outlet temperature (TR6)"), F("Temperaturfühler Kompressorausgangsleitung (TR6)")) +MAKE_PSTR_LIST(hpTr7, F("hptr7"), F("refrigerant temperature gas side (condenser input) (TR7)"), F("Temperaturfühler Kältemittel (Gas) (TR7)")) +MAKE_PSTR_LIST(hpTl2, F("hptl2"), F("air inlet temperature (TL2)"), F("Außenlufttemperaturfühler (TL2)")) +MAKE_PSTR_LIST(hpPl1, F("hppl1"), F("low pressure side temperature (PL1)"), F("Niedrigdruckfühler (PL1)")) +MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)"), F("Hochdruckfühler (PH1)")) + +// hybrid heatpump +MAKE_PSTR_LIST(hybridStrategy, F("hybridstrategy"), F("hybrid control strategy")) // need DE +MAKE_PSTR_LIST(switchOverTemp, F("switchovertemp"), F("outside switchover temperature")) // need DE +MAKE_PSTR_LIST(energyCostRatio, F("energycostratio"), F("energy cost ratio")) // need DE +MAKE_PSTR_LIST(fossileFactor, F("fossilefactor"), F("fossile energy factor")) // need DE +MAKE_PSTR_LIST(electricFactor, F("electricfactor"), F("electric energy factor")) // need DE +MAKE_PSTR_LIST(delayBoiler, F("delayboiler"), F("delay boiler support")) // need DE +MAKE_PSTR_LIST(tempDiffBoiler, F("tempdiffboiler"), F("temp diff boiler support")) // need DE + +// alternative heatsource AM200 +MAKE_PSTR_LIST(aCylTopTemp, F("cyltoptemp"), F("cylinder top temperature"), F("Zylinder oben Temperatur")) +MAKE_PSTR_LIST(aCylCenterTemp, F("cylcentertemp"), F("cylinder center temperature"), F("Zylinder mitte Temperatur")) +MAKE_PSTR_LIST(aCylBottomTemp, F("cylbottomtemp"), F("cylinder bottom temperature"), F("Zylinder unten Temperatur")) +MAKE_PSTR_LIST(aFlowTemp, F("altflowtemp"), F("alternative hs flow temperature"), F("Alternativ hs Flusstemperatur")) +MAKE_PSTR_LIST(aRetTemp, F("altrettemp"), F("alternative hs return temperature"), F("Alternativ hs Rücktemperatur")) +MAKE_PSTR_LIST(sysFlowTemp, F("sysflowtemp"), F("system flow temperature"), F("System Flusstemperature")) +MAKE_PSTR_LIST(sysRetTemp, F("sysrettemp"), F("system return temperature"), F("System Rücktemperature")) +MAKE_PSTR_LIST(valveByPass, F("valvebypass"), F("bypass valve"), F("bypass Ventil")) +MAKE_PSTR_LIST(valveBuffer, F("valvebuffer"), F("buffer valve"), F("Puffer Ventil")) +MAKE_PSTR_LIST(valveReturn, F("valvereturn"), F("return valve"), F("Rückfluss Ventil")) +MAKE_PSTR_LIST(aPumpMod, F("altpumpmod"), F("alternative hs pump modulation"), F("Alternativ hs Pumpenmodulation")) +MAKE_PSTR_LIST(heatSource, F("heatsource"), F("alternative heating active"), F("Alternativ Heizung")) + +MAKE_PSTR_LIST(vr2Config, F("vr2config"), F("vr2 configuration")) // need DE +MAKE_PSTR_LIST(ahsActivated, F("ahsactivated"), F("alternate heat source activation")) // need DE +MAKE_PSTR_LIST(aPumpConfig, F("apumpconfig"), F("primary pump config")) // need DE +MAKE_PSTR_LIST(aPumpSignal, F("apumpsignal"), F("output for pr1 pump")) // need DE +MAKE_PSTR_LIST(aPumpMin, F("apumpmin"), F("min output pump pr1")) // need DE +MAKE_PSTR_LIST(tempRise, F("temprise"), F("ahs return temp rise")) // need DE +MAKE_PSTR_LIST(setReturnTemp, F("setreturntemp"), F("set temp return")) // need DE +MAKE_PSTR_LIST(mixRuntime, F("mixruntime"), F("mixer run time")) // need DE +MAKE_PSTR_LIST(bufBypass, F("bufbypass"), F("buffer bypass config")) // need DE +MAKE_PSTR_LIST(bufMixRuntime, F("bufmixruntime"), F("bypass mixer run time")) // need DE +MAKE_PSTR_LIST(bufConfig, F("bufconfig"), F("dhw buffer config")) // need DE +MAKE_PSTR_LIST(blockMode, F("blockmode"), F("config htg. blocking mode")) // need DE +MAKE_PSTR_LIST(blockTerm, F("blockterm"), F("config of block terminal")) // need DE +MAKE_PSTR_LIST(blockHyst, F("blockhyst"), F("hyst. for bolier block")) // need DE +MAKE_PSTR_LIST(releaseWait, F("releasewait"), F("boiler release wait time")) // need DE + +// the following are dhw for the boiler and automatically tagged with 'ww' +MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature")) // need DE +MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off")) // need DE +MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperature")) // need DE +MAKE_PSTR_LIST(wwCylMiddleTemp, F("wwcylmiddletemp"), F("cylinder middle temperature (TS3)")) // need DE + +MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature"), F("gewählte Temperatur")) +MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature"), F("Solltemperatur")) +MAKE_PSTR_LIST(wwType, F("wwtype"), F("type"), F("Typ")) +MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort"), F("Komfort")) +MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("comfort mode"), F("Komfort mode")) +MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset"), F("Flusstemperaturanhebung")) +MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power"), F("max Leistung")) +MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available"), F("Zirkulationspumpe vorhanden")) +MAKE_PSTR_LIST(wwChargeType, F("wwchargetype"), F("charging type"), F("Ladungstyp")) +MAKE_PSTR_LIST(wwDisinfectionTemp, F("wwdisinfectiontemp"), F("disinfection temperature"), F("Desinfectionstemperatur")) +MAKE_PSTR_LIST(wwCircMode, F("wwcircmode"), F("circulation pump mode"), F("Zirkulationspumpenfrequenz")) +MAKE_PSTR_LIST(wwCirc, F("wwcirc"), F("circulation active"), F("Zirkulation aktiv")) +MAKE_PSTR_LIST(wwCurTemp, F("wwcurtemp"), F("current intern temperature"), F("aktuelle Warmwasser Temperatur intern")) +MAKE_PSTR_LIST(wwCurTemp2, F("wwcurtemp2"), F("current extern temperature"), F("aktuelle Warmwaser Temperatur extern")) +MAKE_PSTR_LIST(wwCurFlow, F("wwcurflow"), F("current tap water flow"), F("aktueller Durchfluss")) +MAKE_PSTR_LIST(wwStorageTemp1, F("wwstoragetemp1"), F("storage intern temperature"), F("interne Speichertemperature")) +MAKE_PSTR_LIST(wwStorageTemp2, F("wwstoragetemp2"), F("storage extern temperature"), F("externer Speichertemperatur")) +MAKE_PSTR_LIST(wwActivated, F("wwactivated"), F("activated"), F("aktiviert")) +MAKE_PSTR_LIST(wwOneTime, F("wwonetime"), F("one time charging"), F("Einmalladung")) +MAKE_PSTR_LIST(wwDisinfecting, F("wwdisinfecting"), F("disinfecting"), F("Desinfizieren")) +MAKE_PSTR_LIST(wwCharging, F("wwcharging"), F("charging"), F("Laden")) +MAKE_PSTR_LIST(wwChargeOptimization, F("wwchargeoptimization"), F("charge optimization"), F("charge optimization")) +MAKE_PSTR_LIST(wwRecharging, F("wwrecharging"), F("recharging"), F("Nachladen")) +MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("temperature ok"), F("Temperatur ok")) +MAKE_PSTR_LIST(wwActive, F("wwactive"), F("active"), F("aktiv")) +MAKE_PSTR_LIST(ww3wayValve, F("ww3wayvalve"), F("3-way valve active"), F("3-Wegeventil aktiv")) +MAKE_PSTR_LIST(wwSetPumpPower, F("wwsetpumppower"), F("set pump power"), F("Soll Pumpenleistung")) +MAKE_PSTR_LIST(wwMixerTemp, F("wwmixertemp"), F("mixer temperature"), F("Mischertemperatur")) +MAKE_PSTR_LIST(wwStarts, F("wwstarts"), F("starts"), F("Anzahl starts")) +MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("control starts2"), F("Kreis 2 Anzahl Starts")) +MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time"), F("aktive Zeit")) +MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature"), F("Hysterese Einschalttemperatur")) +MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature"), F("Hysterese Ausschalttemperatur")) +MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("program"), F("Programmmodus")) +MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("circulation program"), F("Zirkulationsprogramm")) +MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("maximum temperature"), F("Maximale Temperatur")) +MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("one time key function"), F("Einmalladungstaste")) + +// mqtt values / commands +MAKE_PSTR_LIST(switchtime, F("switchtime"), F("program switchtime"), F("Program Schaltzeit")) +MAKE_PSTR_LIST(switchtime1, F("switchtime1"), F("own1 program switchtime"), F("Program 1 Schaltzeit")) +MAKE_PSTR_LIST(switchtime2, F("switchtime2"), F("own2 program switchtime"), F("Programm 2 Schaltzeit")) +MAKE_PSTR_LIST(wwswitchtime, F("wwswitchtime"), F("program switchtime"), F("Programm Schaltzeit")) +MAKE_PSTR_LIST(wwcircswitchtime, F("wwcircswitchtime"), F("circulation program switchtime"), F("Zirculationsprogramm Schaltzeit")) +MAKE_PSTR_LIST(dateTime, F("datetime"), F("date/time"), F("Datum/Zeit")) +MAKE_PSTR_LIST(errorCode, F("errorcode"), F("error code"), F("Fehlermeldung")) +MAKE_PSTR_LIST(ibaMainDisplay, F("display"), F("display"), F("Anzeige")) +MAKE_PSTR_LIST(ibaLanguage, F("language"), F("language"), F("Sprache")) +MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("clock offset"), F("Uhrkorrektur")) +MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building type"), F("Gebäude")) +MAKE_PSTR_LIST(heatingPID, F("heatingpid"), F("heating PID"), F("heating PID")) +MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("internal temperature offset"), F("Korrektur interner Temperatur")) +MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("minimal external temperature"), F("min Aussentemperatur")) +MAKE_PSTR_LIST(backlight, F("backlight"), F("key backlight"), F("Gegenlicht")) +MAKE_PSTR_LIST(damping, F("damping"), F("damping outdoor temperature"), F("Dämpfung der Außentemperatur")) +MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("temperature sensor 1"), F("Temperatursensor 1")) +MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2"), F("Temperatursensor 2")) +MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature"), F("gedämpfte Aussentemperatur")) +MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying"), F("Estrichtrocknung")) +MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature"), F("Estrichtrocknungs Temperatur")) +MAKE_PSTR_LIST(brightness, F("brightness"), F("screen brightness"), F("bildschirmhelligkeit")) +MAKE_PSTR_LIST(autodst, F("autodst"), F("automatic change daylight saving time"), F("automatische sommerzeit umstellung")) +MAKE_PSTR_LIST(preheating, F("preheating"), F("preheating in the clock program"), F("vorheizen im uhrenprogramm")) +MAKE_PSTR_LIST(offtemp, F("offtemp"), F("temperature when mode is off"), F("temperatur bei ausgeschaltetem modus")) +MAKE_PSTR_LIST(mixingvalves, F("mixingvalves"), F("mixing valves"), F("mischventile")) + +// thermostat ww +MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode"), F("modus")) +MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature"), F("untere Solltemperatur")) +MAKE_PSTR_LIST(wwWhenModeOff, F("wwwhenmodeoff"), F("when thermostat mode off"), F("wenn Thermostatmodus ist aus")) +MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra"), F("Kreis 1 Extra")) +MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra"), F("Kreis 2 Extra")) + +MAKE_PSTR_LIST(wwCharge, F("wwcharge"), F("charge")) // need DE +MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration")) // need DE +MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection")) // need DE +MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day")) // need DE +MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour")) // need DE +MAKE_PSTR_LIST(wwDisinfectTime, F("wwdisinfecttime"), F("disinfection time")) // need DE +MAKE_PSTR_LIST(wwDailyHeating, F("wwdailyheating"), F("daily heating")) // need DE +MAKE_PSTR_LIST(wwDailyHeatTime, F("wwdailyheattime"), F("daily heating time")) // need DE + +// thermostat hc +MAKE_PSTR_LIST(selRoomTemp, F("seltemp"), F("selected room temperature"), F("Sollwert Raumtemperatur")) +MAKE_PSTR_LIST(roomTemp, F("currtemp"), F("current room temperature"), F("aktuelle Raumtemperatur")) +MAKE_PSTR_LIST(mode, F("mode"), F("mode"), F("modus")) +MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type"), F("modus Typ")) +MAKE_PSTR_LIST(fastheatup, F("fastheatup"), F("fast heatup"), F("schnelles Aufheizen")) +MAKE_PSTR_LIST(daytemp, F("daytemp"), F("day temperature"), F("Tagestemperatur")) +MAKE_PSTR_LIST(daylowtemp, F("daytemp2"), F("day temperature T2"), F("Tagestemperatur T2")) +MAKE_PSTR_LIST(daymidtemp, F("daytemp3"), F("day temperature T3"), F("Tagestemperatur T3")) +MAKE_PSTR_LIST(dayhightemp, F("daytemp4"), F("day temperature T4"), F("Tagestemperatur T4")) +MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature"), F("Heizen Temperatur")) +MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature"), F("Nachttemperatur")) +MAKE_PSTR_LIST(nighttemp2, F("nighttemp"), F("night temperature T1"), F("Nachttemperatur T1")) +MAKE_PSTR_LIST(ecotemp, F("ecotemp"), F("eco temperature"), F("eco Temperatur")) +MAKE_PSTR_LIST(manualtemp, F("manualtemp"), F("manual temperature"), F("manuelle Temperatur")) +MAKE_PSTR_LIST(tempautotemp, F("tempautotemp"), F("temporary set temperature automode"), F("zwischenzeitliche Solltemperatur")) +MAKE_PSTR_LIST(remoteseltemp, F("remoteseltemp"), F("temporary set temperature from remote")) // need DE +MAKE_PSTR_LIST(comforttemp, F("comforttemp"), F("comfort temperature"), F("Komforttemperatur")) +MAKE_PSTR_LIST(summertemp, F("summertemp"), F("summer temperature"), F("Sommertemperatur")) +MAKE_PSTR_LIST(designtemp, F("designtemp"), F("design temperature"), F("design-Temperatur")) +MAKE_PSTR_LIST(offsettemp, F("offsettemp"), F("offset temperature"), F("Temperaturanhebung")) +MAKE_PSTR_LIST(minflowtemp, F("minflowtemp"), F("min flow temperature"), F("min Flusstemperatur")) +MAKE_PSTR_LIST(maxflowtemp, F("maxflowtemp"), F("max flow temperature"), F("max Flusstemperatur")) +MAKE_PSTR_LIST(roominfluence, F("roominfluence"), F("room influence"), F("Raumeinfluss")) +MAKE_PSTR_LIST(roominfl_factor, F("roominflfactor"), F("room influence factor"), F("Raumeinfluss Factor")) +MAKE_PSTR_LIST(curroominfl, F("curroominfl"), F("current room influence"), F("aktueller Raumeinfluss")) +MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature"), F("Frostschutztemperatur")) +MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature"), F("berechnete Flusstemperatur")) +MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("heating type"), F("Heizungstyp")) +MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("set summer mode"), F("Einstellung Sommerbetrieb")) +MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("heatpump operating mode"), F("Wärmepumpe Betriebsmodus")) +MAKE_PSTR_LIST(hpoperatingstate, F("hpoperatingstate"), F("heatpump operating state"), F("heatpump operating state")) +MAKE_PSTR_LIST(controlmode, F("controlmode"), F("control mode"), F("Kontrollmodus")) +MAKE_PSTR_LIST(control, F("control"), F("control device"), F("Fernsteuerung")) +MAKE_PSTR_LIST(program, F("program"), F("program"), F("Programm")) +MAKE_PSTR_LIST(pause, F("pause"), F("pause time"), F("Pausenzeit")) +MAKE_PSTR_LIST(party, F("party"), F("party time"), F("Partyzeit")) +MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("holiday temperature"), F("Urlaubstemperatur")) +MAKE_PSTR_LIST(summermode, F("summermode"), F("summer mode"), F("Sommerbetrieb")) +MAKE_PSTR_LIST(holidaymode, F("holidaymode"), F("holiday mode"), F("Urlaubsbetrieb")) +MAKE_PSTR_LIST(flowtempoffset, F("flowtempoffset"), F("flow temperature offset for mixer"), F("Flusstemperaturanhebung")) +MAKE_PSTR_LIST(reducemode, F("reducemode"), F("reduce mode"), F("Absenkmodus")) +MAKE_PSTR_LIST(noreducetemp, F("noreducetemp"), F("no reduce below temperature"), F("Absenkung unterbrechen unter Temperatur")) +MAKE_PSTR_LIST(reducetemp, F("reducetemp"), F("off/reduce switch temperature"), F("Absenkmodus unter Temperatur")) +MAKE_PSTR_LIST(vacreducetemp, F("vacreducetemp"), F("vacations off/reduce switch temperature"), F("Urlaub Absenkmodus unter Temperatur")) +MAKE_PSTR_LIST(vacreducemode, F("vacreducemode"), F("vacations reduce mode"), F("Urlaub Absenkmodus")) +MAKE_PSTR_LIST(nofrostmode, F("nofrostmode"), F("nofrost mode"), F("Frostschutz Modus")) +MAKE_PSTR_LIST(remotetemp, F("remotetemp"), F("room temperature from remote"), F("Raumtemperatur der Fernsteuerung")) + +MAKE_PSTR_LIST(wwHolidays, F("wwholidays"), F("holiday dates")) // need DE +MAKE_PSTR_LIST(wwVacations, F("wwvacations"), F("vacation dates")) // need DE +MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates")) // need DE +MAKE_PSTR_LIST(vacations, F("vacations"), F("vacation dates")) // need DE +MAKE_PSTR_LIST(wwprio, F("wwprio"), F("dhw priority")) // need DE +MAKE_PSTR_LIST(nofrostmode1, F("nofrostmode1"), F("nofrost mode")) // need DE +MAKE_PSTR_LIST(reducehours, F("reducehours"), F("duration for nighttemp")) // need DE +MAKE_PSTR_LIST(reduceminutes, F("reduceminutes"), F("remaining time for nightmode")) // need DE +MAKE_PSTR_LIST(switchonoptimization, F("switchonoptimization"), F("switch-on optimization")) // need DE + +// heatpump +MAKE_PSTR_LIST(airHumidity, F("airhumidity"), F("relative air humidity"), F("relative Luftfeuchte")) +MAKE_PSTR_LIST(dewTemperature, F("dewtemperature"), F("dew point temperature"), F("Taupunkttemperatur")) + +// mixer +MAKE_PSTR_LIST(flowSetTemp, F("flowsettemp"), F("setpoint flow temperature"), F("Sollwert Flusstemperatur")) +MAKE_PSTR_LIST(flowTempHc, F("flowtemphc"), F("flow temperature (TC1)"), F("Flusstemperatur des hk (TC1)")) +MAKE_PSTR_LIST(pumpStatus, F("pumpstatus"), F("pump status (PC1)"), F("Pumpenstatus des hk (PC1)")) +MAKE_PSTR_LIST(mixerStatus, F("valvestatus"), F("mixing valve actuator (VC1)"), F("Mischerventil Position (VC1)")) +MAKE_PSTR_LIST(flowTempVf, F("flowtempvf"), F("flow temperature in header (T0/Vf)"), F("Flusstemperatur am Kessel (T0/Vf)")) +MAKE_PSTR_LIST(mixerSetTime, F("valvesettime"), F("time to set valve"), F("Zeit zum Einstellen des Ventils")) +// mixer prefixed with wwc +MAKE_PSTR_LIST(wwPumpStatus, F("pumpstatus"), F("pump status in assigned wwc (PC1)"), F("Pumpenstatus des wwk (PC1)")) +MAKE_PSTR_LIST(wwTempStatus, F("wwtempstatus"), F("temperature switch in assigned wwc (MC1)"), F("Temperaturschalter des wwk (MC1)")) +MAKE_PSTR_LIST(wwTemp, F("wwtemp"), F("current temperature"), F("aktuelle Temperatur")) +// mixer pool +MAKE_PSTR_LIST(poolSetTemp, F("poolsettemp"), F("pool set temperature")) // need DE +MAKE_PSTR_LIST(poolTemp, F("pooltemp"), F("pool temperature")) // need DE +MAKE_PSTR_LIST(poolShuntStatus, F("poolshuntstatus"), F("pool shunt status opening/closing")) // need DE +MAKE_PSTR_LIST(poolShunt, F("poolshunt"), F("pool shunt open/close (0% = pool / 100% = heat)")) // need DE +MAKE_PSTR_LIST(hydrTemp, F("hydrTemp"), F("hydraulic header temperature")) // need DE + +// solar +MAKE_PSTR_LIST(cylMiddleTemp, F("cylmiddletemp"), F("cylinder middle temperature (TS3)"), F("cylinder middle temperature (TS3)")) // need DE +MAKE_PSTR_LIST(retHeatAssist, F("retheatassist"), F("return temperature heat assistance (TS4)"), F("return temperature heat assistance (TS4)")) // need DE +MAKE_PSTR_LIST(m1Valve, F("heatassistvalve"), F("heat assistance valve (M1)"), F("heat assistance valve (M1)")) // need DE +MAKE_PSTR_LIST(m1Power, F("heatassistpower"), F("heat assistance valve power (M1)"), F("heat assistance valve power (M1)")) // need DE +MAKE_PSTR_LIST(pumpMinMod, F("pumpminmod"), F("minimum pump modulation")) // need DE +MAKE_PSTR_LIST(maxFlow, F("maxflow"), F("maximum solar flow")) // need DE +MAKE_PSTR_LIST(solarPower, F("solarpower"), F("actual solar power")) // need DE +MAKE_PSTR_LIST(solarPumpTurnonDiff, F("turnondiff"), F("pump turn on difference")) // need DE +MAKE_PSTR_LIST(solarPumpTurnoffDiff, F("turnoffdiff"), F("pump turn off difference")) // need DE +MAKE_PSTR_LIST(pump2MinMod, F("pump2minmod"), F("minimum pump 2 modulation")) // need DE +MAKE_PSTR_LIST(solarPump2TurnonDiff, F("turnondiff2"), F("pump 2 turn on difference")) // need DE +MAKE_PSTR_LIST(solarPump2TurnoffDiff, F("turnoffdiff2"), F("pump 2 turn off difference")) // need DE + +MAKE_PSTR_LIST(collectorTemp, F("collectortemp"), F("collector temperature (TS1)"), F("Kollektortemperatur (TS1)")) +MAKE_PSTR_LIST(collector2Temp, F("collector2temp"), F("collector 2 temperature (TS7)"), F("collector 2 temperature (TS7)")) +MAKE_PSTR_LIST(cylBottomTemp, F("cylbottomtemp"), F("cylinder bottom temperature (TS2)"), F("Speicher Bodentemperatur (TS2)")) +MAKE_PSTR_LIST(cyl2BottomTemp, F("cyl2bottomtemp"), F("second cylinder bottom temperature (TS5)"), F("2. Speicher Bodentemperatur (TS5)")) +MAKE_PSTR_LIST(heatExchangerTemp, F("heatexchangertemp"), F("heat exchanger temperature (TS6)"), F("wärmetauscher Temperatur (TS6)")) +MAKE_PSTR_LIST(collectorMaxTemp, F("collectormaxtemp"), F("maximum collector temperature"), F("maximale Kollektortemperatur")) +MAKE_PSTR_LIST(collectorMinTemp, F("collectormintemp"), F("minimum collector temperature"), F("minimale Kollektortemperatur")) +MAKE_PSTR_LIST(cylMaxTemp, F("cylmaxtemp"), F("maximum cylinder temperature"), F("maximale Speichertemperatur")) +MAKE_PSTR_LIST(solarPumpMod, F("solarpumpmod"), F("pump modulation (PS1)"), F("Pumpenmodulation (PS1)")) +MAKE_PSTR_LIST(cylPumpMod, F("cylpumpmod"), F("cylinder pump modulation (PS5)"), F("Speicherpumpenmodulation (PS5)")) +MAKE_PSTR_LIST(solarPump, F("solarpump"), F("pump (PS1)"), F("Pumpe (PS1)")) +MAKE_PSTR_LIST(solarPump2, F("solarpump2"), F("pump 2 (PS4)"), F("pump 2 (PS4)")) +MAKE_PSTR_LIST(solarPump2Mod, F("solarpump2mod"), F("pump 2 modulation (PS4)"), F("pump 2 modulation (PS4)")) +MAKE_PSTR_LIST(valveStatus, F("valvestatus"), F("valve status"), F("ventilstatus")) +MAKE_PSTR_LIST(cylHeated, F("cylheated"), F("cyl heated"), F("Speichertemperatur erreicht")) +MAKE_PSTR_LIST(collectorShutdown, F("collectorshutdown"), F("collector shutdown"), F("Kollektorabschaltung")) +MAKE_PSTR_LIST(pumpWorkTime, F("pumpworktime"), F("pump working time"), F("Pumpenlaufzeit")) +MAKE_PSTR_LIST(pump2WorkTime, F("pump2worktime"), F("pump 2 working time"), F("Pumpe 2 Laufzeit")) +MAKE_PSTR_LIST(m1WorkTime, F("m1worktime"), F("differential control working time"), F("Differenzregelung Arbeitszeit")) +MAKE_PSTR_LIST(energyLastHour, F("energylasthour"), F("energy last hour"), F("Energie letzte Std")) +MAKE_PSTR_LIST(energyTotal, F("energytotal"), F("total energy"), F("Gesamtenergie")) +MAKE_PSTR_LIST(energyToday, F("energytoday"), F("total energy today"), F("Energie heute")) + +// solar ww +MAKE_PSTR_LIST(cyl1, F("cyl 1"), F("Zyl_1")) +MAKE_PSTR_LIST(cyl2, F("cyl 2"), F("Zyl_2")) +MAKE_PSTR_LIST(wwTemp1, F("wwtemp1"), F("temperature 1"), F("Temperatur 1")) +MAKE_PSTR_LIST(wwTemp3, F("wwtemp3"), F("temperature 3"), F("Temperatur 3")) +MAKE_PSTR_LIST(wwTemp4, F("wwtemp4"), F("temperature 4"), F("Temperatur 4")) +MAKE_PSTR_LIST(wwTemp5, F("wwtemp5"), F("temperature 5"), F("Temperatur 5")) +MAKE_PSTR_LIST(wwTemp7, F("wwtemp7"), F("temperature 7"), F("Temperatur 7")) +MAKE_PSTR_LIST(wwPump, F("wwpump"), F("pump"), F("Pumpe")) +// solar ww and mixer wwc +MAKE_PSTR_LIST(wwMinTemp, F("wwmintemp"), F("minimum temperature"), F("minimale Temperatur")) +MAKE_PSTR_LIST(wwRedTemp, F("wwredtemp"), F("reduced temperature"), F("redizierte Temperatur")) +MAKE_PSTR_LIST(wwDailyTemp, F("wwdailytemp"), F("daily temperature"), F("tägl. Temperatur")) +MAKE_PSTR_LIST(wwKeepWarm, F("wwkeepwarm"), F("keep warm"), F("Warmhalten")) +MAKE_PSTR_LIST(wwStatus2, F("wwstatus2"), F("status 2"), F("Status 2")) +MAKE_PSTR_LIST(wwPumpMod, F("wwpumpmod"), F("pump modulation"), F("Pumpen Modulation")) +MAKE_PSTR_LIST(wwFlow, F("wwflow"), F("flow rate"), F("Flussrate")) +// extra mixer ww +MAKE_PSTR_LIST(wwRequiredTemp, F("wwrequiredtemp"), F("required temperature"), F("benötigte Temperatur")) +MAKE_PSTR_LIST(wwDiffTemp, F("wwdifftemp"), F("start differential temperature"), F("Start Differential Temperatur")) + +// SM100 +MAKE_PSTR_LIST(heatTransferSystem, F("heattransfersystem"), F("heattransfer system"), F("Wärmetransfer System")) +MAKE_PSTR_LIST(externalCyl, F("externalcyl"), F("external cylinder"), F("Externer Speicher")) +MAKE_PSTR_LIST(thermalDisinfect, F("thermaldisinfect"), F("thermal disinfection"), F("Thermische Desinfektion")) +MAKE_PSTR_LIST(heatMetering, F("heatmetering"), F("heatmetering"), F("Wärmemessung")) +MAKE_PSTR_LIST(solarIsEnabled, F("solarenabled"), F("solarmodule enabled"), F("Solarmodul aktiviert")) + +// telegram 0x035A +MAKE_PSTR_LIST(solarPumpMode, F("solarpumpmode"), F("pump mode"), F("solar Pumpen Einst.")) +MAKE_PSTR_LIST(solarPumpKick, F("pumpkick"), F("pump kick"), F("pump kick")) +MAKE_PSTR_LIST(plainWaterMode, F("plainwatermode"), F("plain water mode"), F("plain water mode")) +MAKE_PSTR_LIST(doubleMatchFlow, F("doublematchflow"), F("doublematchflow"), F("doublematchflow")) +MAKE_PSTR_LIST(solarPump2Mode, F("pump2mode"), F("pump 2 mode"), F("pump 2 mode")) +MAKE_PSTR_LIST(solarPump2Kick, F("pump2kick"), F("pump kick 2"), F("pump kick 2")) + +// telegram 0x035F +MAKE_PSTR_LIST(cylPriority, F("cylpriority"), F("cylinder priority"), F("Speicher Priorität")) + +// telegram 0x380 +MAKE_PSTR_LIST(climateZone, F("climatezone"), F("climate zone"), F("Klimazone")) +MAKE_PSTR_LIST(collector1Area, F("collector1area"), F("collector 1 area"), F("Kollektor 1 Fläche")) +MAKE_PSTR_LIST(collector1Type, F("collector1type"), F("collector 1 type"), F("Kollektor 1 Type")) +MAKE_PSTR_LIST(collector2Area, F("collector2area"), F("collector 2 area"), F("Kollektor 2 Fläche")) +MAKE_PSTR_LIST(collector2Type, F("collector2type"), F("collector 2 type"), F("Kollektor 2 Type")) + +// telegram 0x0363 heatCounter +MAKE_PSTR_LIST(heatCntFlowTemp, F("heatcntflowtemp"), F("heat counter flow temperature"), F("Wärmezähler Fluss-Temperatur")) +MAKE_PSTR_LIST(heatCntRetTemp, F("heatcntrettemp"), F("heat counter return temperature"), F("Wärmezähler Rückfluss-Temperatur")) +MAKE_PSTR_LIST(heatCnt, F("heatcnt"), F("heat counter impulses"), F("Wärmezäler Impulse")) +MAKE_PSTR_LIST(swapFlowTemp, F("swapflowtemp"), F("swap flow temperature (TS14)"), F("Austausch Fluss-Temperatur (TS14)")) +MAKE_PSTR_LIST(swapRetTemp, F("swaprettemp"), F("swap return temperature (TS15)"), F("Austausch Rückfluss-Temperatur (TS15)")) + +// switch +MAKE_PSTR_LIST(activated, F("activated"), F("activated"), F("aktiviert")) +MAKE_PSTR_LIST(status, F("status"), F("status"), F("Status")) + +// RF sensor, id 0x40, telegram 0x435 +MAKE_PSTR_LIST(RFTemp, F("rftemp"), F("RF room temperature sensor"), F("RF Raumtemperatur Sensor")) + +// unknown fields to track (SM10) +MAKE_PSTR_LIST(data11, F("data11"), F("unknown datafield 11")) +MAKE_PSTR_LIST(data12, F("data12"), F("unknown datafield 12")) +MAKE_PSTR_LIST(data8, F("data8"), F("unknown datafield 8")) +MAKE_PSTR_LIST(data0, F("data0"), F("unknown datafield 0")) +MAKE_PSTR_LIST(data1, F("data1"), F("unknown datafield 1")) +MAKE_PSTR_LIST(setting3, F("setting3"), F("unknown setting 3")) +MAKE_PSTR_LIST(setting4, F("setting4"), F("unknown setting 4")) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index bbcf834c2..986351fb1 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -26,6 +26,7 @@ namespace emsesp { AsyncMqttClient * Mqtt::mqttClient_; // static parameters we make global +std::string Mqtt::system_hostname_; // copy from System::hostname() std::string Mqtt::mqtt_base_; uint8_t Mqtt::mqtt_qos_; bool Mqtt::mqtt_retain_; @@ -109,7 +110,7 @@ void Mqtt::subscribe(const std::string & topic) { } // resubscribe to all MQTT topics -// if it's already in the queue, ignore it +// if it's already in the queue then just ignore it void Mqtt::resubscribe() { if (mqtt_subfunctions_.empty()) { return; @@ -277,7 +278,7 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) cons return; } - // check first againts any of our subscribed topics + // check first against any of our subscribed topics for (const auto & mf : mqtt_subfunctions_) { // add the base back char full_topic[MQTT_TOPIC_MAX_SIZE]; @@ -420,6 +421,9 @@ void Mqtt::load_settings() { publish_time_other_ = mqttSettings.publish_time_other * 1000; publish_time_sensor_ = mqttSettings.publish_time_sensor * 1000; }); + + // get a local copy of the system hostname + system_hostname_ = EMSESP::system_.hostname(); } void Mqtt::start() { @@ -576,28 +580,31 @@ void Mqtt::on_connect() { publish(F_(info), doc.as()); // topic called "info" if (ha_enabled_) { - queue_unsubscribe_message(discovery_prefix_ + "/climate/" + mqtt_base_ + "/#"); - queue_unsubscribe_message(discovery_prefix_ + "/sensor/" + mqtt_base_ + "/#"); - queue_unsubscribe_message(discovery_prefix_ + "/binary_sensor/" + mqtt_base_ + "/#"); - queue_unsubscribe_message(discovery_prefix_ + "/number/" + mqtt_base_ + "/#"); - queue_unsubscribe_message(discovery_prefix_ + "/select/" + mqtt_base_ + "/#"); - queue_unsubscribe_message(discovery_prefix_ + "/switch/" + mqtt_base_ + "/#"); + LOG_INFO(F("start removing topics %s/+/%s/#"), discovery_prefix_.c_str(), system_hostname_.c_str()); + queue_unsubscribe_message(discovery_prefix_ + "/climate/" + system_hostname_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/sensor/" + system_hostname_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/binary_sensor/" + system_hostname_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/number/" + system_hostname_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/select/" + system_hostname_ + "/#"); + queue_unsubscribe_message(discovery_prefix_ + "/switch/" + system_hostname_ + "/#"); EMSESP::reset_mqtt_ha(); // re-create all HA devices if there are any ha_status(); // create the EMS-ESP device in HA, which is MQTT retained ha_climate_reset(true); } else { - queue_subscribe_message(discovery_prefix_ + "/climate/" + mqtt_base_ + "/#"); - queue_subscribe_message(discovery_prefix_ + "/sensor/" + mqtt_base_ + "/#"); - queue_subscribe_message(discovery_prefix_ + "/binary_sensor/" + mqtt_base_ + "/#"); - queue_subscribe_message(discovery_prefix_ + "/number/" + mqtt_base_ + "/#"); - queue_subscribe_message(discovery_prefix_ + "/select/" + mqtt_base_ + "/#"); - queue_subscribe_message(discovery_prefix_ + "/switch/" + mqtt_base_ + "/#"); - LOG_INFO(F("start removing topics %s/+/%s/#"), discovery_prefix_.c_str(), mqtt_base_.c_str()); + // TODO commented out - not sure why we need to subscribe if not using discovery. Check with Michael! + /* + queue_subscribe_message(discovery_prefix_ + "/climate/" + system_hostname_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/sensor/" + system_hostname_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/binary_sensor/" + system_hostname_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/number/" + system_hostname_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/select/" + system_hostname_ + "/#"); + queue_subscribe_message(discovery_prefix_ + "/switch/" + system_hostname_ + "/#"); + */ } // send initial MQTT messages for some of our services EMSESP::shower_.set_shower_state(false, true); // Send shower_activated as false - EMSESP::system_.send_heartbeat(); // send heatbeat + EMSESP::system_.send_heartbeat(); // send heartbeat // re-subscribe to all custom registered MQTT topics resubscribe(); @@ -641,7 +648,7 @@ void Mqtt::ha_status() { ids.add("ems-esp"); char topic[MQTT_TOPIC_MAX_SIZE]; - snprintf(topic, sizeof(topic), "sensor/%s/system/config", mqtt_base_.c_str()); + snprintf(topic, sizeof(topic), "sensor/%s/system/config", system_hostname_.c_str()); Mqtt::publish_ha(topic, doc.as()); // publish the config payload with retain flag // create the sensors - must match the MQTT payload keys @@ -810,7 +817,7 @@ void Mqtt::process_queue() { if (message->topic.find(discovery_prefix_) == 0) { strlcpy(topic, message->topic.c_str(), sizeof(topic)); // leave topic as it is } else { - snprintf(topic, MQTT_TOPIC_MAX_SIZE, "%s/%s", mqtt_base_.c_str(), message->topic.c_str()); + snprintf(topic, MQTT_TOPIC_MAX_SIZE, "%s/%s", mqtt_base_.c_str(), message->topic.c_str()); // uses base } // if this has already been published and we're waiting for an ACK, don't publish again @@ -919,7 +926,8 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, } // calculate the min and max - int16_t dv_set_min, dv_set_max; + int16_t dv_set_min; + int16_t dv_set_max; (void)dv.get_min_max(dv_set_min, dv_set_max); // determine if we're creating the command topics which we use special HA configs @@ -928,7 +936,7 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, publish_ha_sensor_config(dv.type, dv.tag, - dv.full_name, + Helpers::translated_fword(dv.fullname), dv.device_type, dv.short_name, dv.uom, @@ -955,21 +963,21 @@ void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelp // MQTT discovery configs // entity must match the key/value pair in the *_data topic // note: some extra string copying done here, it looks messy but does help with heap fragmentation issues -void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType - uint8_t tag, // EMSdevice::DeviceValueTAG - const __FlashStringHelper * name, // fullname - const uint8_t device_type, // EMSdevice::DeviceType - const __FlashStringHelper * entity, // shortname - const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) - const bool remove, // true if we want to remove this topic - const bool has_cmd, - const __FlashStringHelper * const * options, - uint8_t options_size, - const int16_t dv_set_min, - const int16_t dv_set_max, - const JsonObject & dev_json) { +void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType + uint8_t tag, // EMSdevice::DeviceValueTAG + const __FlashStringHelper * const fullname, // fullname, already translated + const uint8_t device_type, // EMSdevice::DeviceType + const __FlashStringHelper * const entity, // same as shortname + const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) + const bool remove, // true if we want to remove this topic + const bool has_cmd, + const __FlashStringHelper * const ** options, + uint8_t options_size, + const int16_t dv_set_min, + const int16_t dv_set_max, + const JsonObject & dev_json) { // ignore if name (fullname) is empty - if (name == nullptr) { + if (fullname == nullptr) { return; } @@ -977,7 +985,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, char device_name[50]; strlcpy(device_name, EMSdevice::device_type_2_device_name(device_type).c_str(), sizeof(device_name)); - // create entity by add the hc/wwc tag if present, seperating with a . + // create entity by add the hc/wwc tag if present, separating with a . char new_entity[50]; if (tag >= DeviceValueTAG::TAG_HC1) { snprintf(new_entity, sizeof(new_entity), "%s.%s", EMSdevice::tag_to_string(tag).c_str(), read_flash_string(entity).c_str()); @@ -1007,28 +1015,28 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // number - https://www.home-assistant.io/integrations/number.mqtt // https://developers.home-assistant.io/docs/core/entity/number - snprintf(topic, sizeof(topic), "number/%s/%s/config", mqtt_base_.c_str(), uniq); + snprintf(topic, sizeof(topic), "number/%s/%s/config", system_hostname_.c_str(), uniq); break; case DeviceValueType::BOOL: // switch - https://www.home-assistant.io/integrations/switch.mqtt - snprintf(topic, sizeof(topic), "switch/%s/%s/config", mqtt_base_.c_str(), uniq); + snprintf(topic, sizeof(topic), "switch/%s/%s/config", system_hostname_.c_str(), uniq); break; case DeviceValueType::ENUM: // select - https://www.home-assistant.io/integrations/select.mqtt - snprintf(topic, sizeof(topic), "select/%s/%s/config", mqtt_base_.c_str(), uniq); + snprintf(topic, sizeof(topic), "select/%s/%s/config", system_hostname_.c_str(), uniq); break; default: // plain old sensor - snprintf(topic, sizeof(topic), "sensor/%s/%s/config", mqtt_base_.c_str(), uniq); + snprintf(topic, sizeof(topic), "sensor/%s/%s/config", system_hostname_.c_str(), uniq); break; } } else { // plain old read only device entity if (type == DeviceValueType::BOOL) { - snprintf(topic, sizeof(topic), "binary_sensor/%s/%s/config", mqtt_base_.c_str(), uniq); // binary sensor + snprintf(topic, sizeof(topic), "binary_sensor/%s/%s/config", system_hostname_.c_str(), uniq); // binary sensor } else { use_ha_sensor = true; - snprintf(topic, sizeof(topic), "sensor/%s/%s/config", mqtt_base_.c_str(), uniq); // normal HA sensor, not a boolean one + snprintf(topic, sizeof(topic), "sensor/%s/%s/config", system_hostname_.c_str(), uniq); // normal HA sensor, not a boolean one } } @@ -1065,7 +1073,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, if (type == DeviceValueType::ENUM) { JsonArray option_list = doc.createNestedArray("options"); for (uint8_t i = 0; i < options_size; i++) { - option_list.add(options[i]); + option_list.add(Helpers::translated_word(options[i])); } } else if (type != DeviceValueType::STRING) { // Must be Numeric.... @@ -1104,22 +1112,21 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, doc["stat_t"] = stat_t; // friendly name = - char short_name[70]; + char ha_name[70]; if (have_tag) { - snprintf(short_name, sizeof(short_name), "%s %s", EMSdevice::tag_to_string(tag).c_str(), read_flash_string(name).c_str()); + snprintf(ha_name, sizeof(ha_name), "%s %s", EMSdevice::tag_to_string(tag).c_str(), read_flash_string(fullname).c_str()); } else { - snprintf(short_name, sizeof(short_name), "%s", read_flash_string(name).c_str()); + snprintf(ha_name, sizeof(ha_name), "%s", read_flash_string(fullname).c_str()); } + ha_name[0] = toupper(ha_name[0]); // capitalize first letter + doc["name"] = ha_name; - // entity id = emsesp___ - char long_name[130]; - snprintf(long_name, sizeof(long_name), "%s_%s", device_name, short_name); - // snprintf(long_name, sizeof(long_name), "emsesp_%s_%s", device_name, short_name); //wouldn't it be better? - doc["object_id"] = long_name; - - // name (friendly name) = - short_name[0] = toupper(short_name[0]); // capitalize first letter - doc["name"] = short_name; + // entity id is generated from the name, see https://www.home-assistant.io/docs/mqtt/discovery/#use-object_id-to-influence-the-entity-id + // so we override it to make it unique using entity_id + // emsesp___ + char object_id[130]; + snprintf(object_id, sizeof(object_id), "emsesp_%s_%s", device_name, ha_name); + doc["object_id"] = object_id; // value template // if its nested mqtt format then use the appended entity name, otherwise take the original diff --git a/src/mqtt.h b/src/mqtt.h index 743870251..0ab724227 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -92,19 +92,19 @@ class Mqtt { static void publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config = false); - static void publish_ha_sensor_config(uint8_t type, - uint8_t tag, - const __FlashStringHelper * name, - const uint8_t device_type, - const __FlashStringHelper * entity, - const uint8_t uom, - const bool remove, - const bool has_cmd, - const __FlashStringHelper * const * options, - uint8_t options_size, - const int16_t dv_set_min, - const int16_t dv_set_max, - const JsonObject & dev_json); + static void publish_ha_sensor_config(uint8_t type, + uint8_t tag, + const __FlashStringHelper * const fullname, + const uint8_t device_type, + const __FlashStringHelper * const entity, + const uint8_t uom, + const bool remove, + const bool has_cmd, + const __FlashStringHelper * const ** options, + uint8_t options_size, + const int16_t dv_set_min, + const int16_t dv_set_max, + const JsonObject & dev_json); static void publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom); static void publish_ha_climate_config(uint8_t tag, bool has_roomtemp, bool remove = false); @@ -286,6 +286,8 @@ class Mqtt { static bool ha_climate_reset_; // settings, copied over + static std::string system_hostname_; + static std::string mqtt_base_; static uint8_t mqtt_qos_; static bool mqtt_retain_; diff --git a/src/system.cpp b/src/system.cpp index b9d687b53..c46bd79e8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -41,6 +41,11 @@ namespace emsesp { +// Languages supported. Note: the order is important and must match locale_translations.h +const char * const languages[] = {EMSESP_LOCALE_EN, EMSESP_LOCALE_DE}; + +size_t num_languages = sizeof(languages) / sizeof(const char *); + uuid::log::Logger System::logger_{F_(system), uuid::log::Facility::KERN}; #ifndef EMSESP_STANDALONE @@ -51,6 +56,17 @@ uuid::syslog::SyslogService System::syslog_; PButton System::myPButton_; bool System::restart_requested_ = false; +// find the index of the language +// 0 = EN, 1 = DE, etc... +uint8_t System::language_index() { + for (uint8_t i = 0; i < num_languages; i++) { + if (languages[i] == locale()) { + return i; + } + } + return 0; // EN +} + // send on/off to a gpio pin // value: true = HIGH, false = LOW bool System::command_pin(const char * value, const int8_t id) { @@ -161,7 +177,7 @@ bool System::command_publish(const char * value, const int8_t id) { // syslog level bool System::command_syslog_level(const char * value, const int8_t id) { uint8_t s = 0xff; - if (Helpers::value2enum(value, s, FL_(enum_syslog_level))) { + if (Helpers::value2enum(value, s, FL_(list_syslog_level))) { bool changed = false; EMSESP::webSettingsService.update( [&](WebSettings & settings) { @@ -184,17 +200,17 @@ bool System::command_syslog_level(const char * value, const int8_t id) { bool System::command_watch(const char * value, const int8_t id) { uint8_t w = 0xff; uint16_t i = Helpers::hextoint(value); - if (Helpers::value2enum(value, w, FL_(enum_watch))) { + if (Helpers::value2enum(value, w, FL_(list_watch))) { if (w == 0 || EMSESP::watch() == EMSESP::Watch::WATCH_OFF) { EMSESP::watch_id(0); } if (Mqtt::publish_single() && w != EMSESP::watch()) { if (Mqtt::publish_single2cmd()) { Mqtt::publish(F("system/watch"), - EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(enum_watch)[w]).c_str()); + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(list_watch)[w]).c_str()); } else { Mqtt::publish(F("system_data/watch"), - EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(enum_watch)[w]).c_str()); + EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(w) : read_flash_string(FL_(list_watch)[w]).c_str()); } } EMSESP::watch(w); @@ -288,21 +304,21 @@ void System::syslog_init() { if (Mqtt::publish_single()) { if (Mqtt::publish_single2cmd()) { - Mqtt::publish(F("system/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); + Mqtt::publish(F("system/syslog"), syslog_enabled_ ? read_flash_string(FL_(list_syslog_level)[syslog_level_ + 1]).c_str() : "off"); if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { Mqtt::publish(F("system/watch"), EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(EMSESP::watch()) - : read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + : read_flash_string(FL_(list_watch)[EMSESP::watch()]).c_str()); } else { Mqtt::publish(F("system/watch"), Helpers::hextoa(EMSESP::watch_id())); } } else { - Mqtt::publish(F("system_data/syslog"), syslog_enabled_ ? read_flash_string(FL_(enum_syslog_level)[syslog_level_ + 1]).c_str() : "off"); + Mqtt::publish(F("system_data/syslog"), syslog_enabled_ ? read_flash_string(FL_(list_syslog_level)[syslog_level_ + 1]).c_str() : "off"); if (EMSESP::watch_id() == 0 || EMSESP::watch() == 0) { Mqtt::publish(F("system_data/watch"), EMSESP::system_.enum_format() == ENUM_FORMAT_INDEX ? Helpers::itoa(EMSESP::watch()) - : read_flash_string(FL_(enum_watch)[EMSESP::watch()]).c_str()); + : read_flash_string(FL_(list_watch)[EMSESP::watch()]).c_str()); } else { Mqtt::publish(F("system_data/watch"), Helpers::hextoa(EMSESP::watch_id())); } @@ -342,6 +358,8 @@ void System::reload_settings() { eth_power_ = settings.eth_power; eth_phy_addr_ = settings.eth_phy_addr; eth_clock_mode_ = settings.eth_clock_mode; + + locale_ = settings.locale; }); } @@ -412,6 +430,12 @@ void System::start() { // button single click void System::button_OnClick(PButton & b) { LOG_DEBUG(F("Button pressed - single click")); + +#ifdef EMSESP_DEBUG +#ifndef EMSESP_STANDALONE + Test::listDir(LittleFS, FS_CONFIG_DIRECTORY, 3); +#endif +#endif } // button double click @@ -431,11 +455,6 @@ void System::button_OnVLongPress(PButton & b) { #ifndef EMSESP_STANDALONE LOG_WARNING(F("Performing factory reset...")); EMSESP::console_.loop(); - -#ifdef EMSESP_DEBUG - Test::listDir(LittleFS, FS_CONFIG_DIRECTORY, 3); -#endif - EMSESP::esp8266React.factoryReset(); #endif } @@ -803,6 +822,7 @@ void System::show_system(uuid::console::Shell & shell) { shell.printfln(F(" SDK version: %s"), ESP.getSdkVersion()); shell.printfln(F(" CPU frequency: %lu MHz"), ESP.getCpuFreqMHz()); shell.printfln(F(" Free heap: %lu bytes"), (uint32_t)ESP.getFreeHeap()); + shell.printfln(F(" FS used/total: %lu/%lu (bytes)"), LittleFS.usedBytes(), LittleFS.totalBytes()); shell.println(); shell.println("Network:"); @@ -1089,7 +1109,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp #ifndef EMSESP_STANDALONE if (EMSESP::system_.syslog_enabled_) { node["syslog started"] = syslog_.started(); - node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; + node["syslog level"] = FL_(list_syslog_level)[syslog_.log_level() + 1]; node["syslog ip"] = syslog_.ip(); node["syslog queue"] = syslog_.queued(); } @@ -1145,6 +1165,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node = output.createNestedObject("Settings"); EMSESP::webSettingsService.read([&](WebSettings & settings) { node["board profile"] = settings.board_profile; + node["locale"] = settings.locale; node["tx mode"] = settings.tx_mode; node["ems bus id"] = settings.ems_bus_id; node["shower timer"] = settings.shower_timer; diff --git a/src/system.h b/src/system.h index 3db47a6ad..f5204585a 100644 --- a/src/system.h +++ b/src/system.h @@ -203,6 +203,16 @@ class System { return fahrenheit_; } + uint8_t language_index(); + + void locale(String locale) { + locale_ = locale; + } + + std::string locale() { + return std::string(locale_.c_str()); + } + void healthcheck(uint8_t healthcheck) { healthcheck_ = healthcheck; } @@ -257,6 +267,7 @@ class System { // EMS-ESP settings // copies from WebSettings class in WebSettingsService.h and loaded with reload_settings() std::string hostname_ = FACTORY_WIFI_HOSTNAME; + String locale_; bool hide_led_; uint8_t led_gpio_; bool analog_enabled_; diff --git a/src/telegram.cpp b/src/telegram.cpp index 309fb3461..5a81864db 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -596,10 +596,12 @@ void TxService::retry_tx(const uint8_t operation, const uint8_t * data, const ui } else { increment_telegram_write_fail_count(); // another Tx fail } + LOG_ERROR(F("Last Tx %s operation failed after %d retries. Ignoring request: %s"), (operation == Telegram::Operation::TX_WRITE) ? F("Write") : F("Read"), MAXIMUM_TX_RETRIES, telegram_last_->to_string().c_str()); + if (operation == Telegram::Operation::TX_READ) { EMSESP::rxservice_.add_empty(telegram_last_->dest, telegram_last_->src, telegram_last_->type_id, telegram_last_->offset); } diff --git a/src/test/test.cpp b/src/test/test.cpp index c69b437d9..81de3686d 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -304,13 +304,13 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const uint16_t temp; float doub; - temp = 0x0201; // decimal 513 - doub = Helpers::round2(temp, 10); // divide by 10 + temp = 0x0201; // decimal 513 + doub = Helpers::transformNumFloat(temp, 10); // divide by 10 shell.printfln("Round test from x%02X to %d to %f", temp, temp, doub); - doub = Helpers::round2(temp, 10); // divide by 10 + doub = Helpers::transformNumFloat(temp, 10); // divide by 10 shell.printfln("Round test div10 from x%02X to %d to %f", temp, temp, doub); temp = 0x63; - doub = Helpers::round2(temp, 2); // divide by 2 + doub = Helpers::transformNumFloat(temp, 2); // divide by 2 shell.printfln("Round test div2 from x%02X to %d to %f", temp, temp, doub); } @@ -448,7 +448,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "boiler") { shell.printfln(F("Testing boiler...")); - Mqtt::ha_enabled(false); + // Mqtt::ha_enabled(false); + Mqtt::ha_enabled(true); Mqtt::nested_format(1); run_test("boiler"); diff --git a/src/version.h b/src/version.h index cbb32b902..42749870c 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.2b5" +#define EMSESP_APP_VERSION "3.5.0b0" diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index ea9520ed0..847990edf 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -149,7 +149,7 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) { obj["t"] = sensor.type(); if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { - obj["v"] = Helpers::round2(sensor.value(), 0); // is optional and is a float + obj["v"] = Helpers::transformNumFloat(sensor.value(), 0); // is optional and is a float } else { obj["v"] = 0; // must have a value for web sorting to work } diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index d8bf8d90a..a59850ffe 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -37,6 +37,7 @@ WebSettingsService::WebSettingsService(AsyncWebServer * server, FS * fs, Securit } void WebSettings::read(WebSettings & settings, JsonObject & root) { + root["locale"] = settings.locale; root["tx_mode"] = settings.tx_mode; root["ems_bus_id"] = settings.ems_bus_id; root["syslog_enabled"] = settings.syslog_enabled; @@ -107,10 +108,10 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) check_flag(prev, settings.tx_mode, ChangeFlags::UART); prev = settings.rx_gpio; settings.rx_gpio = root["rx_gpio"] | default_rx_gpio; - check_flag(prev, settings.rx_gpio, ChangeFlags::RESTART); + check_flag(prev, settings.rx_gpio, ChangeFlags::UART); // no need to restart prev = settings.tx_gpio; settings.tx_gpio = root["tx_gpio"] | default_tx_gpio; - check_flag(prev, settings.tx_gpio, ChangeFlags::RESTART); + check_flag(prev, settings.tx_gpio, ChangeFlags::UART); // no need to restart // syslog prev = settings.syslog_enabled; @@ -203,8 +204,17 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings) settings.low_clock = root["low_clock"] | false; check_flag(prev, settings.low_clock, ChangeFlags::RESTART); + String old_local = settings.locale; + settings.locale = root["locale"] | EMSESP_DEFAULT_LOCALE; + EMSESP::system_.locale(settings.locale); +#ifndef EMSESP_STANDALONE + if (!old_local.equals(settings.locale)) { + add_flags(ChangeFlags::MQTT); + } +#endif + // - // without checks... + // without checks or necessary restarts... // settings.trace_raw = root["trace_raw"] | EMSESP_DEFAULT_TRACELOG_RAW; EMSESP::trace_raw(settings.trace_raw); @@ -269,6 +279,10 @@ void WebSettingsService::onUpdate() { EMSESP::system_.led_init(true); // reload settings } + if (WebSettings::has_flags(WebSettings::ChangeFlags::MQTT)) { + emsesp::EMSESP::mqtt_.reset_mqtt(); // reload MQTT, init HA etc + } + WebSettings::reset_flags(); } diff --git a/src/web/WebSettingsService.h b/src/web/WebSettingsService.h index 299f4a428..a20e10c9a 100644 --- a/src/web/WebSettingsService.h +++ b/src/web/WebSettingsService.h @@ -29,6 +29,7 @@ namespace emsesp { class WebSettings { public: + String locale; uint8_t tx_mode; uint8_t ems_bus_id; bool shower_timer; @@ -81,6 +82,7 @@ class WebSettings { SHOWER = (1 << 4), // 16 LED = (1 << 5), // 32 BUTTON = (1 << 6), // 64 + MQTT = (1 << 7), // 128 RESTART = 0xFF };