Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
a2473645a5
@ -4,7 +4,7 @@
|
||||
#include <Arduino.h>
|
||||
|
||||
#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_PASSWORD_STRLEN 64
|
||||
@ -29,7 +29,7 @@
|
||||
|
||||
#define DEV_MAX_MAPPING_NAME_STRLEN 63
|
||||
|
||||
#define JSON_BUFFER_SIZE 8192
|
||||
#define JSON_BUFFER_SIZE 12288
|
||||
|
||||
struct CHANNEL_CONFIG_T {
|
||||
uint16_t MaxChannelPower;
|
||||
@ -40,6 +40,10 @@ struct CHANNEL_CONFIG_T {
|
||||
struct INVERTER_CONFIG_T {
|
||||
uint64_t Serial;
|
||||
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];
|
||||
};
|
||||
|
||||
@ -60,6 +64,8 @@ struct CONFIG_T {
|
||||
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
||||
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
||||
char Ntp_TimezoneDescr[NTP_MAX_TIMEZONEDESCR_STRLEN + 1];
|
||||
double Ntp_Longitude;
|
||||
double Ntp_Latitude;
|
||||
|
||||
bool Mqtt_Enabled;
|
||||
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:
|
||||
static uint32_t getChipId();
|
||||
static uint64_t generateDtuSerial();
|
||||
static int getTimezoneOffset();
|
||||
};
|
||||
|
||||
@ -23,6 +23,8 @@
|
||||
#define NTP_SERVER "pool.ntp.org"
|
||||
#define NTP_TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3"
|
||||
#define NTP_TIMEZONEDESCR "Europe/Berlin"
|
||||
#define NTP_LONGITUDE 10.4515f
|
||||
#define NTP_LATITUDE 51.1657f
|
||||
|
||||
#define MQTT_ENABLED false
|
||||
#define MQTT_HOST ""
|
||||
|
||||
@ -17,6 +17,10 @@ HM_Abstract::HM_Abstract(uint64_t serial)
|
||||
|
||||
bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
||||
{
|
||||
if (!getEnablePolling()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo, 5)) {
|
||||
return false;
|
||||
@ -34,6 +38,10 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
||||
|
||||
bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
||||
{
|
||||
if (!getEnablePolling()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo, 5)) {
|
||||
return false;
|
||||
@ -62,6 +70,10 @@ bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
|
||||
|
||||
bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio)
|
||||
{
|
||||
if (!getEnablePolling()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo, 5)) {
|
||||
return false;
|
||||
@ -83,6 +95,10 @@ bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio)
|
||||
|
||||
bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio)
|
||||
{
|
||||
if (!getEnablePolling()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
struct tm timeinfo;
|
||||
if (!getLocalTime(&timeinfo, 5)) {
|
||||
return false;
|
||||
@ -101,6 +117,10 @@ bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio)
|
||||
|
||||
bool HM_Abstract::sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type)
|
||||
{
|
||||
if (!getEnableCommands()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (type == PowerLimitControlType::RelativNonPersistent || type == PowerLimitControlType::RelativPersistent) {
|
||||
limit = min<float>(100, limit);
|
||||
}
|
||||
@ -123,6 +143,10 @@ bool HM_Abstract::resendActivePowerControlRequest(HoymilesRadio* radio)
|
||||
|
||||
bool HM_Abstract::sendPowerControlRequest(HoymilesRadio* radio, bool turnOn)
|
||||
{
|
||||
if (!getEnableCommands()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (turnOn) {
|
||||
_powerState = 1;
|
||||
} else {
|
||||
@ -139,6 +163,10 @@ bool HM_Abstract::sendPowerControlRequest(HoymilesRadio* radio, bool turnOn)
|
||||
|
||||
bool HM_Abstract::sendRestartControlRequest(HoymilesRadio* radio)
|
||||
{
|
||||
if (!getEnableCommands()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
_powerState = 2;
|
||||
|
||||
PowerControlCommand* cmd = radio->enqueCommand<PowerControlCommand>();
|
||||
|
||||
@ -67,12 +67,32 @@ bool InverterAbstract::isProducing()
|
||||
}
|
||||
}
|
||||
|
||||
return totalAc > 0;
|
||||
return _enablePolling && totalAc > 0;
|
||||
}
|
||||
|
||||
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()
|
||||
|
||||
@ -44,6 +44,12 @@ public:
|
||||
bool isProducing();
|
||||
bool isReachable();
|
||||
|
||||
void setEnablePolling(bool enabled);
|
||||
bool getEnablePolling();
|
||||
|
||||
void setEnableCommands(bool enabled);
|
||||
bool getEnableCommands();
|
||||
|
||||
void clearRxFragmentBuffer();
|
||||
void addRxFragment(uint8_t fragment[], uint8_t len);
|
||||
uint8_t verifyAllFragments(CommandAbstract* cmd);
|
||||
@ -73,6 +79,9 @@ private:
|
||||
uint8_t _rxFragmentLastPacketId = 0;
|
||||
uint8_t _rxFragmentRetransmitCnt = 0;
|
||||
|
||||
bool _enablePolling = true;
|
||||
bool _enableCommands = true;
|
||||
|
||||
std::unique_ptr<AlarmLogParser> _alarmLogParser;
|
||||
std::unique_ptr<DevInfoParser> _devInfoParser;
|
||||
std::unique_ptr<PowerCommandParser> _powerCommandParser;
|
||||
|
||||
@ -27,7 +27,7 @@ lib_deps =
|
||||
https://github.com/bertmelis/espMqttClient.git#v1.3.3
|
||||
nrf24/RF24 @ ^1.4.5
|
||||
olikraus/U8g2 @ ^2.34.13
|
||||
https://github.com/berni2288/arduino-CAN
|
||||
buelowp/sunset @ ^1.1.7
|
||||
|
||||
extra_scripts =
|
||||
pre:auto_firmware_version.py
|
||||
|
||||
@ -44,6 +44,8 @@ bool ConfigurationClass::write()
|
||||
ntp["server"] = config.Ntp_Server;
|
||||
ntp["timezone"] = config.Ntp_Timezone;
|
||||
ntp["timezone_descr"] = config.Ntp_TimezoneDescr;
|
||||
ntp["latitude"] = config.Ntp_Latitude;
|
||||
ntp["longitude"] = config.Ntp_Longitude;
|
||||
|
||||
JsonObject mqtt = doc.createNestedObject("mqtt");
|
||||
mqtt["enabled"] = config.Mqtt_Enabled;
|
||||
@ -53,7 +55,7 @@ bool ConfigurationClass::write()
|
||||
mqtt["password"] = config.Mqtt_Password;
|
||||
mqtt["topic"] = config.Mqtt_Topic;
|
||||
mqtt["retain"] = config.Mqtt_Retain;
|
||||
mqtt["publish_invterval"] = config.Mqtt_PublishInterval;
|
||||
mqtt["publish_interval"] = config.Mqtt_PublishInterval;
|
||||
|
||||
JsonObject mqtt_lwt = mqtt.createNestedObject("lwt");
|
||||
mqtt_lwt["topic"] = config.Mqtt_LwtTopic;
|
||||
@ -94,6 +96,10 @@ bool ConfigurationClass::write()
|
||||
JsonObject inv = inverters.createNestedObject();
|
||||
inv["serial"] = config.Inverter[i].Serial;
|
||||
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");
|
||||
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_Timezone, ntp["timezone"] | NTP_TIMEZONE, sizeof(config.Ntp_Timezone));
|
||||
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"];
|
||||
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_Topic, mqtt["topic"] | MQTT_TOPIC, sizeof(config.Mqtt_Topic));
|
||||
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"];
|
||||
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;
|
||||
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"];
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
config.Inverter[i].channel[c].MaxChannelPower = channel[c]["max_power"] | 0;
|
||||
@ -288,7 +301,6 @@ bool ConfigurationClass::read()
|
||||
|
||||
void ConfigurationClass::migrate()
|
||||
{
|
||||
if (config.Cfg_Version < 0x00011700) {
|
||||
File f = LittleFS.open(CONFIG_FILENAME, "r", false);
|
||||
if (!f) {
|
||||
MessageOutput.println(F("Failed to open file, cancel migration"));
|
||||
@ -299,10 +311,11 @@ void ConfigurationClass::migrate()
|
||||
// Deserialize the JSON document
|
||||
DeserializationError error = deserializeJson(doc, f);
|
||||
if (error) {
|
||||
MessageOutput.println(F("Failed to read file, cancel migration"));
|
||||
MessageOutput.printf("Failed to read file, cancel migration: %s\r\n", error.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (config.Cfg_Version < 0x00011700) {
|
||||
JsonArray inverters = doc["inverters"];
|
||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||
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;
|
||||
write();
|
||||
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;
|
||||
}
|
||||
|
||||
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 & 0xFFFFFFFF)));
|
||||
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);
|
||||
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].YieldTotalOffset = channel[F("yield_total_offset")].as<float>();
|
||||
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++;
|
||||
}
|
||||
|
||||
@ -297,6 +306,8 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
|
||||
}
|
||||
|
||||
if (inv != nullptr) {
|
||||
inv->setEnablePolling(inverter.Poll_Enable);
|
||||
inv->setEnableCommands(inverter.Command_Enable);
|
||||
for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) {
|
||||
inv->Statistics()->setStringMaxPower(c, inverter.channel[c].MaxChannelPower);
|
||||
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 "Configuration.h"
|
||||
#include "NtpSettings.h"
|
||||
#include "SunPosition.h"
|
||||
#include "WebApi.h"
|
||||
#include "WebApi_errors.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);
|
||||
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();
|
||||
request->send(response);
|
||||
}
|
||||
@ -68,6 +79,8 @@ void WebApiNtpClass::onNtpAdminGet(AsyncWebServerRequest* request)
|
||||
root[F("ntp_server")] = config.Ntp_Server;
|
||||
root[F("ntp_timezone")] = config.Ntp_Timezone;
|
||||
root[F("ntp_timezone_descr")] = config.Ntp_TimezoneDescr;
|
||||
root[F("longitude")] = config.Ntp_Longitude;
|
||||
root[F("latitude")] = config.Ntp_Latitude;
|
||||
|
||||
response->setLength();
|
||||
request->send(response);
|
||||
@ -112,7 +125,7 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
||||
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("code")] = WebApiError::GenericValueMissing;
|
||||
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_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));
|
||||
config.Ntp_Latitude = root[F("latitude")].as<double>();
|
||||
config.Ntp_Longitude = root[F("longitude")].as<double>();
|
||||
Configuration.write();
|
||||
|
||||
retMsg[F("type")] = F("success");
|
||||
|
||||
53
src/main.cpp
53
src/main.cpp
@ -4,6 +4,7 @@
|
||||
*/
|
||||
#include "Configuration.h"
|
||||
#include "Display_Graphic.h"
|
||||
#include "InverterSettings.h"
|
||||
#include "MessageOutput.h"
|
||||
#include "VeDirectFrameHandler.h"
|
||||
#include "MqttHandleDtu.h"
|
||||
@ -15,13 +16,13 @@
|
||||
#include "NetworkSettings.h"
|
||||
#include "NtpSettings.h"
|
||||
#include "PinMapping.h"
|
||||
#include "SunPosition.h"
|
||||
#include "Utils.h"
|
||||
#include "WebApi.h"
|
||||
#include "PowerLimiter.h"
|
||||
#include "PylontechCanReceiver.h"
|
||||
#include "defaults.h"
|
||||
#include <Arduino.h>
|
||||
#include <Hoymiles.h>
|
||||
#include <LittleFS.h>
|
||||
|
||||
void setup()
|
||||
@ -85,6 +86,11 @@ void setup()
|
||||
NtpSettings.init();
|
||||
MessageOutput.println(F("done"));
|
||||
|
||||
// Initialize SunPosition
|
||||
MessageOutput.print(F("Initialize SunPosition... "));
|
||||
SunPosition.init();
|
||||
MessageOutput.println(F("done"));
|
||||
|
||||
// Initialize MqTT
|
||||
MessageOutput.print(F("Initialize MqTT... "));
|
||||
MqttSettings.init();
|
||||
@ -127,46 +133,7 @@ void setup()
|
||||
}
|
||||
MessageOutput.println(F("done"));
|
||||
|
||||
// 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"));
|
||||
}
|
||||
InverterSettings.init();
|
||||
|
||||
// Initialize ve.direct communication
|
||||
MessageOutput.println(F("Initialize ve.direct interface... "));
|
||||
@ -191,7 +158,7 @@ void loop()
|
||||
yield();
|
||||
PowerLimiter.loop();
|
||||
yield();
|
||||
Hoymiles.loop();
|
||||
InverterSettings.loop();
|
||||
yield();
|
||||
// Vedirect_Enabled is unknown to lib. Therefor check has to be done here
|
||||
if (Configuration.get().Vedirect_Enabled) {
|
||||
@ -212,6 +179,8 @@ void loop()
|
||||
yield();
|
||||
Display.loop();
|
||||
yield();
|
||||
SunPosition.loop();
|
||||
yield();
|
||||
MessageOutput.loop();
|
||||
yield();
|
||||
PylontechCanReceiver.loop();
|
||||
|
||||
@ -21,9 +21,10 @@
|
||||
"vue-router": "^4.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@intlify/unplugin-vue-i18n": "^0.8.2",
|
||||
"@rushstack/eslint-patch": "^1.2.0",
|
||||
"@types/bootstrap": "^5.2.6",
|
||||
"@types/node": "^18.13.0",
|
||||
"@types/node": "^18.14.0",
|
||||
"@types/spark-md5": "^3.0.2",
|
||||
"@vitejs/plugin-vue": "^4.0.0",
|
||||
"@vue/eslint-config-typescript": "^11.0.2",
|
||||
@ -31,11 +32,12 @@
|
||||
"eslint": "^8.34.0",
|
||||
"eslint-plugin-vue": "^9.9.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"sass": "^1.58.1",
|
||||
"sass": "^1.58.3",
|
||||
"terser": "^5.16.4",
|
||||
"typescript": "^4.9.5",
|
||||
"vite": "^4.1.1",
|
||||
"vite": "^4.1.3",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-css-injected-by-js": "^3.0.0",
|
||||
"vue-tsc": "^1.0.24"
|
||||
"vite-plugin-css-injected-by-js": "^3.0.1",
|
||||
"vue-tsc": "^1.1.4"
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
:maxlength="maxlength"
|
||||
:min="min"
|
||||
:max="max"
|
||||
:step="step"
|
||||
:disabled="disabled"
|
||||
:aria-describedby="descriptionId"
|
||||
/>
|
||||
@ -69,6 +70,7 @@ export default defineComponent({
|
||||
'maxlength': String,
|
||||
'min': String,
|
||||
'max': String,
|
||||
'step': String,
|
||||
'rows': String,
|
||||
'disabled': Boolean,
|
||||
'postfix': String,
|
||||
|
||||
@ -5,26 +5,24 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('radioinfo.ChipStatus') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !systemStatus.radio_connected,
|
||||
'text-bg-success': systemStatus.radio_connected,
|
||||
}">
|
||||
<span v-if="systemStatus.radio_connected">{{ $t('radioinfo.Connected') }}</span>
|
||||
<span v-else>{{ $t('radioinfo.NotConnected') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="systemStatus.radio_connected" true_text="radioinfo.Connected" false_text="radioinfo.NotConnected" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('radioinfo.ChipType') }}</th>
|
||||
<td class="badge" :class="{
|
||||
<td>
|
||||
<span class="badge" :class="{
|
||||
'text-bg-danger': systemStatus.radio_connected && !systemStatus.radio_pvariant,
|
||||
'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>
|
||||
<span
|
||||
v-else-if="systemStatus.radio_connected && !systemStatus.radio_pvariant">nRF24L01</span>
|
||||
<span v-else>{{ $t('radioinfo.Unknown') }}</span>
|
||||
<template
|
||||
v-if="systemStatus.radio_connected && systemStatus.radio_pvariant">nRF24L01+</template>
|
||||
<template
|
||||
v-else-if="systemStatus.radio_connected && !systemStatus.radio_pvariant">nRF24L01</template>
|
||||
<template v-else>{{ $t('radioinfo.Unknown') }}</template>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -35,12 +33,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import StatusBadge from './StatusBadge.vue';
|
||||
import type { SystemStatus } from '@/types/SystemStatus';
|
||||
import { defineComponent, type PropType } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
CardElement,
|
||||
StatusBadge,
|
||||
},
|
||||
props: {
|
||||
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>
|
||||
<tr>
|
||||
<th>{{ $t('wifiapinfo.Status') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !networkStatus.ap_status,
|
||||
'text-bg-success': networkStatus.ap_status,
|
||||
}">
|
||||
<span v-if="networkStatus.ap_status">{{ $t('wifiapinfo.Enabled') }}</span>
|
||||
<span v-else>{{ $t('wifiapinfo.Disabled') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="networkStatus.ap_status" true_text="wifiapinfo.Enabled" false_text="wifiapinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -29,12 +25,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import StatusBadge from './StatusBadge.vue';
|
||||
import type { NetworkStatus } from '@/types/NetworkStatus';
|
||||
import { defineComponent, type PropType } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
CardElement,
|
||||
StatusBadge,
|
||||
},
|
||||
props: {
|
||||
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
||||
|
||||
@ -5,12 +5,8 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('wifistationinfo.Status') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !networkStatus.sta_status,
|
||||
'text-bg-success': networkStatus.sta_status,
|
||||
}">
|
||||
<span v-if="networkStatus.sta_status">{{ $t('wifistationinfo.Enabled') }}</span>
|
||||
<span v-else>{{ $t('wifistationinfo.Disabled') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="networkStatus.sta_status" true_text="wifistationinfo.Enabled" false_text="wifistationinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -33,12 +29,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import StatusBadge from './StatusBadge.vue';
|
||||
import type { NetworkStatus } from '@/types/NetworkStatus';
|
||||
import { defineComponent, type PropType } from 'vue';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
CardElement,
|
||||
StatusBadge
|
||||
},
|
||||
props: {
|
||||
networkStatus: { type: Object as PropType<NetworkStatus>, required: true },
|
||||
|
||||
@ -1,19 +1,19 @@
|
||||
{
|
||||
"menu": {
|
||||
"LiveView": "Live Ansicht",
|
||||
"LiveView": "Live-Ansicht",
|
||||
"Settings": "Einstellungen",
|
||||
"NetworkSettings": "Netzwerk Einstellungen",
|
||||
"NTPSettings": "NTP Einstellungen",
|
||||
"MQTTSettings": "MQTT Einstellungen",
|
||||
"InverterSettings": "Wechselrichter Einstellungen",
|
||||
"SecuritySettings": "Sicherheitseinstellungen",
|
||||
"DTUSettings": "DTU Einstellungen",
|
||||
"DeviceManager": "Geräte-Manager",
|
||||
"VedirectSettings": "Ve.direct Settings",
|
||||
"BatterySettings": "Battery Settings",
|
||||
"NetworkSettings": "Netzwerk",
|
||||
"NTPSettings": "NTP",
|
||||
"MQTTSettings": "MQTT",
|
||||
"InverterSettings": "Wechselrichter",
|
||||
"SecuritySettings": "Sicherheit",
|
||||
"DTUSettings": "DTU",
|
||||
"DeviceManager": "Hardware",
|
||||
"VedirectSettings": "Ve.direct",
|
||||
"BatterySettings": "Battery",
|
||||
"ConfigManagement": "Konfigurationsverwaltung",
|
||||
"FirmwareUpgrade": "Firmware Aktualisierung",
|
||||
"DeviceReboot": "Geräteneustart",
|
||||
"FirmwareUpgrade": "Firmware-Aktualisierung",
|
||||
"DeviceReboot": "Neustart",
|
||||
"Info": "Info",
|
||||
"System": "System",
|
||||
"Network": "Netzwerk",
|
||||
@ -53,7 +53,7 @@
|
||||
"5004": "Ungültigen Inverter angegeben!",
|
||||
"6001": "Neustart durchgeführt!",
|
||||
"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!",
|
||||
"7003": "Passwort 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!",
|
||||
"7007": "Port muss eine Zahl zwischen 1 und 65535 sein!",
|
||||
"7008": "Das Zertifikat 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!",
|
||||
"7011": "LWT Online Nachricht darf nicht länger als {max} Zeichen sein!",
|
||||
"7012": "LWT Offline Nachricht 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!",
|
||||
"7011": "LWT-Online-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!",
|
||||
"7014": "Hass Topic darf nicht länger als {max} Zeichen sein!",
|
||||
"7015": "Hass Topic darf keine Leerzeichen enthalten!",
|
||||
"8001": "IP Adresse ist ungültig!",
|
||||
"7014": "Hass-Topic darf nicht länger als {max} Zeichen sein!",
|
||||
"7015": "Hass-Topic darf keine Leerzeichen enthalten!",
|
||||
"8001": "IP-Adresse ist ungültig!",
|
||||
"8002": "Netzmaske ist ungültig!",
|
||||
"8003": "Standardgateway ist ungültig!",
|
||||
"8004": "DNS Server IP 1 ist ungültig!",
|
||||
"8005": "DNS Server IP 2 ist ungültig!",
|
||||
"8004": "DNS-Server-IP 1 ist ungültig!",
|
||||
"8005": "DNS-Server-IP 2 ist ungültig!",
|
||||
"9001": "Zeitserver 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!",
|
||||
@ -90,28 +90,28 @@
|
||||
"12001": "Profil muss zwischen 1 und {max} Zeichen lang sein!"
|
||||
},
|
||||
"home": {
|
||||
"LiveData": "Live Daten",
|
||||
"LiveData": "Live-Daten",
|
||||
"SerialNumber": "Seriennummer: ",
|
||||
"CurrentLimit": "Aktuelles Limit: ",
|
||||
"DataAge": "letzte Aktualisierung: ",
|
||||
"DataAge": "Letzte Aktualisierung: ",
|
||||
"Seconds": "vor {val} Sekunden",
|
||||
"ShowSetInverterLimit": "Zeige / Setze Wechselrichterlimit",
|
||||
"TurnOnOff": "Schalte Wechselrichter ein oder aus",
|
||||
"ShowInverterInfo": "Zeige Wechselrichter Informationen",
|
||||
"ShowInverterInfo": "Zeige Wechselrichter-Informationen",
|
||||
"ShowEventlog": "Zeige Ereignisanzeige",
|
||||
"UnreadMessages": "Ungelesene Meldungen",
|
||||
"Loading": "@:base.Loading",
|
||||
"EventLog": "Ereignisanzeige",
|
||||
"Close": "Schließen",
|
||||
"InverterInfo": "Wechselrichter Informationen",
|
||||
"LimitSettings": "Limit Einstellungen",
|
||||
"InverterInfo": "Wechselrichter-Informationen",
|
||||
"LimitSettings": "Limit-Einstellungen",
|
||||
"LastLimitSetStatus": "Letzter Übertragungsstatus:",
|
||||
"SetLimit": "Setze Limit:",
|
||||
"Relative": "Relativ (%)",
|
||||
"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.",
|
||||
"SetPersistent": "Limit dauerhaft setzen",
|
||||
"SetNonPersistent": "Limit nicht dauerhaft setzen",
|
||||
"SetNonPersistent": "Limit temporär setzen",
|
||||
"PowerSettings": "Energieeinstellungen",
|
||||
"LastPowerSetStatus": "Letzer Übertragungsstatus:",
|
||||
"TurnOn": "Einschalten",
|
||||
@ -158,14 +158,14 @@
|
||||
"devinfo": {
|
||||
"NoInfo": "Keine Informationen verfügbar",
|
||||
"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",
|
||||
"DetectedMaxPower": "Ermittelte max. Leistung",
|
||||
"BootloaderVersion": "Bootloader Version",
|
||||
"FirmwareVersion": "Firmware Version",
|
||||
"FirmwareBuildDate": "Firmware Erstellungsdatum",
|
||||
"HardwarePartNumber": "Hardware Teilenummer",
|
||||
"HardwareVersion": "Hardware Version"
|
||||
"BootloaderVersion": "Bootloader-Version",
|
||||
"FirmwareVersion": "Firmware-Version",
|
||||
"FirmwareBuildDate": "Firmware-Erstellungsdatum",
|
||||
"HardwarePartNumber": "Hardware-Teilenummer",
|
||||
"HardwareVersion": "Hardware-Version"
|
||||
},
|
||||
"systeminfo": {
|
||||
"SystemInfo": "System Informationen",
|
||||
@ -174,13 +174,13 @@
|
||||
"VersionOk": "Aktuell!"
|
||||
},
|
||||
"firmwareinfo": {
|
||||
"FirmwareInformation": "Firmware Informationen",
|
||||
"FirmwareInformation": "Firmwareinformationen",
|
||||
"Hostname": "Hostname",
|
||||
"SdkVersion": "SDK Version",
|
||||
"SdkVersion": "SDK-Version",
|
||||
"ConfigVersion": "Konfigurationsversion",
|
||||
"FirmwareVersion": "Firmware Version / Git Hash",
|
||||
"FirmwareVersion": "Firmwareversion / git Hash",
|
||||
"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",
|
||||
"ResetReason0": "Reset Grund CPU 0",
|
||||
"ResetReason1": "Reset Grund CPU 1",
|
||||
@ -188,15 +188,15 @@
|
||||
"Uptime": "Betriebszeit"
|
||||
},
|
||||
"hardwareinfo": {
|
||||
"HardwareInformation": "Hardware Informationen",
|
||||
"ChipModel": "Chip Modell",
|
||||
"ChipRevision": "Chip Revision",
|
||||
"ChipCores": "Chip Kerne",
|
||||
"CpuFrequency": "CPU Frequenz",
|
||||
"HardwareInformation": "Hardwareinformationen",
|
||||
"ChipModel": "Chip-Modell",
|
||||
"ChipRevision": "Chip-Revision",
|
||||
"ChipCores": "Chip-Kerne",
|
||||
"CpuFrequency": "CPU-Frequenz",
|
||||
"Mhz": "MHz"
|
||||
},
|
||||
"memoryinfo": {
|
||||
"MemoryInformation": "Speicher Informationen",
|
||||
"MemoryInformation": "Speicherinformationen",
|
||||
"Type": "Typ",
|
||||
"Usage": "Verwendung",
|
||||
"Free": "Frei",
|
||||
@ -207,18 +207,18 @@
|
||||
"Sketch": "Sketch"
|
||||
},
|
||||
"radioinfo": {
|
||||
"RadioInformation": "Funkmodul Informationen",
|
||||
"ChipStatus": "Chip Status",
|
||||
"ChipType": "Chip Typ",
|
||||
"RadioInformation": "Funkmodulinformationen",
|
||||
"ChipStatus": "Chip-Status",
|
||||
"ChipType": "Chip-Typ",
|
||||
"Connected": "verbunden",
|
||||
"NotConnected": "nicht verbunden",
|
||||
"Unknown": "unbekannt"
|
||||
},
|
||||
"networkinfo": {
|
||||
"NetworkInformation": "Netzwerk Informationen"
|
||||
"NetworkInformation": "Netzwerkinformationen"
|
||||
},
|
||||
"wifistationinfo": {
|
||||
"WifiStationInfo": "WiFi Informationen (Station)",
|
||||
"WifiStationInfo": "WLAN-Informationen (Station)",
|
||||
"Status": "Status",
|
||||
"Enabled": "aktiv",
|
||||
"Disabled": "nicht aktiv",
|
||||
@ -227,7 +227,7 @@
|
||||
"Rssi": "RSSI"
|
||||
},
|
||||
"wifiapinfo": {
|
||||
"WifiApInfo": "WiFi Informationen (Access Point)",
|
||||
"WifiApInfo": "WLAN-Informationen (Access Point)",
|
||||
"Status": "@:wifistationinfo.Status",
|
||||
"Enabled": "@:wifistationinfo.Enabled",
|
||||
"Disabled": "@:wifistationinfo.Disabled",
|
||||
@ -235,21 +235,21 @@
|
||||
"Stations": "# Teilnehmer"
|
||||
},
|
||||
"interfacenetworkinfo": {
|
||||
"NetworkInterface": "Netzwerk Schnittstelle ({iface})",
|
||||
"NetworkInterface": "Netzwerkschnittstelle ({iface})",
|
||||
"Hostname": "@:firmwareinfo.Hostname",
|
||||
"IpAddress": "IP Adresse",
|
||||
"IpAddress": "IP-Adresse",
|
||||
"Netmask": "Netzmaske",
|
||||
"DefaultGateway": "Standardgateway",
|
||||
"Dns": "DNS {num}",
|
||||
"MacAddress": "MAC Adresse"
|
||||
"MacAddress": "MAC-Adresse"
|
||||
},
|
||||
"interfaceapinfo": {
|
||||
"NetworkInterface": "Netzwerk Schnittstelle (Access Point)",
|
||||
"NetworkInterface": "Netzwerkschnittstelle (Access Point)",
|
||||
"IpAddress": "@:interfacenetworkinfo.IpAddress",
|
||||
"MacAddress": "@:interfacenetworkinfo.MacAddress"
|
||||
},
|
||||
"ntpinfo": {
|
||||
"NtpInformation": "NTP Informationen",
|
||||
"NtpInformation": "NTP-Informationen",
|
||||
"ConfigurationSummary": "Konfigurationszusammenfassung",
|
||||
"Server": "Server",
|
||||
"Timezone": "Zeitzone",
|
||||
@ -258,10 +258,15 @@
|
||||
"Status": "Status",
|
||||
"Synced": "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": {
|
||||
"MqttInformation": "MQTT Informationen",
|
||||
"MqttInformation": "MQTT-Informationen",
|
||||
"ConfigurationSummary": "@:ntpinfo.ConfigurationSummary",
|
||||
"Status": "@:ntpinfo.Status",
|
||||
"Enabled": "aktiv",
|
||||
@ -275,7 +280,7 @@
|
||||
"Retain": "Retain",
|
||||
"Tls": "TLS",
|
||||
"RootCertifcateInfo": "Root CA-Zertifikat-Informationen",
|
||||
"HassSummary": "Home Assistant MQTT Auto Discovery Konfigurationszusammenfassung",
|
||||
"HassSummary": "Home Assistant MQTT-Auto-Discovery Konfigurationszusammenfassung",
|
||||
"Expire": "Ablaufen",
|
||||
"IndividualPanels": "Einzelne Paneele",
|
||||
"RuntimeSummary": "Laufzeitzusammenfassung",
|
||||
@ -295,7 +300,7 @@
|
||||
},
|
||||
"console": {
|
||||
"Console": "Konsole",
|
||||
"VirtualDebugConsole": "Virtuelle Debug Konsole",
|
||||
"VirtualDebugConsole": "Virtuelle Debug-Konsole",
|
||||
"EnableAutoScroll": "Automatisches Scrollen aktivieren",
|
||||
"ClearConsole": "Konsole löschen",
|
||||
"CopyToClipboard": "In die Zwischenablage kopieren"
|
||||
@ -317,7 +322,7 @@
|
||||
"Power": "Leistung",
|
||||
"Voltage": "Spannung",
|
||||
"Current": "Strom",
|
||||
"Power DC": "DC Leistung",
|
||||
"Power DC": "DC-Leistung",
|
||||
"YieldDay": "Tagesertrag",
|
||||
"YieldTotal": "Gesamtertrag",
|
||||
"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."
|
||||
},
|
||||
"dtuadmin": {
|
||||
"DtuSettings": "DTU Einstellungen",
|
||||
"DtuConfiguration": "DTU Konfiguration",
|
||||
"DtuSettings": "DTU-Einstellungen",
|
||||
"DtuConfiguration": "DTU-Konfiguration",
|
||||
"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.",
|
||||
"PollInterval": "Abfrageinterval:",
|
||||
"PollInterval": "Abfrageintervall:",
|
||||
"Seconds": "Sekunden",
|
||||
"PaLevel": "Sendeleistung:",
|
||||
"PaLevelHint": "Stellen Sie sicher, dass Ihre Stromversorgung stabil genug ist, bevor Sie die Sendeleistung erhöhen.",
|
||||
@ -353,71 +358,74 @@
|
||||
},
|
||||
"securityadmin": {
|
||||
"SecuritySettings": "Sicherheitseinstellungen",
|
||||
"AdminPassword": "Administrator Passwort",
|
||||
"AdminPassword": "Administrator-Passwort",
|
||||
"Password": "Passwort:",
|
||||
"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",
|
||||
"ReadOnly": "Nur-Lese-Zugriff auf die Weboberfläche ohne Passwort zulassen",
|
||||
"Save": "@:dtuadmin.Save"
|
||||
},
|
||||
"ntpadmin": {
|
||||
"NtpSettings": "NTP Einstellungen",
|
||||
"NtpConfiguration": "NTP Konfiguration",
|
||||
"NtpSettings": "NTP-Einstellungen",
|
||||
"NtpConfiguration": "NTP-Konfiguration",
|
||||
"TimeServer": "Zeitserver:",
|
||||
"TimeServerHint": "Der Standardwert ist in Ordnung, solange OpenDTU direkten Zugang zum Internet hat.",
|
||||
"Timezone": "Zeitzone:",
|
||||
"TimezoneConfig": "Zeitzonenkonfiguration:",
|
||||
"LocationConfiguration": "Standortkonfiguration",
|
||||
"Longitude": "Längengrad:",
|
||||
"Latitude": "Breitengrad:",
|
||||
"Save": "@:dtuadmin.Save",
|
||||
"ManualTimeSynchronization": "Manuelle Zeitsynchronization",
|
||||
"CurrentOpenDtuTime": "Aktuelle OpenDTU Zeit:",
|
||||
"CurrentOpenDtuTime": "Aktuelle OpenDTU-Zeit:",
|
||||
"CurrentLocalTime": "Aktuelle lokale Zeit:",
|
||||
"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."
|
||||
},
|
||||
"networkadmin": {
|
||||
"NetworkSettings": "Netzwerk Einstellungen",
|
||||
"WifiConfiguration": "WiFi Konfiguration",
|
||||
"WifiSsid": "WiFi SSID:",
|
||||
"WifiPassword": "WiFi Passwort:",
|
||||
"NetworkSettings": "Netzwerkeinstellungen",
|
||||
"WifiConfiguration": "WLAN-Konfiguration",
|
||||
"WifiSsid": "WLAN-SSID:",
|
||||
"WifiPassword": "WLAN-Passwort:",
|
||||
"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.",
|
||||
"EnableDhcp": "DHCP aktivieren",
|
||||
"StaticIpConfiguration": "Statische IP Konfiguration",
|
||||
"IpAddress": "IP Adresse:",
|
||||
"StaticIpConfiguration": "Statische IP-Konfiguration",
|
||||
"IpAddress": "IP-Adresse:",
|
||||
"Netmask": "Netzmaske:",
|
||||
"DefaultGateway": "Standardgateway:",
|
||||
"Dns": "DNS Server {num}:",
|
||||
"Dns": "DNS-Server {num}:",
|
||||
"Save": "@:dtuadmin.Save"
|
||||
},
|
||||
"mqttadmin": {
|
||||
"MqttSettings": "MQTT Einstellungen",
|
||||
"MqttConfiguration": "MQTT Konfiguration",
|
||||
"MqttSettings": "MQTT-Einstellungen",
|
||||
"MqttConfiguration": "MQTT-Konfiguration",
|
||||
"EnableMqtt": "MQTT aktivieren",
|
||||
"EnableHass": "Home Assistant MQTT Auto Discovery aktivieren",
|
||||
"MqttBrokerParameter": "MQTT Broker Parameter",
|
||||
"EnableHass": "Home Assistant MQTT-Auto-Discovery aktivieren",
|
||||
"MqttBrokerParameter": "MQTT-Broker-Parameter",
|
||||
"Hostname": "Hostname:",
|
||||
"HostnameHint": "Hostname oder IP Adresse",
|
||||
"HostnameHint": "Hostname oder IP-Adresse",
|
||||
"Port": "Port:",
|
||||
"Username": "Benutzername:",
|
||||
"UsernameHint": "Benutzername, leer lassen für anonyme Verbindung",
|
||||
"Password": "Passwort:",
|
||||
"PasswordHint": "Passwort, leer lassen für anonyme Verbindung",
|
||||
"BaseTopic": "Basis Topic:",
|
||||
"BaseTopicHint": "Basis Topic, wird allen veröffentlichten Themen vorangestellt (z.B. inverter/)",
|
||||
"BaseTopic": "Basis-Topic:",
|
||||
"BaseTopicHint": "Basis-Topic, wird allen veröffentlichten Themen vorangestellt (z.B. inverter/)",
|
||||
"PublishInterval": "Veröffentlichungsintervall:",
|
||||
"Seconds": "Sekunden",
|
||||
"EnableRetain": "Retain Flag aktivieren",
|
||||
"EnableTls": "TLS aktivieren",
|
||||
"RootCa": "CA-Root-Zertifikat (Standard Letsencrypt):",
|
||||
"LwtParameters": "LWT Parameter",
|
||||
"LwtTopic": "LWT Topic:",
|
||||
"LwtTopicHint": "LWT Topic, wird der Basis Topic angehängt",
|
||||
"LwtOnline": "LWT Online Nachricht:",
|
||||
"LwtParameters": "LWT-Parameter",
|
||||
"LwtTopic": "LWT-Topic:",
|
||||
"LwtTopicHint": "LWT-Topic, wird der Basis Topic angehängt",
|
||||
"LwtOnline": "LWT-Online-Nachricht:",
|
||||
"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",
|
||||
"HassParameters": "Home Assistant MQTT Auto Discovery Parameter",
|
||||
"HassParameters": "Home Assistant MQTT-Auto-Discovery-Parameter",
|
||||
"HassPrefixTopic": "Präfix Topic:",
|
||||
"HassPrefixTopicHint": "The prefix for the discovery topic",
|
||||
"HassRetain": "Retain Flag aktivieren",
|
||||
@ -450,6 +458,10 @@
|
||||
"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.",
|
||||
"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",
|
||||
"Action": "Aktion",
|
||||
"DeleteInverter": "Wechselrichter löschen",
|
||||
@ -457,6 +469,11 @@
|
||||
"InverterSerial": "Wechselrichter Seriennummer:",
|
||||
"InverterName": "Wechselrichter Name:",
|
||||
"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}:",
|
||||
"StringNameHint": "Hier kann ein eigener Name für den entsprechenden Port des Wechselrichters angegeben werden.",
|
||||
"StringMaxPower": "Max. Leistung String {num}:",
|
||||
@ -475,7 +492,7 @@
|
||||
"BackupConfig": "Sicherung der Konfigurationsdatei",
|
||||
"Backup": "Sichern",
|
||||
"Restore": "Wiederherstellen",
|
||||
"NoFileSelected": "Keine Datei Ausgewählt",
|
||||
"NoFileSelected": "Keine Datei ausgewählt",
|
||||
"RestoreHeader": "Wiederherstellen: Wiederherstellen der Konfigurationsdatei",
|
||||
"Back": "Zurück",
|
||||
"UploadSuccess": "Erfolgreich hochgeladen",
|
||||
@ -490,7 +507,7 @@
|
||||
},
|
||||
"login": {
|
||||
"Login": "Anmeldung",
|
||||
"SystemLogin": "System Anmeldung",
|
||||
"SystemLogin": "Systemanmeldung",
|
||||
"Username": "Benutzername",
|
||||
"UsernameRequired": "Benutzername wird benötigt",
|
||||
"Password": "Passwort",
|
||||
@ -498,48 +515,48 @@
|
||||
"LoginButton": "Anmelden"
|
||||
},
|
||||
"firmwareupgrade": {
|
||||
"FirmwareUpgrade": "Firmware Update",
|
||||
"FirmwareUpgrade": "Firmware-Aktualisierung",
|
||||
"Loading": "@:base.Loading",
|
||||
"OtaError": "OTA Fehler",
|
||||
"OtaError": "OTA-Fehler",
|
||||
"Back": "Zurück",
|
||||
"Retry": "Wiederholen",
|
||||
"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!",
|
||||
"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!",
|
||||
"FirmwareUpload": "Firmware hochladen",
|
||||
"UploadProgress": "Hochlade Fortschritt"
|
||||
"UploadProgress": "Hochlade-Fortschritt"
|
||||
},
|
||||
"about": {
|
||||
"AboutOpendtu": "Über OpenDTU",
|
||||
"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>).",
|
||||
"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.",
|
||||
"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>",
|
||||
"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",
|
||||
"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": {
|
||||
"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.",
|
||||
"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.",
|
||||
"DefaultPasswordLink": "Bitte ändern Sie das Passwort."
|
||||
},
|
||||
"deviceadmin": {
|
||||
"DeviceManager": "Geräte-Manager",
|
||||
"DeviceManager": "Hardware-Einstellungen",
|
||||
"PinAssignment": "Anschlusseinstellungen",
|
||||
"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.",
|
||||
"Display": "Display",
|
||||
"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:",
|
||||
"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:",
|
||||
"Contrast": "Kontrast ({contrast}):",
|
||||
"Save": "@:dtuadmin.Save"
|
||||
|
||||
@ -258,7 +258,12 @@
|
||||
"Status": "Status",
|
||||
"Synced": "synced",
|
||||
"NotSynced": "not synced",
|
||||
"LocalTime": "Local Time"
|
||||
"LocalTime": "Local Time",
|
||||
"Sunrise": "Nautical Sunrise",
|
||||
"Sunset": "Nautical Sunset",
|
||||
"Mode": "Mode",
|
||||
"Day": "Day",
|
||||
"Night": "Night"
|
||||
},
|
||||
"mqttinfo": {
|
||||
"MqttInformation": "MQTT Information",
|
||||
@ -368,6 +373,9 @@
|
||||
"TimeServerHint": "The default value is fine as long as OpenDTU has direct access to the internet.",
|
||||
"Timezone": "Timezone:",
|
||||
"TimezoneConfig": "Timezone Config:",
|
||||
"LocationConfiguration": "Location Configuration",
|
||||
"Longitude": "Longitude",
|
||||
"Latitude": "Latitude",
|
||||
"Save": "@:dtuadmin.Save",
|
||||
"ManualTimeSynchronization": "Manual Time Synchronization",
|
||||
"CurrentOpenDtuTime": "Current OpenDTU Time:",
|
||||
@ -474,6 +482,10 @@
|
||||
"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.",
|
||||
"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",
|
||||
"Action": "Action",
|
||||
"DeleteInverter": "Delete inverter",
|
||||
@ -481,12 +493,17 @@
|
||||
"InverterSerial": "Inverter Serial:",
|
||||
"InverterName": "Inverter Name:",
|
||||
"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}:",
|
||||
"StringNameHint": "Here you can specify a custom name for the respective port of your inverter.",
|
||||
"StringMaxPower": "Max power string {num}:",
|
||||
"StringMaxPowerHint": "Enter the max power of the connected solar panels.",
|
||||
"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.",
|
||||
"Cancel": "@:maintenancereboot.Cancel",
|
||||
"Save": "@:dtuadmin.Save",
|
||||
|
||||
@ -257,7 +257,12 @@
|
||||
"Status": "Statut",
|
||||
"Synced": "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": {
|
||||
"MqttInformation": "MQTT Information",
|
||||
@ -367,6 +372,9 @@
|
||||
"TimeServerHint": "La valeur par défaut convient tant que OpenDTU a un accès direct à Internet.",
|
||||
"Timezone": "Fuseau horaire",
|
||||
"TimezoneConfig": "Configuration du fuseau horaire",
|
||||
"LocationConfiguration": "Location Configuration",
|
||||
"Longitude": "Longitude",
|
||||
"Latitude": "Latitude",
|
||||
"Save": "@:dtuadmin.Save",
|
||||
"ManualTimeSynchronization": "Synchronisation manuelle de l'heure",
|
||||
"CurrentOpenDtuTime": "Heure actuelle de l'OpenDTU",
|
||||
@ -442,6 +450,10 @@
|
||||
"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.",
|
||||
"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",
|
||||
"Action": "Action",
|
||||
"DeleteInverter": "Supprimer l'onduleur",
|
||||
@ -449,6 +461,11 @@
|
||||
"InverterSerial": "Numéro de série de l'onduleur",
|
||||
"InverterName": "Nom de l'onduleur :",
|
||||
"InverterNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour votre onduleur.",
|
||||
"InverterStatus": "Receive / Send",
|
||||
"PollEnable": "Poll inverter data",
|
||||
"PollEnableNight": "Poll inverter data at night",
|
||||
"CommandEnable": "Send commands",
|
||||
"CommandEnableNight": "Send commands at night",
|
||||
"StringName": "Nom de la ligne {num}:",
|
||||
"StringNameHint": "Ici, vous pouvez spécifier un nom personnalisé pour le port respectif de votre onduleur.",
|
||||
"StringMaxPower": "Puissance maximale de la ligne {num}:",
|
||||
|
||||
@ -1,7 +1,4 @@
|
||||
import type { I18nOptions } from "vue-i18n";
|
||||
import en from './en.json'
|
||||
import de from './de.json'
|
||||
import fr from './fr.json'
|
||||
|
||||
export enum Locales {
|
||||
EN = 'en',
|
||||
@ -15,12 +12,6 @@ export const LOCALES = [
|
||||
{ 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"] = {
|
||||
[Locales.EN]: {
|
||||
'datetime': {
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import messages from '@intlify/unplugin-vue-i18n/messages'
|
||||
import mitt from 'mitt'
|
||||
import { createApp } from 'vue'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
import App from './App.vue'
|
||||
import { defaultLocale, messages, dateTimeFormats, numberFormats } from './locales'
|
||||
import { dateTimeFormats, defaultLocale, numberFormats } from './locales'
|
||||
import { tooltip } from './plugins/bootstrap'
|
||||
import router from './router'
|
||||
|
||||
|
||||
@ -2,4 +2,6 @@ export interface NtpConfig {
|
||||
ntp_server: string;
|
||||
ntp_timezone: string;
|
||||
ntp_timezone_descr: string;
|
||||
latitude: number;
|
||||
longitude: number;
|
||||
}
|
||||
@ -4,4 +4,7 @@ export interface NtpStatus {
|
||||
ntp_timezone_descr: string
|
||||
ntp_status: boolean;
|
||||
ntp_localtime: string;
|
||||
sun_risetime: string;
|
||||
sun_settime: string;
|
||||
sun_isDayPeriod: boolean;
|
||||
}
|
||||
@ -28,7 +28,8 @@
|
||||
<table class="table">
|
||||
<thead>
|
||||
<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.Type') }}</th>
|
||||
<th>{{ $t('inverteradmin.Action') }}</th>
|
||||
@ -36,6 +37,17 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<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.name }}</td>
|
||||
<td>{{ inverter.type }}</td>
|
||||
@ -74,6 +86,22 @@
|
||||
</label>
|
||||
<input v-model="selectedInverterData.name" type="text" id="inverter-name"
|
||||
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 v-for="(max, index) in selectedInverterData.channel" :key="`${index}`">
|
||||
@ -168,12 +196,15 @@
|
||||
import BasePage from '@/components/BasePage.vue';
|
||||
import BootstrapAlert from "@/components/BootstrapAlert.vue";
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import InputElement from '@/components/InputElement.vue';
|
||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||
import * as bootstrap from 'bootstrap';
|
||||
import {
|
||||
BIconInfoCircle,
|
||||
BIconPencil,
|
||||
BIconTrash
|
||||
BIconTrash,
|
||||
BIconArrowDown,
|
||||
BIconArrowUp,
|
||||
} from 'bootstrap-icons-vue';
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
@ -188,6 +219,10 @@ declare interface Inverter {
|
||||
serial: number;
|
||||
name: string;
|
||||
type: string;
|
||||
poll_enable: boolean;
|
||||
poll_enable_night: boolean;
|
||||
command_enable: boolean;
|
||||
command_enable_night: boolean;
|
||||
channel: Array<Channel>;
|
||||
}
|
||||
|
||||
@ -203,9 +238,12 @@ export default defineComponent({
|
||||
BasePage,
|
||||
BootstrapAlert,
|
||||
CardElement,
|
||||
InputElement,
|
||||
BIconInfoCircle,
|
||||
BIconPencil,
|
||||
BIconTrash,
|
||||
BIconArrowDown,
|
||||
BIconArrowUp,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -6,12 +6,8 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Status') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_enabled,
|
||||
'text-bg-success': mqttDataList.mqtt_enabled,
|
||||
}">
|
||||
<span v-if="mqttDataList.mqtt_enabled">{{ $t('mqttinfo.Enabled') }}</span>
|
||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="mqttDataList.mqtt_enabled" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -36,22 +32,14 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Retain') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_retain,
|
||||
'text-bg-success': mqttDataList.mqtt_retain,
|
||||
}">
|
||||
<span v-if="mqttDataList.mqtt_retain">{{ $t('mqttinfo.Enabled') }}</span>
|
||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="mqttDataList.mqtt_retain" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Tls') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_tls,
|
||||
'text-bg-success': mqttDataList.mqtt_tls,
|
||||
}">
|
||||
<span v-if="mqttDataList.mqtt_tls">{{ $t('mqttinfo.Enabled') }}</span>
|
||||
<span v-else>{{ $t('mqttinfo.Disabled') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="mqttDataList.mqtt_tls" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-show="mqttDataList.mqtt_tls">
|
||||
@ -69,12 +57,8 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Status') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_hass_enabled,
|
||||
'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>
|
||||
<StatusBadge :status="mqttDataList.mqtt_hass_enabled" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -83,33 +67,20 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Retain') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_hass_retain,
|
||||
'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>
|
||||
<StatusBadge :status="mqttDataList.mqtt_hass_retain" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.Expire') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_hass_expire,
|
||||
'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>
|
||||
<StatusBadge :status="mqttDataList.mqtt_hass_expire" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.IndividualPanels') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_hass_individualpanels,
|
||||
'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>
|
||||
<StatusBadge :status="mqttDataList.mqtt_hass_individualpanels" true_text="mqttinfo.Enabled" false_text="mqttinfo.Disabled" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -123,12 +94,8 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('mqttinfo.ConnectionStatus') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !mqttDataList.mqtt_connected,
|
||||
'text-bg-success': mqttDataList.mqtt_connected,
|
||||
}">
|
||||
<span v-if="mqttDataList.mqtt_connected">{{ $t('mqttinfo.Connected') }}</span>
|
||||
<span v-else>{{ $t('mqttinfo.Disconnected') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="mqttDataList.mqtt_connected" true_text="mqttinfo.Connected" false_text="mqttinfo.Disconnected" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -141,6 +108,7 @@
|
||||
<script lang="ts">
|
||||
import BasePage from '@/components/BasePage.vue';
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import StatusBadge from '@/components/StatusBadge.vue';
|
||||
import type { MqttStatus } from '@/types/MqttStatus';
|
||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||
import { defineComponent } from 'vue';
|
||||
@ -149,6 +117,7 @@ export default defineComponent({
|
||||
components: {
|
||||
BasePage,
|
||||
CardElement,
|
||||
StatusBadge
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -27,6 +27,16 @@
|
||||
v-model="ntpConfigList.ntp_timezone"
|
||||
type="text" maxlength="32" disabled/>
|
||||
</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>
|
||||
</form>
|
||||
|
||||
|
||||
@ -27,18 +27,31 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{{ $t('ntpinfo.Status') }}</th>
|
||||
<td class="badge" :class="{
|
||||
'text-bg-danger': !ntpDataList.ntp_status,
|
||||
'text-bg-success': ntpDataList.ntp_status,
|
||||
}">
|
||||
<span v-if="ntpDataList.ntp_status">{{ $t('ntpinfo.Synced') }}</span>
|
||||
<span v-else>{{ $t('ntpinfo.NotSynced') }}</span>
|
||||
<td>
|
||||
<StatusBadge :status="ntpDataList.ntp_status" true_text="ntpinfo.Synced" false_text="ntpinfo.NotSynced" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{{ $t('ntpinfo.LocalTime') }}</th>
|
||||
<td>{{ ntpDataList.ntp_localtime }}</td>
|
||||
</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>
|
||||
</table>
|
||||
</div>
|
||||
@ -49,6 +62,7 @@
|
||||
<script lang="ts">
|
||||
import BasePage from '@/components/BasePage.vue';
|
||||
import CardElement from '@/components/CardElement.vue';
|
||||
import StatusBadge from '@/components/StatusBadge.vue';
|
||||
import type { NtpStatus } from "@/types/NtpStatus";
|
||||
import { authHeader, handleResponse } from '@/utils/authentication';
|
||||
import { defineComponent } from 'vue';
|
||||
@ -57,6 +71,7 @@ export default defineComponent({
|
||||
components: {
|
||||
BasePage,
|
||||
CardElement,
|
||||
StatusBadge,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -5,6 +5,7 @@ import vue from '@vitejs/plugin-vue'
|
||||
|
||||
import viteCompression from 'vite-plugin-compression';
|
||||
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
|
||||
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
|
||||
|
||||
const path = require('path')
|
||||
|
||||
@ -13,7 +14,14 @@ export default defineConfig({
|
||||
plugins: [
|
||||
vue(),
|
||||
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: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||
@ -25,6 +33,7 @@ export default defineConfig({
|
||||
cssCodeSplit: false,
|
||||
outDir: '../webapp_dist',
|
||||
emptyOutDir: true,
|
||||
minify: 'terser',
|
||||
rollupOptions: {
|
||||
output: {
|
||||
// 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"
|
||||
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":
|
||||
version "9.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
|
||||
@ -176,11 +187,42 @@
|
||||
"@intlify/shared" "9.2.2"
|
||||
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":
|
||||
version "9.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
|
||||
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":
|
||||
version "9.2.2"
|
||||
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/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":
|
||||
version "2.1.5"
|
||||
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"
|
||||
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":
|
||||
version "1.2.0"
|
||||
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"
|
||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||
|
||||
"@types/node@^18.13.0":
|
||||
version "18.13.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850"
|
||||
integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==
|
||||
"@types/node@^18.14.0":
|
||||
version "18.14.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.0.tgz#94c47b9217bbac49d4a67a967fdcdeed89ebb7d0"
|
||||
integrity sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==
|
||||
|
||||
"@types/spark-md5@^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"
|
||||
integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==
|
||||
|
||||
"@volar/language-core@1.0.24":
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.0.24.tgz#5d767571e77728464635e61af1debca944811fe0"
|
||||
integrity sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==
|
||||
"@volar/language-core@1.2.0-alpha.16":
|
||||
version "1.2.0-alpha.16"
|
||||
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.2.0-alpha.16.tgz#8b2aea2ed5bda937856bfed8c18228483f988616"
|
||||
integrity sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==
|
||||
dependencies:
|
||||
"@volar/source-map" "1.0.24"
|
||||
muggle-string "^0.1.0"
|
||||
"@volar/source-map" "1.2.0-alpha.16"
|
||||
|
||||
"@volar/source-map@1.0.24":
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.0.24.tgz#ad4c827fea5c26b4bf38a86d983e7deb65b1c61e"
|
||||
integrity sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==
|
||||
"@volar/source-map@1.2.0-alpha.16":
|
||||
version "1.2.0-alpha.16"
|
||||
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.2.0-alpha.16.tgz#c352e3a0a4262c157f21ba38be7ab936b99a8716"
|
||||
integrity sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==
|
||||
dependencies:
|
||||
muggle-string "^0.1.0"
|
||||
muggle-string "^0.2.2"
|
||||
|
||||
"@volar/typescript@1.0.24":
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.0.24.tgz#f934eda9774b31abdff53efc56782cd2623723d5"
|
||||
integrity sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==
|
||||
"@volar/typescript@1.2.0-alpha.16":
|
||||
version "1.2.0-alpha.16"
|
||||
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.2.0-alpha.16.tgz#30ff89a784d9151a07aecaeab1f49658c1d21da2"
|
||||
integrity sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==
|
||||
dependencies:
|
||||
"@volar/language-core" "1.0.24"
|
||||
"@volar/language-core" "1.2.0-alpha.16"
|
||||
|
||||
"@volar/vue-language-core@1.0.24":
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.0.24.tgz#81d180a8e09a53cb575e83acb79a31493891a1a4"
|
||||
integrity sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==
|
||||
"@volar/vue-language-core@1.1.4":
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.1.4.tgz#5d86e57e6770fbee2c0a5e6f6a0068d94097cfa8"
|
||||
integrity sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==
|
||||
dependencies:
|
||||
"@volar/language-core" "1.0.24"
|
||||
"@volar/source-map" "1.0.24"
|
||||
"@vue/compiler-dom" "^3.2.45"
|
||||
"@vue/compiler-sfc" "^3.2.45"
|
||||
"@vue/reactivity" "^3.2.45"
|
||||
"@vue/shared" "^3.2.45"
|
||||
minimatch "^5.1.1"
|
||||
"@volar/language-core" "1.2.0-alpha.16"
|
||||
"@volar/source-map" "1.2.0-alpha.16"
|
||||
"@vue/compiler-dom" "^3.2.47"
|
||||
"@vue/compiler-sfc" "^3.2.47"
|
||||
"@vue/reactivity" "^3.2.47"
|
||||
"@vue/shared" "^3.2.47"
|
||||
minimatch "^6.1.6"
|
||||
muggle-string "^0.2.2"
|
||||
vue-template-compiler "^2.7.14"
|
||||
|
||||
"@volar/vue-typescript@1.0.24":
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.0.24.tgz#bef9b2bfb1b108c0f6cb12ec6fbf449b43fc8257"
|
||||
integrity sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==
|
||||
"@volar/vue-typescript@1.1.4":
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.1.4.tgz#77533bdc5eaa9fadb89a228bbbce7a30780ee4ed"
|
||||
integrity sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==
|
||||
dependencies:
|
||||
"@volar/typescript" "1.0.24"
|
||||
"@volar/vue-language-core" "1.0.24"
|
||||
|
||||
"@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"
|
||||
"@volar/typescript" "1.2.0-alpha.16"
|
||||
"@volar/vue-language-core" "1.1.4"
|
||||
|
||||
"@vue/compiler-core@3.2.47":
|
||||
version "3.2.47"
|
||||
@ -430,15 +510,7 @@
|
||||
estree-walker "^2.0.2"
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@vue/compiler-dom@3.2.45", "@vue/compiler-dom@^3.2.45":
|
||||
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":
|
||||
"@vue/compiler-dom@3.2.47", "@vue/compiler-dom@^3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
|
||||
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
|
||||
@ -446,7 +518,7 @@
|
||||
"@vue/compiler-core" "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"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
|
||||
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
|
||||
@ -462,30 +534,6 @@
|
||||
postcss "^8.1.10"
|
||||
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":
|
||||
version "3.2.47"
|
||||
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"
|
||||
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":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
|
||||
@ -530,20 +567,13 @@
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.25.7"
|
||||
|
||||
"@vue/reactivity@3.2.47":
|
||||
"@vue/reactivity@3.2.47", "@vue/reactivity@^3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
|
||||
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
|
||||
dependencies:
|
||||
"@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":
|
||||
version "3.2.47"
|
||||
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/shared" "3.2.47"
|
||||
|
||||
"@vue/shared@3.2.45", "@vue/shared@^3.2.45":
|
||||
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":
|
||||
"@vue/shared@3.2.47", "@vue/shared@^3.2.47":
|
||||
version "3.2.47"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
|
||||
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
|
||||
@ -584,11 +609,21 @@
|
||||
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
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:
|
||||
version "8.8.0"
|
||||
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:
|
||||
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:
|
||||
version "1.0.2"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
|
||||
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"
|
||||
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:
|
||||
version "0.0.1"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||
@ -944,6 +989,13 @@ eslint-scope@^7.1.1:
|
||||
esrecurse "^4.3.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:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
|
||||
@ -951,6 +1003,11 @@ eslint-utils@^3.0.0:
|
||||
dependencies:
|
||||
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:
|
||||
version "2.1.0"
|
||||
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"
|
||||
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:
|
||||
version "9.3.3"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
|
||||
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"
|
||||
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:
|
||||
version "3.2.11"
|
||||
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"
|
||||
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:
|
||||
version "6.1.0"
|
||||
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"
|
||||
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
|
||||
|
||||
lodash@^4.17.21:
|
||||
lodash@^4.17.20, lodash@^4.17.21:
|
||||
version "4.17.21"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
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:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimatch@^5.1.1:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff"
|
||||
integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==
|
||||
minimatch@^6.1.6:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42"
|
||||
integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==
|
||||
dependencies:
|
||||
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"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
muggle-string@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.1.0.tgz#1fda8a281c8b27bb8b70466dbc9f27586a8baa6c"
|
||||
integrity sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==
|
||||
muggle-string@^0.2.2:
|
||||
version "0.2.2"
|
||||
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.2.2.tgz#786aa53fea1652c61c6a59e1f839292b262bc72a"
|
||||
integrity sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==
|
||||
|
||||
nanoid@^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"
|
||||
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:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
@ -1888,10 +1986,10 @@ safe-regex-test@^1.0.0:
|
||||
get-intrinsic "^1.1.3"
|
||||
is-regex "^1.1.4"
|
||||
|
||||
sass@^1.58.1:
|
||||
version "1.58.1"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.1.tgz#17ab0390076a50578ed0733f1cc45429e03405f6"
|
||||
integrity sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==
|
||||
sass@^1.58.3:
|
||||
version "1.58.3"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d"
|
||||
integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <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"
|
||||
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:
|
||||
version "7.3.7"
|
||||
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"
|
||||
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"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
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"
|
||||
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:
|
||||
version "0.2.0"
|
||||
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"
|
||||
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:
|
||||
version "4.4.1"
|
||||
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"
|
||||
fs-extra "^10.0.0"
|
||||
|
||||
vite-plugin-css-injected-by-js@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.0.0.tgz#9a45f628c5225a636281ac14ad90dea1f7aba4e1"
|
||||
integrity sha512-gJxLYkD0rLxGnqBHkFm0bUlYq9VWRT0Fr6lHYD3uRzgW5IGMSdLbNDapXUV57SSlYpvZUrXSlne1Y89BWF1Mgw==
|
||||
vite-plugin-css-injected-by-js@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.0.1.tgz#59a32449b53666c2cee2b74fa4867897fa817bd0"
|
||||
integrity sha512-M4Pv/eJnzEk13T06g79ho/qZXnkonkNs16hQZsK/zik4m1BQAVsHFHBvls0BVW8MVrPl8tvf/jWCZLoX6Khgnw==
|
||||
|
||||
vite@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.1.tgz#3b18b81a4e85ce3df5cbdbf4c687d93ebf402e6b"
|
||||
integrity sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==
|
||||
vite@^4.1.3:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.3.tgz#001a038c3a7757d532787c0de429b8368136ded5"
|
||||
integrity sha512-0Zqo4/Fr/swSOBmbl+HAAhOjrqNwju+yTtoe4hQX9UsARdcuc9njyOdr6xU0DDnV7YP0RT6mgTTOiRtZgxfCxA==
|
||||
dependencies:
|
||||
esbuild "^0.16.14"
|
||||
postcss "^8.4.21"
|
||||
@ -2201,13 +2332,13 @@ vue-template-compiler@^2.7.14:
|
||||
de-indent "^1.0.2"
|
||||
he "^1.2.0"
|
||||
|
||||
vue-tsc@^1.0.24:
|
||||
version "1.0.24"
|
||||
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.0.24.tgz#c0b270a7c8422408d3b6694fee61b39a4b9e4740"
|
||||
integrity sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==
|
||||
vue-tsc@^1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.1.4.tgz#3afe691962f4da97f364dc657d1724c962646762"
|
||||
integrity sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==
|
||||
dependencies:
|
||||
"@volar/vue-language-core" "1.0.24"
|
||||
"@volar/vue-typescript" "1.0.24"
|
||||
"@volar/vue-language-core" "1.1.4"
|
||||
"@volar/vue-typescript" "1.1.4"
|
||||
|
||||
vue@^3.2.47:
|
||||
version "3.2.47"
|
||||
@ -2220,6 +2351,16 @@ vue@^3.2.47:
|
||||
"@vue/server-renderer" "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:
|
||||
version "1.0.2"
|
||||
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"
|
||||
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:
|
||||
version "0.1.0"
|
||||
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