diff --git a/docs/DeviceProfiles/wemos-lolin32-oled.json b/docs/DeviceProfiles/wemos-lolin32-oled.json new file mode 100644 index 000000000..cbfa6eaa1 --- /dev/null +++ b/docs/DeviceProfiles/wemos-lolin32-oled.json @@ -0,0 +1,21 @@ +[ + { + "name": "Wemos Lolin32 OLED", + "nrf24": { + "miso": 2, + "mosi": 14, + "clk": 12, + "irq": 0, + "en": 15, + "cs": 13 + }, + "eth": { + "enabled": false + }, + "display": { + "type": 2, + "data": 5, + "clk": 4 + } + } +] diff --git a/lib/Hoymiles/src/commands/MultiDataCommand.cpp b/lib/Hoymiles/src/commands/MultiDataCommand.cpp index b25c9027d..39a0d4c64 100644 --- a/lib/Hoymiles/src/commands/MultiDataCommand.cpp +++ b/lib/Hoymiles/src/commands/MultiDataCommand.cpp @@ -91,4 +91,13 @@ void MultiDataCommand::udpateCRC() uint16_t crc = crc16(&_payload[10], 14); // From data_type till password _payload[24] = (uint8_t)(crc >> 8); _payload[25] = (uint8_t)(crc); -} \ No newline at end of file +} + +uint8_t MultiDataCommand::getTotalFragmentSize(fragment_t fragment[], uint8_t max_fragment_id) +{ + uint8_t fragmentSize = 0; + for (uint8_t i = 0; i < max_fragment_id; i++) { + fragmentSize += fragment[i].len; + } + return fragmentSize; +} diff --git a/lib/Hoymiles/src/commands/MultiDataCommand.h b/lib/Hoymiles/src/commands/MultiDataCommand.h index ff835d7b9..4d2adfde4 100644 --- a/lib/Hoymiles/src/commands/MultiDataCommand.h +++ b/lib/Hoymiles/src/commands/MultiDataCommand.h @@ -20,6 +20,7 @@ class MultiDataCommand : public CommandAbstract { void setDataType(uint8_t data_type); uint8_t getDataType(); void udpateCRC(); + static uint8_t getTotalFragmentSize(fragment_t fragment[], uint8_t max_fragment_id); RequestFrameCommand _cmdRequestFrame; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp index 6a7db92a9..646e363fe 100644 --- a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp +++ b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp @@ -3,6 +3,7 @@ * Copyright (C) 2022 Thomas Basler and others */ #include "RealTimeRunDataCommand.h" +#include "Hoymiles.h" #include "inverters/InverterAbstract.h" RealTimeRunDataCommand::RealTimeRunDataCommand(uint64_t target_address, uint64_t router_address, time_t time) @@ -25,6 +26,18 @@ bool RealTimeRunDataCommand::handleResponse(InverterAbstract* inverter, fragment return false; } + // Check if at least all required bytes are received + // In case of low power in the inverter it occours that some incomplete fragments + // with a valid CRC are received. + if (getTotalFragmentSize(fragment, max_fragment_id) < inverter->Statistics()->getMaxByteCount()) { + Hoymiles.getMessageOutput()->printf("ERROR in %s: Received fragment size: %d min. expected size: %d\r\n", + getCommandName().c_str(), + getTotalFragmentSize(fragment, max_fragment_id), + inverter->Statistics()->getMaxByteCount()); + + return false; + } + // Move all fragments into target buffer uint8_t offs = 0; inverter->Statistics()->clearBuffer(); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index 0575a5fbb..c0e0b8ba5 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -34,6 +34,25 @@ void StatisticsParser::setByteAssignment(const byteAssign_t* byteAssignment, uin _byteAssignmentSize = size; } +uint8_t StatisticsParser::getMaxByteCount() +{ + static uint8_t maxByteCount = 0; + + // Use already calculated value + if (maxByteCount > 0) { + return maxByteCount; + } + + for (uint8_t i = 0; i < _byteAssignmentSize; i++) { + if (_byteAssignment[i].div == CMD_CALC) { + continue; + } + maxByteCount = max(maxByteCount, _byteAssignment[i].start + _byteAssignment[i].num); + } + + return maxByteCount; +} + void StatisticsParser::clearBuffer() { memset(_payloadStatistic, 0, STATISTIC_PACKET_SIZE); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index f4bf7ae02..9f71045a3 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -109,6 +109,9 @@ class StatisticsParser : public Parser { void setByteAssignment(const byteAssign_t* byteAssignment, uint8_t size); + // Returns 1 based amount of expected bytes of statistic data + uint8_t getMaxByteCount(); + const byteAssign_t* getAssignmentByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); fieldSettings_t* getSettingByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); diff --git a/platformio.ini b/platformio.ini index bdc0e9370..76b9188f2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,7 +22,7 @@ framework = arduino platform = espressif32@6.3.1 build_flags = - -DCOMPONENT_EMBED_FILES=webapp_dist/index.html.gz:webapp_dist/zones.json.gz:webapp_dist/favicon.ico:webapp_dist/js/app.js.gz + -DCOMPONENT_EMBED_FILES=webapp_dist/index.html.gz:webapp_dist/zones.json.gz:webapp_dist/favicon.ico:webapp_dist/favicon.png:webapp_dist/js/app.js.gz -DPIOENV=\"$PIOENV\" -Wall -Wextra -Werror -std=c++17 diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index 4976f78e2..fd42da5c1 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -6,11 +6,13 @@ extern const uint8_t file_index_html_start[] asm("_binary_webapp_dist_index_html_gz_start"); extern const uint8_t file_favicon_ico_start[] asm("_binary_webapp_dist_favicon_ico_start"); +extern const uint8_t file_favicon_png_start[] asm("_binary_webapp_dist_favicon_png_start"); extern const uint8_t file_zones_json_start[] asm("_binary_webapp_dist_zones_json_gz_start"); extern const uint8_t file_app_js_start[] asm("_binary_webapp_dist_js_app_js_gz_start"); extern const uint8_t file_index_html_end[] asm("_binary_webapp_dist_index_html_gz_end"); extern const uint8_t file_favicon_ico_end[] asm("_binary_webapp_dist_favicon_ico_end"); +extern const uint8_t file_favicon_png_end[] asm("_binary_webapp_dist_favicon_png_end"); extern const uint8_t file_zones_json_end[] asm("_binary_webapp_dist_zones_json_gz_end"); extern const uint8_t file_app_js_end[] asm("_binary_webapp_dist_js_app_js_gz_end"); @@ -41,6 +43,11 @@ void WebApiWebappClass::init(AsyncWebServer* server) request->send(response); }); + _server->on("/favicon.png", HTTP_GET, [](AsyncWebServerRequest* request) { + AsyncWebServerResponse* response = request->beginResponse_P(200, "image/png", file_favicon_png_start, file_favicon_png_end - file_favicon_png_start); + request->send(response); + }); + _server->on("/zones.json", HTTP_GET, [](AsyncWebServerRequest* request) { AsyncWebServerResponse* response = request->beginResponse_P(200, "application/json", file_zones_json_start, file_zones_json_end - file_zones_json_start); response->addHeader("Content-Encoding", "gzip"); diff --git a/webapp/index.html b/webapp/index.html index 36236f188..39a94a039 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -3,6 +3,8 @@ + + OpenDTU diff --git a/webapp/package.json b/webapp/package.json index 590181fbc..23660a816 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -26,21 +26,21 @@ "@rushstack/eslint-patch": "^1.3.2", "@tsconfig/node18": "^2.0.1", "@types/bootstrap": "^5.2.6", - "@types/node": "^20.3.1", + "@types/node": "^20.3.2", "@types/sortablejs": "^1.15.1", "@types/spark-md5": "^3.0.2", "@vitejs/plugin-vue": "^4.2.3", "@vue/eslint-config-typescript": "^11.0.3", "@vue/tsconfig": "^0.4.0", "eslint": "^8.43.0", - "eslint-plugin-vue": "^9.15.0", + "eslint-plugin-vue": "^9.15.1", "npm-run-all": "^4.1.5", - "sass": "^1.63.5", - "terser": "^5.18.1", + "sass": "^1.63.6", + "terser": "^5.18.2", "typescript": "^5.1.3", "vite": "^4.3.9", "vite-plugin-compression": "^0.5.1", "vite-plugin-css-injected-by-js": "^3.1.1", - "vue-tsc": "^1.8.1" + "vue-tsc": "^1.8.2" } } diff --git a/webapp/public/favicon.png b/webapp/public/favicon.png new file mode 100644 index 000000000..3378b6613 Binary files /dev/null and b/webapp/public/favicon.png differ diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 86b517f50..9e3807e99 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -27,8 +27,8 @@ "Reload": "Reload" }, "localeswitcher": { - "Dark": "Dark", - "Light": "Light", + "Dark": "Sombre", + "Light": "Clair", "Auto": "Auto" }, "apiresponse": { @@ -190,13 +190,13 @@ }, "radioinfo": { "RadioInformation": "Informations sur la radio", - "Status": "{module} Status", - "ChipStatus": "{module} sÉtat de la puce", + "Status": "{module} Statut", + "ChipStatus": "{module} État de la puce", "ChipType": "{module} Type de puce", "Connected": "connectée", "NotConnected": "non connectée", - "Configured": "configured", - "NotConfigured": "not configured", + "Configured": "configurée", + "NotConfigured": "non configurée", "Unknown": "Inconnue" }, "networkinfo": { @@ -245,12 +245,12 @@ "Synced": "synchronisée", "NotSynced": "pas synchronisée", "LocalTime": "Heure locale", - "Sunrise": "Sunrise", - "Sunset": "Sunset", + "Sunrise": "Lever du soleil", + "Sunset": "Coucher du soleil", "NotAvailable": "Not Available", "Mode": "Mode", - "Day": "Day", - "Night": "Night" + "Day": "Jour", + "Night": "Nuit" }, "mqttinfo": { "MqttInformation": "MQTT Information", @@ -448,7 +448,7 @@ "InverterSerial": "Numéro de série de l'onduleur", "InverterName": "Nom de l'onduleur :", "InverterNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour votre onduleur.", - "InverterStatus": "Receive / Send", + "InverterStatus": "Recevoir / Envoyer", "PollEnable": "Interroger les données de l'onduleur", "PollEnableNight": "Interroger les données de l'onduleur la nuit", "CommandEnable": "Envoyer des commandes", @@ -538,10 +538,10 @@ "ScreensaverHint": "Déplacez un peu l'écran à chaque mise à jour pour éviter le phénomène de brûlure. (Utile surtout pour les écrans OLED)", "Contrast": "Contraste ({contrast}):", "Rotation": "Rotation:", - "rot0": "No rotation", - "rot90": "90 degree rotation", - "rot180": "180 degree rotation", - "rot270": "270 degree rotation", + "rot0": "Pas de rotation", + "rot90": "Rotation de 90 degrés", + "rot180": "Rotation de 180 degrés", + "rot270": "Rotation de 270 degrés", "DisplayLanguage": "Langue d'affichage", "en": "Anglais", "de": "Allemand", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 8f82522d5..330d42667 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -372,10 +372,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/node@^20.3.1": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== +"@types/node@^20.3.2": + version "20.3.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" + integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== "@types/semver@^7.3.12": version "7.3.13" @@ -481,26 +481,26 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6" integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw== -"@volar/language-core@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.7.8.tgz#88e33fda749ecb1ecb28c031027d45e778b8cd5f" - integrity sha512-TPklg4c2e/f1xB/MGZEiQc3AWG+dH64ZfBlYjFB8nNaWJt4Z4k+IHBhmaP52APG+5PHFerwiWI9oF002RrRTPA== +"@volar/language-core@1.7.9": + version "1.7.9" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.7.9.tgz#e9ca92fcbffa88136394c692454036548d97ea5a" + integrity sha512-U6GMPDNqfGFqVRv4npUN2hEDW4/6EwL4YHd6qggapcvTzRrYAodTTbOTZs4PDzmw7NSZ2Cdrmd54SjzCCMXbZw== dependencies: - "@volar/source-map" "1.7.8" + "@volar/source-map" "1.7.9" -"@volar/source-map@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.7.8.tgz#46710f1d1e948e8009993595b70670e3ee4bfc1d" - integrity sha512-g2dtC2kOghvfzMDWeODIo4HO1Ml4hxzPTZyAFDz+YhRF9HjZYJSCaWaVuPZ+z0kY+T2daOHYA10GdrWQ5q0teA== +"@volar/source-map@1.7.9": + version "1.7.9" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.7.9.tgz#a9588fce0a989f320bcd1ab37e31948a6a57f5cc" + integrity sha512-bLizh8HIAzbq7OdxfyoG18dXJJF9FNXBcaiRj7eqg2Bq+DkgkYHabaY+xobgaXeKFOp93Tg1KfMM7qyR2KXHmQ== dependencies: muggle-string "^0.3.1" -"@volar/typescript@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.7.8.tgz#6997b3c7637292a6dc6e4a3737e45f3c4e49ef12" - integrity sha512-NDcI5ZQcdr8kgxzMQrhSSWIM8Tl0MbMFrkvJPTjfm2rdAQZPFT8zv3LrEW9Fqh0e9z2YbCry7jr4a/GShBqeDA== +"@volar/typescript@1.7.9": + version "1.7.9" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.7.9.tgz#28f3597a391a90036c9e90c770654cd45201f572" + integrity sha512-cXGg7lgvdjpRjYfz52cXKo6ExBi8k3pWeBe6Gckf4+9zmTfEwEFfKWMj0H/IyUYO+S2rjyE9jytdsu1Imk+Azw== dependencies: - "@volar/language-core" "1.7.8" + "@volar/language-core" "1.7.9" "@vue/compiler-core@3.2.47": version "3.2.47" @@ -623,13 +623,13 @@ "@typescript-eslint/parser" "^5.59.1" vue-eslint-parser "^9.1.1" -"@vue/language-core@1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.1.tgz#86b709f803bcc0cab84fd14677c0fb909154c562" - integrity sha512-pumv3k4J7P58hVh4YGRM9Qz3HaAr4TlFWM9bnVOkZ/2K9o2CK1lAP2y9Jw+Z0+mNL4F2uWQqnAPzj3seLyfpDA== +"@vue/language-core@1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.2.tgz#560c1df639394a5df0043f2d7989dc2fba5bf4ca" + integrity sha512-QJujhmp89TRoWwzjn2sPMezG97+mNyaCTfznGHWNCE3LBsillZCBqAO7M7cxO8ee1V3r+qHjWytkoh3M4YkRJw== dependencies: - "@volar/language-core" "1.7.8" - "@volar/source-map" "1.7.8" + "@volar/language-core" "1.7.9" + "@volar/source-map" "1.7.9" "@vue/compiler-dom" "^3.3.0" "@vue/reactivity" "^3.3.0" "@vue/shared" "^3.3.0" @@ -718,13 +718,13 @@ resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0" integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg== -"@vue/typescript@1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.1.tgz#2302f3cc8330e8dd91982eecd64d71ee11198cb0" - integrity sha512-nQpo55j/roie8heCfqyXHnyayqD5+p4/0fzfxH4ZuHf7NSBQS791PNv7ztp2CCOjnGAiaiCMdtC9rc6oriyPUg== +"@vue/typescript@1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.2.tgz#d81e2c16197e8fcf032fe766d79952cb9a629af7" + integrity sha512-5q2gpCBIfGlygfJupyjAQbc82r5J6qQuhupPeX3NlHvDK+mR6m5n4jVGknSacsp+7gtgs4RKYDq+tysoto+npA== dependencies: - "@volar/typescript" "1.7.8" - "@vue/language-core" "1.8.1" + "@volar/typescript" "1.7.9" + "@vue/language-core" "1.8.2" acorn-jsx@^5.2.0, acorn-jsx@^5.3.2: version "5.3.2" @@ -1089,10 +1089,10 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-plugin-vue@^9.15.0: - version "9.15.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.15.0.tgz#2bffe2b8a628ee438f983672a73cd89df455c461" - integrity sha512-XYzpK6e2REli100+6iCeBA69v6Sm0D/yK2FZP+fCeNt0yH/m82qZQq+ztseyV0JsKdhFysuSEzeE1yCmSC92BA== +eslint-plugin-vue@^9.15.1: + version "9.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz#3c09e0edab444b5d4d9239a12a645a0e2e2ea5be" + integrity sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A== dependencies: "@eslint-community/eslint-utils" "^4.3.0" natural-compare "^1.4.0" @@ -2184,10 +2184,10 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -sass@^1.63.5: - version "1.63.5" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.5.tgz#6e1900b12576e3e74a8ab0a9d8607cacbe584ef1" - integrity sha512-Q6c5gs482oezdAp+0fWF9cRisvpy7yfYb64knID0OE8AnMgtkluRPfpGMFjeD4/+M4+6QpJZCU6JRSxbjiktkg== +sass@^1.63.6: + version "1.63.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea" + integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -2382,10 +2382,10 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -terser@^5.18.1: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== +terser@^5.18.2: + version "5.18.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948" + integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -2566,13 +2566,13 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.1.tgz#cdbc83ad7d1c80eac82e01917a58bc57e2debed2" - integrity sha512-GxBQrcb0Qvyrj1uZqnTXQyWbXdNDRY2MTa+r7ESgjhf+WzBSdxZfkS3KD/C3WhKYG+aN8hf44Hp5Gqzb6PehAA== +vue-tsc@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.2.tgz#dd9b0edfed10b590a82f964969e12d7733a282c4" + integrity sha512-iLS+z7jzxEAZRGLo4bYWfzZeBNVA71uXKmT2+5bQSsOJBtGLniR45sVpR+X7sa0m3J8iMEIU5+phLB7FnMLS0A== dependencies: - "@vue/language-core" "1.8.1" - "@vue/typescript" "1.8.1" + "@vue/language-core" "1.8.2" + "@vue/typescript" "1.8.2" semver "^7.3.8" vue@^3.3.4: diff --git a/webapp_dist/favicon.png b/webapp_dist/favicon.png new file mode 100644 index 000000000..3378b6613 Binary files /dev/null and b/webapp_dist/favicon.png differ diff --git a/webapp_dist/index.html.gz b/webapp_dist/index.html.gz index d0a8c5248..cc2cb3815 100644 Binary files a/webapp_dist/index.html.gz and b/webapp_dist/index.html.gz differ diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index 05777db24..d5965f1ed 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ