diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 61e3825e..9dc0c0df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: name: Gather Environments runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Cache pip uses: actions/cache@v3 @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: "3.9" + python-version: "3.x" - name: Install PlatformIO run: | @@ -55,7 +55,7 @@ jobs: matrix: environment: ${{ fromJSON(needs.get_default_envs.outputs.environments) }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Get tags run: git fetch --force --tags origin @@ -77,17 +77,17 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.9" + python-version: "3.x" - name: Install PlatformIO run: | python -m pip install --upgrade pip - pip install --upgrade platformio + pip install --upgrade platformio setuptools - name: Setup Node.js and yarn - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: "18" + node-version: "20" cache: "yarn" cache-dependency-path: "webapp/yarn.lock" diff --git a/include/Configuration.h b/include/Configuration.h index 55d31acd..14fc6a73 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -88,6 +88,8 @@ struct CONFIG_T { char WiFi_Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1]; uint32_t WiFi_ApTimeout; + bool Mdns_Enabled; + char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1]; char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1]; char Ntp_TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1]; diff --git a/include/InverterSettings.h b/include/InverterSettings.h index 188025b1..6375dfcf 100644 --- a/include/InverterSettings.h +++ b/include/InverterSettings.h @@ -3,6 +3,8 @@ #include +#define INVERTER_UPDATE_SETTINGS_INTERVAL 60000l + class InverterSettingsClass { public: void init(); @@ -12,4 +14,4 @@ private: uint32_t _lastUpdate = 0; }; -extern InverterSettingsClass InverterSettings; \ No newline at end of file +extern InverterSettingsClass InverterSettings; diff --git a/include/NetworkSettings.h b/include/NetworkSettings.h index f2cbdad3..fa94c8b3 100644 --- a/include/NetworkSettings.h +++ b/include/NetworkSettings.h @@ -59,6 +59,7 @@ public: private: void setHostname(); void setStaticIp(); + void handleMDNS(); void setupMode(); void NetworkEvent(WiFiEvent_t event); bool adminEnabled = true; @@ -76,6 +77,7 @@ private: network_mode _networkMode = network_mode::Undefined; bool _ethConnected = false; std::vector _cbEventList; + bool lastMdnsEnabled = false; }; extern NetworkSettingsClass NetworkSettings; \ No newline at end of file diff --git a/include/SunPosition.h b/include/SunPosition.h index c268813c..05e3b396 100644 --- a/include/SunPosition.h +++ b/include/SunPosition.h @@ -1,10 +1,9 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include -#define SUNPOS_UPDATE_INTERVAL 60000l - class SunPositionClass { public: SunPositionClass(); @@ -15,9 +14,12 @@ public: bool isSunsetAvailable(); bool sunsetTime(struct tm* info); bool sunriseTime(struct tm* info); + void setDoRecalc(bool doRecalc); private: void updateSunData(); + bool checkRecalcDayChanged(); + bool getDoRecalc(); SunSet _sun; bool _isDayPeriod = true; @@ -25,8 +27,10 @@ private: uint32_t _sunriseMinutes = 0; uint32_t _sunsetMinutes = 0; - uint32_t _lastUpdate = 0; bool _isValidInfo = false; + bool _doRecalc = true; + std::mutex _recalcLock; + uint32_t _lastSunPositionCalculatedYMD = 0; }; -extern SunPositionClass SunPosition; \ No newline at end of file +extern SunPositionClass SunPosition; diff --git a/include/defaults.h b/include/defaults.h index 47bea025..40cd9b9b 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -20,6 +20,8 @@ #define WIFI_PASSWORD "" #define WIFI_DHCP true +#define MDNS_ENABLED false + #define NTP_SERVER "pool.ntp.org" #define NTP_TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3" #define NTP_TIMEZONEDESCR "Europe/Berlin" diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index dbb39670..c43c968b 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -8,6 +8,7 @@ #include "inverters/HMS_1CHv2.h" #include "inverters/HMS_2CH.h" #include "inverters/HMS_4CH.h" +#include "inverters/HMT_4CH.h" #include "inverters/HMT_6CH.h" #include "inverters/HM_1CH.h" #include "inverters/HM_2CH.h" @@ -52,6 +53,11 @@ void HoymilesClass::loop() if (iv != nullptr && iv->getRadio()->isInitialized() && iv->getRadio()->isQueueEmpty()) { + if (iv->getZeroValuesIfUnreachable() && !iv->isReachable()) { + Hoymiles.getMessageOutput()->println("Set runtime data to zero"); + iv->Statistics()->zeroRuntimeData(); + } + if (iv->getEnablePolling() || iv->getEnableCommands()) { _messageOutput->print("Fetch inverter: "); _messageOutput->println(iv->serial(), HEX); @@ -140,7 +146,9 @@ void HoymilesClass::loop() std::shared_ptr HoymilesClass::addInverter(const char* name, uint64_t serial) { std::shared_ptr i = nullptr; - if (HMT_6CH::isValidSerial(serial)) { + if (HMT_4CH::isValidSerial(serial)) { + i = std::make_shared(_radioCmt.get(), serial); + } else if (HMT_6CH::isValidSerial(serial)) { i = std::make_shared(_radioCmt.get(), serial); } else if (HMS_4CH::isValidSerial(serial)) { i = std::make_shared(_radioCmt.get(), serial); diff --git a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp index e5ece409..3f0aed36 100644 --- a/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp +++ b/lib/Hoymiles/src/commands/RealTimeRunDataCommand.cpp @@ -55,9 +55,4 @@ bool RealTimeRunDataCommand::handleResponse(InverterAbstract* inverter, fragment void RealTimeRunDataCommand::gotTimeout(InverterAbstract* inverter) { inverter->Statistics()->incrementRxFailureCount(); - - if (inverter->getZeroValuesIfUnreachable() && !inverter->isReachable()) { - Hoymiles.getMessageOutput()->println("Set runtime data to zero"); - inverter->Statistics()->zeroRuntimeData(); - } } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMS_1CH.cpp b/lib/Hoymiles/src/inverters/HMS_1CH.cpp index a935a60b..c659794c 100644 --- a/lib/Hoymiles/src/inverters/HMS_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_1CH.cpp @@ -40,7 +40,7 @@ bool HMS_1CH::isValidSerial(uint64_t serial) String HMS_1CH::typeName() { - return "HMS-300, HMS-350, HMS-400, HMS-450, HMS-500"; + return "HMS-300/350/400/450/500-1T"; } const byteAssign_t* HMS_1CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HMS_1CHv2.cpp b/lib/Hoymiles/src/inverters/HMS_1CHv2.cpp index 0091c99c..08de0a35 100644 --- a/lib/Hoymiles/src/inverters/HMS_1CHv2.cpp +++ b/lib/Hoymiles/src/inverters/HMS_1CHv2.cpp @@ -40,7 +40,7 @@ bool HMS_1CHv2::isValidSerial(uint64_t serial) String HMS_1CHv2::typeName() { - return "HMS-500 v2"; + return "HMS-500-1T v2"; } const byteAssign_t* HMS_1CHv2::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HMS_2CH.cpp b/lib/Hoymiles/src/inverters/HMS_2CH.cpp index 12925d0f..e33de994 100644 --- a/lib/Hoymiles/src/inverters/HMS_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_2CH.cpp @@ -47,7 +47,7 @@ bool HMS_2CH::isValidSerial(uint64_t serial) String HMS_2CH::typeName() { - return "HMS-600, HMS-700, HMS-800, HMS-900, HMS-1000"; + return "HMS-600/700/800/900/1000-2T"; } const byteAssign_t* HMS_2CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HMS_4CH.cpp b/lib/Hoymiles/src/inverters/HMS_4CH.cpp index e2947d8f..ffdc2055 100644 --- a/lib/Hoymiles/src/inverters/HMS_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HMS_4CH.cpp @@ -54,14 +54,14 @@ HMS_4CH::HMS_4CH(HoymilesRadio* radio, uint64_t serial) bool HMS_4CH::isValidSerial(uint64_t serial) { - // serial >= 0x114400000000 && serial <= 0x114499999999 + // serial >= 0x116400000000 && serial <= 0x116499999999 uint16_t preSerial = (serial >> 32) & 0xffff; return preSerial == 0x1164; } String HMS_4CH::typeName() { - return "HMS-1600, HMS-1800, HMS-2000"; + return "HMS-1600/1800/2000"; } const byteAssign_t* HMS_4CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HMT_4CH.cpp b/lib/Hoymiles/src/inverters/HMT_4CH.cpp new file mode 100644 index 00000000..d30a404b --- /dev/null +++ b/lib/Hoymiles/src/inverters/HMT_4CH.cpp @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2023 Thomas Basler and others + */ +#include "HMT_4CH.h" + +static const byteAssign_t byteAssignment[] = { + { TYPE_DC, CH0, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, + { TYPE_DC, CH0, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, + { TYPE_DC, CH0, FLD_YT, UNIT_KWH, 12, 4, 1000, false, 3 }, + { TYPE_DC, CH0, FLD_YD, UNIT_WH, 20, 2, 1, false, 0 }, + { TYPE_DC, CH0, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH0, CMD_CALC, false, 3 }, + + { TYPE_DC, CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_IDC, UNIT_A, 6, 2, 100, false, 2 }, + { TYPE_DC, CH1, FLD_PDC, UNIT_W, 10, 2, 10, false, 1 }, + { TYPE_DC, CH1, FLD_YT, UNIT_KWH, 16, 4, 1000, false, 3 }, + { TYPE_DC, CH1, FLD_YD, UNIT_WH, 22, 2, 1, false, 0 }, + { TYPE_DC, CH1, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH1, CMD_CALC, false, 3 }, + + { TYPE_DC, CH2, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_IDC, UNIT_A, 26, 2, 100, false, 2 }, + { TYPE_DC, CH2, FLD_PDC, UNIT_W, 30, 2, 10, false, 1 }, + { TYPE_DC, CH2, FLD_YT, UNIT_KWH, 34, 4, 1000, false, 3 }, + { TYPE_DC, CH2, FLD_YD, UNIT_WH, 42, 2, 1, false, 0 }, + { TYPE_DC, CH2, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH2, CMD_CALC, false, 3 }, + + { TYPE_DC, CH3, FLD_UDC, UNIT_V, 24, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_IDC, UNIT_A, 28, 2, 100, false, 2 }, + { TYPE_DC, CH3, FLD_PDC, UNIT_W, 32, 2, 10, false, 1 }, + { TYPE_DC, CH3, FLD_YT, UNIT_KWH, 38, 4, 1000, false, 3 }, + { TYPE_DC, CH3, FLD_YD, UNIT_WH, 44, 2, 1, false, 0 }, + { TYPE_DC, CH3, FLD_IRR, UNIT_PCT, CALC_IRR_CH, CH3, CMD_CALC, false, 3 }, + + { TYPE_AC, CH0, FLD_UAC, UNIT_V, 74, 2, 10, false, 1 }, // dummy + { TYPE_AC, CH0, FLD_UAC_1N, UNIT_V, 68, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_2N, UNIT_V, 70, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_3N, UNIT_V, 72, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_12, UNIT_V, 74, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_23, UNIT_V, 76, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_UAC_31, UNIT_V, 78, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_F, UNIT_HZ, 80, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PAC, UNIT_W, 82, 2, 10, false, 1 }, + { TYPE_AC, CH0, FLD_Q, UNIT_VAR, 84, 2, 10, true, 1 }, + { TYPE_AC, CH0, FLD_IAC, UNIT_A, 86, 2, 100, false, 2 }, // dummy + { TYPE_AC, CH0, FLD_IAC_1, UNIT_A, 86, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_IAC_2, UNIT_A, 88, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_IAC_3, UNIT_A, 90, 2, 100, false, 2 }, + { TYPE_AC, CH0, FLD_PF, UNIT_NONE, 92, 2, 1000, false, 3 }, + + { TYPE_INV, CH0, FLD_T, UNIT_C, 94, 2, 10, true, 1 }, + { TYPE_INV, CH0, FLD_EVT_LOG, UNIT_NONE, 96, 2, 1, false, 0 }, + + { TYPE_AC, CH0, FLD_YD, UNIT_WH, CALC_YD_CH0, 0, CMD_CALC, false, 0 }, + { TYPE_AC, CH0, FLD_YT, UNIT_KWH, CALC_YT_CH0, 0, CMD_CALC, false, 3 }, + { TYPE_AC, CH0, FLD_PDC, UNIT_W, CALC_PDC_CH0, 0, CMD_CALC, false, 1 }, + { TYPE_AC, CH0, FLD_EFF, UNIT_PCT, CALC_EFF_CH0, 0, CMD_CALC, false, 3 } +}; + +HMT_4CH::HMT_4CH(HoymilesRadio* radio, uint64_t serial) + : HMT_Abstract(radio, serial) {}; + +bool HMT_4CH::isValidSerial(uint64_t serial) +{ + // serial >= 0x136100000000 && serial <= 0x136199999999 + uint16_t preSerial = (serial >> 32) & 0xffff; + return preSerial == 0x1361; +} + +String HMT_4CH::typeName() +{ + return F("HMT-1600/1800/2000-4T"); +} + +const byteAssign_t* HMT_4CH::getByteAssignment() +{ + return byteAssignment; +} + +uint8_t HMT_4CH::getByteAssignmentSize() +{ + return sizeof(byteAssignment) / sizeof(byteAssignment[0]); +} diff --git a/lib/Hoymiles/src/inverters/HMT_4CH.h b/lib/Hoymiles/src/inverters/HMT_4CH.h new file mode 100644 index 00000000..7358dd45 --- /dev/null +++ b/lib/Hoymiles/src/inverters/HMT_4CH.h @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include "HMT_Abstract.h" + +class HMT_4CH : public HMT_Abstract { +public: + explicit HMT_4CH(HoymilesRadio* radio, uint64_t serial); + static bool isValidSerial(uint64_t serial); + String typeName(); + const byteAssign_t* getByteAssignment(); + uint8_t getByteAssignmentSize(); +}; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HMT_6CH.cpp b/lib/Hoymiles/src/inverters/HMT_6CH.cpp index eea3353d..69b3a60b 100644 --- a/lib/Hoymiles/src/inverters/HMT_6CH.cpp +++ b/lib/Hoymiles/src/inverters/HMT_6CH.cpp @@ -84,7 +84,7 @@ bool HMT_6CH::isValidSerial(uint64_t serial) String HMT_6CH::typeName() { - return F("HMT-1800, HMT-2250"); + return F("HMT-1800/2250-6T"); } const byteAssign_t* HMT_6CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HM_1CH.cpp b/lib/Hoymiles/src/inverters/HM_1CH.cpp index 0d54e445..a7c39f4c 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_1CH.cpp @@ -53,7 +53,7 @@ bool HM_1CH::isValidSerial(uint64_t serial) String HM_1CH::typeName() { - return "HM-300, HM-350, HM-400"; + return "HM-300/350/400-1T"; } const byteAssign_t* HM_1CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HM_2CH.cpp b/lib/Hoymiles/src/inverters/HM_2CH.cpp index 01252992..2dc674b2 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_2CH.cpp @@ -61,7 +61,7 @@ bool HM_2CH::isValidSerial(uint64_t serial) String HM_2CH::typeName() { - return "HM-600, HM-700, HM-800"; + return "HM-600/700/800-2T"; } const byteAssign_t* HM_2CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/HM_4CH.cpp b/lib/Hoymiles/src/inverters/HM_4CH.cpp index 5ac57b4c..f5920491 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_4CH.cpp @@ -74,7 +74,7 @@ bool HM_4CH::isValidSerial(uint64_t serial) String HM_4CH::typeName() { - return "HM-1000, HM-1200, HM-1500"; + return "HM-1000/1200/1500-4T"; } const byteAssign_t* HM_4CH::getByteAssignment() diff --git a/lib/Hoymiles/src/inverters/README.md b/lib/Hoymiles/src/inverters/README.md new file mode 100644 index 00000000..c080a735 --- /dev/null +++ b/lib/Hoymiles/src/inverters/README.md @@ -0,0 +1,13 @@ +# Class overview + +| Class | Models | Serial range | +| --------------| --------------------------- | ------------ | +| HM_1CH | HM-300/350/400-1T | 1121 | +| HM_2CH | HM-600/700/800-2T | 1141 | +| HM_4CH | HM-1000/1200/1500-4T | 1161 | +| HMS_1CH | HMS-300/350/400/450/500-1T | 1124 | +| HMS_1CHv2 | HMS-500-1T v2 | 1125 | +| HMS_2CH | HMS-600/700/800/900/1000-2T | 1144 | +| HMS_4CH | HMS-1600/1800/2000-4T | 1164 | +| HMT_4CH | HMT-1600/1800/2000-4T | 1361 | +| HMT_6CH | HMT-1800/2250-6T | 1382 | diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.cpp b/lib/Hoymiles/src/parser/AlarmLogParser.cpp index 92e670e6..fe2d2bab 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.cpp +++ b/lib/Hoymiles/src/parser/AlarmLogParser.cpp @@ -7,117 +7,166 @@ #include const std::array AlarmLogParser::_alarmMessages = { { - { AlarmMessageType_t::ALL, 1, "Inverter start" }, - { AlarmMessageType_t::ALL, 2, "DTU command failed" }, - { AlarmMessageType_t::ALL, 3, "EEPROM reading and writing error during operation" }, - { AlarmMessageType_t::ALL, 4, "Offline" }, - { AlarmMessageType_t::ALL, 11, "Grid voltage surge" }, - { AlarmMessageType_t::ALL, 12, "Grid voltage sharp drop" }, - { AlarmMessageType_t::ALL, 13, "Grid frequency mutation" }, - { AlarmMessageType_t::ALL, 14, "Grid phase mutation" }, - { AlarmMessageType_t::ALL, 15, "Grid transient fluctuation" }, - { AlarmMessageType_t::ALL, 36, "INV overvoltage or overcurrent" }, - { AlarmMessageType_t::ALL, 46, "FB overvoltage" }, - { AlarmMessageType_t::ALL, 47, "FB overcurrent" }, - { AlarmMessageType_t::ALL, 48, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 49, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 61, "Calibration parameter error" }, - { AlarmMessageType_t::ALL, 62, "System configuration parameter error" }, - { AlarmMessageType_t::ALL, 63, "Abnormal power generation data" }, - { AlarmMessageType_t::ALL, 71, "VW function enable" }, - { AlarmMessageType_t::ALL, 72, "FW function enable" }, - { AlarmMessageType_t::ALL, 73, "TW function enable" }, - { AlarmMessageType_t::ALL, 95, "PV module in suspected shadow" }, - { AlarmMessageType_t::ALL, 96, "PV module in suspected shadow" }, - { AlarmMessageType_t::ALL, 97, "PV module in suspected shadow" }, - { AlarmMessageType_t::ALL, 98, "PV module in suspected shadow" }, - { AlarmMessageType_t::ALL, 121, "Over temperature protection" }, - { AlarmMessageType_t::ALL, 122, "Microinverter is suspected of being stolen" }, - { AlarmMessageType_t::ALL, 123, "Locked by remote control" }, - { AlarmMessageType_t::ALL, 124, "Shut down by remote control" }, - { AlarmMessageType_t::ALL, 125, "Grid configuration parameter error" }, - { AlarmMessageType_t::ALL, 126, "Software error code 126" }, - { AlarmMessageType_t::ALL, 127, "Firmware error" }, - { AlarmMessageType_t::ALL, 128, "Software error code 128" }, - { AlarmMessageType_t::ALL, 129, "Abnormal bias" }, - { AlarmMessageType_t::ALL, 130, "Offline" }, - { AlarmMessageType_t::ALL, 141, "Grid: Grid overvoltage" }, - { AlarmMessageType_t::ALL, 142, "Grid: 10 min value grid overvoltage" }, - { AlarmMessageType_t::ALL, 143, "Grid: Grid undervoltage" }, - { AlarmMessageType_t::ALL, 144, "Grid: Grid overfrequency" }, - { AlarmMessageType_t::ALL, 145, "Grid: Grid underfrequency" }, - { AlarmMessageType_t::ALL, 146, "Grid: Rapid grid frequency change rate" }, - { AlarmMessageType_t::ALL, 147, "Grid: Power grid outage" }, - { AlarmMessageType_t::ALL, 148, "Grid: Grid disconnection" }, - { AlarmMessageType_t::ALL, 149, "Grid: Island detected" }, - { AlarmMessageType_t::ALL, 150, "DCI exceeded" }, - { AlarmMessageType_t::HMT, 171, "Grid: Abnormal phase difference between phase to phase" }, - { AlarmMessageType_t::ALL, 181, "Abnormal insulation impedance" }, - { AlarmMessageType_t::ALL, 182, "Abnormal grounding" }, - { AlarmMessageType_t::ALL, 205, "MPPT-A: Input overvoltage" }, - { AlarmMessageType_t::ALL, 206, "MPPT-B: Input overvoltage" }, - { AlarmMessageType_t::ALL, 207, "MPPT-A: Input undervoltage" }, - { AlarmMessageType_t::ALL, 208, "MPPT-B: Input undervoltage" }, - { AlarmMessageType_t::ALL, 209, "PV-1: No input" }, - { AlarmMessageType_t::ALL, 210, "PV-2: No input" }, - { AlarmMessageType_t::ALL, 211, "PV-3: No input" }, - { AlarmMessageType_t::ALL, 212, "PV-4: No input" }, - { AlarmMessageType_t::ALL, 213, "MPPT-A: PV-1 & PV-2 abnormal wiring" }, - { AlarmMessageType_t::ALL, 214, "MPPT-B: PV-3 & PV-4 abnormal wiring" }, - { AlarmMessageType_t::ALL, 215, "PV-1: Input overvoltage" }, - { AlarmMessageType_t::HMT, 215, "MPPT-C: Input overvoltage" }, - { AlarmMessageType_t::ALL, 216, "PV-1: Input undervoltage" }, - { AlarmMessageType_t::HMT, 216, "MPPT-C: Input undervoltage" }, - { AlarmMessageType_t::ALL, 217, "PV-2: Input overvoltage" }, - { AlarmMessageType_t::HMT, 217, "PV-5: No input" }, - { AlarmMessageType_t::ALL, 218, "PV-2: Input undervoltage" }, - { AlarmMessageType_t::HMT, 218, "PV-6: No input" }, - { AlarmMessageType_t::ALL, 219, "PV-3: Input overvoltage" }, - { AlarmMessageType_t::HMT, 219, "MPPT-C: PV-5 & PV-6 abnormal wiring" }, - { AlarmMessageType_t::ALL, 220, "PV-3: Input undervoltage" }, - { AlarmMessageType_t::ALL, 221, "PV-4: Input overvoltage" }, - { AlarmMessageType_t::HMT, 221, "Abnormal wiring of grid neutral line" }, - { AlarmMessageType_t::ALL, 222, "PV-4: Input undervoltage" }, - { AlarmMessageType_t::ALL, 301, "Hardware error code 301 - FB short circuit failure" }, - { AlarmMessageType_t::ALL, 302, "Hardware error code 302 - FB short circuit failure" }, - { AlarmMessageType_t::ALL, 303, "Hardware error code 303 - FB overcurrent protection failure" }, - { AlarmMessageType_t::ALL, 304, "Hardware error code 304 - FB overcurrent protection failure" }, - { AlarmMessageType_t::ALL, 305, "Hardware error code 305 - FB clamp circuit failure" }, - { AlarmMessageType_t::ALL, 306, "Hardware error code 306 - FB clamp circuit failure" }, - { AlarmMessageType_t::ALL, 307, "Hardware error code 307 - INV power device failure" }, - { AlarmMessageType_t::ALL, 308, "Hardware error code 308 - INV overcurrent or overvoltage protection failure" }, - { AlarmMessageType_t::ALL, 309, "Hardware error code 309" }, - { AlarmMessageType_t::ALL, 310, "Hardware error code 310" }, - { AlarmMessageType_t::ALL, 311, "Hardware error code 311" }, - { AlarmMessageType_t::ALL, 312, "Hardware error code 312" }, - { AlarmMessageType_t::ALL, 313, "Hardware error code 313" }, - { AlarmMessageType_t::ALL, 314, "Hardware error code 314" }, - { AlarmMessageType_t::ALL, 1111, "Repeater" }, - { AlarmMessageType_t::ALL, 5041, "Error code-04 Port 1" }, - { AlarmMessageType_t::ALL, 5042, "Error code-04 Port 2" }, - { AlarmMessageType_t::ALL, 5043, "Error code-04 Port 3" }, - { AlarmMessageType_t::ALL, 5044, "Error code-04 Port 4" }, - { AlarmMessageType_t::ALL, 5051, "PV Input 1 Overvoltage/Undervoltage" }, - { AlarmMessageType_t::ALL, 5052, "PV Input 2 Overvoltage/Undervoltage" }, - { AlarmMessageType_t::ALL, 5053, "PV Input 3 Overvoltage/Undervoltage" }, - { AlarmMessageType_t::ALL, 5054, "PV Input 4 Overvoltage/Undervoltage" }, - { AlarmMessageType_t::ALL, 5060, "Abnormal bias" }, - { AlarmMessageType_t::ALL, 5070, "Over temperature protection" }, - { AlarmMessageType_t::ALL, 5080, "Grid Overvoltage/Undervoltage" }, - { AlarmMessageType_t::ALL, 5090, "Grid Overfrequency/Underfrequency" }, - { AlarmMessageType_t::ALL, 5100, "Island detected" }, - { AlarmMessageType_t::ALL, 5110, "GFDI" }, - { AlarmMessageType_t::ALL, 5120, "EEPROM reading and writing error" }, - { AlarmMessageType_t::ALL, 5141, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 5142, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 5143, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 5144, "FB clamp overvoltage" }, - { AlarmMessageType_t::ALL, 5150, "10 min value grid overvoltage" }, - { AlarmMessageType_t::ALL, 5160, "Grid transient fluctuation" }, - { AlarmMessageType_t::ALL, 5200, "Firmware error" }, - { AlarmMessageType_t::ALL, 8310, "Shut down by remote control" }, - { AlarmMessageType_t::ALL, 8320, "Locked by remote control" }, - { AlarmMessageType_t::ALL, 9000, "Microinverter is suspected of being stolen" }, + { AlarmMessageType_t::ALL, 1, "Inverter start", "Wechselrichter gestartet", "L'onduleur a démarré" }, + { AlarmMessageType_t::ALL, 2, "Time calibration", "", "" }, + { AlarmMessageType_t::ALL, 3, "EEPROM reading and writing error during operation", "", "" }, + { AlarmMessageType_t::ALL, 4, "Offline", "Offline", "Non connecté" }, + + { AlarmMessageType_t::ALL, 11, "Grid voltage surge", "", "" }, + { AlarmMessageType_t::ALL, 12, "Grid voltage sharp drop", "", "" }, + { AlarmMessageType_t::ALL, 13, "Grid frequency mutation", "", "" }, + { AlarmMessageType_t::ALL, 14, "Grid phase mutation", "", "" }, + { AlarmMessageType_t::ALL, 15, "Grid transient fluctuation", "", "" }, + + { AlarmMessageType_t::ALL, 36, "INV overvoltage or overcurrent", "", "" }, + + { AlarmMessageType_t::ALL, 46, "FB overvoltage", "FB Überspannung", "" }, + { AlarmMessageType_t::ALL, 47, "FB overcurrent", "FB Überstrom", "" }, + { AlarmMessageType_t::ALL, 48, "FB clamp overvoltage", "", "" }, + { AlarmMessageType_t::ALL, 49, "FB clamp overvoltage", "", "" }, + + { AlarmMessageType_t::ALL, 61, "Calibration parameter error", "", "" }, + { AlarmMessageType_t::ALL, 62, "System configuration parameter error", "", "" }, + { AlarmMessageType_t::ALL, 63, "Abnormal power generation data", "", "" }, + + { AlarmMessageType_t::ALL, 71, "Grid overvoltage load reduction (VW) function enable", "", "" }, + { AlarmMessageType_t::ALL, 72, "Power grid over-frequency load reduction (FW) function enable", "", "" }, + { AlarmMessageType_t::ALL, 73, "Over-temperature load reduction (TW) function enable", "", "" }, + + { AlarmMessageType_t::ALL, 95, "PV-1: Module in suspected shadow", "", "" }, + { AlarmMessageType_t::ALL, 96, "PV-2: Module in suspected shadow", "", "" }, + { AlarmMessageType_t::ALL, 97, "PV-3: Module in suspected shadow", "", "" }, + { AlarmMessageType_t::ALL, 98, "PV-4: Module in suspected shadow", "", "" }, + + { AlarmMessageType_t::ALL, 121, "Over temperature protection", "Übertemperaturschutz", "Protection antisurchauffe" }, + { AlarmMessageType_t::ALL, 122, "Microinverter is suspected of being stolen", "", "" }, + { AlarmMessageType_t::ALL, 123, "Locked by remote control", "", "" }, + { AlarmMessageType_t::ALL, 124, "Shut down by remote control", "Durch Fernsteuerung abgeschaltet", "Arrêt par télécommande" }, + { AlarmMessageType_t::ALL, 125, "Grid configuration parameter error", "Parameterfehler bei der Konfiguration des Elektrizitätsnetzes", "Erreur de paramètre de configuration du réseau" }, + { AlarmMessageType_t::ALL, 126, "Software error code 126", "", "" }, + { AlarmMessageType_t::ALL, 127, "Firmware error", "Firmwarefehler", "Erreur du micrologiciel" }, + { AlarmMessageType_t::ALL, 128, "Hardware configuration error", "", "" }, + { AlarmMessageType_t::ALL, 129, "Abnormal bias", "Abnormaler Trend", "Polarisation anormale" }, + { AlarmMessageType_t::ALL, 130, "Offline", "Offline", "Non connecté" }, + + { AlarmMessageType_t::ALL, 141, "Grid: Grid overvoltage", "Netz: Netzüberspannung", "Réseau: Surtension du réseau" }, + { AlarmMessageType_t::ALL, 142, "Grid: 10 min value grid overvoltage", "Netz: 10 Minuten-Mittelwert der Netzüberspannung", "Réseau: Valeur de surtension du réseau pendant 10 min" }, + { AlarmMessageType_t::ALL, 143, "Grid: Grid undervoltage", "Netz: Netzunterspannung", "Réseau: Sous-tension du réseau" }, + { AlarmMessageType_t::ALL, 144, "Grid: Grid overfrequency", "Netz: Netzüberfrequenz", "Réseau: Surfréquence du réseau" }, + { AlarmMessageType_t::ALL, 145, "Grid: Grid underfrequency", "Netz: Netzunterfrequenz", "Réseau: Sous-fréquence du réseau" }, + { AlarmMessageType_t::ALL, 146, "Grid: Rapid grid frequency change rate", "Netz: Schnelle Wechselrate der Netzfrequenz", "Réseau: Taux de fluctuation rapide de la fréquence du réseau" }, + { AlarmMessageType_t::ALL, 147, "Grid: Power grid outage", "Netz: Eletrizitätsnetzausfall", "Réseau: Panne du réseau électrique" }, + { AlarmMessageType_t::ALL, 148, "Grid: Grid disconnection", "Netz: Netztrennung", "Réseau: Déconnexion du réseau" }, + { AlarmMessageType_t::ALL, 149, "Grid: Island detected", "Netz: Inselbetrieb festgestellt", "Réseau: Détection d’îlots" }, + + { AlarmMessageType_t::ALL, 150, "DCI exceeded", "", "" }, + { AlarmMessageType_t::HMT, 171, "Grid: Abnormal phase difference between phase to phase", "", "" }, + { AlarmMessageType_t::ALL, 181, "Abnormal insulation impedance", "", "" }, + { AlarmMessageType_t::ALL, 182, "Abnormal grounding", "", "" }, + + { AlarmMessageType_t::ALL, 205, "MPPT-A: Input overvoltage", "MPPT-A: Eingangsüberspannung", "MPPT-A: Surtension d’entrée" }, + { AlarmMessageType_t::ALL, 206, "MPPT-B: Input overvoltage", "MPPT-B: Eingangsüberspannung", "MPPT-B: Surtension d’entrée" }, + { AlarmMessageType_t::ALL, 207, "MPPT-A: Input undervoltage", "MPPT-A: Eingangsunterspannung", "MPPT-A: Sous-tension d’entrée" }, + { AlarmMessageType_t::ALL, 208, "MPPT-B: Input undervoltage", "MPPT-B: Eingangsunterspannung", "MPPT-B: Sous-tension d’entrée" }, + + { AlarmMessageType_t::ALL, 209, "PV-1: No input", "PV-1: Kein Eingang", "PV-1: Aucune entrée" }, + { AlarmMessageType_t::ALL, 210, "PV-2: No input", "PV-2: Kein Eingang", "PV-2: Aucune entrée" }, + { AlarmMessageType_t::ALL, 211, "PV-3: No input", "PV-3: Kein Eingang", "PV-3: Aucune entrée" }, + { AlarmMessageType_t::ALL, 212, "PV-4: No input", "PV-4: Kein Eingang", "PV-4: Aucune entrée" }, + + { AlarmMessageType_t::ALL, 213, "MPPT-A: PV-1 & PV-2 abnormal wiring", "MPPT-A: Verdrahtungsfehler bei PV-1 und PV-2", "MPPT-A: Câblages photovoltaïques 1 et 2 anormaux" }, + { AlarmMessageType_t::ALL, 214, "MPPT-B: PV-3 & PV-4 abnormal wiring", "MPPT-B: Verdrahtungsfehler bei PV-3 und PV-4", "MPPT-B: Câblages photovoltaïques 3 et 4 anormaux" }, + + { AlarmMessageType_t::ALL, 215, "PV-1: Input overvoltage", "PV-1: Eingangsüberspannung", "PV-1: Surtension d’entrée" }, + { AlarmMessageType_t::HMT, 215, "MPPT-C: Input overvoltage", "MPPT-C: Eingangsüberspannung", "MPPT-C: Surtension d’entrée" }, + { AlarmMessageType_t::ALL, 216, "PV-1: Input undervoltage", "PV-1: Eingangsunterspannung", "PV-1: Sous-tension d’entrée" }, + { AlarmMessageType_t::HMT, 216, "MPPT-C: Input undervoltage", "MPPT-C: Eingangsunterspannung", "MPPT-C: Sous-tension d’entrée" }, + { AlarmMessageType_t::ALL, 217, "PV-2: Input overvoltage", "PV-2: Eingangsüberspannung", "PV-2: Surtension d’entrée" }, + { AlarmMessageType_t::HMT, 217, "PV-5: No input", "PV-5: Kein Eingang", "PV-5: Aucune entrée" }, + { AlarmMessageType_t::ALL, 218, "PV-2: Input undervoltage", "PV-2: Eingangsunterspannung", "PV-2: Sous-tension d’entrée" }, + { AlarmMessageType_t::HMT, 218, "PV-6: No input", "PV-6: Kein Eingang", "PV-6: Aucune entrée" }, + { AlarmMessageType_t::ALL, 219, "PV-3: Input overvoltage", "PV-3: Eingangsüberspannung", "PV-3: Surtension d’entrée" }, + { AlarmMessageType_t::HMT, 219, "MPPT-C: PV-5 & PV-6 abnormal wiring", "", "" }, + { AlarmMessageType_t::ALL, 220, "PV-3: Input undervoltage", "PV-3: Eingangsunterspannung", "PV-3: Sous-tension d’entrée" }, + { AlarmMessageType_t::ALL, 221, "PV-4: Input overvoltage", "PV-4: Eingangsüberspannung", "PV-4: Surtension d’entrée" }, + { AlarmMessageType_t::HMT, 221, "Abnormal wiring of grid neutral line", "", "" }, + { AlarmMessageType_t::ALL, 222, "PV-4: Input undervoltage", "PV-4: Eingangsunterspannung", "PV-4: Sous-tension d’entrée" }, + + { AlarmMessageType_t::ALL, 301, "FB-A: internal short circuit failure", "", "" }, + { AlarmMessageType_t::ALL, 302, "FB-B: internal short circuit failure", "", "" }, + + { AlarmMessageType_t::ALL, 303, "FB-A: overcurrent protection failure", "", "" }, + { AlarmMessageType_t::ALL, 304, "FB-B: overcurrent protection failure", "", "" }, + + { AlarmMessageType_t::ALL, 305, "FB-A: clamp circuit failure", "", "" }, + { AlarmMessageType_t::ALL, 306, "FB-B: clamp circuit failure", "", "" }, + + { AlarmMessageType_t::ALL, 307, "INV power device failure", "", "" }, + { AlarmMessageType_t::ALL, 308, "INV overcurrent or overvoltage protection failure", "", "" }, + + { AlarmMessageType_t::ALL, 309, "Hardware error code 309", "Hardwarefehlercode 309", "" }, + { AlarmMessageType_t::ALL, 310, "Hardware error code 310", "Hardwarefehlercode 310", "" }, + { AlarmMessageType_t::ALL, 311, "Hardware error code 311", "Hardwarefehlercode 311", "" }, + { AlarmMessageType_t::ALL, 312, "Hardware error code 312", "Hardwarefehlercode 312", "" }, + { AlarmMessageType_t::ALL, 313, "Hardware error code 313", "Hardwarefehlercode 313", "" }, + { AlarmMessageType_t::ALL, 314, "Hardware error code 314", "Hardwarefehlercode 314", "" }, + + { AlarmMessageType_t::ALL, 1111, "Repeater", "", "" }, + + { AlarmMessageType_t::ALL, 2000, "Standby", "", "" }, + { AlarmMessageType_t::ALL, 2001, "Standby", "", "" }, + { AlarmMessageType_t::ALL, 2002, "Standby", "", "" }, + { AlarmMessageType_t::ALL, 2003, "Standby", "", "" }, + { AlarmMessageType_t::ALL, 2004, "Standby", "", "" }, + + { AlarmMessageType_t::ALL, 3001, "Reset", "", "" }, + { AlarmMessageType_t::ALL, 3002, "Reset", "", "" }, + { AlarmMessageType_t::ALL, 3003, "Reset", "", "" }, + { AlarmMessageType_t::ALL, 3004, "Reset", "", "" }, + + { AlarmMessageType_t::ALL, 5011, "PV-1: MOSFET overcurrent (II)", "PV-1: MOSFET Überstrom (II)", "" }, + { AlarmMessageType_t::ALL, 5012, "PV-2: MOSFET overcurrent (II)", "PV-2: MOSFET Überstrom (II)", "" }, + { AlarmMessageType_t::ALL, 5013, "PV-3: MOSFET overcurrent (II)", "PV-3: MOSFET Überstrom (II)", "" }, + { AlarmMessageType_t::ALL, 5014, "PV-4: MOSFET overcurrent (II)", "PV-4: MOSFET Überstrom (II)", "" }, + { AlarmMessageType_t::ALL, 5020, "H-bridge MOSFET overcurrent or H-bridge overvoltage", "H-Brücken-MOSFET-Überstrom oder H-Brücken-Überspannung", "" }, + + { AlarmMessageType_t::ALL, 5041, "PV-1: current overcurrent (II)", "", "" }, + { AlarmMessageType_t::ALL, 5042, "PV-2: current overcurrent (II)", "", "" }, + { AlarmMessageType_t::ALL, 5043, "PV-3: current overcurrent (II)", "", "" }, + { AlarmMessageType_t::ALL, 5044, "PV-4: current overcurrent (II)", "", "" }, + + { AlarmMessageType_t::ALL, 5051, "PV-1: Overvoltage/Undervoltage", "", "" }, + { AlarmMessageType_t::ALL, 5052, "PV-2: Overvoltage/Undervoltage", "", "" }, + { AlarmMessageType_t::ALL, 5053, "PV-3: Overvoltage/Undervoltage", "", "" }, + { AlarmMessageType_t::ALL, 5054, "PV-4: Overvoltage/Undervoltage", "", "" }, + + { AlarmMessageType_t::ALL, 5060, "Abnormal bias", "Abnormaler Trend", "Polarisation anormale" }, + { AlarmMessageType_t::ALL, 5070, "Over temperature protection", "Übertemperaturschutz", "Protection antisurchauffe" }, + { AlarmMessageType_t::ALL, 5080, "Grid Overvoltage/Undervoltage", "", "" }, + { AlarmMessageType_t::ALL, 5090, "Grid Overfrequency/Underfrequency", "", "" }, + { AlarmMessageType_t::ALL, 5100, "Island detected", "Inselbetrieb festgestellt", "Détection d’îlots" }, + { AlarmMessageType_t::ALL, 5110, "GFDI failure", "", "" }, + { AlarmMessageType_t::ALL, 5120, "EEPROM reading and writing error", "", "" }, + + { AlarmMessageType_t::ALL, 5141, "FB clamp overvoltage", "", "" }, + { AlarmMessageType_t::ALL, 5142, "FB clamp overvoltage", "", "" }, + { AlarmMessageType_t::ALL, 5143, "FB clamp overvoltage", "", "" }, + { AlarmMessageType_t::ALL, 5144, "FB clamp overvoltage", "", "" }, + + { AlarmMessageType_t::ALL, 5150, "10 min value grid overvoltage", "10 Minuten-Mittelwert der Netzüberspannung", "Valeur de surtension du réseau pendant 10 min" }, + { AlarmMessageType_t::ALL, 5160, "Grid transient fluctuation", "", "" }, + + { AlarmMessageType_t::ALL, 5200, "Firmware error", "Firmwarefehler", "Erreur du micrologiciel" }, + + { AlarmMessageType_t::ALL, 5511, "PV-1: MOSFET overcurrent-H", "PV-1: MOSFET Überstrom-H", "" }, + { AlarmMessageType_t::ALL, 5512, "PV-2: MOSFET overcurrent-H", "PV-2: MOSFET Überstrom-H", "" }, + { AlarmMessageType_t::ALL, 5513, "PV-3: MOSFET overcurrent-H", "PV-3: MOSFET Überstrom-H", "" }, + { AlarmMessageType_t::ALL, 5514, "PV-4: MOSFET overcurrent-H", "PV-4: MOSFET Überstrom-H", "" }, + { AlarmMessageType_t::ALL, 5520, "H-bridge MOSFET overcurrent or H-bridge overvoltage", "H-Brücken-MOSFET-Überstrom oder H-Brücken-Überspannung", "" }, + + { AlarmMessageType_t::ALL, 8310, "Shut down by remote control", "Durch Fernsteuerung abgeschaltet", "Arrêt par télécommande" }, + { AlarmMessageType_t::ALL, 8320, "Locked by remote control", "", "" }, + { AlarmMessageType_t::ALL, 9000, "Microinverter is suspected of being stolen", "", "" }, } }; AlarmLogParser::AlarmLogParser() @@ -165,7 +214,7 @@ void AlarmLogParser::setMessageType(AlarmMessageType_t type) _messageType = type; } -void AlarmLogParser::getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry) +void AlarmLogParser::getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry, AlarmMessageLocale_t locale) { uint8_t entryStartOffset = 2 + entryId * ALARM_LOG_ENTRY_SIZE; @@ -194,19 +243,42 @@ void AlarmLogParser::getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry) entry->EndTime += (endTimeOffset + timezoneOffset); } - entry->Message = "Unknown"; + switch (locale) { + case AlarmMessageLocale_t::DE: + entry->Message = "Unbekannt"; + break; + case AlarmMessageLocale_t::FR: + entry->Message = "Inconnu"; + break; + default: + entry->Message = "Unknown"; + } + for (auto& msg : _alarmMessages) { if (msg.MessageId == entry->MessageId) { if (msg.InverterType == _messageType) { - entry->Message = msg.Message; + entry->Message = getLocaleMessage(&msg, locale); break; } else if (msg.InverterType == AlarmMessageType_t::ALL) { - entry->Message = msg.Message; + entry->Message = getLocaleMessage(&msg, locale); } } } } +String AlarmLogParser::getLocaleMessage(const AlarmMessage_t* msg, AlarmMessageLocale_t locale) +{ + if (locale == AlarmMessageLocale_t::DE) { + return msg->Message_de[0] != '\0' ? msg->Message_de : msg->Message_en; + } + + if (locale == AlarmMessageLocale_t::FR) { + return msg->Message_fr[0] != '\0' ? msg->Message_fr : msg->Message_en; + } + + return msg->Message_en; +} + int AlarmLogParser::getTimezoneOffset() { // see: https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c/44063597#44063597 diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.h b/lib/Hoymiles/src/parser/AlarmLogParser.h index 8cdeb064..9189d175 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.h +++ b/lib/Hoymiles/src/parser/AlarmLogParser.h @@ -8,7 +8,7 @@ #define ALARM_LOG_ENTRY_SIZE 12 #define ALARM_LOG_PAYLOAD_SIZE (ALARM_LOG_ENTRY_COUNT * ALARM_LOG_ENTRY_SIZE + 4) -#define ALARM_MSG_COUNT 111 +#define ALARM_MSG_COUNT 130 struct AlarmLogEntry_t { uint16_t MessageId; @@ -22,10 +22,18 @@ enum class AlarmMessageType_t { HMT }; +enum class AlarmMessageLocale_t { + EN, + DE, + FR +}; + typedef struct { AlarmMessageType_t InverterType; uint16_t MessageId; - String Message; + char Message_en[62]; + char Message_de[63]; + char Message_fr[64]; } AlarmMessage_t; class AlarmLogParser : public Parser { @@ -35,7 +43,7 @@ public: void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len); uint8_t getEntryCount(); - void getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry); + void getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry, AlarmMessageLocale_t locale = AlarmMessageLocale_t::EN); void setLastAlarmRequestSuccess(LastCommandSuccess status); LastCommandSuccess getLastAlarmRequestSuccess(); @@ -44,6 +52,7 @@ public: private: static int getTimezoneOffset(); + String getLocaleMessage(const AlarmMessage_t *msg, AlarmMessageLocale_t locale); uint8_t _payloadAlarmLog[ALARM_LOG_PAYLOAD_SIZE]; uint8_t _alarmLogLength = 0; diff --git a/src/Configuration.cpp b/src/Configuration.cpp index b223738c..da07d97c 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -41,6 +41,9 @@ bool ConfigurationClass::write() wifi["hostname"] = config.WiFi_Hostname; wifi["aptimeout"] = config.WiFi_ApTimeout; + JsonObject mdns = doc.createNestedObject("mdns"); + mdns["enabled"] = config.Mdns_Enabled; + JsonObject ntp = doc.createNestedObject("ntp"); ntp["server"] = config.Ntp_Server; ntp["timezone"] = config.Ntp_Timezone; @@ -265,6 +268,9 @@ bool ConfigurationClass::read() config.WiFi_Dhcp = wifi["dhcp"] | WIFI_DHCP; config.WiFi_ApTimeout = wifi["aptimeout"] | ACCESS_POINT_TIMEOUT; + JsonObject mdns = doc["mdns"]; + config.Mdns_Enabled = mdns["enabled"] | MDNS_ENABLED; + JsonObject ntp = doc["ntp"]; strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server)); strlcpy(config.Ntp_Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp_Timezone)); diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 6fb1fd1c..0188cff4 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -93,7 +93,7 @@ void InverterSettingsClass::init() void InverterSettingsClass::loop() { - if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) { + if (millis() - _lastUpdate > INVERTER_UPDATE_SETTINGS_INTERVAL) { const CONFIG_T& config = Configuration.get(); for (uint8_t i = 0; i < INV_MAX_COUNT; i++) { @@ -112,4 +112,4 @@ void InverterSettingsClass::loop() } Hoymiles.loop(); -} \ No newline at end of file +} diff --git a/src/Led_Single.cpp b/src/Led_Single.cpp index 7ce6637f..09658c85 100644 --- a/src/Led_Single.cpp +++ b/src/Led_Single.cpp @@ -22,8 +22,8 @@ void LedSingleClass::init() _updateTimeout.set(LEDSINGLE_UPDATE_INTERVAL); turnAllOn(); + auto& pin = PinMapping.get(); for (uint8_t i = 0; i < PINMAPPING_LED_COUNT; i++) { - auto& pin = PinMapping.get(); if (pin.led[i] >= 0) { pinMode(pin.led[i], OUTPUT); @@ -74,8 +74,8 @@ void LedSingleClass::loop() _ledState[1] = LedState_t::Off; } + auto& pin = PinMapping.get(); for (uint8_t i = 0; i < PINMAPPING_LED_COUNT; i++) { - auto& pin = PinMapping.get(); if (pin.led[i] < 0) { continue; diff --git a/src/MqttHandleHass.cpp b/src/MqttHandleHass.cpp index d613355a..dd2f5608 100644 --- a/src/MqttHandleHass.cpp +++ b/src/MqttHandleHass.cpp @@ -115,9 +115,9 @@ void MqttHandleHassClass::publishField(std::shared_ptr inv, Ch String name; if (type != TYPE_DC) { - name = String(inv->name()) + " " + fieldName; + name = fieldName; } else { - name = String(inv->name()) + " CH" + chanNum + " " + fieldName; + name = "CH" + chanNum + " " + fieldName; } DynamicJsonDocument root(1024); @@ -166,7 +166,7 @@ void MqttHandleHassClass::publishInverterButton(std::shared_ptrname()) + " " + caption; + root["name"] = caption; root["uniq_id"] = serial + "_" + buttonId; if (strcmp(icon, "")) { root["ic"] = icon; @@ -205,7 +205,7 @@ void MqttHandleHassClass::publishInverterNumber( String statTopic = MqttSettings.getPrefix() + serial + "/" + stateTopic; DynamicJsonDocument root(1024); - root["name"] = String(inv->name()) + " " + caption; + root["name"] = caption; root["uniq_id"] = serial + "_" + buttonId; if (strcmp(icon, "")) { root["ic"] = icon; @@ -240,7 +240,7 @@ void MqttHandleHassClass::publishInverterBinarySensor(std::shared_ptrname()) + " " + caption; + root["name"] = caption; root["uniq_id"] = serial + "_" + sensorId; root["stat_t"] = statTopic; root["pl_on"] = payload_on; diff --git a/src/MqttSettings.cpp b/src/MqttSettings.cpp index b7ef7660..2232d53b 100644 --- a/src/MqttSettings.cpp +++ b/src/MqttSettings.cpp @@ -185,18 +185,13 @@ String MqttSettingsClass::getPrefix() void MqttSettingsClass::publish(const String& subtopic, const String& payload) { - std::lock_guard lock(_clientLock); - if (mqttClient == nullptr) { - return; - } - String topic = getPrefix(); topic += subtopic; String value = payload; value.trim(); - mqttClient->publish(topic.c_str(), 0, Configuration.get().Mqtt_Retain, value.c_str()); + publishGeneric(topic, value, Configuration.get().Mqtt_Retain, 0); } void MqttSettingsClass::publishGeneric(const String& topic, const String& payload, bool retain, uint8_t qos) diff --git a/src/NetworkSettings.cpp b/src/NetworkSettings.cpp index e0957545..7e725ff1 100644 --- a/src/NetworkSettings.cpp +++ b/src/NetworkSettings.cpp @@ -8,6 +8,7 @@ #include "PinMapping.h" #include "Utils.h" #include "defaults.h" +#include #include NetworkSettingsClass::NetworkSettingsClass() @@ -110,6 +111,35 @@ void NetworkSettingsClass::raiseEvent(network_event event) } } +void NetworkSettingsClass::handleMDNS() +{ + bool mdnsEnabled = Configuration.get().Mdns_Enabled; + + if (lastMdnsEnabled == mdnsEnabled) { + return; + } + + lastMdnsEnabled = mdnsEnabled; + + MDNS.end(); + + if (!mdnsEnabled) { + return; + } + + if (MDNS.begin(getHostname())) { + MessageOutput.print("MDNS responder starting..."); + + MDNS.addService("http", "tcp", 80); + MDNS.addService("opendtu", "tcp", 80); + MDNS.addServiceTxt("opendtu", "tcp", "git_hash", AUTO_GIT_HASH); + + MessageOutput.println("done"); + } else { + MessageOutput.println("Error setting up MDNS responder!"); + } +} + void NetworkSettingsClass::setupMode() { if (adminEnabled) { @@ -121,8 +151,8 @@ void NetworkSettingsClass::setupMode() dnsServer->start(DNS_PORT, "*", WiFi.softAPIP()); dnsServerStatus = true; } else { - dnsServer->stop(); dnsServerStatus = false; + dnsServer->stop(); if (_networkMode == network_mode::WiFi) { WiFi.mode(WIFI_STA); } else { @@ -218,6 +248,8 @@ void NetworkSettingsClass::loop() if (dnsServerStatus) { dnsServer->processNextRequest(); } + + handleMDNS(); } void NetworkSettingsClass::applyConfig() @@ -417,4 +449,4 @@ network_mode NetworkSettingsClass::NetworkMode() return _networkMode; } -NetworkSettingsClass NetworkSettings; \ No newline at end of file +NetworkSettingsClass NetworkSettings; diff --git a/src/SunPosition.cpp b/src/SunPosition.cpp index a32920ec..7044ae48 100644 --- a/src/SunPosition.cpp +++ b/src/SunPosition.cpp @@ -19,9 +19,8 @@ void SunPositionClass::init() void SunPositionClass::loop() { - if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) { + if (getDoRecalc() || checkRecalcDayChanged()) { updateSunData(); - _lastUpdate = millis(); } } @@ -35,14 +34,45 @@ bool SunPositionClass::isSunsetAvailable() return _isSunsetAvailable; } +void SunPositionClass::setDoRecalc(bool doRecalc) +{ + std::lock_guard lock(_recalcLock); + _doRecalc = doRecalc; +} + +bool SunPositionClass::getDoRecalc() +{ + std::lock_guard lock(_recalcLock); + return _doRecalc; +} + +bool SunPositionClass::checkRecalcDayChanged() +{ + time_t now; + struct tm timeinfo; + + time(&now); + localtime_r(&now, &timeinfo); // don't use getLocalTime() as there could be a delay of 10ms + + uint32_t ymd; + ymd = (timeinfo.tm_year << 9) | (timeinfo.tm_mon << 5) | timeinfo.tm_mday; + + if (_lastSunPositionCalculatedYMD != ymd) { + return true; + } + return false; +} + void SunPositionClass::updateSunData() { - CONFIG_T const& config = Configuration.get(); - int offset = Utils::getTimezoneOffset() / 3600; - _sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset); - struct tm timeinfo; - if (!getLocalTime(&timeinfo, 5)) { + bool gotLocalTime; + + gotLocalTime = getLocalTime(&timeinfo, 5); + _lastSunPositionCalculatedYMD = (timeinfo.tm_year << 9) | (timeinfo.tm_mon << 5) | timeinfo.tm_mday; + setDoRecalc(false); + + if (!gotLocalTime) { _isDayPeriod = true; _sunriseMinutes = 0; _sunsetMinutes = 0; @@ -50,6 +80,10 @@ void SunPositionClass::updateSunData() return; } + CONFIG_T const& config = Configuration.get(); + int offset = Utils::getTimezoneOffset() / 3600; + + _sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset); _sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday); double sunset_type; @@ -125,4 +159,4 @@ bool SunPositionClass::sunriseTime(struct tm* info) localtime_r(&midnight, info); return _isValidInfo; -} \ No newline at end of file +} diff --git a/src/WebApi_eventlog.cpp b/src/WebApi_eventlog.cpp index 5c66375c..2b267272 100644 --- a/src/WebApi_eventlog.cpp +++ b/src/WebApi_eventlog.cpp @@ -35,6 +35,18 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) serial = strtoll(s.c_str(), NULL, 16); } + AlarmMessageLocale_t locale = AlarmMessageLocale_t::EN; + if (request->hasParam("locale")) { + String s = request->getParam("locale")->value(); + s.toLowerCase(); + if (s == "de") { + locale = AlarmMessageLocale_t::DE; + } + if (s == "fr") { + locale = AlarmMessageLocale_t::FR; + } + } + auto inv = Hoymiles.getInverterBySerial(serial); if (inv != nullptr) { @@ -47,7 +59,7 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) JsonObject eventsObject = eventsArray.createNestedObject(); AlarmLogEntry_t entry; - inv->EventLog()->getLogEntry(logEntry, &entry); + inv->EventLog()->getLogEntry(logEntry, &entry, locale); eventsObject["message_id"] = entry.MessageId; eventsObject["message"] = entry.Message; diff --git a/src/WebApi_network.cpp b/src/WebApi_network.cpp index 9c05e7cc..849c5f8a 100644 --- a/src/WebApi_network.cpp +++ b/src/WebApi_network.cpp @@ -76,6 +76,7 @@ void WebApiNetworkClass::onNetworkAdminGet(AsyncWebServerRequest* request) root["ssid"] = config.WiFi_Ssid; root["password"] = config.WiFi_Password; root["aptimeout"] = config.WiFi_ApTimeout; + root["mdnsenabled"] = config.Mdns_Enabled; response->setLength(); request->send(response); @@ -236,6 +237,7 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) config.WiFi_Dhcp = false; } config.WiFi_ApTimeout = root["aptimeout"].as(); + config.Mdns_Enabled = root["mdnsenabled"].as(); Configuration.write(); retMsg["type"] = "success"; diff --git a/src/WebApi_ntp.cpp b/src/WebApi_ntp.cpp index 52c665e2..c0cfaa44 100644 --- a/src/WebApi_ntp.cpp +++ b/src/WebApi_ntp.cpp @@ -190,6 +190,8 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request) NtpSettings.setServer(); NtpSettings.setTimezone(); + + SunPosition.setDoRecalc(true); } void WebApiNtpClass::onNtpTimeGet(AsyncWebServerRequest* request) @@ -350,4 +352,4 @@ void WebApiNtpClass::onNtpTimePost(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/webapp/package.json b/webapp/package.json index eb8fa552..f7f91a57 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -17,30 +17,30 @@ "mitt": "^3.0.1", "sortablejs": "^1.15.0", "spark-md5": "^3.0.2", - "vue": "^3.3.4", - "vue-i18n": "^9.5.0", + "vue": "^3.3.8", + "vue-i18n": "^9.6.5", "vue-router": "^4.2.5" }, "devDependencies": { - "@intlify/unplugin-vue-i18n": "^1.4.0", + "@intlify/unplugin-vue-i18n": "^1.5.0", "@rushstack/eslint-patch": "^1.5.1", "@tsconfig/node18": "^18.2.2", - "@types/bootstrap": "^5.2.7", - "@types/node": "^20.8.3", - "@types/sortablejs": "^1.15.3", - "@types/spark-md5": "^3.0.2", - "@vitejs/plugin-vue": "^4.4.0", + "@types/bootstrap": "^5.2.9", + "@types/node": "^20.9.0", + "@types/sortablejs": "^1.15.5", + "@types/spark-md5": "^3.0.4", + "@vitejs/plugin-vue": "^4.4.1", "@vue/eslint-config-typescript": "^12.0.0", "@vue/tsconfig": "^0.4.0", - "eslint": "^8.51.0", - "eslint-plugin-vue": "^9.17.0", + "eslint": "^8.53.0", + "eslint-plugin-vue": "^9.18.1", "npm-run-all": "^4.1.5", - "sass": "^1.69.0", - "terser": "^5.21.0", + "sass": "^1.69.5", + "terser": "^5.24.0", "typescript": "^5.2.2", - "vite": "^4.4.11", + "vite": "^4.5.0", "vite-plugin-compression": "^0.5.1", "vite-plugin-css-injected-by-js": "^3.3.0", - "vue-tsc": "^1.8.18" + "vue-tsc": "^1.8.22" } } diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 5c6a2fb6..311f8dac 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -463,7 +463,9 @@ "ApTimeout": "AccessPoint Zeitlimit:", "ApTimeoutHint": "Zeit die der AccessPoint offen gehalten wird. Ein Wert von 0 bedeutet unendlich.", "Minutes": "Minuten", - "Save": "@:dtuadmin.Save" + "Save": "@:dtuadmin.Save", + "EnableMdns": "mDNS aktivieren", + "MdnsSettings": "mDNS-Einstellungen" }, "mqttadmin": { "MqttSettings": "MQTT-Einstellungen", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 0d35def5..b71498e2 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -465,7 +465,9 @@ "ApTimeout": "AccessPoint Timeout:", "ApTimeoutHint": "Time which the AccessPoint is kept open. A value of 0 means infinite.", "Minutes": "minutes", - "Save": "@:dtuadmin.Save" + "Save": "@:dtuadmin.Save", + "EnableMdns": "Enable mDNS", + "MdnsSettings": "mDNS Settings" }, "mqttadmin": { "MqttSettings": "MQTT Settings", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index 6eff2da7..d8a493c1 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -463,7 +463,9 @@ "ApTimeout": "Délai d'attente du point d'accès", "ApTimeoutHint": "Durée pendant laquelle le point d'accès reste ouvert. Une valeur de 0 signifie infini.", "Minutes": "minutes", - "Save": "@:dtuadmin.Save" + "Save": "@:dtuadmin.Save", + "EnableMdns": "Activer mDNS", + "MdnsSettings": "mDNS Settings" }, "mqttadmin": { "MqttSettings": "Paramètres MQTT", diff --git a/webapp/src/scss/styles.scss b/webapp/src/scss/styles.scss index 6c1720cb..c33417b6 100644 --- a/webapp/src/scss/styles.scss +++ b/webapp/src/scss/styles.scss @@ -1,2 +1,6 @@ // Import all of Bootstrap's CSS @import "~bootstrap/scss/bootstrap"; + +main { + font-feature-settings: "tnum"; +} \ No newline at end of file diff --git a/webapp/src/types/NetworkkConfig.ts b/webapp/src/types/NetworkConfig.ts similarity index 89% rename from webapp/src/types/NetworkkConfig.ts rename to webapp/src/types/NetworkConfig.ts index e9b3578b..da5ddd44 100644 --- a/webapp/src/types/NetworkkConfig.ts +++ b/webapp/src/types/NetworkConfig.ts @@ -9,4 +9,5 @@ export interface NetworkConfig { dns1: string; dns2: string; aptimeout: number; -} \ No newline at end of file + mdnsenabled: boolean; +} diff --git a/webapp/src/views/HomeView.vue b/webapp/src/views/HomeView.vue index 6060ba31..3d80effd 100644 --- a/webapp/src/views/HomeView.vue +++ b/webapp/src/views/HomeView.vue @@ -589,7 +589,7 @@ export default defineComponent({ }, onShowEventlog(serial: number) { this.eventLogLoading = true; - fetch("/api/eventlog/status?inv=" + serial, { headers: authHeader() }) + fetch("/api/eventlog/status?inv=" + serial + "&locale=" + this.$i18n.locale, { headers: authHeader() }) .then((response) => handleResponse(response, this.$emitter, this.$router)) .then((data) => { this.eventLogList = data; diff --git a/webapp/src/views/LoginView.vue b/webapp/src/views/LoginView.vue index ef533bff..e097e3f4 100644 --- a/webapp/src/views/LoginView.vue +++ b/webapp/src/views/LoginView.vue @@ -9,7 +9,7 @@
+ :class="{ 'is-invalid': submitted && !username }" @keydown.space.prevent />
{{ $t('login.UsernameRequired') }}
diff --git a/webapp/src/views/NetworkAdminView.vue b/webapp/src/views/NetworkAdminView.vue index c8bf0cb8..1019f3e9 100644 --- a/webapp/src/views/NetworkAdminView.vue +++ b/webapp/src/views/NetworkAdminView.vue @@ -50,6 +50,12 @@ type="text" maxlength="32"/> + + + + \ No newline at end of file + diff --git a/webapp/yarn.lock b/webapp/yarn.lock index b4ebc659..e17dcffd 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -12,11 +12,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== -"@babel/parser@^7.20.15", "@babel/parser@^7.21.3": +"@babel/parser@^7.21.3": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@esbuild/android-arm64@0.18.11": version "0.18.11" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz#fa6f0cc7105367cb79cc0a8bf32bf50cb1673e45" @@ -151,10 +156,10 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -166,17 +171,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.51.0": - version "8.51.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" - integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -185,10 +190,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@intlify/bundle-utils@^7.4.0": version "7.4.0" @@ -206,20 +211,20 @@ source-map-js "^1.0.1" yaml-eslint-parser "^1.2.2" -"@intlify/core-base@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.5.0.tgz#cbb17a27029ccfd0a83a837931baee08b887af60" - integrity sha512-y3ufM1RJbI/DSmJf3lYs9ACq3S/iRvaSsE3rPIk0MGH7fp+JxU6rdryv/EYcwfcr3Y1aHFlCBir6S391hRZ57w== +"@intlify/core-base@9.6.5": + version "9.6.5" + resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.6.5.tgz#af92cae122fb99e882b3d7f1433f682065a3e164" + integrity sha512-LzbGXiZkMWPIHnHI0g6q554S87Cmh2mmCmjytK/3pDQfjI84l+dgGoeQuKj02q7EbULRuUUgYVZVqAwEUawXGg== dependencies: - "@intlify/message-compiler" "9.5.0" - "@intlify/shared" "9.5.0" + "@intlify/message-compiler" "9.6.5" + "@intlify/shared" "9.6.5" -"@intlify/message-compiler@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.5.0.tgz#1b4916bf11ca7024f9c15be0d6b4de7be5317808" - integrity sha512-CAhVNfEZcOVFg0/5MNyt+OFjvs4J/ARjCj2b+54/FvFP0EDJI5lIqMTSDBE7k0atMROSP0SvWCkwu/AZ5xkK1g== +"@intlify/message-compiler@9.6.5": + version "9.6.5" + resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.6.5.tgz#3a33882497417c63b23b012731d60a485c8e5558" + integrity sha512-WeJ499thIj0p7JaIO1V3JaJbqdqfBykS5R8fElFs5hNeotHtPAMBs4IiA+8/KGFkAbjJusgFefCq6ajP7F7+4Q== dependencies: - "@intlify/shared" "9.5.0" + "@intlify/shared" "9.6.5" source-map-js "^1.0.2" "@intlify/message-compiler@^9.4.0": @@ -235,15 +240,15 @@ resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.4.0.tgz#4a78d462fc82433db900981e12eb5b1aae3d6085" integrity sha512-AFqymip2kToqA0B6KZPg5jSrdcVHoli9t/VhGKE2iiMq9utFuMoGdDC/JOCIZgwxo6aXAk86QyU2XtzEoMuZ6A== -"@intlify/shared@9.5.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.5.0.tgz#185d9ab9f6b4bb4f4d133cfdd51432e9b94c2c44" - integrity sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA== +"@intlify/shared@9.6.5": + version "9.6.5" + resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.6.5.tgz#a81f384d804e99ceac55bb061c344f156bd96590" + integrity sha512-gD7Ey47Xi4h/t6P+S04ymMSoA3wVRxGqjxuIMglwRO8POki9h164Epu2N8wk/GHXM/hR6ZGcsx2HArCCENjqSQ== -"@intlify/unplugin-vue-i18n@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.4.0.tgz#581ac40567240209ed0851e27bfc7c9487cf55ec" - integrity sha512-RGDchCRBlDTyVVFgPA1C1XC1uD4xYN81Ma+3EnU6GQ8pBEreraX/PWdPXXzOB6k9GWCQHuqii3atYXhcH3rpSg== +"@intlify/unplugin-vue-i18n@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-1.5.0.tgz#fe2e67d50beefc4b67702a7bcec23062123cb52d" + integrity sha512-jW0MCCdwxybxcwjEfCunAcKjVoxyO3i+cnLL6v+MNGRLUHqrpELF6zQAJUhgAK2afhY7mCliy8RxTFWKdXm26w== dependencies: "@intlify/bundle-utils" "^7.4.0" "@intlify/shared" "^9.4.0" @@ -290,6 +295,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -348,10 +358,10 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-18.2.2.tgz#81fb16ecff0d400b1cbadbf76713b50f331029ce" integrity sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw== -"@types/bootstrap@^5.2.7": - version "5.2.7" - resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.2.7.tgz#a920df4ea82d8cc605751007f5c9744336842f30" - integrity sha512-vWs0HzobIB8Af2F0B1GXpaVLSVn1NWULDYgTIWp08Et/r2B3aAwwhFBeOs/rRFWJA38EZTXkWP3tepIjpQkpLg== +"@types/bootstrap@^5.2.9": + version "5.2.9" + resolved "https://registry.yarnpkg.com/@types/bootstrap/-/bootstrap-5.2.9.tgz#5040df5d8d12cb9fb6268a33b8d87234af15e09a" + integrity sha512-Fcg4nORBKaVUAG4F0ePWcatWQVfr3NAT9XIN+hl1PaiAwb4tq55+iua9R3exsbB3yyfhyQlHYg2foTlW86J+RA== dependencies: "@popperjs/core" "^2.9.2" @@ -365,25 +375,27 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== -"@types/node@^20.8.3": - version "20.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" - integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== +"@types/node@^20.9.0": + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== + dependencies: + undici-types "~5.26.4" "@types/semver@^7.5.0": version "7.5.1" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== -"@types/sortablejs@^1.15.3": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.15.3.tgz#b9c0e2740100ae94919c9f138a38600c8f8124ea" - integrity sha512-v+zh6TZP/cLeMUK0MDx1onp8e7Jk2/4iTQ7sb/n80rTAvBm14yJkpOEfJdrTCkHiF7IZbPjxGX2NRJfogRoYIg== +"@types/sortablejs@^1.15.5": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.15.5.tgz#c59e51765bc53c920192de0d0202f75b7ce4cb3f" + integrity sha512-qqqbEFbB1EZt08I1Ok2BA3Sx0zlI8oizdIguMsajk4Yo/iHgXhCb3GM6N09JOJqT9xIMYM9LTFy8vit3RNY71Q== -"@types/spark-md5@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/spark-md5/-/spark-md5-3.0.2.tgz#da2e8a778a20335fc4f40b6471c4b0d86b70da55" - integrity sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ== +"@types/spark-md5@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/spark-md5/-/spark-md5-3.0.4.tgz#c1221d63c069d95aba0c06a765b80661cacc12bf" + integrity sha512-qtOaDz+IXiNndPgYb6t1YoutnGvFRtWSNzpVjkAPCfB2UzTyybuD4Tjgs7VgRawum3JnJNRwNQd4N//SvrHg1Q== "@typescript-eslint/eslint-plugin@^6.7.0": version "6.7.0" @@ -470,31 +482,37 @@ "@typescript-eslint/types" "6.7.0" eslint-visitor-keys "^3.4.1" -"@vitejs/plugin-vue@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz#8ae96573236cdb12de6850a6d929b5537ec85390" - integrity sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg== +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@volar/language-core@1.10.3", "@volar/language-core@~1.10.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.10.3.tgz#a345b43c112279e5b2f0a37d96735b848c653a55" - integrity sha512-7Qgwu9bWUHN+cLrOkCbIVBkL+RVPREhvY07wY89dGxi4mY9mQCsUVRRp64F61lX7Nc27meMnvy0sWlzY0x6oQQ== +"@vitejs/plugin-vue@^4.4.1": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.4.1.tgz#5050895fb8b2258d2f228110849df4a8a94b9038" + integrity sha512-HCQG8VDFDM7YDAdcj5QI5DvUi+r6xvo9LgvYdk7LSkUNwdpempdB5horkMSZsbdey9Ywsf5aaU8kEPw9M5kREA== + +"@volar/language-core@1.10.7", "@volar/language-core@~1.10.5": + version "1.10.7" + resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.10.7.tgz#9d555bf0a3ca652c525651baba5ecf8a55cf3471" + integrity sha512-6+WI7HGqWCsKJ/bms4V45WP7eDeoGxDtLjYPrHB7QkIWVkRLIeGPzzBoonZz9kERM+Kld3W89Y+IlICejVAKhA== dependencies: - "@volar/source-map" "1.10.3" + "@volar/source-map" "1.10.7" -"@volar/source-map@1.10.3", "@volar/source-map@~1.10.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.10.3.tgz#3730ca1f238b8c80d0f6da48117ac537cda4f316" - integrity sha512-QE9nwK3xsdBQGongHnC9SCR0itx7xUKQFsUDn5HbZY3pHpyXxdY1hSBG0eh9mE+aTKoM4KlqMvrb+19Tv9vS1Q== +"@volar/source-map@1.10.7", "@volar/source-map@~1.10.5": + version "1.10.7" + resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.10.7.tgz#f2b5c6b99f3fc91c10d4013eaeb083fbbf4b9e0d" + integrity sha512-anA254XO0lmmeu0p/kvgPOCkrVpqNIHWMvEkPX70PSk4ntg0iBzN/f0Kip6deXvibl6v14Q3Z8RihWrZwdZEEQ== dependencies: muggle-string "^0.3.1" -"@volar/typescript@~1.10.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.10.3.tgz#5e95d277e83bef3fc5f7df429c20a959391d2ce4" - integrity sha512-n0ar6xGYpRoSvgGMetm/JXP0QAXx+NOUvxCaWCfCjiFivQRSLJeydYDijhoGBUl5KSKosqq9In5L3e/m2TqTcQ== +"@volar/typescript@~1.10.5": + version "1.10.7" + resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.10.7.tgz#2ed47e3260d4161445099ba89c7471fbc51133b6" + integrity sha512-2hvA3vjXVUn1vOpsP/nWLnE5DUmY6YKQhvDRoZVfBrnWwIo0ySxdTUP4XieXGGgSk43xJaeU1zqQS/3Wfm7QgA== dependencies: - "@volar/language-core" "1.10.3" + "@volar/language-core" "1.10.7" + path-browserify "^1.0.1" "@vue/compiler-core@3.2.47": version "3.2.47" @@ -516,13 +534,13 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-core@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" - integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== +"@vue/compiler-core@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.8.tgz#301bb60d0245265a88ed5b30e200fbf223acb313" + integrity sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g== dependencies: - "@babel/parser" "^7.21.3" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.0" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" source-map-js "^1.0.2" @@ -534,13 +552,13 @@ "@vue/compiler-core" "3.2.47" "@vue/shared" "3.2.47" -"@vue/compiler-dom@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" - integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== +"@vue/compiler-dom@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz#09d832514b9b8d9415a3816b065d69dbefcc7e9b" + integrity sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ== dependencies: - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-core" "3.3.8" + "@vue/shared" "3.3.8" "@vue/compiler-dom@^3.3.0": version "3.3.2" @@ -550,20 +568,20 @@ "@vue/compiler-core" "3.3.2" "@vue/shared" "3.3.2" -"@vue/compiler-sfc@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" - integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== +"@vue/compiler-sfc@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz#40b18e48aa00260950964d1d72157668521be0e1" + integrity sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA== dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/compiler-dom" "3.3.4" - "@vue/compiler-ssr" "3.3.4" - "@vue/reactivity-transform" "3.3.4" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.8" + "@vue/compiler-dom" "3.3.8" + "@vue/compiler-ssr" "3.3.8" + "@vue/reactivity-transform" "3.3.8" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" - magic-string "^0.30.0" - postcss "^8.1.10" + magic-string "^0.30.5" + postcss "^8.4.31" source-map-js "^1.0.2" "@vue/compiler-sfc@^3.2.47": @@ -590,13 +608,13 @@ "@vue/compiler-dom" "3.2.47" "@vue/shared" "3.2.47" -"@vue/compiler-ssr@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" - integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== +"@vue/compiler-ssr@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz#136eed54411e4694815d961048a237191063fbce" + integrity sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w== dependencies: - "@vue/compiler-dom" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-dom" "3.3.8" + "@vue/shared" "3.3.8" "@vue/devtools-api@^6.5.0": version "6.5.0" @@ -612,16 +630,16 @@ "@typescript-eslint/parser" "^6.7.0" vue-eslint-parser "^9.3.1" -"@vue/language-core@1.8.18": - version "1.8.18" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.18.tgz#c111da12524bac3b12981786294b1ed5db2bd59f" - integrity sha512-byTi+mwSL7XnVRtfWE3MJy3HQryoVSQ3lymauXviegn3G1wwwlSOUljzQe3w5PyesOnBEIxYoavfKzMJnExrBA== +"@vue/language-core@1.8.22": + version "1.8.22" + resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.22.tgz#1ef62645fb9b1f830c6c84a5586e49e74727b1e3" + integrity sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw== dependencies: - "@volar/language-core" "~1.10.3" - "@volar/source-map" "~1.10.3" + "@volar/language-core" "~1.10.5" + "@volar/source-map" "~1.10.5" "@vue/compiler-dom" "^3.3.0" - "@vue/reactivity" "^3.3.0" "@vue/shared" "^3.3.0" + computeds "^0.0.1" minimatch "^9.0.3" muggle-string "^0.3.1" vue-template-compiler "^2.7.14" @@ -637,55 +655,48 @@ estree-walker "^2.0.2" magic-string "^0.25.7" -"@vue/reactivity-transform@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" - integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== +"@vue/reactivity-transform@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz#6d07649013b0be5c670f0ab6cc7ddd3150ad03f2" + integrity sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw== dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.8" + "@vue/shared" "3.3.8" estree-walker "^2.0.2" - magic-string "^0.30.0" + magic-string "^0.30.5" -"@vue/reactivity@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" - integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== +"@vue/reactivity@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.8.tgz#cce8a03a3fd3539c3eeda53e277ba365d160dd4d" + integrity sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw== dependencies: - "@vue/shared" "3.3.4" + "@vue/shared" "3.3.8" -"@vue/reactivity@^3.3.0": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.2.tgz#c4ddc5087039070c0c11810f6bc1aa59c99f0cb5" - integrity sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g== +"@vue/runtime-core@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.8.tgz#fba5a632cbf2b5d29e171489570149cb6975dcdb" + integrity sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw== dependencies: - "@vue/shared" "3.3.2" + "@vue/reactivity" "3.3.8" + "@vue/shared" "3.3.8" -"@vue/runtime-core@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" - integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== +"@vue/runtime-dom@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz#e2d7aa795cf50914dda9a951887765a594b38af4" + integrity sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA== dependencies: - "@vue/reactivity" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/runtime-core" "3.3.8" + "@vue/shared" "3.3.8" + csstype "^3.1.2" -"@vue/runtime-dom@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" - integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== +"@vue/server-renderer@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.8.tgz#9b1779010e75783edeed8fcfb97d9c95fc3ac5d2" + integrity sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg== dependencies: - "@vue/runtime-core" "3.3.4" - "@vue/shared" "3.3.4" - csstype "^3.1.1" - -"@vue/server-renderer@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" - integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== - dependencies: - "@vue/compiler-ssr" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-ssr" "3.3.8" + "@vue/shared" "3.3.8" "@vue/shared@3.2.47": version "3.2.47" @@ -697,24 +708,16 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.2.tgz#774cd9b4635ce801b70a3fc3713779a5ef5d77c3" integrity sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ== -"@vue/shared@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" - integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== +"@vue/shared@3.3.8": + version "3.3.8" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.8.tgz#f044942142e1d3a395f24132e6203a784838542d" + integrity sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw== "@vue/tsconfig@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0" integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg== -"@vue/typescript@1.8.18": - version "1.8.18" - resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.18.tgz#27cf06fc42fefae4254d9fd25297156c54a27e0f" - integrity sha512-3M+lu+DUwJW0fNwd/rLE0FenmELxcC6zxgm/YZ25jSTi+uNGj9L5XvXvf20guC69gQvZ+cg49tTxbepfFVuNNQ== - dependencies: - "@volar/typescript" "~1.10.3" - "@vue/language-core" "1.8.18" - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -908,6 +911,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +computeds@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" + integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -938,7 +946,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.1.1: +csstype@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -1078,10 +1086,10 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-plugin-vue@^9.17.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz#4501547373f246547083482838b4c8f4b28e5932" - integrity sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ== +eslint-plugin-vue@^9.18.1: + version "9.18.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz#73cf29df7450ce5913296465f8d1dc545344920c" + integrity sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" natural-compare "^1.4.0" @@ -1122,18 +1130,19 @@ eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@^8.51.0: - version "8.51.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" - integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== +eslint@^8.53.0: + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.51.0" - "@humanwhocodes/config-array" "^0.11.11" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1760,6 +1769,13 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -1954,6 +1970,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2051,6 +2072,15 @@ postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -2145,10 +2175,10 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -sass@^1.69.0: - version "1.69.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.0.tgz#5195075371c239ed556280cf2f5944d234f42679" - integrity sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ== +sass@^1.69.5: + version "1.69.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -2338,10 +2368,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.21.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" - integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== +terser@^5.24.0: + version "5.24.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364" + integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -2404,6 +2434,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -2453,10 +2488,10 @@ vite-plugin-css-injected-by-js@^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@^4.4.11: - version "4.4.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.11.tgz#babdb055b08c69cfc4c468072a2e6c9ca62102b0" - integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== +vite@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -2477,13 +2512,13 @@ vue-eslint-parser@^9.3.1: lodash "^4.17.21" semver "^7.3.6" -vue-i18n@^9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.5.0.tgz#361a820f591f6d9689435a42763fd1dae224833b" - integrity sha512-NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg== +vue-i18n@^9.6.5: + version "9.6.5" + resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.6.5.tgz#3a0bdc1e339ded633dc90aee640a7249efdfe3e5" + integrity sha512-dpUEjKHg7pEsaS7ZPPxp1CflaR7bGmsvZJEhnszHPKl9OTNyno5j/DvMtMSo41kpddq4felLA7GK2prjpnXVlw== dependencies: - "@intlify/core-base" "9.5.0" - "@intlify/shared" "9.5.0" + "@intlify/core-base" "9.6.5" + "@intlify/shared" "9.6.5" "@vue/devtools-api" "^6.5.0" vue-router@^4.2.5: @@ -2501,25 +2536,25 @@ vue-template-compiler@^2.7.14: de-indent "^1.0.2" he "^1.2.0" -vue-tsc@^1.8.18: - version "1.8.18" - resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.18.tgz#9f92df899932c6bcee55284e4e781d35163f0816" - integrity sha512-AwQxBB9SZX308TLL1932P1JByuMsXC2jLfRBGt8SBdm1e3cXkDlFaXUAqibfKnoQ1ZC2zO2NSbeBNdSjOcdvJw== +vue-tsc@^1.8.22: + version "1.8.22" + resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.22.tgz#421e73c38b50802a6716ca32ed87b5970c867323" + integrity sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A== dependencies: - "@vue/language-core" "1.8.18" - "@vue/typescript" "1.8.18" + "@volar/typescript" "~1.10.5" + "@vue/language-core" "1.8.22" semver "^7.5.4" -vue@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" - integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== +vue@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.8.tgz#532ff071af24f6a69e5ecc53a66858a9ee874ffc" + integrity sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w== dependencies: - "@vue/compiler-dom" "3.3.4" - "@vue/compiler-sfc" "3.3.4" - "@vue/runtime-dom" "3.3.4" - "@vue/server-renderer" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-dom" "3.3.8" + "@vue/compiler-sfc" "3.3.8" + "@vue/runtime-dom" "3.3.8" + "@vue/server-renderer" "3.3.8" + "@vue/shared" "3.3.8" webpack-sources@^3.2.3: version "3.2.3" diff --git a/webapp_dist/js/app.js.gz b/webapp_dist/js/app.js.gz index eae29213..781c2580 100644 Binary files a/webapp_dist/js/app.js.gz and b/webapp_dist/js/app.js.gz differ