diff --git a/include/Display_Graphic_Diagram.h b/include/Display_Graphic_Diagram.h index 0626436cb..2067a3f09 100644 --- a/include/Display_Graphic_Diagram.h +++ b/include/Display_Graphic_Diagram.h @@ -7,7 +7,10 @@ #define CHART_HEIGHT 20 // chart area hight in pixels #define CHART_WIDTH 47 // chart area width in pixels -#define DIAG_POSX 80 // position were Diag is drawn at + +// Left-Upper position of diagram is drawn +// (text of Y-axis is display left of that pos) +#define DIAG_POSX 80 #define DIAG_POSY 0 class DisplayGraphicDiagramClass { @@ -15,7 +18,7 @@ class DisplayGraphicDiagramClass { DisplayGraphicDiagramClass(); void init(Scheduler& scheduler, U8G2* display); - void redraw(); + void redraw(uint8_t screenSaverOffsetX); void updatePeriod(); @@ -34,6 +37,4 @@ class DisplayGraphicDiagramClass { float _iRunningAverage = 0; uint16_t _iRunningAverageCnt = 0; - - uint8_t _graphPosX = DIAG_POSX; -}; \ No newline at end of file +}; diff --git a/include/SunPosition.h b/include/SunPosition.h index b64ac1ebd..443fb16dd 100644 --- a/include/SunPosition.h +++ b/include/SunPosition.h @@ -15,6 +15,7 @@ class SunPositionClass { bool isDayPeriod() const; bool isSunsetAvailable() const; + bool isValidInfo() const; bool sunsetTime(struct tm* info) const; bool sunriseTime(struct tm* info) const; void setDoRecalc(const bool doRecalc); diff --git a/src/Display_Graphic.cpp b/src/Display_Graphic.cpp index 5a06452f0..94a0de845 100644 --- a/src/Display_Graphic.cpp +++ b/src/Display_Graphic.cpp @@ -161,12 +161,14 @@ void DisplayGraphicClass::loop() if (Datastore.getIsAtLeastOneReachable()) { displayPowerSave = false; if (_isLarge) { - _diagram.redraw(); + uint8_t screenSaverOffsetX = enableScreensaver ? (_mExtra % 7) : 0; + _diagram.redraw(screenSaverOffsetX); } - if (Datastore.getTotalAcPowerEnabled() > 999) { - snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_kw[_display_language], (Datastore.getTotalAcPowerEnabled() / 1000)); + const float watts = Datastore.getTotalAcPowerEnabled(); + if (watts > 999) { + snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_kw[_display_language], watts / 1000); } else { - snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_w[_display_language], Datastore.getTotalAcPowerEnabled()); + snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_w[_display_language], watts); } printText(_fmtText, 0); _previousMillis = millis(); @@ -224,4 +226,4 @@ void DisplayGraphicClass::setStatus(const bool turnOn) _displayTurnedOn = turnOn; } -DisplayGraphicClass Display; \ No newline at end of file +DisplayGraphicClass Display; diff --git a/src/Display_Graphic_Diagram.cpp b/src/Display_Graphic_Diagram.cpp index 4a98c1691..489f295fa 100644 --- a/src/Display_Graphic_Diagram.cpp +++ b/src/Display_Graphic_Diagram.cpp @@ -37,21 +37,17 @@ void DisplayGraphicDiagramClass::averageLoop() void DisplayGraphicDiagramClass::dataPointLoop() { - if (_graphValuesCount >= CHART_WIDTH) { - for (uint8_t i = 0; i < CHART_WIDTH - 1; i++) { + if (_graphValuesCount >= std::size(_graphValues)) { + for (uint8_t i = 0; i < std::size(_graphValues) - 1; i++) { _graphValues[i] = _graphValues[i + 1]; } - _graphValuesCount = CHART_WIDTH - 1; + _graphValuesCount = std::size(_graphValues) - 1; } if (_iRunningAverageCnt != 0) { _graphValues[_graphValuesCount++] = _iRunningAverage / _iRunningAverageCnt; _iRunningAverage = 0; _iRunningAverageCnt = 0; } - - if (Configuration.get().Display.ScreenSaver) { - _graphPosX = DIAG_POSX - (_graphValuesCount % 2); - } } uint32_t DisplayGraphicDiagramClass::getSecondsPerDot() @@ -64,25 +60,32 @@ void DisplayGraphicDiagramClass::updatePeriod() _dataPointTask.setInterval(getSecondsPerDot() * TASK_SECOND); } -void DisplayGraphicDiagramClass::redraw() +void DisplayGraphicDiagramClass::redraw(uint8_t screenSaverOffsetX) { - uint8_t graphPosY = DIAG_POSY; + const uint8_t graphPosX = DIAG_POSX + ((screenSaverOffsetX > 3) ? 1 : 0); // screenSaverOffsetX expected to be in range 0..6 + const uint8_t graphPosY = DIAG_POSY + ((screenSaverOffsetX > 3) ? 1 : 0); // draw diagram axis - _display->drawVLine(_graphPosX, graphPosY, CHART_HEIGHT); - _display->drawHLine(_graphPosX, graphPosY + CHART_HEIGHT - 1, CHART_WIDTH); + _display->drawVLine(graphPosX, graphPosY, CHART_HEIGHT); + _display->drawHLine(graphPosX, graphPosY + CHART_HEIGHT - 1, CHART_WIDTH); - _display->drawLine(_graphPosX + 1, graphPosY + 1, _graphPosX + 2, graphPosY + 2); // UP-arrow - _display->drawLine(_graphPosX + CHART_WIDTH - 3, graphPosY + CHART_HEIGHT - 3, _graphPosX + CHART_WIDTH - 2, graphPosY + CHART_HEIGHT - 2); // LEFT-arrow - _display->drawLine(_graphPosX + CHART_WIDTH - 3, graphPosY + CHART_HEIGHT + 1, _graphPosX + CHART_WIDTH - 2, graphPosY + CHART_HEIGHT); // LEFT-arrow + _display->drawLine(graphPosX + 1, graphPosY + 1, graphPosX + 2, graphPosY + 2); // UP-arrow + _display->drawLine(graphPosX - 2, graphPosY + 2, graphPosX - 1, graphPosY + 1); // UP-arrow + _display->drawLine(graphPosX + CHART_WIDTH - 3, graphPosY + CHART_HEIGHT - 3, graphPosX + CHART_WIDTH - 2, graphPosY + CHART_HEIGHT - 2); // LEFT-arrow + _display->drawLine(graphPosX + CHART_WIDTH - 3, graphPosY + CHART_HEIGHT + 1, graphPosX + CHART_WIDTH - 2, graphPosY + CHART_HEIGHT); // LEFT-arrow // draw AC value - _display->setFont(u8g2_font_tom_thumb_4x6_mr); + _display->setFont(u8g2_font_tom_thumb_4x6_mr); // 4 pixels per char char fmtText[7]; const float maxWatts = *std::max_element(_graphValues.begin(), _graphValues.end()); - snprintf(fmtText, sizeof(fmtText), "%dW", static_cast(maxWatts)); + if (maxWatts > 999) { + snprintf(fmtText, sizeof(fmtText), "%2.1fkW", maxWatts / 1000); + } else { + snprintf(fmtText, sizeof(fmtText), "%dW", static_cast(maxWatts)); + } const uint8_t textLength = strlen(fmtText); - _display->drawStr(_graphPosX - (textLength * 4), graphPosY + 5, fmtText); + const uint8_t space_and_arrow_pixels = 2; + _display->drawStr(graphPosX - space_and_arrow_pixels - (textLength * 4), graphPosY + 5, fmtText); // draw chart const float scaleFactor = maxWatts / CHART_HEIGHT; @@ -90,15 +93,15 @@ void DisplayGraphicDiagramClass::redraw() for (int i = 0; i < _graphValuesCount; i++) { if (scaleFactor > 0) { if (i == 0) { - _display->drawPixel(_graphPosX + 1 + i, graphPosY + CHART_HEIGHT - ((_graphValues[i] / scaleFactor) + 0.5)); // + 0.5 to round mathematical + _display->drawPixel(graphPosX + 1 + i, graphPosY + CHART_HEIGHT - ((_graphValues[i] / scaleFactor) + 0.5)); // + 0.5 to round mathematical } else { - _display->drawLine(_graphPosX + i, graphPosY + CHART_HEIGHT - ((_graphValues[i - 1] / scaleFactor) + 0.5), _graphPosX + 1 + i, graphPosY + CHART_HEIGHT - ((_graphValues[i] / scaleFactor) + 0.5)); + _display->drawLine(graphPosX + i, graphPosY + CHART_HEIGHT - ((_graphValues[i - 1] / scaleFactor) + 0.5), graphPosX + 1 + i, graphPosY + CHART_HEIGHT - ((_graphValues[i] / scaleFactor) + 0.5)); } } // draw one tick per hour to the x-axis if (i * getSecondsPerDot() > (3600u * axisTick)) { - _display->drawPixel(_graphPosX + 1 + i, graphPosY + CHART_HEIGHT); + _display->drawPixel(graphPosX + 1 + i, graphPosY + CHART_HEIGHT); axisTick++; } } diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index ed4e5133a..506adacc9 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -96,13 +96,12 @@ void InverterSettingsClass::init(Scheduler& scheduler) scheduler.addTask(_settingsTask); _settingsTask.setCallback(std::bind(&InverterSettingsClass::settingsLoop, this)); _settingsTask.setIterations(TASK_FOREVER); - _settingsTask.setInterval(SUNPOS_UPDATE_INTERVAL); + _settingsTask.setInterval(INVERTER_UPDATE_SETTINGS_INTERVAL); _settingsTask.enable(); } void InverterSettingsClass::settingsLoop() { - _lastUpdate = millis(); const CONFIG_T& config = Configuration.get(); for (uint8_t i = 0; i < INV_MAX_COUNT; i++) { diff --git a/src/SunPosition.cpp b/src/SunPosition.cpp index 986434975..09e8a37c7 100644 --- a/src/SunPosition.cpp +++ b/src/SunPosition.cpp @@ -40,10 +40,10 @@ void SunPositionClass::loop() updateSunData(); } - if (Configuration.get().Sunset_Deepsleep && !_isDayPeriod && (millis() > _bootDelay)) { - esp_sleep_enable_timer_wakeup(Configuration.get().Sunset_Deepsleeptime * uS_TO_S_FACTOR); - MessageOutput.print(F("SunsetClass - Going to sleep now for ")); - MessageOutput.printf("%u s\n", Configuration.get().Sunset_Deepsleeptime); + if (Configuration.get().Ntp.Deepsleep && !isDayPeriod() && (millis() > _bootDelay)) { + esp_sleep_enable_timer_wakeup(Configuration.get().Ntp.Deepsleeptime * uS_TO_S_FACTOR); + MessageOutput.print(F("SunPositionClass - Going to sleep now for ")); + MessageOutput.printf("%u s\n", Configuration.get().Ntp.Deepsleeptime); delay(1000); MessageOutput.flush(); esp_deep_sleep_start(); @@ -67,6 +67,11 @@ bool SunPositionClass::isSunsetAvailable() const return _isSunsetAvailable; } +bool SunPositionClass::isValidInfo() const +{ + return _isValidInfo; +} + void SunPositionClass::setDoRecalc(const bool doRecalc) { _doRecalc = doRecalc; @@ -141,7 +146,6 @@ void SunPositionClass::updateSunData() _sunriseMinutes = static_cast(sunriseRaw); _sunsetMinutes = static_cast(sunsetRaw); - _isDayPeriod = (minutesPastMidnight >= _sunriseMinutes) && (minutesPastMidnight < _sunsetMinutes); _isSunsetAvailable = true; _isValidInfo = true; } diff --git a/src/WebApi_ntp.cpp b/src/WebApi_ntp.cpp index 3e17cd586..7dc642ebc 100644 --- a/src/WebApi_ntp.cpp +++ b/src/WebApi_ntp.cpp @@ -66,9 +66,8 @@ void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request) } root["sun_settime"] = timeStringBuff; - root["sun_isValidInfo"] = SunPosition.isValidInfo(); + root["sun_isSunsetAvailable"] = SunPosition.isSunsetAvailable(); root["sun_isDayPeriod"] = SunPosition.isDayPeriod(); - root["deepsleep"] = config.Sunset_Deepsleep; response->setLength(); request->send(response); @@ -198,27 +197,6 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request) return; } - if (root["deepsleeptime"].as() < 5 || root["deepsleeptime"].as() > 300) { - retMsg["message"] = "Deepsleep time must be a number between 5 and 300 seconds!"; - response->setLength(); - request->send(response); - return; - } - - if (root["latitude"].as() < -90.0 || root["latitude"].as() > +90.0) { - retMsg["message"] = "Latitude must be a number between -90.0 and 90.0!"; - response->setLength(); - request->send(response); - return; - } - - if (root["longitude"].as() < -180.0 || root["longitude"].as() > +180.0) { - retMsg["message"] = "Longitude must be a number between -180.0 and 180.0!"; - response->setLength(); - request->send(response); - return; - } - CONFIG_T& config = Configuration.get(); strlcpy(config.Ntp.Server, root["ntp_server"].as().c_str(), sizeof(config.Ntp.Server)); strlcpy(config.Ntp.Timezone, root["ntp_timezone"].as().c_str(), sizeof(config.Ntp.Timezone)); diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index 260566fa5..56546961e 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -18,6 +18,10 @@ extern const uint8_t file_zones_json_end[] asm("_binary_webapp_dist_zones_json_g extern const uint8_t file_app_js_end[] asm("_binary_webapp_dist_js_app_js_gz_end"); extern const uint8_t file_site_webmanifest_end[] asm("_binary_webapp_dist_site_webmanifest_end"); +#ifdef AUTO_GIT_HASH +#define ETAG_HTTP_HEADER_VAL "\"" AUTO_GIT_HASH "\"" // ETag value must be between quotes +#endif + void WebApiWebappClass::init(AsyncWebServer& server) { _server = &server; @@ -62,12 +66,12 @@ void WebApiWebappClass::init(AsyncWebServer& server) }); _server->on("/js/app.js", HTTP_GET, [](AsyncWebServerRequest* request) { -#ifdef AUTO_GIT_HASH +#ifdef ETAG_HTTP_HEADER_VAL // check client If-None-Match header vs ETag/AUTO_GIT_HASH bool eTagMatch = false; if (request->hasHeader("If-None-Match")) { const AsyncWebHeader* h = request->getHeader("If-None-Match"); - if (strncmp(AUTO_GIT_HASH, h->value().c_str(), strlen(AUTO_GIT_HASH)) == 0) { + if (strncmp(ETAG_HTTP_HEADER_VAL, h->value().c_str(), strlen(ETAG_HTTP_HEADER_VAL)) == 0) { eTagMatch = true; } } @@ -82,7 +86,7 @@ void WebApiWebappClass::init(AsyncWebServer& server) } // HTTP requires cache headers in 200 and 304 to be identical response->addHeader("Cache-Control", "public, must-revalidate"); - response->addHeader("ETag", AUTO_GIT_HASH); + response->addHeader("ETag", ETAG_HTTP_HEADER_VAL); #else AsyncWebServerResponse* response = request->beginResponse_P(200, "text/javascript", file_app_js_start, file_app_js_end - file_app_js_start); response->addHeader("Content-Encoding", "gzip"); diff --git a/webapp/package.json b/webapp/package.json index c5050c466..60e57e946 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -23,7 +23,7 @@ "vue-router": "^4.2.5" }, "devDependencies": { - "@intlify/unplugin-vue-i18n": "^1.6.0", + "@intlify/unplugin-vue-i18n": "^2.0.0", "@rushstack/eslint-patch": "^1.6.1", "@tsconfig/node18": "^18.2.2", "@types/bootstrap": "^5.2.10", @@ -41,7 +41,7 @@ "typescript": "^5.3.3", "vite": "^5.0.10", "vite-plugin-compression": "^0.5.1", - "vite-plugin-css-injected-by-js": "^3.3.0", - "vue-tsc": "^1.8.25" + "vite-plugin-css-injected-by-js": "^3.3.1", + "vue-tsc": "^1.8.26" } } diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 61cbcce9c..1e8d4e987 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -377,6 +377,7 @@ "LocationConfiguration": "Standortkonfiguration", "Longitude": "Längengrad:", "Latitude": "Breitengrad:", + "Deepsleep": "Deepsleep", "EnableDeepsleep": "Deepsleep aktivieren", "EnableDeepsleepHint": "Wenn aktiviert wird der ESP32 in der Nacht in den Deep Sleep Modus versetzt um Energie zu sparen.", "DeepsleepTime": "Deepsleep Periode:", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index eb9c34e87..a6fc53257 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -377,6 +377,7 @@ "LocationConfiguration": "Location Configuration", "Longitude": "Longitude", "Latitude": "Latitude", + "Deepsleep": "Deepsleep", "EnableDeepsleep": "Enable Deepsleep", "EnableDeepsleepHint": "When activated, the ESP32 is put into deep sleep mode at night to save energy.", "DeepsleepTime": "Deepsleep Duration:", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 6e7baeed0..a9509f1cb 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -260,13 +260,6 @@ "Status": "Statut", "Synced": "synchronisée", "NotSynced": "pas synchronisée", - "LocalTime": "Heure locale", - "Sunrise": "Nautical Lever du solei", - "Sunset": "Nautical Coucher du soleil", - "SunriseInformation": "Informations sur le lever et le coucher du soleil", - "Enabled": "activé", - "Disabled": "désactivé", - "TimezoneOffset": "Décalage du fuseau horaire", "LocalTime": "Heure locale", "Sunrise": "Lever du soleil", "Sunset": "Coucher du soleil", @@ -384,6 +377,7 @@ "LocationConfiguration": "Géolocalisation", "Longitude": "Longitude", "Latitude": "Latitude", + "Deepsleep": "Veille profonde", "EnableDeepsleep": "Activer la veille profonde", "EnableDeepsleepHint": "Lorsqu'il est activé, l'ESP32 est mis en mode veille profonde pour économiser de l'énergie.", "DeepsleepTime": "Periode de la veille profonde:", @@ -495,6 +489,8 @@ "PollEnableNight": "Interroger les données de l'onduleur la nuit", "CommandEnable": "Envoyer des commandes", "CommandEnableNight": "Envoyer des commandes la nuit", + "AddToTotal": "Add power and yield to the total", + "AddToTotalHint": "If this option is activated, the power and the yield of this inverter are taken into account in the totals in the live view.", "StringName": "Nom de la ligne {num}:", "StringNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour le port respectif de votre onduleur.", "StringMaxPower": "Puissance maximale de la ligne {num}:", diff --git a/webapp/src/types/NtpStatus.ts b/webapp/src/types/NtpStatus.ts index 6d99e6045..af13abb6d 100644 --- a/webapp/src/types/NtpStatus.ts +++ b/webapp/src/types/NtpStatus.ts @@ -7,6 +7,6 @@ export interface NtpStatus { sun_risetime: string; sun_settime: string; sun_isDayPeriod: boolean; - sun_isValidInfo: boolean; + sun_isSunsetAvailable: boolean; deepsleep: boolean; } \ No newline at end of file diff --git a/webapp/src/views/NtpAdminView.vue b/webapp/src/views/NtpAdminView.vue index f4f470c2d..c398b6f36 100644 --- a/webapp/src/views/NtpAdminView.vue +++ b/webapp/src/views/NtpAdminView.vue @@ -52,28 +52,30 @@ -
- -
-
- -
-
-
- -
- -
-
- - {{ $t('ntpadmin.Seconds') }} -
-
-
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ + {{ $t('ntpadmin.Seconds') }} +
+
+
+
diff --git a/webapp/src/views/NtpInfoView.vue b/webapp/src/views/NtpInfoView.vue index 41887c129..62da5be30 100644 --- a/webapp/src/views/NtpInfoView.vue +++ b/webapp/src/views/NtpInfoView.vue @@ -38,12 +38,12 @@ {{ $t('ntpinfo.Sunrise') }} - {{ ntpDataList.sun_risetime }} + {{ ntpDataList.sun_risetime }} {{ $t('ntpinfo.NotAvailable') }} {{ $t('ntpinfo.Sunset') }} - {{ ntpDataList.sun_settime }} + {{ ntpDataList.sun_settime }} {{ $t('ntpinfo.NotAvailable') }} diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 1f83a874d..b3b54b482 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -133,9 +133,9 @@ integrity sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw== "@eslint-community/eslint-utils@^4.2.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a" - integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" + integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ== dependencies: eslint-visitor-keys "^3.3.0" @@ -245,10 +245,10 @@ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.8.0.tgz#62adf8f6ef67c8eba6cf8d521e248f3503f237d3" integrity sha512-TmgR0RCLjzrSo+W3wT0ALf9851iFMlVI9EYNGeWvZFUQTAJx0bvfsMlPdgVtV1tDNRiAfhkFsMKu6jtUY1ZLKQ== -"@intlify/unplugin-vue-i18n@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.6.0.tgz#49ab21125c79257e455a6e562a2511c8681b870c" - integrity sha512-IGeFNWxdEvB12E/3Y/+nmIsGeTg5okPsK1XEtUUD/DdkHbVqUbJucMpHKeHF8Px55Qca551pQCs/g+VjNUt6KA== +"@intlify/unplugin-vue-i18n@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-2.0.0.tgz#5b087e17b4eb4381d0a111cd89df4037880e932f" + integrity sha512-1oKvm92L9l2od2H9wKx2ZvR4tzn7gUtd7bPLI7AWUmm7U9H1iEypndt5d985ypxGsEs0gToDaKTrytbBIJwwSg== dependencies: "@intlify/bundle-utils" "^7.4.0" "@intlify/shared" "^9.4.0" @@ -690,10 +690,10 @@ "@typescript-eslint/parser" "^6.7.0" vue-eslint-parser "^9.3.1" -"@vue/language-core@1.8.25": - version "1.8.25" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.25.tgz#b44b4e3c244ba9b1b79cccf9eb7b046535a4676f" - integrity sha512-NJk/5DnAZlpvXX8BdWmHI45bWGLViUaS3R/RMrmFSvFMSbJKuEODpM4kR0F0Ofv5SFzCWuNiMhxameWpVdQsnA== +"@vue/language-core@1.8.26": + version "1.8.26" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.26.tgz#7edb6b51a6ed57b618928500c3cbda9757a9f5f0" + integrity sha512-9cmza/Y2YTiOnKZ0Mi9zsNn7Irw+aKirP+5LLWVSNaL3fjKJjW1cD3HGBckasY2RuVh4YycvdA9/Q6EBpVd/7Q== dependencies: "@volar/language-core" "~1.11.1" "@volar/source-map" "~1.11.1" @@ -2514,9 +2514,9 @@ universalify@^2.0.0: integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unplugin@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.3.1.tgz#7af993ba8695d17d61b0845718380caf6af5109f" - integrity sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.3.0.tgz#e092fc4010196435558b524e6609253085a80b6c" + integrity sha512-l4Udjxg2+vCuKRgIA2T8fHd7UwKWaLizh7t+3C72zjnN0+ZS+odzATFenymOUgcGqG1dkCSYE34h9wBbMXrKrA== dependencies: acorn "^8.8.2" chokidar "^3.5.3" @@ -2552,10 +2552,10 @@ vite-plugin-compression@^0.5.1: debug "^4.3.3" fs-extra "^10.0.0" -vite-plugin-css-injected-by-js@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.3.0.tgz#c19480a9e42a95c5bced976a9dde1446f9bd91ff" - integrity sha512-xG+jyHNCmUqi/TXp6q88wTJGeAOrNLSyUUTp4qEQ9QZLGcHWQQsCsSSKa59rPMQr8sOzfzmWDd8enGqfH/dBew== +vite-plugin-css-injected-by-js@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.3.1.tgz#26b41f108c5554ee728359bdec01c68c93a48547" + integrity sha512-PjM/X45DR3/V1K1fTRs8HtZHEQ55kIfdrn+dzaqNBFrOYO073SeSNCxp4j7gSYhV9NffVHaEnOL4myoko0ePAg== vite@^5.0.10: version "5.0.10" @@ -2605,13 +2605,13 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.8.25: - version "1.8.25" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.25.tgz#90cd03e71d28c5c4a8068167b232eb97cc96b77f" - integrity sha512-lHsRhDc/Y7LINvYhZ3pv4elflFADoEOo67vfClAfF2heVHpHmVquLSjojgCSIwzA4F0Pc4vowT/psXCYcfk+iQ== +vue-tsc@^1.8.26: + version "1.8.26" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.26.tgz#f66abd1dab4e4593590b2b7d4ede0a696882feec" + integrity sha512-jMEJ4aqU/l1hdgmeExH5h1TFoN+hbho0A2ZAhHy53/947DGm7Qj/bpB85VpECOCwV00h7JYNVnvoD2ceOorB4Q== dependencies: "@volar/typescript" "~1.11.1" - "@vue/language-core" "1.8.25" + "@vue/language-core" "1.8.26" semver "^7.5.4" vue@^3.3.13: diff --git a/webapp_dist/index.html.gz b/webapp_dist/index.html.gz index 66ca6c3a2..b39a399e7 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 42ff6bc23..d198913f4 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ diff --git a/webapp_dist/zones.json.gz b/webapp_dist/zones.json.gz index 45374b962..6e5a69eae 100644 Binary files a/webapp_dist/zones.json.gz and b/webapp_dist/zones.json.gz differ