diff --git a/.vscode/settings.json b/.vscode/settings.json
index 970fb6b8c..932d9fce9 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,7 +9,7 @@
},
"eslint.nodePath": "interface/.yarn/sdks",
"eslint.workingDirectories": ["interface"],
- "prettier.prettierPath": "interface/.yarn/sdks/prettier/index.js",
+ "prettier.prettierPath": "",
"typescript.tsdk": "interface/.yarn/sdks/typescript/lib",
"typescript.enablePromptUseWorkspaceTsdk": true,
"files.associations": {
@@ -28,5 +28,18 @@
"utility": "cpp",
"string": "cpp",
"string_view": "cpp"
- }
+ },
+ "todo-tree.filtering.excludeGlobs": [
+ "**/vendor/**",
+ "**/node_modules/**",
+ "**/dist/**",
+ "**/bower_components/**",
+ "**/build/**",
+ "**/.vscode/**",
+ "**/.github/**",
+ "**/_output/**",
+ "**/*.min.*",
+ "**/*.map",
+ "**/ArduinoJson/**"
+ ]
}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 1e14f946b..edcb3abc1 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -4,20 +4,15 @@
"version": "2.0.0",
"tasks": [
{
- "label": "PlatformIO: Execute EMS-ESP (standalone)",
"type": "shell",
- "command": "./.pio/build/standalone/program",
- "linux": {
- "options": {
- "env": {
- // Workaround for sdl2 `-m32` crash
- // https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7
- "DBUS_FATAL_WARNINGS": "0"
- }
- }
- },
- "dependsOn": ["PlatformIO: Build EMS-ESP (standalone)"],
- "problemMatcher": []
+ "label": "build standalone emsesp",
+ "command": "make",
+ "args": [],
+ "problemMatcher": ["$gcc"],
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
}
]
}
diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 59a8636de..c3ffd1eff 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -4,32 +4,52 @@
## **IMPORTANT! BREAKING CHANGES**
-There are breaking changes in 3.6.0. Please read carefully before applying the update.
+There are breaking changes between 3.5.x and earlier versions of 3.6.0. Please read carefully before applying the update.
-- The sensors have been renamed. `dallassensor` is now `temperaturesensor` in MQTT and `ts` in the Customizations file. Also `analogs` is now `analogsensor` in MQTT and `as` in the Customizations file. If you have customizations, make backup first using the Download option and rename the JSON arrays to `as` and `ts` respectively. Also removed any MQTT topics that start with `dallassensor` using something like MQTTExplorer.
-- The format of the Custom Entities has changed, so you will need to manually re-create them.
+- The sensors have been renamed. `dallassensor` is now `temperaturesensor` in the MQTT topic and named `ts` in the Customizations file. Likewise `analogs` is now `analogsensor` in MQTT and called `as` in the Customizations file. If you have previous customizations you will need to manually update by downloading, changing the JSON file and uploading. It's also recommended cleaning up any old MQTT topics from your broker using an application like MQTTExplorer.
## Added
- Workaround for better Domoticz MQTT intergration? [#904](https://github.com/emsesp/EMS-ESP32/issues/904)
+- Show MAC address without connecting to network enhancement [#933](https://github.com/emsesp/EMS-ESP32/issues/933)
- Warn user in WebUI of unsaved changes [#911](https://github.com/emsesp/EMS-ESP32/issues/911)
- Detect old Tado thermostat, device-id 0x19, no entities
- Some more HM200 entities [#500](https://github.com/emsesp/EMS-ESP32/issues/500)
-- Custom Scheduler [#701](https://github.com/emsesp/EMS-ESP32/issues/701)
-- Custom Entities read from EMS bus
+- Added Scheduler [#701](https://github.com/emsesp/EMS-ESP32/issues/701)
+- Added Custom Entities read/write from EMS bus
- Build S3 binary with github actions
- Greenstar HIU [#1158](https://github.com/emsesp/EMS-ESP32/issues/1158)
- AM200 code 10 [#1161](https://github.com/emsesp/EMS-ESP32/issues/1161)
-- Ventilation device [#1172](https://github.com/emsesp/EMS-ESP32/issues/1172)
+- Ventilation device (Logavent HRV176) [#1172](https://github.com/emsesp/EMS-ESP32/issues/1172)
- Turn ETH off on wifi connect [#1167](https://github.com/emsesp/EMS-ESP32/issues/1167)
- Support for multiple EMS-ESPs with HA [#1196](https://github.com/emsesp/EMS-ESP32/issues/1196)
- Italian translation [#1199](https://github.com/emsesp/EMS-ESP32/issues/1199)
+- Turkish language support [#1076](https://github.com/emsesp/EMS-ESP32/issues/1076)
+- Buderus GB182 - HC1 mode change not work bug [#1193](https://github.com/emsesp/EMS-ESP32/issues/1193)
+- Minimal flow temperature enhancement [#1192](https://github.com/emsesp/EMS-ESP32/issues/1192)
+- Roomtemperature Switching Difference enhancement [#1191](https://github.com/emsesp/EMS-ESP32/issues/1191)
+- Dew Point Temperature Difference enhancement [#1190](https://github.com/emsesp/EMS-ESP32/issues/1190)
+- Control of heating circuit mode enhancement [#1187](https://github.com/emsesp/EMS-ESP32/issues/1187)
+- Warn user in WebUI of unsaved changes enhancement [#911](https://github.com/emsesp/EMS-ESP32/issues/911)
+- Create safebuild app to fit into factory partition to give ESP32 more flash memory enhancement [#608](https://github.com/emsesp/EMS-ESP32/issues/608)
+- Support ESP32 S2, C3 mini and S3 [#605](https://github.com/emsesp/EMS-ESP32/issues/605)
+- Support Buderus AM200 [#1161](https://github.com/emsesp/EMS-ESP32/issues/1161)
+- Custom telegram handler [#1155](https://github.com/emsesp/EMS-ESP32/issues/1155)
+- Added support for TLS in MQTT (ESP32-S3 only) [#1178](https://github.com/emsesp/EMS-ESP32/issues/1178)
+- Boardprofile BBQKees Gateway S3
+- Custom entity type RAW [#1212](https://github.com/emsesp/EMS-ESP32/discussions/1212)
+- API command response [#1212](https://github.com/emsesp/EMS-ESP32/discussions/1212)
## Fixed
- HA-discovery for analog sensor commands [#1035](https://github.com/emsesp/EMS-ESP32/issues/1035)
- Enum order of RC3x nofrost mode
- Heartbeat interval
+- Exhaust temperature always zero on GB125/MC110/RC310 bug [#1147](https://github.com/emsesp/EMS-ESP32/issues/1147)
+- thermostat modetype is not changing when mode changes (e.g. to night) bugSomething isn't working [#1098](https://github.com/emsesp/EMS-ESP32/issues/1098)
+- NTP: cant apply changed timezone [#1182](https://github.com/emsesp/EMS-ESP32/issues/1182)
+- Missing Status of VS1 for Buderus SM200 enhancement [#1034](https://github.com/emsesp/EMS-ESP32/issues/1034)
+- Allowed gpios for S3
## Changed
@@ -38,9 +58,13 @@ There are breaking changes in 3.6.0. Please read carefully before applying the u
- Write repeated selflowtemp if tx-queue is empty without verify [#954](https://github.com/emsesp/EMS-ESP32/issues/954)
- HA discovery recreate after disconnect by device [#1067](https://github.com/emsesp/EMS-ESP32/issues/1067)
- File upload: check flash size (overflow) instead of filesize
-- Improved HA Discovery so previous configs no longer need to be removed when starting [#1077](https://github.com/emsesp/EMS-ESP32/pull/1077) (thanks @pswid!)
+- Improved HA Discovery so previous configs no longer need to be removed when starting [#1077](https://github.com/emsesp/EMS-ESP32/pull/1077) (thanks @pswid)
- Enlarge UART-Stack to 2,5k
- Retry timeout for Mqtt-QOS1/2 10seconds
- Optimize WebUI rendering when using Dialog Boxes [#1116](https://github.com/emsesp/EMS-ESP32/issues/1116)
- Optimize Web libraries to reduce bundle size (3.6.x) [#1112](https://github.com/emsesp/EMS-ESP32/issues/1112)
- Use [espMqttClient](https://github.com/bertmelis/espMqttClient) with integrated queue [#1178](https://github.com/emsesp/EMS-ESP32/issues/1178)
+- Move Sensors from Web dashboard to it's own tab enhancement [#1170](https://github.com/emsesp/EMS-ESP32/issues/1170)
+- Optimize WebUI dashboard data [#1169](https://github.com/emsesp/EMS-ESP32/issues/1169)
+- Replace React core library with Preact to save on memory footprint
+- Response to `system/send` raw reads gives combined data for telegrams with more parts
diff --git a/Makefile b/Makefile
index d4dd85b3e..e39169edb 100644
--- a/Makefile
+++ b/Makefile
@@ -17,9 +17,9 @@ MAKEFLAGS+="j "
#TARGET := $(notdir $(CURDIR))
TARGET := emsesp
BUILD := build
-SOURCES := src src/* lib_standalone lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src src/devices lib/ArduinoJson/src lib/PButton lib/semver
-INCLUDES := src lib_standalone lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src lib/semver lib/* src/devices
-LIBRARIES :=
+SOURCES := src src/* lib_standalone lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src src/devices lib/ArduinoJson/src lib/PButton lib/semver lib/espMqttClient/src lib/espMqttClient/src/*
+INCLUDES := src lib_standalone lib/espMqttClient/src lib/espMqttClient/src/Transport lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src lib/semver lib/* src/devices
+LIBRARIES :=
CPPCHECK = cppcheck
# CHECKFLAGS = -q --force --std=c++17
@@ -28,16 +28,18 @@ CHECKFLAGS = -q --force --std=c++11
#----------------------------------------------------------------------
# Languages Standard
#----------------------------------------------------------------------
-# C_STANDARD := -std=c17
+C_STANDARD := -std=c17
# CXX_STANDARD := -std=c++17
-C_STANDARD := -std=c11
-CXX_STANDARD := -std=c++11
+CXX_STANDARD := -std=gnu++11
+
+# C_STANDARD := -std=c11
+# CXX_STANDARD := -std=c++11
#----------------------------------------------------------------------
# Defined Symbols
#----------------------------------------------------------------------
-DEFINES += -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0 -DARDUINO
-DEFINES += -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_TEST
+DEFINES += -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0
+DEFINES += -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_TEST -D__linux__ -DEMC_RX_BUFFER_SIZE=1500
DEFINES += $(ARGS)
DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.6.0-dev\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
@@ -52,7 +54,7 @@ CSOURCES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c))
CXXSOURCES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.cpp))
OBJS := $(patsubst %,$(BUILD)/%.o,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)) )
-DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)) )
+DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)) )
INCLUDE += $(addprefix -I,$(foreach dir,$(INCLUDES), $(wildcard $(dir))))
INCLUDE += $(addprefix -I,$(foreach dir,$(LIBRARIES),$(wildcard $(dir)/include)))
@@ -79,7 +81,7 @@ CPPFLAGS += -g3
CPPFLAGS += -Os
CFLAGS += $(CPPFLAGS)
-CFLAGS += -Wall -Wextra -Werror -Wswitch-enum -Wno-unused-parameter -Wno-inconsistent-missing-override -Wno-unused-lambda-capture
+CFLAGS += -Wall -Wextra -Werror -Wswitch-enum -Wno-unused-parameter -Wno-inconsistent-missing-override -Wno-missing-braces -Wno-unused-lambda-capture
CXXFLAGS += $(CFLAGS) -MMD
diff --git a/esp32_asym_partition_4M.csv b/esp32_asym_partition_4M.csv
index f87875c3a..d40ca870e 100644
--- a/esp32_asym_partition_4M.csv
+++ b/esp32_asym_partition_4M.csv
@@ -1,6 +1,6 @@
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, , 0x2000,
-app1, app, ota_1, , 0x140000,
app0, app, ota_0, , 0x2A0000,
+app1, app, ota_1, , 0x140000,
spiffs, data, spiffs, , 64K,
\ No newline at end of file
diff --git a/interface/.eslintrc.json b/interface/.eslintrc.json
index 4fc97f6f7..4f147e5a7 100644
--- a/interface/.eslintrc.json
+++ b/interface/.eslintrc.json
@@ -41,6 +41,7 @@
"@typescript-eslint/consistent-type-definitions": ["off", "type"],
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/no-unsafe-call": "off",
+ "@typescript-eslint/no-unsafe-enum-comparison": "off",
"@typescript-eslint/no-unsafe-assignment": "off",
"@typescript-eslint/no-unsafe-return": "off",
"@typescript-eslint/no-unsafe-member-access": "off",
diff --git a/interface/.typesafe-i18n.json b/interface/.typesafe-i18n.json
index 45ebe9985..8a0922461 100644
--- a/interface/.typesafe-i18n.json
+++ b/interface/.typesafe-i18n.json
@@ -1,5 +1,5 @@
{
"adapter": "react",
"baseLocale": "pl",
- "$schema": "https://unpkg.com/typesafe-i18n@5.24.3/schema/typesafe-i18n.json"
+ "$schema": "https://unpkg.com/typesafe-i18n@5.25.1/schema/typesafe-i18n.json"
}
diff --git a/interface/index.html b/interface/index.html
index 602add36a..462186dc0 100644
--- a/interface/index.html
+++ b/interface/index.html
@@ -1,4 +1,4 @@
-
+
diff --git a/interface/package.json b/interface/package.json
index 070182828..9f64fb72c 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -20,55 +20,56 @@
},
"dependencies": {
"@alova/adapter-xhr": "^1.0.1",
- "@alova/scene-react": "^1.1.3",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
- "@mui/icons-material": "^5.11.16",
- "@mui/material": "^5.13.6",
+ "@mui/icons-material": "^5.14.1",
+ "@mui/material": "^5.14.2",
+ "@preact/compat": "^17.1.2",
"@table-library/react-table-library": "4.1.4",
- "@types/lodash-es": "^4.17.7",
- "@types/node": "^20.3.3",
- "@types/react": "^18.2.14",
- "@types/react-dom": "^18.2.6",
+ "@types/lodash-es": "^4.17.8",
+ "@types/node": "^20.4.5",
+ "@types/react": "^18.2.17",
+ "@types/react-dom": "^18.2.7",
"@types/react-router-dom": "^5.3.3",
- "alova": "^2.9.1",
+ "alova": "^2.9.3",
"async-validator": "^4.2.5",
"history": "^5.3.0",
"jwt-decode": "^3.1.2",
"lodash-es": "^4.17.21",
"mime-types": "^2.1.35",
+ "preact": "^10.16.0",
"react": "latest",
"react-dom": "latest",
"react-dropzone": "^14.2.3",
"react-icons": "^4.10.1",
- "react-router-dom": "^6.14.1",
+ "react-router-dom": "^6.14.2",
"react-toastify": "^9.1.3",
"sockette": "^2.0.6",
- "typesafe-i18n": "^5.24.3",
+ "typesafe-i18n": "^5.25.1",
"typescript": "^5.1.6"
},
"devDependencies": {
- "@types/mime-types": "^2",
- "@typescript-eslint/eslint-plugin": "^5.60.1",
- "@typescript-eslint/parser": "^5.60.1",
- "@vitejs/plugin-react-swc": "^3.3.2",
- "eslint": "^8.44.0",
+ "@preact/preset-vite": "^2.5.0",
+ "@typescript-eslint/eslint-plugin": "^6.2.0",
+ "@typescript-eslint/parser": "^6.2.0",
+ "cspell": "^6.31.2",
+ "eslint": "^8.46.0",
"eslint-config-airbnb": "^19.0.4",
- "eslint-config-airbnb-typescript": "^17.0.0",
- "eslint-config-prettier": "^8.8.0",
+ "eslint-config-airbnb-typescript": "^17.1.0",
+ "eslint-config-prettier": "^8.9.0",
"eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-autofix": "^1.1.0",
- "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-import": "^2.28.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-react": "^7.32.2",
+ "eslint-plugin-prettier": "alpha",
+ "eslint-plugin-react": "^7.33.0",
"eslint-plugin-react-hooks": "^4.6.0",
- "nodemon": "^2.0.22",
+ "nodemon": "^3.0.1",
"npm-run-all": "^4.1.5",
- "prettier": "^2.8.8",
+ "prettier": "^3.0.0",
"rollup-plugin-visualizer": "^5.9.2",
- "terser": "^5.18.2",
- "vite": "^4.3.9",
+ "terser": "^5.19.2",
+ "vite": "^4.4.7",
"vite-plugin-svgr": "^3.2.0",
"vite-tsconfig-paths": "^4.2.0"
},
diff --git a/interface/public/css/roboto.css b/interface/public/css/roboto.css
index 0c05736a7..36f599b8a 100644
--- a/interface/public/css/roboto.css
+++ b/interface/public/css/roboto.css
@@ -1,5 +1,5 @@
/*
-* Uses font-size 400 (normal) only and Latin (plus extra unicode chars) to keep flash memory to a minimun
+* Uses font-size 400 (normal) only and Latin (plus extra unicode chars) to keep flash memory to a minimum
* View fonts on https://fonts.google.com/
* Download woff2 using e.g. https://fonts.googleapis.com/css2?family=Lato or https://fonts.googleapis.com/css2?family=Roboto
*/
@@ -8,7 +8,10 @@
font-style: normal;
font-weight: 400;
/* src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); */
- src: local('Roboto'), local('Roboto-Regular'), url(../fonts/re.woff2) format('woff2');
+ src:
+ local('Roboto'),
+ local('Roboto-Regular'),
+ url(../fonts/re.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0104-0107, U+0118-0119, U+011E-011F, U+0130-0131, U+0141-0144, U+0152-0153, U+015A-015B,
U+015E-015F, U+0179-017C, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193,
U+2212, U+2215, U+FEFF, U+FFFD;
diff --git a/interface/src/App.tsx b/interface/src/App.tsx
index 77f79e41d..f69032319 100644
--- a/interface/src/App.tsx
+++ b/interface/src/App.tsx
@@ -4,6 +4,7 @@ import { ToastContainer, Slide } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.min.css';
import { localStorageDetector } from 'typesafe-i18n/detectors';
+import { FeaturesLoader } from './contexts/features';
import type { FC } from 'react';
import AppRouting from 'AppRouting';
import CustomTheme from 'CustomTheme';
@@ -26,7 +27,9 @@ const App: FC = () => {
return (
-
+
+
+
(
- // TODO not sure if this is needed, to redirect on 401. If so add incerceptor to Alova
// const location = useLocation();
// const navigate = useNavigate();
// const handleApiResponseError = useCallback(
diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx
index 5513da4ae..e0fa88551 100644
--- a/interface/src/SignIn.tsx
+++ b/interface/src/SignIn.tsx
@@ -3,6 +3,7 @@ import { Box, Fab, Paper, Typography, Button } from '@mui/material';
import { useRequest } from 'alova';
import { useContext, useState } from 'react';
import { toast } from 'react-toastify';
+import { FeaturesContext } from './contexts/features';
import type { ValidateFieldsError } from 'async-validator';
import type { Locales } from 'i18n/i18n-types';
@@ -33,6 +34,8 @@ const SignIn: FC = () => {
const { LL, setLocale, locale } = useContext(I18nContext);
+ const { features } = useContext(FeaturesContext);
+
const [signInRequest, setSignInRequest] = useState({
username: '',
password: ''
@@ -55,7 +58,7 @@ const SignIn: FC = () => {
const signIn = async () => {
await callSignIn(signInRequest).catch((event) => {
if (event.message === 'Unauthorized') {
- toast.warn(LL.INVALID_LOGIN());
+ toast.warning(LL.INVALID_LOGIN());
} else {
toast.error(LL.ERROR() + ' ' + event.message);
}
@@ -107,6 +110,7 @@ const SignIn: FC = () => {
})}
>
{PROJECT_NAME}
+ {features.version}
{
}
}}
>
-
+
>
);
diff --git a/interface/src/framework/system/UploadFileForm.tsx b/interface/src/framework/system/UploadFileForm.tsx
index 4414be0fb..6403c37fd 100644
--- a/interface/src/framework/system/UploadFileForm.tsx
+++ b/interface/src/framework/system/UploadFileForm.tsx
@@ -53,8 +53,10 @@ const UploadFileForm: FC = () => {
await sendUpload(files[0]).catch((err) => {
if (err.message === 'The user aborted a request') {
toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED());
+ } else if (err.message === 'Network Error') {
+ toast.warning('Invalid file extension or incompatible bin file');
} else {
- toast.warning(err.message);
+ toast.error(err.message);
}
});
};
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 3acac78c8..dfbab3705 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -45,9 +45,9 @@ const de: Translation = {
CHANGE_VALUE: 'Wert ändern',
CANCEL: 'Abbrechen',
RESET: 'Zurücksetzen',
- APPLY_CHANGES: 'Apply Changes ({0})', // TODO translate
- UPDATE: 'Update', // TODO translate
- EXECUTE: 'Execute', // TODO translate
+ APPLY_CHANGES: 'Änderungen anwenden ({0})',
+ UPDATE: 'Update',
+ EXECUTE: 'Ausführen',
REMOVE: 'Entfernen',
PROBLEM_UPDATING: 'Problem beim Aktualisieren',
PROBLEM_LOADING: 'Problem beim Laden',
@@ -180,7 +180,7 @@ const de: Translation = {
LOG_OF: '{0} Log',
STATUS_OF: '{0} Status',
UPLOAD_DOWNLOAD: 'Hoch-/Herunterladen',
- VERSION_ON: 'You are currently on', // TODO translate
+ VERSION_ON: 'Sie verwenden derzeit',
SYSTEM_APPLY_FIRMWARE: 'um die neue Firmware anzuwenden',
CLOSE: 'Schließen',
USE: 'Verwenden Sie',
@@ -240,7 +240,7 @@ const de: Translation = {
MQTT_PUBLISH_TEXT_2: 'Veröffentliche als Kommando-Topic (ioBroker)',
MQTT_PUBLISH_TEXT_3: 'Aktiviere `MQTT Discovery`',
MQTT_PUBLISH_TEXT_4: 'Prefix für die `Discovery`-Topics',
- MQTT_PUBLISH_TEXT_5: 'Discovery type', // TODO translate
+ MQTT_PUBLISH_TEXT_5: 'Discovery Typ',
MQTT_PUBLISH_INTERVALS: 'Veröffentlichungs-Intervalle',
MQTT_INT_BOILER: 'Boiler und Wärmepumpen',
MQTT_INT_THERMOSTATS: 'Thermostate',
@@ -282,7 +282,7 @@ const de: Translation = {
SCAN_AGAIN: 'Erneute Suche',
NETWORK_SCANNER: 'Netzwerk Suche',
NETWORK_NO_WIFI: 'Keine WiFi Netzwerke gefunden',
- NETWORK_BLANK_SSID: 'Freilassen um WiFi zu deaktivieren',
+ NETWORK_BLANK_SSID: 'Freilassen um WiFi zu deaktivieren und ETH zu aktivieren',
TX_POWER: 'Tx Leistung',
HOSTNAME: 'Hostname',
NETWORK_DISABLE_SLEEP: 'Deaktiviere WiFi Schlafmodus',
@@ -319,10 +319,11 @@ const de: Translation = {
SCHEDULE_TIMER_3: 'jede Stunde',
CUSTOM_ENTITIES: 'Individuelle Entitäten',
ENTITIES_HELP_1: 'Abfrage von Werten auf dem EMS-Bus',
- ENTITIES_UPDATED: 'Entities Updated', // TODO translate
+ ENTITIES_UPDATED: 'Entitäten gespeichert',
WRITEABLE: 'Schreibbar',
- SHOWING: 'Showing', // TODO translate
- SEARCH: 'Search' // TODO translate
+ SHOWING: 'Anzeigen von',
+ SEARCH: 'Suche',
+ CERT: 'TSL Zertifikat (Freilassen um TSL zu deaktivieren)'
};
export default de;
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index 83d123376..4a2486a55 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -282,7 +282,7 @@ const en: Translation = {
SCAN_AGAIN: 'Scan again',
NETWORK_SCANNER: 'Network Scanner',
NETWORK_NO_WIFI: 'No WiFi networks found',
- NETWORK_BLANK_SSID: 'leave blank to disable WiFi',
+ NETWORK_BLANK_SSID: 'leave blank to disable WiFi and enable ETH',
TX_POWER: 'Tx Power',
HOSTNAME: 'Hostname',
NETWORK_DISABLE_SLEEP: 'Disable WiFi Sleep Mode',
@@ -322,8 +322,8 @@ const en: Translation = {
ENTITIES_UPDATED: 'Entities Updated',
WRITEABLE: 'Writeable',
SHOWING: 'Showing',
- SEARCH: 'Search'
-
+ SEARCH: 'Search',
+ CERT: 'TSL root certificate (leave blank to disable TSL)'
};
export default en;
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index 390407573..965803614 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -282,7 +282,7 @@ const fr: Translation = {
SCAN_AGAIN: 'Rescanner',
NETWORK_SCANNER: 'Scan réseau',
NETWORK_NO_WIFI: 'Pas de réseau WiFi trouvé',
- NETWORK_BLANK_SSID: 'laisser vide pour désactiver le WiFi',
+ NETWORK_BLANK_SSID: 'laisser vide pour désactiver le WiFi', // and enable ETH // TODO translate
TX_POWER: 'Puissance Tx',
HOSTNAME: 'Nom d\'hôte',
NETWORK_DISABLE_SLEEP: 'Désactiver le mode veille du WiFi',
@@ -322,7 +322,8 @@ const fr: Translation = {
ENTITIES_UPDATED: 'Entities Updated', // TODO translate
WRITEABLE: 'Writeable', // TODO translate
SHOWING: 'Showing', // TODO translate
- SEARCH: 'Search' // TODO translate
+ SEARCH: 'Search', // TODO translate
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default fr;
diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts
index 8293e7c3a..f122a8fec 100644
--- a/interface/src/i18n/it/index.ts
+++ b/interface/src/i18n/it/index.ts
@@ -45,13 +45,13 @@ const it: Translation = {
CHANGE_VALUE: 'Cambia Valore',
CANCEL: 'Annulla',
RESET: 'Reset',
- APPLY_CHANGES: 'Apply Changes ({0})',
+ APPLY_CHANGES: 'Applica Cambiamenti ({0})',
UPDATE: 'Update',
EXECUTE: 'Execute',
REMOVE: 'Elimina',
PROBLEM_UPDATING: 'Problema aggiornamento',
PROBLEM_LOADING: 'Problema caricamento',
- ACCESS_DENIED: 'Access Denied',
+ ACCESS_DENIED: 'Accesso Negato',
ANALOG_SENSOR: 'Sensore Analogico',
ANALOG_SENSORS: 'Sensori Analogici',
SETTINGS: 'Settings',
@@ -305,27 +305,27 @@ const it: Translation = {
ENTITY: 'entità',
MIN: 'min',
MAX: 'max',
- BLOCK_NAVIGATE_1: 'You have unsaved changes',
- BLOCK_NAVIGATE_2: 'If you navigate to a different page, your unsaved changes will be lost. Are you sure you want to leave this page?',
- STAY: 'Stay',
- LEAVE: 'Leave',
- SCHEDULER: 'Scheduler',
- SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT.',
- SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up',
- SCHEDULE: 'Schedule',
- TIME: 'Time',
- TIMER: 'Timer',
- SCHEDULE_UPDATED: 'Schedule updated',
- SCHEDULE_TIMER_1: 'on startup',
- SCHEDULE_TIMER_2: 'every minute',
- SCHEDULE_TIMER_3: 'every hour',
- CUSTOM_ENTITIES: 'Custom Entities',
- ENTITIES_HELP_1: 'Fetch custom entities from the EMS bus',
- ENTITIES_UPDATED: 'Entities Updated',
- WRITEABLE: 'Writeable',
- SHOWING: 'Showing',
- SEARCH: 'Search'
-
+ BLOCK_NAVIGATE_1: 'Hai modifiche non salvate',
+ BLOCK_NAVIGATE_2: 'Se passi a una pagina diversa, le modifiche non salvate andranno perse. Sei sicuro di voler lasciare questa pagina?',
+ STAY: 'Stai',
+ LEAVE: 'Esci',
+ SCHEDULER: 'Programma eventi',
+ SCHEDULER_HELP_1: "Automatizza i comandi aggiungendo gli eventi programmati di seguito. Imposta un nome univoco per abilitare/disabilitare l'attivazione tramite API/MQTT.",
+ SCHEDULER_HELP_2: "per attivare una volta all'avvio",
+ SCHEDULE: 'Programma',
+ TIME: 'Ora',
+ TIMER: 'Orologio',
+ SCHEDULE_UPDATED: 'Calendario aggiornato',
+ SCHEDULE_TIMER_1: 'All avvio',
+ SCHEDULE_TIMER_2: 'Ogni minuto',
+ SCHEDULE_TIMER_3: 'Ogni ora',
+ CUSTOM_ENTITIES: 'Entità personalizzate',
+ ENTITIES_HELP_1: 'Recupera entità personalizzate dal BUS EMS',
+ ENTITIES_UPDATED: 'Entità aggiornate',
+ WRITEABLE: 'Scrivibile',
+ SHOWING: 'Visualizza',
+ SEARCH: 'Ricerca',
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default it;
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index 80957c9e0..1464dfcb5 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -282,7 +282,7 @@ const nl: Translation = {
SCAN_AGAIN: 'Opnieuw scannen',
NETWORK_SCANNER: 'Netwerk Scanner',
NETWORK_NO_WIFI: 'Geen WiFi networken gevonden',
- NETWORK_BLANK_SSID: 'laat leeg om WiFi uit te schakelen',
+ NETWORK_BLANK_SSID: 'laat leeg om WiFi uit te schakelen', // and enable ETH // TODO translate
TX_POWER: 'Tx Vermogen',
HOSTNAME: 'Hostname',
NETWORK_DISABLE_SLEEP: 'WiFi Sleep Mode uitzetten',
@@ -322,7 +322,8 @@ const nl: Translation = {
ENTITIES_UPDATED: 'Entiteiten bijgewerkt',
WRITEABLE: 'Beschrijfbare',
SHOWING: 'Tonen',
- SEARCH: 'Zoek'
+ SEARCH: 'Zoek',
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default nl;
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index 21bc1346a..dd4f51318 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -282,7 +282,7 @@ const no: Translation = {
SCAN_AGAIN: 'Søk igjen',
NETWORK_SCANNER: 'Nettverk Scanner',
NETWORK_NO_WIFI: 'Ingen trådløse nett funnet',
- NETWORK_BLANK_SSID: 'la feltet være blankt for å deaktivisere trådløst nettverk',
+ NETWORK_BLANK_SSID: 'la feltet være blankt for å deaktivisere trådløst nettverk', // TODO translate
TX_POWER: 'Tx Effekt',
HOSTNAME: 'Hostname',
NETWORK_DISABLE_SLEEP: 'Hindre at trådløst nettverk går i Sleep Mode',
@@ -322,8 +322,8 @@ const no: Translation = {
ENTITIES_UPDATED: 'Entities Updated', // TODO translate
WRITEABLE: 'Writeable', // TODO translate
SHOWING: 'Showing', // TODO translate
- SEARCH: 'Search' // TODO translate
-
+ SEARCH: 'Search', // TODO translate
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default no;
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index 5d46e4c4b..2073acb1f 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -282,7 +282,7 @@ const pl: BaseTranslation = {
SCAN_AGAIN: 'Skanuj ponownie',
NETWORK_SCANNER: 'Skaner sieci WiFi',
NETWORK_NO_WIFI: 'Brak sieci WiFi w zasięgu',
- NETWORK_BLANK_SSID: 'pozostaw puste aby wyłączyć WiFi',
+ NETWORK_BLANK_SSID: 'pozostaw puste aby wyłączyć WiFi', // and enable ETH // TODO translate
TX_POWER: 'Moc nadawania',
HOSTNAME: 'Nazwa w sieci',
NETWORK_DISABLE_SLEEP: 'Wyłącz tryb uśpienia WiFi',
@@ -322,8 +322,8 @@ const pl: BaseTranslation = {
ENTITIES_UPDATED: 'Niestandardowe encje zostały uaktualnione.',
WRITEABLE: 'zapisywalna',
SHOWING: 'Wyświetlane',
- SEARCH: 'Szukaj'
-
+ SEARCH: 'Szukaj',
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default pl;
diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts
index e34ddba92..2f6e27381 100644
--- a/interface/src/i18n/sv/index.ts
+++ b/interface/src/i18n/sv/index.ts
@@ -282,7 +282,7 @@ const sv: Translation = {
SCAN_AGAIN: 'Sök igen',
NETWORK_SCANNER: 'Hittade nätverk',
NETWORK_NO_WIFI: 'Inga WiFi-nätverk hittades',
- NETWORK_BLANK_SSID: 'lämna blankt för att inaktivera WiFi',
+ NETWORK_BLANK_SSID: 'lämna blankt för att inaktivera WiFi', // and enable ETH // TODO translate
TX_POWER: 'Tx Effekt',
HOSTNAME: 'Värdnamn',
NETWORK_DISABLE_SLEEP: 'Inaktivera sömnläge',
@@ -322,8 +322,8 @@ const sv: Translation = {
ENTITIES_UPDATED: 'Entities Updated', // TODO translate
WRITEABLE: 'Writeable', // TODO translate
SHOWING: 'Showing', // TODO translate
- SEARCH: 'Search' // TODO translate
-
+ SEARCH: 'Search', // TODO translate
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default sv;
diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts
index 44a5dab43..d046b2b85 100644
--- a/interface/src/i18n/tr/index.ts
+++ b/interface/src/i18n/tr/index.ts
@@ -282,7 +282,7 @@ const tr: Translation = {
SCAN_AGAIN: 'Tekrar tara',
NETWORK_SCANNER: 'Ağ Tarayıcısı',
NETWORK_NO_WIFI: 'Hiçbir Kablosuz Ağ bulunamadı',
- NETWORK_BLANK_SSID: 'Kablosuz ağı devre dışı bırakmak için boş bırakın',
+ NETWORK_BLANK_SSID: 'Kablosuz ağı devre dışı bırakmak için boş bırakın', // TODO translate
TX_POWER: 'Aktarım gücü',
HOSTNAME: 'Ana Makine Adı',
NETWORK_DISABLE_SLEEP: 'Kablosuz uyku modunu devre dışına al',
@@ -322,8 +322,8 @@ const tr: Translation = {
ENTITIES_UPDATED: 'Entities Updated', // TODO translate
WRITEABLE: 'Writeable', // TODO translate
SHOWING: 'Showing', // TODO translate
- SEARCH: 'Search' // TODO translate
-
+ SEARCH: 'Search', // TODO translate
+ CERT: 'TSL root certificate (leave blank to disable TSL)' // TODO translate
};
export default tr;
diff --git a/interface/src/project/SettingsApplication.tsx b/interface/src/project/SettingsApplication.tsx
index 13bcdc40c..8ac035068 100644
--- a/interface/src/project/SettingsApplication.tsx
+++ b/interface/src/project/SettingsApplication.tsx
@@ -377,8 +377,8 @@ const SettingsApplication: FC = () => {
margin="normal"
select
>
-
+
diff --git a/interface/src/project/SettingsEntitiesDialog.tsx b/interface/src/project/SettingsEntitiesDialog.tsx
index 5e16f627b..6d8d39511 100644
--- a/interface/src/project/SettingsEntitiesDialog.tsx
+++ b/interface/src/project/SettingsEntitiesDialog.tsx
@@ -17,7 +17,7 @@ import {
} from '@mui/material';
import { useEffect, useState } from 'react';
-import { DeviceValueUOM_s } from './types';
+import { DeviceValueUOM_s, DeviceValueType } from './types';
import type { EntityItem } from './types';
import type Schema from 'async-validator';
import type { ValidateFieldsError } from 'async-validator';
@@ -166,17 +166,18 @@ const SettingsEntitiesDialog = ({
fullWidth
select
>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
- {editItem.value_type !== 0 && (
+ {editItem.value_type !== DeviceValueType.BOOL && editItem.value_type !== DeviceValueType.STRING && (
<>
>
)}
+ {editItem.value_type === DeviceValueType.STRING && (
+
+
+
+ )}
diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts
index bdbbbd167..6cee45832 100644
--- a/interface/src/project/types.ts
+++ b/interface/src/project/types.ts
@@ -243,7 +243,8 @@ export const BOARD_PROFILES: BoardProfiles = {
OLIMEXPOE: 'Olimex ESP32-POE',
C3MINI: 'Wemos C3 Mini',
S2MINI: 'Wemos S2 Mini',
- S3MINI: 'Liligo S3'
+ S3MINI: 'Liligo S3',
+ S32S3: 'BBQKees Gateway S3'
};
export interface BoardProfile {
@@ -364,3 +365,17 @@ export const enum DeviceType {
CUSTOM,
UNKNOWN
}
+
+// matches emsdevicevalue.h
+export const enum DeviceValueType {
+ BOOL,
+ INT,
+ UINT,
+ SHORT,
+ USHORT,
+ ULONG,
+ TIME, // same as ULONG (32 bits)
+ ENUM,
+ STRING,
+ CMD
+}
diff --git a/interface/src/project/validators.ts b/interface/src/project/validators.ts
index cb4d93160..246c22a7f 100644
--- a/interface/src/project/validators.ts
+++ b/interface/src/project/validators.ts
@@ -8,7 +8,7 @@ export const GPIO_VALIDATOR = {
if (
value &&
(value === 1 ||
- (value >= 10 && value <= 12) ||
+ (value >= 6 && value <= 12) ||
(value >= 14 && value <= 15) ||
value === 20 ||
value === 24 ||
@@ -43,6 +43,23 @@ export const GPIO_VALIDATORS2 = {
}
};
+export const GPIO_VALIDATORS3 = {
+ validator(rule: InternalRuleItem, value: number, callback: (error?: string) => void) {
+ if (
+ value &&
+ ((value >= 19 && value <= 20) ||
+ (value >= 22 && value <= 37) ||
+ (value >= 39 && value <= 42) ||
+ value > 48 ||
+ value < 0)
+ ) {
+ callback('Must be an valid GPIO port');
+ } else {
+ callback();
+ }
+ }
+};
+
export const createSettingsValidator = (settings: Settings) =>
new Schema({
...(settings.board_profile === 'CUSTOM' &&
@@ -69,6 +86,14 @@ export const createSettingsValidator = (settings: Settings) =>
tx_gpio: [{ required: true, message: 'Tx GPIO is required' }, GPIO_VALIDATORS2],
rx_gpio: [{ required: true, message: 'Rx GPIO is required' }, GPIO_VALIDATORS2]
}),
+ ...(settings.board_profile === 'CUSTOM' &&
+ settings.platform === 'ESP32-S3' && {
+ led_gpio: [{ required: true, message: 'LED GPIO is required' }, GPIO_VALIDATORS3],
+ dallas_gpio: [{ required: true, message: 'GPIO is required' }, GPIO_VALIDATORS3],
+ pbutton_gpio: [{ required: true, message: 'Button GPIO is required' }, GPIO_VALIDATORS3],
+ tx_gpio: [{ required: true, message: 'Tx GPIO is required' }, GPIO_VALIDATORS3],
+ rx_gpio: [{ required: true, message: 'Rx GPIO is required' }, GPIO_VALIDATORS3]
+ }),
...(settings.syslog_enabled && {
syslog_host: [{ required: true, message: 'Host is required' }, IP_OR_HOSTNAME_VALIDATOR],
syslog_port: [
diff --git a/interface/src/types/features.ts b/interface/src/types/features.ts
index 1753d9abf..5ae80def2 100644
--- a/interface/src/types/features.ts
+++ b/interface/src/types/features.ts
@@ -1,8 +1,4 @@
export interface Features {
- project: boolean;
- security: boolean;
- mqtt: boolean;
- ntp: boolean;
- ota: boolean;
- upload_firmware: boolean;
+ version: string;
+ platform: string; // "ESP32-C3" "ESP32-S2" "ESP32-S3" "ESP32"
}
diff --git a/interface/src/types/mqtt.ts b/interface/src/types/mqtt.ts
index f82fa6c26..df9261f4a 100644
--- a/interface/src/types/mqtt.ts
+++ b/interface/src/types/mqtt.ts
@@ -1,12 +1,12 @@
export enum MqttDisconnectReason {
- TCP_DISCONNECTED = 0,
+ USER_OK = 0,
MQTT_UNACCEPTABLE_PROTOCOL_VERSION = 1,
MQTT_IDENTIFIER_REJECTED = 2,
MQTT_SERVER_UNAVAILABLE = 3,
MQTT_MALFORMED_CREDENTIALS = 4,
MQTT_NOT_AUTHORIZED = 5,
- ESP8266_NOT_ENOUGH_SPACE = 6,
- TLS_BAD_FINGERPRINT = 7
+ TLS_BAD_FINGERPRINT = 6,
+ TCP_DISCONNECTED = 7
}
export interface MqttStatus {
@@ -24,6 +24,7 @@ export interface MqttSettings {
host: string;
port: number;
base: string;
+ rootCA?: string;
username: string;
password: string;
client_id: string;
diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts
index a0de253f0..ec93ad757 100644
--- a/interface/src/types/network.ts
+++ b/interface/src/types/network.ts
@@ -15,7 +15,9 @@ export enum WiFiEncryptionType {
WIFI_AUTH_WPA_PSK = 2,
WIFI_AUTH_WPA2_PSK = 3,
WIFI_AUTH_WPA_WPA2_PSK = 4,
- WIFI_AUTH_WPA2_ENTERPRISE = 5
+ WIFI_AUTH_WPA2_ENTERPRISE = 5,
+ WIFI_AUTH_WPA3_PSK = 6,
+ WIFI_AUTH_WPA2_WPA3_PSK = 7
}
export interface NetworkStatus {
diff --git a/interface/vite.config.ts b/interface/vite.config.ts
index e2509f7eb..da8b1519c 100644
--- a/interface/vite.config.ts
+++ b/interface/vite.config.ts
@@ -1,21 +1,21 @@
import { defineConfig, type PluginOption } from 'vite';
-import react from '@vitejs/plugin-react-swc';
import viteTsconfigPaths from 'vite-tsconfig-paths';
import svgrPlugin from 'vite-plugin-svgr';
import { visualizer } from 'rollup-plugin-visualizer';
import ProgmemGenerator from './progmem-generator';
+import preact from '@preact/preset-vite';
export default defineConfig(({ command, mode }) => {
if (mode === 'hosted') {
return {
// hosted, ignore all errors, output to dist
- plugins: [react(), viteTsconfigPaths(), svgrPlugin(), visualizer({ gzipSize: true }) as PluginOption]
+ plugins: [preact(), viteTsconfigPaths(), svgrPlugin(), visualizer({ gzipSize: true }) as PluginOption]
};
} else {
// normal build
return {
plugins: [
- react(),
+ preact(),
viteTsconfigPaths(),
svgrPlugin(),
ProgmemGenerator({ outputPath: '../lib/framework/WWWData.h', bytesPerLine: 20 })
@@ -26,7 +26,25 @@ export default defineConfig(({ command, mode }) => {
chunkSizeWarningLimit: 1024,
sourcemap: false,
manifest: false,
- minify: mode === 'development' ? false : 'terser'
+ minify: mode === 'development' ? false : 'terser',
+ rollupOptions: {
+ /**
+ * Ignore "use client" waning since we are not using SSR
+ */
+ onwarn(warning, warn) {
+ if (warning.code === 'MODULE_LEVEL_DIRECTIVE' && warning.message.includes(`"use client"`)) {
+ return;
+ }
+ warn(warning);
+ }
+ }
+ },
+
+ onwarn(warning, warn) {
+ if (warning.code === 'MODULE_LEVEL_DIRECTIVE') {
+ return;
+ }
+ warn(warning);
},
server: {
diff --git a/interface/yarn.lock b/interface/yarn.lock
index 935a1a713..89f2219c1 100644
--- a/interface/yarn.lock
+++ b/interface/yarn.lock
@@ -19,13 +19,6 @@ __metadata:
languageName: node
linkType: hard
-"@alova/scene-react@npm:^1.1.3":
- version: 1.1.3
- resolution: "@alova/scene-react@npm:1.1.3"
- checksum: f318720b2dc0d85b5284cb352236000343f2399300ecee647b78d1ccb8d297e2a523394391eda04d4ab5d4a34e1ee411ad0547848530e35a8d362674685ff769
- languageName: node
- linkType: hard
-
"@ampproject/remapping@npm:^2.2.0":
version: 2.2.1
resolution: "@ampproject/remapping@npm:2.2.1"
@@ -45,60 +38,69 @@ __metadata:
languageName: node
linkType: hard
-"@babel/compat-data@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/compat-data@npm:7.22.5"
- checksum: 97f3c24a71b4e7d5f91c5807f6206a9cdb4123e595c51b34a19e9ea22b837003f969f732fde8819928d66e7b64047fd736c6717c8a1b96bf27fbfc30f6834aff
+"@babel/compat-data@npm:^7.22.6":
+ version: 7.22.6
+ resolution: "@babel/compat-data@npm:7.22.6"
+ checksum: 09971bda48c46e19d8f1d8c817ebd60ccca2ca30b90324ba6227cfa3765847a9ddd7730481ec81149a2270e2c90c2674e41ebbb73258e48c37922171ffe1e6dc
languageName: node
linkType: hard
-"@babel/core@npm:^7.21.3":
- version: 7.22.5
- resolution: "@babel/core@npm:7.22.5"
+"@babel/core@npm:^7.21.3, @babel/core@npm:^7.22.1":
+ version: 7.22.8
+ resolution: "@babel/core@npm:7.22.8"
dependencies:
"@ampproject/remapping": ^2.2.0
"@babel/code-frame": ^7.22.5
- "@babel/generator": ^7.22.5
- "@babel/helper-compilation-targets": ^7.22.5
+ "@babel/generator": ^7.22.7
+ "@babel/helper-compilation-targets": ^7.22.6
"@babel/helper-module-transforms": ^7.22.5
- "@babel/helpers": ^7.22.5
- "@babel/parser": ^7.22.5
+ "@babel/helpers": ^7.22.6
+ "@babel/parser": ^7.22.7
"@babel/template": ^7.22.5
- "@babel/traverse": ^7.22.5
+ "@babel/traverse": ^7.22.8
"@babel/types": ^7.22.5
+ "@nicolo-ribaudo/semver-v6": ^6.3.3
convert-source-map: ^1.7.0
debug: ^4.1.0
gensync: ^1.0.0-beta.2
json5: ^2.2.2
- semver: ^6.3.0
- checksum: c00e1474a41c18b669511dd1a1bd757d854cc8128218421a73c3b1c76b44fb22a57bbbd29a73b7a156cb1460af7a94602f81bed76b8d78c6ffae4de954b32a50
+ checksum: d506ac42eaf2f7c3c190cc91a1413bb9ae5c067e06268fa962cb5fd0e67fc0feb48c7fa51527da378e3cc3a92a13a3420bae877df89207d880c839b6bb73e662
languageName: node
linkType: hard
-"@babel/generator@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/generator@npm:7.22.5"
+"@babel/generator@npm:^7.22.7":
+ version: 7.22.7
+ resolution: "@babel/generator@npm:7.22.7"
dependencies:
"@babel/types": ^7.22.5
"@jridgewell/gen-mapping": ^0.3.2
"@jridgewell/trace-mapping": ^0.3.17
jsesc: ^2.5.1
- checksum: 0613eddb4d1f7d82d88ad304e1acf48fddc3cdfb4c94bc3d2a9128cf0cdeedc0aa8d60301715c3b67537c00d9c9c9d50aad4339e7af1295c90def21893b17f7f
+ checksum: 7eb106916d782d397d0d4370bb4b23229229481218693a55f3fc0b756d4e9dc39cee41872f1735decb0b34be8dbb98c4488d5f7abbf6e40826d5dcac045b1f12
languageName: node
linkType: hard
-"@babel/helper-compilation-targets@npm:^7.22.5":
+"@babel/helper-annotate-as-pure@npm:^7.22.5":
version: 7.22.5
- resolution: "@babel/helper-compilation-targets@npm:7.22.5"
+ resolution: "@babel/helper-annotate-as-pure@npm:7.22.5"
dependencies:
- "@babel/compat-data": ^7.22.5
+ "@babel/types": ^7.22.5
+ checksum: 5a80dc364ddda26b334bbbc0f6426cab647381555ef7d0cd32eb284e35b867c012ce6ce7d52a64672ed71383099c99d32765b3d260626527bb0e3470b0f58e45
+ languageName: node
+ linkType: hard
+
+"@babel/helper-compilation-targets@npm:^7.22.6":
+ version: 7.22.6
+ resolution: "@babel/helper-compilation-targets@npm:7.22.6"
+ dependencies:
+ "@babel/compat-data": ^7.22.6
"@babel/helper-validator-option": ^7.22.5
- browserslist: ^4.21.3
+ "@nicolo-ribaudo/semver-v6": ^6.3.3
+ browserslist: ^4.21.9
lru-cache: ^5.1.1
- semver: ^6.3.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: f36a2f27d970fa61b32090840ec847f73c6ada50becf7222c8778dd7ae07661c56f83d57e4c18437160e221512f91c442e3b86703741b45fc1277a548a6fd819
+ checksum: a37ae986bbfc61bc1adebe05a415ac03e0e8100e4b1ccbfd6ed90ffe201947beae9d7bd2cebe562199e1326797f908153d7b544520786eecf99fccb9db3c0fa9
languageName: node
linkType: hard
@@ -153,6 +155,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-plugin-utils@npm:^7.22.5":
+ version: 7.22.5
+ resolution: "@babel/helper-plugin-utils@npm:7.22.5"
+ checksum: d2c4bfe2fa91058bcdee4f4e57a3f4933aed7af843acfd169cd6179fab8d13c1d636474ecabb2af107dc77462c7e893199aa26632bac1c6d7e025a17cbb9d20d
+ languageName: node
+ linkType: hard
+
"@babel/helper-simple-access@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/helper-simple-access@npm:7.22.5"
@@ -162,12 +171,12 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-split-export-declaration@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/helper-split-export-declaration@npm:7.22.5"
+"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6":
+ version: 7.22.6
+ resolution: "@babel/helper-split-export-declaration@npm:7.22.6"
dependencies:
"@babel/types": ^7.22.5
- checksum: a1e463086f97778584c44129c5c37282d033bf97867b300ff42e64279df18d41fe0e56ebe6a1b27f907afa66ad2a313558db8d2e83e73384c5b22ac726c9c52a
+ checksum: d83e4b623eaa9622c267d3c83583b72f3aac567dc393dda18e559d79187961cb29ae9c57b2664137fc3d19508370b12ec6a81d28af73a50e0846819cb21c6e44
languageName: node
linkType: hard
@@ -192,14 +201,14 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helpers@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/helpers@npm:7.22.5"
+"@babel/helpers@npm:^7.22.6":
+ version: 7.22.6
+ resolution: "@babel/helpers@npm:7.22.6"
dependencies:
"@babel/template": ^7.22.5
- "@babel/traverse": ^7.22.5
+ "@babel/traverse": ^7.22.6
"@babel/types": ^7.22.5
- checksum: efa2d0fc2107e270782a784af3a52e5e0b97187b7b34feeeeb00454bc322e802ff4007b22410c387c05580c793f517c4bafc8a6a3acfdb0e3a1b349728f270c4
+ checksum: 8c03c19802d0fcc78d00d1eaa9ddab28f97f0c78a5d570762800e86f08c6f41750ad61e20cdede977a56173edf85e7175f1fd804eb6ef817280f064d3a3ca514
languageName: node
linkType: hard
@@ -214,21 +223,58 @@ __metadata:
languageName: node
linkType: hard
-"@babel/parser@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/parser@npm:7.22.5"
+"@babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7":
+ version: 7.22.7
+ resolution: "@babel/parser@npm:7.22.7"
bin:
parser: ./bin/babel-parser.js
- checksum: d6a1b1e1f375cf7f81263c57f0b6d41d67e9f498d75960ec7ab62a194d7c232a125a951009edc0c991cb7d6cc6b78b006b15e1e8fb83e0de3fe0ceb6bf3d95ef
+ checksum: d2bdf212644c39de58f1216540ec5aca4a05ffbec07c904eaaef8575dd9546b55345b91dcc0d306be4adbb717401ce321027bac7e2f7babfd66794c96243bb79
languageName: node
linkType: hard
-"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7":
+"@babel/plugin-syntax-jsx@npm:^7.22.5":
version: 7.22.5
- resolution: "@babel/runtime@npm:7.22.5"
+ resolution: "@babel/plugin-syntax-jsx@npm:7.22.5"
+ dependencies:
+ "@babel/helper-plugin-utils": ^7.22.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: b56ceaa9c6adc17fadfb48e1c801d07797195df2a581489e33c8034950e12e7778de6e1e70d6bcf7c5c7ada6222fe6bad5746187ab280df435f5a2799c8dd0d8
+ languageName: node
+ linkType: hard
+
+"@babel/plugin-transform-react-jsx-development@npm:^7.16.7":
+ version: 7.22.5
+ resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5"
+ dependencies:
+ "@babel/plugin-transform-react-jsx": ^7.22.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 4d2e9e68383238feb873f6111df972df4a2ebf6256d6f787a8772241867efa975b3980f7d75ab7d750e7eaad4bd454e8cc6e106301fd7572dd389e553f5f69d2
+ languageName: node
+ linkType: hard
+
+"@babel/plugin-transform-react-jsx@npm:^7.14.9, @babel/plugin-transform-react-jsx@npm:^7.22.5":
+ version: 7.22.5
+ resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5"
+ dependencies:
+ "@babel/helper-annotate-as-pure": ^7.22.5
+ "@babel/helper-module-imports": ^7.22.5
+ "@babel/helper-plugin-utils": ^7.22.5
+ "@babel/plugin-syntax-jsx": ^7.22.5
+ "@babel/types": ^7.22.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: fa4e5b32233c41686a420ad97b07a8a8b6cec7d484e93d5917db460887ded5179a8a20867a5d56d962b5452535830c0c0f8bfdc7d55853369be1e51b6a79a14a
+ languageName: node
+ linkType: hard
+
+"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7":
+ version: 7.22.6
+ resolution: "@babel/runtime@npm:7.22.6"
dependencies:
regenerator-runtime: ^0.13.11
- checksum: 11dcaeecd2246857ccf22f939fcae28a58d29e410607bfa28b95d9b03e298a3e3df8a530e22637d5bfccfc1661fb39cc50c06b404b5d53454bd93889c7dd3eb8
+ checksum: 5a273e7d66586582041c68332028db5376d754d483422541fdc904e10474a6f8aef14dd3a5aabcbcb6daea87b64531cc4be993d2943557ede4a2613f5328a981
languageName: node
linkType: hard
@@ -243,21 +289,21 @@ __metadata:
languageName: node
linkType: hard
-"@babel/traverse@npm:^7.22.5":
- version: 7.22.5
- resolution: "@babel/traverse@npm:7.22.5"
+"@babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8":
+ version: 7.22.8
+ resolution: "@babel/traverse@npm:7.22.8"
dependencies:
"@babel/code-frame": ^7.22.5
- "@babel/generator": ^7.22.5
+ "@babel/generator": ^7.22.7
"@babel/helper-environment-visitor": ^7.22.5
"@babel/helper-function-name": ^7.22.5
"@babel/helper-hoist-variables": ^7.22.5
- "@babel/helper-split-export-declaration": ^7.22.5
- "@babel/parser": ^7.22.5
+ "@babel/helper-split-export-declaration": ^7.22.6
+ "@babel/parser": ^7.22.7
"@babel/types": ^7.22.5
debug: ^4.1.0
globals: ^11.1.0
- checksum: 0217ec5ece6e4e3b6fd39dc4a23903d2d8ec76a7163731ae51a8cca03a450fb592782d620b8525219a5df9268b22901f3328a23440646d5ec2db4e3952817121
+ checksum: 839014824c210388ed46f92bf5265522bd5bbb4a9a03c700f9d79b151bdd0aa077c2f6448a0cef41132188cc2bc6d8cdcad98a297ba59983401e882bdc256b1f
languageName: node
linkType: hard
@@ -272,6 +318,428 @@ __metadata:
languageName: node
linkType: hard
+"@cspell/cspell-bundled-dicts@npm:6.31.2":
+ version: 6.31.2
+ resolution: "@cspell/cspell-bundled-dicts@npm:6.31.2"
+ dependencies:
+ "@cspell/dict-ada": ^4.0.1
+ "@cspell/dict-aws": ^3.0.0
+ "@cspell/dict-bash": ^4.1.1
+ "@cspell/dict-companies": ^3.0.9
+ "@cspell/dict-cpp": ^5.0.2
+ "@cspell/dict-cryptocurrencies": ^3.0.1
+ "@cspell/dict-csharp": ^4.0.2
+ "@cspell/dict-css": ^4.0.5
+ "@cspell/dict-dart": ^2.0.2
+ "@cspell/dict-django": ^4.0.2
+ "@cspell/dict-docker": ^1.1.6
+ "@cspell/dict-dotnet": ^5.0.0
+ "@cspell/dict-elixir": ^4.0.2
+ "@cspell/dict-en-common-misspellings": ^1.0.2
+ "@cspell/dict-en-gb": 1.1.33
+ "@cspell/dict-en_us": ^4.3.2
+ "@cspell/dict-filetypes": ^3.0.0
+ "@cspell/dict-fonts": ^3.0.2
+ "@cspell/dict-fullstack": ^3.1.5
+ "@cspell/dict-gaming-terms": ^1.0.4
+ "@cspell/dict-git": ^2.0.0
+ "@cspell/dict-golang": ^6.0.1
+ "@cspell/dict-haskell": ^4.0.1
+ "@cspell/dict-html": ^4.0.3
+ "@cspell/dict-html-symbol-entities": ^4.0.0
+ "@cspell/dict-java": ^5.0.5
+ "@cspell/dict-k8s": ^1.0.1
+ "@cspell/dict-latex": ^4.0.0
+ "@cspell/dict-lorem-ipsum": ^3.0.0
+ "@cspell/dict-lua": ^4.0.1
+ "@cspell/dict-node": ^4.0.2
+ "@cspell/dict-npm": ^5.0.5
+ "@cspell/dict-php": ^4.0.1
+ "@cspell/dict-powershell": ^5.0.1
+ "@cspell/dict-public-licenses": ^2.0.2
+ "@cspell/dict-python": ^4.0.2
+ "@cspell/dict-r": ^2.0.1
+ "@cspell/dict-ruby": ^5.0.0
+ "@cspell/dict-rust": ^4.0.1
+ "@cspell/dict-scala": ^5.0.0
+ "@cspell/dict-software-terms": ^3.1.6
+ "@cspell/dict-sql": ^2.1.0
+ "@cspell/dict-svelte": ^1.0.2
+ "@cspell/dict-swift": ^2.0.1
+ "@cspell/dict-typescript": ^3.1.1
+ "@cspell/dict-vue": ^3.0.0
+ checksum: 266a6a5da4d1e0f1eecefcb1066d54d795e8bfdf8aab29efacb1819c9db0c9493eb8b66c301f72961d25434ec65ad412c64b25a590a529d908e37edd3da8368a
+ languageName: node
+ linkType: hard
+
+"@cspell/cspell-pipe@npm:6.31.1":
+ version: 6.31.1
+ resolution: "@cspell/cspell-pipe@npm:6.31.1"
+ checksum: 8f7fb655b5ec5a2677ba15db09409a02af512331d4b21845d4996029ed618aaf1a445d27f5666b403bb1b2ce0073c2ed695f65a5d68ad9c5b22b246eb670d5e8
+ languageName: node
+ linkType: hard
+
+"@cspell/cspell-service-bus@npm:6.31.1":
+ version: 6.31.1
+ resolution: "@cspell/cspell-service-bus@npm:6.31.1"
+ checksum: d162d71c6bc18b6153d4ba24c665a52365a143a84f6b9648fdeda19390c980c428e075f48727c649cc01816e9debe34230a0cb74ed30e952f175724ff797428c
+ languageName: node
+ linkType: hard
+
+"@cspell/cspell-types@npm:6.31.1":
+ version: 6.31.1
+ resolution: "@cspell/cspell-types@npm:6.31.1"
+ checksum: c9da2b95fdb27571cdf720b8d768264b64888cdac575e80dc5882201594c9a07910478610a38fee1685e702e9705b757996fb771ca2d3a775a8fff42cb3e4aa3
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-ada@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "@cspell/dict-ada@npm:4.0.1"
+ checksum: 82a02bc475e929a7ecd7987d0288b6b7e736389279b9d6d00bc85b17e89212da484fb218e15c0d9053c2d08bf3ec90748feec60fc6acdd3000e3b8bfff4f6947
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-aws@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "@cspell/dict-aws@npm:3.0.0"
+ checksum: 8812e2bc7519d6b781042898afc0f4207a66301ad42043a9022d6ac658a6e47f54368bf2b62b42f7053af8045243730c49f817137b588020bba5afdb8ddf9b90
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-bash@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "@cspell/dict-bash@npm:4.1.1"
+ checksum: 5c541857694b5904951af0a94bcd81ed3acc7695b0943db9c4da2338be4d328dd09be7fd7f354fa29f8a7a1f32c8d111d5735cb0f9cbadd9c77a4c421dfa2a4f
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-companies@npm:^3.0.9":
+ version: 3.0.17
+ resolution: "@cspell/dict-companies@npm:3.0.17"
+ checksum: a3ec1a91896566c873eac934f3867f92e6ede7e721f9daa87691430e5333f320063384a746e67bd01c04775c5a16fc0c2f5907a01ad5315e23d6c29d9cf6e7f6
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-cpp@npm:^5.0.2":
+ version: 5.0.3
+ resolution: "@cspell/dict-cpp@npm:5.0.3"
+ checksum: 16f72cc1de6c2874fe3c85c51d17782f0a04f3a8f4a51934b9cde072fec9d83b93495f7e9423f84fae0c1306f118b13a5fba7cf9a8b3727bd51d0fac1f65ff43
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-cryptocurrencies@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "@cspell/dict-cryptocurrencies@npm:3.0.1"
+ checksum: 698413437600666c25e8821730390bbd082253f615318bb2fdd7665810ddc9d97e6ca85fbf3c34c317dc3357de9f8dfedea61c95dca78a6759f897d85369fa65
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-csharp@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "@cspell/dict-csharp@npm:4.0.2"
+ checksum: 146b7edeb8aa1acf6b0ccb283a2a5e0e8f2612e6fc67cca9b26e0fabe954a92042d314860bb5418522d6db265bd5933b6c68004d2b8225ad89498bf795b51f89
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-css@npm:^4.0.5":
+ version: 4.0.6
+ resolution: "@cspell/dict-css@npm:4.0.6"
+ checksum: 3cdbb8b102ec6cff63b85c970dca2c62027089e80a0cbe92bacd40ca55e987727a404ed67bb8042fdc852748c350ab79e1cc03749cf4042e4ed8b3855b9c4dc6
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-dart@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "@cspell/dict-dart@npm:2.0.2"
+ checksum: be0a571ce8f662a1a2599e348b0f699fec6e7f111ce20c4705837d35fdbefc14409cff4d6104fb8c2a2fc09e44141d7487059cdc315b1447c5248c9a1124d469
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-data-science@npm:^1.0.0":
+ version: 1.0.7
+ resolution: "@cspell/dict-data-science@npm:1.0.7"
+ checksum: e1f13c9a812f2a96c18fe936be8f68ecc09122ee2479df23c9088d4b4352123d03336ac7a8797575fc418438cefb995f947792dec0bf46a005035a600ac5d256
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-django@npm:^4.0.2":
+ version: 4.1.0
+ resolution: "@cspell/dict-django@npm:4.1.0"
+ checksum: 85b7f58d772f169f7471f2c1bcb8a0207cdff7c32677bf470bcbcc74ce6498269623cfcc7910730eeac7f052633f8d4c63574367c1afe5f46a2917748ed397ca
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-docker@npm:^1.1.6":
+ version: 1.1.6
+ resolution: "@cspell/dict-docker@npm:1.1.6"
+ checksum: ee81e2a6a8bf6d7a44269089ef704acd98253db7fe078419da8b2e956249c9ba9574f934e7d4880ac49fb9401a8a12e8f8752ad5972b3292f52b1c757c9eadd9
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-dotnet@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "@cspell/dict-dotnet@npm:5.0.0"
+ checksum: b55e2457f134aa99f9037c58a4441bb1e6b50a8ac399833b775517e14c84b84cf01e2ca8b75a93bccdc75ff9f656a4b0433c4bd82bfe830227848fc5a30ce1b4
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-elixir@npm:^4.0.2":
+ version: 4.0.3
+ resolution: "@cspell/dict-elixir@npm:4.0.3"
+ checksum: c24b742b0615f310c89a05ded6648a63ee8e0a9d63326fd155846ce4acba2337a1cef3f58d653b9d8f4b6636d466dfeac2bf7122f374ae39a4d539894ebc5523
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-en-common-misspellings@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "@cspell/dict-en-common-misspellings@npm:1.0.2"
+ checksum: f7f0207fc93150b63a0ce3df6127ec56360832262bdd93ea9618b6bb9b254917a2e5d58868837cfbc411811ce48d7b7e22bd580cc312221cab04f72066e51e9e
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-en-gb@npm:1.1.33":
+ version: 1.1.33
+ resolution: "@cspell/dict-en-gb@npm:1.1.33"
+ checksum: 09563d1016f652dc8164a5f692be49beb78a847a54d5e470d406ae4db125bf8021db75d3db63f7a0c1d1b7a5dfbec4b709fb2ff3520447dcad690adb98d74130
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-en_us@npm:^4.3.2":
+ version: 4.3.4
+ resolution: "@cspell/dict-en_us@npm:4.3.4"
+ checksum: 623b1751e0bee2792236c4785d5d37162354df1b0ca4d03e028ce8cd564e903e2faffdfab3b595526f957a88235574a55f6c5349dc3d4955c905137197775dbb
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-filetypes@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "@cspell/dict-filetypes@npm:3.0.1"
+ checksum: 0cb4141360af43202460c573a12e900d79f285c58e9a3744e1339499ef47acc94984019681bc384ce135333cdce9ec10aa89600b7e2e6f3dbc741f69e4c2dd0e
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-fonts@npm:^3.0.2":
+ version: 3.0.2
+ resolution: "@cspell/dict-fonts@npm:3.0.2"
+ checksum: 69efaa7455242d0a5b62a6e8d0347429a73d3035a205d53025951207768e6950e76166c45f3dd130879ed2ee2c76d9902995cb603cae8a9ad6d2019015666c25
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-fullstack@npm:^3.1.5":
+ version: 3.1.5
+ resolution: "@cspell/dict-fullstack@npm:3.1.5"
+ checksum: c6e02b9ac3cafee8e2fe913b725cb0fa9cb7ac35b5ec331160e1d4ec9c47237f12638a2b5637fd6b2933662ee9b6b1d1c524a9035df109e25fbacc6032ded6c4
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-gaming-terms@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "@cspell/dict-gaming-terms@npm:1.0.4"
+ checksum: 8ea51cb6a0b3c1f54ac4da9c97cfe007ddc2343382f8bc0c719df1dd9efe14d1d8178f4507884e7c780397775f6df5685d86544a069b6aff00e07e45889aa966
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-git@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "@cspell/dict-git@npm:2.0.0"
+ checksum: 3a14c96aaae224af32f1262cff81e30835727c633e3398ba54f3cfbf84719a1ff2a89a3833b842fc8aad0d9ae08c94cc186f4ac7684ad12a1f6500e595c1da6b
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-golang@npm:^6.0.1":
+ version: 6.0.2
+ resolution: "@cspell/dict-golang@npm:6.0.2"
+ checksum: d9b8dceb4376fb1411a8a6fd9e342934291afed68745e986b2a01116fb0951a460e1077e6826987c2752dc97dbfe169725efc7d43c8ca11d53f98a9bcc9f7fc2
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-haskell@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "@cspell/dict-haskell@npm:4.0.1"
+ checksum: 7693a06b74a393aec35b67304ae56dad1ce3509951bec64053d992011e0309e9c420edd13a073ab3e500c0ac53e15dd92472097d689f7602c6d9ad10a2ee0dab
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-html-symbol-entities@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@cspell/dict-html-symbol-entities@npm:4.0.0"
+ checksum: 35d3223f02f0d091ac6a93424d4c31a075ece530bee00853ee1f5827e5ed25d08407a522a3c747cbfbaa891333df3aa9cf6107a21f2a030667f74228655c9081
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-html@npm:^4.0.3":
+ version: 4.0.3
+ resolution: "@cspell/dict-html@npm:4.0.3"
+ checksum: 12c457c8aaebe05fa226fc4abfa800b95ccfd95b6f10009907be399a1dd5a80648948a8795fa56f9ca42dc86ed90788f097bd02521bb85147926233b22231646
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-java@npm:^5.0.5":
+ version: 5.0.5
+ resolution: "@cspell/dict-java@npm:5.0.5"
+ checksum: 5d71a08a5353986c16cabe454f6b704da8db76dd79ac36b5ac702f3ab406340bd8f7e63bb643ea0a8d2310a1a228e2956a848eb39ab4ef5e210e4e651da0e24f
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-k8s@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "@cspell/dict-k8s@npm:1.0.1"
+ checksum: b8f86905c6bf130bac1587d027bfc83d490c16be9a7f89d2fc0ee96c7f5915011a23f8bd4ff9d22ed7a2568662880875a2c70fe1554af3f662d7f08f2d2bc8a7
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-latex@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "@cspell/dict-latex@npm:4.0.0"
+ checksum: d96392866378e680d2fe29770bb8f38b1abad8c2b5b29e003bdbfe7aee79de1841fe699b6e357629e7b94dbaf882fd33e5e316d066be7fc02f0cea6caa8dcde4
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-lorem-ipsum@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "@cspell/dict-lorem-ipsum@npm:3.0.0"
+ checksum: 0eb2f6c199d74123d3c29c0c7352ce2ab4cbba85c6ff45882bede108a69d8bd156f591a191a822ed2a5b7e7067355f7358456f7c39e27e81b3bedf2932997279
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-lua@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "@cspell/dict-lua@npm:4.0.1"
+ checksum: e959948d5f4414aa617725bd756899a7f9fb07dce0c1dcfb7932747af759807f548d7bb1d54a207e349f08905e4aaf2ed9965c2194db486a599be18144ac7cdd
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-node@npm:^4.0.2":
+ version: 4.0.2
+ resolution: "@cspell/dict-node@npm:4.0.2"
+ checksum: 3ecb62cfbba4711cfbed570b9d3c7526f4639231878f9962aa3e0c91284f3e02319cda872e8f31fe06c818247143f328bf414ace4922df49c0f70bd73301a229
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-npm@npm:^5.0.5":
+ version: 5.0.7
+ resolution: "@cspell/dict-npm@npm:5.0.7"
+ checksum: 8091ee94d531ee39c01f416fe5df68a661afe31b23be0ec8ec23b0c46fa05f7f86e343771dde026e43d5a07d129e2ab5942ab3119fa6c8450fc04fe66474d921
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-php@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "@cspell/dict-php@npm:4.0.1"
+ checksum: 41c31347f2f6c2692317dad65d402a215a718f73313a0ec1da8c2bcf13c829fa2db90b9ce702d30af9412020bf5a70c945a27e44af6e4ddf4e697a666deb742d
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-powershell@npm:^5.0.1":
+ version: 5.0.2
+ resolution: "@cspell/dict-powershell@npm:5.0.2"
+ checksum: 4068e8a1b3b2c4a3d0a1f8a4a87277ac9ae04cd539149b715c7ac75f2a63757670c6b527ec70d0361a2f2d85c1d4713acf8d154536121a9ac18f3ff81d899589
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-public-licenses@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "@cspell/dict-public-licenses@npm:2.0.2"
+ checksum: 5bcb6e2b0699326551995db0e7636adadedf609b40ad4f284fe1a4c076b41e67509120d974eaf244210116bcc8bd5d7f50014b4cef3c8bd207449b5337c2abf3
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-python@npm:^4.0.2":
+ version: 4.1.2
+ resolution: "@cspell/dict-python@npm:4.1.2"
+ dependencies:
+ "@cspell/dict-data-science": ^1.0.0
+ checksum: fdde2c495a26e926af1fcc888139c9699c555dd00bcbc09292be4b1932c2fdff6e3626afce18eddaaf3a91a9b1fc98c9bafc06ebe83a15a9712c0f017f7e6f33
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-r@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "@cspell/dict-r@npm:2.0.1"
+ checksum: c8eead19fed04ff748c8ac75c55c4cf32b0383b0b9d05a23299e7e5d2d6f0c33fe94ff4c73080fdbd5b7e2fcdeaf726373a993122ec35e3a8f2b61f202c4a837
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-ruby@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "@cspell/dict-ruby@npm:5.0.0"
+ checksum: d591ff318733421c958b80a8e8c7dc791ac0232b8b9e628c857aec45fa8ebaffc6242679f75b411b109753613d2bf2ff468e7e0ee1207bdc1f24d3669bcb82e3
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-rust@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "@cspell/dict-rust@npm:4.0.1"
+ checksum: 724441dbc769d67ab3eac9a7d7b5c2734158619d2fea65069a955f036894551f8d074f223a8dbad7e5f326b42a9b5e4341f976210708ef16c27e428c024dae35
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-scala@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "@cspell/dict-scala@npm:5.0.0"
+ checksum: 6ca476b07610b0602b8e0d4e8147418c4d6046bee2d0d7d9468fa57e84c305e93ab4a4a8eded7cbd660792bf22869c435a4f9dcfab41584ffa03f1884d27ae94
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-software-terms@npm:^3.1.6":
+ version: 3.2.0
+ resolution: "@cspell/dict-software-terms@npm:3.2.0"
+ checksum: f90977a6d6476b580c52d42b09f18c7d82dba2a247d23128dc533264c63d8f9157986aca8e2b25628c1700676858d7d8f9c62138495e92588555175ab9f0ad60
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-sql@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "@cspell/dict-sql@npm:2.1.0"
+ checksum: 284a0d876ca52e208649955a7cab1553cde3a86066bc36b1a1e44b64cda97eeb925a55bd8c8b8a2a724fe9ba8b281b5580c0350fc632023a9eece32e10aafc69
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-svelte@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "@cspell/dict-svelte@npm:1.0.2"
+ checksum: bd650fd25d2ea83808a69eb2a6cb7a5b82295c3dde1c334fc54ff439287c5bf13e3293397e2c45e8b2d1b69fd133e17f4eb920b64df2571c5a399ac1e206f551
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-swift@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "@cspell/dict-swift@npm:2.0.1"
+ checksum: e29ffc8379d50ef9397018c25b1be05177d4ecb1e18d3b97834f9edf0306af349b5593d7d93a7f2624616c1beeb35eb1e56560d351f459b776c3dd6b2c0ac601
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-typescript@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "@cspell/dict-typescript@npm:3.1.1"
+ checksum: c80ffb5fc16ac0fe5d9f58ca120df8e34a1d2d7afad8293df7fa5f9f6236e8340c47745ffb1559cba24122cb429aa7af63c5b8efeb4d59edd49d556afe4994fe
+ languageName: node
+ linkType: hard
+
+"@cspell/dict-vue@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "@cspell/dict-vue@npm:3.0.0"
+ checksum: 2995b912e26cf88cb6ec9728a9adc5b24a0243c001887d425b14a61ef2be22aca38fa99a84d7698d8982aef65c8db4abf583c3d916c2166b9e8d99cec80800cd
+ languageName: node
+ linkType: hard
+
+"@cspell/dynamic-import@npm:6.31.1":
+ version: 6.31.1
+ resolution: "@cspell/dynamic-import@npm:6.31.1"
+ dependencies:
+ import-meta-resolve: ^2.2.2
+ checksum: ba020bc5477e50649a4978f58eb830b3e4d8b3b003aa2cea2dc13c0b28032f64cb7b116ffe5157d905ab55c7a8b7641719995cda9152225688a49482309d5469
+ languageName: node
+ linkType: hard
+
+"@cspell/strong-weak-map@npm:6.31.1":
+ version: 6.31.1
+ resolution: "@cspell/strong-weak-map@npm:6.31.1"
+ checksum: f53acf74a065d33344b35fb81fde54a9cc2a899683f7062384e0050d219047fd41714f1bac2b892623cc64acacfa1fcf3ad4efdc93b99db85bac8999cc310cd7
+ languageName: node
+ linkType: hard
+
"@emotion/babel-plugin@npm:^11.11.0":
version: 11.11.0
resolution: "@emotion/babel-plugin@npm:11.11.0"
@@ -418,161 +886,161 @@ __metadata:
languageName: node
linkType: hard
-"@esbuild/android-arm64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/android-arm64@npm:0.17.19"
+"@esbuild/android-arm64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/android-arm64@npm:0.18.11"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
-"@esbuild/android-arm@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/android-arm@npm:0.17.19"
+"@esbuild/android-arm@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/android-arm@npm:0.18.11"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
-"@esbuild/android-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/android-x64@npm:0.17.19"
+"@esbuild/android-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/android-x64@npm:0.18.11"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
-"@esbuild/darwin-arm64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/darwin-arm64@npm:0.17.19"
+"@esbuild/darwin-arm64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/darwin-arm64@npm:0.18.11"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@esbuild/darwin-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/darwin-x64@npm:0.17.19"
+"@esbuild/darwin-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/darwin-x64@npm:0.18.11"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@esbuild/freebsd-arm64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/freebsd-arm64@npm:0.17.19"
+"@esbuild/freebsd-arm64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/freebsd-arm64@npm:0.18.11"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
-"@esbuild/freebsd-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/freebsd-x64@npm:0.17.19"
+"@esbuild/freebsd-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/freebsd-x64@npm:0.18.11"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
-"@esbuild/linux-arm64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-arm64@npm:0.17.19"
+"@esbuild/linux-arm64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-arm64@npm:0.18.11"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
-"@esbuild/linux-arm@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-arm@npm:0.17.19"
+"@esbuild/linux-arm@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-arm@npm:0.18.11"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@esbuild/linux-ia32@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-ia32@npm:0.17.19"
+"@esbuild/linux-ia32@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-ia32@npm:0.18.11"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
-"@esbuild/linux-loong64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-loong64@npm:0.17.19"
+"@esbuild/linux-loong64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-loong64@npm:0.18.11"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
-"@esbuild/linux-mips64el@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-mips64el@npm:0.17.19"
+"@esbuild/linux-mips64el@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-mips64el@npm:0.18.11"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
-"@esbuild/linux-ppc64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-ppc64@npm:0.17.19"
+"@esbuild/linux-ppc64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-ppc64@npm:0.18.11"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
-"@esbuild/linux-riscv64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-riscv64@npm:0.17.19"
+"@esbuild/linux-riscv64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-riscv64@npm:0.18.11"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
-"@esbuild/linux-s390x@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-s390x@npm:0.17.19"
+"@esbuild/linux-s390x@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-s390x@npm:0.18.11"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
-"@esbuild/linux-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/linux-x64@npm:0.17.19"
+"@esbuild/linux-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/linux-x64@npm:0.18.11"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
-"@esbuild/netbsd-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/netbsd-x64@npm:0.17.19"
+"@esbuild/netbsd-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/netbsd-x64@npm:0.18.11"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
-"@esbuild/openbsd-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/openbsd-x64@npm:0.17.19"
+"@esbuild/openbsd-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/openbsd-x64@npm:0.18.11"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
-"@esbuild/sunos-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/sunos-x64@npm:0.17.19"
+"@esbuild/sunos-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/sunos-x64@npm:0.18.11"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
-"@esbuild/win32-arm64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/win32-arm64@npm:0.17.19"
+"@esbuild/win32-arm64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/win32-arm64@npm:0.18.11"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@esbuild/win32-ia32@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/win32-ia32@npm:0.17.19"
+"@esbuild/win32-ia32@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/win32-ia32@npm:0.18.11"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@esbuild/win32-x64@npm:0.17.19":
- version: 0.17.19
- resolution: "@esbuild/win32-x64@npm:0.17.19"
+"@esbuild/win32-x64@npm:0.18.11":
+ version: 0.18.11
+ resolution: "@esbuild/win32-x64@npm:0.18.11"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
-"@eslint-community/eslint-utils@npm:^4.2.0":
+"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0":
version: 4.4.0
resolution: "@eslint-community/eslint-utils@npm:4.4.0"
dependencies:
@@ -583,16 +1051,23 @@ __metadata:
languageName: node
linkType: hard
-"@eslint-community/regexpp@npm:^4.4.0":
+"@eslint-community/regexpp@npm:^4.5.1":
version: 4.5.1
resolution: "@eslint-community/regexpp@npm:4.5.1"
checksum: d79cbd99cc4dcfbb17e8dd30a30bb5aec5da9c60b9471043f886f116615bb15f0d417cb0ca638cefedba0b4c67c339e2011b53d88264a4540775f042a5879e01
languageName: node
linkType: hard
-"@eslint/eslintrc@npm:^2.1.0":
- version: 2.1.0
- resolution: "@eslint/eslintrc@npm:2.1.0"
+"@eslint-community/regexpp@npm:^4.6.1":
+ version: 4.6.2
+ resolution: "@eslint-community/regexpp@npm:4.6.2"
+ checksum: da800788298f8419f4c4e04eaa4e3c97e7f57537e822e7b150de662e420e3d437816b863e490807bd0b00e715b0989f9d8864bf54357cbcfa84e4255b910789d
+ languageName: node
+ linkType: hard
+
+"@eslint/eslintrc@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "@eslint/eslintrc@npm:2.1.1"
dependencies:
ajv: ^6.12.4
debug: ^4.3.2
@@ -603,14 +1078,14 @@ __metadata:
js-yaml: ^4.1.0
minimatch: ^3.1.2
strip-json-comments: ^3.1.1
- checksum: 6ffbc3e7867b377754492539af0e2f5b55645a2c67279a70508fe09080bc76d49ba64b579e59a2a04014f84d0768301736fbcdd94c7b3ad4f0e648c32bf21e43
+ checksum: 104ec8997206eabc87de84b87a2852efce0ff98730d377061734da2554c79c9b6d417fbe66248ef5566a0501ef41fddec3a00f79b77731102903586a63b2ed34
languageName: node
linkType: hard
-"@eslint/js@npm:8.44.0":
- version: 8.44.0
- resolution: "@eslint/js@npm:8.44.0"
- checksum: ce7b966f8804228e4d5725d44d3c8fb7fc427176f077401323a02e082f628d207133a25704330e610ebe3254fdf1acb186f779d1242fd145a758fdcc4486a660
+"@eslint/js@npm:^8.46.0":
+ version: 8.46.0
+ resolution: "@eslint/js@npm:8.46.0"
+ checksum: 674c5800e4e9829322aa84195b23c59db326cb42190ac0284bdfe70b2442d544837f3006d8d8c166afaa86ab7072df1b77f7fdb43a60aa2bb1ede90d82e38540
languageName: node
linkType: hard
@@ -679,9 +1154,12 @@ __metadata:
linkType: hard
"@jridgewell/source-map@npm:^0.3.3":
- version: 0.3.4
- resolution: "@jridgewell/source-map@npm:0.3.4"
- checksum: 4b83e015c3df8552b303f0d7d3f46b9fc297ae08e67dfe621ccbacf2879193e0890c397668a75ec90444de701616905376b02305d1a762c813ca03e86b8d9def
+ version: 0.3.5
+ resolution: "@jridgewell/source-map@npm:0.3.5"
+ dependencies:
+ "@jridgewell/gen-mapping": ^0.3.0
+ "@jridgewell/trace-mapping": ^0.3.9
+ checksum: b985d9ebd833a21a6e9ace820c8a76f60345a34d9e28d98497c16b6e93ce1f131bff0abd45f8585f14aa382cce678ed680d628c631b40a9616a19cfbc2049b68
languageName: node
linkType: hard
@@ -709,14 +1187,14 @@ __metadata:
languageName: node
linkType: hard
-"@mui/base@npm:5.0.0-beta.5":
- version: 5.0.0-beta.5
- resolution: "@mui/base@npm:5.0.0-beta.5"
+"@mui/base@npm:5.0.0-beta.8":
+ version: 5.0.0-beta.8
+ resolution: "@mui/base@npm:5.0.0-beta.8"
dependencies:
- "@babel/runtime": ^7.22.5
+ "@babel/runtime": ^7.22.6
"@emotion/is-prop-valid": ^1.2.1
"@mui/types": ^7.2.4
- "@mui/utils": ^5.13.6
+ "@mui/utils": ^5.14.1
"@popperjs/core": ^2.11.8
clsx: ^1.2.1
prop-types: ^15.8.1
@@ -728,22 +1206,22 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 3d36edb5648e2e1dfd65f5c832650c0d394f96d5cee6ef638632a0cd3a6540eb654c453c4a168226bef33dc7616c7a7ac67c4a707403b1b4584b7c0f89d4db4f
+ checksum: 05274f58ca4ea78b7ca9bf7170d6333010a0ce4cd96c9d4ed7f0741e0c1e72b90327babd8a976af97bc1415beb37064a2fe38b7da8dd74cfddebf478cb3386bf
languageName: node
linkType: hard
-"@mui/core-downloads-tracker@npm:^5.13.4":
- version: 5.13.4
- resolution: "@mui/core-downloads-tracker@npm:5.13.4"
- checksum: f00f3d086df55531da600b2b58197c4c3d9b586129b00a72a14320492934c098fb1cb1c50a23ea394367c92cac869eab9588bb83885c163c3b0ba0e28c3815ec
+"@mui/core-downloads-tracker@npm:^5.14.2":
+ version: 5.14.2
+ resolution: "@mui/core-downloads-tracker@npm:5.14.2"
+ checksum: b4f8c6dceb7ac70529382676a6a47ad7336dee542f840fa754e685e9fdfecec8ce4bf44fe9338b475ac18437a14d395a930e78d3b8a1718f8d7fc0037b748688
languageName: node
linkType: hard
-"@mui/icons-material@npm:^5.11.16":
- version: 5.11.16
- resolution: "@mui/icons-material@npm:5.11.16"
+"@mui/icons-material@npm:^5.14.1":
+ version: 5.14.1
+ resolution: "@mui/icons-material@npm:5.14.1"
dependencies:
- "@babel/runtime": ^7.21.0
+ "@babel/runtime": ^7.22.6
peerDependencies:
"@mui/material": ^5.0.0
"@types/react": ^17.0.0 || ^18.0.0
@@ -751,20 +1229,20 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 22099e54ccf8aaf0b7972e4626686999048094b8d783b6e293682cdc4b92da6dbd158709dce24e459babf728b17b625a89f6df40ba8a8cd4a28c6279c7a6293b
+ checksum: 5a7bf10bf2b1cf2e73e8857e95d3252936c8a1a25c7797240cc378e37bf842ab3f5dae070f410a228798a6740d84c14f7ee6dad8cd6871cb56d1f1c6b51ce217
languageName: node
linkType: hard
-"@mui/material@npm:^5.13.6":
- version: 5.13.6
- resolution: "@mui/material@npm:5.13.6"
+"@mui/material@npm:^5.14.2":
+ version: 5.14.2
+ resolution: "@mui/material@npm:5.14.2"
dependencies:
- "@babel/runtime": ^7.22.5
- "@mui/base": 5.0.0-beta.5
- "@mui/core-downloads-tracker": ^5.13.4
- "@mui/system": ^5.13.6
+ "@babel/runtime": ^7.22.6
+ "@mui/base": 5.0.0-beta.8
+ "@mui/core-downloads-tracker": ^5.14.2
+ "@mui/system": ^5.14.1
"@mui/types": ^7.2.4
- "@mui/utils": ^5.13.6
+ "@mui/utils": ^5.14.1
"@types/react-transition-group": ^4.4.6
clsx: ^1.2.1
csstype: ^3.1.2
@@ -784,16 +1262,16 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 208dc3f77471d823ba83fac62c5752a5e5aadef983419b4dbd5756ac16c2ce91b3405e771dce33fcbbd51459a7ff65e8d02b08c2a46c812f0012dce3dbf93550
+ checksum: 093f433ee4a9ce33386f0272eaa8ac81052d529092a5d2e93f32d79c2163a466088709560e9be844a4e0c0a08e77c19428a81922e474a8948a5cff8cccd06617
languageName: node
linkType: hard
-"@mui/private-theming@npm:^5.13.1":
- version: 5.13.1
- resolution: "@mui/private-theming@npm:5.13.1"
+"@mui/private-theming@npm:^5.13.7":
+ version: 5.13.7
+ resolution: "@mui/private-theming@npm:5.13.7"
dependencies:
- "@babel/runtime": ^7.21.0
- "@mui/utils": ^5.13.1
+ "@babel/runtime": ^7.22.5
+ "@mui/utils": ^5.13.7
prop-types: ^15.8.1
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0
@@ -801,7 +1279,7 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
- checksum: 1242f90642ee68792b9e72e7bcae8a2dd00c2c0bdd9cd825d9f154263755a4c4e213daa752e7fe64062a082cd6f60875f06eb122181c06e6b73f4d9caf68b949
+ checksum: e38b0a441f55651767a8b29d767c9457d368ab0870f76d38d001fd127663796a219f8c50be79a71343faa798e1ae78b4b379d3c1e391fb0910b27fedf5ce3f70
languageName: node
linkType: hard
@@ -826,15 +1304,15 @@ __metadata:
languageName: node
linkType: hard
-"@mui/system@npm:^5.13.6":
- version: 5.13.6
- resolution: "@mui/system@npm:5.13.6"
+"@mui/system@npm:^5.14.1":
+ version: 5.14.1
+ resolution: "@mui/system@npm:5.14.1"
dependencies:
- "@babel/runtime": ^7.22.5
- "@mui/private-theming": ^5.13.1
+ "@babel/runtime": ^7.22.6
+ "@mui/private-theming": ^5.13.7
"@mui/styled-engine": ^5.13.2
"@mui/types": ^7.2.4
- "@mui/utils": ^5.13.6
+ "@mui/utils": ^5.14.1
clsx: ^1.2.1
csstype: ^3.1.2
prop-types: ^15.8.1
@@ -850,7 +1328,7 @@ __metadata:
optional: true
"@types/react":
optional: true
- checksum: 10d2e668a09429d55572aa62e033107ead4bb6edf9addb48c9f2aa1c937989f0d7c307f868c4a947408b43fac8ce4f0b3307396b4011a0c31d6c0b844ec0fbf4
+ checksum: f0ee733311a5320a45e3a6a017dc25d0e8a5c33b3cd2bb726fdd9caee05a712704613d9ad35362fbc2e072ede4c0d633a1219e2b807f2febba0d7ea13ea1d0e4
languageName: node
linkType: hard
@@ -866,18 +1344,42 @@ __metadata:
languageName: node
linkType: hard
-"@mui/utils@npm:^5.13.1, @mui/utils@npm:^5.13.6":
- version: 5.13.6
- resolution: "@mui/utils@npm:5.13.6"
+"@mui/utils@npm:^5.13.7":
+ version: 5.13.7
+ resolution: "@mui/utils@npm:5.13.7"
dependencies:
"@babel/runtime": ^7.22.5
"@types/prop-types": ^15.7.5
- "@types/react-is": ^18.2.0
+ "@types/react-is": ^18.2.1
prop-types: ^15.8.1
react-is: ^18.2.0
peerDependencies:
react: ^17.0.0 || ^18.0.0
- checksum: 9e82c91ed3ae47705f44ba5b31d50b7c8a9591c855d05764389d0c3cbb10687628e1ffd6af1e04e490d979c4d32c669ddd24bc72643f040550674919ab94a3ec
+ checksum: bb64e27e34166fe3e71cb390bce205f65ac03f0cd955fe0e75fe904976ad93bf33812ff284af45c76d888d97345359d7e325122c1e55559734cd0e521035029c
+ languageName: node
+ linkType: hard
+
+"@mui/utils@npm:^5.14.1":
+ version: 5.14.1
+ resolution: "@mui/utils@npm:5.14.1"
+ dependencies:
+ "@babel/runtime": ^7.22.6
+ "@types/prop-types": ^15.7.5
+ "@types/react-is": ^18.2.1
+ prop-types: ^15.8.1
+ react-is: ^18.2.0
+ peerDependencies:
+ react: ^17.0.0 || ^18.0.0
+ checksum: fb156bce01309affc313417fe1c8d6d486da1b76de11a6b233b8e422a757265d48981696701c098b4a8f30e11fdf4af2cde0cfda9f38ccd8cac7c4be5b5aeaaa
+ languageName: node
+ linkType: hard
+
+"@nicolo-ribaudo/semver-v6@npm:^6.3.3":
+ version: 6.3.3
+ resolution: "@nicolo-ribaudo/semver-v6@npm:6.3.3"
+ bin:
+ semver: bin/semver.js
+ checksum: 9ef70305fa9b03709805128611c0d95beec479cdd6f6b608386d6cee7a3d36f61e6f749378b60f1e5fca19fc58da7b06fccfe3540c0dbc40719731827d4eb1df
languageName: node
linkType: hard
@@ -925,16 +1427,16 @@ __metadata:
linkType: hard
"@pkgr/utils@npm:^2.3.1":
- version: 2.4.1
- resolution: "@pkgr/utils@npm:2.4.1"
+ version: 2.4.2
+ resolution: "@pkgr/utils@npm:2.4.2"
dependencies:
cross-spawn: ^7.0.3
- fast-glob: ^3.2.12
+ fast-glob: ^3.3.0
is-glob: ^4.0.3
open: ^9.1.0
picocolors: ^1.0.0
- tslib: ^2.5.0
- checksum: 0ddbb8265b508bcc4e020054960b88324212e1c4b697153211842b8e85167af430b2761459d5e0b5c960668987e92818343b2bec6ee9140b5b3f560d8e68bbfe
+ tslib: ^2.6.0
+ checksum: 7c3e68f6405a1d4c51f418d8d580e71d7bade2683d5db07e8413d8e57f7e389047eda44a2341f77a1b3085895fca7676a9d45e8812a58312524f8c4c65d501be
languageName: node
linkType: hard
@@ -945,10 +1447,87 @@ __metadata:
languageName: node
linkType: hard
-"@remix-run/router@npm:1.7.1":
- version: 1.7.1
- resolution: "@remix-run/router@npm:1.7.1"
- checksum: 4b0828529dfb2628e8e737c19bbb360dd373c0452803942611184a2ed304e39fe13996333edd05fda3c265875a78a7f31af743dbb098cbf1186105b76e10949f
+"@preact/compat@npm:^17.1.2":
+ version: 17.1.2
+ resolution: "@preact/compat@npm:17.1.2"
+ peerDependencies:
+ preact: "*"
+ checksum: b4fb246d8996222c3d090901e88fb376a014164ad81f3985786389e7559acbd81f72c829ad3ff6fcbf58346950c9f48eafd7fe993cc43ca3cd0574e90101c7e1
+ languageName: node
+ linkType: hard
+
+"@preact/preset-vite@npm:^2.5.0":
+ version: 2.5.0
+ resolution: "@preact/preset-vite@npm:2.5.0"
+ dependencies:
+ "@babel/plugin-transform-react-jsx": ^7.14.9
+ "@babel/plugin-transform-react-jsx-development": ^7.16.7
+ "@prefresh/vite": ^2.2.8
+ "@rollup/pluginutils": ^4.1.1
+ babel-plugin-transform-hook-names: ^1.0.2
+ debug: ^4.3.1
+ kolorist: ^1.2.10
+ resolve: ^1.20.0
+ peerDependencies:
+ "@babel/core": 7.x
+ vite: 2.x || 3.x || 4.x
+ checksum: 109f2a64717357f76685cd45ec1f709c2ba83e88a8dc485b39dec8cb1178eda765fe929b47d83690cbee1fa6181209f79ba4f7cbec15bcaa1cbb45730af8946a
+ languageName: node
+ linkType: hard
+
+"@prefresh/babel-plugin@npm:0.5.0":
+ version: 0.5.0
+ resolution: "@prefresh/babel-plugin@npm:0.5.0"
+ checksum: 71cbfb52f3f4e29c2cc6a3b7adee87ac7d9c074edfe2f87b3f90ab006123572fab6dd679aa125b8a94e4669578f172ef0b1732d0d6c2b2fc158d0c765a87b70f
+ languageName: node
+ linkType: hard
+
+"@prefresh/core@npm:^1.5.1":
+ version: 1.5.1
+ resolution: "@prefresh/core@npm:1.5.1"
+ peerDependencies:
+ preact: ^10.0.0
+ checksum: 7a1063a65911fbfcd5b02f34911875de5ffedb02ad4dda2bf9c519193ccb38f21b65ac3a2ba0bc4d8526c847b623013e0d2c1e7a58091aee33fc95ac40f4ad14
+ languageName: node
+ linkType: hard
+
+"@prefresh/utils@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "@prefresh/utils@npm:1.2.0"
+ checksum: 38cdc6cbb5e18df36996161214eb1097db3361cb0b6402a8012cbe500ba8fb5bcbdc39a687d3b6d67e99f6c340ed77d59f27ab167dfc1655eb4d783740d87d52
+ languageName: node
+ linkType: hard
+
+"@prefresh/vite@npm:^2.2.8":
+ version: 2.4.1
+ resolution: "@prefresh/vite@npm:2.4.1"
+ dependencies:
+ "@babel/core": ^7.22.1
+ "@prefresh/babel-plugin": 0.5.0
+ "@prefresh/core": ^1.5.1
+ "@prefresh/utils": ^1.2.0
+ "@rollup/pluginutils": ^4.2.1
+ peerDependencies:
+ preact: ^10.4.0
+ vite: ">=2.0.0"
+ checksum: 939b4667ed83acfff6a879c8bff78d028b85c74f9e1cde656cf344768b888f6ba6b9927ee5e5efeecfc877fc6e6088c4c252e3f476604aecedaaf83cdfef7c45
+ languageName: node
+ linkType: hard
+
+"@remix-run/router@npm:1.7.2":
+ version: 1.7.2
+ resolution: "@remix-run/router@npm:1.7.2"
+ checksum: 01b1b57cae81c2a87fd2125d19918073c5832171957b958c476fd2b95c9f80aef51b1e54cfbe05da123bd8f4517321b27e9905e4552364925dc5a308e6544cfb
+ languageName: node
+ linkType: hard
+
+"@rollup/pluginutils@npm:^4.1.1, @rollup/pluginutils@npm:^4.2.1":
+ version: 4.2.1
+ resolution: "@rollup/pluginutils@npm:4.2.1"
+ dependencies:
+ estree-walker: ^2.0.1
+ picomatch: ^2.2.2
+ checksum: 3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48
languageName: node
linkType: hard
@@ -1092,120 +1671,6 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-darwin-arm64@npm:1.3.67"
- conditions: os=darwin & cpu=arm64
- languageName: node
- linkType: hard
-
-"@swc/core-darwin-x64@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-darwin-x64@npm:1.3.67"
- conditions: os=darwin & cpu=x64
- languageName: node
- linkType: hard
-
-"@swc/core-linux-arm-gnueabihf@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.67"
- conditions: os=linux & cpu=arm
- languageName: node
- linkType: hard
-
-"@swc/core-linux-arm64-gnu@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-linux-arm64-gnu@npm:1.3.67"
- conditions: os=linux & cpu=arm64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@swc/core-linux-arm64-musl@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-linux-arm64-musl@npm:1.3.67"
- conditions: os=linux & cpu=arm64 & libc=musl
- languageName: node
- linkType: hard
-
-"@swc/core-linux-x64-gnu@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-linux-x64-gnu@npm:1.3.67"
- conditions: os=linux & cpu=x64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@swc/core-linux-x64-musl@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-linux-x64-musl@npm:1.3.67"
- conditions: os=linux & cpu=x64 & libc=musl
- languageName: node
- linkType: hard
-
-"@swc/core-win32-arm64-msvc@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-win32-arm64-msvc@npm:1.3.67"
- conditions: os=win32 & cpu=arm64
- languageName: node
- linkType: hard
-
-"@swc/core-win32-ia32-msvc@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-win32-ia32-msvc@npm:1.3.67"
- conditions: os=win32 & cpu=ia32
- languageName: node
- linkType: hard
-
-"@swc/core-win32-x64-msvc@npm:1.3.67":
- version: 1.3.67
- resolution: "@swc/core-win32-x64-msvc@npm:1.3.67"
- conditions: os=win32 & cpu=x64
- languageName: node
- linkType: hard
-
-"@swc/core@npm:^1.3.61":
- version: 1.3.67
- resolution: "@swc/core@npm:1.3.67"
- dependencies:
- "@swc/core-darwin-arm64": 1.3.67
- "@swc/core-darwin-x64": 1.3.67
- "@swc/core-linux-arm-gnueabihf": 1.3.67
- "@swc/core-linux-arm64-gnu": 1.3.67
- "@swc/core-linux-arm64-musl": 1.3.67
- "@swc/core-linux-x64-gnu": 1.3.67
- "@swc/core-linux-x64-musl": 1.3.67
- "@swc/core-win32-arm64-msvc": 1.3.67
- "@swc/core-win32-ia32-msvc": 1.3.67
- "@swc/core-win32-x64-msvc": 1.3.67
- peerDependencies:
- "@swc/helpers": ^0.5.0
- dependenciesMeta:
- "@swc/core-darwin-arm64":
- optional: true
- "@swc/core-darwin-x64":
- optional: true
- "@swc/core-linux-arm-gnueabihf":
- optional: true
- "@swc/core-linux-arm64-gnu":
- optional: true
- "@swc/core-linux-arm64-musl":
- optional: true
- "@swc/core-linux-x64-gnu":
- optional: true
- "@swc/core-linux-x64-musl":
- optional: true
- "@swc/core-win32-arm64-msvc":
- optional: true
- "@swc/core-win32-ia32-msvc":
- optional: true
- "@swc/core-win32-x64-msvc":
- optional: true
- peerDependenciesMeta:
- "@swc/helpers":
- optional: true
- checksum: e09135963d5e21607d4f6f4ba818353976c13252f4fe4d40f27715dd51d83996738496f9d9e0b0106700d6720e102dfcf74cb729614881660a909e3c2a5fae0a
- languageName: node
- linkType: hard
-
"@table-library/react-table-library@npm:4.1.4":
version: 4.1.4
resolution: "@table-library/react-table-library@npm:4.1.4"
@@ -1242,7 +1707,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/json-schema@npm:^7.0.9":
+"@types/json-schema@npm:^7.0.12":
version: 7.0.12
resolution: "@types/json-schema@npm:7.0.12"
checksum: 2c39946ae321fe42d085c61a85872a81bbee70f9b2054ad344e8811dfc478fdbaf1ebf5f2989bb87c895ba2dfc3b1dcba85db11e467bbcdc023708814207791c
@@ -1256,12 +1721,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/lodash-es@npm:^4.17.7":
- version: 4.17.7
- resolution: "@types/lodash-es@npm:4.17.7"
+"@types/lodash-es@npm:^4.17.8":
+ version: 4.17.8
+ resolution: "@types/lodash-es@npm:4.17.8"
dependencies:
"@types/lodash": "*"
- checksum: c3ecfcff9f6864efa1a5f0d3ec457db17536f05a3a7a1a3f1fb1052042ed3e9747b12cd1eddab14fbbe98aef7aec131aaaf71c2f4611725cb15dd42b9651a64d
+ checksum: 950771d406c842814dd22217adba5e01bd06b3c21e97900d3c3816f38580e132894400b5d83a7962645fa284d8478614bdcc50755255ad15024311b7b8ed8520
languageName: node
linkType: hard
@@ -1272,17 +1737,10 @@ __metadata:
languageName: node
linkType: hard
-"@types/mime-types@npm:^2":
- version: 2.1.1
- resolution: "@types/mime-types@npm:2.1.1"
- checksum: 131b33bfd89481f6a791996db9198c6c5ffccbb310e990d1dd9fab7a2287b5a0fd642bdd959a19281397c86f721498e09956e3892e5db17f93f38e726ca05008
- languageName: node
- linkType: hard
-
-"@types/node@npm:^20.3.3":
- version: 20.3.3
- resolution: "@types/node@npm:20.3.3"
- checksum: d172311e9e2d42e060eacb78ecdfd4e1596dbd1e54939bacf42003c84559bdcb5d7dbe539dc5262db4c8f408e21f3abd65435fec9bc0ff8968a3b32dafde0bbf
+"@types/node@npm:^20.4.5":
+ version: 20.4.5
+ resolution: "@types/node@npm:20.4.5"
+ checksum: ed414b8fea1b462cb7444464e18cf0786a11def8b863bcca52b0466992d04f701422f9fc3c33e0601444bfdbf9e18d8f4b163d35902758495b51e635b09fee64
languageName: node
linkType: hard
@@ -1300,16 +1758,16 @@ __metadata:
languageName: node
linkType: hard
-"@types/react-dom@npm:^18.2.6":
- version: 18.2.6
- resolution: "@types/react-dom@npm:18.2.6"
+"@types/react-dom@npm:^18.2.7":
+ version: 18.2.7
+ resolution: "@types/react-dom@npm:18.2.7"
dependencies:
"@types/react": "*"
- checksum: bd734ca04c52b3c96891a7f9c1139486807dac7a2449fb72e8f8e23018bc6eeeb87a490a105cb39d05ccb7ddf80ed7a441e5bd3e5866c6f6ae8870cd723599e8
+ checksum: bd090f5e1b13765fbc191d9eb720dd152d26c20558221963009189c4636ce11e4c1c976e4cde4a74335f997a2be651af27d3727474a8091424101a83a71eebfb
languageName: node
linkType: hard
-"@types/react-is@npm:^18.2.0":
+"@types/react-is@npm:^18.2.1":
version: 18.2.1
resolution: "@types/react-is@npm:18.2.1"
dependencies:
@@ -1348,7 +1806,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/react@npm:*, @types/react@npm:^18.2.14":
+"@types/react@npm:*":
version: 18.2.14
resolution: "@types/react@npm:18.2.14"
dependencies:
@@ -1359,6 +1817,17 @@ __metadata:
languageName: node
linkType: hard
+"@types/react@npm:^18.2.17":
+ version: 18.2.17
+ resolution: "@types/react@npm:18.2.17"
+ dependencies:
+ "@types/prop-types": "*"
+ "@types/scheduler": "*"
+ csstype: ^3.0.2
+ checksum: 3a90c1614765a03fc83408cfe7fd75a5284fad96014241654f59e64bf004bed81df3e757eff73310c8d332523e1d2b32230e35d9496f608a1ced93f9ca06a26e
+ languageName: node
+ linkType: hard
+
"@types/scheduler@npm:*":
version: 0.16.3
resolution: "@types/scheduler@npm:0.16.3"
@@ -1366,142 +1835,133 @@ __metadata:
languageName: node
linkType: hard
-"@types/semver@npm:^7.3.12":
+"@types/semver@npm:^7.5.0":
version: 7.5.0
resolution: "@types/semver@npm:7.5.0"
checksum: ca4ba4642b5972b6e88e73c5bc02bbaceb8d76bce71748d86e3e95042d4e5a44603113a1dcd2cb9b73ad6f91f6e4ab73185eb41bbfc9c73b11f0ed3db3b7443a
languageName: node
linkType: hard
-"@typescript-eslint/eslint-plugin@npm:^5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/eslint-plugin@npm:5.60.1"
+"@typescript-eslint/eslint-plugin@npm:^6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/eslint-plugin@npm:6.2.0"
dependencies:
- "@eslint-community/regexpp": ^4.4.0
- "@typescript-eslint/scope-manager": 5.60.1
- "@typescript-eslint/type-utils": 5.60.1
- "@typescript-eslint/utils": 5.60.1
+ "@eslint-community/regexpp": ^4.5.1
+ "@typescript-eslint/scope-manager": 6.2.0
+ "@typescript-eslint/type-utils": 6.2.0
+ "@typescript-eslint/utils": 6.2.0
+ "@typescript-eslint/visitor-keys": 6.2.0
debug: ^4.3.4
- grapheme-splitter: ^1.0.4
- ignore: ^5.2.0
+ graphemer: ^1.4.0
+ ignore: ^5.2.4
+ natural-compare: ^1.4.0
natural-compare-lite: ^1.4.0
- semver: ^7.3.7
- tsutils: ^3.21.0
+ semver: ^7.5.4
+ ts-api-utils: ^1.0.1
peerDependencies:
- "@typescript-eslint/parser": ^5.0.0
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha
+ eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- checksum: 1861e7fde48019ecae9acbc654d24f746e6a375f11f6f924e2ff3c9aa52528744a003da14592fafdbc407cf58b8cf7d0e42c624f3de06cb7bee5d8a31879ed79
+ checksum: 8e130767c31063a8890ccb35ca3823e0a88f46d390069deba6a1170e7c1a04db60e34b7c287b0e9250fcaa67b1adc1c088e21d823c74e8b0404100c0434a4206
languageName: node
linkType: hard
-"@typescript-eslint/parser@npm:^5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/parser@npm:5.60.1"
+"@typescript-eslint/parser@npm:^6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/parser@npm:6.2.0"
dependencies:
- "@typescript-eslint/scope-manager": 5.60.1
- "@typescript-eslint/types": 5.60.1
- "@typescript-eslint/typescript-estree": 5.60.1
+ "@typescript-eslint/scope-manager": 6.2.0
+ "@typescript-eslint/types": 6.2.0
+ "@typescript-eslint/typescript-estree": 6.2.0
+ "@typescript-eslint/visitor-keys": 6.2.0
debug: ^4.3.4
peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- checksum: b44d041bb46908078df898ab1d8a0da0a58901caced0bb657af9d48c6bb54c090e565cc31d7526a27f25faeb25315fdec648873b2527feed043532a053914dd2
+ checksum: 65ecbe654251a78e4b5eaef7b4fd85907c5bcbecfa18d919a0ed03a91c5c0bc0ef899115a08d06bedbf873ac27c24c3ee53180a5e7cf7650d249267a76bb3bc9
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/scope-manager@npm:5.60.1"
+"@typescript-eslint/scope-manager@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/scope-manager@npm:6.2.0"
dependencies:
- "@typescript-eslint/types": 5.60.1
- "@typescript-eslint/visitor-keys": 5.60.1
- checksum: 50164675adb4850354a8e0297d498b59283eee961e10e0c00f9d664e03b464a9de4dc7a9d84c534c84df6ac3ea6f32238e2df9528374104bd66678b1ec9fbfec
+ "@typescript-eslint/types": 6.2.0
+ "@typescript-eslint/visitor-keys": 6.2.0
+ checksum: 3e4b795a74db5a1958dc052c47485ea6ccd0a291f10aec29e0b6a0e72511753fe47bcd266b6bc0fac092e5a399b06ea0ad1a3f421a14605f17e39e1228e4ba25
languageName: node
linkType: hard
-"@typescript-eslint/type-utils@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/type-utils@npm:5.60.1"
+"@typescript-eslint/type-utils@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/type-utils@npm:6.2.0"
dependencies:
- "@typescript-eslint/typescript-estree": 5.60.1
- "@typescript-eslint/utils": 5.60.1
+ "@typescript-eslint/typescript-estree": 6.2.0
+ "@typescript-eslint/utils": 6.2.0
debug: ^4.3.4
- tsutils: ^3.21.0
+ ts-api-utils: ^1.0.1
peerDependencies:
- eslint: "*"
+ eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- checksum: ef07f5c84636b8a9ff68dbc093ba6bce32d0e0f56831b214c2df3ff189502ae103c73bda7eb5e9f9ca21d3492dc851b7ac4b2cb83bdd6fbf5a9fe21068b404f4
+ checksum: 4e220b31dc440d113cc6bc7b26459b5700b41af2f33382b41ebaf24435c8c17cc778eedb45564856907350004884518f21c01a2df5005db4c88949ceb4044722
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/types@npm:5.60.1"
- checksum: 4be7654356f9b79fb942ae22196b518f30e20b07588355df22c85dfdcdaafe02f312b473de67af34fbb2283182d0d337aa65312f1117c6f8bf635cc427944c23
+"@typescript-eslint/types@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/types@npm:6.2.0"
+ checksum: e0cea1760e1f53fcc203db06c746137d3b77792d52b5e425977c82b6b0845ea700148db06c40ac20d57994739b2a8c45110a8be7fd4b46d7904fcd3f7b2a9c63
languageName: node
linkType: hard
-"@typescript-eslint/typescript-estree@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/typescript-estree@npm:5.60.1"
+"@typescript-eslint/typescript-estree@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/typescript-estree@npm:6.2.0"
dependencies:
- "@typescript-eslint/types": 5.60.1
- "@typescript-eslint/visitor-keys": 5.60.1
+ "@typescript-eslint/types": 6.2.0
+ "@typescript-eslint/visitor-keys": 6.2.0
debug: ^4.3.4
globby: ^11.1.0
is-glob: ^4.0.3
- semver: ^7.3.7
- tsutils: ^3.21.0
+ semver: ^7.5.4
+ ts-api-utils: ^1.0.1
peerDependenciesMeta:
typescript:
optional: true
- checksum: 09933d3c1b1bacf7e043d33a7e134489650fca7b7b965b633a1c526453f20478b38c4aa9b7c6da269d2a43f26608110d4c129eec917c4561431149dae82c3b9d
+ checksum: 32c834528772aa8813949d2a043583e581766e6e5ec0e2cb6fc70b2969d38a6a3730f82a32aedff0327892e46c6e7a54d0e7d2ff9f9ed95a83f80610c7cf8217
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/utils@npm:5.60.1"
+"@typescript-eslint/utils@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/utils@npm:6.2.0"
dependencies:
- "@eslint-community/eslint-utils": ^4.2.0
- "@types/json-schema": ^7.0.9
- "@types/semver": ^7.3.12
- "@typescript-eslint/scope-manager": 5.60.1
- "@typescript-eslint/types": 5.60.1
- "@typescript-eslint/typescript-estree": 5.60.1
- eslint-scope: ^5.1.1
- semver: ^7.3.7
+ "@eslint-community/eslint-utils": ^4.4.0
+ "@types/json-schema": ^7.0.12
+ "@types/semver": ^7.5.0
+ "@typescript-eslint/scope-manager": 6.2.0
+ "@typescript-eslint/types": 6.2.0
+ "@typescript-eslint/typescript-estree": 6.2.0
+ semver: ^7.5.4
peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- checksum: cb408bd67dd5be3a3585b67ac19f60e9feb309a56782924b314077f7dc77cb10e690fdb4a7ac643784e8fab30bc04d6f23935c1aed6d08233f8dd8604782ac27
+ eslint: ^7.0.0 || ^8.0.0
+ checksum: bd6f64d78a162590c04f0bd82983ad826b9b8bb12cabd31f81fc60c72028bf522a1c3971fe0054fba564512cba45467005174b8effe044975c595912f5f623a4
languageName: node
linkType: hard
-"@typescript-eslint/visitor-keys@npm:5.60.1":
- version: 5.60.1
- resolution: "@typescript-eslint/visitor-keys@npm:5.60.1"
+"@typescript-eslint/visitor-keys@npm:6.2.0":
+ version: 6.2.0
+ resolution: "@typescript-eslint/visitor-keys@npm:6.2.0"
dependencies:
- "@typescript-eslint/types": 5.60.1
- eslint-visitor-keys: ^3.3.0
- checksum: e70bd584ff0eef1c8739e3457e7402485acc06aba468ff8f191f4546aaed93ec91f309bb567a3d8bbd9a4aec030f3b73c8e8df085bb82cbb8ea9a0209c7355f8
- languageName: node
- linkType: hard
-
-"@vitejs/plugin-react-swc@npm:^3.3.2":
- version: 3.3.2
- resolution: "@vitejs/plugin-react-swc@npm:3.3.2"
- dependencies:
- "@swc/core": ^1.3.61
- peerDependencies:
- vite: ^4
- checksum: 8544023de3dc605d00f66db10de085b2a90887111657db87dd192e02ffc1e4a191b09d58180b4ba498858f01e8861d15e216d744e0f6dfad2550065999890fb2
+ "@typescript-eslint/types": 6.2.0
+ eslint-visitor-keys: ^3.4.1
+ checksum: 0da2046f1edbace33348c4455bb069037a13388ff1ff8cd6b94972aece4dfa1e006790fcf9f30a6210265854d74f16fe62e159e7f673e899a933ac8216f1cc03
languageName: node
linkType: hard
@@ -1510,53 +1970,54 @@ __metadata:
resolution: "EMS-ESP@workspace:."
dependencies:
"@alova/adapter-xhr": ^1.0.1
- "@alova/scene-react": ^1.1.3
"@emotion/react": ^11.11.1
"@emotion/styled": ^11.11.0
- "@mui/icons-material": ^5.11.16
- "@mui/material": ^5.13.6
+ "@mui/icons-material": ^5.14.1
+ "@mui/material": ^5.14.2
+ "@preact/compat": ^17.1.2
+ "@preact/preset-vite": ^2.5.0
"@table-library/react-table-library": 4.1.4
- "@types/lodash-es": ^4.17.7
- "@types/mime-types": ^2
- "@types/node": ^20.3.3
- "@types/react": ^18.2.14
- "@types/react-dom": ^18.2.6
+ "@types/lodash-es": ^4.17.8
+ "@types/node": ^20.4.5
+ "@types/react": ^18.2.17
+ "@types/react-dom": ^18.2.7
"@types/react-router-dom": ^5.3.3
- "@typescript-eslint/eslint-plugin": ^5.60.1
- "@typescript-eslint/parser": ^5.60.1
- "@vitejs/plugin-react-swc": ^3.3.2
- alova: ^2.9.1
+ "@typescript-eslint/eslint-plugin": ^6.2.0
+ "@typescript-eslint/parser": ^6.2.0
+ alova: ^2.9.3
async-validator: ^4.2.5
- eslint: ^8.44.0
+ cspell: ^6.31.2
+ eslint: ^8.46.0
eslint-config-airbnb: ^19.0.4
- eslint-config-airbnb-typescript: ^17.0.0
- eslint-config-prettier: ^8.8.0
+ eslint-config-airbnb-typescript: ^17.1.0
+ eslint-config-prettier: ^8.9.0
eslint-import-resolver-typescript: ^3.5.5
eslint-plugin-autofix: ^1.1.0
- eslint-plugin-import: ^2.27.5
+ eslint-plugin-import: ^2.28.0
eslint-plugin-jsx-a11y: ^6.7.1
- eslint-plugin-prettier: ^4.2.1
- eslint-plugin-react: ^7.32.2
+ eslint-plugin-prettier: alpha
+ eslint-plugin-react: ^7.33.0
eslint-plugin-react-hooks: ^4.6.0
history: ^5.3.0
jwt-decode: ^3.1.2
lodash-es: ^4.17.21
mime-types: ^2.1.35
- nodemon: ^2.0.22
+ nodemon: ^3.0.1
npm-run-all: ^4.1.5
- prettier: ^2.8.8
+ preact: ^10.16.0
+ prettier: ^3.0.0
react: latest
react-dom: latest
react-dropzone: ^14.2.3
react-icons: ^4.10.1
- react-router-dom: ^6.14.1
+ react-router-dom: ^6.14.2
react-toastify: ^9.1.3
rollup-plugin-visualizer: ^5.9.2
sockette: ^2.0.6
- terser: ^5.18.2
- typesafe-i18n: ^5.24.3
+ terser: ^5.19.2
+ typesafe-i18n: ^5.25.1
typescript: ^5.1.6
- vite: ^4.3.9
+ vite: ^4.4.7
vite-plugin-svgr: ^3.2.0
vite-tsconfig-paths: ^4.2.0
languageName: unknown
@@ -1578,12 +2039,12 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^8.8.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0":
- version: 8.9.0
- resolution: "acorn@npm:8.9.0"
+"acorn@npm:^8.8.2, acorn@npm:^8.9.0":
+ version: 8.10.0
+ resolution: "acorn@npm:8.10.0"
bin:
acorn: bin/acorn
- checksum: 5b51689d56f1ca5d6ea1fa58af478affd8d3396403637abcbc7caf28e1a47beb537cf1654f537b6cf4c73377f3e1aa99fd4a50674e64daefe08cb25c799ded28
+ checksum: deaeebfbea6e40f6c0e1070e9b0e16e76ba484de54cbd735914d1d41d19169a450de8630b7a3a0c4e271a3b0c0b075a3427ad1a40d8a69f8747c0e8cb02ee3e2
languageName: node
linkType: hard
@@ -1617,7 +2078,7 @@ __metadata:
languageName: node
linkType: hard
-"ajv@npm:^6.10.0, ajv@npm:^6.12.4":
+"ajv@npm:^6.12.4":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
@@ -1629,10 +2090,10 @@ __metadata:
languageName: node
linkType: hard
-"alova@npm:^2.9.1":
- version: 2.9.1
- resolution: "alova@npm:2.9.1"
- checksum: 7a064e94486a2b8e372ff53bf937efcdf291353c03c2bc036e39be539eb3bb82862010b5ffd40fd3e10d3e4031ad5ab355b88277561e521f57d80317a1304b94
+"alova@npm:^2.9.3":
+ version: 2.9.3
+ resolution: "alova@npm:2.9.3"
+ checksum: 1b63c2750e1ee027178c64c414c4fe720112f35ca7b13d7b24d3d9573c4ac4a7b17eae7cc06bed4f9f1bc29a45e337df0d638bdd92a92ad43cff0a19d9d77402
languageName: node
linkType: hard
@@ -1741,6 +2202,13 @@ __metadata:
languageName: node
linkType: hard
+"array-timsort@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "array-timsort@npm:1.0.3"
+ checksum: bd3a1707b621947265c89867e67c9102b9b9f4c50f5b3974220112290d8b60d26ce60595edec5deed3325207b759d70b758bed3cd310b5ddadb835657ffb6d12
+ languageName: node
+ linkType: hard
+
"array-union@npm:^2.1.0":
version: 2.1.0
resolution: "array-union@npm:2.1.0"
@@ -1748,6 +2216,19 @@ __metadata:
languageName: node
linkType: hard
+"array.prototype.findlastindex@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "array.prototype.findlastindex@npm:1.2.2"
+ dependencies:
+ call-bind: ^1.0.2
+ define-properties: ^1.1.4
+ es-abstract: ^1.20.4
+ es-shim-unscopables: ^1.0.0
+ get-intrinsic: ^1.1.3
+ checksum: b8037687a669df4dbdea33055a3817ea59bb0a6c2f17f90e4ad7c232d5edc1780e586b6ad284bcc45ff56e6861b0668c07de47bcc298018c21c0d553ab9480fd
+ languageName: node
+ linkType: hard
+
"array.prototype.flat@npm:^1.3.1":
version: 1.3.1
resolution: "array.prototype.flat@npm:1.3.1"
@@ -1785,6 +2266,20 @@ __metadata:
languageName: node
linkType: hard
+"arraybuffer.prototype.slice@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "arraybuffer.prototype.slice@npm:1.0.1"
+ dependencies:
+ array-buffer-byte-length: ^1.0.0
+ call-bind: ^1.0.2
+ define-properties: ^1.2.0
+ get-intrinsic: ^1.2.1
+ is-array-buffer: ^3.0.2
+ is-shared-array-buffer: ^1.0.2
+ checksum: db460cb4a96c3c9e27a2a7eed5d0ab1fcfccae9fc8cd1b4883cbb03cd29060b373e0723e78b5c786fdec2025a0ab12eb840c72b2f26016bac906b91bc4e9e4db
+ languageName: node
+ linkType: hard
+
"ast-types-flow@npm:^0.0.7":
version: 0.0.7
resolution: "ast-types-flow@npm:0.0.7"
@@ -1840,6 +2335,15 @@ __metadata:
languageName: node
linkType: hard
+"babel-plugin-transform-hook-names@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "babel-plugin-transform-hook-names@npm:1.0.2"
+ peerDependencies:
+ "@babel/core": ^7.12.10
+ checksum: 517b85fe0611d742b3fffad5d0e119fcbd29bf69f95c6970b9ede4cb66453c7106a2d3bf048b35255b78a9d6a9565ad37e73b46c0be1fe557e941c792fad79f0
+ languageName: node
+ linkType: hard
+
"balanced-match@npm:^1.0.0":
version: 1.0.2
resolution: "balanced-match@npm:1.0.2"
@@ -1898,7 +2402,7 @@ __metadata:
languageName: node
linkType: hard
-"browserslist@npm:^4.21.3":
+"browserslist@npm:^4.21.9":
version: 4.21.9
resolution: "browserslist@npm:4.21.9"
dependencies:
@@ -1958,7 +2462,7 @@ __metadata:
languageName: node
linkType: hard
-"callsites@npm:^3.0.0":
+"callsites@npm:^3.0.0, callsites@npm:^3.1.0":
version: 3.1.0
resolution: "callsites@npm:3.1.0"
checksum: fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301
@@ -1973,9 +2477,9 @@ __metadata:
linkType: hard
"caniuse-lite@npm:^1.0.30001503":
- version: 1.0.30001509
- resolution: "caniuse-lite@npm:1.0.30001509"
- checksum: 631e61b8de50174ffe0baeb0b87d52f0b873bae6c13b4b4eb7eb9e2dbd7d48fb05c8426cc9eccc21e4e4156d2d2bdfe7f7d9677a6f9484c2f24404e737020700
+ version: 1.0.30001513
+ resolution: "caniuse-lite@npm:1.0.30001513"
+ checksum: b4eca40458e01fa07947ea8eb1dae2acf902d27f7f7399daf47c9cd75724ab03f2424a59a8d211144653ba7e9e66f722863b5e940453e6c3909a2194c0a6622c
languageName: node
linkType: hard
@@ -1990,7 +2494,7 @@ __metadata:
languageName: node
linkType: hard
-"chalk@npm:^4.0.0":
+"chalk@npm:^4.0.0, chalk@npm:^4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
@@ -2033,6 +2537,16 @@ __metadata:
languageName: node
linkType: hard
+"clear-module@npm:^4.1.2":
+ version: 4.1.2
+ resolution: "clear-module@npm:4.1.2"
+ dependencies:
+ parent-module: ^2.0.0
+ resolve-from: ^5.0.0
+ checksum: 73207f06af256e3c8901ceaa74f7e4468a777aa68dedc7f745db4116861a7f8e69c558e16dbdf7b3d2295675d5896f916ba55b5dc737dda81792dbeee1488127
+ languageName: node
+ linkType: hard
+
"cliui@npm:^8.0.1":
version: 8.0.1
resolution: "cliui@npm:8.0.1"
@@ -2099,6 +2613,13 @@ __metadata:
languageName: node
linkType: hard
+"commander@npm:^10.0.0":
+ version: 10.0.1
+ resolution: "commander@npm:10.0.1"
+ checksum: 53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3
+ languageName: node
+ linkType: hard
+
"commander@npm:^2.20.0":
version: 2.20.3
resolution: "commander@npm:2.20.3"
@@ -2106,6 +2627,19 @@ __metadata:
languageName: node
linkType: hard
+"comment-json@npm:^4.2.3":
+ version: 4.2.3
+ resolution: "comment-json@npm:4.2.3"
+ dependencies:
+ array-timsort: ^1.0.3
+ core-util-is: ^1.0.3
+ esprima: ^4.0.1
+ has-own-prop: ^2.0.0
+ repeat-string: ^1.6.1
+ checksum: e8a0d3a6d75d92551f9a7e6fefa31f3d831dc33117b0b9432f061f45a571c85c16143e4110693d450f6eca20841db43f5429ac0d801673bcf03e9973ab1c31af
+ languageName: node
+ linkType: hard
+
"concat-map@npm:0.0.1":
version: 0.0.1
resolution: "concat-map@npm:0.0.1"
@@ -2113,6 +2647,20 @@ __metadata:
languageName: node
linkType: hard
+"configstore@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "configstore@npm:5.0.1"
+ dependencies:
+ dot-prop: ^5.2.0
+ graceful-fs: ^4.1.2
+ make-dir: ^3.0.0
+ unique-string: ^2.0.0
+ write-file-atomic: ^3.0.0
+ xdg-basedir: ^4.0.0
+ checksum: 5af23830e78bdc56cbe92a2f81e87f1d3a39e96e51a0ab2a8bc79bbbc5d4440a48d92833b3fd9c6d34b4a9c4c5853c8487b8e6e68593e7ecbc7434822f7aced3
+ languageName: node
+ linkType: hard
+
"confusing-browser-globals@npm:^1.0.10":
version: 1.0.11
resolution: "confusing-browser-globals@npm:1.0.11"
@@ -2134,6 +2682,25 @@ __metadata:
languageName: node
linkType: hard
+"core-util-is@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "core-util-is@npm:1.0.3"
+ checksum: 90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9
+ languageName: node
+ linkType: hard
+
+"cosmiconfig@npm:8.0.0":
+ version: 8.0.0
+ resolution: "cosmiconfig@npm:8.0.0"
+ dependencies:
+ import-fresh: ^3.2.1
+ js-yaml: ^4.1.0
+ parse-json: ^5.0.0
+ path-type: ^4.0.0
+ checksum: cea301202bb68373f9c8ccc77a6002aab1032f327dd1458e5932ee1a2f48919c881074d702cece91f18275673817872a0d3d00eb46f30a33c8f2009dbbac0e5c
+ languageName: node
+ linkType: hard
+
"cosmiconfig@npm:^7.0.0":
version: 7.1.0
resolution: "cosmiconfig@npm:7.1.0"
@@ -2183,6 +2750,137 @@ __metadata:
languageName: node
linkType: hard
+"crypto-random-string@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "crypto-random-string@npm:2.0.0"
+ checksum: 288589b2484fe787f9e146f56c4be90b940018f17af1b152e4dde12309042ff5a2bf69e949aab8b8ac253948381529cc6f3e5a2427b73643a71ff177fa122b37
+ languageName: node
+ linkType: hard
+
+"cspell-dictionary@npm:6.31.1":
+ version: 6.31.1
+ resolution: "cspell-dictionary@npm:6.31.1"
+ dependencies:
+ "@cspell/cspell-pipe": 6.31.1
+ "@cspell/cspell-types": 6.31.1
+ cspell-trie-lib: 6.31.1
+ fast-equals: ^4.0.3
+ gensequence: ^5.0.2
+ checksum: 9d5807004125453ce6e740277c6493caebf54a92bcf06dcaa7b410812bcc62f97439c85b694a020eb2758492a31793d53a737b041c8188b20d1442753613c8a6
+ languageName: node
+ linkType: hard
+
+"cspell-gitignore@npm:6.31.2":
+ version: 6.31.2
+ resolution: "cspell-gitignore@npm:6.31.2"
+ dependencies:
+ cspell-glob: 6.31.2
+ find-up: ^5.0.0
+ bin:
+ cspell-gitignore: bin.mjs
+ checksum: 0772a6edd339a40d7b942b433739d0a9821fd0e1d6ad52c5ff8495f8b222bfe03064051987b80e58a5b67160129fa34dc8fbc198b3266880c52e2c34ffccfbbf
+ languageName: node
+ linkType: hard
+
+"cspell-glob@npm:6.31.2":
+ version: 6.31.2
+ resolution: "cspell-glob@npm:6.31.2"
+ dependencies:
+ micromatch: ^4.0.5
+ checksum: 6661d7e72dd0993e5d4037d0f52ee3bbef802823aace8b708dfb27c9ffd64bbd93c76755a7d88a7221de3a30a56cdd22ec4cb6b970a10f69c0307c378cde4ca5
+ languageName: node
+ linkType: hard
+
+"cspell-grammar@npm:6.31.1":
+ version: 6.31.1
+ resolution: "cspell-grammar@npm:6.31.1"
+ dependencies:
+ "@cspell/cspell-pipe": 6.31.1
+ "@cspell/cspell-types": 6.31.1
+ bin:
+ cspell-grammar: bin.mjs
+ checksum: ede1aa24c313a27c25d134da80f0da1bd4bc3e9ed93ac0e8379344aa5ab7876c249ab72b197753e3bdc7e7ab0d34b16dbe8fa3a44d306001931948db89b2f06a
+ languageName: node
+ linkType: hard
+
+"cspell-io@npm:6.31.2":
+ version: 6.31.2
+ resolution: "cspell-io@npm:6.31.2"
+ dependencies:
+ "@cspell/cspell-service-bus": 6.31.1
+ node-fetch: ^2.6.9
+ checksum: 50cb68c57de9a8a7b893f3c3abee8a989c115db4b4aef8227a7b96558408d85accc1fab23bbb67b6d525c091d2d8ba9b7985303ae8edf31fa6f6fa38c523e169
+ languageName: node
+ linkType: hard
+
+"cspell-lib@npm:6.31.2":
+ version: 6.31.2
+ resolution: "cspell-lib@npm:6.31.2"
+ dependencies:
+ "@cspell/cspell-bundled-dicts": 6.31.2
+ "@cspell/cspell-pipe": 6.31.1
+ "@cspell/cspell-types": 6.31.1
+ "@cspell/strong-weak-map": 6.31.1
+ clear-module: ^4.1.2
+ comment-json: ^4.2.3
+ configstore: ^5.0.1
+ cosmiconfig: 8.0.0
+ cspell-dictionary: 6.31.1
+ cspell-glob: 6.31.2
+ cspell-grammar: 6.31.1
+ cspell-io: 6.31.2
+ cspell-trie-lib: 6.31.1
+ fast-equals: ^4.0.3
+ find-up: ^5.0.0
+ gensequence: ^5.0.2
+ import-fresh: ^3.3.0
+ resolve-from: ^5.0.0
+ resolve-global: ^1.0.0
+ vscode-languageserver-textdocument: ^1.0.8
+ vscode-uri: ^3.0.7
+ checksum: 5003cc0bc33baffffed6031357877ad8696babbe5662e0ddf6aeeee48f6bb41df5c23be5ef04cf3b0f3511d3ef9e6c982992fdedfb084c332adec6ae7f5dec8d
+ languageName: node
+ linkType: hard
+
+"cspell-trie-lib@npm:6.31.1":
+ version: 6.31.1
+ resolution: "cspell-trie-lib@npm:6.31.1"
+ dependencies:
+ "@cspell/cspell-pipe": 6.31.1
+ "@cspell/cspell-types": 6.31.1
+ gensequence: ^5.0.2
+ checksum: 0b958b82a554bc3ef84d225c69f8cc06c2428754aee9726170b8d8ab286795f45524e2ec2ecc5b6f64535712371eb0d095550602285d7571ddddecf58d883a8e
+ languageName: node
+ linkType: hard
+
+"cspell@npm:^6.31.2":
+ version: 6.31.2
+ resolution: "cspell@npm:6.31.2"
+ dependencies:
+ "@cspell/cspell-pipe": 6.31.1
+ "@cspell/cspell-types": 6.31.1
+ "@cspell/dynamic-import": 6.31.1
+ chalk: ^4.1.2
+ commander: ^10.0.0
+ cspell-gitignore: 6.31.2
+ cspell-glob: 6.31.2
+ cspell-io: 6.31.2
+ cspell-lib: 6.31.2
+ fast-glob: ^3.2.12
+ fast-json-stable-stringify: ^2.1.0
+ file-entry-cache: ^6.0.1
+ get-stdin: ^8.0.0
+ imurmurhash: ^0.1.4
+ semver: ^7.3.8
+ strip-ansi: ^6.0.1
+ vscode-uri: ^3.0.7
+ bin:
+ cspell: bin.js
+ cspell-esm: bin.mjs
+ checksum: 26549166d95b0fadafcc35c06de3acc73893a499bdf1b6518494d238e4dbb55ec0a47fdcc0e53602e736f58d9e86bfe6096e110ba577328bc739dcb4ef4d7f0c
+ languageName: node
+ linkType: hard
+
"csstype@npm:^3.0.2, csstype@npm:^3.1.2":
version: 3.1.2
resolution: "csstype@npm:3.1.2"
@@ -2197,7 +2895,7 @@ __metadata:
languageName: node
linkType: hard
-"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
+"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
version: 4.3.4
resolution: "debug@npm:4.3.4"
dependencies:
@@ -2329,6 +3027,15 @@ __metadata:
languageName: node
linkType: hard
+"dot-prop@npm:^5.2.0":
+ version: 5.3.0
+ resolution: "dot-prop@npm:5.3.0"
+ dependencies:
+ is-obj: ^2.0.0
+ checksum: 93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599
+ languageName: node
+ linkType: hard
+
"eastasianwidth@npm:^0.2.0":
version: 0.2.0
resolution: "eastasianwidth@npm:0.2.0"
@@ -2337,9 +3044,9 @@ __metadata:
linkType: hard
"electron-to-chromium@npm:^1.4.431":
- version: 1.4.446
- resolution: "electron-to-chromium@npm:1.4.446"
- checksum: 207de6583e24d643a62223b623cb93dfd553bbf767be31eaf91ba6c503795eebb4393f21b5d30fbc615551b284848c09566e3464b224f2ea5140eb3c992ace44
+ version: 1.4.454
+ resolution: "electron-to-chromium@npm:1.4.454"
+ checksum: a8f2b99eb8a90b5038bd100289c17e1ae5c7a3597214650eeb8aafd94fbb139a8749e358666ded0d37454c08d2857c9f0103cc621b630f9de493db6544bc8003
languageName: node
linkType: hard
@@ -2448,6 +3155,53 @@ __metadata:
languageName: node
linkType: hard
+"es-abstract@npm:^1.21.2":
+ version: 1.22.1
+ resolution: "es-abstract@npm:1.22.1"
+ dependencies:
+ array-buffer-byte-length: ^1.0.0
+ arraybuffer.prototype.slice: ^1.0.1
+ available-typed-arrays: ^1.0.5
+ call-bind: ^1.0.2
+ es-set-tostringtag: ^2.0.1
+ es-to-primitive: ^1.2.1
+ function.prototype.name: ^1.1.5
+ get-intrinsic: ^1.2.1
+ get-symbol-description: ^1.0.0
+ globalthis: ^1.0.3
+ gopd: ^1.0.1
+ has: ^1.0.3
+ has-property-descriptors: ^1.0.0
+ has-proto: ^1.0.1
+ has-symbols: ^1.0.3
+ internal-slot: ^1.0.5
+ is-array-buffer: ^3.0.2
+ is-callable: ^1.2.7
+ is-negative-zero: ^2.0.2
+ is-regex: ^1.1.4
+ is-shared-array-buffer: ^1.0.2
+ is-string: ^1.0.7
+ is-typed-array: ^1.1.10
+ is-weakref: ^1.0.2
+ object-inspect: ^1.12.3
+ object-keys: ^1.1.1
+ object.assign: ^4.1.4
+ regexp.prototype.flags: ^1.5.0
+ safe-array-concat: ^1.0.0
+ safe-regex-test: ^1.0.0
+ string.prototype.trim: ^1.2.7
+ string.prototype.trimend: ^1.0.6
+ string.prototype.trimstart: ^1.0.6
+ typed-array-buffer: ^1.0.0
+ typed-array-byte-length: ^1.0.0
+ typed-array-byte-offset: ^1.0.0
+ typed-array-length: ^1.0.4
+ unbox-primitive: ^1.0.2
+ which-typed-array: ^1.1.10
+ checksum: 36abed2b7efa8dd337d938e50d0b97d070c0ef45b2257eec0ae8c3edc5c7e8f3e2906530afda5c0b8a4f44299391d078237fd5ea454ac4e9adb6f8343bf84980
+ languageName: node
+ linkType: hard
+
"es-set-tostringtag@npm:^2.0.1":
version: 2.0.1
resolution: "es-set-tostringtag@npm:2.0.1"
@@ -2479,32 +3233,32 @@ __metadata:
languageName: node
linkType: hard
-"esbuild@npm:^0.17.5":
- version: 0.17.19
- resolution: "esbuild@npm:0.17.19"
+"esbuild@npm:^0.18.10":
+ version: 0.18.11
+ resolution: "esbuild@npm:0.18.11"
dependencies:
- "@esbuild/android-arm": 0.17.19
- "@esbuild/android-arm64": 0.17.19
- "@esbuild/android-x64": 0.17.19
- "@esbuild/darwin-arm64": 0.17.19
- "@esbuild/darwin-x64": 0.17.19
- "@esbuild/freebsd-arm64": 0.17.19
- "@esbuild/freebsd-x64": 0.17.19
- "@esbuild/linux-arm": 0.17.19
- "@esbuild/linux-arm64": 0.17.19
- "@esbuild/linux-ia32": 0.17.19
- "@esbuild/linux-loong64": 0.17.19
- "@esbuild/linux-mips64el": 0.17.19
- "@esbuild/linux-ppc64": 0.17.19
- "@esbuild/linux-riscv64": 0.17.19
- "@esbuild/linux-s390x": 0.17.19
- "@esbuild/linux-x64": 0.17.19
- "@esbuild/netbsd-x64": 0.17.19
- "@esbuild/openbsd-x64": 0.17.19
- "@esbuild/sunos-x64": 0.17.19
- "@esbuild/win32-arm64": 0.17.19
- "@esbuild/win32-ia32": 0.17.19
- "@esbuild/win32-x64": 0.17.19
+ "@esbuild/android-arm": 0.18.11
+ "@esbuild/android-arm64": 0.18.11
+ "@esbuild/android-x64": 0.18.11
+ "@esbuild/darwin-arm64": 0.18.11
+ "@esbuild/darwin-x64": 0.18.11
+ "@esbuild/freebsd-arm64": 0.18.11
+ "@esbuild/freebsd-x64": 0.18.11
+ "@esbuild/linux-arm": 0.18.11
+ "@esbuild/linux-arm64": 0.18.11
+ "@esbuild/linux-ia32": 0.18.11
+ "@esbuild/linux-loong64": 0.18.11
+ "@esbuild/linux-mips64el": 0.18.11
+ "@esbuild/linux-ppc64": 0.18.11
+ "@esbuild/linux-riscv64": 0.18.11
+ "@esbuild/linux-s390x": 0.18.11
+ "@esbuild/linux-x64": 0.18.11
+ "@esbuild/netbsd-x64": 0.18.11
+ "@esbuild/openbsd-x64": 0.18.11
+ "@esbuild/sunos-x64": 0.18.11
+ "@esbuild/win32-arm64": 0.18.11
+ "@esbuild/win32-ia32": 0.18.11
+ "@esbuild/win32-x64": 0.18.11
dependenciesMeta:
"@esbuild/android-arm":
optional: true
@@ -2552,7 +3306,7 @@ __metadata:
optional: true
bin:
esbuild: bin/esbuild
- checksum: c7ac14bfaaebe4745d5d18347b4f6854fd1140acb9389e88dbfa5c20d4e2122451d9647d5498920470a880a605d6e5502b5c2102da6c282b01f129ddd49d2874
+ checksum: f038043facb479fc26e14eef203c8ddda2aeffeb18e82af74d0eb3daea0c3d6184d343ab62c86e5b036b3a7ae87e02388f4c60379777bf1e8f3e26156c906802
languageName: node
linkType: hard
@@ -2592,17 +3346,17 @@ __metadata:
languageName: node
linkType: hard
-"eslint-config-airbnb-typescript@npm:^17.0.0":
- version: 17.0.0
- resolution: "eslint-config-airbnb-typescript@npm:17.0.0"
+"eslint-config-airbnb-typescript@npm:^17.1.0":
+ version: 17.1.0
+ resolution: "eslint-config-airbnb-typescript@npm:17.1.0"
dependencies:
eslint-config-airbnb-base: ^15.0.0
peerDependencies:
- "@typescript-eslint/eslint-plugin": ^5.13.0
- "@typescript-eslint/parser": ^5.0.0
+ "@typescript-eslint/eslint-plugin": ^5.13.0 || ^6.0.0
+ "@typescript-eslint/parser": ^5.0.0 || ^6.0.0
eslint: ^7.32.0 || ^8.2.0
eslint-plugin-import: ^2.25.3
- checksum: 9a8ce73c5a52ff1f82842ff95fca9313bb826ade8733d2dc25aa65781969282a5825fb5ac1b89c9d2e18da439aa3dc03486c2c405158559d0b1400e08593557e
+ checksum: 46d1753d660fe4225ccd89e91dd9f812db490326dfb835cfb786ab0b9a4ca25a39171a838661233b8f6f9a19294aaedaa962e19df915066beb80e7422749f7f1
languageName: node
linkType: hard
@@ -2623,14 +3377,14 @@ __metadata:
languageName: node
linkType: hard
-"eslint-config-prettier@npm:^8.8.0":
- version: 8.8.0
- resolution: "eslint-config-prettier@npm:8.8.0"
+"eslint-config-prettier@npm:^8.9.0":
+ version: 8.9.0
+ resolution: "eslint-config-prettier@npm:8.9.0"
peerDependencies:
eslint: ">=7.0.0"
bin:
eslint-config-prettier: bin/cli.js
- checksum: 9e3bb602184b7ec59239d2f901b1594cd7cc59ff38c3ddcd812137817e50840f4d65d62b61c515c7eae86d85f8b6fb2ebda659a3f83b2f2c5da75feb15531508
+ checksum: 75388ef59acd24b23a55ca7d662e639a75b0982fcc95da546a01f0ab9a38c67e35a6b06d9f72ebb274f569d06dcaa1ab3e7016900c34a1df3e29664c3f1ce777
languageName: node
linkType: hard
@@ -2664,7 +3418,7 @@ __metadata:
languageName: node
linkType: hard
-"eslint-module-utils@npm:^2.7.4":
+"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0":
version: 2.8.0
resolution: "eslint-module-utils@npm:2.8.0"
dependencies:
@@ -2691,28 +3445,31 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-import@npm:^2.27.5":
- version: 2.27.5
- resolution: "eslint-plugin-import@npm:2.27.5"
+"eslint-plugin-import@npm:^2.28.0":
+ version: 2.28.0
+ resolution: "eslint-plugin-import@npm:2.28.0"
dependencies:
array-includes: ^3.1.6
+ array.prototype.findlastindex: ^1.2.2
array.prototype.flat: ^1.3.1
array.prototype.flatmap: ^1.3.1
debug: ^3.2.7
doctrine: ^2.1.0
eslint-import-resolver-node: ^0.3.7
- eslint-module-utils: ^2.7.4
+ eslint-module-utils: ^2.8.0
has: ^1.0.3
- is-core-module: ^2.11.0
+ is-core-module: ^2.12.1
is-glob: ^4.0.3
minimatch: ^3.1.2
+ object.fromentries: ^2.0.6
+ object.groupby: ^1.0.0
object.values: ^1.1.6
- resolve: ^1.22.1
- semver: ^6.3.0
- tsconfig-paths: ^3.14.1
+ resolve: ^1.22.3
+ semver: ^6.3.1
+ tsconfig-paths: ^3.14.2
peerDependencies:
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
- checksum: e561e79889ad3c662e305ca9a9b273a5baf8f492dad8198e42987efc4f0532c0d49caee206e78e057cec3365b36f9cef8340915e9f08adec5f29c9d631e6f691
+ checksum: 0d7b978a3c4778b68bede2c8a14512e33581091bd8a508c4a424d2e8bff1f174549ffc3f2b7cfb28345cfb63061d3e43fdaa810ebfe9c96b5a4a1dc4047f6e9d
languageName: node
linkType: hard
@@ -2742,18 +3499,22 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-prettier@npm:^4.2.1":
- version: 4.2.1
- resolution: "eslint-plugin-prettier@npm:4.2.1"
+"eslint-plugin-prettier@npm:alpha":
+ version: 5.0.0-alpha.2
+ resolution: "eslint-plugin-prettier@npm:5.0.0-alpha.2"
dependencies:
prettier-linter-helpers: ^1.0.0
+ synckit: ^0.8.5
peerDependencies:
- eslint: ">=7.28.0"
- prettier: ">=2.0.0"
+ "@types/eslint": ">=8.0.0"
+ eslint: ">=8.0.0"
+ prettier: ">=3.0.0"
peerDependenciesMeta:
+ "@types/eslint":
+ optional: true
eslint-config-prettier:
optional: true
- checksum: c5e7316baeab9d96ac39c279f16686e837277e5c67a8006c6588bcff317edffdc1532fb580441eb598bc6770f6444006756b68a6575dff1cd85ebe227252d0b7
+ checksum: 1401a0c6b5fc38879ff76772da3ad6d8d3607755614e9449412998f27f1858a6d333c12500abf3cee1af1f77b720e431dd5b6c9e30e58e8cc5e896f1ceb23809
languageName: node
linkType: hard
@@ -2766,9 +3527,9 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-react@npm:^7.32.2":
- version: 7.32.2
- resolution: "eslint-plugin-react@npm:7.32.2"
+"eslint-plugin-react@npm:^7.33.0":
+ version: 7.33.0
+ resolution: "eslint-plugin-react@npm:7.33.0"
dependencies:
array-includes: ^3.1.6
array.prototype.flatmap: ^1.3.1
@@ -2783,11 +3544,11 @@ __metadata:
object.values: ^1.1.6
prop-types: ^15.8.1
resolve: ^2.0.0-next.4
- semver: ^6.3.0
+ semver: ^6.3.1
string.prototype.matchall: ^4.0.8
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
- checksum: 9ddd5cfc508555a5cb3edbdcc9138dd472d269d3a45da0be3e267ea2b3fa1b5990823675208c0e11376c9c55e46aaad5b7a5f46c965eb4dcf6f1eebcebf174c3
+ checksum: 015aaaa133bacd99bd1f82b91852d6fcca7e2b6c11d1ef96ed3c0dae0b5fe89230f66990e12898f237f3f67296234650130e0337db669c32e30132ccae66a696
languageName: node
linkType: hard
@@ -2798,23 +3559,13 @@ __metadata:
languageName: node
linkType: hard
-"eslint-scope@npm:^5.1.1":
- version: 5.1.1
- resolution: "eslint-scope@npm:5.1.1"
- dependencies:
- esrecurse: ^4.3.0
- estraverse: ^4.1.1
- checksum: d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a
- languageName: node
- linkType: hard
-
-"eslint-scope@npm:^7.2.0":
- version: 7.2.0
- resolution: "eslint-scope@npm:7.2.0"
+"eslint-scope@npm:^7.2.2":
+ version: 7.2.2
+ resolution: "eslint-scope@npm:7.2.2"
dependencies:
esrecurse: ^4.3.0
estraverse: ^5.2.0
- checksum: 5b48a3cc2485a3a58ca0bdecfb557c349009308a9b2afb24d070b1c0c254d445ee86d78bfee2c4ed6d1b8944307604a987c92f6d7e611e29de5d06256747a0ff
+ checksum: 613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116
languageName: node
linkType: hard
@@ -2825,26 +3576,33 @@ __metadata:
languageName: node
linkType: hard
-"eslint@npm:^8.44.0":
- version: 8.44.0
- resolution: "eslint@npm:8.44.0"
+"eslint-visitor-keys@npm:^3.4.2":
+ version: 3.4.2
+ resolution: "eslint-visitor-keys@npm:3.4.2"
+ checksum: 4521d1d470490c89fb613aec6fb2f0814b496a4618619ec8dfcc985640fe33c9c64f3dab882f50ebb401b4613f35f2601a9ef9a72b57739af5b0150fecdaf1f1
+ languageName: node
+ linkType: hard
+
+"eslint@npm:^8.46.0":
+ version: 8.46.0
+ resolution: "eslint@npm:8.46.0"
dependencies:
"@eslint-community/eslint-utils": ^4.2.0
- "@eslint-community/regexpp": ^4.4.0
- "@eslint/eslintrc": ^2.1.0
- "@eslint/js": 8.44.0
+ "@eslint-community/regexpp": ^4.6.1
+ "@eslint/eslintrc": ^2.1.1
+ "@eslint/js": ^8.46.0
"@humanwhocodes/config-array": ^0.11.10
"@humanwhocodes/module-importer": ^1.0.1
"@nodelib/fs.walk": ^1.2.8
- ajv: ^6.10.0
+ ajv: ^6.12.4
chalk: ^4.0.0
cross-spawn: ^7.0.2
debug: ^4.3.2
doctrine: ^3.0.0
escape-string-regexp: ^4.0.0
- eslint-scope: ^7.2.0
- eslint-visitor-keys: ^3.4.1
- espree: ^9.6.0
+ eslint-scope: ^7.2.2
+ eslint-visitor-keys: ^3.4.2
+ espree: ^9.6.1
esquery: ^1.4.2
esutils: ^2.0.2
fast-deep-equal: ^3.1.3
@@ -2854,7 +3612,6 @@ __metadata:
globals: ^13.19.0
graphemer: ^1.4.0
ignore: ^5.2.0
- import-fresh: ^3.0.0
imurmurhash: ^0.1.4
is-glob: ^4.0.0
is-path-inside: ^3.0.3
@@ -2866,26 +3623,14 @@ __metadata:
natural-compare: ^1.4.0
optionator: ^0.9.3
strip-ansi: ^6.0.1
- strip-json-comments: ^3.1.0
text-table: ^0.2.0
bin:
eslint: bin/eslint.js
- checksum: a31ca4571a67012629936d891141a4a5747d5902fb7f4e10119a5acd632e0976b9ba1b761d8c81cff8a9cc3e796df2c56f86c02535fd977de962a98ce585624a
+ checksum: 81abddb21e540dcd509ba08fdf524b494cbda69a62ffce2a61b5adfcdeb3cbf713f72c6cbb42932333decb4b067ae7a89e4cb5e908e0d42e4287d4f357576a72
languageName: node
linkType: hard
-"espree@npm:^9.0.0":
- version: 9.5.2
- resolution: "espree@npm:9.5.2"
- dependencies:
- acorn: ^8.8.0
- acorn-jsx: ^5.3.2
- eslint-visitor-keys: ^3.4.1
- checksum: 6885e57b3dcea3f65211403a10077a80a57f03e6c8b45c1e1db4bc5958e0fdb5c358819c88898ea67655d25fb646836182f688156e124a05610e714d3fcb6822
- languageName: node
- linkType: hard
-
-"espree@npm:^9.6.0":
+"espree@npm:^9.0.0, espree@npm:^9.6.0":
version: 9.6.0
resolution: "espree@npm:9.6.0"
dependencies:
@@ -2896,6 +3641,27 @@ __metadata:
languageName: node
linkType: hard
+"espree@npm:^9.6.1":
+ version: 9.6.1
+ resolution: "espree@npm:9.6.1"
+ dependencies:
+ acorn: ^8.9.0
+ acorn-jsx: ^5.3.2
+ eslint-visitor-keys: ^3.4.1
+ checksum: 1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460
+ languageName: node
+ linkType: hard
+
+"esprima@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "esprima@npm:4.0.1"
+ bin:
+ esparse: ./bin/esparse.js
+ esvalidate: ./bin/esvalidate.js
+ checksum: ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3
+ languageName: node
+ linkType: hard
+
"esquery@npm:^1.4.2":
version: 1.5.0
resolution: "esquery@npm:1.5.0"
@@ -2914,13 +3680,6 @@ __metadata:
languageName: node
linkType: hard
-"estraverse@npm:^4.1.1":
- version: 4.3.0
- resolution: "estraverse@npm:4.3.0"
- checksum: 9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d
- languageName: node
- linkType: hard
-
"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0":
version: 5.3.0
resolution: "estraverse@npm:5.3.0"
@@ -2928,7 +3687,7 @@ __metadata:
languageName: node
linkType: hard
-"estree-walker@npm:^2.0.2":
+"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2":
version: 2.0.2
resolution: "estree-walker@npm:2.0.2"
checksum: 53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af
@@ -2997,7 +3756,14 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9":
+"fast-equals@npm:^4.0.3":
+ version: 4.0.3
+ resolution: "fast-equals@npm:4.0.3"
+ checksum: 87fd2609c945ee61e9ed4d041eb2a8f92723fc02884115f67e429dd858d880279e962334894f116b3e9b223f387d246e3db5424ae779287849015ddadbf5ff27
+ languageName: node
+ linkType: hard
+
+"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0":
version: 3.3.0
resolution: "fast-glob@npm:3.3.0"
dependencies:
@@ -3010,7 +3776,7 @@ __metadata:
languageName: node
linkType: hard
-"fast-json-stable-stringify@npm:^2.0.0":
+"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0":
version: 2.1.0
resolution: "fast-json-stable-stringify@npm:2.1.0"
checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b
@@ -3199,6 +3965,13 @@ __metadata:
languageName: node
linkType: hard
+"gensequence@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "gensequence@npm:5.0.2"
+ checksum: 6aa471f2676073edab397a1e48f49a377e292adb671d1961f1159b97499ed4c5d466a23cb6340f9d4e953269fba8230a4c43c3f1e01e124d949b9b65aceb3827
+ languageName: node
+ linkType: hard
+
"gensync@npm:^1.0.0-beta.2":
version: 1.0.0-beta.2
resolution: "gensync@npm:1.0.0-beta.2"
@@ -3213,7 +3986,7 @@ __metadata:
languageName: node
linkType: hard
-"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0":
+"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1":
version: 1.2.1
resolution: "get-intrinsic@npm:1.2.1"
dependencies:
@@ -3225,6 +3998,13 @@ __metadata:
languageName: node
linkType: hard
+"get-stdin@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "get-stdin@npm:8.0.0"
+ checksum: b71b72b83928221052f713b3b6247ebf1ceaeb4ef76937778557537fd51ad3f586c9e6a7476865022d9394b39b74eed1dc7514052fa74d80625276253571b76f
+ languageName: node
+ linkType: hard
+
"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1":
version: 6.0.1
resolution: "get-stream@npm:6.0.1"
@@ -3270,17 +4050,17 @@ __metadata:
linkType: hard
"glob@npm:^10.2.2":
- version: 10.3.1
- resolution: "glob@npm:10.3.1"
+ version: 10.3.2
+ resolution: "glob@npm:10.3.2"
dependencies:
foreground-child: ^3.1.0
jackspeak: ^2.0.3
minimatch: ^9.0.1
- minipass: ^5.0.0 || ^6.0.2
- path-scurry: ^1.10.0
+ minipass: ^5.0.0 || ^6.0.2 || ^7.0.0
+ path-scurry: ^1.10.1
bin:
glob: dist/cjs/src/bin.js
- checksum: b39d24c093ce2ffa992dc5b412dbc871af0ccd38a6b2356f67dc906857f0c4c811039a4a4665d19443e1bb484ce2d97855cc7fcfb9a7d0b7e0dadfef4dad5b82
+ checksum: bce737f2acbcfc7475ed672905ee4d8c93e9faa9a926bda6479df6070d3c4bbe4cd80ccc2024528e49d0f7b4c94dd631b107313128d0341c65dd1fc2daf58c05
languageName: node
linkType: hard
@@ -3298,6 +4078,15 @@ __metadata:
languageName: node
linkType: hard
+"global-dirs@npm:^0.1.1":
+ version: 0.1.1
+ resolution: "global-dirs@npm:0.1.1"
+ dependencies:
+ ini: ^1.3.4
+ checksum: 3608072e58962396c124ad5a1cfb3f99ee76c998654a3432d82977b3c3eeb09dc8a5a2a9849b2b8113906c8d0aad89ce362c22e97cec5fe34405bbf4f3cdbe7a
+ languageName: node
+ linkType: hard
+
"globals@npm:^11.1.0":
version: 11.12.0
resolution: "globals@npm:11.12.0"
@@ -3338,15 +4127,15 @@ __metadata:
linkType: hard
"globby@npm:^13.1.3":
- version: 13.2.0
- resolution: "globby@npm:13.2.0"
+ version: 13.2.2
+ resolution: "globby@npm:13.2.2"
dependencies:
dir-glob: ^3.0.1
- fast-glob: ^3.2.11
- ignore: ^5.2.0
+ fast-glob: ^3.3.0
+ ignore: ^5.2.4
merge2: ^1.4.1
slash: ^4.0.0
- checksum: d1ea2b09dbb24961d16413cdb45764cb63280a2a7066739df5e5b33292ce4980d9da1d168a6a135c332ea1856f921e28d8ffcc2c6c24b82d4f4208477bfe62b4
+ checksum: a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664
languageName: node
linkType: hard
@@ -3373,13 +4162,6 @@ __metadata:
languageName: node
linkType: hard
-"grapheme-splitter@npm:^1.0.4":
- version: 1.0.4
- resolution: "grapheme-splitter@npm:1.0.4"
- checksum: 108415fb07ac913f17040dc336607772fcea68c7f495ef91887edddb0b0f5ff7bc1d1ab181b125ecb2f0505669ef12c9a178a3bbd2dd8e042d8c5f1d7c90331a
- languageName: node
- linkType: hard
-
"graphemer@npm:^1.4.0":
version: 1.4.0
resolution: "graphemer@npm:1.4.0"
@@ -3408,6 +4190,13 @@ __metadata:
languageName: node
linkType: hard
+"has-own-prop@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "has-own-prop@npm:2.0.0"
+ checksum: 2745497283d80228b5c5fbb8c63ab1029e604bce7db8d4b36255e427b3695b2153dc978b176674d0dd2a23f132809e04d7ef41fefc0ab85870a5caa918c5c0d9
+ languageName: node
+ linkType: hard
+
"has-property-descriptors@npm:^1.0.0":
version: 1.0.0
resolution: "has-property-descriptors@npm:1.0.0"
@@ -3548,14 +4337,14 @@ __metadata:
languageName: node
linkType: hard
-"ignore@npm:^5.2.0":
+"ignore@npm:^5.2.0, ignore@npm:^5.2.4":
version: 5.2.4
resolution: "ignore@npm:5.2.4"
checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096
languageName: node
linkType: hard
-"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1":
+"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0":
version: 3.3.0
resolution: "import-fresh@npm:3.3.0"
dependencies:
@@ -3565,6 +4354,13 @@ __metadata:
languageName: node
linkType: hard
+"import-meta-resolve@npm:^2.2.2":
+ version: 2.2.2
+ resolution: "import-meta-resolve@npm:2.2.2"
+ checksum: 80873aebf0d2a66e824e278fb6cbb16a6660f86df49b367404e5de80928720ecb44f643243b46dc5c5fae506abb666ef54d6f281b45ee0f1034951acb2261eb5
+ languageName: node
+ linkType: hard
+
"imurmurhash@npm:^0.1.4":
version: 0.1.4
resolution: "imurmurhash@npm:0.1.4"
@@ -3596,6 +4392,13 @@ __metadata:
languageName: node
linkType: hard
+"ini@npm:^1.3.4":
+ version: 1.3.8
+ resolution: "ini@npm:1.3.8"
+ checksum: ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a
+ languageName: node
+ linkType: hard
+
"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.5":
version: 1.0.5
resolution: "internal-slot@npm:1.0.5"
@@ -3667,7 +4470,7 @@ __metadata:
languageName: node
linkType: hard
-"is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.0, is-core-module@npm:^2.9.0":
+"is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.0, is-core-module@npm:^2.12.1, is-core-module@npm:^2.9.0":
version: 2.12.1
resolution: "is-core-module@npm:2.12.1"
dependencies:
@@ -3767,6 +4570,13 @@ __metadata:
languageName: node
linkType: hard
+"is-obj@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "is-obj@npm:2.0.0"
+ checksum: 85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e
+ languageName: node
+ linkType: hard
+
"is-path-inside@npm:^3.0.3":
version: 3.0.3
resolution: "is-path-inside@npm:3.0.3"
@@ -3838,6 +4648,13 @@ __metadata:
languageName: node
linkType: hard
+"is-typedarray@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "is-typedarray@npm:1.0.0"
+ checksum: 4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec
+ languageName: node
+ linkType: hard
+
"is-weakref@npm:^1.0.2":
version: 1.0.2
resolution: "is-weakref@npm:1.0.2"
@@ -3856,6 +4673,13 @@ __metadata:
languageName: node
linkType: hard
+"isarray@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "isarray@npm:2.0.5"
+ checksum: 4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd
+ languageName: node
+ linkType: hard
+
"isexe@npm:^2.0.0":
version: 2.0.0
resolution: "isexe@npm:2.0.0"
@@ -3970,6 +4794,13 @@ __metadata:
languageName: node
linkType: hard
+"kolorist@npm:^1.2.10":
+ version: 1.8.0
+ resolution: "kolorist@npm:1.8.0"
+ checksum: 73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b
+ languageName: node
+ linkType: hard
+
"language-subtag-registry@npm:~0.3.2":
version: 0.3.22
resolution: "language-subtag-registry@npm:0.3.22"
@@ -4088,6 +4919,15 @@ __metadata:
languageName: node
linkType: hard
+"make-dir@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "make-dir@npm:3.1.0"
+ dependencies:
+ semver: ^6.0.0
+ checksum: 56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa
+ languageName: node
+ linkType: hard
+
"make-fetch-happen@npm:^11.0.3":
version: 11.1.1
resolution: "make-fetch-happen@npm:11.1.1"
@@ -4139,7 +4979,7 @@ __metadata:
languageName: node
linkType: hard
-"micromatch@npm:^4.0.4":
+"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
version: 4.0.5
resolution: "micromatch@npm:4.0.5"
dependencies:
@@ -4189,11 +5029,11 @@ __metadata:
linkType: hard
"minimatch@npm:^9.0.1":
- version: 9.0.2
- resolution: "minimatch@npm:9.0.2"
+ version: 9.0.3
+ resolution: "minimatch@npm:9.0.3"
dependencies:
brace-expansion: ^2.0.1
- checksum: 39157d5fd831a7981f7c0c5b22a0e0c2ae8a987ec4a4aeaacc21d3e85da24ce812808cbf7c07cde0d63ad1cf307f73be581131a7a84eeda65f00be1f51972471
+ checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac
languageName: node
linkType: hard
@@ -4271,10 +5111,10 @@ __metadata:
languageName: node
linkType: hard
-"minipass@npm:^5.0.0 || ^6.0.2":
- version: 6.0.2
- resolution: "minipass@npm:6.0.2"
- checksum: 3878076578f44ef4078ceed10af2cfebbec1b6217bf9f7a3d8b940da8153769db29bf88498b2de0d1e0c12dfb7b634c5729b7ca03457f46435e801578add210a
+"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0":
+ version: 7.0.1
+ resolution: "minipass@npm:7.0.1"
+ checksum: 47e4f3567c4d4c20b4a6e04ec99397d606f25038fa5490b60b05b1e104285e7001d7e19c0af2b74fe500823d808eb03fe70652a7ded2753afd748c75d3fd2624
languageName: node
linkType: hard
@@ -4348,6 +5188,20 @@ __metadata:
languageName: node
linkType: hard
+"node-fetch@npm:^2.6.9":
+ version: 2.6.12
+ resolution: "node-fetch@npm:2.6.12"
+ dependencies:
+ whatwg-url: ^5.0.0
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ checksum: 10372e4b5ee07acadc15e6b2bc6fd8940582eea7b9b2a331f4e3665fdcd968498c1656f79f2fa572080ebb37ea80e1474a6478b3b36057ef901b63f4be8fd899
+ languageName: node
+ linkType: hard
+
"node-gyp@npm:latest":
version: 9.4.0
resolution: "node-gyp@npm:9.4.0"
@@ -4370,29 +5224,29 @@ __metadata:
linkType: hard
"node-releases@npm:^2.0.12":
- version: 2.0.12
- resolution: "node-releases@npm:2.0.12"
- checksum: 01f9a7c135be5c8bc989b6c10b9840a7aee09040d46ba4e64b5ea0174fb8891f1277514aef75033ce42031f6cb72a04d4a7e99c70ca25488ad63ad6fc5a5b6a0
+ version: 2.0.13
+ resolution: "node-releases@npm:2.0.13"
+ checksum: 2fb44bf70fc949d27f3a48a7fd1a9d1d603ddad4ccd091f26b3fb8b1da976605d919330d7388ccd55ca2ade0dc8b2e12841ba19ef249c8bb29bf82532d401af7
languageName: node
linkType: hard
-"nodemon@npm:^2.0.22":
- version: 2.0.22
- resolution: "nodemon@npm:2.0.22"
+"nodemon@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "nodemon@npm:3.0.1"
dependencies:
chokidar: ^3.5.2
debug: ^3.2.7
ignore-by-default: ^1.0.1
minimatch: ^3.1.2
pstree.remy: ^1.1.8
- semver: ^5.7.1
- simple-update-notifier: ^1.0.7
+ semver: ^7.5.3
+ simple-update-notifier: ^2.0.0
supports-color: ^5.5.0
touch: ^3.1.0
undefsafe: ^2.0.5
bin:
nodemon: bin/nodemon.js
- checksum: 37e960b995b66e6d9e3b0e435ecc07a45200c4c566c4820a4deb6e7cc234b305e076a8ff0b4dc9c01ee690c663ae82a217d60c591dcbbcd4af1e3a7d0ad2b2c6
+ checksum: 471a218227949b38926de78237004c91e226b63ee06f433cf85c2f1c1f8b6bfbef9bceaa8d27786e7cfb539eb84da357d01741884d08a3ae172bebecd0f1de5b
languageName: node
linkType: hard
@@ -4543,6 +5397,18 @@ __metadata:
languageName: node
linkType: hard
+"object.groupby@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "object.groupby@npm:1.0.0"
+ dependencies:
+ call-bind: ^1.0.2
+ define-properties: ^1.2.0
+ es-abstract: ^1.21.2
+ get-intrinsic: ^1.2.1
+ checksum: 64fff29630d8a9e3260376ece19ffa15f6ac65e2d2c99f4d912dcb06a99571a2cc7ea612c15ee3d335c2aecd961f1ba0eb9bf79cbc12edf3fd2af43973f5eb5a
+ languageName: node
+ linkType: hard
+
"object.hasown@npm:^1.1.2":
version: 1.1.2
resolution: "object.hasown@npm:1.1.2"
@@ -4664,6 +5530,15 @@ __metadata:
languageName: node
linkType: hard
+"parent-module@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "parent-module@npm:2.0.0"
+ dependencies:
+ callsites: ^3.1.0
+ checksum: e4c5e34102c709df1932e1065dee53764fbd869f5a673beb8c3b4bcbbd4a7be16e3595f8846b24f52a77b9e96d8d499e68736ec690b108e55d95a5315f41e073
+ languageName: node
+ linkType: hard
+
"parse-json@npm:^4.0.0":
version: 4.0.0
resolution: "parse-json@npm:4.0.0"
@@ -4728,13 +5603,13 @@ __metadata:
languageName: node
linkType: hard
-"path-scurry@npm:^1.10.0":
- version: 1.10.0
- resolution: "path-scurry@npm:1.10.0"
+"path-scurry@npm:^1.10.1":
+ version: 1.10.1
+ resolution: "path-scurry@npm:1.10.1"
dependencies:
lru-cache: ^9.1.1 || ^10.0.0
- minipass: ^5.0.0 || ^6.0.2
- checksum: dcc4109928c9a0991f0e1719c73b0a184eb7f313fe3eb2242f25274b1e761f53041989fb6b069541b88f58ee6dfbbecf94922225e0c5a3fba8112c9c60abb391
+ minipass: ^5.0.0 || ^6.0.2 || ^7.0.0
+ checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e
languageName: node
linkType: hard
@@ -4761,7 +5636,7 @@ __metadata:
languageName: node
linkType: hard
-"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1":
version: 2.3.1
resolution: "picomatch@npm:2.3.1"
checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be
@@ -4784,14 +5659,21 @@ __metadata:
languageName: node
linkType: hard
-"postcss@npm:^8.4.23":
- version: 8.4.24
- resolution: "postcss@npm:8.4.24"
+"postcss@npm:^8.4.26":
+ version: 8.4.26
+ resolution: "postcss@npm:8.4.26"
dependencies:
nanoid: ^3.3.6
picocolors: ^1.0.0
source-map-js: ^1.0.2
- checksum: 37704ee03a2cbdebf2c99a76d399d6e0250742b5f6c699a12d475c84cedfcbeb26e180d9c780e0219dd2ad70cac963ceaf1d6763a1aec3e63d0c19fceb0eab23
+ checksum: 29c603d6b30b2f94bf971bc430600f271da76fa3ae38d4c6b255e957213051b8eeb02829e128ec4e9fa2a7bb710ba7992ebaf1997e3a9ace48caf49b48a10f6b
+ languageName: node
+ linkType: hard
+
+"preact@npm:^10.16.0":
+ version: 10.16.0
+ resolution: "preact@npm:10.16.0"
+ checksum: 719d0a51dfda0149390b3f65aefd54bdc231f1f821b42ae17bc3fd5e9652d0a30d8a44c455921353e375bfed5d91d74054936827e7d780aee519e07fa84db4ac
languageName: node
linkType: hard
@@ -4811,12 +5693,12 @@ __metadata:
languageName: node
linkType: hard
-"prettier@npm:^2.8.8":
- version: 2.8.8
- resolution: "prettier@npm:2.8.8"
+"prettier@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "prettier@npm:3.0.0"
bin:
- prettier: bin-prettier.js
- checksum: 463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a
+ prettier: bin/prettier.cjs
+ checksum: 113e2828c6487f10e19e7c30598e8810684b827f2a1b7747f113728d1049da15583b77cc5e907f37b371b08c49cfdd900aebe5c2a2077be3f0cccb73cca1133b
languageName: node
linkType: hard
@@ -4862,7 +5744,7 @@ __metadata:
languageName: node
linkType: hard
-react-dom@latest:
+"react-dom@npm:latest":
version: 18.2.0
resolution: "react-dom@npm:18.2.0"
dependencies:
@@ -4910,27 +5792,27 @@ react-dom@latest:
languageName: node
linkType: hard
-"react-router-dom@npm:^6.14.1":
- version: 6.14.1
- resolution: "react-router-dom@npm:6.14.1"
+"react-router-dom@npm:^6.14.2":
+ version: 6.14.2
+ resolution: "react-router-dom@npm:6.14.2"
dependencies:
- "@remix-run/router": 1.7.1
- react-router: 6.14.1
+ "@remix-run/router": 1.7.2
+ react-router: 6.14.2
peerDependencies:
react: ">=16.8"
react-dom: ">=16.8"
- checksum: 9d3a00263125668a9b703ddc908f98218598c216bc77d99931d0cdf7d6a0f7f9d57649f4261e429a5a1c0c51f5203379a6d8e5181e24d0af6c7623fdd966843c
+ checksum: c2025a8d2ddd97438acdee55cdcc6349ad006e17f363c2ea03c2c8f4f82556fb390de287bda7d28f422952d6ab6c91cb058363f214343c26707b194f2eee438b
languageName: node
linkType: hard
-"react-router@npm:6.14.1":
- version: 6.14.1
- resolution: "react-router@npm:6.14.1"
+"react-router@npm:6.14.2":
+ version: 6.14.2
+ resolution: "react-router@npm:6.14.2"
dependencies:
- "@remix-run/router": 1.7.1
+ "@remix-run/router": 1.7.2
peerDependencies:
react: ">=16.8"
- checksum: da870d0739038bb9630a9b3268ec79224bf47aa9f1015e30820cb29a29eabe0bee723991df5cbcb12473d82b7a2e49598e9d539a6f63fa3f2d64f5cc9cc4db64
+ checksum: cd978b947b4df493128e79d0aeebbea58839beee7bbf5ebaa5fb98ead21da5b69d09344c4ee8803a870fff9a99902b1700706d6639f03e637d956b278af0a47d
languageName: node
linkType: hard
@@ -4984,7 +5866,7 @@ react-dom@latest:
languageName: node
linkType: hard
-react@latest:
+"react@npm:latest":
version: 18.2.0
resolution: "react@npm:18.2.0"
dependencies:
@@ -5031,7 +5913,7 @@ react@latest:
languageName: node
linkType: hard
-"regexp.prototype.flags@npm:^1.4.3":
+"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0":
version: 1.5.0
resolution: "regexp.prototype.flags@npm:1.5.0"
dependencies:
@@ -5042,6 +5924,13 @@ react@latest:
languageName: node
linkType: hard
+"repeat-string@npm:^1.6.1":
+ version: 1.6.1
+ resolution: "repeat-string@npm:1.6.1"
+ checksum: 87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d
+ languageName: node
+ linkType: hard
+
"require-directory@npm:^2.1.1":
version: 2.1.1
resolution: "require-directory@npm:2.1.1"
@@ -5056,6 +5945,22 @@ react@latest:
languageName: node
linkType: hard
+"resolve-from@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "resolve-from@npm:5.0.0"
+ checksum: b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2
+ languageName: node
+ linkType: hard
+
+"resolve-global@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "resolve-global@npm:1.0.0"
+ dependencies:
+ global-dirs: ^0.1.1
+ checksum: fda6ba81a07a0124756ce956dd871ca83763973326d8617143dab38d9c9afc666926604bfe8f0bfd046a9a285347568f32ceb3d4c55a1cb9de5614cca001a21c
+ languageName: node
+ linkType: hard
+
"resolve-pkg-maps@npm:^1.0.0":
version: 1.0.0
resolution: "resolve-pkg-maps@npm:1.0.0"
@@ -5063,7 +5968,7 @@ react@latest:
languageName: node
linkType: hard
-"resolve@npm:^1.10.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1":
+"resolve@npm:^1.10.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.3":
version: 1.22.3
resolution: "resolve@npm:1.22.3"
dependencies:
@@ -5089,7 +5994,7 @@ react@latest:
languageName: node
linkType: hard
-"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin":
+"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.3#~builtin":
version: 1.22.3
resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d"
dependencies:
@@ -5159,9 +6064,9 @@ react@latest:
languageName: node
linkType: hard
-"rollup@npm:^3.21.0":
- version: 3.26.0
- resolution: "rollup@npm:3.26.0"
+"rollup@npm:^3.25.2":
+ version: 3.26.2
+ resolution: "rollup@npm:3.26.2"
dependencies:
fsevents: ~2.3.2
dependenciesMeta:
@@ -5169,7 +6074,7 @@ react@latest:
optional: true
bin:
rollup: dist/bin/rollup
- checksum: 948b028978dc943c2dee30713c12e2cdc5f63c99871a86e8de1fa31038209dd14a1408146e6d112105d9f82231f2cdfca319cadd29459eec81cb37a152692311
+ checksum: c23ee8dcd34fe854afe06e1ec6d6017b200c523795a7c0f876494afd4a279f1d1232b3f274fea9438ac8ec4ebf6ce202f17316f790a94dba8173e213d2b98d19
languageName: node
linkType: hard
@@ -5191,6 +6096,18 @@ react@latest:
languageName: node
linkType: hard
+"safe-array-concat@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "safe-array-concat@npm:1.0.0"
+ dependencies:
+ call-bind: ^1.0.2
+ get-intrinsic: ^1.2.0
+ has-symbols: ^1.0.3
+ isarray: ^2.0.5
+ checksum: 792d41fde9834583980912cb16bee511ce25e1759d3c467fdbbb3fc3245346a2289a6476d821713aa1ae23cc1d613d17e79c80e55adb29577f6a29e6f45e7f46
+ languageName: node
+ linkType: hard
+
"safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
@@ -5225,7 +6142,7 @@ react@latest:
languageName: node
linkType: hard
-"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.7.1":
+"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0":
version: 5.7.1
resolution: "semver@npm:5.7.1"
bin:
@@ -5234,6 +6151,15 @@ react@latest:
languageName: node
linkType: hard
+"semver@npm:^6.0.0, semver@npm:^6.3.1":
+ version: 6.3.1
+ resolution: "semver@npm:6.3.1"
+ bin:
+ semver: bin/semver.js
+ checksum: e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d
+ languageName: node
+ linkType: hard
+
"semver@npm:^6.3.0":
version: 6.3.0
resolution: "semver@npm:6.3.0"
@@ -5243,23 +6169,14 @@ react@latest:
languageName: node
linkType: hard
-"semver@npm:^7.3.5, semver@npm:^7.3.7":
- version: 7.5.3
- resolution: "semver@npm:7.5.3"
+"semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4":
+ version: 7.5.4
+ resolution: "semver@npm:7.5.4"
dependencies:
lru-cache: ^6.0.0
bin:
semver: bin/semver.js
- checksum: 4cf3bab7e8cf8c2ae521fc4bcc50a4d6912a836360796b23b9f1c26f45d27a73f870e47664df4770bde0dd60dc4d4781a05fd49fe91d72376ea5519b9e791459
- languageName: node
- linkType: hard
-
-"semver@npm:~7.0.0":
- version: 7.0.0
- resolution: "semver@npm:7.0.0"
- bin:
- semver: bin/semver.js
- checksum: 7fd341680a967a0abfd66f3a7d36ba44e52ff5d3e799e9a6cdb01a68160b64ef09be82b4af05459effeecdd836f002c2462555d2821cd890dfdfe36a0d9f56a5
+ checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e
languageName: node
linkType: hard
@@ -5320,7 +6237,7 @@ react@latest:
languageName: node
linkType: hard
-"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
+"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"
checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912
@@ -5334,12 +6251,12 @@ react@latest:
languageName: node
linkType: hard
-"simple-update-notifier@npm:^1.0.7":
- version: 1.1.0
- resolution: "simple-update-notifier@npm:1.1.0"
+"simple-update-notifier@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "simple-update-notifier@npm:2.0.0"
dependencies:
- semver: ~7.0.0
- checksum: 3cbbbc71a5d9a2924f0e3f42fbf3cbe1854bfe142203456b00d5233bdbbdeb5091b8067cd34fb00f81dbfbc29fc30dbb6e026b3d58ea0551e3f26c0e64082092
+ semver: ^7.5.3
+ checksum: 2a00bd03bfbcbf8a737c47ab230d7920f8bfb92d1159d421bdd194479f6d01ebc995d13fbe13d45dace23066a78a3dc6642999b4e3b38b847e6664191575b20c
languageName: node
linkType: hard
@@ -5610,7 +6527,7 @@ react@latest:
languageName: node
linkType: hard
-"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1":
+"strip-json-comments@npm:^3.1.1":
version: 3.1.1
resolution: "strip-json-comments@npm:3.1.1"
checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd
@@ -5687,9 +6604,9 @@ react@latest:
languageName: node
linkType: hard
-"terser@npm:^5.18.2":
- version: 5.18.2
- resolution: "terser@npm:5.18.2"
+"terser@npm:^5.19.2":
+ version: 5.19.2
+ resolution: "terser@npm:5.19.2"
dependencies:
"@jridgewell/source-map": ^0.3.3
acorn: ^8.8.2
@@ -5697,7 +6614,7 @@ react@latest:
source-map-support: ~0.5.20
bin:
terser: bin/terser
- checksum: 7a7203eceef379c6381f5b43aaed509d12381c7453baee28b320fcd968523347f1bf4ba297cd3155ec860e9604279a1c9bc7060b35d9c34fae94c80cfa2738c2
+ checksum: 95817b86619af33d8d143d7ae02dfcd9ac2cf4ea5b5cb7b208aaccff4cdc5594893960a4c3dcdac09863ebd43e2835ab173997041790aa77092c1d31ff40c95a
languageName: node
linkType: hard
@@ -5742,6 +6659,22 @@ react@latest:
languageName: node
linkType: hard
+"tr46@npm:~0.0.3":
+ version: 0.0.3
+ resolution: "tr46@npm:0.0.3"
+ checksum: 047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11
+ languageName: node
+ linkType: hard
+
+"ts-api-utils@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "ts-api-utils@npm:1.0.1"
+ peerDependencies:
+ typescript: ">=4.2.0"
+ checksum: 8e8a54afb44df31c413e6f5b817a305a37780726125db26e85d01d553efc31aacb3ccad111a14844b584776f24e71bcd4db2f2d3e9bce8031a329dc78f3e46e2
+ languageName: node
+ linkType: hard
+
"tsconfck@npm:^2.1.0":
version: 2.1.1
resolution: "tsconfck@npm:2.1.1"
@@ -5756,7 +6689,7 @@ react@latest:
languageName: node
linkType: hard
-"tsconfig-paths@npm:^3.14.1":
+"tsconfig-paths@npm:^3.14.2":
version: 3.14.2
resolution: "tsconfig-paths@npm:3.14.2"
dependencies:
@@ -5768,31 +6701,13 @@ react@latest:
languageName: node
linkType: hard
-"tslib@npm:^1.8.1":
- version: 1.14.1
- resolution: "tslib@npm:1.14.1"
- checksum: 69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2
- languageName: node
- linkType: hard
-
-"tslib@npm:^2.4.0, tslib@npm:^2.5.0":
+"tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.0":
version: 2.6.0
resolution: "tslib@npm:2.6.0"
checksum: 8d18020a8b9e70ecc529a744c883c095f177805efdbc9786bd50bd82a46c17547923133c5444fbcaf1f7f1c44e0e29c89f73ecf6d8fd1039668024a073a81dc6
languageName: node
linkType: hard
-"tsutils@npm:^3.21.0":
- version: 3.21.0
- resolution: "tsutils@npm:3.21.0"
- dependencies:
- tslib: ^1.8.1
- peerDependencies:
- typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- checksum: 02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2
- languageName: node
- linkType: hard
-
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"
@@ -5809,6 +6724,42 @@ react@latest:
languageName: node
linkType: hard
+"typed-array-buffer@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "typed-array-buffer@npm:1.0.0"
+ dependencies:
+ call-bind: ^1.0.2
+ get-intrinsic: ^1.2.1
+ is-typed-array: ^1.1.10
+ checksum: ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-length@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "typed-array-byte-length@npm:1.0.0"
+ dependencies:
+ call-bind: ^1.0.2
+ for-each: ^0.3.3
+ has-proto: ^1.0.1
+ is-typed-array: ^1.1.10
+ checksum: 6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-offset@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "typed-array-byte-offset@npm:1.0.0"
+ dependencies:
+ available-typed-arrays: ^1.0.5
+ call-bind: ^1.0.2
+ for-each: ^0.3.3
+ has-proto: ^1.0.1
+ is-typed-array: ^1.1.10
+ checksum: 4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5
+ languageName: node
+ linkType: hard
+
"typed-array-length@npm:^1.0.4":
version: 1.0.4
resolution: "typed-array-length@npm:1.0.4"
@@ -5820,14 +6771,23 @@ react@latest:
languageName: node
linkType: hard
-"typesafe-i18n@npm:^5.24.3":
- version: 5.24.3
- resolution: "typesafe-i18n@npm:5.24.3"
+"typedarray-to-buffer@npm:^3.1.5":
+ version: 3.1.5
+ resolution: "typedarray-to-buffer@npm:3.1.5"
+ dependencies:
+ is-typedarray: ^1.0.0
+ checksum: 4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027
+ languageName: node
+ linkType: hard
+
+"typesafe-i18n@npm:^5.25.1":
+ version: 5.25.1
+ resolution: "typesafe-i18n@npm:5.25.1"
peerDependencies:
typescript: ">=3.5.1"
bin:
typesafe-i18n: cli/typesafe-i18n.mjs
- checksum: 1f887c1c9ec1fbd78fe4ad08e81a10bf3661f81d61337a210b15c99a43ed3f7bee5602351694ac86ab2aabb4c5ef595edc9d2e4fa8dc3c6873ba9eaa8001bfab
+ checksum: 1e83383f0141e84a33dc0ad502387372bb0e062c1ce5e24548849f85223ab2be06a2375cfefd919fa9ea27900f37a7b0d9f42c30784d9a561b123543f11ad614
languageName: node
linkType: hard
@@ -5888,6 +6848,15 @@ react@latest:
languageName: node
linkType: hard
+"unique-string@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "unique-string@npm:2.0.0"
+ dependencies:
+ crypto-random-string: ^2.0.0
+ checksum: 11820db0a4ba069d174bedfa96c588fc2c96b083066fafa186851e563951d0de78181ac79c744c1ed28b51f9d82ac5b8196ff3e4560d0178046ef455d8c2244b
+ languageName: node
+ linkType: hard
+
"untildify@npm:^4.0.0":
version: 4.0.0
resolution: "untildify@npm:4.0.0"
@@ -5964,17 +6933,18 @@ react@latest:
languageName: node
linkType: hard
-"vite@npm:^4.3.9":
- version: 4.3.9
- resolution: "vite@npm:4.3.9"
+"vite@npm:^4.4.7":
+ version: 4.4.7
+ resolution: "vite@npm:4.4.7"
dependencies:
- esbuild: ^0.17.5
+ esbuild: ^0.18.10
fsevents: ~2.3.2
- postcss: ^8.4.23
- rollup: ^3.21.0
+ postcss: ^8.4.26
+ rollup: ^3.25.2
peerDependencies:
"@types/node": ">= 14"
less: "*"
+ lightningcss: ^1.21.0
sass: "*"
stylus: "*"
sugarss: "*"
@@ -5987,6 +6957,8 @@ react@latest:
optional: true
less:
optional: true
+ lightningcss:
+ optional: true
sass:
optional: true
stylus:
@@ -5997,7 +6969,38 @@ react@latest:
optional: true
bin:
vite: bin/vite.js
- checksum: 9eb1c99f16992e1b29e3eea76df312983f2e59915c369fede0f1e6716b80827857f88cfc75092aac807d20c73033c65be82a315a14ab312a52d22a9bdad1ca82
+ checksum: f0cd995ffd6d0311af98fa28a5ed8502c29d3aa4b3a12c812030e688f327ec17a95db0994e569bfddd6cfa602608b6892fc18d2944cbc1150d75c1ab3299bc5c
+ languageName: node
+ linkType: hard
+
+"vscode-languageserver-textdocument@npm:^1.0.8":
+ version: 1.0.10
+ resolution: "vscode-languageserver-textdocument@npm:1.0.10"
+ checksum: 0f4e82c262eaea2ed84e004c751453ac900a669763287dee92f9b631804a6ef1dabd62880185fa4d9a063f27d46e65c5251f7f0c8329aee5e3b3db6b6dfa2109
+ languageName: node
+ linkType: hard
+
+"vscode-uri@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "vscode-uri@npm:3.0.7"
+ checksum: 67bc15bc9c9bd2d70dae8b27f2a3164281c6ee8f6484e6c5945a44d89871da93d52f2ba339ebc12ab0c10991d4576171b5d85e49a542454329c16faf977e4c59
+ languageName: node
+ linkType: hard
+
+"webidl-conversions@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "webidl-conversions@npm:3.0.1"
+ checksum: 5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db
+ languageName: node
+ linkType: hard
+
+"whatwg-url@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "whatwg-url@npm:5.0.0"
+ dependencies:
+ tr46: ~0.0.3
+ webidl-conversions: ^3.0.0
+ checksum: 1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5
languageName: node
linkType: hard
@@ -6014,6 +7017,19 @@ react@latest:
languageName: node
linkType: hard
+"which-typed-array@npm:^1.1.10":
+ version: 1.1.11
+ resolution: "which-typed-array@npm:1.1.11"
+ dependencies:
+ available-typed-arrays: ^1.0.5
+ call-bind: ^1.0.2
+ for-each: ^0.3.3
+ gopd: ^1.0.1
+ has-tostringtag: ^1.0.0
+ checksum: 2cf4ce417beb50ae0ec3b1b479ea6d72d3e71986462ebd77344ca6398f77c7c59804eebe88f4126ce79f85edbcaa6c7783f54b0a5bf34f785eab7cbb35c30499
+ languageName: node
+ linkType: hard
+
"which-typed-array@npm:^1.1.9":
version: 1.1.9
resolution: "which-typed-array@npm:1.1.9"
@@ -6088,6 +7104,25 @@ react@latest:
languageName: node
linkType: hard
+"write-file-atomic@npm:^3.0.0":
+ version: 3.0.3
+ resolution: "write-file-atomic@npm:3.0.3"
+ dependencies:
+ imurmurhash: ^0.1.4
+ is-typedarray: ^1.0.0
+ signal-exit: ^3.0.2
+ typedarray-to-buffer: ^3.1.5
+ checksum: 7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e
+ languageName: node
+ linkType: hard
+
+"xdg-basedir@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "xdg-basedir@npm:4.0.0"
+ checksum: 1b5d70d58355af90363a4e0a51c992e77fc5a1d8de5822699c7d6e96a6afea9a1e048cb93312be6870f338ca45ebe97f000425028fa149c1e87d1b5b8b212a06
+ languageName: node
+ linkType: hard
+
"y18n@npm:^5.0.5":
version: 5.0.8
resolution: "y18n@npm:5.0.8"
diff --git a/lib/ArduinoJson/CHANGELOG.md b/lib/ArduinoJson/CHANGELOG.md
index f5a9bb0ad..28c506ab2 100644
--- a/lib/ArduinoJson/CHANGELOG.md
+++ b/lib/ArduinoJson/CHANGELOG.md
@@ -1,6 +1,15 @@
ArduinoJson: change log
=======================
+v6.21.3 (2023-07-23)
+-------
+
+* Fix compatibility with the Blynk libary (issue #1914)
+* Fix double lookup in `to()`
+* Fix double call to `size()` in `serializeMsgPack()`
+* Include `ARDUINOJSON_SLOT_OFFSET_SIZE` in the namespace name
+* Show a link to the documentation when user passes an unsupported input type
+
v6.21.2 (2023-04-12)
-------
diff --git a/lib/ArduinoJson/README.md b/lib/ArduinoJson/README.md
index dbd78a8a2..16d93a3a6 100644
--- a/lib/ArduinoJson/README.md
+++ b/lib/ArduinoJson/README.md
@@ -8,9 +8,9 @@
[](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/6.x)
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
[](https://coveralls.io/github/bblanchon/ArduinoJson?branch=6.x)
-[](https://www.ardu-badge.com/ArduinoJson/6.21.2)
-[](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.21.2)
-[](https://components.espressif.com/components/bblanchon/arduinojson)
+[](https://www.ardu-badge.com/ArduinoJson/6.21.3)
+[](https://registry.platformio.org/packages/libraries/bblanchon/ArduinoJson?version=6.21.3)
+[](https://components.espressif.com/components/bblanchon/arduinojson)
[](https://github.com/bblanchon/ArduinoJson/stargazers)
[](https://github.com/sponsors/bblanchon)
diff --git a/lib/ArduinoJson/library.properties b/lib/ArduinoJson/library.properties
index 414daa469..6a285cf0d 100644
--- a/lib/ArduinoJson/library.properties
+++ b/lib/ArduinoJson/library.properties
@@ -1,5 +1,5 @@
name=ArduinoJson
-version=6.21.2
+version=6.21.3
author=Benoit Blanchon
maintainer=Benoit Blanchon
sentence=A simple and efficient JSON library for embedded C++.
diff --git a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp
index 5f18c7b30..44437686a 100644
--- a/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/Deserialization/Reader.hpp
@@ -18,7 +18,9 @@ struct Reader {
Reader(TSource& source) : source_(&source) {}
int read() {
- return source_->read(); // Error here? You passed an unsupported input type
+ // clang-format off
+ return source_->read(); // Error here? See https://arduinojson.org/v6/invalid-input/
+ // clang-format on
}
size_t readBytes(char* buffer, size_t length) {
diff --git a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp
index 65769a16c..6125330c2 100644
--- a/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/MsgPack/MsgPackSerializer.hpp
@@ -47,7 +47,7 @@ class MsgPackSerializer : public Visitor {
size_t visitArray(const CollectionData& array) {
size_t n = array.size();
if (n < 0x10) {
- writeByte(uint8_t(0x90 + array.size()));
+ writeByte(uint8_t(0x90 + n));
} else if (n < 0x10000) {
writeByte(0xDC);
writeInteger(uint16_t(n));
diff --git a/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp b/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp
index 7f3b8b49b..7cce17480 100644
--- a/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/Namespace.hpp
@@ -11,16 +11,15 @@
#ifndef ARDUINOJSON_VERSION_NAMESPACE
# define ARDUINOJSON_VERSION_NAMESPACE \
- ARDUINOJSON_CONCAT3( \
- ARDUINOJSON_CONCAT4(V, ARDUINOJSON_VERSION_MAJOR, \
- ARDUINOJSON_VERSION_MINOR, \
- ARDUINOJSON_VERSION_REVISION), \
+ ARDUINOJSON_CONCAT4( \
+ ARDUINOJSON_VERSION_MACRO, \
ARDUINOJSON_BIN2ALPHA( \
ARDUINOJSON_ENABLE_PROGMEM, ARDUINOJSON_USE_LONG_LONG, \
ARDUINOJSON_USE_DOUBLE, ARDUINOJSON_ENABLE_STRING_DEDUPLICATION), \
ARDUINOJSON_BIN2ALPHA( \
ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, \
- ARDUINOJSON_ENABLE_COMMENTS, ARDUINOJSON_DECODE_UNICODE))
+ ARDUINOJSON_ENABLE_COMMENTS, ARDUINOJSON_DECODE_UNICODE), \
+ ARDUINOJSON_SLOT_OFFSET_SIZE)
#endif
diff --git a/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp b/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp
index b91baf74a..36e5c44a4 100644
--- a/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/Polyfills/preprocessor.hpp
@@ -6,8 +6,6 @@
#define ARDUINOJSON_CONCAT_(A, B) A##B
#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_CONCAT_(A, B)
-#define ARDUINOJSON_CONCAT3(A, B, C) \
- ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), C)
#define ARDUINOJSON_CONCAT4(A, B, C, D) \
ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), ARDUINOJSON_CONCAT2(C, D))
@@ -17,7 +15,7 @@
#define ARDUINOJSON_BIN2ALPHA_0011() D
#define ARDUINOJSON_BIN2ALPHA_0100() E
#define ARDUINOJSON_BIN2ALPHA_0101() F
-#define ARDUINOJSON_BIN2ALPHA_0110() F
+#define ARDUINOJSON_BIN2ALPHA_0110() G
#define ARDUINOJSON_BIN2ALPHA_0111() H
#define ARDUINOJSON_BIN2ALPHA_1000() I
#define ARDUINOJSON_BIN2ALPHA_1001() J
diff --git a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp
index 66a473bbd..c122a2f45 100644
--- a/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/Variant/VariantImpl.hpp
@@ -138,8 +138,9 @@ template
template
typename enable_if::value, JsonVariant>::type
VariantRefBase::to() const {
- variantSetNull(getOrCreateData());
- return *this;
+ auto data = getOrCreateData();
+ variantSetNull(data);
+ return JsonVariant(getPool(), data);
}
template
diff --git a/lib/ArduinoJson/src/ArduinoJson/version.hpp b/lib/ArduinoJson/src/ArduinoJson/version.hpp
index f0ee0afa7..5e6500a46 100644
--- a/lib/ArduinoJson/src/ArduinoJson/version.hpp
+++ b/lib/ArduinoJson/src/ArduinoJson/version.hpp
@@ -4,7 +4,8 @@
#pragma once
-#define ARDUINOJSON_VERSION "6.21.2"
+#define ARDUINOJSON_VERSION "6.21.3"
#define ARDUINOJSON_VERSION_MAJOR 6
#define ARDUINOJSON_VERSION_MINOR 21
-#define ARDUINOJSON_VERSION_REVISION 2
+#define ARDUINOJSON_VERSION_REVISION 3
+#define ARDUINOJSON_VERSION_MACRO V6213
diff --git a/lib/PButton/PButon.cpp b/lib/PButton/PButon.cpp
index a19fe96df..28eb41f0f 100644
--- a/lib/PButton/PButon.cpp
+++ b/lib/PButton/PButon.cpp
@@ -54,7 +54,7 @@ bool PButton::init(uint8_t pin, bool pullMode) {
#if defined(ESP32)
pinMode(pin_, pullMode ? INPUT_PULLUP : INPUT_PULLDOWN);
-#else // esp8266 and standalone
+#else // esp8266 and standalone
pinMode(pin_, pullMode ? INPUT_PULLUP : INPUT);
#endif
enabled_ = (digitalRead(pin_) == pullMode); // see if a button is connected
diff --git a/lib/PButton/PButton.h b/lib/PButton/PButton.h
index 16899ff49..d7be73447 100644
--- a/lib/PButton/PButton.h
+++ b/lib/PButton/PButton.h
@@ -47,21 +47,21 @@ class PButton {
bool pullMode_;
bool enabled_;
- bool state_; // Value read from button
- bool lastState_; // Last value of button state
- bool dblClickWaiting_; // whether we're waiting for a double click (down)
- bool dblClickOnNextUp_; // whether to register a double click on next release, or whether to wait and click
- bool singleClickOK_; // whether it's OK to do a single click
+ bool state_; // Value read from button
+ bool lastState_; // Last value of button state
+ bool dblClickWaiting_; // whether we're waiting for a double click (down)
+ bool dblClickOnNextUp_; // whether to register a double click on next release, or whether to wait and click
+ bool singleClickOK_; // whether it's OK to do a single click
- uint32_t downTime_; // time the button was pressed down
- uint32_t upTime_; // time the button was released
+ uint32_t downTime_; // time the button was pressed down
+ uint32_t upTime_; // time the button was released
bool ignoreUP_; // whether to ignore the button release because the click+hold was triggered
bool waitForUP_; // when held, whether to wait for the up event
bool longPressHappened_; // whether or not the hold event happened already
bool vLongPressHappened_; // whether or not the long hold event happened already
- bool buttonBusy_; // false if idle
+ bool buttonBusy_; // false if idle
buttonEventHandler cb_onClick, cb_onDblClick, cb_onLongPress, cb_onVLongPress;
};
diff --git a/lib/espMqttClient/src/Config.h b/lib/espMqttClient/src/Config.h
index aba779565..940c2dea8 100644
--- a/lib/espMqttClient/src/Config.h
+++ b/lib/espMqttClient/src/Config.h
@@ -9,7 +9,7 @@ the LICENSE file.
#pragma once
#ifndef EMC_TX_TIMEOUT
-#define EMC_TX_TIMEOUT 5000
+#define EMC_TX_TIMEOUT 2000
#endif
#ifndef EMC_RX_BUFFER_SIZE
@@ -29,7 +29,7 @@ the LICENSE file.
#endif
#ifndef EMC_MIN_FREE_MEMORY
-#define EMC_MIN_FREE_MEMORY 4096
+#define EMC_MIN_FREE_MEMORY 16384
#endif
#ifndef EMC_ESP8266_MULTITHREADING
diff --git a/lib/espMqttClient/src/Helpers.h b/lib/espMqttClient/src/Helpers.h
index 4a19224ba..05ab136d9 100644
--- a/lib/espMqttClient/src/Helpers.h
+++ b/lib/espMqttClient/src/Helpers.h
@@ -16,7 +16,7 @@ the LICENSE file.
#define EMC_SEMAPHORE_TAKE() xSemaphoreTake(_xSemaphore, portMAX_DELAY)
#define EMC_SEMAPHORE_GIVE() xSemaphoreGive(_xSemaphore)
#define EMC_GET_FREE_MEMORY() std::max(ESP.getMaxAllocHeap(), ESP.getMaxAllocPsram())
- #define EMC_YIELD() taskYIELD()
+ #define EMC_YIELD() vTaskDelay(1)
#define EMC_GENERATE_CLIENTID(x) snprintf(x, EMC_CLIENTID_LENGTH, "esp32%06llx", ESP.getEfuseMac());
#elif defined(ARDUINO_ARCH_ESP8266)
#include // millis(), ESP.getFreeHeap();
diff --git a/lib/espMqttClient/src/MqttClient.cpp b/lib/espMqttClient/src/MqttClient.cpp
index 2f1d0d643..a428158ed 100644
--- a/lib/espMqttClient/src/MqttClient.cpp
+++ b/lib/espMqttClient/src/MqttClient.cpp
@@ -197,7 +197,7 @@ const char * MqttClient::getClientId() const {
}
void MqttClient::loop() {
- switch (_state) {
+ switch ((State)_state) { // modified by proddy for EMS-ESP compiling standalone
case State::disconnected:
#if defined(ARDUINO_ARCH_ESP32)
if (_useInternalTask == espMqttClientTypes::UseInternalTask::YES) {
@@ -332,8 +332,8 @@ int MqttClient::_sendPacket() {
EMC_SEMAPHORE_TAKE();
OutgoingPacket * packet = _outbox.getCurrent();
- int32_t wantToWrite = 0;
- int32_t written = 0;
+ size_t wantToWrite = 0;
+ size_t written = 0;
if (packet && (wantToWrite == written)) {
// mixing signed with unsigned here but safe because of MQTT packet size limits
wantToWrite = packet->packet.available(_bytesSent);
@@ -341,12 +341,7 @@ int MqttClient::_sendPacket() {
EMC_SEMAPHORE_GIVE();
return 0;
}
- written = _transport->write(packet->packet.data(_bytesSent), wantToWrite);
- if (written < 0) {
- emc_log_w("Write error, check connection");
- EMC_SEMAPHORE_GIVE();
- return -1;
- }
+ written = _transport->write(packet->packet.data(_bytesSent), wantToWrite);
packet->timeSent = millis();
_lastClientActivity = millis();
_bytesSent += written;
@@ -707,7 +702,9 @@ uint16_t MqttClient::getQueue() const {
espMqttClientInternals::Outbox::Iterator it = _outbox.front();
uint16_t count = 0;
while (it) {
+ // if (it.get()->packet.packetType() == PacketType.PUBLISH) {
++count;
+ // }
++it;
}
EMC_SEMAPHORE_GIVE();
diff --git a/lib/espMqttClient/src/MqttClient.h b/lib/espMqttClient/src/MqttClient.h
index 6d36e0af5..d09db68c5 100644
--- a/lib/espMqttClient/src/MqttClient.h
+++ b/lib/espMqttClient/src/MqttClient.h
@@ -24,167 +24,170 @@ the LICENSE file.
#include "Transport/Transport.h"
class MqttClient {
- public:
- virtual ~MqttClient();
- bool connected() const;
- bool disconnected() const;
- bool connect();
- bool disconnect(bool force = false);
- template
- uint16_t subscribe(const char* topic, uint8_t qos, Args&&... args) {
- uint16_t packetId = _getNextPacketId();
- if (_state != State::connected) {
- packetId = 0;
- } else {
- EMC_SEMAPHORE_TAKE();
- if (!_addPacket(packetId, topic, qos, std::forward(args) ...)) {
- emc_log_e("Could not create SUBSCRIBE packet");
- packetId = 0;
- }
- EMC_SEMAPHORE_GIVE();
+ public:
+ virtual ~MqttClient();
+ bool connected() const;
+ bool disconnected() const;
+ bool connect();
+ bool disconnect(bool force = false);
+ template
+ uint16_t subscribe(const char * topic, uint8_t qos, Args &&... args) {
+ uint16_t packetId = _getNextPacketId();
+ if (_state != State::connected) {
+ packetId = 0;
+ } else {
+ EMC_SEMAPHORE_TAKE();
+ if (!_addPacket(packetId, topic, qos, std::forward(args)...)) {
+ emc_log_e("Could not create SUBSCRIBE packet");
+ packetId = 0;
+ }
+ EMC_SEMAPHORE_GIVE();
+ }
+ return packetId;
}
- return packetId;
- }
- template
- uint16_t unsubscribe(const char* topic, Args&&... args) {
- uint16_t packetId = _getNextPacketId();
- if (_state != State::connected) {
- packetId = 0;
- } else {
- EMC_SEMAPHORE_TAKE();
- if (!_addPacket(packetId, topic, std::forward(args) ...)) {
- emc_log_e("Could not create UNSUBSCRIBE packet");
- packetId = 0;
- }
- EMC_SEMAPHORE_GIVE();
+ template
+ uint16_t unsubscribe(const char * topic, Args &&... args) {
+ uint16_t packetId = _getNextPacketId();
+ if (_state != State::connected) {
+ packetId = 0;
+ } else {
+ EMC_SEMAPHORE_TAKE();
+ if (!_addPacket(packetId, topic, std::forward(args)...)) {
+ emc_log_e("Could not create UNSUBSCRIBE packet");
+ packetId = 0;
+ }
+ EMC_SEMAPHORE_GIVE();
+ }
+ return packetId;
}
- return packetId;
- }
- uint16_t publish(const char* topic, uint8_t qos, bool retain, const uint8_t* payload, size_t length);
- uint16_t publish(const char* topic, uint8_t qos, bool retain, const char* payload);
- uint16_t publish(const char* topic, uint8_t qos, bool retain, espMqttClientTypes::PayloadCallback callback, size_t length);
- void clearQueue(bool deleteSessionData = false); // Not MQTT compliant and may cause unpredictable results when `deleteSessionData` = true!
- const char* getClientId() const;
- uint16_t getQueue() const;
- void loop();
+ uint16_t publish(const char * topic, uint8_t qos, bool retain, const uint8_t * payload, size_t length);
+ uint16_t publish(const char * topic, uint8_t qos, bool retain, const char * payload);
+ uint16_t publish(const char * topic, uint8_t qos, bool retain, espMqttClientTypes::PayloadCallback callback, size_t length);
+ void clearQueue(bool deleteSessionData = false); // Not MQTT compliant and may cause unpredictable results when `deleteSessionData` = true!
+ const char * getClientId() const;
+ uint16_t getQueue() const;
+ void loop();
- protected:
- explicit MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint8_t priority = 1, uint8_t core = 1);
- espMqttClientTypes::UseInternalTask _useInternalTask;
- espMqttClientInternals::Transport* _transport;
+ protected:
+ explicit MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint8_t priority = 1, uint8_t core = 1);
+ espMqttClientTypes::UseInternalTask _useInternalTask;
+ espMqttClientInternals::Transport * _transport;
- espMqttClientTypes::OnConnectCallback _onConnectCallback;
- espMqttClientTypes::OnDisconnectCallback _onDisconnectCallback;
- espMqttClientTypes::OnSubscribeCallback _onSubscribeCallback;
- espMqttClientTypes::OnUnsubscribeCallback _onUnsubscribeCallback;
- espMqttClientTypes::OnMessageCallback _onMessageCallback;
- espMqttClientTypes::OnPublishCallback _onPublishCallback;
- espMqttClientTypes::OnErrorCallback _onErrorCallback;
- typedef void(*mqttClientHook)(void*);
- const char* _clientId;
- IPAddress _ip;
- const char* _host;
- uint16_t _port;
- bool _useIp;
- uint32_t _keepAlive;
- bool _cleanSession;
- const char* _username;
- const char* _password;
- const char* _willTopic;
- const uint8_t* _willPayload;
- uint16_t _willPayloadLength;
- uint8_t _willQos;
- bool _willRetain;
- uint32_t _timeout;
+ espMqttClientTypes::OnConnectCallback _onConnectCallback;
+ espMqttClientTypes::OnDisconnectCallback _onDisconnectCallback;
+ espMqttClientTypes::OnSubscribeCallback _onSubscribeCallback;
+ espMqttClientTypes::OnUnsubscribeCallback _onUnsubscribeCallback;
+ espMqttClientTypes::OnMessageCallback _onMessageCallback;
+ espMqttClientTypes::OnPublishCallback _onPublishCallback;
+ espMqttClientTypes::OnErrorCallback _onErrorCallback;
+ typedef void (*mqttClientHook)(void *);
+ const char * _clientId;
+ IPAddress _ip;
+ const char * _host;
+ uint16_t _port;
+ bool _useIp;
+ uint32_t _keepAlive;
+ bool _cleanSession;
+ const char * _username;
+ const char * _password;
+ const char * _willTopic;
+ const uint8_t * _willPayload;
+ uint16_t _willPayloadLength;
+ uint8_t _willQos;
+ bool _willRetain;
+ uint32_t _timeout;
- // state is protected to allow state changes by the transport system, defined in child classes
- // eg. to allow AsyncTCP
- enum class State {
- disconnected = 0,
- connectingTcp1 = 1,
- connectingTcp2 = 2,
- connectingMqtt = 3,
- connected = 4,
- disconnectingMqtt1 = 5,
- disconnectingMqtt2 = 6,
- disconnectingTcp1 = 7,
- disconnectingTcp2 = 8
- };
- std::atomic _state;
+ // state is protected to allow state changes by the transport system, defined in child classes
+ // eg. to allow AsyncTCP
+ enum class State {
+ disconnected = 0,
+ connectingTcp1 = 1,
+ connectingTcp2 = 2,
+ connectingMqtt = 3,
+ connected = 4,
+ disconnectingMqtt1 = 5,
+ disconnectingMqtt2 = 6,
+ disconnectingTcp1 = 7,
+ disconnectingTcp2 = 8
+ };
+ std::atomic _state;
- private:
- char _generatedClientId[EMC_CLIENTID_LENGTH];
- uint16_t _packetId;
+ private:
+ char _generatedClientId[EMC_CLIENTID_LENGTH];
+ uint16_t _packetId;
#if defined(ARDUINO_ARCH_ESP32)
- SemaphoreHandle_t _xSemaphore;
- TaskHandle_t _taskHandle;
- static void _loop(MqttClient* c);
+ SemaphoreHandle_t _xSemaphore;
+ TaskHandle_t _taskHandle;
+ static void _loop(MqttClient * c);
#elif defined(ARDUINO_ARCH_ESP8266) && EMC_ESP8266_MULTITHREADING
- std::atomic _xSemaphore = false;
+ std::atomic _xSemaphore = false;
#elif defined(__linux__)
- std::mutex mtx;
+ mutable std::mutex mtx; // modified by proddy for EMS-ESP compiling standalone
#endif
- uint8_t _rxBuffer[EMC_RX_BUFFER_SIZE];
- struct OutgoingPacket {
- uint32_t timeSent;
- espMqttClientInternals::Packet packet;
+ uint8_t _rxBuffer[EMC_RX_BUFFER_SIZE];
+ struct OutgoingPacket {
+ uint32_t timeSent;
+ espMqttClientInternals::Packet packet;
+ template
+ OutgoingPacket(uint32_t t, espMqttClientTypes::Error error, Args &&... args)
+ : timeSent(t)
+ , packet(error, std::forward(args)...) {
+ }
+ };
+ espMqttClientInternals::Outbox _outbox;
+ size_t _bytesSent;
+ espMqttClientInternals::Parser _parser;
+ uint32_t _lastClientActivity;
+ uint32_t _lastServerActivity;
+ bool _pingSent;
+ espMqttClientTypes::DisconnectReason _disconnectReason;
+
+ uint16_t _getNextPacketId();
+
template
- OutgoingPacket(uint32_t t, espMqttClientTypes::Error error, Args&&... args) :
- timeSent(t),
- packet(error, std::forward(args) ...) {}
- };
- espMqttClientInternals::Outbox _outbox;
- size_t _bytesSent;
- espMqttClientInternals::Parser _parser;
- uint32_t _lastClientActivity;
- uint32_t _lastServerActivity;
- bool _pingSent;
- espMqttClientTypes::DisconnectReason _disconnectReason;
+ bool _addPacket(Args &&... args) {
+ espMqttClientTypes::Error error(espMqttClientTypes::Error::SUCCESS);
+ espMqttClientInternals::Outbox::Iterator it = _outbox.emplace(0, error, std::forward(args)...);
+ if (it && error == espMqttClientTypes::Error::SUCCESS)
+ return true;
+ return false;
+ }
- uint16_t _getNextPacketId();
+ template
+ bool _addPacketFront(Args &&... args) {
+ espMqttClientTypes::Error error(espMqttClientTypes::Error::SUCCESS);
+ espMqttClientInternals::Outbox::Iterator it = _outbox.emplaceFront(0, error, std::forward(args)...);
+ if (it && error == espMqttClientTypes::Error::SUCCESS)
+ return true;
+ return false;
+ }
- template
- bool _addPacket(Args&&... args) {
- espMqttClientTypes::Error error(espMqttClientTypes::Error::SUCCESS);
- espMqttClientInternals::Outbox::Iterator it = _outbox.emplace(0, error, std::forward(args) ...);
- if (it && error == espMqttClientTypes::Error::SUCCESS) return true;
- return false;
- }
+ void _checkOutbox();
+ int _sendPacket();
+ bool _advanceOutbox();
+ void _checkIncoming();
+ void _checkPing();
+ void _checkTimeout();
- template
- bool _addPacketFront(Args&&... args) {
- espMqttClientTypes::Error error(espMqttClientTypes::Error::SUCCESS);
- espMqttClientInternals::Outbox::Iterator it = _outbox.emplaceFront(0, error, std::forward(args) ...);
- if (it && error == espMqttClientTypes::Error::SUCCESS) return true;
- return false;
- }
+ void _onConnack();
+ void _onPublish();
+ void _onPuback();
+ void _onPubrec();
+ void _onPubrel();
+ void _onPubcomp();
+ void _onSuback();
+ void _onUnsuback();
- void _checkOutbox();
- int _sendPacket();
- bool _advanceOutbox();
- void _checkIncoming();
- void _checkPing();
- void _checkTimeout();
+ void _clearQueue(int clearData); // 0: keep session,
+ // 1: keep only PUBLISH qos > 0
+ // 2: delete all
+ void _onError(uint16_t packetId, espMqttClientTypes::Error error);
- void _onConnack();
- void _onPublish();
- void _onPuback();
- void _onPubrec();
- void _onPubrel();
- void _onPubcomp();
- void _onSuback();
- void _onUnsuback();
-
- void _clearQueue(int clearData); // 0: keep session,
- // 1: keep only PUBLISH qos > 0
- // 2: delete all
- void _onError(uint16_t packetId, espMqttClientTypes::Error error);
-
- #if defined(ARDUINO_ARCH_ESP32)
- #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO
- size_t _highWaterMark;
- #endif
- #endif
+#if defined(ARDUINO_ARCH_ESP32)
+#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_INFO
+ size_t _highWaterMark;
+#endif
+#endif
};
diff --git a/lib/espMqttClient/src/Transport/ClientPosix.cpp b/lib/espMqttClient/src/Transport/ClientPosix.cpp
index 83b555d1b..edccad065 100644
--- a/lib/espMqttClient/src/Transport/ClientPosix.cpp
+++ b/lib/espMqttClient/src/Transport/ClientPosix.cpp
@@ -38,7 +38,7 @@ bool ClientPosix::connect(IPAddress ip, uint16_t port) {
memset(&_host, 0, sizeof(_host));
_host.sin_family = AF_INET;
_host.sin_addr.s_addr = htonl(uint32_t(ip));
- _host.sin_port = ::htons(port);
+ _host.sin_port = htons(port); // modified by proddy for EMS-ESP compiling standalone
int ret = ::connect(_sockfd, (struct sockaddr *)&_host, sizeof(_host));
diff --git a/lib/framework/APSettingsService.cpp b/lib/framework/APSettingsService.cpp
index 4c3c7994d..d4811be01 100644
--- a/lib/framework/APSettingsService.cpp
+++ b/lib/framework/APSettingsService.cpp
@@ -1,6 +1,6 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
APSettingsService::APSettingsService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager)
: _httpEndpoint(APSettings::read, APSettings::update, this, server, AP_SETTINGS_SERVICE_PATH, securityManager)
diff --git a/lib/framework/ESP8266React.h b/lib/framework/ESP8266React.h
index 32ca0f55c..e44397c9e 100644
--- a/lib/framework/ESP8266React.h
+++ b/lib/framework/ESP8266React.h
@@ -59,10 +59,17 @@ class ESP8266React {
return &_mqttSettingsService;
}
- espMqttClient * getMqttClient() {
+ MqttClient * getMqttClient() {
return _mqttSettingsService.getMqttClient();
}
+ void setWill(const char * will_topic) {
+ _mqttSettingsService.setWill(will_topic);
+ }
+ void onMessage(espMqttClientTypes::OnMessageCallback callback) {
+ _mqttSettingsService.onMessage(callback);
+ }
+
void factoryReset() {
_factoryResetService.factoryReset();
}
diff --git a/lib/framework/FactoryResetService.cpp b/lib/framework/FactoryResetService.cpp
index 46a6443d8..6bb631b02 100644
--- a/lib/framework/FactoryResetService.cpp
+++ b/lib/framework/FactoryResetService.cpp
@@ -18,10 +18,7 @@ void FactoryResetService::handleRequest(AsyncWebServerRequest * request) {
* Delete function assumes that all files are stored flat, within the config directory.
*/
void FactoryResetService::factoryReset() {
- /*
- * Based on LittleFS. Modified by proddy
- * Could be replaced with fs.rmdir(FS_CONFIG_DIRECTORY) in IDF 4.2
- */
+ // TODO To replaced with fs.rmdir(FS_CONFIG_DIRECTORY) now we're using IDF 4.2
File root = fs->open(FS_CONFIG_DIRECTORY);
File file;
while (file = root.openNextFile()) {
diff --git a/lib/framework/FeaturesService.cpp b/lib/framework/FeaturesService.cpp
index 67a97cd36..f8a82f441 100644
--- a/lib/framework/FeaturesService.cpp
+++ b/lib/framework/FeaturesService.cpp
@@ -1,4 +1,5 @@
#include
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
@@ -9,36 +10,10 @@ FeaturesService::FeaturesService(AsyncWebServer * server) {
void FeaturesService::features(AsyncWebServerRequest * request) {
AsyncJsonResponse * response = new AsyncJsonResponse(false, MAX_FEATURES_SIZE);
JsonObject root = response->getRoot();
-#if FT_ENABLED(FT_PROJECT)
- root["project"] = true;
-#else
- root["project"] = false;
-#endif
-#if FT_ENABLED(FT_SECURITY)
- root["security"] = true;
-#else
- root["security"] = false;
-#endif
-#if FT_ENABLED(FT_MQTT)
- root["mqtt"] = true;
-#else
- root["mqtt"] = false;
-#endif
-#if FT_ENABLED(FT_NTP)
- root["ntp"] = true;
-#else
- root["ntp"] = false;
-#endif
-#if FT_ENABLED(FT_OTA)
- root["ota"] = true;
-#else
- root["ota"] = false;
-#endif
-#if FT_ENABLED(FT_UPLOAD_FIRMWARE)
- root["upload_firmware"] = true;
-#else
- root["upload_firmware"] = false;
-#endif
+
+ root["version"] = EMSESP_APP_VERSION;
+ root["platform"] = EMSESP_PLATFORM;
+
response->setLength();
request->send(response);
}
diff --git a/lib/framework/HttpEndpoint.h b/lib/framework/HttpEndpoint.h
index 0e0014049..448d36b46 100644
--- a/lib/framework/HttpEndpoint.h
+++ b/lib/framework/HttpEndpoint.h
@@ -115,7 +115,7 @@ class HttpPostEndpoint {
response->setLength();
if (outcome == StateUpdateResult::CHANGED_RESTART) {
- response->setCode(205); // added by proddy, reboot required
+ response->setCode(205); // reboot required
}
request->send(response);
}
diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp
index 59b5c0f43..e6c0caec7 100644
--- a/lib/framework/MqttSettingsService.cpp
+++ b/lib/framework/MqttSettingsService.cpp
@@ -1,6 +1,6 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
@@ -34,10 +34,8 @@ MqttSettingsService::MqttSettingsService(AsyncWebServer * server, FS * fs, Secur
, _reconfigureMqtt(false)
, _disconnectedAt(0)
, _disconnectReason(espMqttClientTypes::DisconnectReason::TCP_DISCONNECTED)
- , _mqttClient(espMqttClientTypes::UseInternalTask::NO) {
+ , _mqttClient(nullptr) {
WiFi.onEvent(std::bind(&MqttSettingsService::WiFiEvent, this, _1, _2));
- _mqttClient.onConnect(std::bind(&MqttSettingsService::onMqttConnect, this, _1));
- _mqttClient.onDisconnect(std::bind(&MqttSettingsService::onMqttDisconnect, this, _1));
addUpdateHandler([&](const String & originId) { onConfigUpdated(); }, false);
}
@@ -46,18 +44,46 @@ MqttSettingsService::~MqttSettingsService() {
void MqttSettingsService::begin() {
_fsPersistence.readFromFS();
+ startClient();
+}
+
+void MqttSettingsService::startClient() {
+ static bool isSecure = false;
+ if (_mqttClient != nullptr) {
+ // do we need to change the client?
+ if ((isSecure && _state.rootCA.length() > 0) || (!isSecure && _state.rootCA.length() == 0)) {
+ return;
+ }
+ delete _mqttClient;
+ }
+#if CONFIG_IDF_TARGET_ESP32S3
+ if (_state.rootCA.length() > 0) {
+ isSecure = true;
+ _mqttClient = static_cast(new espMqttClientSecure(espMqttClientTypes::UseInternalTask::NO));
+ if (_state.rootCA == "insecure") {
+ static_cast(_mqttClient)->setInsecure();
+ } else {
+ String certificate = "-----BEGIN CERTIFICATE-----\n" + _state.rootCA + "\n-----END CERTIFICATE-----\n";
+ static_cast(_mqttClient)->setCACert(retainCstr(certificate.c_str(), &_retainedRootCA));
+ }
+ static_cast(_mqttClient)->onConnect(std::bind(&MqttSettingsService::onMqttConnect, this, _1));
+ static_cast(_mqttClient)->onDisconnect(std::bind(&MqttSettingsService::onMqttDisconnect, this, _1));
+ return;
+ }
+#endif
+ isSecure = false;
+ _mqttClient = static_cast(new espMqttClient(espMqttClientTypes::UseInternalTask::NO));
+ static_cast(_mqttClient)->onConnect(std::bind(&MqttSettingsService::onMqttConnect, this, _1));
+ static_cast(_mqttClient)->onDisconnect(std::bind(&MqttSettingsService::onMqttDisconnect, this, _1));
}
void MqttSettingsService::loop() {
if (_reconfigureMqtt || (_disconnectedAt && (uint32_t)(uuid::get_uptime() - _disconnectedAt) >= MQTT_RECONNECTION_DELAY)) {
// reconfigure MQTT client
- _disconnectedAt = uuid::get_uptime();
- if (configureMqtt()) {
- _disconnectedAt = 0;
- }
+ _disconnectedAt = configureMqtt() ? 0 : uuid::get_uptime();
_reconfigureMqtt = false;
}
- _mqttClient.loop();
+ _mqttClient->loop();
}
bool MqttSettingsService::isEnabled() {
@@ -65,19 +91,39 @@ bool MqttSettingsService::isEnabled() {
}
bool MqttSettingsService::isConnected() {
- return _mqttClient.connected();
+ return _mqttClient->connected();
}
const char * MqttSettingsService::getClientId() {
- return _mqttClient.getClientId();
+ return _mqttClient->getClientId();
+}
+
+void MqttSettingsService::setWill(const char * topic) {
+#if CONFIG_IDF_TARGET_ESP32S3
+ if (_state.rootCA.length() > 0) {
+ static_cast(_mqttClient)->setWill(topic, 1, true, "offline");
+ return;
+ }
+#endif
+ static_cast(_mqttClient)->setWill(topic, 1, true, "offline");
+}
+
+void MqttSettingsService::onMessage(espMqttClientTypes::OnMessageCallback callback) {
+#if CONFIG_IDF_TARGET_ESP32S3
+ if (_state.rootCA.length() > 0) {
+ static_cast(_mqttClient)->onMessage(callback);
+ return;
+ }
+#endif
+ static_cast(_mqttClient)->onMessage(callback);
}
espMqttClientTypes::DisconnectReason MqttSettingsService::getDisconnectReason() {
return _disconnectReason;
}
-espMqttClient * MqttSettingsService::getMqttClient() {
- return &_mqttClient;
+MqttClient * MqttSettingsService::getMqttClient() {
+ return _mqttClient;
}
void MqttSettingsService::onMqttConnect(bool sessionPresent) {
@@ -87,7 +133,6 @@ void MqttSettingsService::onMqttConnect(bool sessionPresent) {
}
void MqttSettingsService::onMqttDisconnect(espMqttClientTypes::DisconnectReason reason) {
- // emsesp::EMSESP::logger().info("Disconnected from MQTT reason: %d", (uint8_t)reason);
_disconnectReason = reason;
if (!_disconnectedAt) {
_disconnectedAt = uuid::get_uptime();
@@ -99,7 +144,7 @@ void MqttSettingsService::onConfigUpdated() {
_reconfigureMqtt = true;
_disconnectedAt = 0;
- // added by proddy
+ startClient();
emsesp::EMSESP::mqtt_.start(); // reload EMS-ESP MQTT settings
}
@@ -110,15 +155,13 @@ void MqttSettingsService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
case ARDUINO_EVENT_ETH_GOT_IP6:
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
if (_state.enabled) {
- // emsesp::EMSESP::logger().info("IPv4 Network connection found, starting MQTT client");
onConfigUpdated();
}
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
case ARDUINO_EVENT_ETH_DISCONNECTED:
if (_state.enabled) {
- // emsesp::EMSESP::logger().info("Network connection dropped, stopping MQTT client");
- _mqttClient.disconnect(true);
+ _mqttClient->disconnect(true);
}
break;
@@ -128,29 +171,54 @@ void MqttSettingsService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) {
}
bool MqttSettingsService::configureMqtt() {
- // disconnect if connected
- _mqttClient.disconnect(true);
+ // disconnect if already connected
+ if (_mqttClient->connected()) {
+ emsesp::EMSESP::logger().info("Disconnecting to configure");
+ _mqttClient->disconnect(true);
+ }
+
// only connect if WiFi is connected and MQTT is enabled
if (_state.enabled && emsesp::EMSESP::system_.network_connected() && !_state.host.isEmpty()) {
- // emsesp::EMSESP::logger().info("Configuring MQTT client");
- _mqttClient.setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port);
- if (_state.username.length() > 0) {
- _mqttClient.setCredentials(retainCstr(_state.username.c_str(), &_retainedUsername),
- retainCstr(_state.password.length() > 0 ? _state.password.c_str() : nullptr, &_retainedPassword));
- } else {
- _mqttClient.setCredentials(retainCstr(nullptr, &_retainedUsername), retainCstr(nullptr, &_retainedPassword));
+ _reconfigureMqtt = false;
+#if CONFIG_IDF_TARGET_ESP32S3
+ if (_state.rootCA.length() > 0) {
+ // emsesp::EMSESP::logger().info("Start secure MQTT with rootCA");
+ static_cast(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port);
+ if (_state.username.length() > 0) {
+ static_cast(_mqttClient)
+ ->setCredentials(retainCstr(_state.username.c_str(), &_retainedUsername),
+ retainCstr(_state.password.length() > 0 ? _state.password.c_str() : nullptr, &_retainedPassword));
+ } else {
+ static_cast(_mqttClient)->setCredentials(retainCstr(nullptr, &_retainedUsername), retainCstr(nullptr, &_retainedPassword));
+ }
+ static_cast(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId));
+ static_cast(_mqttClient)->setKeepAlive(_state.keepAlive);
+ static_cast(_mqttClient)->setCleanSession(_state.cleanSession);
+ return _mqttClient->connect();
}
- _mqttClient.setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId));
- _mqttClient.setKeepAlive(_state.keepAlive);
- _mqttClient.setCleanSession(_state.cleanSession);
- return _mqttClient.connect();
- // } else {
- // emsesp::EMSESP::logger().info("Error configuring MQTT client");
+#endif
+ // emsesp::EMSESP::logger().info("Configuring MQTT client");
+ static_cast(_mqttClient)->setServer(retainCstr(_state.host.c_str(), &_retainedHost), _state.port);
+ if (_state.username.length() > 0) {
+ static_cast(_mqttClient)
+ ->setCredentials(retainCstr(_state.username.c_str(), &_retainedUsername),
+ retainCstr(_state.password.length() > 0 ? _state.password.c_str() : nullptr, &_retainedPassword));
+ } else {
+ static_cast(_mqttClient)->setCredentials(retainCstr(nullptr, &_retainedUsername), retainCstr(nullptr, &_retainedPassword));
+ }
+ static_cast(_mqttClient)->setClientId(retainCstr(_state.clientId.c_str(), &_retainedClientId));
+ static_cast(_mqttClient)->setKeepAlive(_state.keepAlive);
+ static_cast(_mqttClient)->setCleanSession(_state.cleanSession);
+ return _mqttClient->connect();
}
+
return false;
}
void MqttSettings::read(MqttSettings & settings, JsonObject & root) {
+#if CONFIG_IDF_TARGET_ESP32S3
+ root["rootCA"] = settings.rootCA;
+#endif
root["enabled"] = settings.enabled;
root["host"] = settings.host;
root["port"] = settings.port;
@@ -162,7 +230,6 @@ void MqttSettings::read(MqttSettings & settings, JsonObject & root) {
root["clean_session"] = settings.cleanSession;
root["entity_format"] = settings.entity_format;
- // added by proddy for EMS-ESP
root["publish_time_boiler"] = settings.publish_time_boiler;
root["publish_time_thermostat"] = settings.publish_time_thermostat;
root["publish_time_solar"] = settings.publish_time_solar;
@@ -185,6 +252,9 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
MqttSettings newSettings = {};
bool changed = false;
+#if CONFIG_IDF_TARGET_ESP32S3
+ newSettings.rootCA = root["rootCA"] | "";
+#endif
newSettings.enabled = root["enabled"] | FACTORY_MQTT_ENABLED;
newSettings.host = root["host"] | FACTORY_MQTT_HOST;
newSettings.port = root["port"] | FACTORY_MQTT_PORT;
@@ -300,6 +370,20 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
emsesp::EMSESP::mqtt_.set_publish_time_heartbeat(newSettings.publish_time_heartbeat);
}
+#if CONFIG_IDF_TARGET_ESP32S3
+ // strip down to certificate only
+ newSettings.rootCA.replace("\r", "");
+ newSettings.rootCA.replace("\n", "");
+ newSettings.rootCA.replace("-----BEGIN CERTIFICATE-----", "");
+ newSettings.rootCA.replace("-----END CERTIFICATE-----", "");
+ newSettings.rootCA.replace(" ", "");
+ if (newSettings.rootCA.length() == 0 && newSettings.port > 8800) {
+ newSettings.rootCA = "insecure";
+ }
+ if (newSettings.rootCA != settings.rootCA) {
+ changed = true;
+ }
+#endif
// save the new settings
settings = newSettings;
diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h
index 1db25c0d4..90d1a53c7 100644
--- a/lib/framework/MqttSettingsService.h
+++ b/lib/framework/MqttSettingsService.h
@@ -63,6 +63,7 @@ class MqttSettings {
bool enabled;
String host;
uint16_t port;
+ String rootCA;
// username and password
String username;
@@ -75,7 +76,7 @@ class MqttSettings {
uint16_t keepAlive;
bool cleanSession;
- // proddy EMS-ESP specific
+ // EMS-ESP specific
String base;
uint16_t publish_time_boiler;
uint16_t publish_time_thermostat;
@@ -105,12 +106,15 @@ class MqttSettingsService : public StatefulService {
~MqttSettingsService();
void begin();
+ void startClient();
void loop();
bool isEnabled();
bool isConnected();
const char * getClientId();
espMqttClientTypes::DisconnectReason getDisconnectReason();
- espMqttClient * getMqttClient();
+ MqttClient * getMqttClient();
+ void setWill(const char * topic);
+ void onMessage(espMqttClientTypes::OnMessageCallback callback);
protected:
void onConfigUpdated();
@@ -125,6 +129,7 @@ class MqttSettingsService : public StatefulService {
char * _retainedClientId;
char * _retainedUsername;
char * _retainedPassword;
+ char * _retainedRootCA;
// variable to help manage connection
bool _reconfigureMqtt;
@@ -134,7 +139,7 @@ class MqttSettingsService : public StatefulService {
espMqttClientTypes::DisconnectReason _disconnectReason;
// the MQTT client instance
- espMqttClient _mqttClient;
+ MqttClient * _mqttClient;
void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info);
void onMqttConnect(bool sessionPresent);
diff --git a/lib/framework/MqttStatus.cpp b/lib/framework/MqttStatus.cpp
index c5ff2a05c..2a12ac16f 100644
--- a/lib/framework/MqttStatus.cpp
+++ b/lib/framework/MqttStatus.cpp
@@ -1,6 +1,6 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
@@ -20,9 +20,9 @@ void MqttStatus::mqttStatus(AsyncWebServerRequest * request) {
root["client_id"] = _mqttSettingsService->getClientId();
root["disconnect_reason"] = (uint8_t)_mqttSettingsService->getDisconnectReason();
- root["mqtt_queued"] = emsesp::Mqtt::publish_queued(); // mdvp added
- root["mqtt_fails"] = emsesp::Mqtt::publish_fails(); // proddy added
- root["connect_count"] = emsesp::Mqtt::connect_count(); // mdvp added
+ root["mqtt_queued"] = emsesp::Mqtt::publish_queued();
+ root["mqtt_fails"] = emsesp::Mqtt::publish_fails();
+ root["connect_count"] = emsesp::Mqtt::connect_count();
response->setLength();
request->send(response);
diff --git a/lib/framework/NTPSettingsService.cpp b/lib/framework/NTPSettingsService.cpp
index 61ec95020..5d4529d96 100644
--- a/lib/framework/NTPSettingsService.cpp
+++ b/lib/framework/NTPSettingsService.cpp
@@ -1,7 +1,7 @@
#include
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
diff --git a/lib/framework/NTPStatus.cpp b/lib/framework/NTPStatus.cpp
index 9433d6253..069814dfa 100644
--- a/lib/framework/NTPStatus.cpp
+++ b/lib/framework/NTPStatus.cpp
@@ -1,5 +1,5 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
diff --git a/lib/framework/NetworkSettingsService.cpp b/lib/framework/NetworkSettingsService.cpp
index 23428d2f4..da89434b3 100644
--- a/lib/framework/NetworkSettingsService.cpp
+++ b/lib/framework/NetworkSettingsService.cpp
@@ -69,7 +69,7 @@ void NetworkSettingsService::manageSTA() {
esp_wifi_set_bandwidth((wifi_interface_t)ESP_IF_WIFI_STA, WIFI_BW_HT40);
}
if (networkSettings.nosleep) {
- WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
+ WiFi.setSleep(false); // turn off sleep - WIFI_PS_NONE
}
WiFi.begin(_state.ssid.c_str(), _state.password.c_str()); // attempt to connect to the network
esp_wifi_set_max_tx_power(networkSettings.tx_power * 4); // set power after wifi is startet for C3
diff --git a/lib/framework/NetworkStatus.cpp b/lib/framework/NetworkStatus.cpp
index 8a999c46e..6aea4580f 100644
--- a/lib/framework/NetworkStatus.cpp
+++ b/lib/framework/NetworkStatus.cpp
@@ -1,6 +1,6 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
diff --git a/lib/framework/OTASettingsService.cpp b/lib/framework/OTASettingsService.cpp
index 3fb20eeee..c20f4cadd 100644
--- a/lib/framework/OTASettingsService.cpp
+++ b/lib/framework/OTASettingsService.cpp
@@ -1,6 +1,6 @@
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
diff --git a/lib/framework/SecuritySettingsService.cpp b/lib/framework/SecuritySettingsService.cpp
index 87f7fbc95..5427a2fa8 100644
--- a/lib/framework/SecuritySettingsService.cpp
+++ b/lib/framework/SecuritySettingsService.cpp
@@ -2,7 +2,7 @@
#if FT_ENABLED(FT_SECURITY)
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
SecuritySettingsService::SecuritySettingsService(AsyncWebServer * server, FS * fs)
: _httpEndpoint(SecuritySettings::read, SecuritySettings::update, this, server, SECURITY_SETTINGS_PATH, this)
diff --git a/lib/framework/StatefulService.h b/lib/framework/StatefulService.h
index 01943088d..7ee72e0a0 100644
--- a/lib/framework/StatefulService.h
+++ b/lib/framework/StatefulService.h
@@ -19,7 +19,7 @@
enum class StateUpdateResult {
CHANGED = 0, // The update changed the state and propagation should take place if required
- CHANGED_RESTART, // a restart of the device is needed - added by proddy
+ CHANGED_RESTART, // a restart of the device is needed
UNCHANGED, // The state was unchanged, propagation should not take place
ERROR // There was a problem updating the state, propagation should not take place
};
diff --git a/lib/framework/SystemStatus.cpp b/lib/framework/SystemStatus.cpp
index 53bafdb22..10c7a7856 100644
--- a/lib/framework/SystemStatus.cpp
+++ b/lib/framework/SystemStatus.cpp
@@ -1,7 +1,7 @@
#include
#include
-#include "../../src/emsesp_stub.hpp" // proddy added
+#include "../../src/emsesp_stub.hpp"
using namespace std::placeholders; // for `_1` etc
@@ -39,7 +39,7 @@ void SystemStatus::systemStatus(AsyncWebServerRequest * request) {
const esp_partition_t * partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
if (partition != NULL) { // factory partition found
root["has_loader"] = true;
- } else { // check for not empty, smaller OTA partition
+ } else { // check for not empty, smaller OTA partition
partition = esp_ota_get_next_update_partition(NULL);
if (partition) {
uint64_t buffer;
diff --git a/lib/framework/UploadFileService.cpp b/lib/framework/UploadFileService.cpp
index d06427ade..a96f67142 100644
--- a/lib/framework/UploadFileService.cpp
+++ b/lib/framework/UploadFileService.cpp
@@ -1,4 +1,5 @@
#include
+#include
using namespace std::placeholders; // for `_1` etc
@@ -42,7 +43,8 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
return;
} else {
md5[0] = '\0';
- return; // unsupported file type
+ handleError(request, 406); // Not Acceptable - unsupported file type
+ return;
}
if (is_firmware) {
@@ -69,7 +71,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
}
#endif
// it's firmware - initialize the ArduinoOTA updater
- if (Update.begin()) {
+ if (Update.begin(fsize - sizeof(esp_image_header_t))) {
if (strlen(md5) == 32) {
Update.setMD5(md5);
md5[0] = '\0';
@@ -87,7 +89,9 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri
if (!is_firmware) {
if (len) {
- request->_tempFile.write(data, len); // stream the incoming chunk to the opened file
+ if (len != request->_tempFile.write(data, len)) { // stream the incoming chunk to the opened file
+ handleError(request, 507); // 507-Insufficient Storage
+ }
}
} else {
// if we haven't delt with an error, continue with the firmware update
@@ -122,18 +126,17 @@ void UploadFileService::uploadComplete(AsyncWebServerRequest * request) {
request->send(response);
return;
}
+
if (strlen(md5) == 32) {
auto * response = new AsyncJsonResponse(false, 256);
JsonObject root = response->getRoot();
root["md5"] = md5;
response->setLength();
request->send(response);
- // AsyncWebServerResponse * response = request->beginResponse(201, "text/plain", md5); // created
- // request->send(response);
return;
}
- handleError(request, 403); // send the forbidden response
+ handleError(request, 500);
}
void UploadFileService::handleError(AsyncWebServerRequest * request, int code) {
@@ -143,9 +146,15 @@ void UploadFileService::handleError(AsyncWebServerRequest * request, int code) {
}
// send the error code to the client and record the error code in the temp object
- request->_tempObject = new int(code);
AsyncWebServerResponse * response = request->beginResponse(code);
request->send(response);
+
+ // check for invalid extension and immediately kill the connection, which will through an error
+ // that is caught by the web code. Unfortunately the http error code is not sent to the client on fast network connections
+ if (code == 406) {
+ request->client()->close(true);
+ handleEarlyDisconnect();
+ }
}
void UploadFileService::handleEarlyDisconnect() {
diff --git a/lib/uuid-common/src/get_uptime_ms.cpp b/lib/uuid-common/src/get_uptime_ms.cpp
index 48e5fe3c9..c995341e4 100644
--- a/lib/uuid-common/src/get_uptime_ms.cpp
+++ b/lib/uuid-common/src/get_uptime_ms.cpp
@@ -22,7 +22,6 @@
namespace uuid {
-// added by proddy for EMS-ESP
static uint64_t now_millis = 0;
// returns system uptime in seconds
diff --git a/lib/uuid-common/src/loop.cpp b/lib/uuid-common/src/loop.cpp
index 389c52350..d4969cb8f 100644
--- a/lib/uuid-common/src/loop.cpp
+++ b/lib/uuid-common/src/loop.cpp
@@ -21,7 +21,7 @@
namespace uuid {
void loop() {
- set_uptime(); // added by proddy
+ set_uptime();
}
} // namespace uuid
diff --git a/lib/uuid-common/src/uuid/common.h b/lib/uuid-common/src/uuid/common.h
index 6184ef971..ae0baee64 100644
--- a/lib/uuid-common/src/uuid/common.h
+++ b/lib/uuid-common/src/uuid/common.h
@@ -102,8 +102,8 @@ void loop();
*/
uint64_t get_uptime_ms();
-uint32_t get_uptime(); // added by proddy for EMS-ESP
-uint32_t get_uptime_sec(); // added by proddy for EMS-ESP
+uint32_t get_uptime();
+uint32_t get_uptime_sec();
void set_uptime();
diff --git a/lib/uuid-console/src/shell_prompt.cpp b/lib/uuid-console/src/shell_prompt.cpp
index 576756296..a6130f1be 100644
--- a/lib/uuid-console/src/shell_prompt.cpp
+++ b/lib/uuid-console/src/shell_prompt.cpp
@@ -65,7 +65,6 @@ void Shell::display_prompt() {
std::string context = context_text();
print(prompt_prefix());
- // colors added by proddy
if (!hostname.empty()) {
print(COLOR_BRIGHT_GREEN);
print(COLOR_BOLD_ON);
@@ -78,7 +77,6 @@ void Shell::display_prompt() {
print(COLOR_BOLD_ON);
print(context);
print(COLOR_RESET);
- // print(' ');
}
print(prompt_suffix());
print(' ');
diff --git a/lib/uuid-syslog/src/syslog.cpp b/lib/uuid-syslog/src/syslog.cpp
index d97ca7540..313da45b6 100644
--- a/lib/uuid-syslog/src/syslog.cpp
+++ b/lib/uuid-syslog/src/syslog.cpp
@@ -365,7 +365,7 @@ bool SyslogService::can_transmit() {
#endif
if (!emsesp::EMSESP::system_.network_connected()) {
- return false; // added by proddy. Check Ethernet
+ return false;
}
const uint64_t now = uuid::get_uptime_ms();
diff --git a/lib_standalone/Arduino.cpp b/lib_standalone/Arduino.cpp
index 56dd38695..2afc4e78f 100644
--- a/lib_standalone/Arduino.cpp
+++ b/lib_standalone/Arduino.cpp
@@ -21,6 +21,10 @@
#include
#include
+#include
+#include
+#include
+
#include
#include
@@ -43,18 +47,34 @@ static unsigned long __millis = 0;
static bool __output_pins[256];
static int __output_level[256];
-int main(int argc __attribute__((unused)), char * argv[] __attribute__((unused))) {
- setup();
- while (millis() <= 10 * 1000) {
+std::atomic_bool exitProgram(false);
+
+void ClientLoop(void * arg) {
+ (void)arg;
+ for (;;) {
loop();
+ if (exitProgram)
+ break;
}
- return 0;
}
-unsigned long millis() {
- return __millis;
+int main(int argc __attribute__((unused)), char * argv[] __attribute__((unused))) {
+ setup();
+ std::thread t = std::thread(ClientLoop, nullptr);
+ // while (millis() <= 10 * 1000) {
+ while (1) {
+ if (exitProgram)
+ break;
+ std::this_thread::yield();
+ }
+ t.join();
+ return EXIT_SUCCESS;
}
+// unsigned long millis() {
+// return __millis;
+// }
+
int64_t esp_timer_get_time() {
return __millis;
}
@@ -64,6 +84,7 @@ void delay(unsigned long millis) {
}
void yield(void) {
+ std::this_thread::yield();
}
int snprintf_P(char * str, size_t size, const char * format, ...) {
diff --git a/lib_standalone/Arduino.h b/lib_standalone/Arduino.h
index afacf2578..0b83797e4 100644
--- a/lib_standalone/Arduino.h
+++ b/lib_standalone/Arduino.h
@@ -35,7 +35,7 @@
#include
// #define IPAddress std::string
-#define IPAddress String
+// #define IPAddress String
#define ICACHE_FLASH_ATTR
#define ICACHE_RAM_ATTR
@@ -171,7 +171,13 @@ extern NativeConsole Serial;
extern ETHClass ETH;
extern WiFiClass WiFi;
-unsigned long millis();
+// unsigned long millis();
+
+#if defined(__linux__)
+#include // NOLINT [build/c++11]
+#include // NOLINT [build/c++11] for yield()
+#define millis() std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count()
+#endif
int64_t esp_timer_get_time();
diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h
index b673f41b8..34552fa01 100644
--- a/lib_standalone/ESP8266React.h
+++ b/lib_standalone/ESP8266React.h
@@ -101,7 +101,10 @@ class ESP8266React {
: _settings(server, fs, nullptr)
, _securitySettingsService(server, fs){};
- void begin(){};
+ void begin() {
+ // initialize mqtt
+ _mqttClient = new espMqttClient();
+ };
void loop(){};
SecurityManager * getSecurityManager() {
@@ -112,6 +115,11 @@ class ESP8266React {
return _mqttClient;
}
+ void setWill(const char * will_topic) {
+ }
+ void onMessage(espMqttClientTypes::OnMessageCallback callback) {
+ }
+
StatefulService * getNetworkSettingsService() {
return &_settings;
}
diff --git a/lib_standalone/FS.h b/lib_standalone/FS.h
index c7a7b056d..d85355f22 100644
--- a/lib_standalone/FS.h
+++ b/lib_standalone/FS.h
@@ -61,11 +61,11 @@ class File : public Stream {
bool seek(uint32_t pos) {
return seek(pos, SeekSet);
}
- size_t position() const;
- size_t size() const;
- bool setBufferSize(size_t size);
- void close();
- operator bool() const;
+ size_t position() const;
+ size_t size() const;
+ bool setBufferSize(size_t size);
+ void close();
+ operator bool() const;
time_t getLastWrite();
const char * path() const;
const char * name() const;
diff --git a/lib_standalone/Network.h b/lib_standalone/Network.h
index 836167df5..6fa63c151 100644
--- a/lib_standalone/Network.h
+++ b/lib_standalone/Network.h
@@ -3,6 +3,7 @@
#include
#include
+#include
#define WiFiMode_t wifi_mode_t
#define WIFI_OFF WIFI_MODE_NULL
diff --git a/lib_standalone/Stream.h b/lib_standalone/Stream.h
index fad3ac00d..0153703be 100644
--- a/lib_standalone/Stream.h
+++ b/lib_standalone/Stream.h
@@ -91,7 +91,7 @@ class Stream : public Print {
// initial characters that are not digits (or the minus sign) are skipped
// integer is terminated by the first character that is not a digit.
- float parseFloat(); // float version of parseInt
+ float parseFloat(); // float version of parseInt
virtual size_t readBytes(char * buffer, size_t length) // read chars from stream into buffer
{
diff --git a/lib_standalone/avr/pgmspace.h b/lib_standalone/avr/pgmspace.h
new file mode 100644
index 000000000..e69de29bb
diff --git a/lib_standalone/espMqttClient.h b/lib_standalone/espMqttClient.h
deleted file mode 100644
index 354850f49..000000000
--- a/lib_standalone/espMqttClient.h
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef ESPMQTTCLIENT_H_
-#define ESPMQTTCLIENT_H_
-
-#include "Arduino.h"
-#include
-
-namespace espMqttClientTypes {
-
-enum class DisconnectReason : uint8_t {
- USER_OK = 0,
- MQTT_UNACCEPTABLE_PROTOCOL_VERSION = 1,
- MQTT_IDENTIFIER_REJECTED = 2,
- MQTT_SERVER_UNAVAILABLE = 3,
- MQTT_MALFORMED_CREDENTIALS = 4,
- MQTT_NOT_AUTHORIZED = 5,
- TLS_BAD_FINGERPRINT = 6,
- TCP_DISCONNECTED = 7
-};
-const char * disconnectReasonToString(DisconnectReason reason);
-
-enum class SubscribeReturncode : uint8_t { QOS0 = 0x00, QOS1 = 0x01, QOS2 = 0x02, FAIL = 0X80 };
-const char * subscribeReturncodeToString(SubscribeReturncode returnCode);
-
-enum class Error : uint8_t { SUCCESS = 0, OUT_OF_MEMORY = 1, MAX_RETRIES = 2, MALFORMED_PARAMETER = 3, MISC_ERROR = 4 };
-const char * errorToString(Error error);
-
-struct MessageProperties {
- uint8_t qos;
- bool dup;
- bool retain;
- uint16_t packetId;
-};
-
-typedef std::function OnConnectCallback;
-typedef std::function OnDisconnectCallback;
-typedef std::function OnSubscribeCallback;
-typedef std::function OnUnsubscribeCallback;
-typedef std::function OnMessageCallback;
-typedef std::function OnPublishCallback;
-typedef std::function PayloadCallback;
-typedef std::function OnErrorCallback;
-
-} // namespace espMqttClientTypes
-
-class espMqttClient {
- public:
- espMqttClient();
- ~espMqttClient();
-
- espMqttClient & setKeepAlive(uint16_t keepAlive);
- espMqttClient & setClientId(const char * clientId);
- espMqttClient & setCleanSession(bool cleanSession);
- espMqttClient & setMaxTopicLength(uint16_t maxTopicLength);
- espMqttClient & setCredentials(const char * username, const char * password = nullptr);
- espMqttClient & setWill(const char * topic, uint8_t qos, bool retain, const char * payload = nullptr, size_t length = 0) {
- return *this;
- }
- espMqttClient & setServer(IPAddress ip, uint16_t port);
- espMqttClient & setServer(const char * host, uint16_t port);
-
- espMqttClient & onConnect(espMqttClientTypes::OnConnectCallback callback) {
- return *this;
- }
- espMqttClient & onDisconnect(espMqttClientTypes::OnDisconnectCallback callback) {
- return *this;
- }
- espMqttClient & onSubscribe(espMqttClientTypes::OnSubscribeCallback callback) {
- return *this;
- }
- espMqttClient & onUnsubscribe(espMqttClientTypes::OnUnsubscribeCallback callback) {
- return *this;
- }
- espMqttClient & onMessage(espMqttClientTypes::OnMessageCallback callback) {
- return *this;
- }
- espMqttClient & onPublish(espMqttClientTypes::OnPublishCallback callback) {
- return *this;
- }
-
- bool connected() const {
- return false;
- }
- void connect() {
- }
- void disconnect(bool force = false) {
- }
- uint16_t subscribe(const char * topic, uint8_t qos) {
- return 1;
- }
- uint16_t unsubscribe(const char * topic) {
- return 1;
- }
- uint16_t publish(const char * topic, uint8_t qos, bool retain, const char * payload = nullptr, size_t length = 0, bool dup = false, uint16_t message_id = 0) {
- return 1;
- }
-
- const char * getClientId() {
- return "12";
- }
-
- uint16_t getQueue() const {
- return 0;
- }
-
- private:
- bool _connected;
- bool _connectPacketNotEnoughSpace;
- bool _disconnectOnPoll;
- bool _tlsBadFingerprint;
- uint32_t _lastClientActivity;
- uint32_t _lastServerActivity;
- uint32_t _lastPingRequestTime;
- char _generatedClientId[18 + 1]; // esp8266-abc123 and esp32-abcdef123456
- IPAddress _ip;
- const char * _host;
- bool _useIp;
- uint16_t _port;
- uint16_t _keepAlive;
- bool _cleanSession;
- const char * _clientId;
- const char * _username;
- const char * _password;
- const char * _willTopic;
- const char * _willPayload;
- uint16_t _willPayloadLength;
- uint8_t _willQos;
- bool _willRetain;
-};
-
-#endif
diff --git a/mock-api/package.json b/mock-api/package.json
index c4f17293a..1bdb7584a 100644
--- a/mock-api/package.json
+++ b/mock-api/package.json
@@ -13,7 +13,7 @@
"compression": "^1.7.4",
"express": "^4.18.2",
"multer": "^1.4.5-lts.1",
- "nodemon": "^2.0.22"
+ "nodemon": "^3.0.1"
},
"packageManager": "yarn@3.4.1"
}
diff --git a/mock-api/server.js b/mock-api/server.js
index 1b83be34b..04a6341af 100644
--- a/mock-api/server.js
+++ b/mock-api/server.js
@@ -323,12 +323,8 @@ security_settings = {
]
};
const features = {
- project: true,
- security: true,
- mqtt: true,
- ntp: true,
- ota: true,
- upload_firmware: true
+ version: 'v3.6.0-demo',
+ platform: 'ESP32-S3'
};
const verify_authentication = { access_token: '1234' };
const signin = {
@@ -2782,5 +2778,5 @@ rest_server.get(ES_LOG_ENDPOINT, function (req, res) {
log_index = 0;
}
fetch_log.events.push(data); // append to buffer
- }, 3000);
+ }, 300);
});
diff --git a/mock-api/yarn.lock b/mock-api/yarn.lock
index 83c353e29..0c5dc99bb 100644
--- a/mock-api/yarn.lock
+++ b/mock-api/yarn.lock
@@ -118,7 +118,7 @@ __metadata:
compression: ^1.7.4
express: ^4.18.2
multer: ^1.4.5-lts.1
- nodemon: ^2.0.22
+ nodemon: ^3.0.1
languageName: unknown
linkType: soft
@@ -1203,23 +1203,23 @@ __metadata:
languageName: node
linkType: hard
-"nodemon@npm:^2.0.22":
- version: 2.0.22
- resolution: "nodemon@npm:2.0.22"
+"nodemon@npm:^3.0.1":
+ version: 3.0.1
+ resolution: "nodemon@npm:3.0.1"
dependencies:
chokidar: ^3.5.2
debug: ^3.2.7
ignore-by-default: ^1.0.1
minimatch: ^3.1.2
pstree.remy: ^1.1.8
- semver: ^5.7.1
- simple-update-notifier: ^1.0.7
+ semver: ^7.5.3
+ simple-update-notifier: ^2.0.0
supports-color: ^5.5.0
touch: ^3.1.0
undefsafe: ^2.0.5
bin:
nodemon: bin/nodemon.js
- checksum: 9c987e139748f5b5c480c6c9080bdc97304ee7d29172b7b3da1a7db590b1323ad57b96346304e9b522b0e445c336dc393ccd3f9f45c73b20d476d2347890dcd0
+ checksum: 6a5d81855760d6617049eccce10ccf02bddb482dab13ceea5280ae595ec7004eee13e7b934368e3f46c37fe4d970342a8c38c99cae7e93e4d7a3ed1c1ecb6acf
languageName: node
linkType: hard
@@ -1483,15 +1483,6 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:^5.7.1":
- version: 5.7.1
- resolution: "semver@npm:5.7.1"
- bin:
- semver: ./bin/semver
- checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf
- languageName: node
- linkType: hard
-
"semver@npm:^7.3.5":
version: 7.3.8
resolution: "semver@npm:7.3.8"
@@ -1503,12 +1494,14 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:~7.0.0":
- version: 7.0.0
- resolution: "semver@npm:7.0.0"
+"semver@npm:^7.5.3":
+ version: 7.5.4
+ resolution: "semver@npm:7.5.4"
+ dependencies:
+ lru-cache: ^6.0.0
bin:
semver: bin/semver.js
- checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778
+ checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3
languageName: node
linkType: hard
@@ -1577,12 +1570,12 @@ __metadata:
languageName: node
linkType: hard
-"simple-update-notifier@npm:^1.0.7":
- version: 1.1.0
- resolution: "simple-update-notifier@npm:1.1.0"
+"simple-update-notifier@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "simple-update-notifier@npm:2.0.0"
dependencies:
- semver: ~7.0.0
- checksum: 1012e9b6c504e559a948078177b3eedbb9d7e4d15878e2bda56314d08db609ca5da485be4ac9f838759faae8057935ee0246fcdf63f1233c86bd9fecb2a5544b
+ semver: ^7.5.3
+ checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd
languageName: node
linkType: hard
diff --git a/pio_local.ini_example b/pio_local.ini_example
index 123610389..1e70e81db 100644
--- a/pio_local.ini_example
+++ b/pio_local.ini_example
@@ -13,10 +13,16 @@
; -DEMSESP_EN_ONLY ; only EN translated entity names
; my_build_flags = -DEMSESP_DEBUG
+[platformio]
+default_envs = esp32_4M
+; default_envs = esp32_16M
+; default_envs = lolin_s3
+; default_envs = standalone
+
[env:esp32_4M]
; if using OTA enter your details below
; upload_protocol = espota
-; upload_flags =
+; upload_flags =
; --port=8266
; --auth=ems-esp-neo
; upload_port = ems-esp.local
@@ -25,19 +31,20 @@ upload_port = /dev/ttyUSB*
; upload_port = COM5
; override arduino espressif core
-; platform = espressif32 ; take latest
-; platform = espressif32@5.2.0
+platform = espressif32 ; take latest
+; platform = espressif32@5.3.0
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
+ ; post:scripts/app-tls-size.py
[env:esp32_16M]
-upload_port = /dev/ttyUSB*
-; upload_port = COM3
+[env:lolin_s3]
+upload_port = /dev/ttyACM0
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
; pio run -e debug
diff --git a/platformio.ini b/platformio.ini
index dccd71b4c..ac5673075 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -20,7 +20,6 @@ core_build_flags =
; -std=gnu++17
; core_unbuild_flags = -std=gnu++11
-; core_unbuild_flags = -std=gnu++17
core_unbuild_flags =
; my_build_flags is set in pio_local.ini
@@ -41,9 +40,12 @@ unbuild_flags =
[espressi32_base]
platform = espressif32
-; platform = espressif32@5.3.0
-; platform = espressif32@5.2.0
framework = arduino
+build_flags = ${common.build_flags}
+build_unflags = ${common.unbuild_flags}
+extra_scripts =
+ pre:scripts/build_interface.py
+ scripts/rename_fw.py
[env]
monitor_speed = 115200
@@ -62,7 +64,7 @@ check_flags =
; build for GitHub Actions CI
; the Web interface is built seperately
[env:ci]
-platform = espressif32@5.2.0
+platform = espressif32
framework = arduino
extra_scripts = scripts/rename_fw.py
board = esp32dev
@@ -84,100 +86,71 @@ build_flags = ${common.build_flags} -O2
build_unflags = ${common.unbuild_flags}
[env:esp32_4M]
-platform = espressif32@5.2.0
-framework = arduino
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
+extends = espressi32_base
board = esp32dev
board_upload.flash_size = 4MB
board_build.partitions = esp32_partition_4M.csv
build_flags = ${common.build_flags} -Os
-build_unflags = ${common.unbuild_flags}
[env:esp32_4Mplus]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = esp32dev
board_upload.flash_size = 4MB
board_build.partitions = esp32_asym_partition_4M.csv
build_flags = ${common.build_flags}
-build_unflags = ${common.unbuild_flags}
[env:esp32_16M]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = esp32dev
board_upload.flash_size = 16MB
board_build.partitions = esp32_partition_16M.csv
build_flags = ${common.build_flags}
-build_unflags = ${common.unbuild_flags}
[env:lolin_c3_mini]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = lolin_c3_mini
board_upload.flash_size = 4MB
board_build.partitions = esp32_asym_partition_4M.csv
build_flags = ${common.build_flags}
-build_unflags = ${common.unbuild_flags}
; lolin C3 mini v1 needs special wifi init.
; https://www.wemos.cc/en/latest/c3/c3_mini_1_0_0.html#about-wifi
[env:lolin_c3_mini_v1]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = lolin_c3_mini
board_upload.flash_size = 4MB
board_build.partitions = esp32_asym_partition_4M.csv
build_flags = ${common.build_flags} -DBOARD_C3_MINI_V1
-build_unflags = ${common.unbuild_flags}
[env:lolin_s2_mini]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = lolin_s2_mini
board_upload.flash_size = 4MB
board_build.partitions = esp32_asym_partition_4M.csv
build_flags = ${common.build_flags}
-build_unflags = ${common.unbuild_flags}
[env:lolin_s3]
extends = espressi32_base
-extra_scripts =
- pre:scripts/build_interface.py
- scripts/rename_fw.py
board = lolin_s3
board_build.f_cpu = 240000000L
board_upload.flash_size = 16MB
board_build.partitions = esp32_partition_16M.csv
-build_flags = ${common.build_flags} -O2
-build_unflags = ${common.unbuild_flags}
board_upload.use_1200bps_touch = false
board_upload.wait_for_upload_port = false
+build_flags = ${common.build_flags} -O2
; to build and run: pio run -e standalone -t exec
[env:standalone]
platform = native
build_flags =
- -DARDUINO
- -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0
- -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_TEST
+ -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSON_USE_DOUBLE=0
+ -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_TEST -D__linux__
-DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.6.0-dev\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
-lpthread
-std=gnu++11 -Og -ggdb
-build_src_flags =
+build_src_flags =
-Wall -Wextra -Werror -Wswitch-enum -Wno-unused-parameter -Wno-inconsistent-missing-override -Wno-unused-lambda-capture
+ -Wno-missing-braces
-I./lib_standalone
-I./lib/ArduinoJson/src
-I./lib/uuid-common/src
@@ -185,6 +158,8 @@ build_src_flags =
-I./lib/uuid-log/src
-I./lib/semver
-I./lib/PButton
+ -I./lib/espMqttClient/src
+ -I./lib/espMqttClient/src/Transport
build_src_filter =
+<*>
-<.git/>
@@ -194,5 +169,7 @@ build_src_filter =
+<../lib/uuid-log>
+<../lib/semver>
+<../lib/PButton>
+ +<../lib/espMqttClient/src>
+ +<../lib/espMqttClient/src/Transport>
lib_compat_mode = off
lib_ldf_mode = off
diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp
index f37c0947a..37a74113b 100644
--- a/src/analogsensor.cpp
+++ b/src/analogsensor.cpp
@@ -498,7 +498,7 @@ void AnalogSensor::publish_values(const bool force) {
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else " + sample_val + "}}";
char uniq_s[70];
- if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == Mqtt::entityFormat::MULTI_SHORT) {
snprintf(uniq_s, sizeof(uniq_s), "%s_analogsensor_%02d", Mqtt::basename().c_str(), sensor.gpio());
} else {
snprintf(uniq_s, sizeof(uniq_s), "analogsensor_%02d", sensor.gpio());
@@ -563,6 +563,17 @@ void AnalogSensor::publish_values(const bool force) {
// config["step"] = sensor.factor();
} else if (sensor.type() == AnalogType::DIGITAL_IN) {
snprintf(topic, sizeof(topic), "binary_sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio());
+ if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
+ config["pl_on"] = true;
+ config["pl_off"] = false;
+ } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
+ config["pl_on"] = 1;
+ config["pl_off"] = 0;
+ } else {
+ char result[12];
+ config["pl_on"] = Helpers::render_boolean(result, true);
+ config["pl_off"] = Helpers::render_boolean(result, false);
+ }
} else {
snprintf(topic, sizeof(topic), "sensor/%s/analogsensor_%02d/config", Mqtt::basename().c_str(), sensor.gpio());
config["stat_cla"] = "measurement";
@@ -575,9 +586,7 @@ void AnalogSensor::publish_values(const bool force) {
// add "availability" section
Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond);
- Mqtt::queue_ha(topic, config.as());
-
- sensor.ha_registered = true;
+ sensor.ha_registered = Mqtt::queue_ha(topic, config.as());
}
}
}
diff --git a/src/console.cpp b/src/console.cpp
index 71bb199d2..4fef7d7b9 100644
--- a/src/console.cpp
+++ b/src/console.cpp
@@ -410,14 +410,16 @@ static void setup_commands(std::shared_ptr & commands) {
if (arguments.size() == 4) {
uint16_t offset = Helpers::hextoint(arguments[2].c_str());
uint8_t length = Helpers::hextoint(arguments.back().c_str());
- to_app(shell).send_read_request(type_id, device_id, offset, length);
+ to_app(shell).send_read_request(type_id, device_id, offset, length, true);
} else if (arguments.size() == 3) {
uint16_t offset = Helpers::hextoint(arguments.back().c_str());
- to_app(shell).send_read_request(type_id, device_id, offset, EMS_MAX_TELEGRAM_LENGTH);
+ to_app(shell).send_read_request(type_id, device_id, offset, EMS_MAX_TELEGRAM_LENGTH, true);
} else {
// send with length to send immediately and trigger publish read_id
- to_app(shell).send_read_request(type_id, device_id, 0, EMS_MAX_TELEGRAM_LENGTH);
+ to_app(shell).send_read_request(type_id, device_id, 0, EMS_MAX_TELEGRAM_LENGTH, true);
}
+ to_app(shell).set_read_id(type_id);
+
});
commands->add_command(ShellContext::MAIN,
@@ -620,12 +622,12 @@ void EMSESPShell::stopped() {
// show welcome banner
void EMSESPShell::display_banner() {
println();
- printfln("┌───────────────────────────────────────┐");
+ printfln("┌────────────────────────────────────────┐");
printfln("│ %sEMS-ESP version %-12s%s │", COLOR_BOLD_ON, EMSESP_APP_VERSION, COLOR_BOLD_OFF);
- printfln("│ %s%shttps://github.com/emsesp/EMS-ESP32%s │", COLOR_BRIGHT_GREEN, COLOR_UNDERLINE, COLOR_RESET);
- printfln("│ │");
- printfln("│ type %shelp%s to show available commands │", COLOR_UNDERLINE, COLOR_RESET);
- printfln("└───────────────────────────────────────┘");
+ printfln("│ %s%shttps://github.com/emsesp/EMS-ESP32%s │", COLOR_BRIGHT_GREEN, COLOR_UNDERLINE, COLOR_RESET);
+ printfln("│ │");
+ printfln("│ type %shelp%s to show available commands │", COLOR_UNDERLINE, COLOR_RESET);
+ printfln("└────────────────────────────────────────┘");
println();
// set console name
@@ -640,16 +642,16 @@ std::string EMSESPShell::hostname_text() {
}
std::string EMSESPShell::context_text() {
- auto shell_context = static_cast(context());
+ return std::string{};
- if (shell_context == ShellContext::MAIN) {
- return std::string{};
- // return std::string{'/'};
- // } else if (shell_context == ShellContext::FILESYSTEM) {
- // return "/fs");
- } else {
- return std::string{};
- }
+ // auto shell_context = static_cast(context());
+ // if (shell_context == ShellContext::MAIN) {
+ // return std::string{'/'};
+ // } else if (shell_context == ShellContext::FILESYSTEM) {
+ // return "/fs");
+ // } else {
+ // return std::string{};
+ // }
}
// when in su (admin) show # as the prompt suffix
diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp
index 30da339f8..028d84d17 100644
--- a/src/devices/boiler.cpp
+++ b/src/devices/boiler.cpp
@@ -590,7 +590,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
FL_(tempDiffHeat),
DeviceValueUOM::K,
MAKE_CF_CB(set_tempDiffHeat),
- 3,
+ 2,
10);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
&tempDiffCool_,
@@ -599,7 +599,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
FL_(tempDiffCool),
DeviceValueUOM::K,
MAKE_CF_CB(set_tempDiffCool),
- 3,
+ 2,
10);
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &vp_cooling_, DeviceValueType::BOOL, FL_(vp_cooling), DeviceValueUOM::NONE, MAKE_CF_CB(set_vp_cooling));
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &heatCable_, DeviceValueType::BOOL, FL_(heatCable), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatCable));
diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp
index a8fb8873c..786b78193 100644
--- a/src/devices/thermostat.cpp
+++ b/src/devices/thermostat.cpp
@@ -976,6 +976,7 @@ void Thermostat::process_RC300Monitor(std::shared_ptr telegram)
}
has_update(telegram, hc->targetflowtemp, 4);
has_update(telegram, hc->curroominfl, 27);
+ has_update(telegram, hc->coolingon, 32);
add_ha_climate(hc);
}
@@ -1139,8 +1140,8 @@ void Thermostat::process_RC300Settings(std::shared_ptr telegram)
// 0x2CC - e.g. wwprio for RC310 hcx parameter
void Thermostat::process_RC300Set2(std::shared_ptr telegram) {
// typeids are not in a raw. hc:0x2CC, hc2: 0x2CE for RC310
- // telegram is either offset 3 with data lenght of 1 and values 0/1 (radiators) - 10 0B FF 03 01 CC 01 F6
- // or offset 0 with data lenght of 6 bytes - offset 3 values are 0x00 or 0xFF - 10 0B FF 00 01 CE FF 13 0A FF 1E 00 20
+ // telegram is either offset 3 with data length of 1 and values 0/1 (radiators) - 10 0B FF 03 01 CC 01 F6
+ // or offset 0 with data length of 6 bytes - offset 3 values are 0x00 or 0xFF - 10 0B FF 00 01 CE FF 13 0A FF 1E 00 20
std::shared_ptr hc = heating_circuit(telegram);
if (hc == nullptr) {
@@ -1161,7 +1162,7 @@ void Thermostat::process_HPMode(std::shared_ptr telegram) {
if (hc == nullptr) {
return;
}
- has_update(telegram, hc->hpmode, 0);
+ has_update(telegram, hc->hpmode, 5);
}
// 0x467 ff HP settings
@@ -1170,9 +1171,9 @@ void Thermostat::process_HPSet(std::shared_ptr telegram) {
if (hc == nullptr) {
return;
}
- has_update(telegram, hc->dewoffset, 0); // 7-35°C
+ has_update(telegram, hc->dewoffset, 4); // 7-35°C
has_update(telegram, hc->roomtempdiff, 3); // 1-10K
- has_update(telegram, hc->hpminflowtemp, 4); // 2-10K
+ has_update(telegram, hc->hpminflowtemp, 0); // 2-10K
}
// type 0x41 - data from the RC30 thermostat(0x10) - 14 bytes long
@@ -1546,7 +1547,7 @@ bool Thermostat::set_hpmode(const char * value, const int8_t id) {
if (!Helpers::value2enum(value, v, FL_(enum_hpmode))) {
return false;
}
- write_command(hpmode_typeids[hc->hc()], 0, v, hpmode_typeids[hc->hc()]);
+ write_command(hpmode_typeids[hc->hc()], 5, v, hpmode_typeids[hc->hc()]);
return true;
}
@@ -2727,7 +2728,7 @@ bool Thermostat::set_controlmode(const char * value, const int8_t id) {
return false;
}
-// sets the thermostat time for nightmode for RC10, telegrm 0xB0
+// sets the thermostat time for nightmode for RC10, telegram 0xB0
bool Thermostat::set_reducehours(const char * value, const int8_t id) {
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
std::shared_ptr hc = heating_circuit(hc_num);
@@ -4194,9 +4195,10 @@ void Thermostat::register_device_values_hc(std::shared_ptrreducetemp, 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));
register_device_value(tag, &hc->cooling, DeviceValueType::BOOL, FL_(hpcooling), DeviceValueUOM::NONE, MAKE_CF_CB(set_cooling));
+ register_device_value(tag, &hc->coolingon, DeviceValueType::BOOL, FL_(coolingOn), DeviceValueUOM::NONE);
register_device_value(tag, &hc->hpmode, DeviceValueType::ENUM, FL_(enum_hpmode), FL_(hpmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_hpmode));
- register_device_value(tag, &hc->dewoffset, DeviceValueType::UINT, FL_(dewoffset), DeviceValueUOM::K, MAKE_CF_CB(set_dewoffset));
+ register_device_value(tag, &hc->dewoffset, DeviceValueType::UINT, FL_(dewoffset), DeviceValueUOM::K, MAKE_CF_CB(set_dewoffset), 2, 10);
register_device_value(tag, &hc->roomtempdiff, DeviceValueType::UINT, FL_(roomtempdiff), DeviceValueUOM::K, MAKE_CF_CB(set_roomtempdiff));
register_device_value(tag, &hc->hpminflowtemp, DeviceValueType::UINT, FL_(hpminflowtemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_hpminflowtemp));
diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h
index 6196b41b9..d98c100f5 100644
--- a/src/devices/thermostat.h
+++ b/src/devices/thermostat.h
@@ -95,6 +95,7 @@ class Thermostat : public EMSdevice {
uint8_t hpminflowtemp;
uint8_t hpmode;
uint8_t cooling;
+ uint8_t coolingon;
uint8_t hc_num() const {
return hc_num_;
diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp
index 30b8580d8..7fb293b35 100644
--- a/src/emsdevice.cpp
+++ b/src/emsdevice.cpp
@@ -1505,6 +1505,10 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8
output["api_data"] = data;
return true;
} else {
+ char error[100];
+ snprintf(error, sizeof(error), "cannot find attribute %s in entity %s", attribute_s, command_s);
+ output.clear();
+ output["message"] = error;
return false;
}
}
@@ -1513,6 +1517,9 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8
}
}
+ char error[100];
+ snprintf(error, sizeof(error), "cannot find values for entity '%s'", cmd);
+ json["message"] = error;
return false;
}
@@ -1645,7 +1652,7 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c
Helpers::translated_word(FL_(minutes)));
json[name] = time_s;
} else {
- json[name] = serialized(Helpers::render_value(val, time_value, 1));
+ json[name] = serialized(Helpers::render_value(val, time_value, 0));
}
}
diff --git a/src/emsesp.cpp b/src/emsesp.cpp
index 5b7213f94..199383800 100644
--- a/src/emsesp.cpp
+++ b/src/emsesp.cpp
@@ -76,6 +76,7 @@ uint8_t EMSESP::watch_ = 0; // trace off
uint16_t EMSESP::read_id_ = WATCH_ID_NONE;
bool EMSESP::read_next_ = false;
uint16_t EMSESP::publish_id_ = 0;
+uint16_t EMSESP::response_id_ = 0;
bool EMSESP::tap_water_active_ = false; // for when Boiler states we having running warm water. used in Shower()
uint32_t EMSESP::last_fetch_ = 0;
uint8_t EMSESP::publish_all_idx_ = 0;
@@ -624,25 +625,36 @@ void EMSESP::publish_sensor_values(const bool time, const bool force) {
// MQTT publish a telegram as raw data to the topic 'response'
void EMSESP::publish_response(std::shared_ptr telegram) {
- StaticJsonDocument doc;
+ static char * buffer = nullptr;
+ static uint8_t offset;
+ if (buffer == nullptr) {
+ offset = telegram->offset; // store offset from first part
+ buffer = new char[768]; // max 256 hex-codes, 255 spaces, 1 termination
+ buffer[0] = '\0';
+ }
+ strlcat(buffer, Helpers::data_to_hex(telegram->message_data, telegram->message_length).c_str(), 768);
+ if (response_id_ != 0) {
+ strlcat(buffer, " ", 768);
+ return;
+ }
+ DynamicJsonDocument doc(EMSESP_JSON_SIZE_LARGE);
+ char s[10];
+ doc["src"] = Helpers::hextoa(s, telegram->src);
+ doc["dest"] = Helpers::hextoa(s, telegram->dest);
+ doc["type"] = Helpers::hextoa(s, telegram->type_id);
+ doc["offset"] = Helpers::hextoa(s, offset);
+ doc["data"] = buffer;
- char buffer[100];
- doc["src"] = Helpers::hextoa(buffer, telegram->src);
- doc["dest"] = Helpers::hextoa(buffer, telegram->dest);
- doc["type"] = Helpers::hextoa(buffer, telegram->type_id);
- doc["offset"] = Helpers::hextoa(buffer, telegram->offset);
- strlcpy(buffer, Helpers::data_to_hex(telegram->message_data, telegram->message_length).c_str(), sizeof(buffer)); // telegram is without crc
- doc["data"] = buffer;
-
- if (telegram->message_length <= 4) {
+ if (telegram->message_length <= 4 && strlen(buffer) <= 11) {
uint32_t value = 0;
for (uint8_t i = 0; i < telegram->message_length; i++) {
value = (value << 8) + telegram->message_data[i];
}
doc["value"] = value;
}
-
Mqtt::queue_publish("response", doc.as());
+ delete[] buffer;
+ buffer = nullptr;
}
// builds json with the detail of each value, for a specific EMS device type or the temperature sensor
@@ -847,12 +859,19 @@ void EMSESP::process_version(std::shared_ptr telegram) {
// returns false if there are none found
bool EMSESP::process_telegram(std::shared_ptr telegram) {
// if watching or reading...
- if ((telegram->type_id == read_id_) && (telegram->dest == txservice_.ems_bus_id())) {
- LOG_INFO("%s", pretty_telegram(telegram).c_str());
- if (Mqtt::send_response()) {
+ if ((telegram->type_id == read_id_ || telegram->type_id == response_id_) && (telegram->dest == txservice_.ems_bus_id())) {
+ if (telegram->type_id == response_id_) {
+ if (!trace_raw_) {
+ LOG_TRACE("%s", pretty_telegram(telegram).c_str());
+ }
+ if (!read_next_) {
+ response_id_ = 0;
+ }
publish_response(telegram);
+ } else {
+ LOG_NOTICE("%s", pretty_telegram(telegram).c_str());
}
-
+ // check if read is finished or gives more parts
if (!read_next_) {
read_id_ = WATCH_ID_NONE;
}
@@ -951,7 +970,7 @@ bool EMSESP::device_exists(const uint8_t device_id) {
// for each associated EMS device go and get its system information
void EMSESP::show_devices(uuid::console::Shell & shell) {
if (emsdevices.empty()) {
- shell.printfln("No EMS devices detected. Try using 'scan devices' from the ems menu.");
+ shell.printfln("No EMS devices detected");
shell.println();
return;
}
@@ -1233,8 +1252,8 @@ bool EMSESP::command_info(uint8_t device_type, JsonObject & output, const int8_t
}
// send a read request, passing it into to the Tx Service, with optional offset and length
-void EMSESP::send_read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t length) {
- txservice_.read_request(type_id, dest, offset, length);
+void EMSESP::send_read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t length, const bool front) {
+ txservice_.read_request(type_id, dest, offset, length, front);
}
// sends write request
@@ -1308,13 +1327,16 @@ void EMSESP::incoming_telegram(uint8_t * data, const uint8_t length) {
if (txservice_.is_last_tx(src, dest)) {
LOG_DEBUG("Last Tx read successful");
txservice_.increment_telegram_read_count();
- txservice_.send_poll(); // close the bus
txservice_.reset_retry_count();
tx_successful = true;
// if telegram is longer read next part with offset +25 for ems+ or +27 for ems1.0
- if ((length >= 31) && (txservice_.read_next_tx(data[3], length) == read_id_)) {
+ // not for response to raw send commands without read_id set
+ if ((response_id_ == 0 || read_id_ > 0) && (length >= 31) && (txservice_.read_next_tx(data[3], length) == read_id_)) {
read_next_ = true;
+ txservice_.send();
+ } else {
+ txservice_.send_poll(); // close the bus
}
}
}
diff --git a/src/emsesp.h b/src/emsesp.h
index a1cb25381..a1a6f061f 100644
--- a/src/emsesp.h
+++ b/src/emsesp.h
@@ -117,7 +117,7 @@ class EMSESP {
static bool process_telegram(std::shared_ptr telegram);
static std::string pretty_telegram(std::shared_ptr telegram);
- static void send_read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset = 0, const uint8_t length = 0);
+ static void send_read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset = 0, const uint8_t length = 0, const bool front = false);
static void send_write_request(const uint16_t type_id,
const uint8_t dest,
const uint8_t offset,
@@ -176,6 +176,10 @@ class EMSESP {
read_id_ = id;
}
+ static void set_response_id(uint16_t id) {
+ response_id_ = id;
+ }
+
static bool wait_validate() {
return (wait_validate_ != 0);
}
@@ -259,6 +263,7 @@ class EMSESP {
static uint16_t read_id_;
static bool read_next_;
static uint16_t publish_id_;
+ static uint16_t response_id_;
static bool tap_water_active_;
static uint8_t publish_all_idx_;
static uint8_t unique_id_count_;
diff --git a/src/emsesp_stub.hpp b/src/emsesp_stub.hpp
index b00cad107..69ece6f7e 100644
--- a/src/emsesp_stub.hpp
+++ b/src/emsesp_stub.hpp
@@ -28,7 +28,7 @@
#include
-// forward declarators
+// forward declarator
// used to bind EMS-ESP functions to external frameworks
namespace emsesp {
class EMSESP {
diff --git a/src/locale_translations.h b/src/locale_translations.h
index ae6a5144b..46c7d76ee 100644
--- a/src/locale_translations.h
+++ b/src/locale_translations.h
@@ -49,10 +49,10 @@ MAKE_WORD_TRANSLATION(alert_device, "Alert Module", "Alarmmodul", "Alert Module"
MAKE_WORD_TRANSLATION(pump_device, "Pump Module", "Pumpenmodul", "Pump Module", "Pumpmodul", "Moduł pompy", "Pumpemodul", "", "Pompa", "Module Pompa") // TODO translate
MAKE_WORD_TRANSLATION(heatsource_device, "Heatsource", "Heizquelle", "Heatsource", "Värmekälla", "Źródło ciepła", "Varmekilde", "", "Isı Kaynağı", "Fonte di calore") // TODO translate
MAKE_WORD_TRANSLATION(sensors_device, "Sensors", "Sensoren", "Sensoren", "Sensorer", "Czujniki", "Sensorer", "Capteurs", "Sensör Cihazı", "Sensori")
-MAKE_WORD_TRANSLATION(unknown_device, "Unknown", "Unbekannt", "Onbekend", "Okänt", "Nieznane urządzenie", "Ukjent", "Inconnu", "", "Sconosciuto") // TODO translate
-MAKE_WORD_TRANSLATION(custom_device, "Custom", "Nutzerdefiniert", "", "", "Niestandardowe", "", "", "", "") // TODO translate
-MAKE_WORD_TRANSLATION(custom_device_name, "User defined entities", "Nutzer deklarierte Entitäten", "", "", "Encje zdefiniowane przez użytkownika", "", "", "", "Entità definita da utente") // TODO translate
-MAKE_WORD_TRANSLATION(ventilation_device, "Ventilation", "Lüftung", "", "", "", "", "", "", "") // TODO translate
+MAKE_WORD_TRANSLATION(unknown_device, "Unknown", "Unbekannt", "Onbekend", "Okänt", "Nieznane urządzenie", "Ukjent", "Inconnu", "Bilinmeyen", "Sconosciuto") // TODO translate
+MAKE_WORD_TRANSLATION(custom_device, "Custom", "Nutzerdefiniert", "", "", "Niestandardowe", "", "", "Özel", "Personalizzato") // TODO translate
+MAKE_WORD_TRANSLATION(custom_device_name, "User defined entities", "Nutzer deklarierte Entitäten", "", "", "Encje zdefiniowane przez użytkownika", "", "", "Kullanıcı tarafından tanımlanmış varlıklar", "Entità definita da utente") // TODO translate
+MAKE_WORD_TRANSLATION(ventilation_device, "Ventilation", "Lüftung", "", "", "", "", "", "Havalandırma", "Ventilazione") // TODO translate
// commands
// TODO translate
@@ -67,8 +67,9 @@ MAKE_WORD_TRANSLATION(restart_cmd, "restart EMS-ESP", "Neustart", "", "", "uruch
MAKE_WORD_TRANSLATION(watch_cmd, "watch incoming telegrams", "Watch auf eingehende Telegramme", "", "", "obserwuj przyczodzące telegramy", "se innkommende telegrammer", "", "Gelen telegramları ", "guardare i telegrammi in arrivo") // TODO translate
MAKE_WORD_TRANSLATION(publish_cmd, "publish all to MQTT", "Publiziere MQTT", "", "", "opublikuj wszystko na MQTT", "Publiser alt til MQTT", "", "Hepsini MQTTye gönder", "pubblica tutto su MQTT") // TODO translate
MAKE_WORD_TRANSLATION(system_info_cmd, "show system status", "Zeige System-Status", "", "", "pokaż status systemu", "vis system status", "", "Sistem Durumunu Göster", "visualizza stati di sistema") // TODO translate
-MAKE_WORD_TRANSLATION(schedule_cmd, "enable schedule item", "Aktiviere Zeitplan", "", "", "aktywuj wybrany harmonogram", "", "", "", "abilitare l'elemento programmato") // TODO translate
+MAKE_WORD_TRANSLATION(schedule_cmd, "enable schedule item", "Aktiviere Zeitplan", "", "", "aktywuj wybrany harmonogram", "", "", "program öğesini etkinleştir", "abilitare l'elemento programmato") // TODO translate
MAKE_WORD_TRANSLATION(entity_cmd, "set custom value on ems", "Sende eigene Entitäten zu EMS", "", "", "wyślij własną wartość na EMS", "", "", "", "imposta valori personalizzati su EMS") // TODO translate
+MAKE_WORD_TRANSLATION(commands_response, "get response") // TODO translate
// tags
MAKE_WORD_TRANSLATION(tag_boiler_data_ww, "dhw", "WW", "dhw", "VV", "CWU", "dhw", "ecs", "SKS", "dhw")
@@ -126,13 +127,13 @@ MAKE_WORD_TRANSLATION(seconds, "seconds", "Sekunden", "Seconden", "Sekunder", "s
// Enum translations
// general
-MAKE_WORD_TRANSLATION(day_mo, "mo", "Mo", "Mo", "Må", "poniedziałek", "ma", "lun", "pzt", "lu")
-MAKE_WORD_TRANSLATION(day_tu, "tu", "Di", "Di", "Ti", "wtorek", "ti", "mar", "sal", "ma")
-MAKE_WORD_TRANSLATION(day_we, "we", "Mi", "Wo", "On", "środa", "on", "mer", "çar", "me")
-MAKE_WORD_TRANSLATION(day_th, "th", "Do", "Do", "To", "czwartek", "to", "jeu", "per", "gio")
-MAKE_WORD_TRANSLATION(day_fr, "fr", "Fr", "Vr", "Fr", "piątek", "fr", "ven", "cum", "ve")
-MAKE_WORD_TRANSLATION(day_sa, "sa", "Sa", "Za", "Lö", "sobota", "lø", "sam", "cts", "sa")
-MAKE_WORD_TRANSLATION(day_su, "su", "So", "Zo", "Sö", "niedziela", "sø", "dim", "paz", "do")
+MAKE_WORD_TRANSLATION(day_mo, "mo", "Mo", "Mo", "Må", "poniedziałek", "ma", "lun", "Pzt", "lu")
+MAKE_WORD_TRANSLATION(day_tu, "tu", "Di", "Di", "Ti", "wtorek", "ti", "mar", "Sal", "ma")
+MAKE_WORD_TRANSLATION(day_we, "we", "Mi", "Wo", "On", "środa", "on", "mer", "Çar", "me")
+MAKE_WORD_TRANSLATION(day_th, "th", "Do", "Do", "To", "czwartek", "to", "jeu", "Per", "gio")
+MAKE_WORD_TRANSLATION(day_fr, "fr", "Fr", "Vr", "Fr", "piątek", "fr", "ven", "Cum", "ve")
+MAKE_WORD_TRANSLATION(day_sa, "sa", "Sa", "Za", "Lö", "sobota", "lø", "sam", "Cts", "sa")
+MAKE_WORD_TRANSLATION(day_su, "su", "So", "Zo", "Sö", "niedziela", "sø", "dim", "Paz", "do")
MAKE_WORD_TRANSLATION(all, "all", "Alle", "Alle", "Alla", "codziennie", "alle", "tous", "tüm", "tutti")
MAKE_WORD_TRANSLATION(own_1, "own 1", "Eigen 1", "Eigen 1", "Egen 1", "własny 1", "egen 1", "propre 1", "kendi 1", "proprio 1")
MAKE_WORD_TRANSLATION(family, "family", "Familie", "Familie", "Familj", "rodzina", "familie", "famille", "aile", "famiglia")
@@ -142,7 +143,7 @@ MAKE_WORD_TRANSLATION(seniors, "seniors", "Senioren", "Senioren", "Seniorer", "s
MAKE_WORD_TRANSLATION(no, "no", "nein", "nee", "nej", "nie", "nei", "non", "hayır", "no")
MAKE_WORD_TRANSLATION(new, "new", "Neu", "Nieuw", "Ny", "nowy", "ny", "nouveau", "yeni", "nuovo")
MAKE_WORD_TRANSLATION(own_2, "own 2", "Eigen 2", "Eigen 2", "Egen 2", "własny 2", "egen 2", "propre 2", "kendi 2", "proprio 2")
-MAKE_WORD_TRANSLATION(singles, "singles", "Singles", "Singles", "Singlar", "osoba samotna", "single", "seuls", "", "singoli")
+MAKE_WORD_TRANSLATION(singles, "singles", "Singles", "Singles", "Singlar", "osoba samotna", "single", "seuls", "tekliler", "singoli")
MAKE_WORD_TRANSLATION(am, "am", "Vormittag", "Ochtend", "Förmiddag", "do południa", "formiddag", "matin", "sabah", "mattina")
MAKE_WORD_TRANSLATION(pm, "pm", "Nachmittag", "Namiddag", "Eftermiddag", "po południu", "ettermiddag", "après-midi", "akşam", "pomeriggio")
MAKE_WORD_TRANSLATION(midday, "midday", "Mittag", "Middag", "Middag", "południe", "middag", "midi", "öğlen", "mezzogiorno")
@@ -166,7 +167,7 @@ MAKE_WORD_TRANSLATION(na, "n/a", "n/a", "n/a", "n/a", "nd.", "n/a", "n/c", "mevc
MAKE_WORD_TRANSLATION(time, "time", "Zeit", "Tijd", "Tid", "godzina", "tid", "heure", "zaman", "ora")
MAKE_WORD_TRANSLATION(date, "date", "Datum", "Datum", "Datum", "data", "dato", "date", "tarih", "data")
MAKE_WORD_TRANSLATION(continuous, "continuous", "kontinuierlich", "continue", "kontinuerlig", "ciągły", "kontinuerlig", "continu", "devam eden", "continuo")
-MAKE_WORD_TRANSLATION(3wayvalve, "3-way valve", "3-Wege Ventil", "3-weg klep", "trevägsventil", "zawór 3-drogowy", "treveisventil", "vanne 3 voies" ,"3 yollu vana", "valvola 3 vie")
+MAKE_WORD_TRANSLATION(3wayvalve, "3-way valve", "3-Wege Ventil", "3-weg klep", "trevägsventil", "zawór 3-drogowy", "treveisventil", "vanne 3 voies" , "3 yollu vana", "valvola 3 vie")
MAKE_WORD_TRANSLATION(chargepump, "chargepump", "Ladepumpe", "laadpomp", "laddpump", "pompa ładująca", "ladepumpe", "pompe de charge", "besleme pompası", "pompa di carica")
MAKE_WORD_TRANSLATION(hot, "hot", "Heiß", "Heet", "Het", "gorący", "het", "chaud", "sıcak", "caldo")
MAKE_WORD_TRANSLATION(high_comfort, "high comfort", "gehobener Komfort", "Verhoogd comfort", "Förhöjd komfort", "wysoki komfort", "høy komfort", "comfort", "komfor", "comfort alto")
@@ -180,16 +181,16 @@ MAKE_WORD_TRANSLATION(layeredbuffer, "layered buffer", "Schichtspeicher", "Gelaa
MAKE_WORD_TRANSLATION(maintenance, "maintenance", "Wartung", "Onderhoud", "Underhåll", "przegląd", "vedlikehold", "maintenance", "bakım", "servizio")
MAKE_WORD_TRANSLATION(heating, "heating", "Heizen", "Verwarmen", "Uppvärmning", "ogrzewanie", "oppvarming", "chauffage", "ısıtma", "riscaldamento")
MAKE_WORD_TRANSLATION(cooling, "cooling", "Kühlen", "Koelen", "Kyler", "chłodzenie", "kjøling", "refroidissement", "soğuma", "raffreddamento")
-MAKE_WORD_TRANSLATION(heatandcool, "heating&cooling", "Heizen&Kühlen", "Verwarmen&Koelen", "Uppvärmning&Kyler","","","","","") // TODO translate
+MAKE_WORD_TRANSLATION(heatandcool, "heating&cooling", "Heizen&Kühlen", "Verwarmen&Koelen", "Uppvärmning&Kyler", "", "", "", "ısıtma&soğutma", "") // TODO translate
MAKE_WORD_TRANSLATION(disinfecting, "disinfecting", "Desinfizieren", "Desinfecteren", "Desinficerar", "dezynfekcja termiczna", "desinfisering", "désinfection", "dezenfeksiyon", "disinfezione")
MAKE_WORD_TRANSLATION(no_heat, "no heat", "keine Wärme", "Geen warmte", "Ingen värme", "brak ciepła", "ingen varme", "pas de chauffage", "ısınma yok", "nessun calore")
MAKE_WORD_TRANSLATION(heatrequest, "heat request", "Wärmeanforderung", "Verwarmignsverzoek", "Värmeförfrågan", "zapotrzebowanie na ciepło", "varmeforespørsel", "demande de chauffage", "ısınma ihtiyacı", "richiesta calore")
MAKE_WORD_TRANSLATION(valve, "valve", "Ventil", "Klep", "Ventil", "zawór", "ventil", "valve", "vana", "valvola")
-MAKE_WORD_TRANSLATION(proportional, "proportional", "", "", "", "proporcjonalny", "proposjonal", "", "", "proporzionale") // TODO translate
-MAKE_WORD_TRANSLATION(deltaP1, "deltaP-1", "", "", "", "", "deltaP-1", "", "", "deltaP-1") // TODO translate
-MAKE_WORD_TRANSLATION(deltaP2, "deltaP-2", "", "", "", "", "deltaP-2", "", "", "deltaP-2") // TODO translate
-MAKE_WORD_TRANSLATION(deltaP3, "deltaP-3", "", "", "", "", "deltaP-3", "", "", "deltaP-3") // TODO translate
-MAKE_WORD_TRANSLATION(deltaP4, "deltaP-4", "", "", "", "", "deltaP-4", "", "", "deltaP-4") // TODO translate
+MAKE_WORD_TRANSLATION(proportional, "proportional", "", "", "", "proporcjonalny", "proposjonal", "", "oransal", "proporzionale") // TODO translate
+MAKE_WORD_TRANSLATION(deltaP1, "deltaP-1", "", "", "", "", "deltaP-1", "", "deltaP-1", "deltaP-1") // TODO translate
+MAKE_WORD_TRANSLATION(deltaP2, "deltaP-2", "", "", "", "", "deltaP-2", "", "deltaP-2", "deltaP-2") // TODO translate
+MAKE_WORD_TRANSLATION(deltaP3, "deltaP-3", "", "", "", "", "deltaP-3", "", "deltaP-3", "deltaP-3") // TODO translate
+MAKE_WORD_TRANSLATION(deltaP4, "deltaP-4", "", "", "", "", "deltaP-4", "", "deltaP-4", "deltaP-4") // TODO translate
// heatpump
MAKE_WORD_TRANSLATION(none, "none", "keine", "geen", "ingen", "brak", "ingen", "aucun", "hiçbiri", "nessuno")
@@ -220,7 +221,7 @@ MAKE_WORD_TRANSLATION(german, "german", "Deutsch", "Duits", "Tyska", "niemiecki"
MAKE_WORD_TRANSLATION(dutch, "dutch", "Niederländisch", "Nederlands", "Nederländska", "niderlandzki", "nederlandsk", "néerlandais", "Flemenkçe", "Olandese")
MAKE_WORD_TRANSLATION(french, "french", "Französisch", "Frans", "Franska", "francuski", "fransk", "français", "Fransızca", "Francese")
MAKE_WORD_TRANSLATION(italian, "italian", "Italienisch", "Italiaans", "Italienska", "włoski", "italiensk", "italien", "İtalyanca", "Italiano")
-MAKE_WORD_TRANSLATION(high, "high", "hoch", "hoog", "Hög", "wysoki", "høy", "haut", "", "alto") // TODO translate
+MAKE_WORD_TRANSLATION(high, "high", "hoch", "hoog", "Hög", "wysoki", "høy", "haut", "yüksek", "alto") // TODO translate
MAKE_WORD_TRANSLATION(low, "low", "niedrig", "laag", "Låg", "niski", "lav", "bas", "düşük", "basso")
MAKE_WORD_TRANSLATION(radiator, "radiator", "Heizkörper", "Radiator", "Radiator", "grzejniki", "radiator", "radiateur", "radyatör", "radiatore")
MAKE_WORD_TRANSLATION(convector, "convector", "Konvektor", "Convector", "Konvektor", "konwektory", "konvektor", "convecteur", "convector", "convettore")
@@ -250,7 +251,7 @@ MAKE_WORD_TRANSLATION(fast, "fast", "schnell", "snel", "snabb", "szybkie", "hurt
MAKE_WORD_TRANSLATION(slow, "slow", "langsam", "langzaam", "långsam", "powolne", "langsom", "lent", "yavaş", "lento")
MAKE_WORD_TRANSLATION(internal_temperature, "internal temperature", "Interne Temperatur", "Interne Temperatuur", "Interntemperatur", "temperatura wewnętrzna", "interntemperatur", "température interne", "oda sıcaklığı", "temperatura interna")
MAKE_WORD_TRANSLATION(internal_setpoint, "internal setpoint", "Interner Sollwert", "Interne Streeftemperatuur", "Internt börvärde", "nastawa wewnętrzna", "internt settpunkt", "consigne interne", "istenen oda sıcaklığı", "setpoint interno")
-MAKE_WORD_TRANSLATION(external_temperature, "external temperature", "Externe Temperatur", "Externe Temperatuur", "Extern temperatur", "temperatura zewnętrzna", "ekstern temperatur", "température externe","", "temperatura esterna") // TODO translate
+MAKE_WORD_TRANSLATION(external_temperature, "external temperature", "Externe Temperatur", "Externe Temperatuur", "Extern temperatur", "temperatura zewnętrzna", "ekstern temperatur", "température externe", "dış sıcaklık", "temperatura esterna") // TODO translate
MAKE_WORD_TRANSLATION(burner_temperature, "burner temperature", "Brennertemperatur", "Brander Temperuur", "Brännartemperatur", "temperatura palnika", "brennertemperatur", "température du brûleur", "kazan sıcaklığı", "temperatura bruciatore")
MAKE_WORD_TRANSLATION(ww_temperature, "ww temperature", "Wassertemperatur", "Watertemperatuur", "Vattentemperatur", "temperatura c.w.u.", "vanntemperatur", "température de l'eau", "Kullanım suyu sıcaklığı", "temperatura acqua")
MAKE_WORD_TRANSLATION(smoke_temperature, "smoke temperature", "Abgastemperatur", "Buitentemperatuur", "Rökgastemperatur", "temperatura dymu", "røykgasstemperatur", "température des gaz d'échappement", "baca gazı sıcaklığı", "temperatura fumo")
@@ -270,201 +271,202 @@ MAKE_WORD_TRANSLATION(cyl1, "cyl 1", "Zyl_1", "Cil 1", "Cyl 1", "cyl 1", "cyl 1"
MAKE_WORD_TRANSLATION(cyl2, "cyl 2", "Zyl_2", "Cil 2", "Cyl 2", "cyl 2", "cyl 2", "cyl 2", "cly 1", "Cil 2")
// ventilation
-MAKE_WORD_TRANSLATION(demand, "demand", "Bedarf")
-MAKE_WORD_TRANSLATION(intense, "intense", "Intensiv")
-MAKE_WORD_TRANSLATION(sleep, "sleep", "Einschlafen")
-MAKE_WORD_TRANSLATION(partymode, "party", "Party")
-MAKE_WORD_TRANSLATION(fireplace, "fireplace", "Kamin")
+MAKE_WORD_TRANSLATION(demand, "demand", "Bedarf", "", "", "", "", "", "talep", "richiesta")
+MAKE_WORD_TRANSLATION(intense, "intense", "Intensiv", "", "", "", "", "", "yoğun", "intensivo")
+MAKE_WORD_TRANSLATION(sleep, "sleep", "Einschlafen", "", "", "", "", "", "uyku", "notturno")
+MAKE_WORD_TRANSLATION(partymode, "party", "Party", "", "", "", "", "", "parti", "festa")
+MAKE_WORD_TRANSLATION(fireplace, "fireplace", "Kamin", "", "", "", "", "", "şömine", "camino")
// MQTT Discovery - this is special device entity for 'climate'
-MAKE_TRANSLATION(haclimate, "haclimate", "Discovery current room temperature", "Discovery Temperatur", "", "", "termostat w HA", "HA Avlest temp", "", "", "verifica temperatura ambiente attuale") // TODO translate
+MAKE_TRANSLATION(haclimate, "haclimate", "Discovery current room temperature", "Discovery Temperatur", "", "", "termostat w HA", "HA Avlest temp", "", "Güncel osa sıcaklığı", "verifica temperatura ambiente attuale") // TODO translate
-// Entity translations
+// Entity translations: tag,mqtt, en, de, nl, sv, pl, no, fr, tr, it
// Boiler
-MAKE_TRANSLATION(wwtapactivated, "wwtapactivated", "turn on/off", "Durchlauferhitzer aktiv", "zet aan/uit", "på/av", "system przygotowywania", "Varmtvann active", "ecs activée", "", "commuta on/off")
-MAKE_TRANSLATION(reset, "reset", "Reset", "Reset", "Reset", "Nollställ", "kasowanie komunikatu", "nullstill", "reset", "", "Reset")
-MAKE_TRANSLATION(oilPreHeat, "oilpreheat", "oil preheating", "Ölvorwärmung", "Olie voorverwarming", "Förvärmning olja", "podgrzewanie oleju", "oljeforvarming", "préchauffage de l'huile", "", "preriscaldamento olio")
-MAKE_TRANSLATION(heatingActive, "heatingactive", "heating active", "Heizen aktiv", "Verwarming actief", "Uppvärmning aktiv", "c.o. aktywne", "oppvarming aktiv", "chauffage actif", "", "riscaldamento attivo")
-MAKE_TRANSLATION(tapwaterActive, "tapwateractive", "tapwater active", "Warmwasser aktiv", "Warm water actief", "Varmvatten aktiv", "c.w.u. aktywne", "varmtvann aktiv", "eau chaude active", "", "acqua calda attiva")
-MAKE_TRANSLATION(selFlowTemp, "selflowtemp", "selected flow temperature", "Sollwert Vorlauftemperatur", "Ingestelde aanvoertemperatuur", "Börvärde Flödestemperatur", "wybrana temperatura zasilania", "valgt turtemperatur", "température de flux selectionnée", "", "flusso temperatura selezionato")
-MAKE_TRANSLATION(selBurnPow, "selburnpow", "burner selected max power", "Sollwert Brennerleistung", "Ingestelde maximale brandervermogen", "Brännare vald maxeffekt", "wybrana moc źródła ciepła", "settpunkt brennerkapasitet", "puissance max du brûleur selectionnée", "", "Setpoint potenza bruciatore")
-MAKE_TRANSLATION(absBurnPow, "absburnpow", "burner current power (absolute)", "Brennerleistung (absolut)", "Brandervermogen (abs)", "Värmepanna aktuell effekt (abs)", "aktualna moc źródła ciepła (absolutna)", "brennereffekt", "puissance du brûleur actuelle (abs)", "", "potenza attuale del bruciatore (assoluta)")
-MAKE_TRANSLATION(heatingPumpMod, "heatingpumpmod", "heating pump modulation", "Heizungspumpe 1 Modulation", "Modulatie verwarmingspomp", "Modulering Värmepump", "wysterowanie pompy c.o.", "varmepumpemodulering", "modulation de la pompe à chaleur", "", "modulazione pompa di calore")
-MAKE_TRANSLATION(outdoorTemp, "outdoortemp", "outside temperature", "Aussentemperatur", "Buitentemperatuur", "Utomhustemperatur", "temperatura zewnętrzna", "utetemperatur", "température extérieure", "", "tempertura esterna")
-MAKE_TRANSLATION(curFlowTemp, "curflowtemp", "current flow temperature", "aktuelle Vorlauftemperatur", "Huidige aanvoertemperatuur", "Flödestemperatur", "temperatura zasilania", "aktuell strømmetemperatur", "température actuelle du flux", "", "temperatura di mandata attuale")
-MAKE_TRANSLATION(retTemp, "rettemp", "return temperature", "Rücklauftemperatur", "Retourtemperatuur", "Returtemperatur", "temperatura powrotu", "returtemperatur", "température de retour", "", "temperatura di ritorno attuale")
-MAKE_TRANSLATION(switchTemp, "switchtemp", "mixing switch temperature", "Mischer Schalttemperatur", "Mixer temperatuur", "Blandartemperatur", "temperatura przełączania mieszacza", "Blandertemperatur", "température de bascule du mélangeur", "", "Temperatura di commutazione del miscelatore")
-MAKE_TRANSLATION(sysPress, "syspress", "system pressure", "Systemdruck", "Systeemdruk", "Systemtryck", "ciśnienie w systemie", "systemtrykk", "pression du système", "", "pressione sistema")
-MAKE_TRANSLATION(boilTemp, "boiltemp", "actual boiler temperature", "Kesseltemperatur", "Keteltemperatuur", "Temperatur Värmepanna", "temperatura zasobnika", "varmepumpetemp.", "température de la chaudière", "", "temperatura attuale caldaia")
-MAKE_TRANSLATION(exhaustTemp, "exhausttemp", "exhaust temperature", "Abgastemperatur", "Uitlaattemperatuur", "Avgastemperatur", "temperatura spalin", "røykgasstemp", "température des gaz d'échappement", "", "temperatura di scarico")
-MAKE_TRANSLATION(burnGas, "burngas", "gas", "Gas", "Gas", "Gas", "gaz", "gass", "gaz", "", "Gas")
-MAKE_TRANSLATION(burnGas2, "burngas2", "gas stage 2", "Gas Stufe 2", "gas fase 2", "Gas Fas 2", "gaz 2 stopień", "gass fase 2", "gaz état 2", "", "gas fase 2")
-MAKE_TRANSLATION(flameCurr, "flamecurr", "flame current", "Flammenstrom", "Vlammenstroom", "Lågström", "prąd palnika", "flammetemp", "courrant de flamme", "", "corrente di fiamma")
-MAKE_TRANSLATION(heatingPump, "heatingpump", "heating pump", "Heizungspumpe", "Verwarmingspomp", "Värmepump", "pompa ciepła", "varmepumpe", "pompe à chaleur", "", "pompa di calore")
-MAKE_TRANSLATION(fanWork, "fanwork", "fan", "Gebläse", "Ventilator", "Fläkt", "wentylator", "vifte", "ventilateur", "", "Ventilatore")
-MAKE_TRANSLATION(ignWork, "ignwork", "ignition", "Zündung", "Ontsteking", "Tändning", "zapłon", "tenning", "ignition", "", "accensione")
-MAKE_TRANSLATION(heatingActivated, "heatingactivated", "heating activated", "Heizen aktiviert", "Verwarmen geactiveerd", "Uppvärmning aktiv", "system c.o.", "oppvarming aktivert", "chauffage activé", "", "riscaldamento attivato")
-MAKE_TRANSLATION(heatingTemp, "heatingtemp", "heating temperature", "Heizungstemperatur", "Verwarmingstemperatuur", "Uppvärmningstemperatur", "temperatura grzania", "oppvarmingstemperatur", "température de chauffage", "", "temperatura riscaldamento")
-MAKE_TRANSLATION(pumpModMax, "pumpmodmax", "boiler pump max power", "Kesselpumpen Maximalleistung", "Ketelpomp max vermogen", "Värmepannepump max effekt", "maksymalna moc pompy zasobnika", "varmepumpe maks effekt", "puissance max pompe à chaleur", "", "max potenza pompa caldaia")
-MAKE_TRANSLATION(pumpModMin, "pumpmodmin", "boiler pump min power", "Kesselpumpen Minmalleistung", "Ketelpomp min vermogen", "Värmepannepump min effekt", "minimalna moc pompy zasobnika", "varmepumpe min effekt", "puissance min pompe à chaleur", "", "min potenza pompa caldaia")
-MAKE_TRANSLATION(pumpDelay, "pumpdelay", "pump delay", "Pumpennachlaufzeit", "Pomp nalooptijd", "Pumpfördröjning", "opóźnienie pompy", "pumpeforsinkelse", "délai d'attente pompe", "", "ritardo pompa")
-MAKE_TRANSLATION(burnMinPeriod, "burnminperiod", "burner min period", "Antipendelzeit", "Antipendeltijd", "Värmepanna Min Period", "minimalny czas pracy palnika", "varmekjele min periode", "délai d'attente du brûleur", "", "periodo minimo del bruciatore")
-MAKE_TRANSLATION(burnMinPower, "burnminpower", "burner min power", "minimale Brennerleistung", "Minimaal brandervermogen", "Värmepanna Min Effekt", "minimalna moc źródła ciepła", "varmekjele min effekt", "puissance min brûleur", "", "potenza minima bruciatore")
-MAKE_TRANSLATION(burnMaxPower, "burnmaxpower", "burner max power", "maximale Brennerleistung", "Maximaal brandervermogen", "Värmepanna Max Effekt", "maksymalna moc źródła ciepła", "varmekjele maks effekt", "puissance max brûleur", "", "potenza massima bruciatore")
-MAKE_TRANSLATION(boilHystOn, "boilhyston", "hysteresis on temperature", "Einschaltdifferenz", "ketel aan hysterese verschil", "Hysteres aktiveringstemperatur", "histereza załączania", "hysterese på temperatur", "hysteresis température d'allumage", "", "isteresi sulla temperatura")
-MAKE_TRANSLATION(boilHystOff, "boilhystoff", "hysteresis off temperature", "Ausschaltdifferenz", "ketel uit hysterese verschil", "Hysteres inaktiveringstemperatur", "histereza wyłączania", "hysterese av temperatur", "hysteresis température d'extinction", "", "isteresi fuori temperatura")
-MAKE_TRANSLATION(boil2HystOn, "boil2hyston", "hysteresis stage 2 on temperature", "Einschaltdifferenz Stufe 2", "ketel aan hysterese verschil 2", "Hysteres aktiveringstemperatur 2", "histereza załączania stopnia 2", "", "hysteresis état 2 température d'allumage", "", "stadio di isteresi 2 sulla temperatura") // TODO translate
-MAKE_TRANSLATION(boil2HystOff, "boil2hystoff", "hysteresis stage 2 off temperature", "Ausschaltdifferenz Stufe 2", "ketel uit hysterese verschil 2", "Hysteres inaktiveringstemperatur 2", "histereza wyłączania stopnia 2", "hysterese inaktiveringstemperatur 2", "hysteresis état 2 température d'extinction", "", "isteresi stadio 2 fuori temperatura") // TODO translate
-MAKE_TRANSLATION(setFlowTemp, "setflowtemp", "set flow temperature", "Sollwert Vorlauftemperatur", "Ingestelde aanvoertemperatuur", "Börvärde Flödestemperatur", "zadana temperatura zasilania", "innstilt turtemperatur", "température du flux définie", "", "impostare temperatura di mandata")
-MAKE_TRANSLATION(setBurnPow, "setburnpow", "burner set power", "Sollwert Brennerleistung", "Ingesteld brandervermogen", "Värmepanna vald Effekt", "zadana moc palnika", "varmekjele valgt effekt", "puissance du brûleur définie", "", "impostare potenza bruciatore")
-MAKE_TRANSLATION(curBurnPow, "curburnpow", "burner current power", "Brennerleistung", "Brandervermogen", "Värmepanna aktuell effekt", "aktualna moc źródła ciepła", "brennereffekt", "puissance du brûleur actuelle", "", "potenza attuale bruciatore")
-MAKE_TRANSLATION(burnStarts, "burnstarts", "burner starts", "Brenner Starts", "Aantal brander starts", "Värmepanna antal starter", "liczba uruchomień palnika", "antall varmepumpe starter", "démarrages du brûleur", "", "avvii bruciatore")
-MAKE_TRANSLATION(burnWorkMin, "burnworkmin", "total burner operating time", "Brenner Laufzeit", "Totale branderlooptijd", "Värmepanna aktiva timmar", "łączny czas pracy palnika", "brennersteg tid i min", "durée de fonctionnement totale du brûleur", "", "tempo totale di funzionamento del bruciatore")
-MAKE_TRANSLATION(burn2WorkMin, "burn2workmin", "burner stage 2 operating time", "Brenner Stufe 2 Laufzeit", "Totale looptijd brander fase 2", "Värmepanna steg 2 aktiva timmar", "łączny czas pracy palnika 2 stopnia", "brennersteg2 tid i min", "durée de fonctionnement totale du brûleur état 2", "", "tempo di funzionamento del bruciatore 2° stadio")
-MAKE_TRANSLATION(heatWorkMin, "heatworkmin", "total heat operating time", "Heizung Laufzeit", "Totale looptijd verwarming", "Uppvärmning aktiva timmar", "łączny czas grzania", "varmetid i min", "durée de fonctionnement du chauffage", "", "tempo totale di funzionamento in riscaldamento")
-MAKE_TRANSLATION(heatStarts, "heatstarts", "burner starts heating", "Brenner Starts Heizung", "Aantal brander starts verwarming", "Uppvärmning antal starter", "liczba uruchomień palnika na ogrzewanie", "antall oppvarmninger", "démarrages du chauffage", "", "preriscaldamento bruciatore") // TODO translate
-MAKE_TRANSLATION(UBAuptime, "ubauptime", "total UBA operating time", "Anlagen-Gesamtlaufzeit", "totale looptijd branderautomaat (UBA)", "Total Tid", "łączny czas pracy układu sterowania", "totaltid", "durée de fonctionnement totale de l'appareil (UBA)", "", "Tempo di funzionamento totale del sistema")
-MAKE_TRANSLATION(lastCode, "lastcode", "last error code", "Letzter Fehler", "Laatste foutcode", "Senaste Felkod", "ostatni błąd", "siste feilkode", "dernier code d'erreur", "", "ultimo codice errore")
-MAKE_TRANSLATION(serviceCode, "servicecode", "service code", "Statusmeldung", "Statuscode", "Servicekod", "kod serwisowy", "servicekode", "code de service", "", "codice messaggio di stato")
-MAKE_TRANSLATION(serviceCodeNumber, "servicecodenumber", "service code number", "Statusmeldungsnummer", "Status codenummer", "Servicekod", "numer kodu serwisowego", "servicekodenummer", "numéro du code de service", "", "numero del messaggio di stato")
-MAKE_TRANSLATION(maintenanceMessage, "maintenancemessage", "maintenance message", "Wartungsmeldung", "Onderhoudsmelding", "Servicemeddelande", "komunikat przeglądu", "vedlikeholdsmelding", "message de maintenance", "", "messaggio di manutenzione")
-MAKE_TRANSLATION(maintenanceDate, "maintenancedate", "next maintenance date", "Wartungsdatum", "Onderhoudsdatum", "Datum nästa Service", "termin następnego przeglądu", "vedlikeholdsdato", "prochaine date de maintenance", "", "prossima data di manutenzione")
-MAKE_TRANSLATION(maintenanceType, "maintenance", "maintenance scheduled", "Wartungsplan", "Onderhoud gepland", "Underhall schemlagt", "rodzaj przeglądu", "vedlikeholdstype", "maintenance prévue", "", "manutenzione programmata")
-MAKE_TRANSLATION(maintenanceTime, "maintenancetime", "time to next maintenance", "Wartung in", "Onderhoud in", "Tid till nästa underhall", "czas do kolejnego przeglądu", "vedlikeholdstid", "durée avant la prochaine maintenance", "", "tempo alla prossima manutenzione")
-MAKE_TRANSLATION(emergencyOps, "emergencyops", "emergency operation", "Notoperation", "Noodoperatie", "Nöddrift", "praca w trybie awaryjnym", "nøddrift", "opération d'urgence", "", "operazione di emergenza")
-MAKE_TRANSLATION(emergencyTemp, "emergencytemp", "emergency temperature", "Nottemperatur", "Noodtemperatuur", "Nöddrift temperatur", "temperatura w trybie awaryjnym", "nødtemperatur", "température d'urgence", "", "temperatura di emergenza")
-MAKE_TRANSLATION(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpen Modus", "", "", "tryb pracy pompy kotła", "pumpemodus", "", "", "modalità pompa caldaia") // TODO translate
+MAKE_TRANSLATION(wwtapactivated, "wwtapactivated", "turn on/off", "Durchlauferhitzer aktiv", "zet aan/uit", "på/av", "system przygotowywania", "Varmtvann active", "ecs activée", "aç/kapa", "commuta on/off")
+MAKE_TRANSLATION(reset, "reset", "Reset", "Reset", "Reset", "Nollställ", "kasowanie komunikatu", "nullstill", "reset", "Sıfırla", "Reset")
+MAKE_TRANSLATION(oilPreHeat, "oilpreheat", "oil preheating", "Ölvorwärmung", "Olie voorverwarming", "Förvärmning olja", "podgrzewanie oleju", "oljeforvarming", "préchauffage de l'huile", "Yakıt Ön ısıtma devrede", "preriscaldamento olio")
+MAKE_TRANSLATION(heatingActive, "heatingactive", "heating active", "Heizen aktiv", "Verwarming actief", "Uppvärmning aktiv", "c.o. aktywne", "oppvarming aktiv", "chauffage actif", "ısıtma devrede", "riscaldamento attivo")
+MAKE_TRANSLATION(tapwaterActive, "tapwateractive", "tapwater active", "Warmwasser aktiv", "Warm water actief", "Varmvatten aktiv", "c.w.u. aktywne", "varmtvann aktiv", "eau chaude active", "sıcak kullanım suyu devrede", "acqua calda attiva")
+MAKE_TRANSLATION(selFlowTemp, "selflowtemp", "selected flow temperature", "Sollwert Vorlauftemperatur", "Ingestelde aanvoertemperatuur", "Börvärde Flödestemperatur", "wybrana temperatura zasilania", "valgt turtemperatur", "température de flux selectionnée", "seçili akış sıcaklığı", "flusso temperatura selezionato")
+MAKE_TRANSLATION(selBurnPow, "selburnpow", "burner selected max power", "Sollwert Brennerleistung", "Ingestelde maximale brandervermogen", "Brännare vald maxeffekt", "wybrana moc źródła ciepła", "settpunkt brennerkapasitet", "puissance max du brûleur selectionnée", "seçili kazan maksimum güç", "Setpoint potenza bruciatore")
+MAKE_TRANSLATION(absBurnPow, "absburnpow", "burner current power (absolute)", "Brennerleistung (absolut)", "Brandervermogen (abs)", "Värmepanna aktuell effekt (abs)", "aktualna moc źródła ciepła (absolutna)", "brennereffekt", "puissance du brûleur actuelle (abs)", "kazan anlık akış gücü(mutlak)", "potenza attuale del bruciatore (assoluta)")
+MAKE_TRANSLATION(heatingPumpMod, "heatingpumpmod", "heating pump modulation", "Heizungspumpe 1 Modulation", "Modulatie verwarmingspomp", "Modulering Värmepump", "wysterowanie pompy c.o.", "varmepumpemodulering", "modulation de la pompe à chaleur", "ısı pompası modülasyonu", "modulazione pompa di calore")
+MAKE_TRANSLATION(outdoorTemp, "outdoortemp", "outside temperature", "Aussentemperatur", "Buitentemperatuur", "Utomhustemperatur", "temperatura zewnętrzna", "utetemperatur", "température extérieure", "dış ortam sıcaklığı, ", "tempertura esterna")
+MAKE_TRANSLATION(curFlowTemp, "curflowtemp", "current flow temperature", "aktuelle Vorlauftemperatur", "Huidige aanvoertemperatuur", "Flödestemperatur", "temperatura zasilania", "aktuell strømmetemperatur", "température actuelle du flux", "akış sıcaklığı", "temperatura di mandata attuale")
+MAKE_TRANSLATION(retTemp, "rettemp", "return temperature", "Rücklauftemperatur", "Retourtemperatuur", "Returtemperatur", "temperatura powrotu", "returtemperatur", "température de retour", "dönüş sıcaklığı", "temperatura di ritorno attuale")
+MAKE_TRANSLATION(switchTemp, "switchtemp", "mixing switch temperature", "Mischer Schalttemperatur", "Mixer temperatuur", "Blandartemperatur", "temperatura przełączania mieszacza", "Blandertemperatur", "température de bascule du mélangeur", "karışım hücresi sıcaklığı", "Temperatura di commutazione del miscelatore")
+MAKE_TRANSLATION(sysPress, "syspress", "system pressure", "Systemdruck", "Systeemdruk", "Systemtryck", "ciśnienie w systemie", "systemtrykk", "pression du système", "sistem basıncı", "pressione sistema")
+MAKE_TRANSLATION(boilTemp, "boiltemp", "actual boiler temperature", "Kesseltemperatur", "Keteltemperatuur", "Temperatur Värmepanna", "temperatura zasobnika", "varmepumpetemp.", "température de la chaudière", "gerçek boyler sıcaklığı", "temperatura attuale caldaia")
+MAKE_TRANSLATION(exhaustTemp, "exhausttemp", "exhaust temperature", "Abgastemperatur", "Uitlaattemperatuur", "Avgastemperatur", "temperatura spalin", "røykgasstemp", "température des gaz d'échappement", "baca sıcaklığı", "temperatura di scarico")
+MAKE_TRANSLATION(burnGas, "burngas", "gas", "Gas", "Gas", "Gas", "gaz", "gass", "gaz", "gaz", "Gas")
+MAKE_TRANSLATION(burnGas2, "burngas2", "gas stage 2", "Gas Stufe 2", "gas fase 2", "Gas Fas 2", "gaz 2 stopień", "gass fase 2", "gaz état 2", "gaz 2.seviye", "gas fase 2")
+MAKE_TRANSLATION(flameCurr, "flamecurr", "flame current", "Flammenstrom", "Vlammenstroom", "Lågström", "prąd palnika", "flammetemp", "courrant de flamme", "alev akımı", "corrente di fiamma")
+MAKE_TRANSLATION(heatingPump, "heatingpump", "heating pump", "Heizungspumpe", "Verwarmingspomp", "Värmepump", "pompa ciepła", "varmepumpe", "pompe à chaleur", "ısı pompası", "pompa di calore")
+MAKE_TRANSLATION(fanWork, "fanwork", "fan", "Gebläse", "Ventilator", "Fläkt", "wentylator", "vifte", "ventilateur", "fan", "Ventilatore")
+MAKE_TRANSLATION(ignWork, "ignwork", "ignition", "Zündung", "Ontsteking", "Tändning", "zapłon", "tenning", "ignition", "ateşleme", "accensione")
+MAKE_TRANSLATION(heatingActivated, "heatingactivated", "heating activated", "Heizen aktiviert", "Verwarmen geactiveerd", "Uppvärmning aktiv", "system c.o.", "oppvarming aktivert", "chauffage activé", "ısıtma başladı", "riscaldamento attivato")
+MAKE_TRANSLATION(heatingTemp, "heatingtemp", "heating temperature", "Heizungstemperatur", "Verwarmingstemperatuur", "Uppvärmningstemperatur", "temperatura grzania", "oppvarmingstemperatur", "température de chauffage", "ısıtma sıcaklığı", "temperatura riscaldamento")
+MAKE_TRANSLATION(pumpModMax, "pumpmodmax", "boiler pump max power", "Kesselpumpen Maximalleistung", "Ketelpomp max vermogen", "Värmepannepump max effekt", "maksymalna moc pompy zasobnika", "varmepumpe maks effekt", "puissance max pompe à chaleur", "boyler pompası maksimum güç", "max potenza pompa caldaia")
+MAKE_TRANSLATION(pumpModMin, "pumpmodmin", "boiler pump min power", "Kesselpumpen Minmalleistung", "Ketelpomp min vermogen", "Värmepannepump min effekt", "minimalna moc pompy zasobnika", "varmepumpe min effekt", "puissance min pompe à chaleur", "boyler pompası minimum güç", "min potenza pompa caldaia")
+MAKE_TRANSLATION(pumpDelay, "pumpdelay", "pump delay", "Pumpennachlaufzeit", "Pomp nalooptijd", "Pumpfördröjning", "opóźnienie pompy", "pumpeforsinkelse", "délai d'attente pompe", "pompa gecikmesi", "ritardo pompa")
+MAKE_TRANSLATION(burnMinPeriod, "burnminperiod", "burner min period", "Antipendelzeit", "Antipendeltijd", "Värmepanna Min Period", "minimalny czas pracy palnika", "varmekjele min periode", "délai d'attente du brûleur", "kazan minmum periyod", "periodo minimo del bruciatore")
+MAKE_TRANSLATION(burnMinPower, "burnminpower", "burner min power", "minimale Brennerleistung", "Minimaal brandervermogen", "Värmepanna Min Effekt", "minimalna moc źródła ciepła", "varmekjele min effekt", "puissance min brûleur", "kazan minimum güç", "potenza minima bruciatore")
+MAKE_TRANSLATION(burnMaxPower, "burnmaxpower", "burner max power", "maximale Brennerleistung", "Maximaal brandervermogen", "Värmepanna Max Effekt", "maksymalna moc źródła ciepła", "varmekjele maks effekt", "puissance max brûleur", "kazan maksimum güç", "potenza massima bruciatore")
+MAKE_TRANSLATION(boilHystOn, "boilhyston", "hysteresis on temperature", "Einschaltdifferenz", "ketel aan hysterese verschil", "Hysteres aktiveringstemperatur", "histereza załączania", "hysterese på temperatur", "hysteresis température d'allumage", "gecikme sıcaklığı devrede", "isteresi sulla temperatura")
+MAKE_TRANSLATION(boilHystOff, "boilhystoff", "hysteresis off temperature", "Ausschaltdifferenz", "ketel uit hysterese verschil", "Hysteres inaktiveringstemperatur", "histereza wyłączania", "hysterese av temperatur", "hysteresis température d'extinction", "gecikme sıcaklığı kapalı", "isteresi fuori temperatura")
+MAKE_TRANSLATION(boil2HystOn, "boil2hyston", "hysteresis stage 2 on temperature", "Einschaltdifferenz Stufe 2", "ketel aan hysterese verschil 2", "Hysteres aktiveringstemperatur 2", "histereza załączania stopnia 2", "", "hysteresis état 2 température d'allumage", "2. seviye gecikme sıcaklığı devrede", "stadio di isteresi 2 sulla temperatura") // TODO translate
+MAKE_TRANSLATION(boil2HystOff, "boil2hystoff", "hysteresis stage 2 off temperature", "Ausschaltdifferenz Stufe 2", "ketel uit hysterese verschil 2", "Hysteres inaktiveringstemperatur 2", "histereza wyłączania stopnia 2", "hysterese inaktiveringstemperatur 2", "hysteresis état 2 température d'extinction", "2. seviye gecikme sıcaklığı kapalı", "isteresi stadio 2 fuori temperatura") // TODO translate
+MAKE_TRANSLATION(setFlowTemp, "setflowtemp", "set flow temperature", "Sollwert Vorlauftemperatur", "Ingestelde aanvoertemperatuur", "Börvärde Flödestemperatur", "zadana temperatura zasilania", "innstilt turtemperatur", "température du flux définie", "akış sıcaklığını ayarla", "impostare temperatura di mandata")
+MAKE_TRANSLATION(setBurnPow, "setburnpow", "burner set power", "Sollwert Brennerleistung", "Ingesteld brandervermogen", "Värmepanna vald Effekt", "zadana moc palnika", "varmekjele valgt effekt", "puissance du brûleur définie", "kazan gücünü ayarla", "impostare potenza bruciatore")
+MAKE_TRANSLATION(curBurnPow, "curburnpow", "burner current power", "Brennerleistung", "Brandervermogen", "Värmepanna aktuell effekt", "aktualna moc źródła ciepła", "brennereffekt", "puissance du brûleur actuelle", "kazan güncel gücü", "potenza attuale bruciatore")
+MAKE_TRANSLATION(burnStarts, "burnstarts", "burner starts", "Brenner Starts", "Aantal brander starts", "Värmepanna antal starter", "liczba uruchomień palnika", "antall varmepumpe starter", "démarrages du brûleur", "kazan başlıyor", "avvii bruciatore")
+MAKE_TRANSLATION(burnWorkMin, "burnworkmin", "total burner operating time", "Brenner Laufzeit", "Totale branderlooptijd", "Värmepanna aktiva timmar", "łączny czas pracy palnika", "brennersteg tid i min", "durée de fonctionnement totale du brûleur", "toplam kazan çalışma süresi", "tempo totale di funzionamento del bruciatore")
+MAKE_TRANSLATION(burn2WorkMin, "burn2workmin", "burner stage 2 operating time", "Brenner Stufe 2 Laufzeit", "Totale looptijd brander fase 2", "Värmepanna steg 2 aktiva timmar", "łączny czas pracy palnika 2 stopnia", "brennersteg2 tid i min", "durée de fonctionnement totale du brûleur état 2", "2. seviye toplam kazan çalışma süresi", "tempo di funzionamento del bruciatore 2° stadio")
+MAKE_TRANSLATION(heatWorkMin, "heatworkmin", "total heat operating time", "Heizung Laufzeit", "Totale looptijd verwarming", "Uppvärmning aktiva timmar", "łączny czas grzania", "varmetid i min", "durée de fonctionnement du chauffage", "toplam ısıtma çalışma süresi", "tempo totale di funzionamento in riscaldamento")
+MAKE_TRANSLATION(heatStarts, "heatstarts", "burner starts heating", "Brenner Starts Heizung", "Aantal brander starts verwarming", "Uppvärmning antal starter", "liczba uruchomień palnika na ogrzewanie", "antall oppvarmninger", "démarrages du chauffage", "kazan ısıtmaya başlıyor", "preriscaldamento bruciatore") // TODO translate
+MAKE_TRANSLATION(UBAuptime, "ubauptime", "total UBA operating time", "Anlagen-Gesamtlaufzeit", "totale looptijd branderautomaat (UBA)", "Total Tid", "łączny czas pracy układu sterowania", "totaltid", "durée de fonctionnement totale de l'appareil (UBA)", "kazanın toplam işletme süresi", "Tempo di funzionamento totale del sistema")
+MAKE_TRANSLATION(lastCode, "lastcode", "last error code", "Letzter Fehler", "Laatste foutcode", "Senaste Felkod", "ostatni błąd", "siste feilkode", "dernier code d'erreur", "son hata kodu", "ultimo codice errore")
+MAKE_TRANSLATION(serviceCode, "servicecode", "service code", "Statusmeldung", "Statuscode", "Servicekod", "kod serwisowy", "servicekode", "code de service", "servis kodu", "codice messaggio di stato")
+MAKE_TRANSLATION(serviceCodeNumber, "servicecodenumber", "service code number", "Statusmeldungsnummer", "Status codenummer", "Servicekod", "numer kodu serwisowego", "servicekodenummer", "numéro du code de service", "servis kod numarası", "numero del messaggio di stato")
+MAKE_TRANSLATION(maintenanceMessage, "maintenancemessage", "maintenance message", "Wartungsmeldung", "Onderhoudsmelding", "Servicemeddelande", "komunikat przeglądu", "vedlikeholdsmelding", "message de maintenance", "bakım mesajı", "messaggio di manutenzione")
+MAKE_TRANSLATION(maintenanceDate, "maintenancedate", "next maintenance date", "Wartungsdatum", "Onderhoudsdatum", "Datum nästa Service", "termin następnego przeglądu", "vedlikeholdsdato", "prochaine date de maintenance", "bakım tarihi", "prossima data di manutenzione")
+MAKE_TRANSLATION(maintenanceType, "maintenance", "maintenance scheduled", "Wartungsplan", "Onderhoud gepland", "Underhall schemlagt", "rodzaj przeglądu", "vedlikeholdstype", "maintenance prévue", "planlı bakım", "manutenzione programmata")
+MAKE_TRANSLATION(maintenanceTime, "maintenancetime", "time to next maintenance", "Wartung in", "Onderhoud in", "Tid till nästa underhall", "czas do kolejnego przeglądu", "vedlikeholdstid", "durée avant la prochaine maintenance", "bakıma kalan süre", "tempo alla prossima manutenzione")
+MAKE_TRANSLATION(emergencyOps, "emergencyops", "emergency operation", "Notoperation", "Noodoperatie", "Nöddrift", "praca w trybie awaryjnym", "nøddrift", "opération d'urgence", "acil durum çalışması", "operazione di emergenza")
+MAKE_TRANSLATION(emergencyTemp, "emergencytemp", "emergency temperature", "Nottemperatur", "Noodtemperatuur", "Nöddrift temperatur", "temperatura w trybie awaryjnym", "nødtemperatur", "température d'urgence", "acil durum sıcaklığı", "temperatura di emergenza")
+MAKE_TRANSLATION(pumpMode, "pumpmode", "boiler pump mode", "Kesselpumpen Modus", "", "", "tryb pracy pompy kotła", "pumpemodus", "", "pompa modu", "modalità pompa caldaia") // TODO translate
// heatpump/compress specific
-MAKE_TRANSLATION(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "total driftstid", "durée totale de fonctionnement chauffage", "", "Tempo di funzionamento totale riscaldamento") // TODO translate
-MAKE_TRANSLATION(upTimeCompHeating, "uptimecompheating", "operating time compressor heating", "Betriebszeit Kompressor heizen", "Bedrijfstijd compressor verwarmingsbedrijf", "Total tid kompressor uppvärmning", "łączny czas ogrzewania (sprężarka)", "totaltid kompressor", "durée de fonctionnement compresseur chauffage", "", "tempo di funzionamento del compressore riscaldamento") // TODO translate
-MAKE_TRANSLATION(upTimeCompCooling, "uptimecompcooling", "operating time compressor cooling", "Betriebszeit Kompressor kühlen", "Bedrijfstijd compressor koelbedrijf", "Total tid kompressor kyla", "łączny czas chłodzenia (sprężarka)", "Total tid kompressor kjøling", "durée de fonctionnement compresseur refroidissement", "", "tempo di funzionamento del compressore raffreddamento")
-MAKE_TRANSLATION(upTimeCompWw, "uptimecompww", "operating time compressor dhw", "Betriebszeit Kompressor", "Bedrijfstijd compressor warmwaterbedrijf", "Total tid kompressor varmvatten", "łączny czas grzania c.w.u. (sprężarka)", "Total tid kompressor varmtvann", "durée de fonctionnement compresseur ecs", "", "tempo di funzionamento del compressore")
-MAKE_TRANSLATION(upTimeCompPool, "uptimecomppool", "operating time compressor pool", "Betriebszeit Kompressor Pool", "Bedrijfstijd compressor voor zwembadbedrijf", "Total tid kompressor pool", "łączny czas podgrzewania basenu (sprężarka)", "Total tid kompressor basseng", "durée de fonctionnement compresseur piscine", "", "tempo di funzionamento del compressore piscina")
-MAKE_TRANSLATION(totalCompStarts, "totalcompstarts", "total compressor control starts", "Kompressor Starts gesamt", "Totaal compressorstarts", "Kompressorstarter Totalt", "liczba załączeń sprężarki", "kompressorstarter totalt", "nombre démarrages total contrôle compresseur", "", "avvii totali del compressore")
-MAKE_TRANSLATION(heatingStarts, "heatingstarts", "heating control starts", "Heizen Starts", "Starts verwarmingsbedrijf", "Kompressorstarter Uppvärmning", "liczba załączeń ogrzewania", "kompressorstarter oppvarming", "démarrages contrôle chauffage", "", "avvii riscaldamento")
-MAKE_TRANSLATION(coolingStarts, "coolingstarts", "cooling control starts", "Kühlen Starts", "Starts koelbedrijf", "Kompressorstarter Kyla", "liczba załączeń chłodzenia", "kompressorstarter kjøling", "démarrages contrôle refroidissement", "", "avvii raffreddamento")
-MAKE_TRANSLATION(poolStarts, "poolstarts", "pool control starts", "Pool Starts", "Starts zwembadbedrijf", "Kompressorstarter Pool", "liczba załączeń podgrzewania basenu", "kompressorstarter basseng", "démarrages contrôle piscine", "", "avvio controllato piscina")
-MAKE_TRANSLATION(nrgConsTotal, "nrgconstotal", "total energy consumption", "Energieverbrauch gesamt", "Energieverbrauch gesamt", "Energiförbrukning totalt", "energia pobrana (sumarycznie)", "energiforbruk totalt", "consommation totale énergie", "", "totale energia consumata")
-MAKE_TRANSLATION(nrgConsCompTotal, "nrgconscomptotal", "total energy consumption compressor", "Energieverbrauch Kompressor gesamt", "Energieverbruik compressor totaal", "Energiförbrukning kompressor", "energia pobrana przez sprężarkę", "energiforbruk kompressor", "consommation totale énergie compresseur", "", "totale energia consumata compressore")
-MAKE_TRANSLATION(nrgConsCompHeating, "nrgconscompheating", "energy consumption compressor heating", "Energieverbrauch Kompressor heizen", "Energieverbruik compressor verwarmingsbedrijf", "Energiförbrukning uppvärmning", "energia pobrana przez sprężarkę na ogrzewanie", "energiforbruk oppvarming", "consommation énergie compresseur chauffage", "", "consumo energia compressore riscaldamento")
-MAKE_TRANSLATION(nrgConsCompWw, "nrgconscompww", "energy consumption compressor dhw", "Energieverbrauch Kompressor", "Energieverbruik compressor warmwaterbedrijf", "Energiförbrukning varmvatten", "energia pobrana przez sprężarkę na c.w.u.", "energiforbruk varmvann", "consommation énergie compresseur ecs", "", "consumo energia compressore ACS")
-MAKE_TRANSLATION(nrgConsCompCooling, "nrgconscompcooling", "energy consumption compressor cooling", "Energieverbrauch Kompressor kühlen", "Energieverbruik compressor koelbedrijf", "Energiförbrukning kyla", "energia pobrana przez sprężarkę na chłodzenie", "energiforbruk kjøling", "consommation énergie compresseur refroidissement", "", "consumo energia compressore raffreddamento")
-MAKE_TRANSLATION(nrgConsCompPool, "nrgconscomppool", "energy consumption compressor pool", "Energieverbrauch Kompressor Pool", "Energiebedrijf compressor zwembadbedrijf", "Energiförbrukning pool", "energia pobrana przez sprężarkę na podgrzewanie basenu", "energiforbruk basseng", "consommation énergie compresseur piscine", "", "consumo energia compressore piscina")
-MAKE_TRANSLATION(nrgSuppTotal, "nrgsupptotal", "total energy supplied", "gesamte Energieabgabe", "Totaal opgewekte energie", "Genererad energi", "energia oddana (sumarycznie)", "tilført energi", "énergie totale fournie", "", "totale energia fornita")
-MAKE_TRANSLATION(nrgSuppHeating, "nrgsuppheating", "total energy supplied heating", "gesamte Energieabgabe heizen", "Opgewekte energie verwarmingsbedrijf", "Genererad energi Uppvärmning", "energia oddana na ogrzewanie", "tilført energi oppvarming", "énergie totale fournie chauffage", "", "energia totale fornita - riscaldamento")
-MAKE_TRANSLATION(nrgSuppWw, "nrgsuppww", "total energy warm supplied dhw", "gesamte Energieabgabe", "Opgewekte energie warmwaterbedrijf", "Genererad energi Varmvatten", "energia oddana na c.w.u.", "tilført energi varmvann", "énergie chaude totale fournie ecs", "", "totale energia calorica fornita ACS")
-MAKE_TRANSLATION(nrgSuppCooling, "nrgsuppcooling", "total energy supplied cooling", "gesamte Energieabgabe kühlen", "Opgewekte energie koelbedrijf", "Genererad energi Kyla", "energia oddana na chłodzenie", "Tillført energi kjøling", "énergie totale fournie refroidissement", "", "energia totale fornita - raffreddamento")
-MAKE_TRANSLATION(nrgSuppPool, "nrgsupppool", "total energy supplied pool", "gesamte Energieabgabe Pool", "Opgewekte energie zwembadbedrijf", "Genererad energi Pool", "energia oddana na podgrzewanie basenu", "tilført energi basseng", "énergie totale fournie piscine", "", "totale di energia fornita- piscina")
-MAKE_TRANSLATION(auxElecHeatNrgConsTotal, "auxelecheatnrgconstotal", "total aux elec. heater energy consumption", "Energieverbrauch el. Zusatzheizung", "Totaal energieverbruik electrisch verwarmingselement", "Energiförbrukning Eltillkott", "energia pobrana przez grzałki", "energiforbruk varmekolbe", "consommation totale énergie electrique auxiliaire chauffage", "", "consumo energetico riscaldamento elettrico supplementare")
-MAKE_TRANSLATION(auxElecHeatNrgConsHeating, "auxelecheatnrgconsheating", "aux elec. heater energy consumption heating", "Energieverbrauch el. Zusatzheizung Heizen", "Energieverbruik electrisch verwarmingselement voor verwarmingsbedrijf", "Energiförbrukning Eltillskott Uppvärmning", "energia pobrana przez grzałki na ogrzewanie", "energiforbruk varmekolbe oppvarming", "consommation énergie electrique auxiliaire chauffage", "", "consumo di energia riscaldamento elettrico ausiliario")
-MAKE_TRANSLATION(auxElecHeatNrgConsWW, "auxelecheatnrgconsww", "aux elec. heater energy consumption dhw", "Energieverbrauch el. Zusatzheizung", "Energieverbruik electrisch verwarmingselement voor warmwaterbedrijf", "Energiförbrukning Eltillskott Varmvatten", "energia pobrana przez grzałki na c.w.u.", "energiförbruk varmekolbe varmvann", "consommation énergie electrique auxiliaire chauffage ecs", "", "consumo di energia riscaldamento elettrico ausiliario ACS")
-MAKE_TRANSLATION(auxElecHeatNrgConsPool, "auxelecheatnrgconspool", "aux elec. heater energy consumption pool", "Energieverbrauch el. Zusatzheizung Pool", "Energieverbruik electrisch verwarmingselement voor zwembadbedrijf", "Energiförbrukning Eltillskott Pool", "energia pobrana przez grzałki na podgrzewanie basenu", "energiforbruk el. tilleggsvarme basseng", "consommation énergie electrique auxiliaire chauffage piscine", "", "consumo di energia riscaldamento elettrico ausiliario piscina")
+MAKE_TRANSLATION(upTimeControl, "uptimecontrol", "total operating time heat", "Betriebszeit Heizen gesamt", "Totale bedrijfstijd", "Total tid uppvärmning", "łączny czas generowania ciepła", "total driftstid", "durée totale de fonctionnement chauffage", "ısınma toplam işletme süresi", "Tempo di funzionamento totale riscaldamento") // TODO translate
+MAKE_TRANSLATION(upTimeCompHeating, "uptimecompheating", "operating time compressor heating", "Betriebszeit Kompressor heizen", "Bedrijfstijd compressor verwarmingsbedrijf", "Total tid kompressor uppvärmning", "łączny czas ogrzewania (sprężarka)", "totaltid kompressor", "durée de fonctionnement compresseur chauffage", "ısı pompası ısınma işletme süresi", "tempo di funzionamento del compressore riscaldamento") // TODO translate
+MAKE_TRANSLATION(upTimeCompCooling, "uptimecompcooling", "operating time compressor cooling", "Betriebszeit Kompressor kühlen", "Bedrijfstijd compressor koelbedrijf", "Total tid kompressor kyla", "łączny czas chłodzenia (sprężarka)", "Total tid kompressor kjøling", "durée de fonctionnement compresseur refroidissement", "ısı pompası soğuma işletme süresi", "tempo di funzionamento del compressore raffreddamento")
+MAKE_TRANSLATION(upTimeCompWw, "uptimecompww", "operating time compressor dhw", "Betriebszeit Kompressor", "Bedrijfstijd compressor warmwaterbedrijf", "Total tid kompressor varmvatten", "łączny czas grzania c.w.u. (sprężarka)", "Total tid kompressor varmtvann", "durée de fonctionnement compresseur ecs", "ısı pompası sıcak kullanım suyu işletme süresi", "tempo di funzionamento del compressore")
+MAKE_TRANSLATION(upTimeCompPool, "uptimecomppool", "operating time compressor pool", "Betriebszeit Kompressor Pool", "Bedrijfstijd compressor voor zwembadbedrijf", "Total tid kompressor pool", "łączny czas podgrzewania basenu (sprężarka)", "Total tid kompressor basseng", "durée de fonctionnement compresseur piscine", "ısı pompası havuz işletme süresi", "tempo di funzionamento del compressore piscina")
+MAKE_TRANSLATION(totalCompStarts, "totalcompstarts", "total compressor control starts", "Kompressor Starts gesamt", "Totaal compressorstarts", "Kompressorstarter Totalt", "liczba załączeń sprężarki", "kompressorstarter totalt", "nombre démarrages total contrôle compresseur", "ısı pompası kontrolü toplam başlatma", "avvii totali del compressore")
+MAKE_TRANSLATION(heatingStarts, "heatingstarts", "heating control starts", "Heizen Starts", "Starts verwarmingsbedrijf", "Kompressorstarter Uppvärmning", "liczba załączeń ogrzewania", "kompressorstarter oppvarming", "démarrages contrôle chauffage", "ısıtma kontrolü toplam başlatma", "avvii riscaldamento")
+MAKE_TRANSLATION(coolingStarts, "coolingstarts", "cooling control starts", "Kühlen Starts", "Starts koelbedrijf", "Kompressorstarter Kyla", "liczba załączeń chłodzenia", "kompressorstarter kjøling", "démarrages contrôle refroidissement", "soğutma kontrolü toplam başlatma", "avvii raffreddamento")
+MAKE_TRANSLATION(poolStarts, "poolstarts", "pool control starts", "Pool Starts", "Starts zwembadbedrijf", "Kompressorstarter Pool", "liczba załączeń podgrzewania basenu", "kompressorstarter basseng", "démarrages contrôle piscine", "havuz kontrolü toplam başlatma", "avvio controllato piscina")
+MAKE_TRANSLATION(nrgConsTotal, "nrgconstotal", "total energy consumption", "Energieverbrauch gesamt", "Energieverbrauch gesamt", "Energiförbrukning totalt", "energia pobrana (sumarycznie)", "energiforbruk totalt", "consommation totale énergie", "toplam enerji tüketimi", "totale energia consumata")
+MAKE_TRANSLATION(nrgConsCompTotal, "nrgconscomptotal", "total energy consumption compressor", "Energieverbrauch Kompressor gesamt", "Energieverbruik compressor totaal", "Energiförbrukning kompressor", "energia pobrana przez sprężarkę", "energiforbruk kompressor", "consommation totale énergie compresseur", "ısı pompası toplam enerji tüketimi", "totale energia consumata compressore")
+MAKE_TRANSLATION(nrgConsCompHeating, "nrgconscompheating", "energy consumption compressor heating", "Energieverbrauch Kompressor heizen", "Energieverbruik compressor verwarmingsbedrijf", "Energiförbrukning uppvärmning", "energia pobrana przez sprężarkę na ogrzewanie", "energiforbruk oppvarming", "consommation énergie compresseur chauffage", "ısı pompası ısıtma toplam enerji tüketimi", "consumo energia compressore riscaldamento")
+MAKE_TRANSLATION(nrgConsCompWw, "nrgconscompww", "energy consumption compressor dhw", "Energieverbrauch Kompressor", "Energieverbruik compressor warmwaterbedrijf", "Energiförbrukning varmvatten", "energia pobrana przez sprężarkę na c.w.u.", "energiforbruk varmvann", "consommation énergie compresseur ecs", "ısı pompası sıcak kullanım suyu toplam enerji tüketimi", "consumo energia compressore ACS")
+MAKE_TRANSLATION(nrgConsCompCooling, "nrgconscompcooling", "energy consumption compressor cooling", "Energieverbrauch Kompressor kühlen", "Energieverbruik compressor koelbedrijf", "Energiförbrukning kyla", "energia pobrana przez sprężarkę na chłodzenie", "energiforbruk kjøling", "consommation énergie compresseur refroidissement", "ısı pompası soğutma toplam enerji tüketimi", "consumo energia compressore raffreddamento")
+MAKE_TRANSLATION(nrgConsCompPool, "nrgconscomppool", "energy consumption compressor pool", "Energieverbrauch Kompressor Pool", "Energiebedrijf compressor zwembadbedrijf", "Energiförbrukning pool", "energia pobrana przez sprężarkę na podgrzewanie basenu", "energiforbruk basseng", "consommation énergie compresseur piscine", "ısı pompası havuz toplam enerji tüketimi", "consumo energia compressore piscina")
+MAKE_TRANSLATION(nrgSuppTotal, "nrgsupptotal", "total energy supplied", "gesamte Energieabgabe", "Totaal opgewekte energie", "Genererad energi", "energia oddana (sumarycznie)", "tilført energi", "énergie totale fournie", "sağlanan toplam enerji", "totale energia fornita")
+MAKE_TRANSLATION(nrgSuppHeating, "nrgsuppheating", "total energy supplied heating", "gesamte Energieabgabe heizen", "Opgewekte energie verwarmingsbedrijf", "Genererad energi Uppvärmning", "energia oddana na ogrzewanie", "tilført energi oppvarming", "énergie totale fournie chauffage", "ısıtma sağlanan toplam enerji", "energia totale fornita - riscaldamento")
+MAKE_TRANSLATION(nrgSuppWw, "nrgsuppww", "total energy warm supplied dhw", "gesamte Energieabgabe", "Opgewekte energie warmwaterbedrijf", "Genererad energi Varmvatten", "energia oddana na c.w.u.", "tilført energi varmvann", "énergie chaude totale fournie ecs", "sıcak kullanım suyu sağlanan toplam enerji", "totale energia calorica fornita ACS")
+MAKE_TRANSLATION(nrgSuppCooling, "nrgsuppcooling", "total energy supplied cooling", "gesamte Energieabgabe kühlen", "Opgewekte energie koelbedrijf", "Genererad energi Kyla", "energia oddana na chłodzenie", "Tillført energi kjøling", "énergie totale fournie refroidissement", "soğutma sağlanan toplam enerji", "energia totale fornita - raffreddamento")
+MAKE_TRANSLATION(nrgSuppPool, "nrgsupppool", "total energy supplied pool", "gesamte Energieabgabe Pool", "Opgewekte energie zwembadbedrijf", "Genererad energi Pool", "energia oddana na podgrzewanie basenu", "tilført energi basseng", "énergie totale fournie piscine", "havuz sağlanan toplam enerji", "totale di energia fornita- piscina")
+MAKE_TRANSLATION(auxElecHeatNrgConsTotal, "auxelecheatnrgconstotal", "total aux elec. heater energy consumption", "Energieverbrauch el. Zusatzheizung", "Totaal energieverbruik electrisch verwarmingselement", "Energiförbrukning Eltillkott", "energia pobrana przez grzałki", "energiforbruk varmekolbe", "consommation totale énergie electrique auxiliaire chauffage", "ilave elektrikli ısıtıcı toplam enerji tüketimi", "consumo energetico riscaldamento elettrico supplementare")
+MAKE_TRANSLATION(auxElecHeatNrgConsHeating, "auxelecheatnrgconsheating", "aux elec. heater energy consumption heating", "Energieverbrauch el. Zusatzheizung Heizen", "Energieverbruik electrisch verwarmingselement voor verwarmingsbedrijf", "Energiförbrukning Eltillskott Uppvärmning", "energia pobrana przez grzałki na ogrzewanie", "energiforbruk varmekolbe oppvarming", "consommation énergie electrique auxiliaire chauffage", "ilave elektrikli ısıtıcı ısınma toplam enerji tüketimi", "consumo di energia riscaldamento elettrico ausiliario")
+MAKE_TRANSLATION(auxElecHeatNrgConsWW, "auxelecheatnrgconsww", "aux elec. heater energy consumption dhw", "Energieverbrauch el. Zusatzheizung", "Energieverbruik electrisch verwarmingselement voor warmwaterbedrijf", "Energiförbrukning Eltillskott Varmvatten", "energia pobrana przez grzałki na c.w.u.", "energiförbruk varmekolbe varmvann", "consommation énergie electrique auxiliaire chauffage ecs", "ilave elektrikli ısıtıcı sıcak kullanım suyu toplam enerji tüketimi", "consumo di energia riscaldamento elettrico ausiliario ACS")
+MAKE_TRANSLATION(auxElecHeatNrgConsPool, "auxelecheatnrgconspool", "aux elec. heater energy consumption pool", "Energieverbrauch el. Zusatzheizung Pool", "Energieverbruik electrisch verwarmingselement voor zwembadbedrijf", "Energiförbrukning Eltillskott Pool", "energia pobrana przez grzałki na podgrzewanie basenu", "energiforbruk el. tilleggsvarme basseng", "consommation énergie electrique auxiliaire chauffage piscine", "ilave elektrikli ısıtıcı havuz toplam enerji tüketimi", "consumo di energia riscaldamento elettrico ausiliario piscina")
-MAKE_TRANSLATION(hpCompOn, "hpcompon", "hp compressor", "WP Kompressor", "WP compressor", "VP Kompressor", "sprężarka pompy ciepła", "vp kompressor", "compresseur pompe à chaleur", "", "compressore pompa calore")
-MAKE_TRANSLATION(hpHeatingOn, "hpheatingon", "hp heating", "WP Heizen", "WP verwarmingsbedrijf", "VP Uppvärmning", "pompa ciepła, ogrzewanie", "vp oppvarmning", "chauffe pompe à chaleur", "riscaldamento pompa calore")
-MAKE_TRANSLATION(hpCoolingOn, "hpcoolingon", "hp cooling", "WP Kühlen", "WP koelbedrijf", "VP Kyla", "pompa ciepła, chłodzenie", "vp kjøling", "refroidissement pompe à chaleur", "raffreddamento pompa calore")
-MAKE_TRANSLATION(hpWwOn, "hpwwon", "hp dhw", "WP Warmwasser", "WP warmwaterbedrijf", "VP Varmvatten", "pompa ciepła, c.w.u.", "vp varmvatten", "eau chaude pompe à chaleur", "acqua calda pompa calore")
-MAKE_TRANSLATION(hpPoolOn, "hppoolon", "hp pool", "WP Pool", "WP zwembadbedrijf", "VP Pool", "pompa ciepła, podgrzewanie basenu", "vp basseng", "pompe à chaleur piscine", "pompa calore piscina")
-MAKE_TRANSLATION(hpBrinePumpSpd, "hpbrinepumpspd", "brine pump speed", "Solepumpen-Geschw.", "Snelheid pekelpomp", "Hastighet Brine-pump", "wysterowanie pompy glikolu", "hastighet brine-pumpe", "vitesse pompe à saumure", "", "velocità pompa sbrinamento")
-MAKE_TRANSLATION(hpCompSpd, "hpcompspd", "compressor speed", "Kompressor-Geschw.", "Snelheid compressor", "Kompressorhastighet", "wysterowanie sprężarki", "kompressorhastighet", "vitesse du compresseur", "", "velocità compressore")
-MAKE_TRANSLATION(hpCircSpd, "hpcircspd", "circulation pump speed", "Zirkulationspumpen-Geschw.", "Snelheid circulatiepomp", "Hastighet Cirkulationspump", "wysterowanie pompy obiegu grzewczego", "hastighet sirkulationspumpe", "vitesse pompe à circulation", "", "velocità pompa circolazione")
-MAKE_TRANSLATION(hpBrineIn, "hpbrinein", "brine in/evaporator", "Sole in/Verdampfer", "pekel in/verdamper", "Brine in (förangare)", "temperatura glikolu na wejściu kolektora (TB0)", "brine in/fordamper", "entrée saumure/évaporateur", "", "salamoia nell evaporatore")
-MAKE_TRANSLATION(hpBrineOut, "hpbrineout", "brine out/condenser", "Sole aus/Kondensator", "pekel uit/condensor", "Brine ut (kondensor)", "temperatura glikolu na wyjściu kolektora (TB1)", "Brine ut/kondensor", "sortie saumure/condenseur", "", "salamoia nell uscita evaporatore")
-MAKE_TRANSLATION(hpSwitchValve, "hpswitchvalve", "switch valve", "Schaltventil", "schakelklep", "Växelventil", "zawór przełączający", "skifteventil", "valve de commutation", "", "valvola commutazione pompa di calore")
-MAKE_TRANSLATION(hpActivity, "hpactivity", "compressor activity", "Kompressoraktivität", "Compressoractiviteit", "Kompressoraktivitet", "pompa ciepła, aktywność sprężarki", "kompressoraktivitet", "activité du compresseur", "attività compressore") // TODO translate
+MAKE_TRANSLATION(hpCompOn, "hpcompon", "hp compressor", "WP Kompressor", "WP compressor", "VP Kompressor", "sprężarka pompy ciepła", "vp kompressor", "compresseur pompe à chaleur", "hp ısı pompası", "compressore pompa calore")
+MAKE_TRANSLATION(hpHeatingOn, "hpheatingon", "hp heating", "WP Heizen", "WP verwarmingsbedrijf", "VP Uppvärmning", "pompa ciepła, ogrzewanie", "vp oppvarmning", "hp ısınıyor", "riscaldamento pompa calore")
+MAKE_TRANSLATION(hpCoolingOn, "hpcoolingon", "hp cooling", "WP Kühlen", "WP koelbedrijf", "VP Kyla", "pompa ciepła, chłodzenie", "vp kjøling", "hp soğuyor", "raffreddamento pompa calore")
+MAKE_TRANSLATION(coolingOn, "coolingon", "cooling", "Kühlen", "koelbedrijf", "Kyla", "chłodzenie", "kjøling", "refroidissement", "hp sıcak kullanım suyu")
+MAKE_TRANSLATION(hpWwOn, "hpwwon", "hp dhw", "WP Warmwasser", "WP warmwaterbedrijf", "VP Varmvatten", "pompa ciepła, c.w.u.", "vp varmvatten", "hp havuz", "acqua calda pompa calore")
+MAKE_TRANSLATION(hpPoolOn, "hppoolon", "hp pool", "WP Pool", "WP zwembadbedrijf", "VP Pool", "pompa ciepła, podgrzewanie basenu", "vp basseng", "tuzlu su pompası hızı", "pompa calore piscina")
+MAKE_TRANSLATION(hpBrinePumpSpd, "hpbrinepumpspd", "brine pump speed", "Solepumpen-Geschw.", "Snelheid pekelpomp", "Hastighet Brine-pump", "wysterowanie pompy glikolu", "hastighet brine-pumpe", "vitesse pompe à saumure", "ısı pompası hızı", "velocità pompa sbrinamento")
+MAKE_TRANSLATION(hpCompSpd, "hpcompspd", "compressor speed", "Kompressor-Geschw.", "Snelheid compressor", "Kompressorhastighet", "wysterowanie sprężarki", "kompressorhastighet", "vitesse du compresseur", "sirkülasyon pompası hızı", "velocità compressore")
+MAKE_TRANSLATION(hpCircSpd, "hpcircspd", "circulation pump speed", "Zirkulationspumpen-Geschw.", "Snelheid circulatiepomp", "Hastighet Cirkulationspump", "wysterowanie pompy obiegu grzewczego", "hastighet sirkulationspumpe", "vitesse pompe à circulation", "evaporatör tuzlu su giişi", "velocità pompa circolazione")
+MAKE_TRANSLATION(hpBrineIn, "hpbrinein", "brine in/evaporator", "Sole in/Verdampfer", "pekel in/verdamper", "Brine in (förangare)", "temperatura glikolu na wejściu kolektora (TB0)", "brine in/fordamper", "entrée saumure/évaporateur", "kondenser tuzlu su çıkışı", "salamoia nell evaporatore")
+MAKE_TRANSLATION(hpBrineOut, "hpbrineout", "brine out/condenser", "Sole aus/Kondensator", "pekel uit/condensor", "Brine ut (kondensor)", "temperatura glikolu na wyjściu kolektora (TB1)", "Brine ut/kondensor", "sortie saumure/condenseur", "anahtar valfi", "salamoia nell uscita evaporatore")
+MAKE_TRANSLATION(hpSwitchValve, "hpswitchvalve", "switch valve", "Schaltventil", "schakelklep", "Växelventil", "zawór przełączający", "skifteventil", "valve de commutation", "ısı pompası aktivitesi", "valvola commutazione pompa di calore")
+MAKE_TRANSLATION(hpActivity, "hpactivity", "compressor activity", "Kompressoraktivität", "Compressoractiviteit", "Kompressoraktivitet", "pompa ciepła, aktywność sprężarki", "kompressoraktivitet", "hp ısı pompası", "attività compressore") // TODO translate
-MAKE_TRANSLATION(hpPower, "hppower", "compressor power output", "Kompressorleistung", "Compressorvermogen", "Kompressoreffekt", "moc wyjściowa sprężarki", "kompressoreffekt", "puissance de sortie compresseur", "", "potenza uscita compressore")
-MAKE_TRANSLATION(hpTc0, "hptc0", "heat carrier return (TC0)", "Kältemittel Rücklauf (TC0)", "Koudemiddel retour (TC0)", "Värmebärare Retur (TC0)", "temperatura nośnika ciepła na powrocie (TC0)", "kjølemiddel retur (TC0)", "retour caloporteur (TC0)", "", "ritorno del refrigerante (TC0)")
-MAKE_TRANSLATION(hpTc1, "hptc1", "heat carrier forward (TC1)", "Kältemittel Vorlauf (TC1)", "Koudemiddel aanvoer (TC1)", "Värmebärare Framledning (TC1)", "temperatura nośnika ciepła pierwotna (TC1)", "kjølemiddel tur (TC1)", "avance caloporteur (TC1)", "", "flusso di refrigerante (TC1)")
-MAKE_TRANSLATION(hpTc3, "hptc3", "condenser temperature (TC3)", "Verflüssigertemperatur (TC3)", "Condensortemperatuur (TC3)", "Kondensortemperatur (TC3)", "temperatura skraplacza/na wyjściu sprężarki (TC3)", "kondensortemperatur (TC3)", "température condensateur (TC3)", "", "temperatura condensatore (TC3)")
-MAKE_TRANSLATION(hpTr1, "hptr1", "compressor temperature (TR1)", "Kompessortemperatur (TR1)", "Compressor temperatuur (TR1)", "Kompressor temp (TR1)", "temperatura sprężarki (TR1)", "kompressor temperatur (TR1)", "température compresseur (TR1)", "", "temperatura compressore (TR1)")
-MAKE_TRANSLATION(hpTr3, "hptr3", "refrigerant temperature liquid side (condenser output) (TR3)", "Kältemittel (flüssig) (TR3)", "Temperatuur koudemiddel vloeibare zijde (TR3)", "Köldmedium temperatur (kondensorutlopp) (TR3)", "temperatura skraplacza ogrzew. (TR3)", "kjølemiddeltemperatur på væskesiden (TR3)", "température réfrigérant côté liquide (sortie condensateur) (TR3)", "", "temperatura refrigerante lato liquido (uscita condensatore) (TR3)")
-MAKE_TRANSLATION(hpTr4, "hptr4", "evaporator inlet temperature (TR4)", "Verdampfer Eingang (TR4)", "Verdamper ingangstemperatuur (TR4)", "Förångare inloppstemp (TR4)", "temperatura na wejściu parownika (TR4)", "innløpstemperatur for fordamperen (TR4)", "température entrée évaporateur (TR4)", "", "temperatura di ingresso dell'evaporatore (TR4)")
-MAKE_TRANSLATION(hpTr5, "hptr5", "compressor inlet temperature (TR5)", "Kompessoreingang (TR5)", "Compressor ingangstemperatuur (TR5)", "Kompressor inloppstemp (TR5)", "temperatura na wejściu sprężarki (TR5)", "kompressor innløpstemp (TR5)", "température entrée compresseur (TR5)", "", "temperatura di ingresso del compressore (TR5)")
-MAKE_TRANSLATION(hpTr6, "hptr6", "compressor outlet temperature (TR6)", "Kompressorausgang (TR6)", "Compressor uitgangstemperatuur (TR6)", "Kompressor utloppstemp (TR6)", "temperatura na wyjściu sprężarki (TR6)", "kompressor utløpstemp (TR6)", "température sortie compresseur (TR6)", "", "temperatura di uscita del compressore (TR6)")
-MAKE_TRANSLATION(hpTr7, "hptr7", "refrigerant temperature gas side (condenser input) (TR7)", "Kältemittel (gasförmig) (TR7)", "Temperatuur koudemiddel gasvormig (TR7)", "Köldmedium temperatur gassida (kondensorinlopp) (TR7)", "temperatura czynnika chłodniczego po stronie gazu (wejście skraplacza) (TR7)", "kjølemedium temperatur gassida (kondensatorinløp) (TR7)", "température réfrigérant côté gaz (sortie condensateur) (TR7)", "", "temperatura refrigerante lato gas (ingresso condensatore) (TR7)")
-MAKE_TRANSLATION(hpTl2, "hptl2", "air inlet temperature (TL2)", "Außenluft-Einlasstemperatur (TL2)", "Temperatuur luchtinlaat (TL2)", "Luftintagstemperatur (TL2)", "temperatura wlotu powietrza (TL2)", "luftinntakstemperatur (TL2)", "température entrée air (TL2)", "", "temperatura ingresso aria (TL2)")
-MAKE_TRANSLATION(hpPl1, "hppl1", "low pressure side temperature (PL1)", "Niederdruckfühler (PL1)", "Temperatuur lage drukzijde (PL1)", "Temperatur Lågtryckssidan (PL1)", "temperatura po stronie niskiego ciśnienia (PL1)", "temperatur lavtrykksiden (PL1)", "température côté basse pression (PL1)", "", "temperatura lato bassa pressione (PL1)")
-MAKE_TRANSLATION(hpPh1, "hpph1", "high pressure side temperature (PH1)", "Hochdruckfühler (PH1)", "Temperatuur hoge drukzijde (PH1)", "Temperatur Högtryckssidan (PH1)", "temperatura po stronie wysokiego ciśnienia (PH1)", "Temperatur Høytrykksiden (PH1)", "température côté bhauteasse pression (PH1)", "", "temperatura lato alta pressione (PH1)")
-MAKE_TRANSLATION(hpTa4, "hpta4", "drain pan temp (TA4)", "Kondensatorwanne (TA4)", "", "", "temperatura ociekacza (TA4)", "kondens temperatur", "", "", "temperatura condensatore (TA4)") // TODO translate
+MAKE_TRANSLATION(hpPower, "hppower", "compressor power output", "Kompressorleistung", "Compressorvermogen", "Kompressoreffekt", "moc wyjściowa sprężarki", "kompressoreffekt", "puissance de sortie compresseur", "ısı pompası güç çıkışı", "potenza uscita compressore")
+MAKE_TRANSLATION(hpTc0, "hptc0", "heat carrier return (TC0)", "Kältemittel Rücklauf (TC0)", "Koudemiddel retour (TC0)", "Värmebärare Retur (TC0)", "temperatura nośnika ciepła na powrocie (TC0)", "kjølemiddel retur (TC0)", "retour caloporteur (TC0)", "sıcak su dönüşü (TC0)", "ritorno del refrigerante (TC0)")
+MAKE_TRANSLATION(hpTc1, "hptc1", "heat carrier forward (TC1)", "Kältemittel Vorlauf (TC1)", "Koudemiddel aanvoer (TC1)", "Värmebärare Framledning (TC1)", "temperatura nośnika ciepła pierwotna (TC1)", "kjølemiddel tur (TC1)", "avance caloporteur (TC1)", "sıcak su çıkışı (TC1)", "flusso di refrigerante (TC1)")
+MAKE_TRANSLATION(hpTc3, "hptc3", "condenser temperature (TC3)", "Verflüssigertemperatur (TC3)", "Condensortemperatuur (TC3)", "Kondensortemperatur (TC3)", "temperatura skraplacza/na wyjściu sprężarki (TC3)", "kondensortemperatur (TC3)", "température condensateur (TC3)", "kondenser sıcaklığı (TC3)", "temperatura condensatore (TC3)")
+MAKE_TRANSLATION(hpTr1, "hptr1", "compressor temperature (TR1)", "Kompessortemperatur (TR1)", "Compressor temperatuur (TR1)", "Kompressor temp (TR1)", "temperatura sprężarki (TR1)", "kompressor temperatur (TR1)", "température compresseur (TR1)", "ısı pompası sıcaklığı (TR1)", "temperatura compressore (TR1)")
+MAKE_TRANSLATION(hpTr3, "hptr3", "refrigerant temperature liquid side (condenser output) (TR3)", "Kältemittel (flüssig) (TR3)", "Temperatuur koudemiddel vloeibare zijde (TR3)", "Köldmedium temperatur (kondensorutlopp) (TR3)", "temperatura skraplacza ogrzew. (TR3)", "kjølemiddeltemperatur på væskesiden (TR3)", "température réfrigérant côté liquide (sortie condensateur) (TR3)", "ısı pompası çıkışı (TR3)", "temperatura refrigerante lato liquido (uscita condensatore) (TR3)")
+MAKE_TRANSLATION(hpTr4, "hptr4", "evaporator inlet temperature (TR4)", "Verdampfer Eingang (TR4)", "Verdamper ingangstemperatuur (TR4)", "Förångare inloppstemp (TR4)", "temperatura na wejściu parownika (TR4)", "innløpstemperatur for fordamperen (TR4)", "température entrée évaporateur (TR4)", "evaporatör giriş sıcaklığı (TR4)", "temperatura di ingresso dell'evaporatore (TR4)")
+MAKE_TRANSLATION(hpTr5, "hptr5", "compressor inlet temperature (TR5)", "Kompessoreingang (TR5)", "Compressor ingangstemperatuur (TR5)", "Kompressor inloppstemp (TR5)", "temperatura na wejściu sprężarki (TR5)", "kompressor innløpstemp (TR5)", "température entrée compresseur (TR5)", "ısı pompası giriş sıcaklığı (TR5)", "temperatura di ingresso del compressore (TR5)")
+MAKE_TRANSLATION(hpTr6, "hptr6", "compressor outlet temperature (TR6)", "Kompressorausgang (TR6)", "Compressor uitgangstemperatuur (TR6)", "Kompressor utloppstemp (TR6)", "temperatura na wyjściu sprężarki (TR6)", "kompressor utløpstemp (TR6)", "température sortie compresseur (TR6)", "ısı pompası çıkış sıcaklığı (TR6)", "temperatura di uscita del compressore (TR6)")
+MAKE_TRANSLATION(hpTr7, "hptr7", "refrigerant temperature gas side (condenser input) (TR7)", "Kältemittel (gasförmig) (TR7)", "Temperatuur koudemiddel gasvormig (TR7)", "Köldmedium temperatur gassida (kondensorinlopp) (TR7)", "temperatura czynnika chłodniczego po stronie gazu (wejście skraplacza) (TR7)", "kjølemedium temperatur gassida (kondensatorinløp) (TR7)", "température réfrigérant côté gaz (sortie condensateur) (TR7)", "kondenser giriş sıcaklığı (TR7)", "temperatura refrigerante lato gas (ingresso condensatore) (TR7)")
+MAKE_TRANSLATION(hpTl2, "hptl2", "air inlet temperature (TL2)", "Außenluft-Einlasstemperatur (TL2)", "Temperatuur luchtinlaat (TL2)", "Luftintagstemperatur (TL2)", "temperatura wlotu powietrza (TL2)", "luftinntakstemperatur (TL2)", "température entrée air (TL2)", "hava giriş sıcaklığı (TL2)", "temperatura ingresso aria (TL2)")
+MAKE_TRANSLATION(hpPl1, "hppl1", "low pressure side temperature (PL1)", "Niederdruckfühler (PL1)", "Temperatuur lage drukzijde (PL1)", "Temperatur Lågtryckssidan (PL1)", "temperatura po stronie niskiego ciśnienia (PL1)", "temperatur lavtrykksiden (PL1)", "température côté basse pression (PL1)", "düşük basınç tarafı sıcaklığı (PL1)", "temperatura lato bassa pressione (PL1)")
+MAKE_TRANSLATION(hpPh1, "hpph1", "high pressure side temperature (PH1)", "Hochdruckfühler (PH1)", "Temperatuur hoge drukzijde (PH1)", "Temperatur Högtryckssidan (PH1)", "temperatura po stronie wysokiego ciśnienia (PH1)", "Temperatur Høytrykksiden (PH1)", "température côté bhauteasse pression (PH1)", "yüksek basınç tarafı sıcaklığı (PH1)", "temperatura lato alta pressione (PH1)")
+MAKE_TRANSLATION(hpTa4, "hpta4", "drain pan temp (TA4)", "Kondensatorwanne (TA4)", "", "", "temperatura ociekacza (TA4)", "kondens temperatur", "", "tahliye sıcaklığı (TA4)", "temperatura condensatore (TA4)") // TODO translate
-MAKE_TRANSLATION(hpInput1, "hpin1", "input 1 state", "Eingang 1 Status", "Status input 1", "Status Ingång 1", "stan wejścia 1", "status inggang 1", "état entrée 1", "", "stato ingresso 1")
-MAKE_TRANSLATION(hpInput2, "hpin2", "input 2 state", "Eingang 2 Status", "Status input 2", "Status Ingång 2", "stan wejścia 2", "status inggang 2", "état entrée 2", "", "stato ingresso 2")
-MAKE_TRANSLATION(hpInput3, "hpin3", "input 3 state", "Eingang 3 Status", "Status input 3", "Status Ingång 3", "stan wejścia 3", "status inggang 3", "état entrée 3", "", "stato ingresso 3")
-MAKE_TRANSLATION(hpInput4, "hpin4", "input 4 state", "Eingang 4 Status", "Status input 4", "Status Ingång 4", "stan wejścia 4", "status inggang 4", "état entrée 4", "", "stato ingresso 4")
-MAKE_TRANSLATION(hpIn1Opt, "hpin1opt", "input 1 options", "Eingang 1 Einstellung", "Instelling input 1", "Inställningar Ingång 1", "opcje wejścia 1", "innstillinger inngang 1", "options entrée 1", "", "impostazioni ingresso 1")
-MAKE_TRANSLATION(hpIn2Opt, "hpin2opt", "input 2 options", "Eingang 2 Einstellung", "Instelling input 2", "Inställningar Ingång 2", "opcje wejścia 2", "innstillinger inngang 2", "options entrée 2", "", "impostazioni ingresso 2")
-MAKE_TRANSLATION(hpIn3Opt, "hpin3opt", "input 3 options", "Eingang 3 Einstellung", "Instelling input 3", "Inställningar Ingång 3", "opcje wejścia 3", "innstillinger inngang 3", "options entrée 3", "", "impostazioni ingresso 3")
-MAKE_TRANSLATION(hpIn4Opt, "hpin4opt", "input 4 options", "Eingang 4 Einstellung", "Instelling input 4", "Inställningar Ingång 4", "opcje wejścia 4", "innstillinger inngang 4", "options entrée 4", "", "impostazioni ingresso 4")
-MAKE_TRANSLATION(maxHeatComp, "maxheatcomp", "heat limit compressor", "Heizgrenze Kompressor", "heat limit compressor", "heat limit compressor", "ograniczenie mocy sprężarki", "max varmegrense kompressor", "limite chaleur compresseur", "", "limite riscaldamento compressore")
-MAKE_TRANSLATION(maxHeatHeat, "maxheatheat", "heat limit heating", "Heizgrenze Heizen", "heat limit heating", "heat limit heating", "ograniczenie mocy w trybie ogrzewania", "maks varmegrense oppvarming", "limite chaleur chauffage", "", "limite calore riscaldamento")
-MAKE_TRANSLATION(maxHeatDhw, "maxheatdhw", "heat limit dhw", "Heizgrenze Warmwasser", "heat limit dhw", "heat limit dhw", "ograniczenie mocy w trybie c.w.u.", "varmegrense varmtvann", "limite chaleur ecs", "", "limite calore ACS")
+MAKE_TRANSLATION(hpInput1, "hpin1", "input 1 state", "Eingang 1 Status", "Status input 1", "Status Ingång 1", "stan wejścia 1", "status inggang 1", "état entrée 1", "giriş 1 durumu", "stato ingresso 1")
+MAKE_TRANSLATION(hpInput2, "hpin2", "input 2 state", "Eingang 2 Status", "Status input 2", "Status Ingång 2", "stan wejścia 2", "status inggang 2", "état entrée 2", "giriş 2 durumu", "stato ingresso 2")
+MAKE_TRANSLATION(hpInput3, "hpin3", "input 3 state", "Eingang 3 Status", "Status input 3", "Status Ingång 3", "stan wejścia 3", "status inggang 3", "état entrée 3", "giriş 3 durumu", "stato ingresso 3")
+MAKE_TRANSLATION(hpInput4, "hpin4", "input 4 state", "Eingang 4 Status", "Status input 4", "Status Ingång 4", "stan wejścia 4", "status inggang 4", "état entrée 4", "giriş 4 durumu", "stato ingresso 4")
+MAKE_TRANSLATION(hpIn1Opt, "hpin1opt", "input 1 options", "Eingang 1 Einstellung", "Instelling input 1", "Inställningar Ingång 1", "opcje wejścia 1", "innstillinger inngang 1", "options entrée 1", "giriş 1 seçenekleri", "impostazioni ingresso 1")
+MAKE_TRANSLATION(hpIn2Opt, "hpin2opt", "input 2 options", "Eingang 2 Einstellung", "Instelling input 2", "Inställningar Ingång 2", "opcje wejścia 2", "innstillinger inngang 2", "options entrée 2", "giriş 2 seçenekleri", "impostazioni ingresso 2")
+MAKE_TRANSLATION(hpIn3Opt, "hpin3opt", "input 3 options", "Eingang 3 Einstellung", "Instelling input 3", "Inställningar Ingång 3", "opcje wejścia 3", "innstillinger inngang 3", "options entrée 3", "giriş 3 seçenekleri", "impostazioni ingresso 3")
+MAKE_TRANSLATION(hpIn4Opt, "hpin4opt", "input 4 options", "Eingang 4 Einstellung", "Instelling input 4", "Inställningar Ingång 4", "opcje wejścia 4", "innstillinger inngang 4", "options entrée 4", "giriş 4 seçenekleri", "impostazioni ingresso 4")
+MAKE_TRANSLATION(maxHeatComp, "maxheatcomp", "heat limit compressor", "Heizgrenze Kompressor", "heat limit compressor", "heat limit compressor", "ograniczenie mocy sprężarki", "max varmegrense kompressor", "limite chaleur compresseur", "ısı pompası ısıtma sınırı", "limite riscaldamento compressore")
+MAKE_TRANSLATION(maxHeatHeat, "maxheatheat", "heat limit heating", "Heizgrenze Heizen", "heat limit heating", "heat limit heating", "ograniczenie mocy w trybie ogrzewania", "maks varmegrense oppvarming", "limite chaleur chauffage", "ısınma ısıtma sınırı", "limite calore riscaldamento")
+MAKE_TRANSLATION(maxHeatDhw, "maxheatdhw", "heat limit dhw", "Heizgrenze Warmwasser", "heat limit dhw", "heat limit dhw", "ograniczenie mocy w trybie c.w.u.", "varmegrense varmtvann", "limite chaleur ecs", "sıcak kullanım suyu ısınma sınırı", "limite calore ACS")
-MAKE_TRANSLATION(auxHeaterOff, "auxheateroff", "disable aux heater", "Verbiete Zusatzheizer", "Bijverwarming uitsc", "Blockera eltillskott", "wyłącz dogrzewacz", "deaktiver tilleggsvarme", "Désactiver chauff. d'app", "", "disattivare i riscaldatori addizionali")
-MAKE_TRANSLATION(auxHeaterStatus, "auxheaterstatus", "aux heater status", "Status Zusatzheizer", "Bijverwarming", "Eltillskott Status", "status dogrzewacza", "status el. tillegsvarme", "Chauffage auxiliaire", "", "stato riscaldatori addizionali")
-MAKE_TRANSLATION(auxHeaterOnly, "auxheateronly", "aux heater only", "nur Zusatzheizer","Alleen bijverwarming", "Eltillskott Enbart", "tylko dogrzewacz", "kun el tilleggsvarme", "Que chauffage auxiliaire", "","solo riscaldatori addizionali")
-MAKE_TRANSLATION(auxHeaterDelay, "auxheaterdelay", "aux heater on delay", "Zusatzheizer verzögert ein", "Bijverw. vertraagd aan", "Eltillskottfördröjning på", "opóźnienie włączenia dogrzewacza", "Tilleggsvarmer forsinket på", "Chauff app tempo marche", "", "ritardo riscaldatori addizionali")
-MAKE_TRANSLATION(silentMode, "silentmode", "silent mode", "Silentmodus", " Stiller gebruik", "Tyst läge", "tryb cichy", "stille modus", "Fct silencieux", "", "modalità silenziosa")
-MAKE_TRANSLATION(minTempSilent, "mintempsilent", "min outside temp for silent mode", "Minimale Aussentemperatur Silentmodus", " Stiller gebruik min. buitentemp", "Tyst läge min temp", "minimalna temperatura zewnętrzna dla trybu cichego", "atille modus min temp", "Fct silencieux: Temp. extérieure min.", "", "modalità silenziosa temperatura esterna minima")
-MAKE_TRANSLATION(tempParMode, "tempparmode", "outside temp parallel mode", "Aussentemperatur Parallelmodus", "Buitentemp. parallelbedr", "Parallelläge Utomhustemp.", "maksymalna temperatura zewnętrzna dla dogrzewacza", "", "Temp. ext. fct parallèle", "", "modalità parallela temperatura esterna") // TODO translate
-MAKE_TRANSLATION(auxHeatMixValve, "auxheatmix", "aux heater mixing valve", "Mischer Zusatzheizer", "Bijverwarming menger", "Eltilskott Blandarventil", "mieszacz dogrzewacza", "eltilskudd blandeventil", "Chauffage auxiliaire mélangeur", "", "miscela riscaldatori addizionali")
-MAKE_TRANSLATION(hpHystHeat, "hphystheat", "on/off hyst heat", "Schalthysterese Heizen", "Aan/uit-hysteresis in verw. bedrijf", "Hstereses Uppvärm.", "histereza wł./wył. ogrzewania", "På/av hysterese Oppvar.", "Hystérésis Marche en mode chauffage", "", "isteresi di commutazione riscaldamento")
-MAKE_TRANSLATION(hpHystCool, "hphystcool", "on/off hyst cool", "Schalthysterese Kühlen", "Aan/uit-hysteresis in koelbedrijf ", "Hystereses Kyla", "histereza wł./wył. chłodzenia", "hystrese kjøling", "Hystérésis Marche en mode refroidissement", "", "isteresi di commutazione raffreddamento")
-MAKE_TRANSLATION(hpHystPool, "hphystpool", "on/off hyst pool", "Schalthysterese Pool", "an/uit-hysteresis in zwembadbedri", "Hystereses Pool", "histereza wł./wył. podgrzewania basenu", "hystrese basseng", "Hystérésis Marche en mode piscine", "", "isteresi di commutazione piscina")
-MAKE_TRANSLATION(tempDiffHeat, "tempdiffheat", "temp diff TC3/TC0 heat", "Temp.diff. TC3/TC0 Heizen", "Temp.vers. TC3/TC0 verw", "Delta(T) TC3/TC0 Uppvärm.", "różnica temperatur TC3/TC0 w trakcie ogrzewania", "temp. diff. TC3/TC0 oppvarm", "Delta T TC3/TC0 Chauff", "", "Delta T riscaldamento TC3/TC0")
-MAKE_TRANSLATION(tempDiffCool, "tempdiffcool", "temp diff TC3/TC0 cool", "Temp.diff. TC3/TC0 Kühlen", "Temp.vers. TC3/TC0 koel.", "Delta(T) TC3/TC0 Kyla", "różnica temperatur TC3/TC0 w trakcie chłodzenia", "temp. diff. TC3/TC0 kjøling", "Delta T TC3/TC0 Refroid.", "", "Delta T raffreddamento TC3/TC0")
-MAKE_TRANSLATION(silentFrom, "silentfrom", "silent mode from", "Silentmodus Start", "", "", "początek trybu cichego", "stillemodus starter", "", "", "avvio della modalità silenziosa") // TODO translate
-MAKE_TRANSLATION(silentTo, "silentto", "silent mode to", "Silentmodus Ende", "", "", "koniec trybu cichego", "komfortmodus av", "", "", "spegnere modalità silenziosa") // TODO translate
+MAKE_TRANSLATION(auxHeaterOff, "auxheateroff", "disable aux heater", "Verbiete Zusatzheizer", "Bijverwarming uitsc", "Blockera eltillskott", "wyłącz dogrzewacz", "deaktiver tilleggsvarme", "Désactiver chauff. d'app", "ilave ısıtıcıyı kapat", "disattivare i riscaldatori addizionali")
+MAKE_TRANSLATION(auxHeaterStatus, "auxheaterstatus", "aux heater status", "Status Zusatzheizer", "Bijverwarming", "Eltillskott Status", "status dogrzewacza", "status el. tillegsvarme", "Chauffage auxiliaire", "ilave ısıtıcı durumu", "stato riscaldatori addizionali")
+MAKE_TRANSLATION(auxHeaterOnly, "auxheateronly", "aux heater only", "nur Zusatzheizer", "Alleen bijverwarming", "Eltillskott Enbart", "tylko dogrzewacz", "kun el tilleggsvarme", "Que chauffage auxiliaire", "sadece ilave ısıtıvcı", "solo riscaldatori addizionali")
+MAKE_TRANSLATION(auxHeaterDelay, "auxheaterdelay", "aux heater on delay", "Zusatzheizer verzögert ein", "Bijverw. vertraagd aan", "Eltillskottfördröjning på", "opóźnienie włączenia dogrzewacza", "Tilleggsvarmer forsinket på", "Chauff app tempo marche", "ilave ısıtıcı beklemede", "ritardo riscaldatori addizionali")
+MAKE_TRANSLATION(silentMode, "silentmode", "silent mode", "Silentmodus", " Stiller gebruik", "Tyst läge", "tryb cichy", "stille modus", "Fct silencieux", "sessiz mod", "modalità silenziosa")
+MAKE_TRANSLATION(minTempSilent, "mintempsilent", "min outside temp for silent mode", "Minimale Aussentemperatur Silentmodus", " Stiller gebruik min. buitentemp", "Tyst läge min temp", "minimalna temperatura zewnętrzna dla trybu cichego", "atille modus min temp", "Fct silencieux: Temp. extérieure min.", "sessiz mod için min. dış ortam sıcaklığı", "modalità silenziosa temperatura esterna minima")
+MAKE_TRANSLATION(tempParMode, "tempparmode", "outside temp parallel mode", "Aussentemperatur Parallelmodus", "Buitentemp. parallelbedr", "Parallelläge Utomhustemp.", "maksymalna temperatura zewnętrzna dla dogrzewacza", "", "Temp. ext. fct parallèle", "paralel mod dış ortam sıcaklığı", "modalità parallela temperatura esterna") // TODO translate
+MAKE_TRANSLATION(auxHeatMixValve, "auxheatmix", "aux heater mixing valve", "Mischer Zusatzheizer", "Bijverwarming menger", "Eltilskott Blandarventil", "mieszacz dogrzewacza", "eltilskudd blandeventil", "Chauffage auxiliaire mélangeur", "ilave ısıtıcı karışım vanası", "miscela riscaldatori addizionali")
+MAKE_TRANSLATION(hpHystHeat, "hphystheat", "on/off hyst heat", "Schalthysterese Heizen", "Aan/uit-hysteresis in verw. bedrijf", "Hstereses Uppvärm.", "histereza wł./wył. ogrzewania", "På/av hysterese Oppvar.", "Hystérésis Marche en mode chauffage", "ısıtma gecikmesi", "isteresi di commutazione riscaldamento")
+MAKE_TRANSLATION(hpHystCool, "hphystcool", "on/off hyst cool", "Schalthysterese Kühlen", "Aan/uit-hysteresis in koelbedrijf ", "Hystereses Kyla", "histereza wł./wył. chłodzenia", "hystrese kjøling", "Hystérésis Marche en mode refroidissement", "soğutma gecikmesi", "isteresi di commutazione raffreddamento")
+MAKE_TRANSLATION(hpHystPool, "hphystpool", "on/off hyst pool", "Schalthysterese Pool", "an/uit-hysteresis in zwembadbedri", "Hystereses Pool", "histereza wł./wył. podgrzewania basenu", "hystrese basseng", "Hystérésis Marche en mode piscine", "havuz gecikmesi", "isteresi di commutazione piscina")
+MAKE_TRANSLATION(tempDiffHeat, "tempdiffheat", "temp diff TC3/TC0 heat", "Temp.diff. TC3/TC0 Heizen", "Temp.vers. TC3/TC0 verw", "Delta(T) TC3/TC0 Uppvärm.", "różnica temperatur TC3/TC0 w trakcie ogrzewania", "temp. diff. TC3/TC0 oppvarm", "Delta T TC3/TC0 Chauff", "TC3-TC0 ısıtma sıcaklık farkı", "Delta T riscaldamento TC3/TC0")
+MAKE_TRANSLATION(tempDiffCool, "tempdiffcool", "temp diff TC3/TC0 cool", "Temp.diff. TC3/TC0 Kühlen", "Temp.vers. TC3/TC0 koel.", "Delta(T) TC3/TC0 Kyla", "różnica temperatur TC3/TC0 w trakcie chłodzenia", "temp. diff. TC3/TC0 kjøling", "Delta T TC3/TC0 Refroid.", "TC3-TC0 soğutma sıcaklık farkı", "Delta T raffreddamento TC3/TC0")
+MAKE_TRANSLATION(silentFrom, "silentfrom", "silent mode from", "Silentmodus Start", "", "", "początek trybu cichego", "stillemodus starter", "", "sessiz mod başlangıcı", "avvio della modalità silenziosa") // TODO translate
+MAKE_TRANSLATION(silentTo, "silentto", "silent mode to", "Silentmodus Ende", "", "", "koniec trybu cichego", "komfortmodus av", "", "sessiz mod bitişi", "spegnere modalità silenziosa") // TODO translate
-MAKE_TRANSLATION(wwComfOffTemp, "wwcomfoff", "comfort switch off", "Komfort Ausschalttemp", "Comfort Uitschakeltemp.", "Komfortläge avstängingstemp.", "temperatura wyłączania w trybie komfort", "eco modus utkoblingstem", "Confort Temp. d'arrêt", "", "spegnimento modalità comfort") // TODO translate
-MAKE_TRANSLATION(wwEcoOffTemp, "wwecooff", "eco switch off", "ECO Ausschalttemp", "Eco Uitschakeltemp.", "Ekoläge avstängningstemp.", "temperatura wyłączania w trybie eko", "Øko avstengningstemp.", "Eco Temp. d'arrêt", "", "spegnimento modalità ECO") // TODO translate
-MAKE_TRANSLATION(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Ausschalttemp", "Eco+ Uitschakeltemp.", "Eko+ avstängningstemp.", "temperatura wyłączania w trybie eko+", "Øko+ avstengningstemp.", "Eco+ Temp. d'arrêt", "", "spegnimento modalità ECO+") // TODO translate
+MAKE_TRANSLATION(wwComfOffTemp, "wwcomfoff", "comfort switch off", "Komfort Ausschalttemp", "Comfort Uitschakeltemp.", "Komfortläge avstängingstemp.", "temperatura wyłączania w trybie komfort", "eco modus utkoblingstem", "Confort Temp. d'arrêt", "konfor kapalı", "spegnimento modalità comfort") // TODO translate
+MAKE_TRANSLATION(wwEcoOffTemp, "wwecooff", "eco switch off", "ECO Ausschalttemp", "Eco Uitschakeltemp.", "Ekoläge avstängningstemp.", "temperatura wyłączania w trybie eko", "Øko avstengningstemp.", "Eco Temp. d'arrêt", "eko kapalı", "spegnimento modalità ECO") // TODO translate
+MAKE_TRANSLATION(wwEcoPlusOffTemp, "wwecoplusoff", "eco+ switch off", "ECO+ Ausschalttemp", "Eco+ Uitschakeltemp.", "Eko+ avstängningstemp.", "temperatura wyłączania w trybie eko+", "Øko+ avstengningstemp.", "Eco+ Temp. d'arrêt", "eko+ kapalı", "spegnimento modalità ECO+") // TODO translate
-MAKE_TRANSLATION(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "", "", "tryb pracy dogrzewacza po blokadzie z Zakładu Energetycznego", "tilleggsvarmer modus", "", "", "modalità riscaldatore addizionale") // TODO translate
-MAKE_TRANSLATION(auxMaxLimit, "auxmaxlimit", "aux heater max limit", "Zusatzheizer max. Grenze", "", "", "dogrzewacz, maksymalny limit", "tillegsvarme maksgrense", "", "limite massimo riscaldatore addizionale") // TODO translate
-MAKE_TRANSLATION(auxLimitStart, "auxlimitstart", "aux heater limit start", "Zusatzheizer Grenze Start", "", "", "dogrzewacz, początek ograniczenia", "tillegsvarme startgrense", "", "avvio limite massimo riscaldatore addizionale") // TODO translate
-MAKE_TRANSLATION(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "ręczne odladzanie", "manuell avisning", "", "", "sbrinamento manuale") // TODO translate
-MAKE_TRANSLATION(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "chłodzenie tylko z PV", "kjøling med solpanel", "", "", "solo raffrescamento con solare") // TODO translate
-MAKE_TRANSLATION(hpCircPumpWw, "hpcircpumpww", "circulation pump available during dhw", "", "", "", "pompa cyrkulacji dostępna w trakcie c.w.u.", "sirkulasjonspumpe tilgjengelig under varmtvann", "", "", "pompa di circolazione disponibile durante ACS") // TODO translate
-MAKE_TRANSLATION(vp_cooling, "vpcooling", "valve/pump cooling", "", "", "", "zawór/pompa chłodzenia", "varmepumpe kjøling", "", "", "valvola/pompa raffrescamento") // TODO translate
-MAKE_TRANSLATION(VC0valve, "vc0valve", "VC0 valve", "VC0 Ventil", "", "", "zawór VC0", "vc0 ventil", "", "", "valvola VC0") // TODO translate
-MAKE_TRANSLATION(primePump, "primepump", "primary heatpump", "Hauptpumpe", "", "", "główna pompa ciepła", "primærpumpe", "", "", "pompa principale riscaldamento") // TODO translate
-MAKE_TRANSLATION(primePumpMod, "primepumpmod", "primary heatpump modulation", "Modulation Hauptpumpe", "", "", "wysterowanie głównej pompy ciepła", "primærpumpelast", "", "", "pompa principale modulazione riscaldamento") // TODO translate
-MAKE_TRANSLATION(hp3wayValve, "hp3way", "3-way valve", "3-Wege-Ventil", "", "", "zawór 3-drogowy pompy ciepła", "3-veisventil", "", "", "valvola 3-vie") // TODO translate
-MAKE_TRANSLATION(elHeatStep1, "elheatstep1", "el. heater step 1", "El. Heizer Stufe 1", "", "", "dogrzewacz poziom 1", "el-kolbe steg 1", "", "", "riscaldatore elettrico livello 1") // TODO translate
-MAKE_TRANSLATION(elHeatStep2, "elheatstep2", "el. heater step 2", "El. Heizer Stufe 2", "", "", "dogrzewacz poziom 2", "el-kolbe steg 2", "", "", "riscaldatore elettrico livello 2") // TODO translate
-MAKE_TRANSLATION(elHeatStep3, "elheatstep3", "el. heater step 3", "El. Heizer Stufe 3", "", "", "dogrzewacz poziom 3", "el-kolbe steg 3", "", "", "riscaldatore elettrico livello 3") // TODO translate
-MAKE_TRANSLATION(wwAlternatingOper, "wwalternatingop", "alternating operation", "Wechselbetrieb", "", "", "praca naprzemienna", "alternativ drift", "", "", "funzionamento alternato") // TODO translate
-MAKE_TRANSLATION(wwAltOpPrioHeat, "wwaltopprioheat", "prioritise heating during dhw", "Heizen bevorzugt vor WW", "", "", "czas na ogrzewanie w trakcie c.w.u", "prioritert oppvarmning", "", "", "dare la priorità al riscaldamento durante l'ACS") // TODO translate
-MAKE_TRANSLATION(wwAltOpPrioWw, "wwaltopprioww", "prioritise dhw during heating", "WW bevorzugt vor Heizen", "", "", "czas na c.w.u w trakcie ogrzewania", "prioritert varmtvann", "", "", "dare priorità all'acqua calda durante il riscaldamento") // TODO translate
+MAKE_TRANSLATION(auxHeatMode, "auxheatrmode", "aux heater mode", "Modus Zusatzheizer", "", "", "tryb pracy dogrzewacza po blokadzie z Zakładu Energetycznego", "tilleggsvarmer modus", "", "ilave ısıtıcı modu", "modalità riscaldatore addizionale") // TODO translate
+MAKE_TRANSLATION(auxMaxLimit, "auxmaxlimit", "aux heater max limit", "Zusatzheizer max. Grenze", "", "", "dogrzewacz, maksymalny limit", "tillegsvarme maksgrense", "ilave ısıtıcı maks limit", "limite massimo riscaldatore addizionale") // TODO translate
+MAKE_TRANSLATION(auxLimitStart, "auxlimitstart", "aux heater limit start", "Zusatzheizer Grenze Start", "", "", "dogrzewacz, początek ograniczenia", "tillegsvarme startgrense", "ilave ısıtıcı limir başlangıcı", "avvio limite massimo riscaldatore addizionale") // TODO translate
+MAKE_TRANSLATION(manDefrost, "mandefrost", "manual defrost", "Manuelle Enteisung", "", "", "ręczne odladzanie", "manuell avisning", "", "manuel buz çözme", "sbrinamento manuale") // TODO translate
+MAKE_TRANSLATION(pvCooling, "pvcooling", "Cooling only with PV", "Kühlen nur mit PV", "", "", "chłodzenie tylko z PV", "kjøling med solpanel", "", "sadece PV ile soğutma", "solo raffrescamento con solare") // TODO translate
+MAKE_TRANSLATION(hpCircPumpWw, "hpcircpumpww", "circulation pump available during dhw", "", "", "", "pompa cyrkulacji dostępna w trakcie c.w.u.", "sirkulasjonspumpe tilgjengelig under varmtvann", "", "SKS esnasında sirkülasyon pompasu uygun", "pompa di circolazione disponibile durante ACS") // TODO translate
+MAKE_TRANSLATION(vp_cooling, "vpcooling", "valve/pump cooling", "", "", "", "zawór/pompa chłodzenia", "varmepumpe kjøling", "", "vana/pompa soğuyor", "valvola/pompa raffrescamento") // TODO translate
+MAKE_TRANSLATION(VC0valve, "vc0valve", "VC0 valve", "VC0 Ventil", "", "", "zawór VC0", "vc0 ventil", "", "VC0 vana", "valvola VC0") // TODO translate
+MAKE_TRANSLATION(primePump, "primepump", "primary heatpump", "Hauptpumpe", "", "", "główna pompa ciepła", "primærpumpe", "", "ana ısı pompası", "pompa principale riscaldamento") // TODO translate
+MAKE_TRANSLATION(primePumpMod, "primepumpmod", "primary heatpump modulation", "Modulation Hauptpumpe", "", "", "wysterowanie głównej pompy ciepła", "primærpumpelast", "", "ana ısı pompası modülasyon", "pompa principale modulazione riscaldamento") // TODO translate
+MAKE_TRANSLATION(hp3wayValve, "hp3way", "3-way valve", "3-Wege-Ventil", "", "", "zawór 3-drogowy pompy ciepła", "3-veisventil", "", "3 yollu vana", "valvola 3-vie") // TODO translate
+MAKE_TRANSLATION(elHeatStep1, "elheatstep1", "el. heater step 1", "El. Heizer Stufe 1", "", "", "dogrzewacz poziom 1", "el-kolbe steg 1", "", "el.ısıtıcı adım 1", "riscaldatore elettrico livello 1") // TODO translate
+MAKE_TRANSLATION(elHeatStep2, "elheatstep2", "el. heater step 2", "El. Heizer Stufe 2", "", "", "dogrzewacz poziom 2", "el-kolbe steg 2", "", "el.ısıtıcı adım 2", "riscaldatore elettrico livello 2") // TODO translate
+MAKE_TRANSLATION(elHeatStep3, "elheatstep3", "el. heater step 3", "El. Heizer Stufe 3", "", "", "dogrzewacz poziom 3", "el-kolbe steg 3", "", "el.ısıtıcı adım 3", "riscaldatore elettrico livello 3") // TODO translate
+MAKE_TRANSLATION(wwAlternatingOper, "wwalternatingop", "alternating operation", "Wechselbetrieb", "", "", "praca naprzemienna", "alternativ drift", "", "sıcak kullanım suyu alternatif işletim", "funzionamento alternato") // TODO translate
+MAKE_TRANSLATION(wwAltOpPrioHeat, "wwaltopprioheat", "prioritise heating during dhw", "Heizen bevorzugt vor WW", "", "", "czas na ogrzewanie w trakcie c.w.u", "prioritert oppvarmning", "", "sıcak kullanım suyu esnasında ısıtmayı öne al", "dare la priorità al riscaldamento durante l'ACS") // TODO translate
+MAKE_TRANSLATION(wwAltOpPrioWw, "wwaltopprioww", "prioritise dhw during heating", "WW bevorzugt vor Heizen", "", "", "czas na c.w.u w trakcie ogrzewania", "prioritert varmtvann", "", "ısıtma esnasında sıcak kullanım suyunu öne al", "dare priorità all'acqua calda durante il riscaldamento") // TODO translate
// hybrid heatpump
-MAKE_TRANSLATION(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi", "strategia sterowania hybrydowego", "hybrid kontrollstrategi", "stratégie contrôle hybride", "", "strategia comtrollo ibrido")
-MAKE_TRANSLATION(switchOverTemp, "switchovertemp", "outside switchover temperature", "Außentemperatur für Umschaltung", "Schakeltemperatuur buitentemperatuur", "Utomhus Omställningstemperatur", "zewnętrzna temperatura przełączania", "utendørstemp styring", "basculement par température extérieure", "", "temperatura esterna per commutazione")
-MAKE_TRANSLATION(energyCostRatio, "energycostratio", "energy cost ratio", "Energie/Kosten-Verhältnis", "Energiekostenratio", "Energi/Kostnads-förhållande", "współczynnik energia/koszt", "energi/kostnads forhold", "ratio coût énergie", "", "rapporto energia/costo")
-MAKE_TRANSLATION(fossileFactor, "fossilefactor", "fossile energy factor", "Energiefaktor Fossil", "Energiefactor fossiele brandstof", "Energifaktor fossilenergi", "udział energii z paliw kopalnych", "energifaktor fossilenergi", "facteur énergie fossile", "", "fattore energia fossile")
-MAKE_TRANSLATION(electricFactor, "electricfactor", "electric energy factor", "Energiefaktor elektrisch", "Energiefactor electrisch", "Elektrisk energifaktor", "udział energii elektrycznej", "elektrisk energifaktor", "facteur énergie électrique", "", "fattore energia elettrica")
-MAKE_TRANSLATION(delayBoiler, "delayboiler", "delay boiler support", "Verzögerungs-Option", "Vertragingsoptie", "Fördröjningsoption", "opcja opóźnienia", "Fördörjningsoption", "option retardement chaudière", "", "opzione ritardo caldaia")
-MAKE_TRANSLATION(tempDiffBoiler, "tempdiffboiler", "temp diff boiler support", "Temperaturdifferenz-Option", "Verschiltemperatuuroptie", "Temperaturskillnadsoption", "opcja różnicy temperatur", "temperatursforskjell kjele", "option différence température", "", "opzione differenza temperatura")
-MAKE_TRANSLATION(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "", "Tyst läge", "tryb cichy", "stillemodus", "mode faible bruit", "", "modalità a basso rumore") // TODO translate
-MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "", "Tyst läge starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "", "ora di avvio a basso rumore") // TODO translate
-MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "", "Tyst läge stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "", "ora di arresto funzionamento silenzioso") // TODO translate
-MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "", "prezzo energia gas") // TODO translate
-MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "", "prezzo energia elettrica") // TODO translate
-MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "", "PV Energi", "zasilanie energią PV", "strømpris PV", "alimentation PV", "", "energia fotovoltaico") // TODO translate
-MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "", "ACS ibrida") // TODO translate
-MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "", "modalita spurgo aria") // TODO translate
-MAKE_TRANSLATION(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "varmepumpeeffekt", "sortie pompe à chaleur", "", "prestazione pompa calore") // TODO translate
-MAKE_TRANSLATION(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "", "Kylkrets", "obwód chłodzący", "kjølekrets", "circuit refroidissement", "", "circuito raffreddante") // TODO translate
-MAKE_TRANSLATION(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "", "Kompressor startmodulering", "początkowa modulacja sprężarki", "kompressor startmodulering", "modulation démarrage compresseur", "", "avvio modulazione compressore") // TODO translate
-MAKE_TRANSLATION(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "oppvarming drenering", "bac récupération chaleur", "", "serbatoio scarico condensa") // TODO translate
-MAKE_TRANSLATION(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "varmekabel", "câble chauffant", "", "cavo riscaldante") // TODO translate
+MAKE_TRANSLATION(hybridStrategy, "hybridstrategy", "hybrid control strategy", "Hybrid Strategie", "Hybride strategie", "Hybrid kontrollstrategi", "strategia sterowania hybrydowego", "hybrid kontrollstrategi", "stratégie contrôle hybride", "hibrit kontrol stratejisi", "strategia comtrollo ibrido")
+MAKE_TRANSLATION(switchOverTemp, "switchovertemp", "outside switchover temperature", "Außentemperatur für Umschaltung", "Schakeltemperatuur buitentemperatuur", "Utomhus Omställningstemperatur", "zewnętrzna temperatura przełączania", "utendørstemp styring", "basculement par température extérieure", "geçiş için dış sıcaklık", "temperatura esterna per commutazione")
+MAKE_TRANSLATION(energyCostRatio, "energycostratio", "energy cost ratio", "Energie/Kosten-Verhältnis", "Energiekostenratio", "Energi/Kostnads-förhållande", "współczynnik energia/koszt", "energi/kostnads forhold", "ratio coût énergie", "enerji maliyet oranı", "rapporto energia/costo")
+MAKE_TRANSLATION(fossileFactor, "fossilefactor", "fossile energy factor", "Energiefaktor Fossil", "Energiefactor fossiele brandstof", "Energifaktor fossilenergi", "udział energii z paliw kopalnych", "energifaktor fossilenergi", "facteur énergie fossile", "fosil yakıt faktörü", "fattore energia fossile")
+MAKE_TRANSLATION(electricFactor, "electricfactor", "electric energy factor", "Energiefaktor elektrisch", "Energiefactor electrisch", "Elektrisk energifaktor", "udział energii elektrycznej", "elektrisk energifaktor", "facteur énergie électrique", "elektrik enerjisi faktörü", "fattore energia elettrica")
+MAKE_TRANSLATION(delayBoiler, "delayboiler", "delay boiler support", "Verzögerungs-Option", "Vertragingsoptie", "Fördröjningsoption", "opcja opóźnienia", "Fördörjningsoption", "option retardement chaudière", "kazan desteğini ötele", "opzione ritardo caldaia")
+MAKE_TRANSLATION(tempDiffBoiler, "tempdiffboiler", "temp diff boiler support", "Temperaturdifferenz-Option", "Verschiltemperatuuroptie", "Temperaturskillnadsoption", "opcja różnicy temperatur", "temperatursforskjell kjele", "option différence température", "sıcaklık farkı kazan desteği", "opzione differenza temperatura")
+MAKE_TRANSLATION(lowNoiseMode, "lownoisemode", "low noise mode", "Geräuscharmer Betrieb", "", "Tyst läge", "tryb cichy", "stillemodus", "mode faible bruit", "düşük ses modu", "modalità a basso rumore") // TODO translate
+MAKE_TRANSLATION(lowNoiseStart, "lownoisestart", "low noise starttime", "Start geräuscharmer Betrieb", "", "Tyst läge starttid", "początek trybu cichego", "stille modu starttid", "heure démarrage faible bruit", "düşük ses başlangıç", "ora di avvio a basso rumore") // TODO translate
+MAKE_TRANSLATION(lowNoiseStop, "lownoisestop", "low noise stoptime", "Stopp geräuscharmer Betrieb", "", "Tyst läge stopptid", "koniec trybu cichego", "stille modus stopptid", "heure arrêt faible bruit", "düşük ses bitiş", "ora di arresto funzionamento silenzioso") // TODO translate
+MAKE_TRANSLATION(energyPriceGas, "energypricegas", "energy price gas", "Energiepreis Gas", "", "Gaspris", "cena energii z gazu", "energipris gass", "prix énergie gaz", "gaz enerjisi fiyatı", "prezzo energia gas") // TODO translate
+MAKE_TRANSLATION(energyPriceEl, "energypriceel", "energy price electric", "Energiepreis Eletrizität", "", "Elpris", "cena energii elektrycznej", "strømpris", "prix énergie électrique", "elektrik enerjisi fiyatı", "prezzo energia elettrica") // TODO translate
+MAKE_TRANSLATION(energyPricePV, "energyfeedpv", "feed in PV", "PV Einspeisevergütung", "", "PV Energi", "zasilanie energią PV", "strømpris PV", "alimentation PV", "giren güneş enerjisi", "energia fotovoltaico") // TODO translate
+MAKE_TRANSLATION(hybridDHW, "hybriddhw", "hybrid DHW", "Hybrid Warmwasser", "", "Hybridläge varmvatten", "hybrydowa c.w.u.", "hybridmodus varmtvann", "ecs hybride", "hibrit SKS", "ACS ibrida") // TODO translate
+MAKE_TRANSLATION(airPurgeMode, "airpurgemode", "air purge mode", "Luftspülung", "", "Luftreningsläge", "tryb oczyszczania powietrza", "luftsrensningsmodus", "mode purge air", "hava temizleme modu", "modalita spurgo aria") // TODO translate
+MAKE_TRANSLATION(heatPumpOutput, "heatpumpoutput", "heatpump output", "WP Leistung", "", "Värmepumpseffekt", "moc wyjściowa pompy ciepła", "varmepumpeeffekt", "sortie pompe à chaleur", "ısı pompası çıkışı", "prestazione pompa calore") // TODO translate
+MAKE_TRANSLATION(coolingCircuit, "coolingcircuit", "cooling circuit", "Kühlkreislauf", "", "Kylkrets", "obwód chłodzący", "kjølekrets", "circuit refroidissement", "soğutma devresi", "circuito raffreddante") // TODO translate
+MAKE_TRANSLATION(compStartMod, "compstartmod", "compressor start modulation", "Kompressor Startleistung", "", "Kompressor startmodulering", "początkowa modulacja sprężarki", "kompressor startmodulering", "modulation démarrage compresseur", "kazan başlangıç modülasyonu", "avvio modulazione compressore") // TODO translate
+MAKE_TRANSLATION(heatDrainPan, "heatdrainpan", "heat drain pan", "Wärmeausgleichsgefäß", "", "Uppvärm. dränering", "zbiornik wyrównawczy ciepła", "oppvarming drenering", "bac récupération chaleur", "ısı tahliye tablası", "serbatoio scarico condensa") // TODO translate
+MAKE_TRANSLATION(heatCable, "heatcable", "heating cable", "Heizband", "heating cable", "värmekabel", "przewód grzejny", "varmekabel", "câble chauffant", "ısıtma kablosu", "cavo riscaldante") // TODO translate
// alternative heatsource AM200
-MAKE_TRANSLATION(aCylTopTemp, "cyltoptemp", "cylinder top temperature", "Speichertemperatur Oben", "Buffer temperatuur boven", "Cylindertemperatur Toppen", "temperatura na górze cylindra", "beredertemperatur topp", "température haut cylindre", "", "temperatura superiore accumulo")
-MAKE_TRANSLATION(aCylCenterTemp, "cylcentertemp", "cylinder center temperature", "Speichertemperatur Mitte", "Buffer temperatuur midden", "Cylindertemperatur Mitten", "temperatura na środku cylindra", "beredertemperatur midten", "température centre cylindre", "", "temperatura centrale accumulo")
-MAKE_TRANSLATION(aCylBottomTemp, "cylbottomtemp", "cylinder bottom temperature", "Speichertemperatur Unten", "Buffer temperatuur onder", "Cylindertemperatur Botten", "temperatura na dole cylindra", "beredertemperatur nederst", "température fond cylindre", "", "temperatura inferiore accumulo")
+MAKE_TRANSLATION(aCylTopTemp, "cyltoptemp", "cylinder top temperature", "Speichertemperatur Oben", "Buffer temperatuur boven", "Cylindertemperatur Toppen", "temperatura na górze cylindra", "beredertemperatur topp", "température haut cylindre", "silindir üst yüzey sıcaklığı", "temperatura superiore accumulo")
+MAKE_TRANSLATION(aCylCenterTemp, "cylcentertemp", "cylinder center temperature", "Speichertemperatur Mitte", "Buffer temperatuur midden", "Cylindertemperatur Mitten", "temperatura na środku cylindra", "beredertemperatur midten", "température centre cylindre", "silindir merkez sıcaklığı", "temperatura centrale accumulo")
+MAKE_TRANSLATION(aCylBottomTemp, "cylbottomtemp", "cylinder bottom temperature", "Speichertemperatur Unten", "Buffer temperatuur onder", "Cylindertemperatur Botten", "temperatura na dole cylindra", "beredertemperatur nederst", "température fond cylindre", "silindir taban sıcaklığı", "temperatura inferiore accumulo")
MAKE_TRANSLATION(aFlowTemp, "altflowtemp", "alternative hs flow temperature", "Alternativer WE Vorlauftemperatur", "Alternatieve warmtebron aanvoertemperatuur", "Alternativ flödestemp värmekälla", "temperatura zasilania z alternatywnego źródła", "alternativ varmekilde tilførselstemperatur", "température flux hs alternative", "", "temperatura alternativa mandata hs")
MAKE_TRANSLATION(aRetTemp, "altrettemp", "alternative hs return temperature", "Alternativer WE Rücklauftemperatur", "Alternatieve warmtebron retourtemperatuur", "Alternativ returtemp värmekälla", "temperatura powrotu z alternatywnego źródła", "alternativ varmekilde returtemperatur", "température retour hs alternative", "", "temperatura alternativa ritorno hs")
MAKE_TRANSLATION(sysFlowTemp, "sysflowtemp", "system flow temperature", "System Vorlauftemperatur", "Systeem aanvoertemperatuur", "Systemflödestemperatur", "temperatura zasilania systemu", "systemturtemperatur", "température flux système", "", "temperatura di mandata impianto")
@@ -498,9 +500,9 @@ MAKE_TRANSLATION(blockHyst, "blockhyst", "hyst. for boiler block", "Hysterese Sp
MAKE_TRANSLATION(releaseWait, "releasewait", "boiler release wait time", "Wartezeit Kessel-Freigabe", "Wachttijd ketel vrijgave", "Väntetid Frisläppning", "czas oczekiwania na zwolnienie kotła", "kjele frigjøringsventetid", "temps attente libération chaudière", "", "tempo di attesa sblocco caldaia")
// HIU
-MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp")
-MAKE_TRANSLATION(cwFlowRate, "cwflowrate", "cold water flow rate")
-MAKE_TRANSLATION(keepWarmTemp, "keepwarmtemp", "keep warm temperature")
+MAKE_TRANSLATION(netFlowTemp, "netflowtemp", "heat network flow temp", "", "", "", "", "", "", "", "temperatura di mandata della rete di riscaldamento")
+MAKE_TRANSLATION(cwFlowRate, "cwflowrate", "cold water flow rate", "", "", "", "", "", "", "", "portata acqua fredda")
+MAKE_TRANSLATION(keepWarmTemp, "keepwarmtemp", "keep warm temperature", "", "", "", "", "", "", "", "mantenere la temperatura calda")
// the following are dhw for the boiler and automatically tagged with 'dhw'
MAKE_TRANSLATION(wwSelTemp, "wwseltemp", "selected temperature", "gewählte Temperatur", "Geselecteerd temperatuur", "Vald Temperatur", "temperatura wyższa/komfort", "valgt temperatur", "température sélectionnée", "", "temperatura selezionata")
@@ -515,7 +517,7 @@ MAKE_TRANSLATION(wwComfort1, "wwcomfort1", "comfort mode", "Komfort-Modus", "Com
MAKE_TRANSLATION(wwFlowTempOffset, "wwflowtempoffset", "flow temperature offset", "Vorlauftemperaturanhebung", "Aanvoertemperatuur offset", "Flödestemperatur förskjutning", "korekta temperatury wypływu", "turtemperaturforskyvning", "offset température flux", "", "aumento della temperatura di ritorno")
MAKE_TRANSLATION(wwMaxPower, "wwmaxpower", "max power", "max Leistung", "Maximaal vermogen", "Max Effekt", "moc maksymalna", "maks effekt", "puissance max", "", "potenza massima")
MAKE_TRANSLATION(wwCircPump, "wwcircpump", "circulation pump available", "Zirkulationspumpe vorhanden", "Circulatiepomp aanwezig", "Cirkulationspump tillgänglig", "pompa cyrkulacji zainstalowana", "sirkulasjonspumpe tilgjengelig", "pompe circulation disponible", "", "pompa circolazione disponibile")
-MAKE_TRANSLATION(wwChargeType, "wwchargetype", "charging type", "Speicher-Ladungstyp", "Buffer laadtype", "Laddningstyp", "sposób grzania zasobnika", "varmetype", "type chargement", "", "")
+MAKE_TRANSLATION(wwChargeType, "wwchargetype", "charging type", "Speicher-Ladungstyp", "Buffer laadtype", "Laddningstyp", "sposób grzania zasobnika", "varmetype", "type chargement", "", "tipo caricamento") // TODO translate
MAKE_TRANSLATION(wwDisinfectionTemp, "wwdisinfectiontemp", "disinfection temperature", "Desinfektionstemperatur", "Desinfectietemperatuur", "Desinfektionstemperatur", "temperatura dezynfekcji termicznej", "desinfeksjonstemperatur", "température désinfection", "", "temperatura disinfezione") // TODO translate
MAKE_TRANSLATION(wwCircMode, "wwcircmode", "circulation pump mode", "Zirkulationspumpen-Modus", "Modus circulatiepomp", "Läge Cirkulationspump", "tryb pracy cyrkulacji", "sikulasjonspumpemodus", "mode pompe circulation", "", "modalità pompa circolazione")
MAKE_TRANSLATION(wwCirc, "wwcirc", "circulation active", "Zirkulation aktiv", "Circulatiepomp actief", "Cirkulation aktiv", "pompa cyrkulacji", "sirkulasjon aktiv", "circulation active", "", "circolazione attiva")
@@ -577,7 +579,7 @@ MAKE_TRANSLATION(pvEnableWw, "pvenableww", "enable raise dhw", "aktiviere Anhebu
MAKE_TRANSLATION(pvRaiseHeat, "pvraiseheat", "raise heating with PV", "Anhebung Heizen mit PV", "", "", "podwyższenie grzania z PV", "heve varmen med solpanel", "", "", "Aumentare il riscaldamento con il solare") // TODO translate
MAKE_TRANSLATION(pvLowerCool, "pvlowercool", "lower cooling with PV", "Kühlabsenkung mit PV", "", "", "obniżenie chłodzenia z PV", "nedre kjøling solpanel", "", "", "Riduzione del raffreddamento con il solare") // TODO translate
// thermostat ww
-MAKE_TRANSLATION(wwMode, "wwmode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode", "", "Modus")
+MAKE_TRANSLATION(wwMode, "wwmode", "mode", "Modus", "Modus", "Läge", "tryb pracy", "modus", "mode", "", "modalità")
MAKE_TRANSLATION(wwSetTempLow, "wwsettemplow", "set low temperature", "untere Solltemperatur", "Onderste streeftemperatuur", "Nedre Börvärde", "zadana temperatura obniżona", "nedre settverdi", "réglage température basse", "", "imposta bassa temperatura")
MAKE_TRANSLATION(wwWhenModeOff, "wwwhenmodeoff", "when thermostat mode off", "bei Thermostatmodus AUS", "Als Thermostaat op UIT", "när Termostatläge är AV", "gdy wyłączono na termostacie", "når modus er av", "lorsque mode thermostat off", "", "quando termostato modalita OFF")
MAKE_TRANSLATION(wwExtra1, "wwextra1", "circuit 1 extra", "Kreis 1 Extra", "Circuit 1 extra", "Krets 1 Extra", "obieg dodatkowy 1", "ekstra krets 1", "circuit 1 extra", "", "Circuito 1 extra")
@@ -594,7 +596,7 @@ MAKE_TRANSLATION(wwDailyHeatTime, "wwdailyheattime", "daily heating time", "täg
// thermostat hc
MAKE_TRANSLATION(selRoomTemp, "seltemp", "selected room temperature", "Sollwert Raumtemperatur", "Streeftemperatuur kamer", "Vald Rumstemperatur", "zadana temperatura w pomieszczeniu", "valgt rumstemperatur", "température ambiante sélectionnée", "", "temperatura ambiente selezionata")
MAKE_TRANSLATION(roomTemp, "currtemp", "current room temperature", "aktuelle Raumtemperatur", "Huidige kamertemperatuur", "Aktuell Rumstemperatur", "temperatura w pomieszczeniu", "gjeldende romstemperatur", "température ambiante actuelle", "", "temperatura ambiente attuale")
-MAKE_TRANSLATION(mode, "mode", "mode", "Modus", "Modus", "Läge", "sposób sterowania", "modus", "mode", "", "Modus")
+MAKE_TRANSLATION(mode, "mode", "mode", "Modus", "Modus", "Läge", "sposób sterowania", "modus", "mode", "", "modalità")
MAKE_TRANSLATION(modetype, "modetype", "mode type", "Modus Typ", "Type modus", "Typ av läge", "aktualny tryb pracy", "modusrype", "type mode", "", "tipo di modalita")
MAKE_TRANSLATION(fastheatup, "fastheatup", "fast heatup", "schnelles Aufheizen", "Snel opwarmen", "Snabb Uppvärmning", "szybkie nagrzewanie", "rask oppvarming", "chauffage rapide", "", "riscaldamento rapido")
MAKE_TRANSLATION(daytemp, "daytemp", "day temperature", "Tagestemperatur", "temperatuur dag", "Dagstemperatur", "temperatura w dzień", "dagtemperatur", "température jour", "", "temperatura giornaliera")
@@ -626,12 +628,12 @@ MAKE_TRANSLATION(hpoperatingstate, "hpoperatingstate", "heatpump operating state
MAKE_TRANSLATION(controlmode, "controlmode", "control mode", "Kontrollmodus", "Comtrolemodus", "Kontrolläge", "tryb sterowania", "kontrollmodus", "mode régulation", "", "modalità di controllo")
MAKE_TRANSLATION(control, "control", "control device", "Fernsteuerung", "Afstandsbedieding", "Kontrollenhet", "sterownik", "kontrollenhet", "dispositif régulation", "", "dispositivo di comando")
MAKE_TRANSLATION(roomsensor, "roomsensor", "room sensor", "Raumsensor", "Ruimtesensor", "Rumssensor", "czujnik temperatury pomieszczenia", "romsensor", "capteur pièce", "", "sensore ambiente")
-MAKE_TRANSLATION(program, "program", "program", "Programm", "Programma", "Program", "program", "program", "programme", "", "Programma")
-MAKE_TRANSLATION(pause, "pause", "pause time", "Pausenzeit", "Pausetijd", "Paustid", "czas przerwy", "pausetid", "temps de pause", "", "pausa")
-MAKE_TRANSLATION(party, "party", "party time", "Partyzeit", "Partytijd", "Partytid", "czas przyjęcia", "partytid", "temps de fête", "", "festivo")
-MAKE_TRANSLATION(holidaytemp, "holidaytemp", "holiday temperature", "Urlaubstemperatur", "Vakantietemperatuur", "Helgtemperatur", "temperatura w trybie urlopowym", "ferietemperatur", "température vacances", "", "temperatura festiva")
-MAKE_TRANSLATION(summermode, "summermode", "summer mode", "Sommerbetrieb", "Zomerbedrijf", "Sommarläge", "aktualny tryb lato/zima", "sommermodus", "mode été", "", "funzionamento estivo")
-MAKE_TRANSLATION(holidaymode, "holidaymode", "holiday mode", "Urlaubsbetrieb", "Vakantiebedrijf", "Helgläge", "tryb urlopowy", "feriemodus", "mode vacances", "", "modalita vacanze")
+MAKE_TRANSLATION(program, "program", "program", "Programm", "Programma", "Program", "program", "program", "programme", "program", "Programma")
+MAKE_TRANSLATION(pause, "pause", "pause time", "Pausenzeit", "Pausetijd", "Paustid", "czas przerwy", "pausetid", "temps de pause", "süreyi durdur", "pausa")
+MAKE_TRANSLATION(party, "party", "party time", "Partyzeit", "Partytijd", "Partytid", "czas przyjęcia", "partytid", "temps de fête", "parti zamanı", "festivo")
+MAKE_TRANSLATION(holidaytemp, "holidaytemp", "holiday temperature", "Urlaubstemperatur", "Vakantietemperatuur", "Helgtemperatur", "temperatura w trybie urlopowym", "ferietemperatur", "température vacances", "tatil sıcaklığı", "temperatura festiva")
+MAKE_TRANSLATION(summermode, "summermode", "summer mode", "Sommerbetrieb", "Zomerbedrijf", "Sommarläge", "aktualny tryb lato/zima", "sommermodus", "mode été", "yaz modu", "funzionamento estivo")
+MAKE_TRANSLATION(holidaymode, "holidaymode", "holiday mode", "Urlaubsbetrieb", "Vakantiebedrijf", "Helgläge", "tryb urlopowy", "feriemodus", "mode vacances", "tatil modu", "modalita vacanze")
MAKE_TRANSLATION(flowtempoffset, "flowtempoffset", "flow temperature offset for mixer", "Vorlauftemperaturanhebung", "Mixer aanvoertemperatuur offset", "Temperaturkorrigering Flödestemp. Blandningsventil", "korekta temperatury przepływu dla miksera", "temperaturkorrigering av blandingsventil", "décalage température de bascule pour mélangeur", "", "aumento della temperatura di ritorno")
MAKE_TRANSLATION(reducemode, "reducemode", "reduce mode", "Absenkmodus", "Gereduceerde modus", "Reducerat Läge", "tryb zredukowany/obniżony", "redusert modus", "mode réduction", "", "modalità assente")
MAKE_TRANSLATION(noreducetemp, "noreducetemp", "no reduce below temperature", "Durchheizen unter", "Reduceermodus onderbreken onder", "Inaktivera reducering under", "bez redukcji poniżej temperatury", "inaktiver redusert nedre temp", "pas de réduction en dessous température", "", "non ridurre temperatura sotto")
@@ -650,15 +652,15 @@ MAKE_TRANSLATION(reducehours, "reducehours", "duration for nighttemp", "Dauer Na
MAKE_TRANSLATION(reduceminutes, "reduceminutes", "remaining time for nightmode", "Restzeit Nachttemp.", "Resterende tijd nachtverlaging", "Återstående Tid Nattläge", "czas do końca trybu nocnego", "gjenværende tid i nattstilling", "temps restant mode nuit", "", "temperatura notturna residua")
MAKE_TRANSLATION(switchonoptimization, "switchonoptimization", "switch-on optimization", "Einschaltoptimierung", "Inschakeloptimalisering", "Växlingsoptimering", "optymalizacja załączania", "slå på optimalisering", "optimisation mise en marche", "", "ottimizzazione all'accensione")
-MAKE_TRANSLATION(hpmode, "hpmode", "HP Mode", "WP Modus")
-MAKE_TRANSLATION(dewoffset, "dewoffset", "dew point offset", "Taupunkt Differenz")
-MAKE_TRANSLATION(roomtempdiff, "roomtempdiff", "room temp difference", "Raumtemperatur Differenz")
-MAKE_TRANSLATION(hpminflowtemp, "hpminflowtemp", "HP min. flow temp.", "WP minimale Vorlauftemperatur")
+MAKE_TRANSLATION(hpmode, "hpmode", "HP Mode", "WP Modus", "", "", "", "", "", "", "Modalità Termopompa")
+MAKE_TRANSLATION(dewoffset, "dewoffset", "dew point offset", "Taupunkt Differenz", "", "", "", "", "", "", "differenza del punto di rugiada")
+MAKE_TRANSLATION(roomtempdiff, "roomtempdiff", "room temp difference", "Raumtemperatur Differenz", "", "", "", "", "", "", "differenza temperatura ambiente")
+MAKE_TRANSLATION(hpminflowtemp, "hpminflowtemp", "HP min. flow temp.", "WP minimale Vorlauftemperatur", "", "", "", "", "", "", "temperatura minima di mandata")
MAKE_TRANSLATION(hpcooling, "cooling", "cooling", "Kühlen", "Koelen", "Kyler", "chłodzenie", "kjøling", "refroidissement", "soğuma", "raffreddamento")
// heatpump
-MAKE_TRANSLATION(airHumidity, "airhumidity", "relative air humidity", "relative Luftfeuchte", "Relatieve luchtvochtigheid", "Relativ Luftfuktighet", "wilgotność względna w pomieszczeniu", "luftfuktighet", "humidité relative air", "", "umidità relativa aria")
-MAKE_TRANSLATION(dewTemperature, "dewtemperature", "dew point temperature", "Taupunkttemperatur", "Dauwpunttemperatuur", "Daggpunkt", "punkt rosy w pomieszczeniu", "duggtemperatur", "température point rosée", "", "temperatura del punto di rugiada")
+MAKE_TRANSLATION(airHumidity, "airhumidity", "relative air humidity", "relative Luftfeuchte", "Relatieve luchtvochtigheid", "Relativ Luftfuktighet", "wilgotność względna w pomieszczeniu", "luftfuktighet", "humidité relative air", "havadaki bağıl nem", "umidità relativa aria")
+MAKE_TRANSLATION(dewTemperature, "dewtemperature", "dew point temperature", "Taupunkttemperatur", "Dauwpunttemperatuur", "Daggpunkt", "punkt rosy w pomieszczeniu", "duggtemperatur", "température point rosée", "çiğ noktası sıcaklığı", "temperatura del punto di rugiada")
// mixer
MAKE_TRANSLATION(flowSetTemp, "flowsettemp", "setpoint flow temperature", "Sollwert Vorlauftemperatur", "Streefwaarde aanvoertemperatuur", "Vald flödestemperatur", "zadana temperatura zasilania", "valgt turtemperatur", "consigne température flux", "", "Setpoint temperatura di mandata")
@@ -716,72 +718,72 @@ MAKE_TRANSLATION(energyTotal, "energytotal", "total energy", "Gesamtenergie", "T
MAKE_TRANSLATION(energyToday, "energytoday", "total energy today", "Energie heute", "Energie vandaag", "Total Energi Idag", "energia całkowita dzisiaj", "total energi i dag", "énergie totale aujourd'hui", "", "totale energia giornaliera")
// solar ww
-MAKE_TRANSLATION(wwTemp1, "wwtemp1", "temperature 1", "Temperatur 1", "Temperatuur 1", "Temperatur 1", "temperatura 1", "temperatur 1", "température 1", "", "Temperatura 1")
-MAKE_TRANSLATION(wwTemp3, "wwtemp3", "temperature 3", "Temperatur 3", "Temperatuur 2", "Temperatur 2", "temperatura 2", "Temperatur 3", "température 3", "", "Temperatura 3")
-MAKE_TRANSLATION(wwTemp4, "wwtemp4", "temperature 4", "Temperatur 4", "Temperatuur 3", "Temperatur 3", "temperatura 3", "Temperatur 4", "température 4", "", "Temperatura 4")
-MAKE_TRANSLATION(wwTemp5, "wwtemp5", "temperature 5", "Temperatur 5", "Temperatuur 5", "Temperatur 4", "temperatura 4", "Temperatur 5", "température 5", "", "Temperatura 5")
-MAKE_TRANSLATION(wwTemp7, "wwtemp7", "temperature 7", "Temperatur 7", "Temperatuur 7", "Temperatur 5", "temperatura 5", "Temperatur 7", "température 7", "", "Temperatura 7")
-MAKE_TRANSLATION(wwPump, "wwpump", "pump", "Pumpe", "Pomp", "Pump", "pompa", "pumpe", "pompe","", "Pompa")
+MAKE_TRANSLATION(wwTemp1, "wwtemp1", "temperature 1", "Temperatur 1", "Temperatuur 1", "Temperatur 1", "temperatura 1", "temperatur 1", "température 1", "sıcaklık 1", "Temperatura 1")
+MAKE_TRANSLATION(wwTemp3, "wwtemp3", "temperature 3", "Temperatur 3", "Temperatuur 2", "Temperatur 2", "temperatura 2", "Temperatur 3", "température 3", "sıcaklık 3", "Temperatura 3")
+MAKE_TRANSLATION(wwTemp4, "wwtemp4", "temperature 4", "Temperatur 4", "Temperatuur 3", "Temperatur 3", "temperatura 3", "Temperatur 4", "température 4", "sıcaklık 4", "Temperatura 4")
+MAKE_TRANSLATION(wwTemp5, "wwtemp5", "temperature 5", "Temperatur 5", "Temperatuur 5", "Temperatur 4", "temperatura 4", "Temperatur 5", "température 5", "sıcaklık 5", "Temperatura 5")
+MAKE_TRANSLATION(wwTemp7, "wwtemp7", "temperature 7", "Temperatur 7", "Temperatuur 7", "Temperatur 5", "temperatura 5", "Temperatur 7", "température 7", "sıcaklık 7", "Temperatura 7")
+MAKE_TRANSLATION(wwPump, "wwpump", "pump", "Pumpe", "Pomp", "Pump", "pompa", "pumpe", "pompe", "pompa", "Pompa")
// solar ww and mixer wwc
-MAKE_TRANSLATION(wwMinTemp, "wwmintemp", "minimum temperature", "minimale Temperatur", "Minimale temperatuur", "Min Temperatur", "temperatura minimalna", "min temperatur", "température min", "", "temperatura minima")
-MAKE_TRANSLATION(wwRedTemp, "wwredtemp", "reduced temperature", "reduzierte Temperatur", "Gereduceerde temperatuur", "Reducerad Temperatur", "temperatura zredukowana", "reducert temperatur", "température réduite", "", "temperatura ridotta")
-MAKE_TRANSLATION(wwDailyTemp, "wwdailytemp", "daily temperature", "tägl. Temperatur", "Dagelijkse temperatuur", "Daglig temperatur", "temperatura dzienna", "dagtemperatur", "température en journée", "", "temperatura giornaliera")
-MAKE_TRANSLATION(wwKeepWarm, "wwkeepwarm", "keep warm", "Warmhalten", "Warm houde", "Varmhållning", "utrzymywanie ciepła", "holde varmen", "maintenir chaleur", "", "mantenimento calore")
-MAKE_TRANSLATION(wwStatus2, "wwstatus2", "status 2", "Status 2", "Status 2", "Status 2", "status 2", "status 2", "statut 2", "", "Status 2")
-MAKE_TRANSLATION(wwPumpMod, "wwpumpmod", "pump modulation", "Pumpen Modulation", "Pompmodulatie", "Pumpmodulering", "modulacja pompy", "pumpemodulering", "modulation de pompe", "", "modulazione pompa")
-MAKE_TRANSLATION(wwFlow, "wwflow", "flow rate", "Volumenstrom", "Doorstroomsnelheid", "Flöde", "przepływ", "strømningshastighet", "débit", "", "portata flusso")
+MAKE_TRANSLATION(wwMinTemp, "wwmintemp", "minimum temperature", "minimale Temperatur", "Minimale temperatuur", "Min Temperatur", "temperatura minimalna", "min temperatur", "température min", "minimum sıcaklık", "temperatura minima")
+MAKE_TRANSLATION(wwRedTemp, "wwredtemp", "reduced temperature", "reduzierte Temperatur", "Gereduceerde temperatuur", "Reducerad Temperatur", "temperatura zredukowana", "reducert temperatur", "température réduite", "düşürülmüş sıcaklık", "temperatura ridotta")
+MAKE_TRANSLATION(wwDailyTemp, "wwdailytemp", "daily temperature", "tägl. Temperatur", "Dagelijkse temperatuur", "Daglig temperatur", "temperatura dzienna", "dagtemperatur", "température en journée", "günlük sıcaklık", "temperatura giornaliera")
+MAKE_TRANSLATION(wwKeepWarm, "wwkeepwarm", "keep warm", "Warmhalten", "Warm houde", "Varmhållning", "utrzymywanie ciepła", "holde varmen", "maintenir chaleur", "ılık tut", "mantenimento calore")
+MAKE_TRANSLATION(wwStatus2, "wwstatus2", "status 2", "Status 2", "Status 2", "Status 2", "status 2", "status 2", "statut 2", "durum 2", "Status 2")
+MAKE_TRANSLATION(wwPumpMod, "wwpumpmod", "pump modulation", "Pumpen Modulation", "Pompmodulatie", "Pumpmodulering", "modulacja pompy", "pumpemodulering", "modulation de pompe", "pompa modülasyonu", "modulazione pompa")
+MAKE_TRANSLATION(wwFlow, "wwflow", "flow rate", "Volumenstrom", "Doorstroomsnelheid", "Flöde", "przepływ", "strømningshastighet", "débit", "akış hızı", "portata flusso")
// extra mixer ww
-MAKE_TRANSLATION(wwRequiredTemp, "wwrequiredtemp", "required temperature", "benötigte Temperatur", "Benodigde temperatuur", "Nödvändig Temperatur", "temperatura wymagana", "nødvendig temperatur", "température requise", "", "temperatura richiesta")
-MAKE_TRANSLATION(wwDiffTemp, "wwdifftemp", "start differential temperature", "Start Differential Temperatur", "Start differentiele temperatuur", "Start Differentialtemperatur", "start temperatury różnicowej", "start differensialtemperatur", "température différentielle de départ", "", "avvia temperatura differenziale")
+MAKE_TRANSLATION(wwRequiredTemp, "wwrequiredtemp", "required temperature", "benötigte Temperatur", "Benodigde temperatuur", "Nödvändig Temperatur", "temperatura wymagana", "nødvendig temperatur", "température requise", "gerekli sıcaklık", "temperatura richiesta")
+MAKE_TRANSLATION(wwDiffTemp, "wwdifftemp", "start differential temperature", "Start Differential Temperatur", "Start differentiele temperatuur", "Start Differentialtemperatur", "start temperatury różnicowej", "start differensialtemperatur", "température différentielle de départ", "diferansiyel sıcaklık", "avvia temperatura differenziale")
// SM100
-MAKE_TRANSLATION(heatTransferSystem, "heattransfersystem", "heattransfer system", "Wärmeübertragungs-System", "Warmteoverdrachtssysteem", "Värmeöverföringssystem", "system wymiany ciepła", "varmeoverføringssystem", "système de transfert de chaleur", "", "sistema di trasferimento del calore")
-MAKE_TRANSLATION(externalCyl, "externalcyl", "external cylinder", "Externer Speicher", "Externe boiler", "Extern Cylinder", "zbiornik zewnętrzny", "ekstern bereder", "cylindre externe", "", "vaso accumulo esterno")
-MAKE_TRANSLATION(thermalDisinfect, "thermaldisinfect", "thermal disinfection", "Thermische Desinfektion", "Thermische desinfectie", "Termisk Desinfektion", "dezynfekcja termiczna", "termisk desinfeksjon", "désinfection thermique", "", "disinfezione termica")
-MAKE_TRANSLATION(heatMetering, "heatmetering", "heatmetering", "Wärmemessung", "warmtemeting", "Värmemätning", "pomiar ciepła", "varmemåling", "mesure de chaleur", "", "misurazione del calore")
-MAKE_TRANSLATION(solarIsEnabled, "solarenabled", "solarmodule enabled", "Solarmodul aktiviert", "Solarmodule geactiveerd", "Solmodul Aktiverad", "system solarny", "solmodul aktivert", "module solaire activé", "", "modulo solare attivato")
+MAKE_TRANSLATION(heatTransferSystem, "heattransfersystem", "heattransfer system", "Wärmeübertragungs-System", "Warmteoverdrachtssysteem", "Värmeöverföringssystem", "system wymiany ciepła", "varmeoverføringssystem", "système de transfert de chaleur", "ıs transfer sistemi", "sistema di trasferimento del calore")
+MAKE_TRANSLATION(externalCyl, "externalcyl", "external cylinder", "Externer Speicher", "Externe boiler", "Extern Cylinder", "zbiornik zewnętrzny", "ekstern bereder", "cylindre externe", "dış silindir", "vaso accumulo esterno")
+MAKE_TRANSLATION(thermalDisinfect, "thermaldisinfect", "thermal disinfection", "Thermische Desinfektion", "Thermische desinfectie", "Termisk Desinfektion", "dezynfekcja termiczna", "termisk desinfeksjon", "désinfection thermique", "ısıl temizlik", "disinfezione termica")
+MAKE_TRANSLATION(heatMetering, "heatmetering", "heatmetering", "Wärmemessung", "warmtemeting", "Värmemätning", "pomiar ciepła", "varmemåling", "mesure de chaleur", "ısı ölçümü", "misurazione del calore")
+MAKE_TRANSLATION(solarIsEnabled, "solarenabled", "solarmodule enabled", "Solarmodul aktiviert", "Solarmodule geactiveerd", "Solmodul Aktiverad", "system solarny", "solmodul aktivert", "module solaire activé", "güneş modu etkinleştirildi", "modulo solare attivato")
// telegram 0x035A
-MAKE_TRANSLATION(solarPumpMode, "solarpumpmode", "pump mode", "Solar Pumpen Einst.", "Modus zonneboilerpomp", "Sol Pumpläge", "tryb pracy pompy", "solpumpemodus", "mode pompe solaire", "", "modalità pompa solare")
-MAKE_TRANSLATION(solarPumpKick, "pumpkick", "pump kick", "Röhrenkollektorfunktion", "Modus buizencollector", "Sol Kollektorfunktion", "wspomaganie startu pompy", "solkllektorfunksjon", "démarrage boost pompe solaire", "", "avvio forzato pompa")
-MAKE_TRANSLATION(plainWaterMode, "plainwatermode", "plain water mode", "Südeuropafunktion", "Modus Zuid-Europa", "Sydeuropa-funktion", "tylko woda (dla Europy Południowej)", "vanlig vannmodus", "mode eau ordinaire", "", "modalità acqua normale")
-MAKE_TRANSLATION(doubleMatchFlow, "doublematchflow", "doublematchflow", "Double Match Flow", "Double Match Flow", "Dubbelmatchning Flöde", "przepływ podwójnie dopasowany", "dobbelmatch flow", "double match flow", "", "carico ottimizzato dell'accumulatore ad effetto termosifone ")
-MAKE_TRANSLATION(solarPump2Mode, "pump2mode", "pump 2 mode", "Pumpe 2 Modus", "Modus pomp 2", "Pump 2 Läge", "tryb pracy pompy 2", "pump 2 modus", "mode pompe 2", "", "modalità pompa 2")
-MAKE_TRANSLATION(solarPump2Kick, "pump2kick", "pump kick 2", "Pumpe 2 Startboost", "Startboost pomp 2", "Pump 2 Kollektorfunktion", "wspomaganie startu pompy 2", "startboost pumpe 2", "démarrage boost pompe 2", "", "avvio forzato pompa 2")
+MAKE_TRANSLATION(solarPumpMode, "solarpumpmode", "pump mode", "Solar Pumpen Einst.", "Modus zonneboilerpomp", "Sol Pumpläge", "tryb pracy pompy", "solpumpemodus", "mode pompe solaire", "pompa modu", "modalità pompa solare")
+MAKE_TRANSLATION(solarPumpKick, "pumpkick", "pump kick", "Röhrenkollektorfunktion", "Modus buizencollector", "Sol Kollektorfunktion", "wspomaganie startu pompy", "solkllektorfunksjon", "démarrage boost pompe solaire", "pompa zorunlu çalıştırma", "avvio forzato pompa")
+MAKE_TRANSLATION(plainWaterMode, "plainwatermode", "plain water mode", "Südeuropafunktion", "Modus Zuid-Europa", "Sydeuropa-funktion", "tylko woda (dla Europy Południowej)", "vanlig vannmodus", "mode eau ordinaire", "sadece su modu", "modalità acqua normale")
+MAKE_TRANSLATION(doubleMatchFlow, "doublematchflow", "doublematchflow", "Double Match Flow", "Double Match Flow", "Dubbelmatchning Flöde", "przepływ podwójnie dopasowany", "dobbelmatch flow", "double match flow", "doublematch akışı", "carico ottimizzato dell'accumulatore ad effetto termosifone ")
+MAKE_TRANSLATION(solarPump2Mode, "pump2mode", "pump 2 mode", "Pumpe 2 Modus", "Modus pomp 2", "Pump 2 Läge", "tryb pracy pompy 2", "pump 2 modus", "mode pompe 2", "pompa 2 modu", "modalità pompa 2")
+MAKE_TRANSLATION(solarPump2Kick, "pump2kick", "pump kick 2", "Pumpe 2 Startboost", "Startboost pomp 2", "Pump 2 Kollektorfunktion", "wspomaganie startu pompy 2", "startboost pumpe 2", "démarrage boost pompe 2", "pompa 2 zorunlu çalıştırma", "avvio forzato pompa 2")
// telegram 0x035F
-MAKE_TRANSLATION(cylPriority, "cylpriority", "cylinder priority", "Speicher Priorität", "Prioriteit boiler", "Cylinderprioritering", "priorytet cylindra", "berederprioritering", "priorité de cylindre", "", "")
+MAKE_TRANSLATION(cylPriority, "cylpriority", "cylinder priority", "Speicher Priorität", "Prioriteit boiler", "Cylinderprioritering", "priorytet cylindra", "berederprioritering", "priorité de cylindre", "silindir önceliği", "priorità vaso accumulo")
// telegram 0x380
-MAKE_TRANSLATION(climateZone, "climatezone", "climate zone", "Klimazone", "klimaatzone", "Klimatzon", "strefa klimatyczna", "klimasone", "zone de climat", "", "zona clima")
-MAKE_TRANSLATION(collector1Area, "collector1area", "collector 1 area", "Kollektor 1 Fläche", "oppervlakte collector 1", "Kollektor 1 Area", "powierzchnia kolektora 1", "kollektor 1 område", "zone collecteur 1", "", "area collettore 1")
-MAKE_TRANSLATION(collector1Type, "collector1type", "collector 1 type", "Kollektor 1 Typ", "Type collector 1", "Kollektor 1 Typ", "typ kolektora 1", "kollektor 1 type", "type collecteur 1", "", "tipo collettore 1")
-MAKE_TRANSLATION(collector2Area, "collector2area", "collector 2 area", "Kollektor 2 Fläche", "Oppervlakte collector 2", "Kollektor 2 Area", "powierzchnia kolektora 2", "kollektor 2 område", "zone collecteur 2", "", "area collettore 2")
-MAKE_TRANSLATION(collector2Type, "collector2type", "collector 2 type", "Kollektor 2 Typ", "Type collector 2", "Kollektor 2 Typ", "typ kolektora 2", "kollektor 2 type", "type collecteur 2", "", "tipo collettore 2")
+MAKE_TRANSLATION(climateZone, "climatezone", "climate zone", "Klimazone", "klimaatzone", "Klimatzon", "strefa klimatyczna", "klimasone", "zone de climat", "iklim alanı", "zona clima")
+MAKE_TRANSLATION(collector1Area, "collector1area", "collector 1 area", "Kollektor 1 Fläche", "oppervlakte collector 1", "Kollektor 1 Area", "powierzchnia kolektora 1", "kollektor 1 område", "zone collecteur 1", "kollektör 1 alan", "area collettore 1")
+MAKE_TRANSLATION(collector1Type, "collector1type", "collector 1 type", "Kollektor 1 Typ", "Type collector 1", "Kollektor 1 Typ", "typ kolektora 1", "kollektor 1 type", "type collecteur 1", "kollektör 1 tip", "tipo collettore 1")
+MAKE_TRANSLATION(collector2Area, "collector2area", "collector 2 area", "Kollektor 2 Fläche", "Oppervlakte collector 2", "Kollektor 2 Area", "powierzchnia kolektora 2", "kollektor 2 område", "zone collecteur 2", "kollektör 2 alan", "area collettore 2")
+MAKE_TRANSLATION(collector2Type, "collector2type", "collector 2 type", "Kollektor 2 Typ", "Type collector 2", "Kollektor 2 Typ", "typ kolektora 2", "kollektor 2 type", "type collecteur 2", "kollektör 2 tip", "tipo collettore 2")
// telegram 0x0363 heatCounter
-MAKE_TRANSLATION(heatCntFlowTemp, "heatcntflowtemp", "heat counter flow temperature", "Wärmezähler Vorlauf-Temperatur", "Aanvoertemperatuur warmteenergiemeter", "Värmeräknare Flödestemperatur", "temperatura zasilania ciepłomierza", "varmeenergimåler turtemperatur", "température flux compteur chaleur", "", "Temperatura di mandata del contatore di calore")
-MAKE_TRANSLATION(heatCntRetTemp, "heatcntrettemp", "heat counter return temperature", "Wärmezähler Rücklauf-Temperatur", "Retourtemperatuur warmteenergiemeter", "Värmeräknare Returtemperatur", "temperatura powrotu ciepłomierza", "varmeenergimåler returtemperatur", "température retour compteur chaleur", "", "Temperatura di ritorno del contatore di calore")
-MAKE_TRANSLATION(heatCnt, "heatcnt", "heat counter impulses", "Wärmezähler Impulse", "Warmteenergiemeter pulsen", "Värmeräknare Impuls", "liczba impulsów ciepłomierza", "varmemåler impuls", "impulsions compteur chaleur", "", "contacalore a impulsi")
-MAKE_TRANSLATION(swapFlowTemp, "swapflowtemp", "swap flow temperature (TS14)", "Austausch Vorlauf-Temperatur (TS14)", "Aanvoertemperatuur verwisselaar (TS14)", "Växlingstemperatur Flöde (TS14)", "temperatura zasilania wymiennika", "veksler turledningstemperatur (TS14)", "température flux échangeur (TS14)", "", "Scambiare la temperatura di mandata (TS14)")
-MAKE_TRANSLATION(swapRetTemp, "swaprettemp", "swap return temperature (TS15)", "Austausch Rücklauf-Temperatur (TS15)", "Retourtemperatuur verwisselaar (TS15)", "Växlingstemperatur Returflöde (TS15)", "temperatura powrotu wymiennika", "veksler returledningstemperatur (TS15)", "température retour échangeur (TS15)", "", "Scambiare la temperatura di ritorno (TS15)")
+MAKE_TRANSLATION(heatCntFlowTemp, "heatcntflowtemp", "heat counter flow temperature", "Wärmezähler Vorlauf-Temperatur", "Aanvoertemperatuur warmteenergiemeter", "Värmeräknare Flödestemperatur", "temperatura zasilania ciepłomierza", "varmeenergimåler turtemperatur", "température flux compteur chaleur", "ısı sayacı akış sıcaklığı", "Temperatura di mandata del contatore di calore")
+MAKE_TRANSLATION(heatCntRetTemp, "heatcntrettemp", "heat counter return temperature", "Wärmezähler Rücklauf-Temperatur", "Retourtemperatuur warmteenergiemeter", "Värmeräknare Returtemperatur", "temperatura powrotu ciepłomierza", "varmeenergimåler returtemperatur", "température retour compteur chaleur", "ısı sayacı dönüş sıcaklığı", "Temperatura di ritorno del contatore di calore")
+MAKE_TRANSLATION(heatCnt, "heatcnt", "heat counter impulses", "Wärmezähler Impulse", "Warmteenergiemeter pulsen", "Värmeräknare Impuls", "liczba impulsów ciepłomierza", "varmemåler impuls", "impulsions compteur chaleur", "ısı sayacı atış adedi", "contacalore a impulsi")
+MAKE_TRANSLATION(swapFlowTemp, "swapflowtemp", "swap flow temperature (TS14)", "Austausch Vorlauf-Temperatur (TS14)", "Aanvoertemperatuur verwisselaar (TS14)", "Växlingstemperatur Flöde (TS14)", "temperatura zasilania wymiennika", "veksler turledningstemperatur (TS14)", "température flux échangeur (TS14)", "değişim akış sıcaklığı(TS14)", "Scambiare la temperatura di mandata (TS14)")
+MAKE_TRANSLATION(swapRetTemp, "swaprettemp", "swap return temperature (TS15)", "Austausch Rücklauf-Temperatur (TS15)", "Retourtemperatuur verwisselaar (TS15)", "Växlingstemperatur Returflöde (TS15)", "temperatura powrotu wymiennika", "veksler returledningstemperatur (TS15)", "température retour échangeur (TS15)", "değişim dönüş sıcaklığı(TS15)", "Scambiare la temperatura di ritorno (TS15)")
// switch
-MAKE_TRANSLATION(activated, "activated", "activated", "Aktiviert", "Geactiveerd", "Aktiverad", "aktywowany", "aktivert", "activé", "", "ativato")
-MAKE_TRANSLATION(status, "status", "status", "Status", "Status", "Status", "status", "status", "statut", "", "Stato")
+MAKE_TRANSLATION(activated, "activated", "activated", "Aktiviert", "Geactiveerd", "Aktiverad", "aktywowany", "aktivert", "activé", "başladı", "attivato")
+MAKE_TRANSLATION(status, "status", "status", "Status", "Status", "Status", "status", "status", "statut", "durum", "Stato")
// RF sensor, id 0x40, telegram 0x435
-MAKE_TRANSLATION(RFTemp, "rftemp", "RF room temperature sensor", "RF Raumtemperatur Sensor", "RF ruimtetemperatuur sensor", "RF Rumsgivare Temp", "bezprzewodowy czujnik temperatury pomieszczenia", "RF romsgiver temp", "capteur de température de pièce RF", "", "Sensore di temperatura ambiente RF")
+MAKE_TRANSLATION(RFTemp, "rftemp", "RF room temperature sensor", "RF Raumtemperatur Sensor", "RF ruimtetemperatuur sensor", "RF Rumsgivare Temp", "bezprzewodowy czujnik temperatury pomieszczenia", "RF romsgiver temp", "capteur de température de pièce RF", "RF oda sıcaklık sensörü", "Sensore di temperatura ambiente RF")
// ventilation
-MAKE_TRANSLATION(outFresh, "outfresh", "outdoor fresh air", "Außenlufttemp.", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(inFresh, "infresh", "indoor fresh air", "Zulufttemp.", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(outEx, "outexhaust", "outdoor exhaust air", "Fortlufttemp.", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(inEx, "inexhaust", "indoor exhaust air", "Ablufttemp.", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(ventMode, "ventmode", "ventilation mode", "Belüftungsmodus", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(ventInSpeed, "ventinspeed", "in blower speed", "Zuluft-Drehzahl", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(ventOutSpeed, "ventoutspeed", "out blower speed", "Abluft-Drehzahl", "", "", "", "", "", "", "") // TODO translate
-MAKE_TRANSLATION(airquality, "airquality", "air quality (voc)", "Luftqualität (VOC)", "", "", "", "", "", "", "") // TODO translate
+MAKE_TRANSLATION(outFresh, "outfresh", "outdoor fresh air", "Außenlufttemp.", "", "", "", "", "", "dış ortam taze hava", "aria fresca esterna") // TODO translate
+MAKE_TRANSLATION(inFresh, "infresh", "indoor fresh air", "Zulufttemp.", "", "", "", "", "", "iç ortam taze hava", "aria fresca interna") // TODO translate
+MAKE_TRANSLATION(outEx, "outexhaust", "outdoor exhaust air", "Fortlufttemp.", "", "", "", "", "", "dış ortam egsoz", "aria di scarico esterna") // TODO translate
+MAKE_TRANSLATION(inEx, "inexhaust", "indoor exhaust air", "Ablufttemp.", "", "", "", "", "", "iç ortam egsoz", "aria di scarico interna") // TODO translate
+MAKE_TRANSLATION(ventMode, "ventmode", "ventilation mode", "Belüftungsmodus", "", "", "", "", "", "havalandırma modu", "modalità di ventilazione") // TODO translate
+MAKE_TRANSLATION(ventInSpeed, "ventinspeed", "in blower speed", "Zuluft-Drehzahl", "", "", "", "", "", "iç fan hızı", "velocità aria di alimentazione") // TODO translate
+MAKE_TRANSLATION(ventOutSpeed, "ventoutspeed", "out blower speed", "Abluft-Drehzahl", "", "", "", "", "", "dış fan hızı", "velocità aria di scarico") // TODO translate
+MAKE_TRANSLATION(airquality, "airquality", "air quality (voc)", "Luftqualität (VOC)", "", "", "", "", "", "hava kalitesi(voc)", "qualità aria (VOC)") // TODO translate
/*
// unknown fields to track (SM10), only for testing
@@ -795,4 +797,4 @@ MAKE_TRANSLATION(setting3, "setting3", "unknown setting 3")
MAKE_TRANSLATION(setting4, "setting4", "unknown setting 4")
*/
-// clang-format on
\ No newline at end of file
+// clang-format on
diff --git a/src/mqtt.cpp b/src/mqtt.cpp
index 609a82fa9..f944b1113 100644
--- a/src/mqtt.cpp
+++ b/src/mqtt.cpp
@@ -23,7 +23,7 @@
namespace emsesp {
-espMqttClient * Mqtt::mqttClient_;
+MqttClient * Mqtt::mqttClient_;
// static parameters we make global
std::string Mqtt::mqtt_base_;
@@ -58,8 +58,9 @@ uint8_t Mqtt::connectcount_ = 0;
uint32_t Mqtt::mqtt_message_id_ = 0;
char will_topic_[Mqtt::MQTT_TOPIC_MAX_SIZE]; // because MQTT library keeps only char pointer
-std::string Mqtt::lasttopic_ = "";
-std::string Mqtt::lastpayload_ = "";
+std::string Mqtt::lasttopic_ = "";
+std::string Mqtt::lastpayload_ = "";
+std::string Mqtt::lastresponse_ = "";
// Home Assistant specific
// icons from https://materialdesignicons.com used with the UOMs (unit of measurements)
@@ -202,7 +203,7 @@ void Mqtt::show_mqtt(uuid::console::Shell & shell) {
// simulate receiving a MQTT message, used only for testing
void Mqtt::incoming(const char * topic, const char * payload) {
if (payload != nullptr) {
- on_message(topic, payload, strlen(payload));
+ on_message(topic, (const uint8_t *) payload, strlen(payload));
}
}
#endif
@@ -210,13 +211,13 @@ void Mqtt::incoming(const char * topic, const char * payload) {
// received an MQTT message that we subscribed too
// topic is the full path
// payload is json or a single string and converted to a json with key 'value'
-void Mqtt::on_message(const char * topic, const char * payload, size_t len) const {
- // sometimes the payload is not terminated correctly, so make a copy
+void Mqtt::on_message(const char * topic, const uint8_t * payload, size_t len) const {
+ // the payload is not terminated
// convert payload to a null-terminated char string
- char message[len + 2] = {'\0'};
- if (payload != nullptr) {
- strlcpy(message, payload, len + 1);
- }
+ // see https://www.emelis.net/espMqttClient/#code-samples
+ char message[len + 1];
+ memcpy(message, payload, len);
+ message[len] = '\0';
#if defined(EMSESP_DEBUG)
if (len) {
@@ -249,9 +250,7 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) cons
if ((!strcmp(topic, full_topic)) && (mf.mqtt_subfunction_)) {
if (!(mf.mqtt_subfunction_)(message)) {
LOG_ERROR("error: invalid payload %s for this topic %s", message, topic);
- if (send_response_) {
- Mqtt::queue_publish("response", "error: invalid data");
- }
+ Mqtt::queue_publish("response", "error: invalid data");
}
return;
}
@@ -284,14 +283,10 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) cons
snprintf(error, sizeof(error), "Call failed with error code (%s)", Command::return_code_string(return_code).c_str());
}
LOG_ERROR(error);
- if (send_response_) {
- Mqtt::queue_publish("response", error);
- }
+ Mqtt::queue_publish("response", error);
} else {
// all good, send back json output from call
- if (send_response_) {
- Mqtt::queue_publish("response", output);
- }
+ Mqtt::queue_publish("response", output);
}
}
@@ -315,7 +310,7 @@ void Mqtt::show_topic_handlers(uuid::console::Shell & shell, const uint8_t devic
// called when an MQTT Publish ACK is received
void Mqtt::on_publish(uint16_t packetId) const {
- LOG_DEBUG("Packet %d sent successfull", packetId);
+ LOG_DEBUG("Packet %d sent successful", packetId);
}
// called when MQTT settings have changed via the Web forms
@@ -387,18 +382,12 @@ void Mqtt::start() {
snprintf(will_topic, MQTT_TOPIC_MAX_SIZE, "status");
}
- mqttClient_->setWill(will_topic, 1, true, "offline"); // with qos 1, retain true
+ EMSESP::esp8266React.setWill(will_topic); // with qos 1, retain true
- mqttClient_->onMessage(
+ EMSESP::esp8266React.onMessage(
[this](const espMqttClientTypes::MessageProperties & properties, const char * topic, const uint8_t * payload, size_t len, size_t index, size_t total) {
- on_message(topic, (const char *)payload, len); // receiving mqtt
+ on_message(topic, payload, len); // receiving mqtt
});
-
- /*
- mqttClient_->onPublish([this](uint16_t packetId) {
- on_publish(packetId); // publish
- });
- */
}
void Mqtt::set_publish_time_boiler(uint16_t publish_time) {
@@ -479,7 +468,7 @@ void Mqtt::on_disconnect(espMqttClientTypes::DisconnectReason reason) {
}
}
-// MQTT onConnect - when an MQTT connect is established
+// MQTT on_connect - when an MQTT connect is established
void Mqtt::on_connect() {
if (connecting_) {
return; // prevent duplicated connections
@@ -527,7 +516,7 @@ void Mqtt::ha_status() {
StaticJsonDocument doc;
char uniq[70];
- if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == entityFormat::MULTI_SHORT) {
snprintf(uniq, sizeof(uniq), "%s_system_status", mqtt_basename_.c_str());
} else {
strcpy(uniq, "system_status");
@@ -588,9 +577,16 @@ void Mqtt::ha_status() {
// add sub or pub task to the queue.
// the base is not included in the topic
bool Mqtt::queue_message(const uint8_t operation, const std::string & topic, const std::string & payload, const bool retain) {
- if (topic.empty()) {
- return false;
+ if (topic == "response" && operation == Operation::PUBLISH) {
+ lastresponse_ = payload;
+ if (!send_response_) {
+ return true;
+ }
}
+ if (!mqtt_enabled_ || topic.empty()) {
+ return false; // quit, not using MQTT
+ }
+
uint16_t packet_id = 0;
char fulltopic[MQTT_TOPIC_MAX_SIZE];
@@ -621,9 +617,6 @@ bool Mqtt::queue_message(const uint8_t operation, const std::string & topic, con
// add MQTT message to queue, payload is a string
bool Mqtt::queue_publish_message(const std::string & topic, const std::string & payload, const bool retain) {
- if (!enabled()) {
- return false;
- };
return queue_message(Operation::PUBLISH, topic, payload, retain);
}
@@ -672,8 +665,9 @@ bool Mqtt::queue_publish_retain(const std::string & topic, const JsonObject & pa
}
bool Mqtt::queue_publish_retain(const char * topic, const JsonObject & payload, const bool retain) {
- if (enabled() && payload.size()) {
+ if (payload.size()) {
std::string payload_text;
+ payload_text.reserve(measureJson(payload) + 1);
serializeJson(payload, payload_text); // convert json to string
return queue_publish_message(topic, payload_text, retain);
}
@@ -682,10 +676,6 @@ bool Mqtt::queue_publish_retain(const char * topic, const JsonObject & payload,
// publish empty payload to remove the topic
bool Mqtt::queue_remove_topic(const char * topic) {
- if (!enabled()) {
- return false;
- }
-
if (ha_enabled_) {
return queue_publish_message(Mqtt::discovery_prefix() + topic, "", true); // publish with retain to remove from broker
} else {
@@ -804,10 +794,10 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
// build unique identifier also used as object_id which also becomes the Entity ID in HA
char uniq_id[80];
- if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == entityFormat::MULTI_SHORT) {
// prefix base name to each uniq_id and use the shortname
snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag);
- } else if (Mqtt::entity_format() == entitiyFormat::SINGLE_SHORT) {
+ } else if (Mqtt::entity_format() == entityFormat::SINGLE_SHORT) {
// shortname, no mqtt base. This is the default version.
snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, entity_with_tag);
} else {
@@ -1171,7 +1161,7 @@ bool Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp,
snprintf(name_s, sizeof(name_s), "Hc%d", hc_num);
- if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == entityFormat::MULTI_SHORT) {
snprintf(uniq_id_s, sizeof(uniq_id_s), "%s_thermostat_hc%d", mqtt_basename_.c_str(), hc_num); // add basename
} else {
snprintf(uniq_id_s, sizeof(uniq_id_s), "thermostat_hc%d", hc_num); // backward compatible with v3.4
diff --git a/src/mqtt.h b/src/mqtt.h
index a6f54ee8d..8a02c0903 100644
--- a/src/mqtt.h
+++ b/src/mqtt.h
@@ -36,7 +36,7 @@ using mqtt_sub_function_p = std::function;
class Mqtt {
public:
enum discoveryType : uint8_t { HOMEASSISTANT, DOMOTICZ };
- enum entitiyFormat : uint8_t { SINGLE_LONG, SINGLE_SHORT, MULTI_SHORT };
+ enum entityFormat : uint8_t { SINGLE_LONG, SINGLE_SHORT, MULTI_SHORT };
void loop();
void start();
@@ -104,14 +104,10 @@ class Mqtt {
#endif
static bool connected() {
-#if defined(EMSESP_STANDALONE)
- return true;
-#else
return mqttClient_->connected();
-#endif
}
- static espMqttClient * client() {
+ static MqttClient * client() {
return mqttClient_;
}
@@ -205,12 +201,8 @@ class Mqtt {
ha_climate_reset_ = reset;
}
- static bool send_response() {
- return send_response_;
- }
-
- static void send_response(bool send_response) {
- send_response_ = send_response;
+ static std::string get_response() {
+ return lastresponse_;
}
void set_qos(uint8_t mqtt_qos) const {
@@ -229,8 +221,8 @@ class Mqtt {
private:
static uuid::log::Logger logger_;
- static espMqttClient * mqttClient_;
- static uint32_t mqtt_message_id_;
+ static MqttClient * mqttClient_;
+ static uint32_t mqtt_message_id_;
static bool queue_message(const uint8_t operation, const std::string & topic, const std::string & payload, const bool retain);
static bool queue_publish_message(const std::string & topic, const std::string & payload, const bool retain);
@@ -238,7 +230,7 @@ class Mqtt {
static void queue_unsubscribe_message(const std::string & topic);
void on_publish(uint16_t packetId) const;
- void on_message(const char * topic, const char * payload, size_t len) const;
+ void on_message(const char * topic, const uint8_t * payload, size_t len) const;
// function handlers for MQTT subscriptions
struct MQTTSubFunction {
@@ -255,7 +247,7 @@ class Mqtt {
static std::vector mqtt_subfunctions_; // list of mqtt subscribe callbacks for all devices
- uint32_t last_mqtt_poll_ = 0;
+ // uint32_t last_mqtt_poll_ = 0;
uint32_t last_publish_boiler_ = 0;
uint32_t last_publish_thermostat_ = 0;
uint32_t last_publish_solar_ = 0;
@@ -263,7 +255,7 @@ class Mqtt {
uint32_t last_publish_other_ = 0;
uint32_t last_publish_sensor_ = 0;
uint32_t last_publish_heartbeat_ = 0;
- uint32_t last_publish_queue_ = 0;
+ // uint32_t last_publish_queue_ = 0;
static bool connecting_;
static bool initialized_;
@@ -274,6 +266,7 @@ class Mqtt {
static std::string lasttopic_;
static std::string lastpayload_;
+ static std::string lastresponse_;
// settings, copied over
static std::string mqtt_base_;
diff --git a/src/shower.cpp b/src/shower.cpp
index 477230671..06432200f 100644
--- a/src/shower.cpp
+++ b/src/shower.cpp
@@ -148,14 +148,12 @@ void Shower::set_shower_state(bool state, bool force) {
// send out HA MQTT Discovery config topic
if ((Mqtt::ha_enabled()) && (!ha_configdone_ || force)) {
- ha_configdone_ = true;
-
StaticJsonDocument doc;
doc["name"] = "Shower Active";
char str[70];
- if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == Mqtt::entityFormat::MULTI_SHORT) {
snprintf(str, sizeof(str), "%s_shower_active", Mqtt::basename().c_str());
} else {
snprintf(str, sizeof(str), "shower_active"); // v3.4 compatible
@@ -189,7 +187,7 @@ void Shower::set_shower_state(bool state, bool force) {
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
snprintf(topic, sizeof(topic), "binary_sensor/%s/shower_active/config", Mqtt::basename().c_str());
- Mqtt::queue_ha(topic, doc.as()); // publish the config payload with retain flag
+ ha_configdone_ = Mqtt::queue_ha(topic, doc.as()); // publish the config payload with retain flag
}
}
diff --git a/src/system.cpp b/src/system.cpp
index 392861e6b..da51825a8 100644
--- a/src/system.cpp
+++ b/src/system.cpp
@@ -98,6 +98,18 @@ bool System::command_send(const char * value, const int8_t id) {
return EMSESP::txservice_.send_raw(value); // ignore id
}
+bool System::command_response(const char * value, const int8_t id, JsonObject & output) {
+ DynamicJsonDocument doc(EMSESP_JSON_SIZE_LARGE);
+ if (DeserializationError::Ok == deserializeJson(doc, Mqtt::get_response())) {
+ for (JsonPair p : doc.as()) {
+ output[p.key()] = p.value();
+ }
+ } else {
+ output["response"] = Mqtt::get_response();
+ }
+ return true;
+}
+
// fetch device values
bool System::command_fetch(const char * value, const int8_t id) {
std::string value_s;
@@ -536,7 +548,7 @@ void System::loop() {
// send MQTT info topic appended with the version information as JSON, as a retained flag
void System::send_info_mqtt(const char * event_str, bool send_ntp) {
- // use dynamic json becaues it is called from NTP-callback from lwip task with small stack
+ // use dynamic json because it is called from NTP-callback from lwip task with small stack
DynamicJsonDocument doc = DynamicJsonDocument(EMSESP_JSON_SIZE_MEDIUM);
doc["event"] = event_str;
doc["version"] = EMSESP_APP_VERSION;
@@ -753,6 +765,7 @@ void System::commands_init() {
// these commands will return data in JSON format
Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, FL_(system_info_cmd));
Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, FL_(commands_cmd));
+ Command::add(EMSdevice::DeviceType::SYSTEM, F("response"), System::command_response, FL_(commands_response));
// MQTT subscribe "ems-esp/system/#"
Mqtt::subscribe(EMSdevice::DeviceType::SYSTEM, "system/#", nullptr); // use empty function callback
@@ -1437,6 +1450,8 @@ bool System::load_board_profile(std::vector & data, const std::string &
data = {15, 7, 11, 12, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // Lolin S2 Mini
} else if (board_profile == "S3MINI") {
data = {17, 18, 8, 5, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // Liligo S3
+ } else if (board_profile == "S32S3") {
+ data = {2, 18, 5, 17, 0, PHY_type::PHY_TYPE_NONE, 0, 0, 0}; // BBQKees Gateway S3
} else if (board_profile == "CUSTOM") {
// send back current values
data = {(int8_t)EMSESP::system_.led_gpio_,
@@ -1503,7 +1518,7 @@ std::string System::reset_reason(uint8_t cpu) const {
break;
}
#endif
- return ("Unkonwn");
+ return ("Unknown");
}
#pragma GCC diagnostic pop
diff --git a/src/system.h b/src/system.h
index b2ae9c1ff..8d20cfb09 100644
--- a/src/system.h
+++ b/src/system.h
@@ -59,6 +59,7 @@ class System {
static bool command_watch(const char * value, const int8_t id);
static bool command_info(const char * value, const int8_t id, JsonObject & output);
static bool command_commands(const char * value, const int8_t id, JsonObject & output);
+ static bool command_response(const char * value, const int8_t id, JsonObject & output);
#if defined(EMSESP_TEST)
static bool command_test(const char * value, const int8_t id);
#endif
diff --git a/src/telegram.cpp b/src/telegram.cpp
index 402590660..2a89cff71 100644
--- a/src/telegram.cpp
+++ b/src/telegram.cpp
@@ -512,11 +512,16 @@ void TxService::add(uint8_t operation, const uint8_t * data, const uint8_t lengt
operation = Telegram::Operation::NONE; // do not check reply/ack for other ids
} else if (dest & 0x80) {
operation = Telegram::Operation::TX_READ;
+ EMSESP::set_response_id(type_id);
+ // trigger read of all parts of telegram if requested length is more than 32
+ // compatibility to earlier versions
+ if (message_data[0] >= 32) {
+ EMSESP::set_read_id(type_id);
+ }
} else {
operation = Telegram::Operation::TX_WRITE;
validate_id = type_id;
}
- EMSESP::set_read_id(type_id);
}
auto telegram = std::make_shared(operation, src, dest, type_id, offset, message_data, message_length); // operation is TX_WRITE or TX_READ
@@ -546,16 +551,14 @@ void TxService::add(uint8_t operation, const uint8_t * data, const uint8_t lengt
}
// send a Tx telegram to request data from an EMS device
-void TxService::read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t length) {
+void TxService::read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset, const uint8_t length, const bool front) {
LOG_DEBUG("Tx read request to device 0x%02X for type ID 0x%02X", dest, type_id);
uint8_t message_data = (type_id > 0xFF) ? (EMS_MAX_TELEGRAM_MESSAGE_LENGTH - 2) : EMS_MAX_TELEGRAM_MESSAGE_LENGTH;
- // if length set, publish result and set telegram to front
- if (length) {
+ if (length > 0 && length < message_data) {
message_data = length;
- EMSESP::set_read_id(type_id);
}
- add(Telegram::Operation::TX_READ, dest, type_id, offset, &message_data, 1, 0, length != 0);
+ add(Telegram::Operation::TX_READ, dest, type_id, offset, &message_data, 1, 0, front);
}
// Send a raw telegram to the bus, telegram is a text string of hex values
@@ -566,32 +569,16 @@ bool TxService::send_raw(const char * telegram_data) {
// since the telegram data is a const, make a copy. add 1 to grab the \0 EOS
char telegram[EMS_MAX_TELEGRAM_LENGTH * 3];
- for (uint8_t i = 0; i < strlen(telegram_data); i++) {
- telegram[i] = telegram_data[i];
- }
- telegram[strlen(telegram_data)] = '\0'; // make sure its terminated
+ strlcpy(telegram, telegram_data, sizeof(telegram));
uint8_t count = 0;
- char * p;
- char value[10] = {0};
-
uint8_t data[EMS_MAX_TELEGRAM_LENGTH];
- // get first value, which should be the src
- if ((p = strtok(telegram, " ,"))) { // delimiter
- strlcpy(value, p, sizeof(value));
- data[0] = (uint8_t)strtol(value, 0, 16);
- } else {
- return false;
- }
-
- // and iterate until end
- while (p != 0) {
- if ((p = strtok(nullptr, " ,"))) {
- strlcpy(value, p, sizeof(value));
- auto val = (uint8_t)strtol(value, 0, 16);
- data[++count] = val;
- }
+ // get values
+ char * p = strtok(telegram, " ,"); // delimiter
+ while (p != nullptr) {
+ data[count++] = (uint8_t)strtol(p, 0, 16);
+ p = strtok(nullptr, " ,");
}
// check valid length
@@ -599,7 +586,7 @@ bool TxService::send_raw(const char * telegram_data) {
return false;
}
- add(Telegram::Operation::TX_RAW, data, count + 1, 0, true); // add to top/front of Tx queue
+ add(Telegram::Operation::TX_RAW, data, count, 0, true); // add to top/front of Tx queue
return true;
}
diff --git a/src/telegram.h b/src/telegram.h
index d56037703..bcf9c3e7b 100644
--- a/src/telegram.h
+++ b/src/telegram.h
@@ -317,7 +317,7 @@ class TxService : public EMSbus {
const uint16_t validateid,
const bool front = false);
void add(const uint8_t operation, const uint8_t * data, const uint8_t length, const uint16_t validateid, const bool front = false);
- void read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset = 0, const uint8_t length = 0);
+ void read_request(const uint16_t type_id, const uint8_t dest, const uint8_t offset = 0, const uint8_t length = 0, const bool readId = false);
bool send_raw(const char * telegram_data);
void send_poll() const;
void retry_tx(const uint8_t operation, const uint8_t * data, const uint8_t length);
diff --git a/src/temperaturesensor.cpp b/src/temperaturesensor.cpp
index a13b848db..33f1394b5 100644
--- a/src/temperaturesensor.cpp
+++ b/src/temperaturesensor.cpp
@@ -528,7 +528,7 @@ void TemperatureSensor::publish_values(const bool force) {
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else -55}}";
char uniq_s[70];
- if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) {
+ if (Mqtt::entity_format() == Mqtt::entityFormat::MULTI_SHORT) {
snprintf(uniq_s, sizeof(uniq_s), "%s_temperaturesensor_%s", Mqtt::basename().c_str(), sensor.id().c_str());
} else {
snprintf(uniq_s, sizeof(uniq_s), "temperaturesensor_%s", sensor.id().c_str());
@@ -555,9 +555,7 @@ void TemperatureSensor::publish_values(const bool force) {
snprintf(topic, sizeof(topic), "sensor/%s/temperaturesensor_%s/config", Mqtt::basename().c_str(), sensorid.c_str());
- Mqtt::queue_ha(topic, config.as());
-
- sensor.ha_registered = true;
+ sensor.ha_registered = Mqtt::queue_ha(topic, config.as());
}
}
}
diff --git a/src/test/test.cpp b/src/test/test.cpp
index 7792a1efd..556500516 100644
--- a/src/test/test.cpp
+++ b/src/test/test.cpp
@@ -613,7 +613,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
Mqtt::ha_enabled(false);
Mqtt::nested_format(1);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
run_test("boiler");
// run_test("thermostat");
@@ -633,7 +633,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
Mqtt::ha_enabled(true);
Mqtt::nested_format(1);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
run_test("boiler");
run_test("thermostat");
@@ -703,7 +703,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
shell.printfln("Testing custom entities");
Mqtt::ha_enabled(true);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
run_test("thermostat");
@@ -734,7 +734,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
shell.printfln("Testing masked entities");
Mqtt::ha_enabled(true);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
run_test("boiler");
@@ -759,7 +759,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
shell.printfln("Testing device value lost");
Mqtt::ha_enabled(true);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
run_test("boiler");
@@ -780,7 +780,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
shell.printfln("Testing API getting values");
Mqtt::ha_enabled(false);
Mqtt::nested_format(1);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
// EMSESP::bool_format(BOOL_FORMAT_10); // BOOL_FORMAT_10_STR
EMSESP::system_.bool_format(BOOL_FORMAT_TRUEFALSE); // BOOL_FORMAT_TRUEFALSE_STR
@@ -813,7 +813,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
shell.printfln("Testing MQTT incoming changes");
Mqtt::ha_enabled(false);
Mqtt::nested_format(1);
- Mqtt::send_response(false);
+ // Mqtt::send_response(false);
EMSESP::system_.bool_format(BOOL_FORMAT_10); // BOOL_FORMAT_10_STR
// EMSESP::bool_format(BOOL_FORMAT_TRUEFALSE); // BOOL_FORMAT_TRUEFALSE_STR
@@ -851,7 +851,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
// Mqtt::ha_enabled(false);
Mqtt::nested_format(1);
- Mqtt::send_response(true);
+ // Mqtt::send_response(true);
run_test("boiler");
run_test("thermostat");
@@ -1001,14 +1001,14 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
EMSESP::mqtt_.incoming("ems-esp/thermostat/hc2/mode", "auto");
EMSESP::mqtt_.incoming("ems-esp/thermostat/wwc3/mode", "auto");
EMSESP::mqtt_.incoming("ems-esp/boiler/wwcircpump", "off");
- EMSESP::mqtt_.incoming("ems-esp/thermostat/seltemp"); // empty payload, sends reponse
+ EMSESP::mqtt_.incoming("ems-esp/thermostat/seltemp"); // empty payload
EMSESP::mqtt_.incoming("ems-esp/thermostat_hc1", "22"); // HA only
EMSESP::mqtt_.incoming("ems-esp/thermostat_hc1", "off"); // HA only
EMSESP::mqtt_.incoming("ems-esp/system/send", "11 12 13");
- EMSESP::mqtt_.incoming("ems-esp/boiler/syspress"); // empty payload, sends reponse
- EMSESP::mqtt_.incoming("ems-esp/thermostat/mode"); // empty payload, sends reponse
+ EMSESP::mqtt_.incoming("ems-esp/boiler/syspress"); // empty payload
+ EMSESP::mqtt_.incoming("ems-esp/thermostat/mode"); // empty payload
EMSESP::mqtt_.incoming("ems-esp/system/publish");
- EMSESP::mqtt_.incoming("ems-esp/thermostat/seltemp"); // empty payload, sends reponse
+ EMSESP::mqtt_.incoming("ems-esp/thermostat/seltemp"); // empty payload
EMSESP::mqtt_.incoming("ems-esp/boiler/wwseltemp", "59");
EMSESP::mqtt_.incoming("ems-esp/boiler/wwseltemp");
@@ -1022,7 +1022,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const
// check extended MQTT base
Mqtt::base("home/cellar/heating");
- EMSESP::mqtt_.incoming("home/cellar/heating/thermostat/mode"); // empty payload, sends reponse
+ EMSESP::mqtt_.incoming("home/cellar/heating/thermostat/mode"); // empty payload
// Web API TESTS
AsyncWebServerRequest request;
diff --git a/src/version.h b/src/version.h
index 70ce71c7e..643cc8a39 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define EMSESP_APP_VERSION "3.6.0-dev.13b"
+#define EMSESP_APP_VERSION "3.6.0-dev.13e"
diff --git a/src/web/WebEntityService.cpp b/src/web/WebEntityService.cpp
index 12f4e7446..3b31e653f 100644
--- a/src/web/WebEntityService.cpp
+++ b/src/web/WebEntityService.cpp
@@ -30,7 +30,7 @@ WebEntityService::WebEntityService(AsyncWebServer * server, FS * fs, SecurityMan
// load the settings when the service starts
void WebEntityService::begin() {
_fsPersistence.readFromFS();
- EMSESP::logger().info("Starting custom entity service");
+ EMSESP::logger().info("Starting Custom entity service");
}
// this creates the entity file, saving it to the FS
@@ -90,7 +90,6 @@ StateUpdateResult WebEntity::update(JsonObject & root, WebEntity & webEntity) {
entityItem.factor = 1;
}
webEntity.entityItems.push_back(entityItem); // add to list
-
if (entityItem.writeable) {
Command::add(
EMSdevice::DeviceType::CUSTOM,
@@ -111,7 +110,21 @@ bool WebEntityService::command_setvalue(const char * value, const std::string na
EMSESP::webEntityService.read([&](WebEntity & webEntity) { entityItems = &webEntity.entityItems; });
for (EntityItem & entityItem : *entityItems) {
if (Helpers::toLower(entityItem.name) == Helpers::toLower(name)) {
- if (entityItem.value_type == DeviceValueType::BOOL) {
+ if (entityItem.value_type == DeviceValueType::STRING) {
+ char telegram[84];
+ strlcpy(telegram, value, sizeof(telegram));
+ uint8_t data[EMS_MAX_TELEGRAM_LENGTH];
+ uint8_t count = 0;
+ char * p = strtok(telegram, " ,"); // delimiter
+ while (p != nullptr) {
+ data[count++] = (uint8_t)strtol(p, 0, 16);
+ p = strtok(nullptr, " ,");
+ }
+ if (count == 0) {
+ return false;
+ }
+ EMSESP::send_write_request(entityItem.type_id, entityItem.device_id, entityItem.offset, data, count, 0);
+ } else if (entityItem.value_type == DeviceValueType::BOOL) {
bool v;
if (!Helpers::value2bool(value, v)) {
return false;
@@ -188,6 +201,11 @@ void WebEntityService::render_value(JsonObject & output, EntityItem entity, cons
output[name] = serialized(Helpers::render_value(payload, entity.factor * entity.value, 2));
}
break;
+ case DeviceValueType::STRING:
+ if (entity.data.length() > 0) {
+ output[name] = entity.data;
+ }
+ break;
default:
// EMSESP::logger().warning("unknown value type");
break;
@@ -226,12 +244,22 @@ bool WebEntityService::get_value_info(JsonObject & output, const char * cmd) {
}
for (const auto & entity : *entityItems) {
if (Helpers::toLower(entity.name) == Helpers::toLower(command_s)) {
- output["name"] = entity.name;
- output["uom"] = EMSdevice::uom_to_string(entity.uom);
- output["type"] = entity.value_type == DeviceValueType::BOOL ? "boolean" : F_(number);
+ output["name"] = entity.name;
+ if (entity.uom > 0) {
+ output["uom"] = EMSdevice::uom_to_string(entity.uom);
+ }
+ output["type"] = entity.value_type == DeviceValueType::BOOL ? "boolean" : entity.value_type == DeviceValueType::STRING ? "string" : F_(number);
output["readable"] = true;
output["writeable"] = entity.writeable;
output["visible"] = true;
+ output["device_id"] = Helpers::hextoa(entity.device_id);
+ output["type_id"] = Helpers::hextoa(entity.type_id);
+ output["offset"] = entity.offset;
+ if (entity.value_type != DeviceValueType::BOOL && entity.value_type != DeviceValueType::STRING) {
+ output["factor"] = entity.factor;
+ } else if (entity.value_type == DeviceValueType::STRING) {
+ output["bytes"] = (uint8_t)entity.factor;
+ }
render_value(output, entity, true);
if (attribute_s) {
if (output.containsKey(attribute_s)) {
@@ -317,6 +345,8 @@ void WebEntityService::publish(const bool force) {
if (entityItem.writeable) {
if (entityItem.value_type == DeviceValueType::BOOL) {
snprintf(topic, sizeof(topic), "switch/%s/custom_%s/config", Mqtt::basename().c_str(), entityItem.name.c_str());
+ } else if (entityItem.value_type == DeviceValueType::STRING) {
+ snprintf(topic, sizeof(topic), "sensor/%s/custom_%s/config", Mqtt::basename().c_str(), entityItem.name.c_str());
} else if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
snprintf(topic, sizeof(topic), "number/%s/custom_%s/config", Mqtt::basename().c_str(), entityItem.name.c_str());
} else {
@@ -402,7 +432,7 @@ void WebEntityService::generate_value_web(JsonObject & output) {
obj["u"] = entity.uom;
if (entity.writeable) {
obj["c"] = entity.name;
- if (entity.value_type != DeviceValueType::BOOL) {
+ if (entity.value_type != DeviceValueType::BOOL && entity.value_type != DeviceValueType::STRING) {
char s[10];
obj["s"] = Helpers::render_value(s, entity.factor, 1);
}
@@ -443,9 +473,15 @@ void WebEntityService::generate_value_web(JsonObject & output) {
obj["v"] = Helpers::transformNumFloat(entity.factor * entity.value, 0);
}
break;
+ case DeviceValueType::STRING:
+ if (entity.data.length() > 0) {
+ obj["v"] = entity.data;
+ }
+ break;
default:
break;
}
+ // show only entities with value or command
if (!obj.containsKey("v") && !obj.containsKey("c")) {
data.remove(index);
} else {
@@ -457,8 +493,12 @@ void WebEntityService::generate_value_web(JsonObject & output) {
// fetch telegram, called from emsesp::fetch
void WebEntityService::fetch() {
EMSESP::webEntityService.read([&](WebEntity & webEntity) { entityItems = &webEntity.entityItems; });
+ const uint8_t len[] = {1, 1, 1, 2, 2, 3, 3};
for (auto & entity : *entityItems) {
- EMSESP::send_read_request(entity.type_id, entity.device_id, entity.offset);
+ EMSESP::send_read_request(entity.type_id,
+ entity.device_id,
+ entity.offset,
+ entity.value_type == DeviceValueType::STRING ? (uint8_t)entity.factor : len[entity.value_type]);
}
// EMSESP::logger().debug("fetch custom entities");
}
@@ -470,8 +510,20 @@ bool WebEntityService::get_value(std::shared_ptr telegram) {
// read-length of BOOL, INT, UINT, SHORT, USHORT, ULONG, TIME
const uint8_t len[] = {1, 1, 1, 2, 2, 3, 3};
for (auto & entity : *entityItems) {
- if (telegram->type_id == entity.type_id && telegram->src == entity.device_id && telegram->offset <= entity.offset
- && (telegram->offset + telegram->message_length) >= (entity.offset + len[entity.value_type])) {
+ if (entity.value_type == DeviceValueType::STRING && telegram->type_id == entity.type_id && telegram->src == entity.device_id
+ && telegram->offset == entity.offset) {
+ auto data = Helpers::data_to_hex(telegram->message_data, telegram->message_length);
+ if (entity.data != data) {
+ entity.data = data;
+ if (Mqtt::publish_single()) {
+ publish_single(entity);
+ } else if (EMSESP::mqtt_.get_publish_onchange(0)) {
+ has_change = true;
+ }
+ }
+ }
+ if (entity.value_type != DeviceValueType::STRING && telegram->type_id == entity.type_id && telegram->src == entity.device_id
+ && telegram->offset <= entity.offset && (telegram->offset + telegram->message_length) >= (entity.offset + len[entity.value_type])) {
uint32_t value = 0;
for (uint8_t i = 0; i < len[entity.value_type]; i++) {
value = (value << 8) + telegram->message_data[i + entity.offset - telegram->offset];
@@ -485,7 +537,6 @@ bool WebEntityService::get_value(std::shared_ptr telegram) {
}
}
// EMSESP::logger().debug("custom entity %s received with value %d", entity.name.c_str(), (int)entity.val);
- break;
}
}
if (has_change) {
diff --git a/src/web/WebEntityService.h b/src/web/WebEntityService.h
index 05160ee1a..e58a7cb39 100644
--- a/src/web/WebEntityService.h
+++ b/src/web/WebEntityService.h
@@ -37,6 +37,7 @@ class EntityItem {
double factor;
bool writeable;
uint32_t value;
+ std::string data;
};
class WebEntity {
diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp
index 753cd9a82..b794e0335 100644
--- a/src/web/WebSchedulerService.cpp
+++ b/src/web/WebSchedulerService.cpp
@@ -50,7 +50,7 @@ void WebScheduler::read(WebScheduler & webScheduler, JsonObject & root) {
}
}
-// call on initialization and also when the Scheduile web page is saved
+// call on initialization and also when the Schedule web page is saved
// this loads the data into the internal class
StateUpdateResult WebScheduler::update(JsonObject & root, WebScheduler & webScheduler) {
#ifdef EMSESP_STANDALONE
@@ -172,18 +172,25 @@ bool WebSchedulerService::get_value_info(JsonObject & output, const char * cmd)
JsonVariant data;
for (const ScheduleItem & scheduleItem : *scheduleItems) {
if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) {
+ output["name"] = scheduleItem.name;
+ output["type"] = "boolean";
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
- output[scheduleItem.name] = scheduleItem.active;
+ output["value"] = scheduleItem.active;
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
- output[scheduleItem.name] = scheduleItem.active ? 1 : 0;
+ output["value"] = scheduleItem.active ? 1 : 0;
} else {
char result[12];
- output[scheduleItem.name] = Helpers::render_boolean(result, scheduleItem.active);
+ output["value"] = Helpers::render_boolean(result, scheduleItem.active);
}
- data = output[scheduleItem.name];
+ output["command"] = scheduleItem.cmd;
+ output["cmd_data"] = scheduleItem.value;
+ output["readable"] = true;
+ output["writeable"] = true;
+ output["visible"] = true;
}
}
- if (attribute_s && !strcmp(attribute_s, "value")) {
+ if (attribute_s && output.containsKey(attribute_s)) {
+ data = output[attribute_s];
output.clear();
output["api_data"] = data;
}
@@ -316,7 +323,7 @@ bool WebSchedulerService::command(const char * cmd, const char * data) {
if (return_code == CommandRet::OK) {
EMSESP::logger().debug("Scheduled command %s with data %s successfully", cmd, data);
- if (strlen(data) == 0 && Mqtt::enabled() && Mqtt::send_response() && output.size()) {
+ if (strlen(data) == 0 && output.size()) {
Mqtt::queue_publish("response", output);
}
return true;
diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp
index 51d0537cc..158281526 100644
--- a/src/web/WebSettingsService.cpp
+++ b/src/web/WebSettingsService.cpp
@@ -91,7 +91,8 @@ StateUpdateResult WebSettings::update(JsonObject & root, WebSettings & settings)
#elif CONFIG_IDF_TARGET_ESP32S2
settings.board_profile = root["board_profile"] | "S2MINI";
#elif CONFIG_IDF_TARGET_ESP32S3
- settings.board_profile = root["board_profile"] | "S3MINI";
+ // settings.board_profile = root["board_profile"] | "S3MINI";
+ settings.board_profile = root["board_profile"] | "S32S3"; // BBQKees Gateway S3
#elif CONFIG_IDF_TARGET_ESP32
settings.board_profile = root["board_profile"] | EMSESP_DEFAULT_BOARD_PROFILE;
#endif
diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp
index 231a7ef41..86ec82683 100644
--- a/src/web/WebStatusService.cpp
+++ b/src/web/WebStatusService.cpp
@@ -229,7 +229,7 @@ const char * WebStatusService::disconnectReason(uint8_t code) {
#ifndef EMSESP_STANDALONE
switch (code) {
case WIFI_REASON_UNSPECIFIED: // = 1,
- return "unspecifiied";
+ return "unspecified";
case WIFI_REASON_AUTH_EXPIRE: // = 2,
return "auth expire";
case WIFI_REASON_AUTH_LEAVE: // = 3,
@@ -239,9 +239,9 @@ const char * WebStatusService::disconnectReason(uint8_t code) {
case WIFI_REASON_ASSOC_TOOMANY: // = 5,
return "assoc too many";
case WIFI_REASON_NOT_AUTHED: // = 6,
- return "not authed";
+ return "not authenticated";
case WIFI_REASON_NOT_ASSOCED: // = 7,
- return "not assoced";
+ return "not assoc";
case WIFI_REASON_ASSOC_LEAVE: // = 8,
return "assoc leave";
case WIFI_REASON_ASSOC_NOT_AUTHED: // = 9,