diff --git a/include/Configuration.h b/include/Configuration.h index 3fb78e8a..d979f815 100644 --- a/include/Configuration.h +++ b/include/Configuration.h @@ -83,6 +83,7 @@ struct CONFIG_T { byte WiFi_Dns2[4]; bool WiFi_Dhcp; char WiFi_Hostname[WIFI_MAX_HOSTNAME_STRLEN + 1]; + uint WiFi_ApTimeout; char Ntp_Server[NTP_MAX_SERVER_STRLEN + 1]; char Ntp_Timezone[NTP_MAX_TIMEZONE_STRLEN + 1]; @@ -92,6 +93,7 @@ struct CONFIG_T { uint8_t Ntp_SunsetType; bool Mqtt_Enabled; + char Mqtt_Hostname[MQTT_MAX_HOSTNAME_STRLEN + 1]; bool Mqtt_VerboseLogging; uint Mqtt_Port; char Mqtt_Username[MQTT_MAX_USERNAME_STRLEN + 1]; @@ -116,6 +118,8 @@ struct CONFIG_T { bool Mqtt_Hass_Retain; char Mqtt_Hass_Topic[MQTT_MAX_TOPIC_STRLEN + 1]; bool Mqtt_Hass_IndividualPanels; + bool Mqtt_Hass_Expire; + bool Mqtt_Tls; char Mqtt_RootCaCert[MQTT_MAX_CERT_STRLEN + 1]; bool Mqtt_TlsCertLogin; @@ -125,9 +129,13 @@ struct CONFIG_T { bool Vedirect_Enabled; 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_VerboseLogging; diff --git a/include/NetworkSettings.h b/include/NetworkSettings.h index 507167b0..87c8dce9 100644 --- a/include/NetworkSettings.h +++ b/include/NetworkSettings.h @@ -64,6 +64,7 @@ private: bool adminEnabled = true; bool forceDisconnection = false; int adminTimeoutCounter = 0; + int adminTimeoutCounterMax = 0; int connectTimeoutTimer = 0; int connectRedoTimer = 0; uint32_t lastTimerCall = 0; diff --git a/include/WebApi.h b/include/WebApi.h index e3af5cf6..0084258e 100644 --- a/include/WebApi.h +++ b/include/WebApi.h @@ -3,11 +3,11 @@ #include "WebApi_battery.h" #include "WebApi_config.h" +#include "WebApi_device.h" #include "WebApi_devinfo.h" #include "WebApi_dtu.h" #include "WebApi_eventlog.h" #include "WebApi_firmware.h" -#include "WebApi_device.h" #include "WebApi_inverter.h" #include "WebApi_limit.h" #include "WebApi_maintenance.h" diff --git a/include/WebApi_errors.h b/include/WebApi_errors.h index 8107840d..ac91941e 100644 --- a/include/WebApi_errors.h +++ b/include/WebApi_errors.h @@ -63,6 +63,7 @@ enum WebApiError { NetworkGatewayInvalid, NetworkDns1Invalid, NetworkDns2Invalid, + NetworkApTimeoutInvalid, NtpBase = 9000, NtpServerLength, diff --git a/include/defaults.h b/include/defaults.h index 3ef2c8b4..8e561b49 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -9,10 +9,10 @@ #define ACCESS_POINT_NAME "OpenDTU-" #define ACCESS_POINT_PASSWORD "openDTU42" +#define ACCESS_POINT_TIMEOUT 3; #define AUTH_USERNAME "admin" #define SECURITY_ALLOW_READONLY true -#define ADMIN_TIMEOUT 180 #define WIFI_RECONNECT_TIMEOUT 15 #define WIFI_RECONNECT_REDO_TIMEOUT 600 @@ -25,11 +25,11 @@ #define NTP_TIMEZONEDESCR "Europe/Berlin" #define NTP_LONGITUDE 10.4515f #define NTP_LATITUDE 51.1657f -#define NTP_SUNSETTYPE 1 +#define NTP_SUNSETTYPE 1U #define MQTT_ENABLED false #define MQTT_HOST "" -#define MQTT_PORT 1883 +#define MQTT_PORT 1883U #define MQTT_USER "" #define MQTT_PASSWORD "" #define MQTT_TOPIC "solar/" @@ -73,13 +73,13 @@ #define MQTT_LWT_TOPIC "dtu/status" #define MQTT_LWT_ONLINE "online" #define MQTT_LWT_OFFLINE "offline" -#define MQTT_PUBLISH_INTERVAL 5 +#define MQTT_PUBLISH_INTERVAL 5U -#define DTU_SERIAL 0x99978563412 -#define DTU_POLL_INTERVAL 5 -#define DTU_NRF_PA_LEVEL 0 +#define DTU_SERIAL 0x99978563412U +#define DTU_POLL_INTERVAL 5U +#define DTU_NRF_PA_LEVEL 0U #define DTU_CMT_PA_LEVEL 0 -#define DTU_CMT_FREQUENCY 865000 +#define DTU_CMT_FREQUENCY 865000U #define MQTT_HASS_ENABLED false #define MQTT_HASS_EXPIRE true @@ -91,9 +91,9 @@ #define DISPLAY_POWERSAFE true #define DISPLAY_SCREENSAVER true -#define DISPLAY_ROTATION 2 -#define DISPLAY_CONTRAST 60 -#define DISPLAY_LANGUAGE 0 +#define DISPLAY_ROTATION 2U +#define DISPLAY_CONTRAST 60U +#define DISPLAY_LANGUAGE 0U #define VEDIRECT_ENABLED false #define VEDIRECT_UPDATESONLY true diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 3263c50c..c6300e4f 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -1,8 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include "HoymilesRadio_NRF.h" #include "HoymilesRadio_CMT.h" +#include "HoymilesRadio_NRF.h" #include "inverters/InverterAbstract.h" #include "types.h" #include diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp index bf4b04de..78bcd55e 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp @@ -35,11 +35,11 @@ void ActivePowerControlCommand::setActivePowerLimit(float limit, PowerLimitContr // limit _payload[12] = (l >> 8) & 0xff; - _payload[13] = (l) & 0xff; + _payload[13] = (l)&0xff; // type _payload[14] = (type >> 8) & 0xff; - _payload[15] = (type) & 0xff; + _payload[15] = (type)&0xff; udpateCRC(CRC_SIZE); } diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.cpp b/lib/Hoymiles/src/parser/AlarmLogParser.cpp index 3e1dc664..536c412d 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.cpp +++ b/lib/Hoymiles/src/parser/AlarmLogParser.cpp @@ -6,7 +6,7 @@ #include "../Hoymiles.h" #include -const std::array AlarmLogParser::_alarmMessages = {{ +const std::array AlarmLogParser::_alarmMessages = { { { AlarmMessageType_t::ALL, 1, "Inverter start" }, { AlarmMessageType_t::ALL, 2, "DTU command failed" }, { AlarmMessageType_t::ALL, 73, "Temperature >80°C" }, // https://github.com/tbnobody/OpenDTU/discussions/590#discussioncomment-6049750 @@ -84,7 +84,7 @@ const std::array AlarmLogParser::_alarmMe { AlarmMessageType_t::ALL, 5200, "Firmware error" }, { AlarmMessageType_t::ALL, 8310, "Shut down" }, { AlarmMessageType_t::ALL, 9000, "Microinverter is suspected of being stolen" }, -}}; +} }; void AlarmLogParser::clearBuffer() { diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.h b/lib/Hoymiles/src/parser/AlarmLogParser.h index 0286db15..5e5faf87 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.h +++ b/lib/Hoymiles/src/parser/AlarmLogParser.h @@ -2,8 +2,8 @@ #pragma once #include "Parser.h" #include -#include #include +#include #define ALARM_LOG_ENTRY_COUNT 15 #define ALARM_LOG_ENTRY_SIZE 12 diff --git a/platformio.ini b/platformio.ini index e60dc055..de646ffb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,7 +35,7 @@ lib_deps = bblanchon/ArduinoJson @ ^6.21.2 https://github.com/bertmelis/espMqttClient.git#v1.4.4 nrf24/RF24 @ ^1.4.7 - olikraus/U8g2 @ ^2.34.22 + olikraus/U8g2 @ ^2.35.3 buelowp/sunset @ ^1.1.7 https://github.com/coryjfowler/MCP_CAN_lib plerup/EspSoftwareSerial@^8.0.1 @@ -68,6 +68,7 @@ board = esp32-c3-devkitc-02 custom_patches = esp32c3 build_flags = ${env.build_flags} + [env:generic_esp32c3_usb] board = esp32-c3-devkitc-02 custom_patches = esp32c3 @@ -75,6 +76,7 @@ build_flags = ${env.build_flags} -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 + [env:generic_esp32s3] board = esp32-s3-devkitc-1 build_flags = ${env.build_flags} diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 2822b864..6389a490 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -39,6 +39,7 @@ bool ConfigurationClass::write() wifi["dns2"] = IPAddress(config.WiFi_Dns2).toString(); wifi["dhcp"] = config.WiFi_Dhcp; wifi["hostname"] = config.WiFi_Hostname; + wifi["aptimeout"] = config.WiFi_ApTimeout; JsonObject ntp = doc.createNestedObject("ntp"); ntp["server"] = config.Ntp_Server; @@ -252,6 +253,7 @@ bool ConfigurationClass::read() config.WiFi_Dns2[3] = wifi_dns2[3]; config.WiFi_Dhcp = wifi["dhcp"] | WIFI_DHCP; + config.WiFi_ApTimeout = wifi["aptimeout"] | ACCESS_POINT_TIMEOUT; JsonObject ntp = doc["ntp"]; 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"]; } - if (config.Cfg_Version < 0x00011900) { + if (config.Cfg_Version < 0x00011900) { JsonObject dtu = doc["dtu"]; config.Dtu_NrfPaLevel = dtu["pa_level"]; } diff --git a/src/InverterSettings.cpp b/src/InverterSettings.cpp index 6da78290..10c6ca2e 100644 --- a/src/InverterSettings.cpp +++ b/src/InverterSettings.cpp @@ -15,7 +15,7 @@ // 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 // 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 #elif CONFIG_IDF_TARGET_ESP32C3 #define SPI_NRF FSPI diff --git a/src/MqttSettings.cpp b/src/MqttSettings.cpp index 1382aeac..ccf6ca81 100644 --- a/src/MqttSettings.cpp +++ b/src/MqttSettings.cpp @@ -3,8 +3,8 @@ * Copyright (C) 2022 Thomas Basler and others */ #include "MqttSettings.h" -#include "MessageOutput.h" #include "Configuration.h" +#include "MessageOutput.h" MqttSettingsClass::MqttSettingsClass() { diff --git a/src/NetworkSettings.cpp b/src/NetworkSettings.cpp index 69c41e81..e0957545 100644 --- a/src/NetworkSettings.cpp +++ b/src/NetworkSettings.cpp @@ -21,6 +21,9 @@ void NetworkSettingsClass::init() { 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)); setupMode(); } @@ -121,11 +124,7 @@ void NetworkSettingsClass::setupMode() dnsServer->stop(); dnsServerStatus = false; if (_networkMode == network_mode::WiFi) { - /* // TODO (helge) check if this makes problems to connect to the ap - WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); - WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); - */ - WiFi.mode(WIFI_STA); + WiFi.mode(WIFI_STA); } else { WiFi.mode(WIFI_MODE_NULL); } @@ -141,6 +140,7 @@ void NetworkSettingsClass::enableAdminMode() { adminEnabled = true; adminTimeoutCounter = 0; + adminTimeoutCounterMax = Configuration.get().WiFi_ApTimeout * 60; setupMode(); } @@ -160,8 +160,7 @@ void NetworkSettingsClass::loop() setStaticIp(); setHostname(); } - } else - if (_networkMode != network_mode::WiFi) { + } else if (_networkMode != network_mode::WiFi) { // Do stuff when switching to Ethernet mode MessageOutput.println("Switch to WiFi mode"); _networkMode = network_mode::WiFi; @@ -170,7 +169,12 @@ void NetworkSettingsClass::loop() } 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++; connectRedoTimer++; lastTimerCall = millis(); @@ -180,9 +184,9 @@ void NetworkSettingsClass::loop() if (!isConnected()) { 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 - if (adminTimeoutCounter > ADMIN_TIMEOUT) { + if (adminTimeoutCounter > adminTimeoutCounterMax) { adminEnabled = false; MessageOutput.println("Admin mode disabled"); setupMode(); @@ -250,8 +254,7 @@ void NetworkSettingsClass::setHostname() WiFi.mode(WIFI_MODE_APSTA); WiFi.mode(WIFI_MODE_STA); setupMode(); - } - else if (_networkMode == network_mode::Ethernet) { + } else if (_networkMode == network_mode::Ethernet) { if (ETH.setHostname(getHostname().c_str())) { MessageOutput.println("done"); } else { @@ -277,8 +280,7 @@ void NetworkSettingsClass::setStaticIp() IPAddress(Configuration.get().WiFi_Dns2)); MessageOutput.println("done"); } - } - else if (_networkMode == network_mode::Ethernet) { + } else if (_networkMode == network_mode::Ethernet) { if (Configuration.get().WiFi_Dhcp) { MessageOutput.print("Configuring Ethernet DHCP IP... "); ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); diff --git a/src/PinMapping.cpp b/src/PinMapping.cpp index 65552a07..02761513 100644 --- a/src/PinMapping.cpp +++ b/src/PinMapping.cpp @@ -11,23 +11,23 @@ #define JSON_BUFFER_SIZE 6144 #ifndef DISPLAY_TYPE -#define DISPLAY_TYPE 0 +#define DISPLAY_TYPE 0U #endif #ifndef DISPLAY_DATA -#define DISPLAY_DATA 255 +#define DISPLAY_DATA 255U #endif #ifndef DISPLAY_CLK -#define DISPLAY_CLK 255 +#define DISPLAY_CLK 255U #endif #ifndef DISPLAY_CS -#define DISPLAY_CS 255 +#define DISPLAY_CS 255U #endif #ifndef DISPLAY_RESET -#define DISPLAY_RESET 255 +#define DISPLAY_RESET 255U #endif #ifndef LED0 diff --git a/src/WebApi_device.cpp b/src/WebApi_device.cpp index 0e7f114e..ab7d7bfb 100644 --- a/src/WebApi_device.cpp +++ b/src/WebApi_device.cpp @@ -141,7 +141,8 @@ void WebApiDeviceClass::onDeviceAdminPost(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("curPin") || root.containsKey("display"))) { + if (!(root.containsKey("curPin") + || root.containsKey("display"))) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; response->setLength(); diff --git a/src/WebApi_dtu.cpp b/src/WebApi_dtu.cpp index bf594c9d..844b4000 100644 --- a/src/WebApi_dtu.cpp +++ b/src/WebApi_dtu.cpp @@ -90,12 +90,12 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("serial") && - root.containsKey("pollinterval") && - root.containsKey("verbose_logging") && - root.containsKey("nrf_palevel") && - root.containsKey("cmt_palevel") && - root.containsKey("cmt_frequency"))) { + if (!(root.containsKey("serial") + && root.containsKey("pollinterval") + && root.containsKey("verbose_logging") + && root.containsKey("nrf_palevel") + && root.containsKey("cmt_palevel") + && root.containsKey("cmt_frequency"))) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; response->setLength(); diff --git a/src/WebApi_inverter.cpp b/src/WebApi_inverter.cpp index 495b5fac..a8165925 100644 --- a/src/WebApi_inverter.cpp +++ b/src/WebApi_inverter.cpp @@ -121,7 +121,8 @@ void WebApiInverterClass::onInverterAdd(AsyncWebServerRequest* request) return; } - if (!(root.containsKey("serial") && root.containsKey("name"))) { + if (!(root.containsKey("serial") + && root.containsKey("name"))) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; response->setLength(); @@ -443,7 +444,7 @@ void WebApiInverterClass::onInverterOrder(AsyncWebServerRequest* request) // The order array contains list or id in the right order JsonArray orderArray = root["order"].as(); uint8_t order = 0; - for(JsonVariant id : orderArray) { + for (JsonVariant id : orderArray) { uint8_t inverter_id = id.as(); if (inverter_id < INV_MAX_COUNT) { INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id]; diff --git a/src/WebApi_mqtt.cpp b/src/WebApi_mqtt.cpp index 6304ba8c..fbf9fabf 100644 --- a/src/WebApi_mqtt.cpp +++ b/src/WebApi_mqtt.cpp @@ -228,8 +228,8 @@ void WebApiMqttClass::onMqttAdminPost(AsyncWebServerRequest* request) } if (root["mqtt_root_ca_cert"].as().length() > MQTT_MAX_CERT_STRLEN - || root["mqtt_client_cert"].as().length() > MQTT_MAX_CERT_STRLEN - || root["mqtt_client_key"].as().length() > MQTT_MAX_CERT_STRLEN) { + || root["mqtt_client_cert"].as().length() > MQTT_MAX_CERT_STRLEN + || root["mqtt_client_key"].as().length() > MQTT_MAX_CERT_STRLEN) { retMsg["message"] = "Certificates must not be longer than " STR(MQTT_MAX_CERT_STRLEN) " characters!"; retMsg["code"] = WebApiError::MqttCertificateLength; retMsg["param"]["max"] = MQTT_MAX_CERT_STRLEN; diff --git a/src/WebApi_network.cpp b/src/WebApi_network.cpp index 1226917f..9c05e7cc 100644 --- a/src/WebApi_network.cpp +++ b/src/WebApi_network.cpp @@ -75,6 +75,7 @@ void WebApiNetworkClass::onNetworkAdminGet(AsyncWebServerRequest* request) root["dns2"] = IPAddress(config.WiFi_Dns2).toString(); root["ssid"] = config.WiFi_Ssid; root["password"] = config.WiFi_Password; + root["aptimeout"] = config.WiFi_ApTimeout; response->setLength(); request->send(response); @@ -119,7 +120,16 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) 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["code"] = WebApiError::GenericValueMissing; response->setLength(); @@ -188,6 +198,13 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) request->send(response); return; } + if (root["aptimeout"].as() > 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.WiFi_Ip[0] = ipaddress[0]; @@ -218,6 +235,7 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) } else { config.WiFi_Dhcp = false; } + config.WiFi_ApTimeout = root["aptimeout"].as(); Configuration.write(); retMsg["type"] = "success"; diff --git a/src/WebApi_ntp.cpp b/src/WebApi_ntp.cpp index 67b30851..52c665e2 100644 --- a/src/WebApi_ntp.cpp +++ b/src/WebApi_ntp.cpp @@ -133,7 +133,11 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request) 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["code"] = WebApiError::GenericValueMissing; response->setLength(); diff --git a/src/WebApi_power.cpp b/src/WebApi_power.cpp index 6be68a88..ca792364 100644 --- a/src/WebApi_power.cpp +++ b/src/WebApi_power.cpp @@ -90,7 +90,8 @@ void WebApiPowerClass::onPowerPost(AsyncWebServerRequest* request) } if (!(root.containsKey("serial") - && (root.containsKey("power") || root.containsKey("restart")))) { + && (root.containsKey("power") + || root.containsKey("restart")))) { retMsg["message"] = "Values are missing!"; retMsg["code"] = WebApiError::GenericValueMissing; response->setLength(); diff --git a/src/WebApi_prometheus.cpp b/src/WebApi_prometheus.cpp index 21c115fb..dbb93053 100644 --- a/src/WebApi_prometheus.cpp +++ b/src/WebApi_prometheus.cpp @@ -144,8 +144,7 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se idx, inv->name(), channel, - config.Inverter[idx].channel[channel].Name - ); + config.Inverter[idx].channel[channel].Name); if (printHelp) { stream->print("# HELP opendtu_MaxPower panel maximum output power\n"); @@ -156,8 +155,7 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se idx, inv->name(), channel, - config.Inverter[idx].channel[channel].MaxChannelPower - ); + config.Inverter[idx].channel[channel].MaxChannelPower); if (printHelp) { stream->print("# HELP opendtu_YieldTotalOffset panel yield offset (for used inverters)\n"); @@ -168,6 +166,5 @@ void WebApiPrometheusClass::addPanelInfo(AsyncResponseStream* stream, String& se idx, inv->name(), channel, - config.Inverter[idx].channel[channel].YieldTotalOffset - ); + config.Inverter[idx].channel[channel].YieldTotalOffset); } diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index fd42da5c..90516ad6 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -58,7 +58,7 @@ void WebApiWebappClass::init(AsyncWebServer* server) #ifdef AUTO_GIT_HASH // check client If-None-Match header vs ETag/AUTO_GIT_HASH bool eTagMatch = false; - if(request->hasHeader("If-None-Match")){ + if (request->hasHeader("If-None-Match")) { AsyncWebHeader* h = request->getHeader("If-None-Match"); if (strncmp(AUTO_GIT_HASH, h->value().c_str(), strlen(AUTO_GIT_HASH)) == 0) { eTagMatch = true; diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 5f9fbe41..8488e699 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -175,9 +175,7 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) JsonObject hintObj = root.createNestedObject("hints"); struct tm timeinfo; hintObj["time_sync"] = !getLocalTime(&timeinfo, 5); - hintObj["radio_problem"] = - (Hoymiles.getRadioNrf()->isInitialized() && (!Hoymiles.getRadioNrf()->isConnected() || !Hoymiles.getRadioNrf()->isPVariant())) || - (Hoymiles.getRadioCmt()->isInitialized() && (!Hoymiles.getRadioCmt()->isConnected())); + hintObj["radio_problem"] = (Hoymiles.getRadioNrf()->isInitialized() && (!Hoymiles.getRadioNrf()->isConnected() || !Hoymiles.getRadioNrf()->isPVariant())) || (Hoymiles.getRadioCmt()->isInitialized() && (!Hoymiles.getRadioCmt()->isConnected())); if (!strcmp(Configuration.get().Security_Password, ACCESS_POINT_PASSWORD)) { hintObj["default_password"] = true; } else { diff --git a/webapp/package.json b/webapp/package.json index e9f6b5a1..2c23379d 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -26,21 +26,21 @@ "@rushstack/eslint-patch": "^1.3.2", "@tsconfig/node18": "^18.2.0", "@types/bootstrap": "^5.2.6", - "@types/node": "^20.4.1", + "@types/node": "^20.4.4", "@types/sortablejs": "^1.15.1", "@types/spark-md5": "^3.0.2", "@vitejs/plugin-vue": "^4.2.3", "@vue/eslint-config-typescript": "^11.0.3", "@vue/tsconfig": "^0.4.0", - "eslint": "^8.44.0", + "eslint": "^8.45.0", "eslint-plugin-vue": "^9.15.1", "npm-run-all": "^4.1.5", - "sass": "^1.63.6", - "terser": "^5.19.0", + "sass": "^1.64.1", + "terser": "^5.19.2", "typescript": "^5.1.6", - "vite": "^4.4.3", + "vite": "^4.4.6", "vite-plugin-compression": "^0.5.1", - "vite-plugin-css-injected-by-js": "^3.2.0", - "vue-tsc": "^1.8.4" + "vite-plugin-css-injected-by-js": "^3.2.1", + "vue-tsc": "^1.8.6" } } diff --git a/webapp/src/components/PinInfo.vue b/webapp/src/components/PinInfo.vue index bb140035..af7e788c 100644 --- a/webapp/src/components/PinInfo.vue +++ b/webapp/src/components/PinInfo.vue @@ -17,11 +17,11 @@ {{ capitalizeFirstLetter(category) }} {{ prop }} -