Merge remote-tracking branch 'tbnobody/OpenDTU/master' into development
This commit is contained in:
commit
2440028d38
@ -83,6 +83,7 @@ struct CONFIG_T {
|
|||||||
byte WiFi_Dns2[4];
|
byte WiFi_Dns2[4];
|
||||||
bool WiFi_Dhcp;
|
bool WiFi_Dhcp;
|
||||||
char WiFi_Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1];
|
char WiFi_Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1];
|
||||||
|
uint WiFi_ApTimeout;
|
||||||
|
|
||||||
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1];
|
||||||
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1];
|
||||||
@ -92,6 +93,7 @@ struct CONFIG_T {
|
|||||||
uint8_t Ntp_SunsetType;
|
uint8_t Ntp_SunsetType;
|
||||||
|
|
||||||
bool Mqtt_Enabled;
|
bool Mqtt_Enabled;
|
||||||
|
char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1];
|
||||||
bool Mqtt_VerboseLogging;
|
bool Mqtt_VerboseLogging;
|
||||||
uint Mqtt_Port;
|
uint Mqtt_Port;
|
||||||
char Mqtt_Username[MQTT_MAX_USERNAME_STRLEN + 1];
|
char Mqtt_Username[MQTT_MAX_USERNAME_STRLEN + 1];
|
||||||
@ -116,6 +118,8 @@ struct CONFIG_T {
|
|||||||
bool Mqtt_Hass_Retain;
|
bool Mqtt_Hass_Retain;
|
||||||
char Mqtt_Hass_Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
char Mqtt_Hass_Topic[MQTT_MAX_TOPIC_STRLEN + 1];
|
||||||
bool Mqtt_Hass_IndividualPanels;
|
bool Mqtt_Hass_IndividualPanels;
|
||||||
|
bool Mqtt_Hass_Expire;
|
||||||
|
|
||||||
bool Mqtt_Tls;
|
bool Mqtt_Tls;
|
||||||
char Mqtt_RootCaCert[MQTT_MAX_CERT_STRLEN + 1];
|
char Mqtt_RootCaCert[MQTT_MAX_CERT_STRLEN + 1];
|
||||||
bool Mqtt_TlsCertLogin;
|
bool Mqtt_TlsCertLogin;
|
||||||
@ -125,9 +129,13 @@ struct CONFIG_T {
|
|||||||
bool Vedirect_Enabled;
|
bool Vedirect_Enabled;
|
||||||
bool Vedirect_UpdatesOnly;
|
bool Vedirect_UpdatesOnly;
|
||||||
|
|
||||||
char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1];
|
INVERTER_CONFIG_T Inverter[INV_MAX_COUNT];
|
||||||
|
|
||||||
bool Mqtt_Hass_Expire;
|
uint64_t Dtu_Serial;
|
||||||
|
uint32_t Dtu_PollInterval;
|
||||||
|
uint8_t Dtu_NrfPaLevel;
|
||||||
|
int8_t Dtu_CmtPaLevel;
|
||||||
|
uint32_t Dtu_CmtFrequency;
|
||||||
|
|
||||||
bool PowerMeter_Enabled;
|
bool PowerMeter_Enabled;
|
||||||
bool PowerMeter_VerboseLogging;
|
bool PowerMeter_VerboseLogging;
|
||||||
|
|||||||
@ -64,6 +64,7 @@ private:
|
|||||||
bool adminEnabled = true;
|
bool adminEnabled = true;
|
||||||
bool forceDisconnection = false;
|
bool forceDisconnection = false;
|
||||||
int adminTimeoutCounter = 0;
|
int adminTimeoutCounter = 0;
|
||||||
|
int adminTimeoutCounterMax = 0;
|
||||||
int connectTimeoutTimer = 0;
|
int connectTimeoutTimer = 0;
|
||||||
int connectRedoTimer = 0;
|
int connectRedoTimer = 0;
|
||||||
uint32_t lastTimerCall = 0;
|
uint32_t lastTimerCall = 0;
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
|
|
||||||
#include "WebApi_battery.h"
|
#include "WebApi_battery.h"
|
||||||
#include "WebApi_config.h"
|
#include "WebApi_config.h"
|
||||||
|
#include "WebApi_device.h"
|
||||||
#include "WebApi_devinfo.h"
|
#include "WebApi_devinfo.h"
|
||||||
#include "WebApi_dtu.h"
|
#include "WebApi_dtu.h"
|
||||||
#include "WebApi_eventlog.h"
|
#include "WebApi_eventlog.h"
|
||||||
#include "WebApi_firmware.h"
|
#include "WebApi_firmware.h"
|
||||||
#include "WebApi_device.h"
|
|
||||||
#include "WebApi_inverter.h"
|
#include "WebApi_inverter.h"
|
||||||
#include "WebApi_limit.h"
|
#include "WebApi_limit.h"
|
||||||
#include "WebApi_maintenance.h"
|
#include "WebApi_maintenance.h"
|
||||||
|
|||||||
@ -63,6 +63,7 @@ enum WebApiError {
|
|||||||
NetworkGatewayInvalid,
|
NetworkGatewayInvalid,
|
||||||
NetworkDns1Invalid,
|
NetworkDns1Invalid,
|
||||||
NetworkDns2Invalid,
|
NetworkDns2Invalid,
|
||||||
|
NetworkApTimeoutInvalid,
|
||||||
|
|
||||||
NtpBase = 9000,
|
NtpBase = 9000,
|
||||||
NtpServerLength,
|
NtpServerLength,
|
||||||
|
|||||||
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
#define ACCESS_POINT_NAME "OpenDTU-"
|
#define ACCESS_POINT_NAME "OpenDTU-"
|
||||||
#define ACCESS_POINT_PASSWORD "openDTU42"
|
#define ACCESS_POINT_PASSWORD "openDTU42"
|
||||||
|
#define ACCESS_POINT_TIMEOUT 3;
|
||||||
#define AUTH_USERNAME "admin"
|
#define AUTH_USERNAME "admin"
|
||||||
#define SECURITY_ALLOW_READONLY true
|
#define SECURITY_ALLOW_READONLY true
|
||||||
|
|
||||||
#define ADMIN_TIMEOUT 180
|
|
||||||
#define WIFI_RECONNECT_TIMEOUT 15
|
#define WIFI_RECONNECT_TIMEOUT 15
|
||||||
#define WIFI_RECONNECT_REDO_TIMEOUT 600
|
#define WIFI_RECONNECT_REDO_TIMEOUT 600
|
||||||
|
|
||||||
@ -25,11 +25,11 @@
|
|||||||
#define NTP_TIMEZONEDESCR "Europe/Berlin"
|
#define NTP_TIMEZONEDESCR "Europe/Berlin"
|
||||||
#define NTP_LONGITUDE 10.4515f
|
#define NTP_LONGITUDE 10.4515f
|
||||||
#define NTP_LATITUDE 51.1657f
|
#define NTP_LATITUDE 51.1657f
|
||||||
#define NTP_SUNSETTYPE 1
|
#define NTP_SUNSETTYPE 1U
|
||||||
|
|
||||||
#define MQTT_ENABLED false
|
#define MQTT_ENABLED false
|
||||||
#define MQTT_HOST ""
|
#define MQTT_HOST ""
|
||||||
#define MQTT_PORT 1883
|
#define MQTT_PORT 1883U
|
||||||
#define MQTT_USER ""
|
#define MQTT_USER ""
|
||||||
#define MQTT_PASSWORD ""
|
#define MQTT_PASSWORD ""
|
||||||
#define MQTT_TOPIC "solar/"
|
#define MQTT_TOPIC "solar/"
|
||||||
@ -73,13 +73,13 @@
|
|||||||
#define MQTT_LWT_TOPIC "dtu/status"
|
#define MQTT_LWT_TOPIC "dtu/status"
|
||||||
#define MQTT_LWT_ONLINE "online"
|
#define MQTT_LWT_ONLINE "online"
|
||||||
#define MQTT_LWT_OFFLINE "offline"
|
#define MQTT_LWT_OFFLINE "offline"
|
||||||
#define MQTT_PUBLISH_INTERVAL 5
|
#define MQTT_PUBLISH_INTERVAL 5U
|
||||||
|
|
||||||
#define DTU_SERIAL 0x99978563412
|
#define DTU_SERIAL 0x99978563412U
|
||||||
#define DTU_POLL_INTERVAL 5
|
#define DTU_POLL_INTERVAL 5U
|
||||||
#define DTU_NRF_PA_LEVEL 0
|
#define DTU_NRF_PA_LEVEL 0U
|
||||||
#define DTU_CMT_PA_LEVEL 0
|
#define DTU_CMT_PA_LEVEL 0
|
||||||
#define DTU_CMT_FREQUENCY 865000
|
#define DTU_CMT_FREQUENCY 865000U
|
||||||
|
|
||||||
#define MQTT_HASS_ENABLED false
|
#define MQTT_HASS_ENABLED false
|
||||||
#define MQTT_HASS_EXPIRE true
|
#define MQTT_HASS_EXPIRE true
|
||||||
@ -91,9 +91,9 @@
|
|||||||
|
|
||||||
#define DISPLAY_POWERSAFE true
|
#define DISPLAY_POWERSAFE true
|
||||||
#define DISPLAY_SCREENSAVER true
|
#define DISPLAY_SCREENSAVER true
|
||||||
#define DISPLAY_ROTATION 2
|
#define DISPLAY_ROTATION 2U
|
||||||
#define DISPLAY_CONTRAST 60
|
#define DISPLAY_CONTRAST 60U
|
||||||
#define DISPLAY_LANGUAGE 0
|
#define DISPLAY_LANGUAGE 0U
|
||||||
|
|
||||||
#define VEDIRECT_ENABLED false
|
#define VEDIRECT_ENABLED false
|
||||||
#define VEDIRECT_UPDATESONLY true
|
#define VEDIRECT_UPDATESONLY true
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "HoymilesRadio_NRF.h"
|
|
||||||
#include "HoymilesRadio_CMT.h"
|
#include "HoymilesRadio_CMT.h"
|
||||||
|
#include "HoymilesRadio_NRF.h"
|
||||||
#include "inverters/InverterAbstract.h"
|
#include "inverters/InverterAbstract.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <Print.h>
|
#include <Print.h>
|
||||||
|
|||||||
@ -35,11 +35,11 @@ void ActivePowerControlCommand::setActivePowerLimit(float limit, PowerLimitContr
|
|||||||
|
|
||||||
// limit
|
// limit
|
||||||
_payload[12] = (l >> 8) & 0xff;
|
_payload[12] = (l >> 8) & 0xff;
|
||||||
_payload[13] = (l) & 0xff;
|
_payload[13] = (l)&0xff;
|
||||||
|
|
||||||
// type
|
// type
|
||||||
_payload[14] = (type >> 8) & 0xff;
|
_payload[14] = (type >> 8) & 0xff;
|
||||||
_payload[15] = (type) & 0xff;
|
_payload[15] = (type)&0xff;
|
||||||
|
|
||||||
udpateCRC(CRC_SIZE);
|
udpateCRC(CRC_SIZE);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include "../Hoymiles.h"
|
#include "../Hoymiles.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
const std::array<const AlarmMessage_t, ALARM_MSG_COUNT> AlarmLogParser::_alarmMessages = {{
|
const std::array<const AlarmMessage_t, ALARM_MSG_COUNT> AlarmLogParser::_alarmMessages = { {
|
||||||
{ AlarmMessageType_t::ALL, 1, "Inverter start" },
|
{ AlarmMessageType_t::ALL, 1, "Inverter start" },
|
||||||
{ AlarmMessageType_t::ALL, 2, "DTU command failed" },
|
{ AlarmMessageType_t::ALL, 2, "DTU command failed" },
|
||||||
{ AlarmMessageType_t::ALL, 73, "Temperature >80°C" }, // https://github.com/tbnobody/OpenDTU/discussions/590#discussioncomment-6049750
|
{ AlarmMessageType_t::ALL, 73, "Temperature >80°C" }, // https://github.com/tbnobody/OpenDTU/discussions/590#discussioncomment-6049750
|
||||||
@ -84,7 +84,7 @@ const std::array<const AlarmMessage_t, ALARM_MSG_COUNT> AlarmLogParser::_alarmMe
|
|||||||
{ AlarmMessageType_t::ALL, 5200, "Firmware error" },
|
{ AlarmMessageType_t::ALL, 5200, "Firmware error" },
|
||||||
{ AlarmMessageType_t::ALL, 8310, "Shut down" },
|
{ AlarmMessageType_t::ALL, 8310, "Shut down" },
|
||||||
{ AlarmMessageType_t::ALL, 9000, "Microinverter is suspected of being stolen" },
|
{ AlarmMessageType_t::ALL, 9000, "Microinverter is suspected of being stolen" },
|
||||||
}};
|
} };
|
||||||
|
|
||||||
void AlarmLogParser::clearBuffer()
|
void AlarmLogParser::clearBuffer()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Parser.h"
|
#include "Parser.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <cstdint>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
#define ALARM_LOG_ENTRY_COUNT 15
|
#define ALARM_LOG_ENTRY_COUNT 15
|
||||||
#define ALARM_LOG_ENTRY_SIZE 12
|
#define ALARM_LOG_ENTRY_SIZE 12
|
||||||
|
|||||||
@ -35,7 +35,7 @@ lib_deps =
|
|||||||
bblanchon/ArduinoJson @ ^6.21.2
|
bblanchon/ArduinoJson @ ^6.21.2
|
||||||
https://github.com/bertmelis/espMqttClient.git#v1.4.4
|
https://github.com/bertmelis/espMqttClient.git#v1.4.4
|
||||||
nrf24/RF24 @ ^1.4.7
|
nrf24/RF24 @ ^1.4.7
|
||||||
olikraus/U8g2 @ ^2.34.22
|
olikraus/U8g2 @ ^2.35.3
|
||||||
buelowp/sunset @ ^1.1.7
|
buelowp/sunset @ ^1.1.7
|
||||||
https://github.com/coryjfowler/MCP_CAN_lib
|
https://github.com/coryjfowler/MCP_CAN_lib
|
||||||
plerup/EspSoftwareSerial@^8.0.1
|
plerup/EspSoftwareSerial@^8.0.1
|
||||||
@ -68,6 +68,7 @@ board = esp32-c3-devkitc-02
|
|||||||
custom_patches = esp32c3
|
custom_patches = esp32c3
|
||||||
build_flags = ${env.build_flags}
|
build_flags = ${env.build_flags}
|
||||||
|
|
||||||
|
|
||||||
[env:generic_esp32c3_usb]
|
[env:generic_esp32c3_usb]
|
||||||
board = esp32-c3-devkitc-02
|
board = esp32-c3-devkitc-02
|
||||||
custom_patches = esp32c3
|
custom_patches = esp32c3
|
||||||
@ -75,6 +76,7 @@ build_flags = ${env.build_flags}
|
|||||||
-DARDUINO_USB_MODE=1
|
-DARDUINO_USB_MODE=1
|
||||||
-DARDUINO_USB_CDC_ON_BOOT=1
|
-DARDUINO_USB_CDC_ON_BOOT=1
|
||||||
|
|
||||||
|
|
||||||
[env:generic_esp32s3]
|
[env:generic_esp32s3]
|
||||||
board = esp32-s3-devkitc-1
|
board = esp32-s3-devkitc-1
|
||||||
build_flags = ${env.build_flags}
|
build_flags = ${env.build_flags}
|
||||||
|
|||||||
@ -39,6 +39,7 @@ bool ConfigurationClass::write()
|
|||||||
wifi["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
wifi["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
||||||
wifi["dhcp"] = config.WiFi_Dhcp;
|
wifi["dhcp"] = config.WiFi_Dhcp;
|
||||||
wifi["hostname"] = config.WiFi_Hostname;
|
wifi["hostname"] = config.WiFi_Hostname;
|
||||||
|
wifi["aptimeout"] = config.WiFi_ApTimeout;
|
||||||
|
|
||||||
JsonObject ntp = doc.createNestedObject("ntp");
|
JsonObject ntp = doc.createNestedObject("ntp");
|
||||||
ntp["server"] = config.Ntp_Server;
|
ntp["server"] = config.Ntp_Server;
|
||||||
@ -252,6 +253,7 @@ bool ConfigurationClass::read()
|
|||||||
config.WiFi_Dns2[3] = wifi_dns2[3];
|
config.WiFi_Dns2[3] = wifi_dns2[3];
|
||||||
|
|
||||||
config.WiFi_Dhcp = wifi["dhcp"] | WIFI_DHCP;
|
config.WiFi_Dhcp = wifi["dhcp"] | WIFI_DHCP;
|
||||||
|
config.WiFi_ApTimeout = wifi["aptimeout"] | ACCESS_POINT_TIMEOUT;
|
||||||
|
|
||||||
JsonObject ntp = doc["ntp"];
|
JsonObject ntp = doc["ntp"];
|
||||||
strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server));
|
strlcpy(config.Ntp_Server, ntp["server"] | NTP_SERVER, sizeof(config.Ntp_Server));
|
||||||
@ -436,7 +438,7 @@ void ConfigurationClass::migrate()
|
|||||||
config.Mqtt_PublishInterval = mqtt["publish_invterval"];
|
config.Mqtt_PublishInterval = mqtt["publish_invterval"];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.Cfg_Version < 0x00011900) {
|
if (config.Cfg_Version < 0x00011900) {
|
||||||
JsonObject dtu = doc["dtu"];
|
JsonObject dtu = doc["dtu"];
|
||||||
config.Dtu_NrfPaLevel = dtu["pa_level"];
|
config.Dtu_NrfPaLevel = dtu["pa_level"];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
// for all generations, this is equivalent to SPI3_HOST in the lower level driver
|
// for all generations, this is equivalent to SPI3_HOST in the lower level driver
|
||||||
// For ESP32-C2, the only externally usable HW SPI controller is SPI2, its signal names
|
// For ESP32-C2, the only externally usable HW SPI controller is SPI2, its signal names
|
||||||
// being prefixed with FSPI.
|
// being prefixed with FSPI.
|
||||||
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
#if CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||||
#define SPI_NRF HSPI
|
#define SPI_NRF HSPI
|
||||||
#elif CONFIG_IDF_TARGET_ESP32C3
|
#elif CONFIG_IDF_TARGET_ESP32C3
|
||||||
#define SPI_NRF FSPI
|
#define SPI_NRF FSPI
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
* Copyright (C) 2022 Thomas Basler and others
|
* Copyright (C) 2022 Thomas Basler and others
|
||||||
*/
|
*/
|
||||||
#include "MqttSettings.h"
|
#include "MqttSettings.h"
|
||||||
#include "MessageOutput.h"
|
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
|
#include "MessageOutput.h"
|
||||||
|
|
||||||
MqttSettingsClass::MqttSettingsClass()
|
MqttSettingsClass::MqttSettingsClass()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -21,6 +21,9 @@ void NetworkSettingsClass::init()
|
|||||||
{
|
{
|
||||||
using std::placeholders::_1;
|
using std::placeholders::_1;
|
||||||
|
|
||||||
|
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
||||||
|
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);
|
||||||
|
|
||||||
WiFi.onEvent(std::bind(&NetworkSettingsClass::NetworkEvent, this, _1));
|
WiFi.onEvent(std::bind(&NetworkSettingsClass::NetworkEvent, this, _1));
|
||||||
setupMode();
|
setupMode();
|
||||||
}
|
}
|
||||||
@ -121,11 +124,7 @@ void NetworkSettingsClass::setupMode()
|
|||||||
dnsServer->stop();
|
dnsServer->stop();
|
||||||
dnsServerStatus = false;
|
dnsServerStatus = false;
|
||||||
if (_networkMode == network_mode::WiFi) {
|
if (_networkMode == network_mode::WiFi) {
|
||||||
/* // TODO (helge) check if this makes problems to connect to the ap
|
WiFi.mode(WIFI_STA);
|
||||||
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
|
||||||
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);
|
|
||||||
*/
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
} else {
|
} else {
|
||||||
WiFi.mode(WIFI_MODE_NULL);
|
WiFi.mode(WIFI_MODE_NULL);
|
||||||
}
|
}
|
||||||
@ -141,6 +140,7 @@ void NetworkSettingsClass::enableAdminMode()
|
|||||||
{
|
{
|
||||||
adminEnabled = true;
|
adminEnabled = true;
|
||||||
adminTimeoutCounter = 0;
|
adminTimeoutCounter = 0;
|
||||||
|
adminTimeoutCounterMax = Configuration.get().WiFi_ApTimeout * 60;
|
||||||
setupMode();
|
setupMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,8 +160,7 @@ void NetworkSettingsClass::loop()
|
|||||||
setStaticIp();
|
setStaticIp();
|
||||||
setHostname();
|
setHostname();
|
||||||
}
|
}
|
||||||
} else
|
} else if (_networkMode != network_mode::WiFi) {
|
||||||
if (_networkMode != network_mode::WiFi) {
|
|
||||||
// Do stuff when switching to Ethernet mode
|
// Do stuff when switching to Ethernet mode
|
||||||
MessageOutput.println("Switch to WiFi mode");
|
MessageOutput.println("Switch to WiFi mode");
|
||||||
_networkMode = network_mode::WiFi;
|
_networkMode = network_mode::WiFi;
|
||||||
@ -170,7 +169,12 @@ void NetworkSettingsClass::loop()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (millis() - lastTimerCall > 1000) {
|
if (millis() - lastTimerCall > 1000) {
|
||||||
adminTimeoutCounter++;
|
if (adminEnabled && adminTimeoutCounterMax > 0) {
|
||||||
|
adminTimeoutCounter++;
|
||||||
|
if (adminTimeoutCounter % 10 == 0) {
|
||||||
|
MessageOutput.printf("Admin AP remaining seconds: %d / %d\r\n", adminTimeoutCounter, adminTimeoutCounterMax);
|
||||||
|
}
|
||||||
|
}
|
||||||
connectTimeoutTimer++;
|
connectTimeoutTimer++;
|
||||||
connectRedoTimer++;
|
connectRedoTimer++;
|
||||||
lastTimerCall = millis();
|
lastTimerCall = millis();
|
||||||
@ -180,9 +184,9 @@ void NetworkSettingsClass::loop()
|
|||||||
if (!isConnected()) {
|
if (!isConnected()) {
|
||||||
adminTimeoutCounter = 0;
|
adminTimeoutCounter = 0;
|
||||||
}
|
}
|
||||||
// If WiFi is connected to AP for more than ADMIN_TIMEOUT
|
// If WiFi is connected to AP for more than adminTimeoutCounterMax
|
||||||
// seconds, disable the internal Access Point
|
// seconds, disable the internal Access Point
|
||||||
if (adminTimeoutCounter > ADMIN_TIMEOUT) {
|
if (adminTimeoutCounter > adminTimeoutCounterMax) {
|
||||||
adminEnabled = false;
|
adminEnabled = false;
|
||||||
MessageOutput.println("Admin mode disabled");
|
MessageOutput.println("Admin mode disabled");
|
||||||
setupMode();
|
setupMode();
|
||||||
@ -250,8 +254,7 @@ void NetworkSettingsClass::setHostname()
|
|||||||
WiFi.mode(WIFI_MODE_APSTA);
|
WiFi.mode(WIFI_MODE_APSTA);
|
||||||
WiFi.mode(WIFI_MODE_STA);
|
WiFi.mode(WIFI_MODE_STA);
|
||||||
setupMode();
|
setupMode();
|
||||||
}
|
} else if (_networkMode == network_mode::Ethernet) {
|
||||||
else if (_networkMode == network_mode::Ethernet) {
|
|
||||||
if (ETH.setHostname(getHostname().c_str())) {
|
if (ETH.setHostname(getHostname().c_str())) {
|
||||||
MessageOutput.println("done");
|
MessageOutput.println("done");
|
||||||
} else {
|
} else {
|
||||||
@ -277,8 +280,7 @@ void NetworkSettingsClass::setStaticIp()
|
|||||||
IPAddress(Configuration.get().WiFi_Dns2));
|
IPAddress(Configuration.get().WiFi_Dns2));
|
||||||
MessageOutput.println("done");
|
MessageOutput.println("done");
|
||||||
}
|
}
|
||||||
}
|
} else if (_networkMode == network_mode::Ethernet) {
|
||||||
else if (_networkMode == network_mode::Ethernet) {
|
|
||||||
if (Configuration.get().WiFi_Dhcp) {
|
if (Configuration.get().WiFi_Dhcp) {
|
||||||
MessageOutput.print("Configuring Ethernet DHCP IP... ");
|
MessageOutput.print("Configuring Ethernet DHCP IP... ");
|
||||||
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE);
|
||||||
|
|||||||
@ -11,23 +11,23 @@
|
|||||||
#define JSON_BUFFER_SIZE 6144
|
#define JSON_BUFFER_SIZE 6144
|
||||||
|
|
||||||
#ifndef DISPLAY_TYPE
|
#ifndef DISPLAY_TYPE
|
||||||
#define DISPLAY_TYPE 0
|
#define DISPLAY_TYPE 0U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISPLAY_DATA
|
#ifndef DISPLAY_DATA
|
||||||
#define DISPLAY_DATA 255
|
#define DISPLAY_DATA 255U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISPLAY_CLK
|
#ifndef DISPLAY_CLK
|
||||||
#define DISPLAY_CLK 255
|
#define DISPLAY_CLK 255U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISPLAY_CS
|
#ifndef DISPLAY_CS
|
||||||
#define DISPLAY_CS 255
|
#define DISPLAY_CS 255U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DISPLAY_RESET
|
#ifndef DISPLAY_RESET
|
||||||
#define DISPLAY_RESET 255
|
#define DISPLAY_RESET 255U
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LED0
|
#ifndef LED0
|
||||||
|
|||||||
@ -141,7 +141,8 @@ void WebApiDeviceClass::onDeviceAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("curPin") || root.containsKey("display"))) {
|
if (!(root.containsKey("curPin")
|
||||||
|
|| root.containsKey("display"))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
|
|||||||
@ -90,12 +90,12 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("serial") &&
|
if (!(root.containsKey("serial")
|
||||||
root.containsKey("pollinterval") &&
|
&& root.containsKey("pollinterval")
|
||||||
root.containsKey("verbose_logging") &&
|
&& root.containsKey("verbose_logging")
|
||||||
root.containsKey("nrf_palevel") &&
|
&& root.containsKey("nrf_palevel")
|
||||||
root.containsKey("cmt_palevel") &&
|
&& root.containsKey("cmt_palevel")
|
||||||
root.containsKey("cmt_frequency"))) {
|
&& root.containsKey("cmt_frequency"))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
|
|||||||
@ -121,7 +121,8 @@ void WebApiInverterClass::onInverterAdd(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("serial") && root.containsKey("name"))) {
|
if (!(root.containsKey("serial")
|
||||||
|
&& root.containsKey("name"))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
@ -443,7 +444,7 @@ void WebApiInverterClass::onInverterOrder(AsyncWebServerRequest* request)
|
|||||||
// The order array contains list or id in the right order
|
// The order array contains list or id in the right order
|
||||||
JsonArray orderArray = root["order"].as<JsonArray>();
|
JsonArray orderArray = root["order"].as<JsonArray>();
|
||||||
uint8_t order = 0;
|
uint8_t order = 0;
|
||||||
for(JsonVariant id : orderArray) {
|
for (JsonVariant id : orderArray) {
|
||||||
uint8_t inverter_id = id.as<uint8_t>();
|
uint8_t inverter_id = id.as<uint8_t>();
|
||||||
if (inverter_id < INV_MAX_COUNT) {
|
if (inverter_id < INV_MAX_COUNT) {
|
||||||
INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id];
|
INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id];
|
||||||
|
|||||||
@ -228,8 +228,8 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (root["mqtt_root_ca_cert"].as<String>().length() > MQTT_MAX_CERT_STRLEN
|
if (root["mqtt_root_ca_cert"].as<String>().length() > MQTT_MAX_CERT_STRLEN
|
||||||
|| root["mqtt_client_cert"].as<String>().length() > MQTT_MAX_CERT_STRLEN
|
|| root["mqtt_client_cert"].as<String>().length() > MQTT_MAX_CERT_STRLEN
|
||||||
|| root["mqtt_client_key"].as<String>().length() > MQTT_MAX_CERT_STRLEN) {
|
|| root["mqtt_client_key"].as<String>().length() > MQTT_MAX_CERT_STRLEN) {
|
||||||
retMsg["message"] = "Certificates must not be longer than " STR(MQTT_MAX_CERT_STRLEN) " characters!";
|
retMsg["message"] = "Certificates must not be longer than " STR(MQTT_MAX_CERT_STRLEN) " characters!";
|
||||||
retMsg["code"] = WebApiError::MqttCertificateLength;
|
retMsg["code"] = WebApiError::MqttCertificateLength;
|
||||||
retMsg["param"]["max"] = MQTT_MAX_CERT_STRLEN;
|
retMsg["param"]["max"] = MQTT_MAX_CERT_STRLEN;
|
||||||
|
|||||||
@ -75,6 +75,7 @@ void WebApiNetworkClass::onNetworkAdminGet(AsyncWebServerRequest* request)
|
|||||||
root["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
root["dns2"] = IPAddress(config.WiFi_Dns2).toString();
|
||||||
root["ssid"] = config.WiFi_Ssid;
|
root["ssid"] = config.WiFi_Ssid;
|
||||||
root["password"] = config.WiFi_Password;
|
root["password"] = config.WiFi_Password;
|
||||||
|
root["aptimeout"] = config.WiFi_ApTimeout;
|
||||||
|
|
||||||
response->setLength();
|
response->setLength();
|
||||||
request->send(response);
|
request->send(response);
|
||||||
@ -119,7 +120,16 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("ssid") && root.containsKey("password") && root.containsKey("hostname") && root.containsKey("dhcp") && root.containsKey("ipaddress") && root.containsKey("netmask") && root.containsKey("gateway") && root.containsKey("dns1") && root.containsKey("dns2"))) {
|
if (!(root.containsKey("ssid")
|
||||||
|
&& root.containsKey("password")
|
||||||
|
&& root.containsKey("hostname")
|
||||||
|
&& root.containsKey("dhcp")
|
||||||
|
&& root.containsKey("ipaddress")
|
||||||
|
&& root.containsKey("netmask")
|
||||||
|
&& root.containsKey("gateway")
|
||||||
|
&& root.containsKey("dns1")
|
||||||
|
&& root.containsKey("dns2")
|
||||||
|
&& root.containsKey("aptimeout"))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
@ -188,6 +198,13 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
|
|||||||
request->send(response);
|
request->send(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (root["aptimeout"].as<uint>() > 99999) {
|
||||||
|
retMsg["message"] = "ApTimeout must be a number between 0 and 99999!";
|
||||||
|
retMsg["code"] = WebApiError::NetworkApTimeoutInvalid;
|
||||||
|
response->setLength();
|
||||||
|
request->send(response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CONFIG_T& config = Configuration.get();
|
CONFIG_T& config = Configuration.get();
|
||||||
config.WiFi_Ip[0] = ipaddress[0];
|
config.WiFi_Ip[0] = ipaddress[0];
|
||||||
@ -218,6 +235,7 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request)
|
|||||||
} else {
|
} else {
|
||||||
config.WiFi_Dhcp = false;
|
config.WiFi_Dhcp = false;
|
||||||
}
|
}
|
||||||
|
config.WiFi_ApTimeout = root["aptimeout"].as<uint>();
|
||||||
Configuration.write();
|
Configuration.write();
|
||||||
|
|
||||||
retMsg["type"] = "success";
|
retMsg["type"] = "success";
|
||||||
|
|||||||
@ -133,7 +133,11 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("ntp_server") && root.containsKey("ntp_timezone") && root.containsKey("longitude") && root.containsKey("latitude") && root.containsKey("sunsettype"))) {
|
if (!(root.containsKey("ntp_server")
|
||||||
|
&& root.containsKey("ntp_timezone")
|
||||||
|
&& root.containsKey("longitude")
|
||||||
|
&& root.containsKey("latitude")
|
||||||
|
&& root.containsKey("sunsettype"))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
|
|||||||
@ -90,7 +90,8 @@ void WebApiPowerClass::onPowerPost(AsyncWebServerRequest* request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(root.containsKey("serial")
|
if (!(root.containsKey("serial")
|
||||||
&& (root.containsKey("power") || root.containsKey("restart")))) {
|
&& (root.containsKey("power")
|
||||||
|
|| root.containsKey("restart")))) {
|
||||||
retMsg["message"] = "Values are missing!";
|
retMsg["message"] = "Values are missing!";
|
||||||
retMsg["code"] = WebApiError::GenericValueMissing;
|
retMsg["code"] = WebApiError::GenericValueMissing;
|
||||||
response->setLength();
|
response->setLength();
|
||||||
|
|||||||
@ -144,8 +144,7 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se
|
|||||||
idx,
|
idx,
|
||||||
inv->name(),
|
inv->name(),
|
||||||
channel,
|
channel,
|
||||||
config.Inverter[idx].channel[channel].Name
|
config.Inverter[idx].channel[channel].Name);
|
||||||
);
|
|
||||||
|
|
||||||
if (printHelp) {
|
if (printHelp) {
|
||||||
stream->print("# HELP opendtu_MaxPower panel maximum output power\n");
|
stream->print("# HELP opendtu_MaxPower panel maximum output power\n");
|
||||||
@ -156,8 +155,7 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se
|
|||||||
idx,
|
idx,
|
||||||
inv->name(),
|
inv->name(),
|
||||||
channel,
|
channel,
|
||||||
config.Inverter[idx].channel[channel].MaxChannelPower
|
config.Inverter[idx].channel[channel].MaxChannelPower);
|
||||||
);
|
|
||||||
|
|
||||||
if (printHelp) {
|
if (printHelp) {
|
||||||
stream->print("# HELP opendtu_YieldTotalOffset panel yield offset (for used inverters)\n");
|
stream->print("# HELP opendtu_YieldTotalOffset panel yield offset (for used inverters)\n");
|
||||||
@ -168,6 +166,5 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se
|
|||||||
idx,
|
idx,
|
||||||
inv->name(),
|
inv->name(),
|
||||||
channel,
|
channel,
|
||||||
config.Inverter[idx].channel[channel].YieldTotalOffset
|
config.Inverter[idx].channel[channel].YieldTotalOffset);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,7 +58,7 @@ void WebApiWebappClass::init(AsyncWebServer* server)
|
|||||||
#ifdef AUTO_GIT_HASH
|
#ifdef AUTO_GIT_HASH
|
||||||
// check client If-None-Match header vs ETag/AUTO_GIT_HASH
|
// check client If-None-Match header vs ETag/AUTO_GIT_HASH
|
||||||
bool eTagMatch = false;
|
bool eTagMatch = false;
|
||||||
if(request->hasHeader("If-None-Match")){
|
if (request->hasHeader("If-None-Match")) {
|
||||||
AsyncWebHeader* h = request->getHeader("If-None-Match");
|
AsyncWebHeader* h = request->getHeader("If-None-Match");
|
||||||
if (strncmp(AUTO_GIT_HASH, h->value().c_str(), strlen(AUTO_GIT_HASH)) == 0) {
|
if (strncmp(AUTO_GIT_HASH, h->value().c_str(), strlen(AUTO_GIT_HASH)) == 0) {
|
||||||
eTagMatch = true;
|
eTagMatch = true;
|
||||||
|
|||||||
@ -175,9 +175,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root)
|
|||||||
JsonObject hintObj = root.createNestedObject("hints");
|
JsonObject hintObj = root.createNestedObject("hints");
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
hintObj["time_sync"] = !getLocalTime(&timeinfo, 5);
|
hintObj["time_sync"] = !getLocalTime(&timeinfo, 5);
|
||||||
hintObj["radio_problem"] =
|
hintObj["radio_problem"] = (Hoymiles.getRadioNrf()->isInitialized() && (!Hoymiles.getRadioNrf()->isConnected() || !Hoymiles.getRadioNrf()->isPVariant())) || (Hoymiles.getRadioCmt()->isInitialized() && (!Hoymiles.getRadioCmt()->isConnected()));
|
||||||
(Hoymiles.getRadioNrf()->isInitialized() && (!Hoymiles.getRadioNrf()->isConnected() || !Hoymiles.getRadioNrf()->isPVariant())) ||
|
|
||||||
(Hoymiles.getRadioCmt()->isInitialized() && (!Hoymiles.getRadioCmt()->isConnected()));
|
|
||||||
if (!strcmp(Configuration.get().Security_Password, ACCESS_POINT_PASSWORD)) {
|
if (!strcmp(Configuration.get().Security_Password, ACCESS_POINT_PASSWORD)) {
|
||||||
hintObj["default_password"] = true;
|
hintObj["default_password"] = true;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -26,21 +26,21 @@
|
|||||||
"@rushstack/eslint-patch": "^1.3.2",
|
"@rushstack/eslint-patch": "^1.3.2",
|
||||||
"@tsconfig/node18": "^18.2.0",
|
"@tsconfig/node18": "^18.2.0",
|
||||||
"@types/bootstrap": "^5.2.6",
|
"@types/bootstrap": "^5.2.6",
|
||||||
"@types/node": "^20.4.1",
|
"@types/node": "^20.4.4",
|
||||||
"@types/sortablejs": "^1.15.1",
|
"@types/sortablejs": "^1.15.1",
|
||||||
"@types/spark-md5": "^3.0.2",
|
"@types/spark-md5": "^3.0.2",
|
||||||
"@vitejs/plugin-vue": "^4.2.3",
|
"@vitejs/plugin-vue": "^4.2.3",
|
||||||
"@vue/eslint-config-typescript": "^11.0.3",
|
"@vue/eslint-config-typescript": "^11.0.3",
|
||||||
"@vue/tsconfig": "^0.4.0",
|
"@vue/tsconfig": "^0.4.0",
|
||||||
"eslint": "^8.44.0",
|
"eslint": "^8.45.0",
|
||||||
"eslint-plugin-vue": "^9.15.1",
|
"eslint-plugin-vue": "^9.15.1",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"sass": "^1.63.6",
|
"sass": "^1.64.1",
|
||||||
"terser": "^5.19.0",
|
"terser": "^5.19.2",
|
||||||
"typescript": "^5.1.6",
|
"typescript": "^5.1.6",
|
||||||
"vite": "^4.4.3",
|
"vite": "^4.4.6",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-css-injected-by-js": "^3.2.0",
|
"vite-plugin-css-injected-by-js": "^3.2.1",
|
||||||
"vue-tsc": "^1.8.4"
|
"vue-tsc": "^1.8.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,11 +17,11 @@
|
|||||||
{{ capitalizeFirstLetter(category) }}</td>
|
{{ capitalizeFirstLetter(category) }}</td>
|
||||||
<td :class="{ 'table-danger': !isEqual(category, prop) }">{{ prop }}</td>
|
<td :class="{ 'table-danger': !isEqual(category, prop) }">{{ prop }}</td>
|
||||||
<td>
|
<td>
|
||||||
<template v-if="((selectedPinAssignment as Device)[category as keyof Device])">
|
<template v-if="selectedPinAssignment && category in selectedPinAssignment">
|
||||||
{{ (selectedPinAssignment as any)[category][prop] }}</template>
|
{{ (selectedPinAssignment as any)[category][prop] }}</template>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<template v-if="((currentPinAssignment as Device)[category as keyof Device])">
|
<template v-if="currentPinAssignment && category in currentPinAssignment">
|
||||||
{{ (currentPinAssignment as any)[category][prop] }}</template>
|
{{ (currentPinAssignment as any)[category][prop] }}</template>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -65,12 +65,12 @@ export default defineComponent({
|
|||||||
methods: {
|
methods: {
|
||||||
properties(category: string): string[] {
|
properties(category: string): string[] {
|
||||||
let curArray: Array<string> = [];
|
let curArray: Array<string> = [];
|
||||||
if ((this.currentPinAssignment as Device)[category as keyof Device]) {
|
if (this.currentPinAssignment && category in this.currentPinAssignment) {
|
||||||
curArray = Object.keys((this.currentPinAssignment as Device)[category as keyof Device]);
|
curArray = Object.keys((this.currentPinAssignment as Device)[category as keyof Device]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let selArray: Array<string> = [];
|
let selArray: Array<string> = [];
|
||||||
if ((this.selectedPinAssignment as Device)[category as keyof Device]) {
|
if (this.selectedPinAssignment && category in this.selectedPinAssignment) {
|
||||||
selArray = Object.keys((this.selectedPinAssignment as Device)[category as keyof Device]);
|
selArray = Object.keys((this.selectedPinAssignment as Device)[category as keyof Device]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,10 +83,10 @@ export default defineComponent({
|
|||||||
let comSel = 999999;
|
let comSel = 999999;
|
||||||
let comCur = 999999;
|
let comCur = 999999;
|
||||||
|
|
||||||
if ((this.selectedPinAssignment as Device)[category as keyof Device]) {
|
if (this.selectedPinAssignment && category in this.selectedPinAssignment) {
|
||||||
comSel = (this.selectedPinAssignment as any)[category][prop];
|
comSel = (this.selectedPinAssignment as any)[category][prop];
|
||||||
}
|
}
|
||||||
if ((this.currentPinAssignment as Device)[category as keyof Device]) {
|
if (this.currentPinAssignment && category in this.currentPinAssignment) {
|
||||||
comCur = (this.currentPinAssignment as any)[category][prop];
|
comCur = (this.currentPinAssignment as any)[category][prop];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -84,6 +84,7 @@
|
|||||||
"8003": "Standardgateway ist ungültig!",
|
"8003": "Standardgateway ist ungültig!",
|
||||||
"8004": "DNS-Server-IP 1 ist ungültig!",
|
"8004": "DNS-Server-IP 1 ist ungültig!",
|
||||||
"8005": "DNS-Server-IP 2 ist ungültig!",
|
"8005": "DNS-Server-IP 2 ist ungültig!",
|
||||||
|
"8006": "Administrative AccessPoint Timeout-Wert ist ungültig!",
|
||||||
"9001": "Zeitserver muss zwischen 1 und {max} Zeichen lang sein!",
|
"9001": "Zeitserver muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
"9002": "Zeitzone muss zwischen 1 und {max} Zeichen lang sein!",
|
"9002": "Zeitzone muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
"9003": "Zeitzonenbeschreibung muss zwischen 1 und {max} Zeichen lang sein!",
|
"9003": "Zeitzonenbeschreibung muss zwischen 1 und {max} Zeichen lang sein!",
|
||||||
@ -446,6 +447,10 @@
|
|||||||
"Netmask": "Netzmaske:",
|
"Netmask": "Netzmaske:",
|
||||||
"DefaultGateway": "Standardgateway:",
|
"DefaultGateway": "Standardgateway:",
|
||||||
"Dns": "DNS-Server {num}:",
|
"Dns": "DNS-Server {num}:",
|
||||||
|
"AdminAp": "WLAN-Konfiguration (Admin AccessPoint)",
|
||||||
|
"ApTimeout": "AccessPoint Zeitlimit:",
|
||||||
|
"ApTimeoutHint": "Zeit die der AccessPoint offen gehalten wird. Ein Wert von 0 bedeutet unendlich.",
|
||||||
|
"Minutes": "Minuten",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
"mqttadmin": {
|
"mqttadmin": {
|
||||||
@ -679,6 +684,7 @@
|
|||||||
},
|
},
|
||||||
"deviceadmin": {
|
"deviceadmin": {
|
||||||
"DeviceManager": "Hardware-Einstellungen",
|
"DeviceManager": "Hardware-Einstellungen",
|
||||||
|
"ParseError": "Syntaxfehler in 'pin_mapping.json': {error}",
|
||||||
"PinAssignment": "Anschlusseinstellungen",
|
"PinAssignment": "Anschlusseinstellungen",
|
||||||
"SelectedProfile": "Ausgewähltes Profil:",
|
"SelectedProfile": "Ausgewähltes Profil:",
|
||||||
"DefaultProfile": "(Standardeinstellungen)",
|
"DefaultProfile": "(Standardeinstellungen)",
|
||||||
|
|||||||
@ -84,6 +84,7 @@
|
|||||||
"8003": "Gateway is invalid!",
|
"8003": "Gateway is invalid!",
|
||||||
"8004": "DNS Server IP 1 is invalid!",
|
"8004": "DNS Server IP 1 is invalid!",
|
||||||
"8005": "DNS Server IP 2 is invalid!",
|
"8005": "DNS Server IP 2 is invalid!",
|
||||||
|
"8006": "Administrative AccessPoint Timeout value is invalid",
|
||||||
"9001": "NTP Server must between 1 and {max} characters long!",
|
"9001": "NTP Server must between 1 and {max} characters long!",
|
||||||
"9002": "Timezone must between 1 and {max} characters long!",
|
"9002": "Timezone must between 1 and {max} characters long!",
|
||||||
"9003": "Timezone description must between 1 and {max} characters long!",
|
"9003": "Timezone description must between 1 and {max} characters long!",
|
||||||
@ -446,6 +447,10 @@
|
|||||||
"Netmask": "Netmask:",
|
"Netmask": "Netmask:",
|
||||||
"DefaultGateway": "Default Gateway:",
|
"DefaultGateway": "Default Gateway:",
|
||||||
"Dns": "DNS Server {num}:",
|
"Dns": "DNS Server {num}:",
|
||||||
|
"AdminAp": "WiFi Configuration (Admin AccessPoint)",
|
||||||
|
"ApTimeout": "AccessPoint Timeout:",
|
||||||
|
"ApTimeoutHint": "Time which the AccessPoint is kept open. A value of 0 means infinite.",
|
||||||
|
"Minutes": "minutes",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
"mqttadmin": {
|
"mqttadmin": {
|
||||||
@ -686,6 +691,7 @@
|
|||||||
},
|
},
|
||||||
"deviceadmin": {
|
"deviceadmin": {
|
||||||
"DeviceManager": "Device-Manager",
|
"DeviceManager": "Device-Manager",
|
||||||
|
"ParseError": "Parse error in 'pin_mapping.json': {error}",
|
||||||
"PinAssignment": "Connection settings",
|
"PinAssignment": "Connection settings",
|
||||||
"SelectedProfile": "Selected profile:",
|
"SelectedProfile": "Selected profile:",
|
||||||
"DefaultProfile": "(Default settings)",
|
"DefaultProfile": "(Default settings)",
|
||||||
|
|||||||
@ -84,6 +84,7 @@
|
|||||||
"8003": "La passerelle n'est pas valide !",
|
"8003": "La passerelle n'est pas valide !",
|
||||||
"8004": "L'adresse IP du serveur DNS primaire n'est pas valide !",
|
"8004": "L'adresse IP du serveur DNS primaire n'est pas valide !",
|
||||||
"8005": "L'adresse IP du serveur DNS secondaire n'est pas valide !",
|
"8005": "L'adresse IP du serveur DNS secondaire n'est pas valide !",
|
||||||
|
"8006": "La valeur du délai d'attente du point d'accès administratif n'est pas valide !",
|
||||||
"9001": "Le serveur NTP doit avoir une longueur comprise entre 1 et {max} caractères !",
|
"9001": "Le serveur NTP doit avoir une longueur comprise entre 1 et {max} caractères !",
|
||||||
"9002": "Le fuseau horaire doit comporter entre 1 et {max} caractères !",
|
"9002": "Le fuseau horaire doit comporter entre 1 et {max} caractères !",
|
||||||
"9003": "La description du fuseau horaire doit comporter entre 1 et {max} caractères !",
|
"9003": "La description du fuseau horaire doit comporter entre 1 et {max} caractères !",
|
||||||
@ -446,6 +447,10 @@
|
|||||||
"Netmask": "Masque de réseau",
|
"Netmask": "Masque de réseau",
|
||||||
"DefaultGateway": "Passerelle par défaut",
|
"DefaultGateway": "Passerelle par défaut",
|
||||||
"Dns": "Serveur DNS {num}",
|
"Dns": "Serveur DNS {num}",
|
||||||
|
"AdminAp": "Configuration du réseau WiFi (Point d'accès)",
|
||||||
|
"ApTimeout": "Délai d'attente du point d'accès",
|
||||||
|
"ApTimeoutHint": "Durée pendant laquelle le point d'accès reste ouvert. Une valeur de 0 signifie infini.",
|
||||||
|
"Minutes": "minutes",
|
||||||
"Save": "@:dtuadmin.Save"
|
"Save": "@:dtuadmin.Save"
|
||||||
},
|
},
|
||||||
"mqttadmin": {
|
"mqttadmin": {
|
||||||
@ -638,6 +643,7 @@
|
|||||||
},
|
},
|
||||||
"deviceadmin": {
|
"deviceadmin": {
|
||||||
"DeviceManager": "Gestionnaire de périphériques",
|
"DeviceManager": "Gestionnaire de périphériques",
|
||||||
|
"ParseError": "Erreur d'analyse dans 'pin_mapping.json': {error}",
|
||||||
"PinAssignment": "Paramètres de connexion",
|
"PinAssignment": "Paramètres de connexion",
|
||||||
"SelectedProfile": "Profil sélectionné",
|
"SelectedProfile": "Profil sélectionné",
|
||||||
"DefaultProfile": "(Réglages par défaut)",
|
"DefaultProfile": "(Réglages par défaut)",
|
||||||
|
|||||||
@ -8,4 +8,5 @@ export interface NetworkConfig {
|
|||||||
gateway: string;
|
gateway: string;
|
||||||
dns1: string;
|
dns1: string;
|
||||||
dns2: string;
|
dns2: string;
|
||||||
|
aptimeout: number;
|
||||||
}
|
}
|
||||||
@ -73,10 +73,10 @@ export function handleResponse(response: Response, emitter: Emitter<Record<Event
|
|||||||
// auto logout if 401 response returned from api
|
// auto logout if 401 response returned from api
|
||||||
logout();
|
logout();
|
||||||
emitter.emit("logged-out");
|
emitter.emit("logged-out");
|
||||||
router.push({path: "/login", query: { returnUrl: router.currentRoute.value.fullPath }});
|
router.push({ path: "/login", query: { returnUrl: router.currentRoute.value.fullPath } });
|
||||||
}
|
}
|
||||||
|
|
||||||
const error = (data && data.message) || response.statusText;
|
const error = { message: (data && data.message) || response.statusText, status: response.status || 0 };
|
||||||
return Promise.reject(error);
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -85,8 +85,8 @@
|
|||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<label for="inputDisplayContrast" class="col-sm-2 col-form-label">{{
|
<label for="inputDisplayContrast" class="col-sm-2 col-form-label">{{
|
||||||
$t('deviceadmin.Contrast', { contrast: $n(deviceConfigList.display.contrast / 100,
|
$t('deviceadmin.Contrast', { contrast: $n(deviceConfigList.display.contrast / 100,
|
||||||
'percent')
|
'percent')
|
||||||
}) }}</label>
|
}) }}</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<input type="range" class="form-range" min="0" max="100" id="inputDisplayContrast"
|
<input type="range" class="form-range" min="0" max="100" id="inputDisplayContrast"
|
||||||
v-model="deviceConfigList.display.contrast" />
|
v-model="deviceConfigList.display.contrast" />
|
||||||
@ -120,7 +120,7 @@ export default defineComponent({
|
|||||||
BootstrapAlert,
|
BootstrapAlert,
|
||||||
InputElement,
|
InputElement,
|
||||||
PinInfo,
|
PinInfo,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
dataLoading: true,
|
dataLoading: true,
|
||||||
@ -157,7 +157,12 @@ export default defineComponent({
|
|||||||
this.pinMappingList = data;
|
this.pinMappingList = data;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.catch(() => {
|
.catch((error) => {
|
||||||
|
if (error.status != 404) {
|
||||||
|
this.alertMessage = this.$t('deviceadmin.ParseError', { error: error.message });
|
||||||
|
this.alertType = 'danger';
|
||||||
|
this.showAlert = true;
|
||||||
|
}
|
||||||
this.pinMappingList = Array<Device>();
|
this.pinMappingList = Array<Device>();
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
|
|||||||
@ -50,6 +50,13 @@
|
|||||||
type="text" maxlength="32"/>
|
type="text" maxlength="32"/>
|
||||||
</CardElement>
|
</CardElement>
|
||||||
|
|
||||||
|
<CardElement :text="$t('networkadmin.AdminAp')" textVariant="text-bg-primary" add-space>
|
||||||
|
<InputElement :label="$t('networkadmin.ApTimeout')"
|
||||||
|
v-model="networkConfigList.aptimeout"
|
||||||
|
type="number" min="0" max="99999"
|
||||||
|
:postfix="$t('networkadmin.Minutes')"
|
||||||
|
:tooltip="$t('networkadmin.ApTimeoutHint')"/>
|
||||||
|
</CardElement>
|
||||||
<button type="submit" class="btn btn-primary mb-3">{{ $t('networkadmin.Save') }}</button>
|
<button type="submit" class="btn btn-primary mb-3">{{ $t('networkadmin.Save') }}</button>
|
||||||
</form>
|
</form>
|
||||||
</BasePage>
|
</BasePage>
|
||||||
|
|||||||
128
webapp/yarn.lock
128
webapp/yarn.lock
@ -377,10 +377,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||||
|
|
||||||
"@types/node@^20.4.1":
|
"@types/node@^20.4.4":
|
||||||
version "20.4.1"
|
version "20.4.4"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.1.tgz#a6033a8718653c50ac4962977e14d0f984d9527d"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.4.tgz#c79c7cc22c9d0e97a7944954c9e663bcbd92b0cb"
|
||||||
integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==
|
integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==
|
||||||
|
|
||||||
"@types/semver@^7.3.12":
|
"@types/semver@^7.3.12":
|
||||||
version "7.3.13"
|
version "7.3.13"
|
||||||
@ -486,26 +486,26 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6"
|
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6"
|
||||||
integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==
|
integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==
|
||||||
|
|
||||||
"@volar/language-core@1.8.0", "@volar/language-core@~1.8.0":
|
"@volar/language-core@1.9.1", "@volar/language-core@~1.9.0":
|
||||||
version "1.8.0"
|
version "1.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.8.0.tgz#11e7d85265e70e85b7342dbf531db582406ec677"
|
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.9.1.tgz#6a80b92f54b2ecb8fa66695689e65d589b324711"
|
||||||
integrity sha512-ZHTvZPM3pEbOOuaq+ybNz5TQlHUqPQPK0G1+SonvApGq0e3qgGijjhtL5T7hsCtUEmxfix8FrAuCH14tMBOhTg==
|
integrity sha512-FlllCDE0HdUYh66zS1S4u8WobqKFStOwkd3OCXCOhPmalfm4Fte3gHNXzqs+R8VlbjK7ZvBxrG9MSiaRGXZygg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/source-map" "1.8.0"
|
"@volar/source-map" "1.9.1"
|
||||||
|
|
||||||
"@volar/source-map@1.8.0", "@volar/source-map@~1.8.0":
|
"@volar/source-map@1.9.1", "@volar/source-map@~1.9.0":
|
||||||
version "1.8.0"
|
version "1.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.8.0.tgz#2893a7bc9a41563da803377b33fbf8407eb4c5e1"
|
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.9.1.tgz#295ebb88224463932158f97d66226334b8a19ee5"
|
||||||
integrity sha512-d35aV0yFkIrkynRSKgrN5hgbMv6ekkFvcJsJGmOZ8UEjqLStto9zq7RSvpp6/PZ7/pa4Gn1f6K1qDt0bq0oUew==
|
integrity sha512-KIttDVrbr3ACLzEP891uj+XdVaCnNErFNRGjNQio+gW2a9fDdz407usAJu6DHgIkJU1l18HyOxMU2VX1l2+D5g==
|
||||||
dependencies:
|
dependencies:
|
||||||
muggle-string "^0.3.1"
|
muggle-string "^0.3.1"
|
||||||
|
|
||||||
"@volar/typescript@~1.8.0":
|
"@volar/typescript@~1.9.0":
|
||||||
version "1.8.0"
|
version "1.9.1"
|
||||||
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.8.0.tgz#ef231b9b54b192c1e50b9c2cf0142a975dd81651"
|
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.9.1.tgz#5ba42698ba55be7b1202c29ea84bf9796173a9dc"
|
||||||
integrity sha512-T/U1XLLhXv6tNr40Awznfc6QZWizSL99t6M0DeXtIMbnvSCqjjCVRnwlsq+DK9C1RlO3k8+i0Z8iJn7O1GGtoA==
|
integrity sha512-UO8bhflYMNuOpXeGYHSm3xItU4kEVhJQNGjwgw1ZqLr/sm1C7Y+pVQ/S01NpsojhFC8S+P6/p+jOTK6DO214kQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "1.8.0"
|
"@volar/language-core" "1.9.1"
|
||||||
|
|
||||||
"@vue/compiler-core@3.2.47":
|
"@vue/compiler-core@3.2.47":
|
||||||
version "3.2.47"
|
version "3.2.47"
|
||||||
@ -628,13 +628,13 @@
|
|||||||
"@typescript-eslint/parser" "^5.59.1"
|
"@typescript-eslint/parser" "^5.59.1"
|
||||||
vue-eslint-parser "^9.1.1"
|
vue-eslint-parser "^9.1.1"
|
||||||
|
|
||||||
"@vue/language-core@1.8.4":
|
"@vue/language-core@1.8.6":
|
||||||
version "1.8.4"
|
version "1.8.6"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.4.tgz#9b34095987baaf3f2482ba5b34911d248d8ffcb4"
|
resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-1.8.6.tgz#afe2af57aa601770f4a5b263757e94e891954755"
|
||||||
integrity sha512-pnNtNcJVfkGYluW0vsVO+Y1gyX+eA0voaS7+1JOhCp5zKeCaL/PAmGYOgfvwML62neL+2H8pnhY7sffmrGpEhw==
|
integrity sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/language-core" "~1.8.0"
|
"@volar/language-core" "~1.9.0"
|
||||||
"@volar/source-map" "~1.8.0"
|
"@volar/source-map" "~1.9.0"
|
||||||
"@vue/compiler-dom" "^3.3.0"
|
"@vue/compiler-dom" "^3.3.0"
|
||||||
"@vue/reactivity" "^3.3.0"
|
"@vue/reactivity" "^3.3.0"
|
||||||
"@vue/shared" "^3.3.0"
|
"@vue/shared" "^3.3.0"
|
||||||
@ -723,13 +723,13 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0"
|
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0"
|
||||||
integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==
|
integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==
|
||||||
|
|
||||||
"@vue/typescript@1.8.4":
|
"@vue/typescript@1.8.6":
|
||||||
version "1.8.4"
|
version "1.8.6"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.4.tgz#01a976f731acaf9fd3166fa9374a44da0bca05dc"
|
resolved "https://registry.yarnpkg.com/@vue/typescript/-/typescript-1.8.6.tgz#ba116a7b52c974ac6f08d5ad10799acee4fbf073"
|
||||||
integrity sha512-sioQfIY5xcmEAz+cPLvv6CtzGPtGhIdR0Za87zB8M4mPe4OSsE3MBGkXcslf+EzQgF+fm6Gr1SRMSX8r5ZmzDA==
|
integrity sha512-sDQ5tltrSVS3lAkE3JtMRGJo91CLIxcWPy7yms/DT+ssxXpwxbVRD5Gok68HenEZBA4Klq7nW99sG/nTRnpPuQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@volar/typescript" "~1.8.0"
|
"@volar/typescript" "~1.9.0"
|
||||||
"@vue/language-core" "1.8.4"
|
"@vue/language-core" "1.8.6"
|
||||||
|
|
||||||
acorn-jsx@^5.2.0, acorn-jsx@^5.3.2:
|
acorn-jsx@^5.2.0, acorn-jsx@^5.3.2:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
@ -1158,10 +1158,10 @@ eslint-visitor-keys@^3.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
|
||||||
integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
|
integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
|
||||||
|
|
||||||
eslint@^8.44.0:
|
eslint@^8.45.0:
|
||||||
version "8.44.0"
|
version "8.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78"
|
||||||
integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==
|
integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@eslint-community/eslint-utils" "^4.2.0"
|
"@eslint-community/eslint-utils" "^4.2.0"
|
||||||
"@eslint-community/regexpp" "^4.4.0"
|
"@eslint-community/regexpp" "^4.4.0"
|
||||||
@ -1188,7 +1188,6 @@ eslint@^8.44.0:
|
|||||||
globals "^13.19.0"
|
globals "^13.19.0"
|
||||||
graphemer "^1.4.0"
|
graphemer "^1.4.0"
|
||||||
ignore "^5.2.0"
|
ignore "^5.2.0"
|
||||||
import-fresh "^3.0.0"
|
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
is-glob "^4.0.0"
|
is-glob "^4.0.0"
|
||||||
is-path-inside "^3.0.3"
|
is-path-inside "^3.0.3"
|
||||||
@ -1200,7 +1199,6 @@ eslint@^8.44.0:
|
|||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
optionator "^0.9.3"
|
optionator "^0.9.3"
|
||||||
strip-ansi "^6.0.1"
|
strip-ansi "^6.0.1"
|
||||||
strip-json-comments "^3.1.0"
|
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
|
|
||||||
espree@^6.0.0:
|
espree@^6.0.0:
|
||||||
@ -1532,7 +1530,7 @@ immutable@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
|
resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
|
||||||
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
|
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
|
||||||
|
|
||||||
import-fresh@^3.0.0, import-fresh@^3.2.1:
|
import-fresh@^3.2.1:
|
||||||
version "3.3.0"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
|
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
|
||||||
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
|
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
|
||||||
@ -2091,10 +2089,10 @@ postcss@^8.1.10:
|
|||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
source-map-js "^1.0.2"
|
source-map-js "^1.0.2"
|
||||||
|
|
||||||
postcss@^8.4.25:
|
postcss@^8.4.26:
|
||||||
version "8.4.25"
|
version "8.4.27"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057"
|
||||||
integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==
|
integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid "^3.3.6"
|
nanoid "^3.3.6"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
@ -2194,10 +2192,10 @@ safe-regex-test@^1.0.0:
|
|||||||
get-intrinsic "^1.1.3"
|
get-intrinsic "^1.1.3"
|
||||||
is-regex "^1.1.4"
|
is-regex "^1.1.4"
|
||||||
|
|
||||||
sass@^1.63.6:
|
sass@^1.64.1:
|
||||||
version "1.63.6"
|
version "1.64.1"
|
||||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.6.tgz#481610e612902e0c31c46b46cf2dad66943283ea"
|
resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf"
|
||||||
integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==
|
integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
chokidar ">=3.0.0 <4.0.0"
|
chokidar ">=3.0.0 <4.0.0"
|
||||||
immutable "^4.0.0"
|
immutable "^4.0.0"
|
||||||
@ -2368,7 +2366,7 @@ strip-bom@^3.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
|
||||||
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
|
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
|
||||||
|
|
||||||
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
|
strip-json-comments@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
|
||||||
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
|
||||||
@ -2392,10 +2390,10 @@ supports-preserve-symlinks-flag@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
||||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||||
|
|
||||||
terser@^5.19.0:
|
terser@^5.19.2:
|
||||||
version "5.19.0"
|
version "5.19.2"
|
||||||
resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.0.tgz#7b3137b01226bdd179978207b9c8148754a6da9c"
|
resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e"
|
||||||
integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==
|
integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@jridgewell/source-map" "^0.3.3"
|
"@jridgewell/source-map" "^0.3.3"
|
||||||
acorn "^8.8.2"
|
acorn "^8.8.2"
|
||||||
@ -2509,18 +2507,18 @@ vite-plugin-compression@^0.5.1:
|
|||||||
debug "^4.3.3"
|
debug "^4.3.3"
|
||||||
fs-extra "^10.0.0"
|
fs-extra "^10.0.0"
|
||||||
|
|
||||||
vite-plugin-css-injected-by-js@^3.2.0:
|
vite-plugin-css-injected-by-js@^3.2.1:
|
||||||
version "3.2.0"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.2.0.tgz#0e0fa1de9281a918f9945bc6401b46f7d396d7f9"
|
resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-3.2.1.tgz#c23e10e28a1afb78414fa3c162ac8a253cd1a6a4"
|
||||||
integrity sha512-a6MtYm/qfswVCtLezzzKJWL2ZpxrXXQd6/1UHy0t/G0IILHl4GG6n4OprbcC93aXIwkeS19JNbuKWD0Xt+pZtg==
|
integrity sha512-8UQWy7tcmgwkaUKYfbj/8GOeAD0RPG2tdetAGg7WikWC8IEtNrovs8RRuLjFqdRqORT1XxchBB5tPl6xO/H95g==
|
||||||
|
|
||||||
vite@^4.4.3:
|
vite@^4.4.6:
|
||||||
version "4.4.3"
|
version "4.4.6"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.3.tgz#dfaf86f4cba3058bf2724e2e2c88254fb0f21a5a"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.6.tgz#97a0a43868ec773fd88980d7c323c80233521cf1"
|
||||||
integrity sha512-IMnXQXXWgLi5brBQx/4WzDxdzW0X3pjO4nqFJAuNvwKtxzAmPzFE1wszW3VDpAGQJm3RZkm/brzRdyGsnwgJIA==
|
integrity sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.18.10"
|
esbuild "^0.18.10"
|
||||||
postcss "^8.4.25"
|
postcss "^8.4.26"
|
||||||
rollup "^3.25.2"
|
rollup "^3.25.2"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
@ -2576,13 +2574,13 @@ vue-template-compiler@^2.7.14:
|
|||||||
de-indent "^1.0.2"
|
de-indent "^1.0.2"
|
||||||
he "^1.2.0"
|
he "^1.2.0"
|
||||||
|
|
||||||
vue-tsc@^1.8.4:
|
vue-tsc@^1.8.6:
|
||||||
version "1.8.4"
|
version "1.8.6"
|
||||||
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.4.tgz#8087d7b34e7f0ead5896b83783c32c1a99d850fa"
|
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.8.6.tgz#c25ffc3fa6b8f6d8abe394d580ab65abe3d009c7"
|
||||||
integrity sha512-+hgpOhIx11vbi8/AxEdaPj3fiRwN9wy78LpsNNw2V995/IWa6TMyQxHbaw2ZKUpdwjySSHgrT6ohDEhUgFxGYw==
|
integrity sha512-8ffD4NGfwyATjw/s40Lw2EgB7L2/PAqnGlJBaVQLgblr3SU4EYdhJ67TNXXuDD8NMbDAFSM24V8i3ZIJgTs32Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@vue/language-core" "1.8.4"
|
"@vue/language-core" "1.8.6"
|
||||||
"@vue/typescript" "1.8.4"
|
"@vue/typescript" "1.8.6"
|
||||||
semver "^7.3.8"
|
semver "^7.3.8"
|
||||||
|
|
||||||
vue@^3.3.4:
|
vue@^3.3.4:
|
||||||
|
|||||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user