Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
a2473645a5
@ -4,7 +4,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
#define CONFIG_FILENAME "/config.json"
|
#define CONFIG_FILENAME "/config.json"
|
||||||
#define CONFIG_VERSION 0x00011700 // 0.1.23 // make sure to clean all after change
|
#define CONFIG_VERSION 0x00011800 // 0.1.24 // make sure to clean all after change
|
||||||
|
|
||||||
#define WIFI_MAX_SSID_STRLEN 31
|
#define WIFI_MAX_SSID_STRLEN 31
|
||||||
#define WIFI_MAX_PASSWORD_STRLEN 64
|
#define WIFI_MAX_PASSWORD_STRLEN 64
|
||||||
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#define DEV_MAX_MAPPING_NAME_STRLEN 63
|
#define DEV_MAX_MAPPING_NAME_STRLEN 63
|
||||||
|
|
||||||
#define JSON_BUFFER_SIZE 8192
|
#define JSON_BUFFER_SIZE 12288
|
||||||
|
|
||||||
struct CHANNEL_CONFIG_T {
|
struct CHANNEL_CONFIG_T {
|
||||||
uint16_t MaxChannelPower;
|
uint16_t MaxChannelPower;
|
||||||
@ -40,6 +40,10 @@ struct CHANNEL_CONFIG_T {
|
|||||||
struct INVERTER_CONFIG_T {
|
struct INVERTER_CONFIG_T {
|
||||||
uint64_t Serial;
|
uint64_t Serial;
|
||||||
char Name[INV_MAX_NAME_STRLEN + 1];
|
char Name[INV_MAX_NAME_STRLEN + 1];
|
||||||
|
bool Poll_Enable;
|
||||||
|
bool Poll_Enable_Night;
|
||||||
|
bool Command_Enable;
|
||||||
|
bool Command_Enable_Night;
|
||||||
CHANNEL_CONFIG_T channel[INV_MAX_CHAN_COUNT];
|
CHANNEL_CONFIG_T channel[INV_MAX_CHAN_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -60,6 +64,8 @@ struct CONFIG_T {
|
|||||||
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
||||||
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
||||||
char Ntp_TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1];
|
char Ntp_TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1];
|
||||||
|
double Ntp_Longitude;
|
||||||
|
double Ntp_Latitude;
|
||||||
|
|
||||||
bool Mqtt_Enabled;
|
bool Mqtt_Enabled;
|
||||||
uint Mqtt_Port;
|
uint Mqtt_Port;
|
||||||
|
|||||||
15
include/InverterSettings.h
Normal file
15
include/InverterSettings.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
class InverterSettingsClass {
|
||||||
|
public:
|
||||||
|
void init();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint32_t _lastUpdate = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern InverterSettingsClass InverterSettings;
|
||||||
30
include/SunPosition.h
Normal file
30
include/SunPosition.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <sunset.h>
|
||||||
|
|
||||||
|
#define SUNPOS_UPDATE_INTERVAL 60000l
|
||||||
|
|
||||||
|
class SunPositionClass {
|
||||||
|
public:
|
||||||
|
SunPositionClass();
|
||||||
|
void init();
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
bool isDayPeriod();
|
||||||
|
bool sunsetTime(struct tm* info);
|
||||||
|
bool sunriseTime(struct tm* info);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void updateSunData();
|
||||||
|
|
||||||
|
SunSet _sun;
|
||||||
|
bool _isDayPeriod = true;
|
||||||
|
uint _sunriseMinutes = 0;
|
||||||
|
uint _sunsetMinutes = 0;
|
||||||
|
|
||||||
|
uint32_t _lastUpdate = 0;
|
||||||
|
bool _isValidInfo = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern SunPositionClass SunPosition;
|
||||||
@ -7,4 +7,5 @@ class Utils {
|
|||||||
public:
|
public:
|
||||||
static uint32_t getChipId();
|
static uint32_t getChipId();
|
||||||
static uint64_t generateDtuSerial();
|
static uint64_t generateDtuSerial();
|
||||||
|
static int getTimezoneOffset();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -23,6 +23,8 @@
|
|||||||
#define NTP_SERVER "pool.ntp.org"
|
#define NTP_SERVER "pool.ntp.org"
|
||||||
#define NTP_TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3"
|
#define NTP_TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3"
|
||||||
#define NTP_TIMEZONEDESCR "Europe/Berlin"
|
#define NTP_TIMEZONEDESCR "Europe/Berlin"
|
||||||
|
#define NTP_LONGITUDE 10.4515f
|
||||||
|
#define NTP_LATITUDE 51.1657f
|
||||||
|
|
||||||
#define MQTT_ENABLED false
|
#define MQTT_ENABLED false
|
||||||
#define MQTT_HOST ""
|
#define MQTT_HOST ""
|
||||||
|
|||||||
@ -17,6 +17,10 @@ HM_Abstract::HM_Abstract(uint64_t serial)
|
|||||||
|
|
||||||
bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
||||||
{
|
{
|
||||||
|
if (!getEnablePolling()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo, 5)) {
|
if (!getLocalTime(&timeinfo, 5)) {
|
||||||
return false;
|
return false;
|
||||||
@ -34,6 +38,10 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
|||||||
|
|
||||||
bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
||||||
{
|
{
|
||||||
|
if (!getEnablePolling()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo, 5)) {
|
if (!getLocalTime(&timeinfo, 5)) {
|
||||||
return false;
|
return false;
|
||||||
@ -62,6 +70,10 @@ bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
|||||||
|
|
||||||
bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio)
|
bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio)
|
||||||
{
|
{
|
||||||
|
if (!getEnablePolling()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo, 5)) {
|
if (!getLocalTime(&timeinfo, 5)) {
|
||||||
return false;
|
return false;
|
||||||
@ -83,6 +95,10 @@ bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio)
|
|||||||
|
|
||||||
bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio)
|
bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio)
|
||||||
{
|
{
|
||||||
|
if (!getEnablePolling()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo, 5)) {
|
if (!getLocalTime(&timeinfo, 5)) {
|
||||||
return false;
|
return false;
|
||||||
@ -101,6 +117,10 @@ bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio)
|
|||||||
|
|
||||||
bool HM_Abstract::sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type)
|
bool HM_Abstract::sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type)
|
||||||
{
|
{
|
||||||
|
if (!getEnableCommands()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (type == PowerLimitControlType::RelativNonPersistent || type == PowerLimitControlType::RelativPersistent) {
|
if (type == PowerLimitControlType::RelativNonPersistent || type == PowerLimitControlType::RelativPersistent) {
|
||||||
limit = min<float>(100, limit);
|
limit = min<float>(100, limit);
|
||||||
}
|
}
|
||||||
@ -123,6 +143,10 @@ bool HM_Abstract::resendActivePowerControlRequest(HoymilesRadio* radio)
|
|||||||
|
|
||||||
bool HM_Abstract::sendPowerControlRequest(HoymilesRadio* radio, bool turnOn)
|
bool HM_Abstract::sendPowerControlRequest(HoymilesRadio* radio, bool turnOn)
|
||||||
{
|
{
|
||||||
|
if (!getEnableCommands()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (turnOn) {
|
if (turnOn) {
|
||||||
_powerState = 1;
|
_powerState = 1;
|
||||||
} else {
|
} else {
|
||||||
@ -139,6 +163,10 @@ bool HM_Abstract::sendPowerControlRequest(HoymilesRadio* radio, bool turnOn)
|
|||||||
|
|
||||||
bool HM_Abstract::sendRestartControlRequest(HoymilesRadio* radio)
|
bool HM_Abstract::sendRestartControlRequest(HoymilesRadio* radio)
|
||||||
{
|
{
|
||||||
|
if (!getEnableCommands()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_powerState = 2;
|
_powerState = 2;
|
||||||
|
|
||||||
PowerControlCommand* cmd = radio->enqueCommand<PowerControlCommand>();
|
PowerControlCommand* cmd = radio->enqueCommand<PowerControlCommand>();
|
||||||
|
|||||||
@ -67,12 +67,32 @@ bool InverterAbstract::isProducing()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return totalAc > 0;
|
return _enablePolling && totalAc > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InverterAbstract::isReachable()
|
bool InverterAbstract::isReachable()
|
||||||
{
|
{
|
||||||
return Statistics()->getRxFailureCount() <= MAX_ONLINE_FAILURE_COUNT;
|
return _enablePolling && Statistics()->getRxFailureCount() <= MAX_ONLINE_FAILURE_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InverterAbstract::setEnablePolling(bool enabled)
|
||||||
|
{
|
||||||
|
_enablePolling = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InverterAbstract::getEnablePolling()
|
||||||
|
{
|
||||||
|
return _enablePolling;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InverterAbstract::setEnableCommands(bool enabled)
|
||||||
|
{
|
||||||
|
_enableCommands = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InverterAbstract::getEnableCommands()
|
||||||
|
{
|
||||||
|
return _enableCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
AlarmLogParser* InverterAbstract::EventLog()
|
AlarmLogParser* InverterAbstract::EventLog()
|
||||||
|
|||||||
@ -44,6 +44,12 @@ public:
|
|||||||
bool isProducing();
|
bool isProducing();
|
||||||
bool isReachable();
|
bool isReachable();
|
||||||
|
|
||||||
|
void setEnablePolling(bool enabled);
|
||||||
|
bool getEnablePolling();
|
||||||
|
|
||||||
|
void setEnableCommands(bool enabled);
|
||||||
|
bool getEnableCommands();
|
||||||
|
|
||||||
void clearRxFragmentBuffer();
|
void clearRxFragmentBuffer();
|
||||||
void addRxFragment(uint8_t fragment[], uint8_t len);
|
void addRxFragment(uint8_t fragment[], uint8_t len);
|
||||||
uint8_t verifyAllFragments(CommandAbstract* cmd);
|
uint8_t verifyAllFragments(CommandAbstract* cmd);
|
||||||
@ -73,6 +79,9 @@ private:
|
|||||||
uint8_t _rxFragmentLastPacketId = 0;
|
uint8_t _rxFragmentLastPacketId = 0;
|
||||||
uint8_t _rxFragmentRetransmitCnt = 0;
|
uint8_t _rxFragmentRetransmitCnt = 0;
|
||||||
|
|
||||||
|
bool _enablePolling = true;
|
||||||
|
bool _enableCommands = true;
|
||||||
|
|
||||||
std::unique_ptr<AlarmLogParser> _alarmLogParser;
|
std::unique_ptr<AlarmLogParser> _alarmLogParser;
|
||||||
std::unique_ptr<DevInfoParser> _devInfoParser;
|
std::unique_ptr<DevInfoParser> _devInfoParser;
|
||||||
std::unique_ptr<PowerCommandParser> _powerCommandParser;
|
std::unique_ptr<PowerCommandParser> _powerCommandParser;
|
||||||
|
|||||||
@ -27,7 +27,7 @@ lib_deps =
|
|||||||
https://github.com/bertmelis/espMqttClient.git#v1.3.3
|
https://github.com/bertmelis/espMqttClient.git#v1.3.3
|
||||||
nrf24/RF24 @ ^1.4.5
|
nrf24/RF24 @ ^1.4.5
|
||||||
olikraus/U8g2 @ ^2.34.13
|
olikraus/U8g2 @ ^2.34.13
|
||||||
https://github.com/berni2288/arduino-CAN
|
buelowp/sunset @ ^1.1.7
|
||||||
|
|
||||||
extra_scripts =
|
extra_scripts =
|
||||||
pre:auto_firmware_version.py
|
pre:auto_firmware_version.py
|
||||||
|
|||||||
@ -44,6 +44,8 @@ bool ConfigurationClass::write()
|
|||||||
ntp["server"] = config.Ntp_Server;
|
ntp["server"] = config.Ntp_Server;
|
||||||
ntp["timezone"] = config.Ntp_Timezone;
|
ntp["timezone"] = config.Ntp_Timezone;
|
||||||
ntp["timezone_descr"] = config.Ntp_TimezoneDescr;
|
ntp["timezone_descr"] = config.Ntp_TimezoneDescr;
|
||||||
|
ntp["latitude"] = config.Ntp_Latitude;
|
||||||
|
ntp["longitude"] = config.Ntp_Longitude;
|
||||||
|
|
||||||
JsonObject mqtt = doc.createNestedObject("mqtt");
|
JsonObject mqtt = doc.createNestedObject("mqtt");
|
||||||
mqtt["enabled"] = config.Mqtt_Enabled;
|
mqtt["enabled"] = config.Mqtt_Enabled;
|
||||||
@ -53,7 +55,7 @@ bool ConfigurationClass::write()
|
|||||||
mqtt["password"] = config.Mqtt_Password;
|
mqtt["password"] = config.Mqtt_Password;
|
||||||
mqtt["topic"] = config.Mqtt_Topic;
|
mqtt["topic"] = config.Mqtt_Topic;
|
||||||
mqtt["retain"] = config.Mqtt_Retain;
|
mqtt["retain"] = config.Mqtt_Retain;
|
||||||
mqtt["publish_invterval"] = config.Mqtt_PublishInterval;
|
mqtt["publish_interval"] = config.Mqtt_PublishInterval;
|
||||||
|
|
||||||
JsonObject mqtt_lwt = mqtt.createNestedObject("lwt");
|
JsonObject mqtt_lwt = mqtt.createNestedObject("lwt");
|
||||||
mqtt_lwt["topic"] = config.Mqtt_LwtTopic;
|
mqtt_lwt["topic"] = config.Mqtt_LwtTopic;
|
||||||
@ -94,6 +96,10 @@ bool ConfigurationClass::write()
|
|||||||
JsonObject inv = inverters.createNestedObject();
|
JsonObject inv = inverters.createNestedObject();
|
||||||
inv["serial"] = config.Inverter[i].Serial;
|
inv["serial"] = config.Inverter[i].Serial;
|
||||||
inv["name"] = config.Inverter[i].Name;
|
inv["name"] = config.Inverter[i].Name;
|
||||||
|
inv["poll_enable"] = config.Inverter[i].Poll_Enable;
|
||||||
|
inv["poll_enable_night"] = config.Inverter[i].Poll_Enable_Night;
|
||||||
|
inv["command_enable"] = config.Inverter[i].Command_Enable;
|
||||||
|
inv["command_enable_night"] = config.Inverter[i].Command_Enable_Night;
|
||||||
|
|
||||||
JsonArray channel = inv.createNestedArray("channel");
|
JsonArray channel = inv.createNestedArray("channel");
|
||||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||||
@ -199,6 +205,8 @@ bool ConfigurationClass::read()
|
|||||||
strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server));
|
strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server));
|
||||||
strlcpy(config.Ntp_Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp_Timezone));
|
strlcpy(config.Ntp_Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp_Timezone));
|
||||||
strlcpy(config.Ntp_TimezoneDescr, ntp["timezone_descr"] | NTP_TIMEZONEDESCR, sizeof(config.Ntp_TimezoneDescr));
|
strlcpy(config.Ntp_TimezoneDescr, ntp["timezone_descr"] | NTP_TIMEZONEDESCR, sizeof(config.Ntp_TimezoneDescr));
|
||||||
|
config.Ntp_Latitude = ntp["latitude"] | NTP_LATITUDE;
|
||||||
|
config.Ntp_Longitude = ntp["longitude"] | NTP_LONGITUDE;
|
||||||
|
|
||||||
JsonObject mqtt = doc["mqtt"];
|
JsonObject mqtt = doc["mqtt"];
|
||||||
config.Mqtt_Enabled = mqtt["enabled"] | MQTT_ENABLED;
|
config.Mqtt_Enabled = mqtt["enabled"] | MQTT_ENABLED;
|
||||||
@ -208,7 +216,7 @@ bool ConfigurationClass::read()
|
|||||||
strlcpy(config.Mqtt_Password, mqtt["password"] | MQTT_PASSWORD, sizeof(config.Mqtt_Password));
|
strlcpy(config.Mqtt_Password, mqtt["password"] | MQTT_PASSWORD, sizeof(config.Mqtt_Password));
|
||||||
strlcpy(config.Mqtt_Topic, mqtt["topic"] | MQTT_TOPIC, sizeof(config.Mqtt_Topic));
|
strlcpy(config.Mqtt_Topic, mqtt["topic"] | MQTT_TOPIC, sizeof(config.Mqtt_Topic));
|
||||||
config.Mqtt_Retain = mqtt["retain"] | MQTT_RETAIN;
|
config.Mqtt_Retain = mqtt["retain"] | MQTT_RETAIN;
|
||||||
config.Mqtt_PublishInterval = mqtt["publish_invterval"] | MQTT_PUBLISH_INTERVAL;
|
config.Mqtt_PublishInterval = mqtt["publish_interval"] | MQTT_PUBLISH_INTERVAL;
|
||||||
|
|
||||||
JsonObject mqtt_lwt = mqtt["lwt"];
|
JsonObject mqtt_lwt = mqtt["lwt"];
|
||||||
strlcpy(config.Mqtt_LwtTopic, mqtt_lwt["topic"] | MQTT_LWT_TOPIC, sizeof(config.Mqtt_LwtTopic));
|
strlcpy(config.Mqtt_LwtTopic, mqtt_lwt["topic"] | MQTT_LWT_TOPIC, sizeof(config.Mqtt_LwtTopic));
|
||||||
@ -250,6 +258,11 @@ bool ConfigurationClass::read()
|
|||||||
config.Inverter[i].Serial = inv["serial"] | 0ULL;
|
config.Inverter[i].Serial = inv["serial"] | 0ULL;
|
||||||
strlcpy(config.Inverter[i].Name, inv["name"] | "", sizeof(config.Inverter[i].Name));
|
strlcpy(config.Inverter[i].Name, inv["name"] | "", sizeof(config.Inverter[i].Name));
|
||||||
|
|
||||||
|
config.Inverter[i].Poll_Enable = inv["poll_enable"] | true;
|
||||||
|
config.Inverter[i].Poll_Enable_Night = inv["poll_enable_night"] | true;
|
||||||
|
config.Inverter[i].Command_Enable = inv["command_enable"] | true;
|
||||||
|
config.Inverter[i].Command_Enable_Night = inv["command_enable_night"] | true;
|
||||||
|
|
||||||
JsonArray channel = inv["channel"];
|
JsonArray channel = inv["channel"];
|
||||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||||
config.Inverter[i].channel[c].MaxChannelPower = channel[c]["max_power"] | 0;
|
config.Inverter[i].channel[c].MaxChannelPower = channel[c]["max_power"] | 0;
|
||||||
@ -288,21 +301,21 @@ bool ConfigurationClass::read()
|
|||||||
|
|
||||||
void ConfigurationClass::migrate()
|
void ConfigurationClass::migrate()
|
||||||
{
|
{
|
||||||
|
File f = LittleFS.open(CONFIG_FILENAME, "r", false);
|
||||||
|
if (!f) {
|
||||||
|
MessageOutput.println(F("Failed to open file, cancel migration"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
|
// Deserialize the JSON document
|
||||||
|
DeserializationError error = deserializeJson(doc, f);
|
||||||
|
if (error) {
|
||||||
|
MessageOutput.printf("Failed to read file, cancel migration: %s\r\n", error.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (config.Cfg_Version < 0x00011700) {
|
if (config.Cfg_Version < 0x00011700) {
|
||||||
File f = LittleFS.open(CONFIG_FILENAME, "r", false);
|
|
||||||
if (!f) {
|
|
||||||
MessageOutput.println(F("Failed to open file, cancel migration"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
|
||||||
// Deserialize the JSON document
|
|
||||||
DeserializationError error = deserializeJson(doc, f);
|
|
||||||
if (error) {
|
|
||||||
MessageOutput.println(F("Failed to read file, cancel migration"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonArray inverters = doc["inverters"];
|
JsonArray inverters = doc["inverters"];
|
||||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||||
JsonObject inv = inverters[i].as<JsonObject>();
|
JsonObject inv = inverters[i].as<JsonObject>();
|
||||||
@ -314,6 +327,13 @@ void ConfigurationClass::migrate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.Cfg_Version < 0x00011800) {
|
||||||
|
JsonObject mqtt = doc["mqtt"];
|
||||||
|
config.Mqtt_PublishInterval = mqtt["publish_invterval"];
|
||||||
|
}
|
||||||
|
|
||||||
|
f.close();
|
||||||
|
|
||||||
config.Cfg_Version = CONFIG_VERSION;
|
config.Cfg_Version = CONFIG_VERSION;
|
||||||
write();
|
write();
|
||||||
read();
|
read();
|
||||||
|
|||||||
82
src/InverterSettings.cpp
Normal file
82
src/InverterSettings.cpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Thomas Basler and others
|
||||||
|
*/
|
||||||
|
#include "InverterSettings.h"
|
||||||
|
#include "Configuration.h"
|
||||||
|
#include "MessageOutput.h"
|
||||||
|
#include "PinMapping.h"
|
||||||
|
#include "SunPosition.h"
|
||||||
|
#include <Hoymiles.h>
|
||||||
|
|
||||||
|
InverterSettingsClass InverterSettings;
|
||||||
|
|
||||||
|
void InverterSettingsClass::init()
|
||||||
|
{
|
||||||
|
const CONFIG_T& config = Configuration.get();
|
||||||
|
const PinMapping_t& pin = PinMapping.get();
|
||||||
|
|
||||||
|
// Initialize inverter communication
|
||||||
|
MessageOutput.print(F("Initialize Hoymiles interface... "));
|
||||||
|
if (PinMapping.isValidNrf24Config()) {
|
||||||
|
SPIClass* spiClass = new SPIClass(HSPI);
|
||||||
|
spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs);
|
||||||
|
Hoymiles.setMessageOutput(&MessageOutput);
|
||||||
|
Hoymiles.init(spiClass, pin.nrf24_en, pin.nrf24_irq);
|
||||||
|
|
||||||
|
MessageOutput.println(F(" Setting radio PA level... "));
|
||||||
|
Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel);
|
||||||
|
|
||||||
|
MessageOutput.println(F(" Setting DTU serial... "));
|
||||||
|
Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial);
|
||||||
|
|
||||||
|
MessageOutput.println(F(" Setting poll interval... "));
|
||||||
|
Hoymiles.setPollInterval(config.Dtu_PollInterval);
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||||
|
if (config.Inverter[i].Serial > 0) {
|
||||||
|
MessageOutput.print(F(" Adding inverter: "));
|
||||||
|
MessageOutput.print(config.Inverter[i].Serial, HEX);
|
||||||
|
MessageOutput.print(F(" - "));
|
||||||
|
MessageOutput.print(config.Inverter[i].Name);
|
||||||
|
auto inv = Hoymiles.addInverter(
|
||||||
|
config.Inverter[i].Name,
|
||||||
|
config.Inverter[i].Serial);
|
||||||
|
|
||||||
|
if (inv != nullptr) {
|
||||||
|
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||||
|
inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);
|
||||||
|
inv->Statistics()->setChannelFieldOffset(TYPE_DC, static_cast<ChannelNum_t>(c), FLD_YT, config.Inverter[i].channel[c].YieldTotalOffset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageOutput.println(F(" done"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MessageOutput.println(F("done"));
|
||||||
|
} else {
|
||||||
|
MessageOutput.println(F("Invalid pin config"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InverterSettingsClass::loop()
|
||||||
|
{
|
||||||
|
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) {
|
||||||
|
const CONFIG_T& config = Configuration.get();
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||||
|
auto const& inv_cfg = config.Inverter[i];
|
||||||
|
if (inv_cfg.Serial == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto inv = Hoymiles.getInverterBySerial(inv_cfg.Serial);
|
||||||
|
if (inv == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
inv->setEnablePolling(inv_cfg.Poll_Enable && (SunPosition.isDayPeriod() || inv_cfg.Poll_Enable_Night));
|
||||||
|
inv->setEnableCommands(inv_cfg.Command_Enable && (SunPosition.isDayPeriod() || inv_cfg.Command_Enable_Night));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Hoymiles.loop();
|
||||||
|
}
|
||||||
90
src/SunPosition.cpp
Normal file
90
src/SunPosition.cpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Thomas Basler and others
|
||||||
|
*/
|
||||||
|
#include "SunPosition.h"
|
||||||
|
#include "Configuration.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
SunPositionClass SunPosition;
|
||||||
|
|
||||||
|
SunPositionClass::SunPositionClass()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SunPositionClass::init()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SunPositionClass::loop()
|
||||||
|
{
|
||||||
|
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) {
|
||||||
|
updateSunData();
|
||||||
|
_lastUpdate = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SunPositionClass::isDayPeriod()
|
||||||
|
{
|
||||||
|
return _isDayPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
_isDayPeriod = false;
|
||||||
|
_sunriseMinutes = 0;
|
||||||
|
_sunsetMinutes = 0;
|
||||||
|
_isValidInfo = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday);
|
||||||
|
_sunriseMinutes = static_cast<int>(_sun.calcCustomSunrise(SunSet::SUNSET_NAUTICAL));
|
||||||
|
_sunsetMinutes = static_cast<int>(_sun.calcCustomSunset(SunSet::SUNSET_NAUTICAL));
|
||||||
|
uint minutesPastMidnight = timeinfo.tm_hour * 60 + timeinfo.tm_min;
|
||||||
|
|
||||||
|
_isDayPeriod = (minutesPastMidnight >= _sunriseMinutes) && (minutesPastMidnight < _sunsetMinutes);
|
||||||
|
_isValidInfo = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SunPositionClass::sunsetTime(struct tm* info)
|
||||||
|
{
|
||||||
|
// Get today's date
|
||||||
|
time_t aTime = time(NULL);
|
||||||
|
|
||||||
|
// Set the time to midnight
|
||||||
|
struct tm tm;
|
||||||
|
localtime_r(&aTime, &tm);
|
||||||
|
tm.tm_sec = 0;
|
||||||
|
tm.tm_min = _sunsetMinutes;
|
||||||
|
tm.tm_hour = 0;
|
||||||
|
tm.tm_isdst = -1;
|
||||||
|
time_t midnight = mktime(&tm);
|
||||||
|
|
||||||
|
localtime_r(&midnight, info);
|
||||||
|
return _isValidInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SunPositionClass::sunriseTime(struct tm* info)
|
||||||
|
{
|
||||||
|
// Get today's date
|
||||||
|
time_t aTime = time(NULL);
|
||||||
|
|
||||||
|
// Set the time to midnight
|
||||||
|
struct tm tm;
|
||||||
|
localtime_r(&aTime, &tm);
|
||||||
|
tm.tm_sec = 0;
|
||||||
|
tm.tm_min = _sunriseMinutes;
|
||||||
|
tm.tm_hour = 0;
|
||||||
|
tm.tm_isdst = -1;
|
||||||
|
time_t midnight = mktime(&tm);
|
||||||
|
|
||||||
|
localtime_r(&midnight, info);
|
||||||
|
return _isValidInfo;
|
||||||
|
}
|
||||||
@ -36,3 +36,20 @@ uint64_t Utils::generateDtuSerial()
|
|||||||
|
|
||||||
return dtuId;
|
return dtuId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Utils::getTimezoneOffset()
|
||||||
|
{
|
||||||
|
// see: https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c/44063597#44063597
|
||||||
|
|
||||||
|
time_t gmt, rawtime = time(NULL);
|
||||||
|
struct tm* ptm;
|
||||||
|
|
||||||
|
struct tm gbuf;
|
||||||
|
ptm = gmtime_r(&rawtime, &gbuf);
|
||||||
|
|
||||||
|
// Request that mktime() looksup dst in timezone database
|
||||||
|
ptm->tm_isdst = -1;
|
||||||
|
gmt = mktime(ptm);
|
||||||
|
|
||||||
|
return static_cast<int>(difftime(rawtime, gmt));
|
||||||
|
}
|
||||||
@ -51,6 +51,10 @@ void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request)
|
|||||||
((uint32_t)((config.Inverter[i].Serial >> 32) & 0xFFFFFFFF)),
|
((uint32_t)((config.Inverter[i].Serial >> 32) & 0xFFFFFFFF)),
|
||||||
((uint32_t)(config.Inverter[i].Serial & 0xFFFFFFFF)));
|
((uint32_t)(config.Inverter[i].Serial & 0xFFFFFFFF)));
|
||||||
obj[F("serial")] = buffer;
|
obj[F("serial")] = buffer;
|
||||||
|
obj[F("poll_enable")] = config.Inverter[i].Poll_Enable;
|
||||||
|
obj[F("poll_enable_night")] = config.Inverter[i].Poll_Enable_Night;
|
||||||
|
obj[F("command_enable")] = config.Inverter[i].Command_Enable;
|
||||||
|
obj[F("command_enable_night")] = config.Inverter[i].Command_Enable_Night;
|
||||||
|
|
||||||
auto inv = Hoymiles.getInverterBySerial(config.Inverter[i].Serial);
|
auto inv = Hoymiles.getInverterBySerial(config.Inverter[i].Serial);
|
||||||
uint8_t max_channels;
|
uint8_t max_channels;
|
||||||
@ -270,6 +274,11 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
|
|||||||
inverter.channel[arrayCount].MaxChannelPower = channel[F("max_power")].as<uint16_t>();
|
inverter.channel[arrayCount].MaxChannelPower = channel[F("max_power")].as<uint16_t>();
|
||||||
inverter.channel[arrayCount].YieldTotalOffset = channel[F("yield_total_offset")].as<float>();
|
inverter.channel[arrayCount].YieldTotalOffset = channel[F("yield_total_offset")].as<float>();
|
||||||
strncpy(inverter.channel[arrayCount].Name, channel[F("name")] | "", sizeof(inverter.channel[arrayCount].Name));
|
strncpy(inverter.channel[arrayCount].Name, channel[F("name")] | "", sizeof(inverter.channel[arrayCount].Name));
|
||||||
|
inverter.Poll_Enable = root[F("poll_enable")] | true;
|
||||||
|
inverter.Poll_Enable_Night = root[F("poll_enable_night")] | true;
|
||||||
|
inverter.Command_Enable = root[F("command_enable")] | true;
|
||||||
|
inverter.Command_Enable_Night = root[F("command_enable_night")] | true;
|
||||||
|
|
||||||
arrayCount++;
|
arrayCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,6 +306,8 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (inv != nullptr) {
|
if (inv != nullptr) {
|
||||||
|
inv->setEnablePolling(inverter.Poll_Enable);
|
||||||
|
inv->setEnableCommands(inverter.Command_Enable);
|
||||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||||
inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower);
|
inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower);
|
||||||
inv->Statistics()->setChannelFieldOffset(TYPE_DC, static_cast<ChannelNum_t>(c), FLD_YT, inverter.channel[c].YieldTotalOffset);
|
inv->Statistics()->setChannelFieldOffset(TYPE_DC, static_cast<ChannelNum_t>(c), FLD_YT, inverter.channel[c].YieldTotalOffset);
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "WebApi_ntp.h"
|
#include "WebApi_ntp.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "NtpSettings.h"
|
#include "NtpSettings.h"
|
||||||
|
#include "SunPosition.h"
|
||||||
#include "WebApi.h"
|
#include "WebApi.h"
|
||||||
#include "WebApi_errors.h"
|
#include "WebApi_errors.h"
|
||||||
#include "helper.h"
|
#include "helper.h"
|
||||||
@ -51,6 +52,16 @@ void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request)
|
|||||||
strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
|
strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
|
||||||
root[F("ntp_localtime")] = timeStringBuff;
|
root[F("ntp_localtime")] = timeStringBuff;
|
||||||
|
|
||||||
|
SunPosition.sunriseTime(&timeinfo);
|
||||||
|
strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
|
||||||
|
root[F("sun_risetime")] = timeStringBuff;
|
||||||
|
|
||||||
|
SunPosition.sunsetTime(&timeinfo);
|
||||||
|
strftime(timeStringBuff, sizeof(timeStringBuff), "%A, %B %d %Y %H:%M:%S", &timeinfo);
|
||||||
|
root[F("sun_settime")] = timeStringBuff;
|
||||||
|
|
||||||
|
root[F("sun_isDayPeriod")] = SunPosition.isDayPeriod();
|
||||||
|
|
||||||
response->setLength();
|
response->setLength();
|
||||||
request->send(response);
|
request->send(response);
|
||||||
}
|
}
|
||||||
@ -68,6 +79,8 @@ void WebApiNtpClass::onNtpAdminGet(AsyncWebServerRequest* request)
|
|||||||
root[F("ntp_server")] = config.Ntp_Server;
|
root[F("ntp_server")] = config.Ntp_Server;
|
||||||
root[F("ntp_timezone")] = config.Ntp_Timezone;
|
root[F("ntp_timezone")] = config.Ntp_Timezone;
|
||||||
root[F("ntp_timezone_descr")] = config.Ntp_TimezoneDescr;
|
root[F("ntp_timezone_descr")] = config.Ntp_TimezoneDescr;
|
||||||
|
root[F("longitude")] = config.Ntp_Longitude;
|
||||||
|
root[F("latitude")] = config.Ntp_Latitude;
|
||||||
|
|
||||||
response->setLength();
|
response->setLength();
|
||||||
request->send(response);
|
request->send(response);
|
||||||
@ -112,7 +125,7 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("ntp_server") && root.containsKey("ntp_timezone"))) {
|
if (!(root.containsKey("ntp_server") && root.containsKey("ntp_timezone") && root.containsKey("longitude") && root.containsKey("latitude"))) {
|
||||||
retMsg[F("message")] = F("Values are missing!");
|
retMsg[F("message")] = F("Values are missing!");
|
||||||
retMsg[F("code")] = WebApiError::GenericValueMissing;
|
retMsg[F("code")] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
@ -151,6 +164,8 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
|||||||
strlcpy(config.Ntp_Server, root[F("ntp_server")].as<String>().c_str(), sizeof(config.Ntp_Server));
|
strlcpy(config.Ntp_Server, root[F("ntp_server")].as<String>().c_str(), sizeof(config.Ntp_Server));
|
||||||
strlcpy(config.Ntp_Timezone, root[F("ntp_timezone")].as<String>().c_str(), sizeof(config.Ntp_Timezone));
|
strlcpy(config.Ntp_Timezone, root[F("ntp_timezone")].as<String>().c_str(), sizeof(config.Ntp_Timezone));
|
||||||
strlcpy(config.Ntp_TimezoneDescr, root[F("ntp_timezone_descr")].as<String>().c_str(), sizeof(config.Ntp_TimezoneDescr));
|
strlcpy(config.Ntp_TimezoneDescr, root[F("ntp_timezone_descr")].as<String>().c_str(), sizeof(config.Ntp_TimezoneDescr));
|
||||||
|
config.Ntp_Latitude = root[F("latitude")].as<double>();
|
||||||
|
config.Ntp_Longitude = root[F("longitude")].as<double>();
|
||||||
Configuration.write();
|
Configuration.write();
|
||||||
|
|
||||||
retMsg[F("type")] = F("success");
|
retMsg[F("type")] = F("success");
|
||||||
|
|||||||
53
src/main.cpp
53
src/main.cpp
@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "Display_Graphic.h"
|
#include "Display_Graphic.h"
|
||||||
|
#include "InverterSettings.h"
|
||||||
#include "MessageOutput.h"
|
#include "MessageOutput.h"
|
||||||
#include "VeDirectFrameHandler.h"
|
#include "VeDirectFrameHandler.h"
|
||||||
#include "MqttHandleDtu.h"
|
#include "MqttHandleDtu.h"
|
||||||
@ -15,13 +16,13 @@
|
|||||||
#include "NetworkSettings.h"
|
#include "NetworkSettings.h"
|
||||||
#include "NtpSettings.h"
|
#include "NtpSettings.h"
|
||||||
#include "PinMapping.h"
|
#include "PinMapping.h"
|
||||||
|
#include "SunPosition.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "WebApi.h"
|
#include "WebApi.h"
|
||||||
#include "PowerLimiter.h"
|
#include "PowerLimiter.h"
|
||||||
#include "PylontechCanReceiver.h"
|
#include "PylontechCanReceiver.h"
|
||||||
#include "defaults.h"
|
#include "defaults.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Hoymiles.h>
|
|
||||||
#include <LittleFS.h>
|
#include <LittleFS.h>
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@ -85,6 +86,11 @@ void setup()
|
|||||||
NtpSettings.init();
|
NtpSettings.init();
|
||||||
MessageOutput.println(F("done"));
|
MessageOutput.println(F("done"));
|
||||||
|
|
||||||
|
// Initialize SunPosition
|
||||||
|
MessageOutput.print(F("Initialize SunPosition... "));
|
||||||
|
SunPosition.init();
|
||||||
|
MessageOutput.println(F("done"));
|
||||||
|
|
||||||
// Initialize MqTT
|
// Initialize MqTT
|
||||||
MessageOutput.print(F("Initialize MqTT... "));
|
MessageOutput.print(F("Initialize MqTT... "));
|
||||||
MqttSettings.init();
|
MqttSettings.init();
|
||||||
@ -127,46 +133,7 @@ void setup()
|
|||||||
}
|
}
|
||||||
MessageOutput.println(F("done"));
|
MessageOutput.println(F("done"));
|
||||||
|
|
||||||
// Initialize inverter communication
|
InverterSettings.init();
|
||||||
MessageOutput.print(F("Initialize Hoymiles interface... "));
|
|
||||||
if (PinMapping.isValidNrf24Config()) {
|
|
||||||
SPIClass* spiClass = new SPIClass(HSPI);
|
|
||||||
spiClass->begin(pin.nrf24_clk, pin.nrf24_miso, pin.nrf24_mosi, pin.nrf24_cs);
|
|
||||||
Hoymiles.setMessageOutput(&MessageOutput);
|
|
||||||
Hoymiles.init(spiClass, pin.nrf24_en, pin.nrf24_irq);
|
|
||||||
|
|
||||||
MessageOutput.println(F(" Setting radio PA level... "));
|
|
||||||
Hoymiles.getRadio()->setPALevel((rf24_pa_dbm_e)config.Dtu_PaLevel);
|
|
||||||
|
|
||||||
MessageOutput.println(F(" Setting DTU serial... "));
|
|
||||||
Hoymiles.getRadio()->setDtuSerial(config.Dtu_Serial);
|
|
||||||
|
|
||||||
MessageOutput.println(F(" Setting poll interval... "));
|
|
||||||
Hoymiles.setPollInterval(config.Dtu_PollInterval);
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
|
||||||
if (config.Inverter[i].Serial > 0) {
|
|
||||||
MessageOutput.print(F(" Adding inverter: "));
|
|
||||||
MessageOutput.print(config.Inverter[i].Serial, HEX);
|
|
||||||
MessageOutput.print(F(" - "));
|
|
||||||
MessageOutput.print(config.Inverter[i].Name);
|
|
||||||
auto inv = Hoymiles.addInverter(
|
|
||||||
config.Inverter[i].Name,
|
|
||||||
config.Inverter[i].Serial);
|
|
||||||
|
|
||||||
if (inv != nullptr) {
|
|
||||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
|
||||||
inv->Statistics()->setStringMaxPower(c, config.Inverter[i].channel[c].MaxChannelPower);
|
|
||||||
inv->Statistics()->setChannelFieldOffset(TYPE_DC, static_cast<ChannelNum_t>(c), FLD_YT, config.Inverter[i].channel[c].YieldTotalOffset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MessageOutput.println(F(" done"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MessageOutput.println(F("done"));
|
|
||||||
} else {
|
|
||||||
MessageOutput.println(F("Invalid pin config"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize ve.direct communication
|
// Initialize ve.direct communication
|
||||||
MessageOutput.println(F("Initialize ve.direct interface... "));
|
MessageOutput.println(F("Initialize ve.direct interface... "));
|
||||||
@ -191,7 +158,7 @@ void loop()
|
|||||||
yield();
|
yield();
|
||||||
PowerLimiter.loop();
|
PowerLimiter.loop();
|
||||||
yield();
|
yield();
|
||||||
Hoymiles.loop();
|
InverterSettings.loop();
|
||||||
yield();
|
yield();
|
||||||
// Vedirect_Enabled is unknown to lib. Therefor check has to be done here
|
// Vedirect_Enabled is unknown to lib. Therefor check has to be done here
|
||||||
if (Configuration.get().Vedirect_Enabled) {
|
if (Configuration.get().Vedirect_Enabled) {
|
||||||
@ -212,6 +179,8 @@ void loop()
|
|||||||
yield();
|
yield();
|
||||||
Display.loop();
|
Display.loop();
|
||||||
yield();
|
yield();
|
||||||
|
SunPosition.loop();
|
||||||
|
yield();
|
||||||
MessageOutput.loop();
|
MessageOutput.loop();
|
||||||
yield();
|
yield();
|
||||||
PylontechCanReceiver.loop();
|
PylontechCanReceiver.loop();
|
||||||
|
|||||||
@ -21,9 +21,10 @@
|
|||||||
"vue-router": "^4.1.6"
|
"vue-router": "^4.1.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@intlify/unplugin-vue-i18n": "^0.8.2",
|
||||||
"@rushstack/eslint-patch": "^1.2.0",
|
"@rushstack/eslint-patch": "^1.2.0",
|
||||||
"@types/bootstrap": "^5.2.6",
|
"@types/bootstrap": "^5.2.6",
|
||||||
"@types/node": "^18.13.0",
|
"@types/node": "^18.14.0",
|
||||||
"@types/spark-md5": "^3.0.2",
|
"@types/spark-md5": "^3.0.2",
|
||||||
"@vitejs/plugin-vue": "^4.0.0",
|
"@vitejs/plugin-vue": "^4.0.0",
|
||||||
"@vue/eslint-config-typescript": "^11.0.2",
|
"@vue/eslint-config-typescript": "^11.0.2",
|
||||||
@ -31,11 +32,12 @@
|
|||||||
"eslint": "^8.34.0",
|
"eslint": "^8.34.0",
|
||||||
"eslint-plugin-vue": "^9.9.0",
|
"eslint-plugin-vue": "^9.9.0",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"sass": "^1.58.1",
|
"sass": "^1.58.3",
|
||||||
|
"terser": "^5.16.4",
|
||||||
"typescript": "^4.9.5",
|
"typescript": "^4.9.5",
|
||||||
"vite": "^4.1.1",
|
"vite": "^4.1.3",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-css-injected-by-js": "^3.0.0",
|
"vite-plugin-css-injected-by-js": "^3.0.1",
|
||||||
"vue-tsc": "^1.0.24"
|
"vue-tsc": "^1.1.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
:maxlength="maxlength"
|
:maxlength="maxlength"
|
||||||
:min="min"
|
:min="min"
|
||||||
:max="max"
|
:max="max"
|
||||||
|
:step="step"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:aria-describedby="descriptionId"
|
:aria-describedby="descriptionId"
|
||||||
/>
|
/>
|
||||||
@ -69,6 +70,7 @@ export default defineComponent({
|
|||||||
'maxlength': String,
|
'maxlength': String,
|
||||||
'min': String,
|
'min': String,
|
||||||
'max': String,
|
'max': String,
|
||||||
|
'step': String,
|
||||||
'rows': String,
|
'rows': String,
|
||||||
'disabled': Boolean,
|
'disabled': Boolean,
|
||||||
'postfix': String,
|
'postfix': String,
|
||||||
|
|||||||
@ -5,26 +5,24 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('radioinfo.ChipStatus') }}</th>
|
<th>{{ $t('radioinfo.ChipStatus') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !systemStatus.radio_connected,
|
<StatusBadge :status="systemStatus.radio_connected" true_text="radioinfo.Connected" false_text="radioinfo.NotConnected" />
|
||||||
'text-bg-success': systemStatus.radio_connected,
|
|
||||||
}">
|
|
||||||
<span v-if="systemStatus.radio_connected">{{ $t('radioinfo.Connected') }}</span>
|
|
||||||
<span v-else>{{ $t('radioinfo.NotConnected') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('radioinfo.ChipType') }}</th>
|
<th>{{ $t('radioinfo.ChipType') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': systemStatus.radio_connected && !systemStatus.radio_pvariant,
|
<span class="badge" :class="{
|
||||||
'text-bg-success': systemStatus.radio_connected && systemStatus.radio_pvariant,
|
'text-bg-danger': systemStatus.radio_connected && !systemStatus.radio_pvariant,
|
||||||
'text-bg-secondary': !systemStatus.radio_connected,
|
'text-bg-success': systemStatus.radio_connected && systemStatus.radio_pvariant,
|
||||||
}">
|
'text-bg-secondary': !systemStatus.radio_connected,
|
||||||
<span
|
}">
|
||||||
v-if="systemStatus.radio_connected && systemStatus.radio_pvariant">nRF24L01+</span>
|
<template
|
||||||
<span
|
v-if="systemStatus.radio_connected && systemStatus.radio_pvariant">nRF24L01+</template>
|
||||||
v-else-if="systemStatus.radio_connected && !systemStatus.radio_pvariant">nRF24L01</span>
|
<template
|
||||||
<span v-else>{{ $t('radioinfo.Unknown') }}</span>
|
v-else-if="systemStatus.radio_connected && !systemStatus.radio_pvariant">nRF24L01</template>
|
||||||
|
<template v-else>{{ $t('radioinfo.Unknown') }}</template>
|
||||||
|
</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -35,12 +33,14 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import StatusBadge from './StatusBadge.vue';
|
||||||
import type { SystemStatus } from '@/types/SystemStatus';
|
import type { SystemStatus } from '@/types/SystemStatus';
|
||||||
import { defineComponent, type PropType } from 'vue';
|
import { defineComponent, type PropType } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
CardElement,
|
CardElement,
|
||||||
|
StatusBadge,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
systemStatus: { type: Object as PropType<SystemStatus>, required: true },
|
systemStatus: { type: Object as PropType<SystemStatus>, required: true },
|
||||||
|
|||||||
32
webapp/src/components/StatusBadge.vue
Normal file
32
webapp/src/components/StatusBadge.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<span class="badge" :class="[status ? true_class : false_class]">
|
||||||
|
<template v-if="status">{{ $t(true_text) }}</template>
|
||||||
|
<template v-else>{{ $t(false_text) }}</template>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
props: {
|
||||||
|
'status': Boolean,
|
||||||
|
'true_text': {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
'false_text': {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
'true_class': {
|
||||||
|
type: String,
|
||||||
|
default: 'text-bg-success'
|
||||||
|
},
|
||||||
|
'false_class': {
|
||||||
|
type: String,
|
||||||
|
default: 'text-bg-danger'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@ -5,12 +5,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('wifiapinfo.Status') }}</th>
|
<th>{{ $t('wifiapinfo.Status') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !networkStatus.ap_status,
|
<StatusBadge :status="networkStatus.ap_status" true_text="wifiapinfo.Enabled" false_text="wifiapinfo.Disabled" />
|
||||||
'text-bg-success': networkStatus.ap_status,
|
|
||||||
}">
|
|
||||||
<span v-if="networkStatus.ap_status">{{ $t('wifiapinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('wifiapinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -29,12 +25,14 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import StatusBadge from './StatusBadge.vue';
|
||||||
import type { NetworkStatus } from '@/types/NetworkStatus';
|
import type { NetworkStatus } from '@/types/NetworkStatus';
|
||||||
import { defineComponent, type PropType } from 'vue';
|
import { defineComponent, type PropType } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
CardElement,
|
CardElement,
|
||||||
|
StatusBadge,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
||||||
|
|||||||
@ -5,12 +5,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('wifistationinfo.Status') }}</th>
|
<th>{{ $t('wifistationinfo.Status') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !networkStatus.sta_status,
|
<StatusBadge :status="networkStatus.sta_status" true_text="wifistationinfo.Enabled" false_text="wifistationinfo.Disabled" />
|
||||||
'text-bg-success': networkStatus.sta_status,
|
|
||||||
}">
|
|
||||||
<span v-if="networkStatus.sta_status">{{ $t('wifistationinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('wifistationinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -33,12 +29,14 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import StatusBadge from './StatusBadge.vue';
|
||||||
import type { NetworkStatus } from '@/types/NetworkStatus';
|
import type { NetworkStatus } from '@/types/NetworkStatus';
|
||||||
import { defineComponent, type PropType } from 'vue';
|
import { defineComponent, type PropType } from 'vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
CardElement,
|
CardElement,
|
||||||
|
StatusBadge
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
||||||
|
|||||||
@ -1,19 +1,19 @@
|
|||||||
{
|
{
|
||||||
"menu": {
|
"menu": {
|
||||||
"LiveView": "Live Ansicht",
|
"LiveView": "Live-Ansicht",
|
||||||
"Settings": "Einstellungen",
|
"Settings": "Einstellungen",
|
||||||
"NetworkSettings": "Netzwerk Einstellungen",
|
"NetworkSettings": "Netzwerk",
|
||||||
"NTPSettings": "NTP Einstellungen",
|
"NTPSettings": "NTP",
|
||||||
"MQTTSettings": "MQTT Einstellungen",
|
"MQTTSettings": "MQTT",
|
||||||
"InverterSettings": "Wechselrichter Einstellungen",
|
"InverterSettings": "Wechselrichter",
|
||||||
"SecuritySettings": "Sicherheitseinstellungen",
|
"SecuritySettings": "Sicherheit",
|
||||||
"DTUSettings": "DTU Einstellungen",
|
"DTUSettings": "DTU",
|
||||||
"DeviceManager": "Geräte-Manager",
|
"DeviceManager": "Hardware",
|
||||||
"VedirectSettings": "Ve.direct Settings",
|
"VedirectSettings": "Ve.direct",
|
||||||
"BatterySettings": "Battery Settings",
|
"BatterySettings": "Battery",
|
||||||
"ConfigManagement": "Konfigurationsverwaltung",
|
"ConfigManagement": "Konfigurationsverwaltung",
|
||||||
"FirmwareUpgrade": "Firmware Aktualisierung",
|
"FirmwareUpgrade": "Firmware-Aktualisierung",
|
||||||
"DeviceReboot": "Geräteneustart",
|
"DeviceReboot": "Neustart",
|
||||||
"Info": "Info",
|
"Info": "Info",
|
||||||
"System": "System",
|
"System": "System",
|
||||||
"Network": "Netzwerk",
|
"Network": "Netzwerk",
|
||||||
@ -53,7 +53,7 @@
|
|||||||
"5004": "Ungültigen Inverter angegeben!",
|
"5004": "Ungültigen Inverter angegeben!",
|
||||||
"6001": "Neustart durchgeführt!",
|
"6001": "Neustart durchgeführt!",
|
||||||
"6002": "Neustart abgebrochen!",
|
"6002": "Neustart abgebrochen!",
|
||||||
"7001": "MQTT Server muss zwischen 1 und {max} Zeichen lang sein!",
|
"7001": "MQTT-Server muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
"7002": "Benutzername darf nicht länger als {max} Zeichen sein!",
|
"7002": "Benutzername darf nicht länger als {max} Zeichen sein!",
|
||||||
"7003": "Passwort darf nicht länger als {max} Zeichen sein!",
|
"7003": "Passwort darf nicht länger als {max} Zeichen sein!",
|
||||||
"7004": "Topic darf nicht länger als {max} Zeichen sein!",
|
"7004": "Topic darf nicht länger als {max} Zeichen sein!",
|
||||||
@ -61,18 +61,18 @@
|
|||||||
"7006": "Topic muss mit einem Slash (/) enden!",
|
"7006": "Topic muss mit einem Slash (/) enden!",
|
||||||
"7007": "Port muss eine Zahl zwischen 1 und 65535 sein!",
|
"7007": "Port muss eine Zahl zwischen 1 und 65535 sein!",
|
||||||
"7008": "Das Zertifikat darf nicht länger als {max} Zeichen sein!",
|
"7008": "Das Zertifikat darf nicht länger als {max} Zeichen sein!",
|
||||||
"7009": "LWT Topic darf nicht länger als {max} Zeichen sein!",
|
"7009": "LWT-Topic darf nicht länger als {max} Zeichen sein!",
|
||||||
"7010": "LWT Topic darf keine Leerzeichen enthalten!",
|
"7010": "LWT-Topic darf keine Leerzeichen enthalten!",
|
||||||
"7011": "LWT Online Nachricht darf nicht länger als {max} Zeichen sein!",
|
"7011": "LWT-Online-Nachricht darf nicht länger als {max} Zeichen sein!",
|
||||||
"7012": "LWT Offline Nachricht darf nicht länger als {max} Zeichen sein!",
|
"7012": "LWT-Offline-Nachricht darf nicht länger als {max} Zeichen sein!",
|
||||||
"7013": "Veröffentlichungsintervall muss zwischen {min} und {max} sein!",
|
"7013": "Veröffentlichungsintervall muss zwischen {min} und {max} sein!",
|
||||||
"7014": "Hass Topic darf nicht länger als {max} Zeichen sein!",
|
"7014": "Hass-Topic darf nicht länger als {max} Zeichen sein!",
|
||||||
"7015": "Hass Topic darf keine Leerzeichen enthalten!",
|
"7015": "Hass-Topic darf keine Leerzeichen enthalten!",
|
||||||
"8001": "IP Adresse ist ungültig!",
|
"8001": "IP-Adresse ist ungültig!",
|
||||||
"8002": "Netzmaske ist ungültig!",
|
"8002": "Netzmaske ist ungültig!",
|
||||||
"8003": "Standardgateway ist ungültig!",
|
"8003": "Standardgateway ist ungültig!",
|
||||||
"8004": "DNS Server IP 1 ist ungültig!",
|
"8004": "DNS-Server-IP 1 ist ungültig!",
|
||||||
"8005": "DNS Server IP 2 ist ungültig!",
|
"8005": "DNS-Server-IP 2 ist ungültig!",
|
||||||
"9001": "Zeitserver muss zwischen 1 und {max} Zeichen lang sein!",
|
"9001": "Zeitserver muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
"9002": "Zeitzone muss zwischen 1 und {max} Zeichen lang sein!",
|
"9002": "Zeitzone muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
"9003": "Zeitzonenbeschreibung muss zwischen 1 und {max} Zeichen lang sein!",
|
"9003": "Zeitzonenbeschreibung muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
@ -90,28 +90,28 @@
|
|||||||
"12001": "Profil muss zwischen 1 und {max} Zeichen lang sein!"
|
"12001": "Profil muss zwischen 1 und {max} Zeichen lang sein!"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"LiveData": "Live Daten",
|
"LiveData": "Live-Daten",
|
||||||
"SerialNumber": "Seriennummer: ",
|
"SerialNumber": "Seriennummer: ",
|
||||||
"CurrentLimit": "Aktuelles Limit: ",
|
"CurrentLimit": "Aktuelles Limit: ",
|
||||||
"DataAge": "letzte Aktualisierung: ",
|
"DataAge": "Letzte Aktualisierung: ",
|
||||||
"Seconds": "vor {val} Sekunden",
|
"Seconds": "vor {val} Sekunden",
|
||||||
"ShowSetInverterLimit": "Zeige / Setze Wechselrichterlimit",
|
"ShowSetInverterLimit": "Zeige / Setze Wechselrichterlimit",
|
||||||
"TurnOnOff": "Schalte Wechselrichter ein oder aus",
|
"TurnOnOff": "Schalte Wechselrichter ein oder aus",
|
||||||
"ShowInverterInfo": "Zeige Wechselrichter Informationen",
|
"ShowInverterInfo": "Zeige Wechselrichter-Informationen",
|
||||||
"ShowEventlog": "Zeige Ereignisanzeige",
|
"ShowEventlog": "Zeige Ereignisanzeige",
|
||||||
"UnreadMessages": "Ungelesene Meldungen",
|
"UnreadMessages": "Ungelesene Meldungen",
|
||||||
"Loading": "@:base.Loading",
|
"Loading": "@:base.Loading",
|
||||||
"EventLog": "Ereignisanzeige",
|
"EventLog": "Ereignisanzeige",
|
||||||
"Close": "Schließen",
|
"Close": "Schließen",
|
||||||
"InverterInfo": "Wechselrichter Informationen",
|
"InverterInfo": "Wechselrichter-Informationen",
|
||||||
"LimitSettings": "Limit Einstellungen",
|
"LimitSettings": "Limit-Einstellungen",
|
||||||
"LastLimitSetStatus": "Letzter Übertragungsstatus:",
|
"LastLimitSetStatus": "Letzter Übertragungsstatus:",
|
||||||
"SetLimit": "Setze Limit:",
|
"SetLimit": "Setze Limit:",
|
||||||
"Relative": "Relativ (%)",
|
"Relative": "Relativ (%)",
|
||||||
"Absolute": "Absolut (W)",
|
"Absolute": "Absolut (W)",
|
||||||
"LimitHint": "<b>Hinweis:</b> Wenn das Limit als Absolutwert eingestellt wird, wird die Anzeige des aktuellen Wertes erst nach ~4 Minuten aktualisiert.",
|
"LimitHint": "<b>Hinweis:</b> Wenn das Limit als Absolutwert eingestellt wird, wird die Anzeige des aktuellen Wertes erst nach ~4 Minuten aktualisiert.",
|
||||||
"SetPersistent": "Limit dauerhaft setzen",
|
"SetPersistent": "Limit dauerhaft setzen",
|
||||||
"SetNonPersistent": "Limit nicht dauerhaft setzen",
|
"SetNonPersistent": "Limit temporär setzen",
|
||||||
"PowerSettings": "Energieeinstellungen",
|
"PowerSettings": "Energieeinstellungen",
|
||||||
"LastPowerSetStatus": "Letzer Übertragungsstatus:",
|
"LastPowerSetStatus": "Letzer Übertragungsstatus:",
|
||||||
"TurnOn": "Einschalten",
|
"TurnOn": "Einschalten",
|
||||||
@ -158,14 +158,14 @@
|
|||||||
"devinfo": {
|
"devinfo": {
|
||||||
"NoInfo": "Keine Informationen verfügbar",
|
"NoInfo": "Keine Informationen verfügbar",
|
||||||
"NoInfoLong": "Bisher wurden noch keine gültigen Daten vom Wechselrichter empfangen. Versuche es weiter...",
|
"NoInfoLong": "Bisher wurden noch keine gültigen Daten vom Wechselrichter empfangen. Versuche es weiter...",
|
||||||
"UnknownModel": "Unbekanntes Modell! Bitte melden Sie die \"Hardware Teilenummer\" und das Modell (z.B. HM-350) als Problem <a href=\"https://github.com/tbnobody/OpenDTU/issues\" target=\"_blank\">hier</a>.",
|
"UnknownModel": "Unbekanntes Modell! Bitte melden Sie die \"Hardware Teilenummer\" und das Modell (z.B. HM-350) <a href=\"https://github.com/tbnobody/OpenDTU/issues\" target=\"_blank\">hier</a> als Problem.",
|
||||||
"Model": "Modell",
|
"Model": "Modell",
|
||||||
"DetectedMaxPower": "Ermittelte max. Leistung",
|
"DetectedMaxPower": "Ermittelte max. Leistung",
|
||||||
"BootloaderVersion": "Bootloader Version",
|
"BootloaderVersion": "Bootloader-Version",
|
||||||
"FirmwareVersion": "Firmware Version",
|
"FirmwareVersion": "Firmware-Version",
|
||||||
"FirmwareBuildDate": "Firmware Erstellungsdatum",
|
"FirmwareBuildDate": "Firmware-Erstellungsdatum",
|
||||||
"HardwarePartNumber": "Hardware Teilenummer",
|
"HardwarePartNumber": "Hardware-Teilenummer",
|
||||||
"HardwareVersion": "Hardware Version"
|
"HardwareVersion": "Hardware-Version"
|
||||||
},
|
},
|
||||||
"systeminfo": {
|
"systeminfo": {
|
||||||
"SystemInfo": "System Informationen",
|
"SystemInfo": "System Informationen",
|
||||||
@ -174,13 +174,13 @@
|
|||||||
"VersionOk": "Aktuell!"
|
"VersionOk": "Aktuell!"
|
||||||
},
|
},
|
||||||
"firmwareinfo": {
|
"firmwareinfo": {
|
||||||
"FirmwareInformation": "Firmware Informationen",
|
"FirmwareInformation": "Firmwareinformationen",
|
||||||
"Hostname": "Hostname",
|
"Hostname": "Hostname",
|
||||||
"SdkVersion": "SDK Version",
|
"SdkVersion": "SDK-Version",
|
||||||
"ConfigVersion": "Konfigurationsversion",
|
"ConfigVersion": "Konfigurationsversion",
|
||||||
"FirmwareVersion": "Firmware Version / Git Hash",
|
"FirmwareVersion": "Firmwareversion / git Hash",
|
||||||
"FirmwareVersionHint": "Klicken Sie hier, um Informationen über Ihre aktuelle Version anzuzeigen",
|
"FirmwareVersionHint": "Klicken Sie hier, um Informationen über Ihre aktuelle Version anzuzeigen",
|
||||||
"FirmwareUpdate": "Firmware Aktualisierung",
|
"FirmwareUpdate": "Firmware-Aktualisierung",
|
||||||
"FirmwareUpdateHint": "Klicken Sie hier, um die Änderungen zwischen Ihrer Version und der neuesten Version anzuzeigen",
|
"FirmwareUpdateHint": "Klicken Sie hier, um die Änderungen zwischen Ihrer Version und der neuesten Version anzuzeigen",
|
||||||
"ResetReason0": "Reset Grund CPU 0",
|
"ResetReason0": "Reset Grund CPU 0",
|
||||||
"ResetReason1": "Reset Grund CPU 1",
|
"ResetReason1": "Reset Grund CPU 1",
|
||||||
@ -188,15 +188,15 @@
|
|||||||
"Uptime": "Betriebszeit"
|
"Uptime": "Betriebszeit"
|
||||||
},
|
},
|
||||||
"hardwareinfo": {
|
"hardwareinfo": {
|
||||||
"HardwareInformation": "Hardware Informationen",
|
"HardwareInformation": "Hardwareinformationen",
|
||||||
"ChipModel": "Chip Modell",
|
"ChipModel": "Chip-Modell",
|
||||||
"ChipRevision": "Chip Revision",
|
"ChipRevision": "Chip-Revision",
|
||||||
"ChipCores": "Chip Kerne",
|
"ChipCores": "Chip-Kerne",
|
||||||
"CpuFrequency": "CPU Frequenz",
|
"CpuFrequency": "CPU-Frequenz",
|
||||||
"Mhz": "MHz"
|
"Mhz": "MHz"
|
||||||
},
|
},
|
||||||
"memoryinfo": {
|
"memoryinfo": {
|
||||||
"MemoryInformation": "Speicher Informationen",
|
"MemoryInformation": "Speicherinformationen",
|
||||||
"Type": "Typ",
|
"Type": "Typ",
|
||||||
"Usage": "Verwendung",
|
"Usage": "Verwendung",
|
||||||
"Free": "Frei",
|
"Free": "Frei",
|
||||||
@ -207,18 +207,18 @@
|
|||||||
"Sketch": "Sketch"
|
"Sketch": "Sketch"
|
||||||
},
|
},
|
||||||
"radioinfo": {
|
"radioinfo": {
|
||||||
"RadioInformation": "Funkmodul Informationen",
|
"RadioInformation": "Funkmodulinformationen",
|
||||||
"ChipStatus": "Chip Status",
|
"ChipStatus": "Chip-Status",
|
||||||
"ChipType": "Chip Typ",
|
"ChipType": "Chip-Typ",
|
||||||
"Connected": "verbunden",
|
"Connected": "verbunden",
|
||||||
"NotConnected": "nicht verbunden",
|
"NotConnected": "nicht verbunden",
|
||||||
"Unknown": "unbekannt"
|
"Unknown": "unbekannt"
|
||||||
},
|
},
|
||||||
"networkinfo": {
|
"networkinfo": {
|
||||||
"NetworkInformation": "Netzwerk Informationen"
|
"NetworkInformation": "Netzwerkinformationen"
|
||||||
},
|
},
|
||||||
"wifistationinfo": {
|
"wifistationinfo": {
|
||||||
"WifiStationInfo": "WiFi Informationen (Station)",
|
"WifiStationInfo": "WLAN-Informationen (Station)",
|
||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"Enabled": "aktiv",
|
"Enabled": "aktiv",
|
||||||
"Disabled": "nicht aktiv",
|
"Disabled": "nicht aktiv",
|
||||||
@ -227,7 +227,7 @@
|
|||||||
"Rssi": "RSSI"
|
"Rssi": "RSSI"
|
||||||
},
|
},
|
||||||
"wifiapinfo": {
|
"wifiapinfo": {
|
||||||
"WifiApInfo": "WiFi Informationen (Access Point)",
|
"WifiApInfo": "WLAN-Informationen (Access Point)",
|
||||||
"Status": "@:wifistationinfo.Status",
|
"Status": "@:wifistationinfo.Status",
|
||||||
"Enabled": "@:wifistationinfo.Enabled",
|
"Enabled": "@:wifistationinfo.Enabled",
|
||||||
"Disabled": "@:wifistationinfo.Disabled",
|
"Disabled": "@:wifistationinfo.Disabled",
|
||||||
@ -235,21 +235,21 @@
|
|||||||
"Stations": "# Teilnehmer"
|
"Stations": "# Teilnehmer"
|
||||||
},
|
},
|
||||||
"interfacenetworkinfo": {
|
"interfacenetworkinfo": {
|
||||||
"NetworkInterface": "Netzwerk Schnittstelle ({iface})",
|
"NetworkInterface": "Netzwerkschnittstelle ({iface})",
|
||||||
"Hostname": "@:firmwareinfo.Hostname",
|
"Hostname": "@:firmwareinfo.Hostname",
|
||||||
"IpAddress": "IP Adresse",
|
"IpAddress": "IP-Adresse",
|
||||||
"Netmask": "Netzmaske",
|
"Netmask": "Netzmaske",
|
||||||
"DefaultGateway": "Standardgateway",
|
"DefaultGateway": "Standardgateway",
|
||||||
"Dns": "DNS {num}",
|
"Dns": "DNS {num}",
|
||||||
"MacAddress": "MAC Adresse"
|
"MacAddress": "MAC-Adresse"
|
||||||
},
|
},
|
||||||
"interfaceapinfo": {
|
"interfaceapinfo": {
|
||||||
"NetworkInterface": "Netzwerk Schnittstelle (Access Point)",
|
"NetworkInterface": "Netzwerkschnittstelle (Access Point)",
|
||||||
"IpAddress": "@:interfacenetworkinfo.IpAddress",
|
"IpAddress": "@:interfacenetworkinfo.IpAddress",
|
||||||
"MacAddress": "@:interfacenetworkinfo.MacAddress"
|
"MacAddress": "@:interfacenetworkinfo.MacAddress"
|
||||||
},
|
},
|
||||||
"ntpinfo": {
|
"ntpinfo": {
|
||||||
"NtpInformation": "NTP Informationen",
|
"NtpInformation": "NTP-Informationen",
|
||||||
"ConfigurationSummary": "Konfigurationszusammenfassung",
|
"ConfigurationSummary": "Konfigurationszusammenfassung",
|
||||||
"Server": "Server",
|
"Server": "Server",
|
||||||
"Timezone": "Zeitzone",
|
"Timezone": "Zeitzone",
|
||||||
@ -258,10 +258,15 @@
|
|||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"Synced": "synchronisiert",
|
"Synced": "synchronisiert",
|
||||||
"NotSynced": "nicht synchronisiert",
|
"NotSynced": "nicht synchronisiert",
|
||||||
"LocalTime": "Lokale Uhrzeit"
|
"LocalTime": "Lokale Uhrzeit",
|
||||||
|
"Sunrise": "Nautische Morgendämmerung",
|
||||||
|
"Sunset": "Nautische Abenddämmerung",
|
||||||
|
"Mode": "Modus",
|
||||||
|
"Day": "Tag",
|
||||||
|
"Night": "Nacht"
|
||||||
},
|
},
|
||||||
"mqttinfo": {
|
"mqttinfo": {
|
||||||
"MqttInformation": "MQTT Informationen",
|
"MqttInformation": "MQTT-Informationen",
|
||||||
"ConfigurationSummary": "@:ntpinfo.ConfigurationSummary",
|
"ConfigurationSummary": "@:ntpinfo.ConfigurationSummary",
|
||||||
"Status": "@:ntpinfo.Status",
|
"Status": "@:ntpinfo.Status",
|
||||||
"Enabled": "aktiv",
|
"Enabled": "aktiv",
|
||||||
@ -275,7 +280,7 @@
|
|||||||
"Retain": "Retain",
|
"Retain": "Retain",
|
||||||
"Tls": "TLS",
|
"Tls": "TLS",
|
||||||
"RootCertifcateInfo": "Root CA-Zertifikat-Informationen",
|
"RootCertifcateInfo": "Root CA-Zertifikat-Informationen",
|
||||||
"HassSummary": "Home Assistant MQTT Auto Discovery Konfigurationszusammenfassung",
|
"HassSummary": "Home Assistant MQTT-Auto-Discovery Konfigurationszusammenfassung",
|
||||||
"Expire": "Ablaufen",
|
"Expire": "Ablaufen",
|
||||||
"IndividualPanels": "Einzelne Paneele",
|
"IndividualPanels": "Einzelne Paneele",
|
||||||
"RuntimeSummary": "Laufzeitzusammenfassung",
|
"RuntimeSummary": "Laufzeitzusammenfassung",
|
||||||
@ -295,7 +300,7 @@
|
|||||||
},
|
},
|
||||||
"console": {
|
"console": {
|
||||||
"Console": "Konsole",
|
"Console": "Konsole",
|
||||||
"VirtualDebugConsole": "Virtuelle Debug Konsole",
|
"VirtualDebugConsole": "Virtuelle Debug-Konsole",
|
||||||
"EnableAutoScroll": "Automatisches Scrollen aktivieren",
|
"EnableAutoScroll": "Automatisches Scrollen aktivieren",
|
||||||
"ClearConsole": "Konsole löschen",
|
"ClearConsole": "Konsole löschen",
|
||||||
"CopyToClipboard": "In die Zwischenablage kopieren"
|
"CopyToClipboard": "In die Zwischenablage kopieren"
|
||||||
@ -317,7 +322,7 @@
|
|||||||
"Power": "Leistung",
|
"Power": "Leistung",
|
||||||
"Voltage": "Spannung",
|
"Voltage": "Spannung",
|
||||||
"Current": "Strom",
|
"Current": "Strom",
|
||||||
"Power DC": "DC Leistung",
|
"Power DC": "DC-Leistung",
|
||||||
"YieldDay": "Tagesertrag",
|
"YieldDay": "Tagesertrag",
|
||||||
"YieldTotal": "Gesamtertrag",
|
"YieldTotal": "Gesamtertrag",
|
||||||
"Frequency": "Frequenz",
|
"Frequency": "Frequenz",
|
||||||
@ -337,11 +342,11 @@
|
|||||||
"RebootHint": "<b>Hinweis:</b> Ein manueller Neustart muss normalerweise nicht durchgeführt werden. OpenDTU führt jeden erforderlichen Neustart (z. B. nach einem Firmware-Update) automatisch durch. Einstellungen werden auch ohne Neustart übernommen. Wenn Sie aufgrund eines Fehlers einen Neustart durchführen müssen, denken Sie bitte daran, diesen unter <a href=\"https://github.com/tbnobody/OpenDTU/issues\" class=\"alert-link\" target=\"_blank\">https://github.com/tbnobody/OpenDTU/issues</a> zu melden."
|
"RebootHint": "<b>Hinweis:</b> Ein manueller Neustart muss normalerweise nicht durchgeführt werden. OpenDTU führt jeden erforderlichen Neustart (z. B. nach einem Firmware-Update) automatisch durch. Einstellungen werden auch ohne Neustart übernommen. Wenn Sie aufgrund eines Fehlers einen Neustart durchführen müssen, denken Sie bitte daran, diesen unter <a href=\"https://github.com/tbnobody/OpenDTU/issues\" class=\"alert-link\" target=\"_blank\">https://github.com/tbnobody/OpenDTU/issues</a> zu melden."
|
||||||
},
|
},
|
||||||
"dtuadmin": {
|
"dtuadmin": {
|
||||||
"DtuSettings": "DTU Einstellungen",
|
"DtuSettings": "DTU-Einstellungen",
|
||||||
"DtuConfiguration": "DTU Konfiguration",
|
"DtuConfiguration": "DTU-Konfiguration",
|
||||||
"Serial": "Seriennummer:",
|
"Serial": "Seriennummer:",
|
||||||
"SerialHint": "Sowohl der Wechselrichter als auch die DTU haben eine Seriennummer. Die DTU-Seriennummer wird beim ersten Start zufällig generiert und muss normalerweise nicht geändert werden.",
|
"SerialHint": "Sowohl der Wechselrichter als auch die DTU haben eine Seriennummer. Die DTU-Seriennummer wird beim ersten Start zufällig generiert und muss normalerweise nicht geändert werden.",
|
||||||
"PollInterval": "Abfrageinterval:",
|
"PollInterval": "Abfrageintervall:",
|
||||||
"Seconds": "Sekunden",
|
"Seconds": "Sekunden",
|
||||||
"PaLevel": "Sendeleistung:",
|
"PaLevel": "Sendeleistung:",
|
||||||
"PaLevelHint": "Stellen Sie sicher, dass Ihre Stromversorgung stabil genug ist, bevor Sie die Sendeleistung erhöhen.",
|
"PaLevelHint": "Stellen Sie sicher, dass Ihre Stromversorgung stabil genug ist, bevor Sie die Sendeleistung erhöhen.",
|
||||||
@ -353,71 +358,74 @@
|
|||||||
},
|
},
|
||||||
"securityadmin": {
|
"securityadmin": {
|
||||||
"SecuritySettings": "Sicherheitseinstellungen",
|
"SecuritySettings": "Sicherheitseinstellungen",
|
||||||
"AdminPassword": "Administrator Passwort",
|
"AdminPassword": "Administrator-Passwort",
|
||||||
"Password": "Passwort:",
|
"Password": "Passwort:",
|
||||||
"RepeatPassword": "Passwort wiederholen:",
|
"RepeatPassword": "Passwort wiederholen:",
|
||||||
"PasswordHint": "<b>Hinweis:</b> Das Administrator-Passwort wird für den Zugriff auf die Webschnittstelle (Benutzer 'admin'), aber auch für die Verbindung mit dem Gerät im AP-Modus verwendet. Es muss 8..64 Zeichen lang sein.",
|
"PasswordHint": "<b>Hinweis:</b> Das Administrator-Passwort wird für den Zugriff auf die Webschnittstelle (Benutzer 'admin'), aber auch für die Verbindung mit dem Gerät im AP-Modus verwendet. Es muss zwischen 8 und 64 Zeichen lang sein.",
|
||||||
"Permissions": "Berechtigungen",
|
"Permissions": "Berechtigungen",
|
||||||
"ReadOnly": "Nur-Lese-Zugriff auf die Weboberfläche ohne Passwort zulassen",
|
"ReadOnly": "Nur-Lese-Zugriff auf die Weboberfläche ohne Passwort zulassen",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
"ntpadmin": {
|
"ntpadmin": {
|
||||||
"NtpSettings": "NTP Einstellungen",
|
"NtpSettings": "NTP-Einstellungen",
|
||||||
"NtpConfiguration": "NTP Konfiguration",
|
"NtpConfiguration": "NTP-Konfiguration",
|
||||||
"TimeServer": "Zeitserver:",
|
"TimeServer": "Zeitserver:",
|
||||||
"TimeServerHint": "Der Standardwert ist in Ordnung, solange OpenDTU direkten Zugang zum Internet hat.",
|
"TimeServerHint": "Der Standardwert ist in Ordnung, solange OpenDTU direkten Zugang zum Internet hat.",
|
||||||
"Timezone": "Zeitzone:",
|
"Timezone": "Zeitzone:",
|
||||||
"TimezoneConfig": "Zeitzonenkonfiguration:",
|
"TimezoneConfig": "Zeitzonenkonfiguration:",
|
||||||
|
"LocationConfiguration": "Standortkonfiguration",
|
||||||
|
"Longitude": "Längengrad:",
|
||||||
|
"Latitude": "Breitengrad:",
|
||||||
"Save": "@:dtuadmin.Save",
|
"Save": "@:dtuadmin.Save",
|
||||||
"ManualTimeSynchronization": "Manuelle Zeitsynchronization",
|
"ManualTimeSynchronization": "Manuelle Zeitsynchronization",
|
||||||
"CurrentOpenDtuTime": "Aktuelle OpenDTU Zeit:",
|
"CurrentOpenDtuTime": "Aktuelle OpenDTU-Zeit:",
|
||||||
"CurrentLocalTime": "Aktuelle lokale Zeit:",
|
"CurrentLocalTime": "Aktuelle lokale Zeit:",
|
||||||
"SynchronizeTime": "Zeit synchronisieren",
|
"SynchronizeTime": "Zeit synchronisieren",
|
||||||
"SynchronizeTimeHint": "<b>Hinweis:</b> Sie können die manuelle Zeitsynchronisation verwenden, um die aktuelle Zeit von OpenDTU einzustellen, wenn kein NTP-Server verfügbar ist. Beachten Sie aber, dass im Falle eines Stromausfalls die Zeit verloren geht. Beachten Sie auch, dass die Zeitgenauigkeit stark verzerrt wird, da sie nicht regelmäßig neu synchronisiert werden kann und der ESP32-Mikrocontroller nicht über eine Echtzeituhr verfügt."
|
"SynchronizeTimeHint": "<b>Hinweis:</b> Sie können die manuelle Zeitsynchronisation verwenden, um die aktuelle Zeit von OpenDTU einzustellen, wenn kein NTP-Server verfügbar ist. Beachten Sie aber, dass im Falle eines Stromausfalls die Zeit verloren geht. Beachten Sie auch, dass die Zeitgenauigkeit stark verzerrt wird, da sie nicht regelmäßig neu synchronisiert werden kann und der ESP32-Mikrocontroller nicht über eine Echtzeituhr verfügt."
|
||||||
},
|
},
|
||||||
"networkadmin": {
|
"networkadmin": {
|
||||||
"NetworkSettings": "Netzwerk Einstellungen",
|
"NetworkSettings": "Netzwerkeinstellungen",
|
||||||
"WifiConfiguration": "WiFi Konfiguration",
|
"WifiConfiguration": "WLAN-Konfiguration",
|
||||||
"WifiSsid": "WiFi SSID:",
|
"WifiSsid": "WLAN-SSID:",
|
||||||
"WifiPassword": "WiFi Passwort:",
|
"WifiPassword": "WLAN-Passwort:",
|
||||||
"Hostname": "Hostname:",
|
"Hostname": "Hostname:",
|
||||||
"HostnameHint": "<b>Hinweis:</b> Der Text <span class=\"font-monospace\">%06X</span> wird durch die letzten 6 Ziffern der ESP-ChipID im Hex-Format ersetzt.",
|
"HostnameHint": "<b>Hinweis:</b> Der Text <span class=\"font-monospace\">%06X</span> wird durch die letzten 6 Ziffern der ESP-ChipID im Hex-Format ersetzt.",
|
||||||
"EnableDhcp": "DHCP aktivieren",
|
"EnableDhcp": "DHCP aktivieren",
|
||||||
"StaticIpConfiguration": "Statische IP Konfiguration",
|
"StaticIpConfiguration": "Statische IP-Konfiguration",
|
||||||
"IpAddress": "IP Adresse:",
|
"IpAddress": "IP-Adresse:",
|
||||||
"Netmask": "Netzmaske:",
|
"Netmask": "Netzmaske:",
|
||||||
"DefaultGateway": "Standardgateway:",
|
"DefaultGateway": "Standardgateway:",
|
||||||
"Dns": "DNS Server {num}:",
|
"Dns": "DNS-Server {num}:",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
"mqttadmin": {
|
"mqttadmin": {
|
||||||
"MqttSettings": "MQTT Einstellungen",
|
"MqttSettings": "MQTT-Einstellungen",
|
||||||
"MqttConfiguration": "MQTT Konfiguration",
|
"MqttConfiguration": "MQTT-Konfiguration",
|
||||||
"EnableMqtt": "MQTT aktivieren",
|
"EnableMqtt": "MQTT aktivieren",
|
||||||
"EnableHass": "Home Assistant MQTT Auto Discovery aktivieren",
|
"EnableHass": "Home Assistant MQTT-Auto-Discovery aktivieren",
|
||||||
"MqttBrokerParameter": "MQTT Broker Parameter",
|
"MqttBrokerParameter": "MQTT-Broker-Parameter",
|
||||||
"Hostname": "Hostname:",
|
"Hostname": "Hostname:",
|
||||||
"HostnameHint": "Hostname oder IP Adresse",
|
"HostnameHint": "Hostname oder IP-Adresse",
|
||||||
"Port": "Port:",
|
"Port": "Port:",
|
||||||
"Username": "Benutzername:",
|
"Username": "Benutzername:",
|
||||||
"UsernameHint": "Benutzername, leer lassen für anonyme Verbindung",
|
"UsernameHint": "Benutzername, leer lassen für anonyme Verbindung",
|
||||||
"Password": "Passwort:",
|
"Password": "Passwort:",
|
||||||
"PasswordHint": "Passwort, leer lassen für anonyme Verbindung",
|
"PasswordHint": "Passwort, leer lassen für anonyme Verbindung",
|
||||||
"BaseTopic": "Basis Topic:",
|
"BaseTopic": "Basis-Topic:",
|
||||||
"BaseTopicHint": "Basis Topic, wird allen veröffentlichten Themen vorangestellt (z.B. inverter/)",
|
"BaseTopicHint": "Basis-Topic, wird allen veröffentlichten Themen vorangestellt (z.B. inverter/)",
|
||||||
"PublishInterval": "Veröffentlichungsintervall:",
|
"PublishInterval": "Veröffentlichungsintervall:",
|
||||||
"Seconds": "Sekunden",
|
"Seconds": "Sekunden",
|
||||||
"EnableRetain": "Retain Flag aktivieren",
|
"EnableRetain": "Retain Flag aktivieren",
|
||||||
"EnableTls": "TLS aktivieren",
|
"EnableTls": "TLS aktivieren",
|
||||||
"RootCa": "CA-Root-Zertifikat (Standard Letsencrypt):",
|
"RootCa": "CA-Root-Zertifikat (Standard Letsencrypt):",
|
||||||
"LwtParameters": "LWT Parameter",
|
"LwtParameters": "LWT-Parameter",
|
||||||
"LwtTopic": "LWT Topic:",
|
"LwtTopic": "LWT-Topic:",
|
||||||
"LwtTopicHint": "LWT Topic, wird der Basis Topic angehängt",
|
"LwtTopicHint": "LWT-Topic, wird der Basis Topic angehängt",
|
||||||
"LwtOnline": "LWT Online Nachricht:",
|
"LwtOnline": "LWT-Online-Nachricht:",
|
||||||
"LwtOnlineHint": "Nachricht, die im LWT-Topic veröffentlicht wird, wenn OpenDTU online ist",
|
"LwtOnlineHint": "Nachricht, die im LWT-Topic veröffentlicht wird, wenn OpenDTU online ist",
|
||||||
"LwtOffline": "LWT Offline Nachricht:",
|
"LwtOffline": "LWT-Offline-Nachricht:",
|
||||||
"LwtOfflineHint": "Nachricht, die im LWT-Topic veröffentlicht wird, wenn OpenDTU offline ist",
|
"LwtOfflineHint": "Nachricht, die im LWT-Topic veröffentlicht wird, wenn OpenDTU offline ist",
|
||||||
"HassParameters": "Home Assistant MQTT Auto Discovery Parameter",
|
"HassParameters": "Home Assistant MQTT-Auto-Discovery-Parameter",
|
||||||
"HassPrefixTopic": "Präfix Topic:",
|
"HassPrefixTopic": "Präfix Topic:",
|
||||||
"HassPrefixTopicHint": "The prefix for the discovery topic",
|
"HassPrefixTopicHint": "The prefix for the discovery topic",
|
||||||
"HassRetain": "Retain Flag aktivieren",
|
"HassRetain": "Retain Flag aktivieren",
|
||||||
@ -450,6 +458,10 @@
|
|||||||
"Add": "Hinzufügen",
|
"Add": "Hinzufügen",
|
||||||
"AddHint": "<b>Hinweis:</b> Sie können zusätzliche Parameter einstellen, nachdem Sie den Wechselrichter erstellt haben. Verwenden Sie dazu das Stiftsymbol in der Wechselrichterliste.",
|
"AddHint": "<b>Hinweis:</b> Sie können zusätzliche Parameter einstellen, nachdem Sie den Wechselrichter erstellt haben. Verwenden Sie dazu das Stiftsymbol in der Wechselrichterliste.",
|
||||||
"InverterList": "Wechselrichterliste",
|
"InverterList": "Wechselrichterliste",
|
||||||
|
"Status": "Status",
|
||||||
|
"Send": "Senden",
|
||||||
|
"Receive": "Empfangen",
|
||||||
|
"StatusHint": "<b>Hinweis:</b> Der Wechselrichter wird über seinen DC-Eingang mit Strom versorgt. Wenn keine Sonne scheint, ist der Wechselrichter aus. Es können trotzdem Anfragen gesendet werden.",
|
||||||
"Type": "Typ",
|
"Type": "Typ",
|
||||||
"Action": "Aktion",
|
"Action": "Aktion",
|
||||||
"DeleteInverter": "Wechselrichter löschen",
|
"DeleteInverter": "Wechselrichter löschen",
|
||||||
@ -457,6 +469,11 @@
|
|||||||
"InverterSerial": "Wechselrichter Seriennummer:",
|
"InverterSerial": "Wechselrichter Seriennummer:",
|
||||||
"InverterName": "Wechselrichter Name:",
|
"InverterName": "Wechselrichter Name:",
|
||||||
"InverterNameHint": "Hier kann ein eigener Namen für den Wechselrichter angeben werden.",
|
"InverterNameHint": "Hier kann ein eigener Namen für den Wechselrichter angeben werden.",
|
||||||
|
"InverterStatus": "Empfangen / senden",
|
||||||
|
"PollEnable": "Daten abrufen",
|
||||||
|
"PollEnableNight": "Daten auch nachts abrufen",
|
||||||
|
"CommandEnable": "Befehle senden",
|
||||||
|
"CommandEnableNight": "Befehle auch nachts senden",
|
||||||
"StringName": "Name String {num}:",
|
"StringName": "Name String {num}:",
|
||||||
"StringNameHint": "Hier kann ein eigener Name für den entsprechenden Port des Wechselrichters angegeben werden.",
|
"StringNameHint": "Hier kann ein eigener Name für den entsprechenden Port des Wechselrichters angegeben werden.",
|
||||||
"StringMaxPower": "Max. Leistung String {num}:",
|
"StringMaxPower": "Max. Leistung String {num}:",
|
||||||
@ -475,7 +492,7 @@
|
|||||||
"BackupConfig": "Sicherung der Konfigurationsdatei",
|
"BackupConfig": "Sicherung der Konfigurationsdatei",
|
||||||
"Backup": "Sichern",
|
"Backup": "Sichern",
|
||||||
"Restore": "Wiederherstellen",
|
"Restore": "Wiederherstellen",
|
||||||
"NoFileSelected": "Keine Datei Ausgewählt",
|
"NoFileSelected": "Keine Datei ausgewählt",
|
||||||
"RestoreHeader": "Wiederherstellen: Wiederherstellen der Konfigurationsdatei",
|
"RestoreHeader": "Wiederherstellen: Wiederherstellen der Konfigurationsdatei",
|
||||||
"Back": "Zurück",
|
"Back": "Zurück",
|
||||||
"UploadSuccess": "Erfolgreich hochgeladen",
|
"UploadSuccess": "Erfolgreich hochgeladen",
|
||||||
@ -490,7 +507,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"Login": "Anmeldung",
|
"Login": "Anmeldung",
|
||||||
"SystemLogin": "System Anmeldung",
|
"SystemLogin": "Systemanmeldung",
|
||||||
"Username": "Benutzername",
|
"Username": "Benutzername",
|
||||||
"UsernameRequired": "Benutzername wird benötigt",
|
"UsernameRequired": "Benutzername wird benötigt",
|
||||||
"Password": "Passwort",
|
"Password": "Passwort",
|
||||||
@ -498,48 +515,48 @@
|
|||||||
"LoginButton": "Anmelden"
|
"LoginButton": "Anmelden"
|
||||||
},
|
},
|
||||||
"firmwareupgrade": {
|
"firmwareupgrade": {
|
||||||
"FirmwareUpgrade": "Firmware Update",
|
"FirmwareUpgrade": "Firmware-Aktualisierung",
|
||||||
"Loading": "@:base.Loading",
|
"Loading": "@:base.Loading",
|
||||||
"OtaError": "OTA Fehler",
|
"OtaError": "OTA-Fehler",
|
||||||
"Back": "Zurück",
|
"Back": "Zurück",
|
||||||
"Retry": "Wiederholen",
|
"Retry": "Wiederholen",
|
||||||
"OtaStatus": "OTA Status",
|
"OtaStatus": "OTA-Status",
|
||||||
"OtaSuccess": "OTA Erfolgreich. Das Gerät wurde automatisch neu gestartet und wird in wenigen Augenblicken wieder zur Verfügung stehen. Bitte nicht vergessen die Weboberfläche neu zu laden!",
|
"OtaSuccess": "OTA erfolgreich. Das Gerät wurde automatisch neu gestartet und wird in wenigen Augenblicken wieder zur Verfügung stehen. Bitte nicht vergessen, die Weboberfläche neu zu laden!",
|
||||||
"FirmwareUpload": "Firmware hochladen",
|
"FirmwareUpload": "Firmware hochladen",
|
||||||
"UploadProgress": "Hochlade Fortschritt"
|
"UploadProgress": "Hochlade-Fortschritt"
|
||||||
},
|
},
|
||||||
"about": {
|
"about": {
|
||||||
"AboutOpendtu": "Über OpenDTU",
|
"AboutOpendtu": "Über OpenDTU",
|
||||||
"ProjectOrigin": "Projekt Ursprung",
|
"ProjectOrigin": "Projekt Ursprung",
|
||||||
"ProjectOriginBody1": "Das Projekt wurde aus <a href=\"https://www.mikrocontroller.net/topic/525778\" target=\"_blank\">dieser Diskussion heraus gestartet. (Mikrocontroller.net)</a>",
|
"ProjectOriginBody1": "Das Projekt wurde aus <a href=\"https://www.mikrocontroller.net/topic/525778\" target=\"_blank\">dieser Diskussion (mikrocontroller.net)</a> heraus gestartet.",
|
||||||
"ProjectOriginBody2": "Das Hoymiles-Protokoll wurde durch die freiwilligen Bemühungen vieler Teilnehmer entschlüsselt. OpenDTU wurde unter anderem auf der Grundlage dieser Arbeit entwickelt. Das Projekt ist unter einer Open-Source-Lizenz lizenziert (<a href=\"https://www.gnu.de/documents/gpl-2.0.de.html\" target=\"_blank\">GNU General Public License version 2</a>).",
|
"ProjectOriginBody2": "Das Hoymiles-Protokoll wurde durch die freiwilligen Bemühungen vieler Teilnehmer entschlüsselt. OpenDTU wurde unter anderem auf der Grundlage dieser Arbeit entwickelt. Das Projekt ist unter einer Open-Source-Lizenz lizenziert (<a href=\"https://www.gnu.de/documents/gpl-2.0.de.html\" target=\"_blank\">GNU General Public License version 2</a>).",
|
||||||
"ProjectOriginBody3": "Die Software wurde nach bestem Wissen und Gewissen entwickelt. Dennoch kann keine Haftung für eine Fehlfunktion oder einen Garantieverlust des Wechselrichters übernommen werden.",
|
"ProjectOriginBody3": "Die Software wurde nach bestem Wissen und Gewissen entwickelt. Dennoch kann keine Haftung für eine Fehlfunktion oder einen Garantieverlust des Wechselrichters übernommen werden.",
|
||||||
"ProjectOriginBody4": "OpenDTU ist frei verfügbar. Wenn Sie Geld für die Software bezahlt haben, wurden Sie wahrscheinlich abgezockt.",
|
"ProjectOriginBody4": "OpenDTU ist frei verfügbar. Wenn Sie Geld für die Software bezahlt haben, wurden Sie wahrscheinlich abgezockt.",
|
||||||
"NewsUpdates": "Neuigkeiten und Updates",
|
"NewsUpdates": "Neuigkeiten und Updates",
|
||||||
"NewsUpdatesBody": "Neue Updates sind auf Github zu finden: <a href=\"https://github.com/tbnobody/OpenDTU\" target=\"_blank\">https://github.com/tbnobody/OpenDTU</a>",
|
"NewsUpdatesBody": "Neue Updates sind auf Github zu finden: <a href=\"https://github.com/tbnobody/OpenDTU\" target=\"_blank\">https://github.com/tbnobody/OpenDTU</a>",
|
||||||
"ErrorReporting": "Fehlerberichte",
|
"ErrorReporting": "Fehlerberichte",
|
||||||
"ErrorReportingBody": "Bitte melden Sie Probleme über die von <a href=\"https://github.com/tbnobody/OpenDTU/issues\" target=\"_blank\">Github</a> bereitgestellte Funktion.",
|
"ErrorReportingBody": "Bitte melden Sie Probleme über die Ticketverwaltung von <a href=\"https://github.com/tbnobody/OpenDTU/issues\" target=\"_blank\">Github</a>.",
|
||||||
"Discussion": "Diskussion",
|
"Discussion": "Diskussion",
|
||||||
"DiscussionBody": "Diskutieren Sie mit uns auf <a href=\"https://discord.gg/WzhxEY62mB\" target=\"_blank\">Discord</a> oder <a href=\"https://github.com/tbnobody/OpenDTU/discussions\" target=\"_blank\">Github</a>"
|
"DiscussionBody": "Diskutieren Sie mit uns auf <a href=\"https://discord.gg/WzhxEY62mB\" target=\"_blank\">Discord</a> oder <a href=\"https://github.com/tbnobody/OpenDTU/discussions\" target=\"_blank\">Github</a>"
|
||||||
},
|
},
|
||||||
"hints": {
|
"hints": {
|
||||||
"RadioProblem": "Es konnte keine Verbindung zu einem korrekten NRF24L01+ Funkmodul hergestellt werden. Bitte überprüfen Sie die Verdrahtung.",
|
"RadioProblem": "Es konnte keine Verbindung zu einem NRF24L01+ Funkmodul hergestellt werden. Bitte überprüfen Sie die Verdrahtung.",
|
||||||
"TimeSync": "Die Uhr wurde noch nicht synchronisiert. Ohne eine korrekt eingestellte Uhr werden keine Anfragen an den Wechselrichter gesendet. Dies ist kurz nach dem Start normal. Nach einer längeren Laufzeit (>1 Minute) bedeutet es jedoch, dass der NTP-Server nicht erreichbar ist.",
|
"TimeSync": "Die Uhr wurde noch nicht synchronisiert. Ohne eine korrekt eingestellte Uhr werden keine Anfragen an den Wechselrichter gesendet. Dies ist kurz nach dem Start normal. Nach einer längeren Laufzeit (>1 Minute) bedeutet es jedoch, dass der NTP-Server nicht erreichbar ist.",
|
||||||
"TimeSyncLink": "Bitte überprüfen Sie Ihre Zeiteinstellungen.",
|
"TimeSyncLink": "Bitte überprüfen Sie Ihre Zeiteinstellungen.",
|
||||||
"DefaultPassword": "Sie verwenden das Standardpasswort für die Weboberfläche und den Notfall Access Point. Dies ist potenziell unsicher.",
|
"DefaultPassword": "Sie verwenden das Standardpasswort für die Weboberfläche und den Notfall Access Point. Dies ist potenziell unsicher.",
|
||||||
"DefaultPasswordLink": "Bitte ändern Sie das Passwort."
|
"DefaultPasswordLink": "Bitte ändern Sie das Passwort."
|
||||||
},
|
},
|
||||||
"deviceadmin": {
|
"deviceadmin": {
|
||||||
"DeviceManager": "Geräte-Manager",
|
"DeviceManager": "Hardware-Einstellungen",
|
||||||
"PinAssignment": "Anschlusseinstellungen",
|
"PinAssignment": "Anschlusseinstellungen",
|
||||||
"SelectedProfile": "Ausgewähltes Profil:",
|
"SelectedProfile": "Ausgewähltes Profil:",
|
||||||
"DefaultProfile": "(Standard Einstellungen)",
|
"DefaultProfile": "(Standardeinstellungen)",
|
||||||
"ProfileHint": "Ihr Gerät reagiert möglicherweise nicht mehr, wenn Sie ein inkompatibles Profil wählen. In diesem Fall müssen Sie eine Löschung über das serielle Interface durchführen.",
|
"ProfileHint": "Ihr Gerät reagiert möglicherweise nicht mehr, wenn Sie ein inkompatibles Profil wählen. In diesem Fall müssen Sie eine Löschung über das serielle Interface durchführen.",
|
||||||
"Display": "Display",
|
"Display": "Display",
|
||||||
"PowerSafe": "Power Safe aktivieren:",
|
"PowerSafe": "Power Safe aktivieren:",
|
||||||
"PowerSafeHint": "Schaltet das Display aus wenn kein Wechselrichter produziert",
|
"PowerSafeHint": "Schaltet das Display aus, wenn kein Wechselrichter Strom erzeugt",
|
||||||
"Screensaver": "Screensaver aktivieren:",
|
"Screensaver": "Screensaver aktivieren:",
|
||||||
"ScreensaverHint": "Bewegt die Ausgabe bei jeder Aktualisierung um ein Einbrennen zu verhindern. (Nützlich v.a. für OLED Displays)",
|
"ScreensaverHint": "Bewegt die Ausgabe bei jeder Aktualisierung um ein Einbrennen zu verhindern (v. a. für OLED-Displays nützlich)",
|
||||||
"ShowLogo": "Logo anzeigen:",
|
"ShowLogo": "Logo anzeigen:",
|
||||||
"Contrast": "Kontrast ({contrast}):",
|
"Contrast": "Kontrast ({contrast}):",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
|
|||||||
@ -258,7 +258,12 @@
|
|||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"Synced": "synced",
|
"Synced": "synced",
|
||||||
"NotSynced": "not synced",
|
"NotSynced": "not synced",
|
||||||
"LocalTime": "Local Time"
|
"LocalTime": "Local Time",
|
||||||
|
"Sunrise": "Nautical Sunrise",
|
||||||
|
"Sunset": "Nautical Sunset",
|
||||||
|
"Mode": "Mode",
|
||||||
|
"Day": "Day",
|
||||||
|
"Night": "Night"
|
||||||
},
|
},
|
||||||
"mqttinfo": {
|
"mqttinfo": {
|
||||||
"MqttInformation": "MQTT Information",
|
"MqttInformation": "MQTT Information",
|
||||||
@ -368,6 +373,9 @@
|
|||||||
"TimeServerHint": "The default value is fine as long as OpenDTU has direct access to the internet.",
|
"TimeServerHint": "The default value is fine as long as OpenDTU has direct access to the internet.",
|
||||||
"Timezone": "Timezone:",
|
"Timezone": "Timezone:",
|
||||||
"TimezoneConfig": "Timezone Config:",
|
"TimezoneConfig": "Timezone Config:",
|
||||||
|
"LocationConfiguration": "Location Configuration",
|
||||||
|
"Longitude": "Longitude",
|
||||||
|
"Latitude": "Latitude",
|
||||||
"Save": "@:dtuadmin.Save",
|
"Save": "@:dtuadmin.Save",
|
||||||
"ManualTimeSynchronization": "Manual Time Synchronization",
|
"ManualTimeSynchronization": "Manual Time Synchronization",
|
||||||
"CurrentOpenDtuTime": "Current OpenDTU Time:",
|
"CurrentOpenDtuTime": "Current OpenDTU Time:",
|
||||||
@ -474,6 +482,10 @@
|
|||||||
"Add": "Add",
|
"Add": "Add",
|
||||||
"AddHint": "<b>Hint:</b> You can set additional parameters after you have created the inverter. Use the pen icon in the inverter list.",
|
"AddHint": "<b>Hint:</b> You can set additional parameters after you have created the inverter. Use the pen icon in the inverter list.",
|
||||||
"InverterList": "Inverter List",
|
"InverterList": "Inverter List",
|
||||||
|
"Status": "Status",
|
||||||
|
"Send": "Send",
|
||||||
|
"Receive": "Receive",
|
||||||
|
"StatusHint": "<b>Hint:</b> The inverter is power by it's DC input. If there is no sun, the inverter is off. Requests can still be sent.",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
"Action": "Action",
|
"Action": "Action",
|
||||||
"DeleteInverter": "Delete inverter",
|
"DeleteInverter": "Delete inverter",
|
||||||
@ -481,12 +493,17 @@
|
|||||||
"InverterSerial": "Inverter Serial:",
|
"InverterSerial": "Inverter Serial:",
|
||||||
"InverterName": "Inverter Name:",
|
"InverterName": "Inverter Name:",
|
||||||
"InverterNameHint": "Here you can specify a custom name for your inverter.",
|
"InverterNameHint": "Here you can specify a custom name for your inverter.",
|
||||||
|
"InverterStatus": "Receive / Send",
|
||||||
|
"PollEnable": "Poll inverter data",
|
||||||
|
"PollEnableNight": "Poll inverter data at night",
|
||||||
|
"CommandEnable": "Send commands",
|
||||||
|
"CommandEnableNight": "Send commands at night",
|
||||||
"StringName": "Name string {num}:",
|
"StringName": "Name string {num}:",
|
||||||
"StringNameHint": "Here you can specify a custom name for the respective port of your inverter.",
|
"StringNameHint": "Here you can specify a custom name for the respective port of your inverter.",
|
||||||
"StringMaxPower": "Max power string {num}:",
|
"StringMaxPower": "Max power string {num}:",
|
||||||
"StringMaxPowerHint": "Enter the max power of the connected solar panels.",
|
"StringMaxPowerHint": "Enter the max power of the connected solar panels.",
|
||||||
"StringYtOffset": "Yield total offset string {num}:",
|
"StringYtOffset": "Yield total offset string {num}:",
|
||||||
"StringYtOffsetHint": "This offset is applied the read yield total value from the inverter. This can be used to set the yield total of the inverter to zero if a used inverter is used.",
|
"StringYtOffsetHint": "This offset is applied the read yield total value from the inverter. This can be used to set the yield total of the inverter to zero if a used inverter is used. But you can still try polling data.",
|
||||||
"InverterHint": "*) Enter the W<sub>p</sub> of the channel to calculate irradiation.",
|
"InverterHint": "*) Enter the W<sub>p</sub> of the channel to calculate irradiation.",
|
||||||
"Cancel": "@:maintenancereboot.Cancel",
|
"Cancel": "@:maintenancereboot.Cancel",
|
||||||
"Save": "@:dtuadmin.Save",
|
"Save": "@:dtuadmin.Save",
|
||||||
|
|||||||
@ -257,7 +257,12 @@
|
|||||||
"Status": "Statut",
|
"Status": "Statut",
|
||||||
"Synced": "synchronisée",
|
"Synced": "synchronisée",
|
||||||
"NotSynced": "pas synchronisée",
|
"NotSynced": "pas synchronisée",
|
||||||
"LocalTime": "Heure locale"
|
"LocalTime": "Heure locale",
|
||||||
|
"Sunrise": "Nautical Sunrise",
|
||||||
|
"Sunset": "Nautical Sunset",
|
||||||
|
"Mode": "Mode",
|
||||||
|
"Day": "Day",
|
||||||
|
"Night": "Night"
|
||||||
},
|
},
|
||||||
"mqttinfo": {
|
"mqttinfo": {
|
||||||
"MqttInformation": "MQTT Information",
|
"MqttInformation": "MQTT Information",
|
||||||
@ -367,6 +372,9 @@
|
|||||||
"TimeServerHint": "La valeur par défaut convient tant que OpenDTU a un accès direct à Internet.",
|
"TimeServerHint": "La valeur par défaut convient tant que OpenDTU a un accès direct à Internet.",
|
||||||
"Timezone": "Fuseau horaire",
|
"Timezone": "Fuseau horaire",
|
||||||
"TimezoneConfig": "Configuration du fuseau horaire",
|
"TimezoneConfig": "Configuration du fuseau horaire",
|
||||||
|
"LocationConfiguration": "Location Configuration",
|
||||||
|
"Longitude": "Longitude",
|
||||||
|
"Latitude": "Latitude",
|
||||||
"Save": "@:dtuadmin.Save",
|
"Save": "@:dtuadmin.Save",
|
||||||
"ManualTimeSynchronization": "Synchronisation manuelle de l'heure",
|
"ManualTimeSynchronization": "Synchronisation manuelle de l'heure",
|
||||||
"CurrentOpenDtuTime": "Heure actuelle de l'OpenDTU",
|
"CurrentOpenDtuTime": "Heure actuelle de l'OpenDTU",
|
||||||
@ -442,6 +450,10 @@
|
|||||||
"Add": "Ajouter",
|
"Add": "Ajouter",
|
||||||
"AddHint": " <b>Astuce :</b> Vous pouvez définir des paramètres supplémentaires après avoir créé l'onduleur. Utilisez l'icône du stylo dans la liste des onduleurs.",
|
"AddHint": " <b>Astuce :</b> Vous pouvez définir des paramètres supplémentaires après avoir créé l'onduleur. Utilisez l'icône du stylo dans la liste des onduleurs.",
|
||||||
"InverterList": "Liste des onduleurs",
|
"InverterList": "Liste des onduleurs",
|
||||||
|
"Status": "Status",
|
||||||
|
"Send": "Send",
|
||||||
|
"Receive": "Receive",
|
||||||
|
"StatusHint": "<b>Astuce :</b> The inverter is power by it's DC input. If there is no sun, the inverter is off. Requests can still be sent.",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
"Action": "Action",
|
"Action": "Action",
|
||||||
"DeleteInverter": "Supprimer l'onduleur",
|
"DeleteInverter": "Supprimer l'onduleur",
|
||||||
@ -449,6 +461,11 @@
|
|||||||
"InverterSerial": "Numéro de série de l'onduleur",
|
"InverterSerial": "Numéro de série de l'onduleur",
|
||||||
"InverterName": "Nom de l'onduleur :",
|
"InverterName": "Nom de l'onduleur :",
|
||||||
"InverterNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour votre onduleur.",
|
"InverterNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour votre onduleur.",
|
||||||
|
"InverterStatus": "Receive / Send",
|
||||||
|
"PollEnable": "Poll inverter data",
|
||||||
|
"PollEnableNight": "Poll inverter data at night",
|
||||||
|
"CommandEnable": "Send commands",
|
||||||
|
"CommandEnableNight": "Send commands at night",
|
||||||
"StringName": "Nom de la ligne {num}:",
|
"StringName": "Nom de la ligne {num}:",
|
||||||
"StringNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour le port respectif de votre onduleur.",
|
"StringNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour le port respectif de votre onduleur.",
|
||||||
"StringMaxPower": "Puissance maximale de la ligne {num}:",
|
"StringMaxPower": "Puissance maximale de la ligne {num}:",
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
import type { I18nOptions } from "vue-i18n";
|
import type { I18nOptions } from "vue-i18n";
|
||||||
import en from './en.json'
|
|
||||||
import de from './de.json'
|
|
||||||
import fr from './fr.json'
|
|
||||||
|
|
||||||
export enum Locales {
|
export enum Locales {
|
||||||
EN = 'en',
|
EN = 'en',
|
||||||
@ -15,12 +12,6 @@ export const LOCALES = [
|
|||||||
{ value: Locales.FR, caption: 'Français' },
|
{ value: Locales.FR, caption: 'Français' },
|
||||||
]
|
]
|
||||||
|
|
||||||
export const messages: I18nOptions["messages"] = {
|
|
||||||
[Locales.EN]: en,
|
|
||||||
[Locales.DE]: de,
|
|
||||||
[Locales.FR]: fr,
|
|
||||||
};
|
|
||||||
|
|
||||||
export const dateTimeFormats: I18nOptions["datetimeFormats"] = {
|
export const dateTimeFormats: I18nOptions["datetimeFormats"] = {
|
||||||
[Locales.EN]: {
|
[Locales.EN]: {
|
||||||
'datetime': {
|
'datetime': {
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
|
import messages from '@intlify/unplugin-vue-i18n/messages'
|
||||||
import mitt from 'mitt'
|
import mitt from 'mitt'
|
||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
import { createI18n } from 'vue-i18n'
|
import { createI18n } from 'vue-i18n'
|
||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import { defaultLocale, messages, dateTimeFormats, numberFormats } from './locales'
|
import { dateTimeFormats, defaultLocale, numberFormats } from './locales'
|
||||||
import { tooltip } from './plugins/bootstrap'
|
import { tooltip } from './plugins/bootstrap'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
|
|
||||||
|
|||||||
@ -2,4 +2,6 @@ export interface NtpConfig {
|
|||||||
ntp_server: string;
|
ntp_server: string;
|
||||||
ntp_timezone: string;
|
ntp_timezone: string;
|
||||||
ntp_timezone_descr: string;
|
ntp_timezone_descr: string;
|
||||||
|
latitude: number;
|
||||||
|
longitude: number;
|
||||||
}
|
}
|
||||||
@ -4,4 +4,7 @@ export interface NtpStatus {
|
|||||||
ntp_timezone_descr: string
|
ntp_timezone_descr: string
|
||||||
ntp_status: boolean;
|
ntp_status: boolean;
|
||||||
ntp_localtime: string;
|
ntp_localtime: string;
|
||||||
|
sun_risetime: string;
|
||||||
|
sun_settime: string;
|
||||||
|
sun_isDayPeriod: boolean;
|
||||||
}
|
}
|
||||||
@ -28,7 +28,8 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">{{ $t('inverteradmin.Serial') }}</th>
|
<th scope="col">{{ $t('inverteradmin.Status') }}</th>
|
||||||
|
<th>{{ $t('inverteradmin.Serial') }}</th>
|
||||||
<th>{{ $t('inverteradmin.Name') }}</th>
|
<th>{{ $t('inverteradmin.Name') }}</th>
|
||||||
<th>{{ $t('inverteradmin.Type') }}</th>
|
<th>{{ $t('inverteradmin.Type') }}</th>
|
||||||
<th>{{ $t('inverteradmin.Action') }}</th>
|
<th>{{ $t('inverteradmin.Action') }}</th>
|
||||||
@ -36,6 +37,17 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="inverter in sortedInverters" v-bind:key="inverter.id">
|
<tr v-for="inverter in sortedInverters" v-bind:key="inverter.id">
|
||||||
|
<td>
|
||||||
|
<span class="badge" :title="$t('inverteradmin.Receive')" :class="{
|
||||||
|
'text-bg-warning': !inverter.poll_enable_night,
|
||||||
|
'text-bg-dark': inverter.poll_enable_night,}"
|
||||||
|
><BIconArrowDown v-if="inverter.poll_enable" /></span>
|
||||||
|
|
||||||
|
<span class="badge" :title="$t('inverteradmin.Send')" :class="{
|
||||||
|
'text-bg-warning': !inverter.command_enable_night,
|
||||||
|
'text-bg-dark': inverter.command_enable_night,}"
|
||||||
|
><BIconArrowUp v-if="inverter.command_enable" /></span>
|
||||||
|
</td>
|
||||||
<td>{{ inverter.serial }}</td>
|
<td>{{ inverter.serial }}</td>
|
||||||
<td>{{ inverter.name }}</td>
|
<td>{{ inverter.name }}</td>
|
||||||
<td>{{ inverter.type }}</td>
|
<td>{{ inverter.type }}</td>
|
||||||
@ -74,6 +86,22 @@
|
|||||||
</label>
|
</label>
|
||||||
<input v-model="selectedInverterData.name" type="text" id="inverter-name"
|
<input v-model="selectedInverterData.name" type="text" id="inverter-name"
|
||||||
class="form-control" maxlength="31" />
|
class="form-control" maxlength="31" />
|
||||||
|
|
||||||
|
<CardElement :text="$t('inverteradmin.InverterStatus')" addSpace>
|
||||||
|
<InputElement :label="$t('inverteradmin.PollEnable')"
|
||||||
|
v-model="selectedInverterData.poll_enable"
|
||||||
|
type="checkbox" wide />
|
||||||
|
<InputElement :label="$t('inverteradmin.PollEnableNight')"
|
||||||
|
v-model="selectedInverterData.poll_enable_night"
|
||||||
|
type="checkbox" wide/>
|
||||||
|
<InputElement :label="$t('inverteradmin.CommandEnable')"
|
||||||
|
v-model="selectedInverterData.command_enable"
|
||||||
|
type="checkbox" wide/>
|
||||||
|
<InputElement :label="$t('inverteradmin.CommandEnableNight')"
|
||||||
|
v-model="selectedInverterData.command_enable_night"
|
||||||
|
type="checkbox" wide/>
|
||||||
|
<div class="alert alert-secondary mt-3" role="alert" v-html="$t('inverteradmin.StatusHint')"></div>
|
||||||
|
</CardElement>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-for="(max, index) in selectedInverterData.channel" :key="`${index}`">
|
<div v-for="(max, index) in selectedInverterData.channel" :key="`${index}`">
|
||||||
@ -168,12 +196,15 @@
|
|||||||
import BasePage from '@/components/BasePage.vue';
|
import BasePage from '@/components/BasePage.vue';
|
||||||
import BootstrapAlert from "@/components/BootstrapAlert.vue";
|
import BootstrapAlert from "@/components/BootstrapAlert.vue";
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import InputElement from '@/components/InputElement.vue';
|
||||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||||
import * as bootstrap from 'bootstrap';
|
import * as bootstrap from 'bootstrap';
|
||||||
import {
|
import {
|
||||||
BIconInfoCircle,
|
BIconInfoCircle,
|
||||||
BIconPencil,
|
BIconPencil,
|
||||||
BIconTrash
|
BIconTrash,
|
||||||
|
BIconArrowDown,
|
||||||
|
BIconArrowUp,
|
||||||
} from 'bootstrap-icons-vue';
|
} from 'bootstrap-icons-vue';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
|
|
||||||
@ -188,6 +219,10 @@ declare interface Inverter {
|
|||||||
serial: number;
|
serial: number;
|
||||||
name: string;
|
name: string;
|
||||||
type: string;
|
type: string;
|
||||||
|
poll_enable: boolean;
|
||||||
|
poll_enable_night: boolean;
|
||||||
|
command_enable: boolean;
|
||||||
|
command_enable_night: boolean;
|
||||||
channel: Array<Channel>;
|
channel: Array<Channel>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,9 +238,12 @@ export default defineComponent({
|
|||||||
BasePage,
|
BasePage,
|
||||||
BootstrapAlert,
|
BootstrapAlert,
|
||||||
CardElement,
|
CardElement,
|
||||||
|
InputElement,
|
||||||
BIconInfoCircle,
|
BIconInfoCircle,
|
||||||
BIconPencil,
|
BIconPencil,
|
||||||
BIconTrash,
|
BIconTrash,
|
||||||
|
BIconArrowDown,
|
||||||
|
BIconArrowUp,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -6,12 +6,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Status') }}</th>
|
<th>{{ $t('mqttinfo.Status') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_enabled,
|
<StatusBadge :status="mqttDataList.mqtt_enabled" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_enabled,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_enabled">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -36,22 +32,14 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Retain') }}</th>
|
<th>{{ $t('mqttinfo.Retain') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_retain,
|
<StatusBadge :status="mqttDataList.mqtt_retain" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_retain,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_retain">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Tls') }}</th>
|
<th>{{ $t('mqttinfo.Tls') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_tls,
|
<StatusBadge :status="mqttDataList.mqtt_tls" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_tls,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_tls">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-show="mqttDataList.mqtt_tls">
|
<tr v-show="mqttDataList.mqtt_tls">
|
||||||
@ -69,12 +57,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Status') }}</th>
|
<th>{{ $t('mqttinfo.Status') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_hass_enabled,
|
<StatusBadge :status="mqttDataList.mqtt_hass_enabled" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_hass_enabled,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_hass_enabled">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@ -83,33 +67,20 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Retain') }}</th>
|
<th>{{ $t('mqttinfo.Retain') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_hass_retain,
|
<StatusBadge :status="mqttDataList.mqtt_hass_retain" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_hass_retain,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_hass_retain">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.Expire') }}</th>
|
<th>{{ $t('mqttinfo.Expire') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_hass_expire,
|
<StatusBadge :status="mqttDataList.mqtt_hass_expire" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_hass_expire,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_hass_expire">{{ $t('mqttinfo.Enabled') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.IndividualPanels') }}</th>
|
<th>{{ $t('mqttinfo.IndividualPanels') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_hass_individualpanels,
|
<StatusBadge :status="mqttDataList.mqtt_hass_individualpanels" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||||
'text-bg-success': mqttDataList.mqtt_hass_individualpanels,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_hass_individualpanels">{{ $t('mqttinfo.Enabled')
|
|
||||||
}}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -123,12 +94,8 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('mqttinfo.ConnectionStatus') }}</th>
|
<th>{{ $t('mqttinfo.ConnectionStatus') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !mqttDataList.mqtt_connected,
|
<StatusBadge :status="mqttDataList.mqtt_connected" true_text="mqttinfo.Connected" false_text="mqttinfo.Disconnected" />
|
||||||
'text-bg-success': mqttDataList.mqtt_connected,
|
|
||||||
}">
|
|
||||||
<span v-if="mqttDataList.mqtt_connected">{{ $t('mqttinfo.Connected') }}</span>
|
|
||||||
<span v-else>{{ $t('mqttinfo.Disconnected') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -141,6 +108,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import BasePage from '@/components/BasePage.vue';
|
import BasePage from '@/components/BasePage.vue';
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import StatusBadge from '@/components/StatusBadge.vue';
|
||||||
import type { MqttStatus } from '@/types/MqttStatus';
|
import type { MqttStatus } from '@/types/MqttStatus';
|
||||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
@ -149,6 +117,7 @@ export default defineComponent({
|
|||||||
components: {
|
components: {
|
||||||
BasePage,
|
BasePage,
|
||||||
CardElement,
|
CardElement,
|
||||||
|
StatusBadge
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -27,6 +27,16 @@
|
|||||||
v-model="ntpConfigList.ntp_timezone"
|
v-model="ntpConfigList.ntp_timezone"
|
||||||
type="text" maxlength="32" disabled/>
|
type="text" maxlength="32" disabled/>
|
||||||
</CardElement>
|
</CardElement>
|
||||||
|
|
||||||
|
<CardElement :text="$t('ntpadmin.LocationConfiguration')" textVariant="text-bg-primary" add-space>
|
||||||
|
<InputElement :label="$t('ntpadmin.Longitude')"
|
||||||
|
v-model="ntpConfigList.longitude"
|
||||||
|
type="number" min="-180" max="180" step="any"/>
|
||||||
|
|
||||||
|
<InputElement :label="$t('ntpadmin.Latitude')"
|
||||||
|
v-model="ntpConfigList.latitude"
|
||||||
|
type="number" min="-90" max="90" step="any"/>
|
||||||
|
</CardElement>
|
||||||
<button type="submit" class="btn btn-primary mb-3">{{ $t('ntpadmin.Save') }}</button>
|
<button type="submit" class="btn btn-primary mb-3">{{ $t('ntpadmin.Save') }}</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@ -27,18 +27,31 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('ntpinfo.Status') }}</th>
|
<th>{{ $t('ntpinfo.Status') }}</th>
|
||||||
<td class="badge" :class="{
|
<td>
|
||||||
'text-bg-danger': !ntpDataList.ntp_status,
|
<StatusBadge :status="ntpDataList.ntp_status" true_text="ntpinfo.Synced" false_text="ntpinfo.NotSynced" />
|
||||||
'text-bg-success': ntpDataList.ntp_status,
|
|
||||||
}">
|
|
||||||
<span v-if="ntpDataList.ntp_status">{{ $t('ntpinfo.Synced') }}</span>
|
|
||||||
<span v-else>{{ $t('ntpinfo.NotSynced') }}</span>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ $t('ntpinfo.LocalTime') }}</th>
|
<th>{{ $t('ntpinfo.LocalTime') }}</th>
|
||||||
<td>{{ ntpDataList.ntp_localtime }}</td>
|
<td>{{ ntpDataList.ntp_localtime }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>{{ $t('ntpinfo.Sunrise') }}</th>
|
||||||
|
<td>{{ ntpDataList.sun_risetime }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{{ $t('ntpinfo.Sunset') }}</th>
|
||||||
|
<td>{{ ntpDataList.sun_settime }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{{ $t('ntpinfo.Mode') }}</th>
|
||||||
|
<td>
|
||||||
|
<StatusBadge :status="ntpDataList.sun_isDayPeriod"
|
||||||
|
true_text="ntpinfo.Day" true_class="text-bg-warning"
|
||||||
|
false_text="ntpinfo.Night" false_class="text-bg-dark" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@ -49,6 +62,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import BasePage from '@/components/BasePage.vue';
|
import BasePage from '@/components/BasePage.vue';
|
||||||
import CardElement from '@/components/CardElement.vue';
|
import CardElement from '@/components/CardElement.vue';
|
||||||
|
import StatusBadge from '@/components/StatusBadge.vue';
|
||||||
import type { NtpStatus } from "@/types/NtpStatus";
|
import type { NtpStatus } from "@/types/NtpStatus";
|
||||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
@ -57,6 +71,7 @@ export default defineComponent({
|
|||||||
components: {
|
components: {
|
||||||
BasePage,
|
BasePage,
|
||||||
CardElement,
|
CardElement,
|
||||||
|
StatusBadge,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import vue from '@vitejs/plugin-vue'
|
|||||||
|
|
||||||
import viteCompression from 'vite-plugin-compression';
|
import viteCompression from 'vite-plugin-compression';
|
||||||
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
|
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
|
||||||
|
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
|
||||||
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
@ -13,7 +14,14 @@ export default defineConfig({
|
|||||||
plugins: [
|
plugins: [
|
||||||
vue(),
|
vue(),
|
||||||
viteCompression({ deleteOriginFile: true, threshold: 0 }),
|
viteCompression({ deleteOriginFile: true, threshold: 0 }),
|
||||||
cssInjectedByJsPlugin()],
|
cssInjectedByJsPlugin(),
|
||||||
|
VueI18nPlugin({
|
||||||
|
/* options */
|
||||||
|
include: path.resolve(path.dirname(fileURLToPath(import.meta.url)), './src/locales/**'),
|
||||||
|
fullInstall: false,
|
||||||
|
forceStringify: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||||
@ -25,6 +33,7 @@ export default defineConfig({
|
|||||||
cssCodeSplit: false,
|
cssCodeSplit: false,
|
||||||
outDir: '../webapp_dist',
|
outDir: '../webapp_dist',
|
||||||
emptyOutDir: true,
|
emptyOutDir: true,
|
||||||
|
minify: 'terser',
|
||||||
rollupOptions: {
|
rollupOptions: {
|
||||||
output: {
|
output: {
|
||||||
// Only create one js file
|
// Only create one js file
|
||||||
|
|||||||
433
webapp/yarn.lock
433
webapp/yarn.lock
@ -151,6 +151,17 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
|
||||||
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
|
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
|
||||||
|
|
||||||
|
"@intlify/bundle-utils@^4.0.0":
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@intlify/bundle-utils/-/bundle-utils-4.0.0.tgz#29c1d602c7e4e33b516581496a7c6740ed7e2585"
|
||||||
|
integrity sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==
|
||||||
|
dependencies:
|
||||||
|
"@intlify/message-compiler" next
|
||||||
|
"@intlify/shared" next
|
||||||
|
jsonc-eslint-parser "^1.0.1"
|
||||||
|
source-map "0.6.1"
|
||||||
|
yaml-eslint-parser "^0.3.2"
|
||||||
|
|
||||||
"@intlify/core-base@9.2.2":
|
"@intlify/core-base@9.2.2":
|
||||||
version "9.2.2"
|
version "9.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
|
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
|
||||||
@ -176,11 +187,42 @@
|
|||||||
"@intlify/shared" "9.2.2"
|
"@intlify/shared" "9.2.2"
|
||||||
source-map "0.6.1"
|
source-map "0.6.1"
|
||||||
|
|
||||||
|
"@intlify/message-compiler@next":
|
||||||
|
version "9.3.0-beta.16"
|
||||||
|
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.3.0-beta.16.tgz#335f7bdb06cfb84d04a1a1c1d6eff2532dfd88e7"
|
||||||
|
integrity sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==
|
||||||
|
dependencies:
|
||||||
|
"@intlify/shared" "9.3.0-beta.16"
|
||||||
|
source-map "0.6.1"
|
||||||
|
|
||||||
"@intlify/shared@9.2.2":
|
"@intlify/shared@9.2.2":
|
||||||
version "9.2.2"
|
version "9.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
|
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
|
||||||
integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
|
integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
|
||||||
|
|
||||||
|
"@intlify/shared@9.3.0-beta.16", "@intlify/shared@next":
|
||||||
|
version "9.3.0-beta.16"
|
||||||
|
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.3.0-beta.16.tgz#74f254dbb7eac633b86d690a341349db29573896"
|
||||||
|
integrity sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==
|
||||||
|
|
||||||
|
"@intlify/unplugin-vue-i18n@^0.8.2":
|
||||||
|
version "0.8.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.8.2.tgz#4196cb5bee4243bb3a33af76ce9663f3e106809a"
|
||||||
|
integrity sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==
|
||||||
|
dependencies:
|
||||||
|
"@intlify/bundle-utils" "^4.0.0"
|
||||||
|
"@intlify/shared" next
|
||||||
|
"@rollup/pluginutils" "^4.2.0"
|
||||||
|
"@vue/compiler-sfc" "^3.2.45"
|
||||||
|
debug "^4.3.1"
|
||||||
|
fast-glob "^3.2.5"
|
||||||
|
js-yaml "^4.1.0"
|
||||||
|
json5 "^2.2.0"
|
||||||
|
pathe "^1.0.0"
|
||||||
|
picocolors "^1.0.0"
|
||||||
|
source-map "0.6.1"
|
||||||
|
unplugin "^1.0.0"
|
||||||
|
|
||||||
"@intlify/vue-devtools@9.2.2":
|
"@intlify/vue-devtools@9.2.2":
|
||||||
version "9.2.2"
|
version "9.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
|
resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
|
||||||
@ -189,6 +231,46 @@
|
|||||||
"@intlify/core-base" "9.2.2"
|
"@intlify/core-base" "9.2.2"
|
||||||
"@intlify/shared" "9.2.2"
|
"@intlify/shared" "9.2.2"
|
||||||
|
|
||||||
|
"@jridgewell/gen-mapping@^0.3.0":
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
|
||||||
|
integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/set-array" "^1.0.1"
|
||||||
|
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||||
|
"@jridgewell/trace-mapping" "^0.3.9"
|
||||||
|
|
||||||
|
"@jridgewell/resolve-uri@3.1.0":
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
|
||||||
|
integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
|
||||||
|
|
||||||
|
"@jridgewell/set-array@^1.0.1":
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
|
||||||
|
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
|
||||||
|
|
||||||
|
"@jridgewell/source-map@^0.3.2":
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
|
||||||
|
integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/gen-mapping" "^0.3.0"
|
||||||
|
"@jridgewell/trace-mapping" "^0.3.9"
|
||||||
|
|
||||||
|
"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
|
||||||
|
version "1.4.14"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
|
||||||
|
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
|
||||||
|
|
||||||
|
"@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"
|
||||||
|
integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/resolve-uri" "3.1.0"
|
||||||
|
"@jridgewell/sourcemap-codec" "1.4.14"
|
||||||
|
|
||||||
"@nodelib/fs.scandir@2.1.5":
|
"@nodelib/fs.scandir@2.1.5":
|
||||||
version "2.1.5"
|
version "2.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
|
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
|
||||||
@ -220,6 +302,14 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
|
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
|
||||||
integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
|
integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
|
||||||
|
|
||||||
|
"@rollup/pluginutils@^4.2.0":
|
||||||
|
version "4.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
|
||||||
|
integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
|
||||||
|
dependencies:
|
||||||
|
estree-walker "^2.0.1"
|
||||||
|
picomatch "^2.2.2"
|
||||||
|
|
||||||
"@rushstack/eslint-patch@^1.2.0":
|
"@rushstack/eslint-patch@^1.2.0":
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
|
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
|
||||||
@ -237,10 +327,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||||
|
|
||||||
"@types/node@^18.13.0":
|
"@types/node@^18.14.0":
|
||||||
version "18.13.0"
|
version "18.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.0.tgz#94c47b9217bbac49d4a67a967fdcdeed89ebb7d0"
|
||||||
integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==
|
integrity sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==
|
||||||
|
|
||||||
"@types/spark-md5@^3.0.2":
|
"@types/spark-md5@^3.0.2":
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
@ -366,59 +456,49 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e"
|
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e"
|
||||||
integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==
|
integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==
|
||||||
|
|
||||||
"@volar/language-core@1.0.24":
|
"@volar/language-core@1.2.0-alpha.16":
|
||||||
version "1.0.24"
|
version "1.2.0-alpha.16"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.0.24.tgz#5d767571e77728464635e61af1debca944811fe0"
|
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.2.0-alpha.16.tgz#8b2aea2ed5bda937856bfed8c18228483f988616"
|
||||||
integrity sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==
|
integrity sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/source-map" "1.0.24"
|
"@volar/source-map" "1.2.0-alpha.16"
|
||||||
muggle-string "^0.1.0"
|
|
||||||
|
|
||||||
"@volar/source-map@1.0.24":
|
"@volar/source-map@1.2.0-alpha.16":
|
||||||
version "1.0.24"
|
version "1.2.0-alpha.16"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.0.24.tgz#ad4c827fea5c26b4bf38a86d983e7deb65b1c61e"
|
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.2.0-alpha.16.tgz#c352e3a0a4262c157f21ba38be7ab936b99a8716"
|
||||||
integrity sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==
|
integrity sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==
|
||||||
dependencies:
|
dependencies:
|
||||||
muggle-string "^0.1.0"
|
muggle-string "^0.2.2"
|
||||||
|
|
||||||
"@volar/typescript@1.0.24":
|
"@volar/typescript@1.2.0-alpha.16":
|
||||||
version "1.0.24"
|
version "1.2.0-alpha.16"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.0.24.tgz#f934eda9774b31abdff53efc56782cd2623723d5"
|
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.2.0-alpha.16.tgz#30ff89a784d9151a07aecaeab1f49658c1d21da2"
|
||||||
integrity sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==
|
integrity sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "1.0.24"
|
"@volar/language-core" "1.2.0-alpha.16"
|
||||||
|
|
||||||
"@volar/vue-language-core@1.0.24":
|
"@volar/vue-language-core@1.1.4":
|
||||||
version "1.0.24"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.0.24.tgz#81d180a8e09a53cb575e83acb79a31493891a1a4"
|
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.1.4.tgz#5d86e57e6770fbee2c0a5e6f6a0068d94097cfa8"
|
||||||
integrity sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==
|
integrity sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "1.0.24"
|
"@volar/language-core" "1.2.0-alpha.16"
|
||||||
"@volar/source-map" "1.0.24"
|
"@volar/source-map" "1.2.0-alpha.16"
|
||||||
"@vue/compiler-dom" "^3.2.45"
|
"@vue/compiler-dom" "^3.2.47"
|
||||||
"@vue/compiler-sfc" "^3.2.45"
|
"@vue/compiler-sfc" "^3.2.47"
|
||||||
"@vue/reactivity" "^3.2.45"
|
"@vue/reactivity" "^3.2.47"
|
||||||
"@vue/shared" "^3.2.45"
|
"@vue/shared" "^3.2.47"
|
||||||
minimatch "^5.1.1"
|
minimatch "^6.1.6"
|
||||||
|
muggle-string "^0.2.2"
|
||||||
vue-template-compiler "^2.7.14"
|
vue-template-compiler "^2.7.14"
|
||||||
|
|
||||||
"@volar/vue-typescript@1.0.24":
|
"@volar/vue-typescript@1.1.4":
|
||||||
version "1.0.24"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.0.24.tgz#bef9b2bfb1b108c0f6cb12ec6fbf449b43fc8257"
|
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.1.4.tgz#77533bdc5eaa9fadb89a228bbbce7a30780ee4ed"
|
||||||
integrity sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==
|
integrity sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/typescript" "1.0.24"
|
"@volar/typescript" "1.2.0-alpha.16"
|
||||||
"@volar/vue-language-core" "1.0.24"
|
"@volar/vue-language-core" "1.1.4"
|
||||||
|
|
||||||
"@vue/compiler-core@3.2.45":
|
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b"
|
|
||||||
integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==
|
|
||||||
dependencies:
|
|
||||||
"@babel/parser" "^7.16.4"
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
estree-walker "^2.0.2"
|
|
||||||
source-map "^0.6.1"
|
|
||||||
|
|
||||||
"@vue/compiler-core@3.2.47":
|
"@vue/compiler-core@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
@ -430,15 +510,7 @@
|
|||||||
estree-walker "^2.0.2"
|
estree-walker "^2.0.2"
|
||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
|
|
||||||
"@vue/compiler-dom@3.2.45", "@vue/compiler-dom@^3.2.45":
|
"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.2.47":
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce"
|
|
||||||
integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==
|
|
||||||
dependencies:
|
|
||||||
"@vue/compiler-core" "3.2.45"
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
|
|
||||||
"@vue/compiler-dom@3.2.47":
|
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
||||||
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
||||||
@ -446,7 +518,7 @@
|
|||||||
"@vue/compiler-core" "3.2.47"
|
"@vue/compiler-core" "3.2.47"
|
||||||
"@vue/shared" "3.2.47"
|
"@vue/shared" "3.2.47"
|
||||||
|
|
||||||
"@vue/compiler-sfc@3.2.47":
|
"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.2.45", "@vue/compiler-sfc@^3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
||||||
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
||||||
@ -462,30 +534,6 @@
|
|||||||
postcss "^8.1.10"
|
postcss "^8.1.10"
|
||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
|
|
||||||
"@vue/compiler-sfc@^3.2.45":
|
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70"
|
|
||||||
integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==
|
|
||||||
dependencies:
|
|
||||||
"@babel/parser" "^7.16.4"
|
|
||||||
"@vue/compiler-core" "3.2.45"
|
|
||||||
"@vue/compiler-dom" "3.2.45"
|
|
||||||
"@vue/compiler-ssr" "3.2.45"
|
|
||||||
"@vue/reactivity-transform" "3.2.45"
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
estree-walker "^2.0.2"
|
|
||||||
magic-string "^0.25.7"
|
|
||||||
postcss "^8.1.10"
|
|
||||||
source-map "^0.6.1"
|
|
||||||
|
|
||||||
"@vue/compiler-ssr@3.2.45":
|
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2"
|
|
||||||
integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==
|
|
||||||
dependencies:
|
|
||||||
"@vue/compiler-dom" "3.2.45"
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
|
|
||||||
"@vue/compiler-ssr@3.2.47":
|
"@vue/compiler-ssr@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
|
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
|
||||||
@ -508,17 +556,6 @@
|
|||||||
"@typescript-eslint/parser" "^5.0.0"
|
"@typescript-eslint/parser" "^5.0.0"
|
||||||
vue-eslint-parser "^9.0.0"
|
vue-eslint-parser "^9.0.0"
|
||||||
|
|
||||||
"@vue/reactivity-transform@3.2.45":
|
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d"
|
|
||||||
integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==
|
|
||||||
dependencies:
|
|
||||||
"@babel/parser" "^7.16.4"
|
|
||||||
"@vue/compiler-core" "3.2.45"
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
estree-walker "^2.0.2"
|
|
||||||
magic-string "^0.25.7"
|
|
||||||
|
|
||||||
"@vue/reactivity-transform@3.2.47":
|
"@vue/reactivity-transform@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
|
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
|
||||||
@ -530,20 +567,13 @@
|
|||||||
estree-walker "^2.0.2"
|
estree-walker "^2.0.2"
|
||||||
magic-string "^0.25.7"
|
magic-string "^0.25.7"
|
||||||
|
|
||||||
"@vue/reactivity@3.2.47":
|
"@vue/reactivity@3.2.47", "@vue/reactivity@^3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
||||||
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@vue/shared" "3.2.47"
|
"@vue/shared" "3.2.47"
|
||||||
|
|
||||||
"@vue/reactivity@^3.2.45":
|
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0"
|
|
||||||
integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==
|
|
||||||
dependencies:
|
|
||||||
"@vue/shared" "3.2.45"
|
|
||||||
|
|
||||||
"@vue/runtime-core@3.2.47":
|
"@vue/runtime-core@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d"
|
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d"
|
||||||
@ -569,12 +599,7 @@
|
|||||||
"@vue/compiler-ssr" "3.2.47"
|
"@vue/compiler-ssr" "3.2.47"
|
||||||
"@vue/shared" "3.2.47"
|
"@vue/shared" "3.2.47"
|
||||||
|
|
||||||
"@vue/shared@3.2.45", "@vue/shared@^3.2.45":
|
"@vue/shared@3.2.47", "@vue/shared@^3.2.47":
|
||||||
version "3.2.45"
|
|
||||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2"
|
|
||||||
integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==
|
|
||||||
|
|
||||||
"@vue/shared@3.2.47":
|
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
||||||
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
||||||
@ -584,11 +609,21 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
|
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
|
||||||
integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==
|
integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==
|
||||||
|
|
||||||
acorn-jsx@^5.3.2:
|
acorn-jsx@^5.2.0, acorn-jsx@^5.3.2:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||||
|
|
||||||
|
acorn@^7.1.1, acorn@^7.4.1:
|
||||||
|
version "7.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
||||||
|
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
|
||||||
|
|
||||||
|
acorn@^8.5.0, acorn@^8.8.2:
|
||||||
|
version "8.8.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
|
||||||
|
integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
|
||||||
|
|
||||||
acorn@^8.8.0:
|
acorn@^8.8.0:
|
||||||
version "8.8.0"
|
version "8.8.0"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
|
||||||
@ -688,6 +723,11 @@ braces@^3.0.2, braces@~3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.0.1"
|
fill-range "^7.0.1"
|
||||||
|
|
||||||
|
buffer-from@^1.0.0:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
||||||
|
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
||||||
|
|
||||||
call-bind@^1.0.0, call-bind@^1.0.2:
|
call-bind@^1.0.0, call-bind@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
||||||
@ -718,7 +758,7 @@ chalk@^4.0.0, chalk@^4.1.2:
|
|||||||
ansi-styles "^4.1.0"
|
ansi-styles "^4.1.0"
|
||||||
supports-color "^7.1.0"
|
supports-color "^7.1.0"
|
||||||
|
|
||||||
"chokidar@>=3.0.0 <4.0.0":
|
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
|
||||||
version "3.5.3"
|
version "3.5.3"
|
||||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
|
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
|
||||||
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
|
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
|
||||||
@ -757,6 +797,11 @@ color-name@~1.1.4:
|
|||||||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||||
|
|
||||||
|
commander@^2.20.0:
|
||||||
|
version "2.20.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||||
|
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||||
|
|
||||||
concat-map@0.0.1:
|
concat-map@0.0.1:
|
||||||
version "0.0.1"
|
version "0.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||||
@ -797,7 +842,7 @@ de-indent@^1.0.2:
|
|||||||
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
|
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
|
||||||
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
|
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
|
||||||
|
|
||||||
debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
|
debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
|
||||||
version "4.3.4"
|
version "4.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||||
@ -944,6 +989,13 @@ eslint-scope@^7.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^5.2.0"
|
estraverse "^5.2.0"
|
||||||
|
|
||||||
|
eslint-utils@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
||||||
|
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
|
||||||
|
dependencies:
|
||||||
|
eslint-visitor-keys "^1.1.0"
|
||||||
|
|
||||||
eslint-utils@^3.0.0:
|
eslint-utils@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
|
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
|
||||||
@ -951,6 +1003,11 @@ eslint-utils@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint-visitor-keys "^2.0.0"
|
eslint-visitor-keys "^2.0.0"
|
||||||
|
|
||||||
|
eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
|
||||||
|
version "1.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
|
||||||
|
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
|
||||||
|
|
||||||
eslint-visitor-keys@^2.0.0:
|
eslint-visitor-keys@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
|
||||||
@ -1006,6 +1063,15 @@ eslint@^8.34.0:
|
|||||||
strip-json-comments "^3.1.0"
|
strip-json-comments "^3.1.0"
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
|
espree@^6.0.0:
|
||||||
|
version "6.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
|
||||||
|
integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
|
||||||
|
dependencies:
|
||||||
|
acorn "^7.1.1"
|
||||||
|
acorn-jsx "^5.2.0"
|
||||||
|
eslint-visitor-keys "^1.1.0"
|
||||||
|
|
||||||
espree@^9.3.1:
|
espree@^9.3.1:
|
||||||
version "9.3.3"
|
version "9.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
|
||||||
@ -1048,7 +1114,7 @@ estraverse@^5.1.0, estraverse@^5.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
|
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
|
||||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||||
|
|
||||||
estree-walker@^2.0.2:
|
estree-walker@^2.0.1, estree-walker@^2.0.2:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
|
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
|
||||||
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
||||||
@ -1063,6 +1129,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
|
|||||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
|
||||||
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
|
||||||
|
|
||||||
|
fast-glob@^3.2.5:
|
||||||
|
version "3.2.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
|
||||||
|
integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
|
||||||
|
dependencies:
|
||||||
|
"@nodelib/fs.stat" "^2.0.2"
|
||||||
|
"@nodelib/fs.walk" "^1.2.3"
|
||||||
|
glob-parent "^5.1.2"
|
||||||
|
merge2 "^1.3.0"
|
||||||
|
micromatch "^4.0.4"
|
||||||
|
|
||||||
fast-glob@^3.2.9:
|
fast-glob@^3.2.9:
|
||||||
version "3.2.11"
|
version "3.2.11"
|
||||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
|
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
|
||||||
@ -1486,6 +1563,22 @@ json-stable-stringify-without-jsonify@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||||
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
|
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
|
||||||
|
|
||||||
|
json5@^2.2.0:
|
||||||
|
version "2.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
|
||||||
|
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
|
||||||
|
|
||||||
|
jsonc-eslint-parser@^1.0.1:
|
||||||
|
version "1.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz#8cbe99f6f5199acbc5a823c4c0b6135411027fa6"
|
||||||
|
integrity sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==
|
||||||
|
dependencies:
|
||||||
|
acorn "^7.4.1"
|
||||||
|
eslint-utils "^2.1.0"
|
||||||
|
eslint-visitor-keys "^1.3.0"
|
||||||
|
espree "^6.0.0"
|
||||||
|
semver "^6.3.0"
|
||||||
|
|
||||||
jsonfile@^6.0.1:
|
jsonfile@^6.0.1:
|
||||||
version "6.1.0"
|
version "6.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||||
@ -1525,7 +1618,7 @@ lodash.merge@^4.6.2:
|
|||||||
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
|
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
|
||||||
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
||||||
|
|
||||||
lodash@^4.17.21:
|
lodash@^4.17.20, lodash@^4.17.21:
|
||||||
version "4.17.21"
|
version "4.17.21"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||||
@ -1569,10 +1662,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimatch@^5.1.1:
|
minimatch@^6.1.6:
|
||||||
version "5.1.2"
|
version "6.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42"
|
||||||
integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==
|
integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==
|
||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^2.0.1"
|
brace-expansion "^2.0.1"
|
||||||
|
|
||||||
@ -1586,10 +1679,10 @@ ms@2.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
||||||
muggle-string@^0.1.0:
|
muggle-string@^0.2.2:
|
||||||
version "0.1.0"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.1.0.tgz#1fda8a281c8b27bb8b70466dbc9f27586a8baa6c"
|
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.2.2.tgz#786aa53fea1652c61c6a59e1f839292b262bc72a"
|
||||||
integrity sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==
|
integrity sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==
|
||||||
|
|
||||||
nanoid@^3.3.4:
|
nanoid@^3.3.4:
|
||||||
version "3.3.4"
|
version "3.3.4"
|
||||||
@ -1748,12 +1841,17 @@ path-type@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||||
|
|
||||||
|
pathe@^1.0.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.0.tgz#e2e13f6c62b31a3289af4ba19886c230f295ec03"
|
||||||
|
integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==
|
||||||
|
|
||||||
picocolors@^1.0.0:
|
picocolors@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
||||||
|
|
||||||
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
|
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||||
@ -1888,10 +1986,10 @@ safe-regex-test@^1.0.0:
|
|||||||
get-intrinsic "^1.1.3"
|
get-intrinsic "^1.1.3"
|
||||||
is-regex "^1.1.4"
|
is-regex "^1.1.4"
|
||||||
|
|
||||||
sass@^1.58.1:
|
sass@^1.58.3:
|
||||||
version "1.58.1"
|
version "1.58.3"
|
||||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.1.tgz#17ab0390076a50578ed0733f1cc45429e03405f6"
|
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d"
|
||||||
integrity sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==
|
integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar ">=3.0.0 <4.0.0"
|
chokidar ">=3.0.0 <4.0.0"
|
||||||
immutable "^4.0.0"
|
immutable "^4.0.0"
|
||||||
@ -1902,6 +2000,11 @@ sass@^1.58.1:
|
|||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||||
|
|
||||||
|
semver@^6.3.0:
|
||||||
|
version "6.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
||||||
|
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
||||||
|
|
||||||
semver@^7.3.5, semver@^7.3.6, semver@^7.3.7:
|
semver@^7.3.5, semver@^7.3.6, semver@^7.3.7:
|
||||||
version "7.3.7"
|
version "7.3.7"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
|
||||||
@ -1957,7 +2060,15 @@ slash@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||||
|
|
||||||
source-map@0.6.1, source-map@^0.6.1:
|
source-map-support@~0.5.20:
|
||||||
|
version "0.5.21"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
|
||||||
|
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
|
||||||
|
dependencies:
|
||||||
|
buffer-from "^1.0.0"
|
||||||
|
source-map "^0.6.0"
|
||||||
|
|
||||||
|
source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||||
@ -2061,6 +2172,16 @@ 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"
|
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||||
|
|
||||||
|
terser@^5.16.4:
|
||||||
|
version "5.16.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.4.tgz#51284b440b93242291a98f2a9903c024cfb70e6e"
|
||||||
|
integrity sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/source-map" "^0.3.2"
|
||||||
|
acorn "^8.5.0"
|
||||||
|
commander "^2.20.0"
|
||||||
|
source-map-support "~0.5.20"
|
||||||
|
|
||||||
text-table@^0.2.0:
|
text-table@^0.2.0:
|
||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||||
@ -2117,6 +2238,16 @@ universalify@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||||
|
|
||||||
|
unplugin@^1.0.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-1.1.0.tgz#96a14aa52d7637a56a88dec6baf4a73902f2db87"
|
||||||
|
integrity sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==
|
||||||
|
dependencies:
|
||||||
|
acorn "^8.8.2"
|
||||||
|
chokidar "^3.5.3"
|
||||||
|
webpack-sources "^3.2.3"
|
||||||
|
webpack-virtual-modules "^0.5.0"
|
||||||
|
|
||||||
uri-js@^4.2.2:
|
uri-js@^4.2.2:
|
||||||
version "4.4.1"
|
version "4.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
|
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
|
||||||
@ -2146,15 +2277,15 @@ vite-plugin-compression@^0.5.1:
|
|||||||
debug "^4.3.3"
|
debug "^4.3.3"
|
||||||
fs-extra "^10.0.0"
|
fs-extra "^10.0.0"
|
||||||
|
|
||||||
vite-plugin-css-injected-by-js@^3.0.0:
|
vite-plugin-css-injected-by-js@^3.0.1:
|
||||||
version "3.0.0"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.0.0.tgz#9a45f628c5225a636281ac14ad90dea1f7aba4e1"
|
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.0.1.tgz#59a32449b53666c2cee2b74fa4867897fa817bd0"
|
||||||
integrity sha512-gJxLYkD0rLxGnqBHkFm0bUlYq9VWRT0Fr6lHYD3uRzgW5IGMSdLbNDapXUV57SSlYpvZUrXSlne1Y89BWF1Mgw==
|
integrity sha512-M4Pv/eJnzEk13T06g79ho/qZXnkonkNs16hQZsK/zik4m1BQAVsHFHBvls0BVW8MVrPl8tvf/jWCZLoX6Khgnw==
|
||||||
|
|
||||||
vite@^4.1.1:
|
vite@^4.1.3:
|
||||||
version "4.1.1"
|
version "4.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.1.tgz#3b18b81a4e85ce3df5cbdbf4c687d93ebf402e6b"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.3.tgz#001a038c3a7757d532787c0de429b8368136ded5"
|
||||||
integrity sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==
|
integrity sha512-0Zqo4/Fr/swSOBmbl+HAAhOjrqNwju+yTtoe4hQX9UsARdcuc9njyOdr6xU0DDnV7YP0RT6mgTTOiRtZgxfCxA==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.16.14"
|
esbuild "^0.16.14"
|
||||||
postcss "^8.4.21"
|
postcss "^8.4.21"
|
||||||
@ -2201,13 +2332,13 @@ vue-template-compiler@^2.7.14:
|
|||||||
de-indent "^1.0.2"
|
de-indent "^1.0.2"
|
||||||
he "^1.2.0"
|
he "^1.2.0"
|
||||||
|
|
||||||
vue-tsc@^1.0.24:
|
vue-tsc@^1.1.4:
|
||||||
version "1.0.24"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.0.24.tgz#c0b270a7c8422408d3b6694fee61b39a4b9e4740"
|
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.1.4.tgz#3afe691962f4da97f364dc657d1724c962646762"
|
||||||
integrity sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==
|
integrity sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/vue-language-core" "1.0.24"
|
"@volar/vue-language-core" "1.1.4"
|
||||||
"@volar/vue-typescript" "1.0.24"
|
"@volar/vue-typescript" "1.1.4"
|
||||||
|
|
||||||
vue@^3.2.47:
|
vue@^3.2.47:
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
@ -2220,6 +2351,16 @@ vue@^3.2.47:
|
|||||||
"@vue/server-renderer" "3.2.47"
|
"@vue/server-renderer" "3.2.47"
|
||||||
"@vue/shared" "3.2.47"
|
"@vue/shared" "3.2.47"
|
||||||
|
|
||||||
|
webpack-sources@^3.2.3:
|
||||||
|
version "3.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
|
||||||
|
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
|
||||||
|
|
||||||
|
webpack-virtual-modules@^0.5.0:
|
||||||
|
version "0.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz#362f14738a56dae107937ab98ea7062e8bdd3b6c"
|
||||||
|
integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
|
||||||
|
|
||||||
which-boxed-primitive@^1.0.2:
|
which-boxed-primitive@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
|
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
|
||||||
@ -2265,6 +2406,20 @@ yallist@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||||
|
|
||||||
|
yaml-eslint-parser@^0.3.2:
|
||||||
|
version "0.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz#c7f5f3904f1c06ad55dc7131a731b018426b4898"
|
||||||
|
integrity sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==
|
||||||
|
dependencies:
|
||||||
|
eslint-visitor-keys "^1.3.0"
|
||||||
|
lodash "^4.17.20"
|
||||||
|
yaml "^1.10.0"
|
||||||
|
|
||||||
|
yaml@^1.10.0:
|
||||||
|
version "1.10.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
||||||
|
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
||||||
|
|
||||||
yocto-queue@^0.1.0:
|
yocto-queue@^0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user