updates for #256

This commit is contained in:
Proddy
2022-05-08 14:58:41 +02:00
parent 0faa56f5ff
commit 1f933fb26a
3 changed files with 158 additions and 78 deletions

View File

@@ -40,6 +40,7 @@
- API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462) - API fetch individual attributes from an entity [#462](https://github.com/emsesp/EMS-ESP32/issues/462)
- Option to disable mDNS - Option to disable mDNS
- Option for rendering booleans on dashboard [#456](https://github.com/emsesp/EMS-ESP32/issues/456) - Option for rendering booleans on dashboard [#456](https://github.com/emsesp/EMS-ESP32/issues/456)
- Upload customization settings from a file [#256](https://github.com/emsesp/EMS-ESP32/issues/256)
### Fixed ### Fixed

View File

@@ -2,7 +2,7 @@ import { FC, useContext } from 'react';
import { Typography, Button, Box, List, ListItem, ListItemText, Link, ListItemAvatar } from '@mui/material'; import { Typography, Button, Box, List, ListItem, ListItemText, Link, ListItemAvatar } from '@mui/material';
import { SectionContent, ButtonRow } from '../components'; import { SectionContent, ButtonRow, MessageBox } from '../components';
import { AuthenticatedContext } from '../contexts/authentication'; import { AuthenticatedContext } from '../contexts/authentication';
@@ -102,9 +102,13 @@ const HelpInformation: FC = () => {
<GitHubIcon /> <GitHubIcon />
</ListItemAvatar> </ListItemAvatar>
<ListItemText> <ListItemText>
To report an issue or request a feature, please do via&nbsp; To report an issue or request a feature, please&nbsp;
<Link component="button" variant="body1" onClick={() => onDownload('info')}>
download
</Link>
&nbsp;the debug information and include in a new&nbsp;
<Link target="_blank" href="https://github.com/emsesp/EMS-ESP32/issues/new/choose" color="primary"> <Link target="_blank" href="https://github.com/emsesp/EMS-ESP32/issues/new/choose" color="primary">
{'GitHub'} GitHub issue
</Link> </Link>
</ListItemText> </ListItemText>
</ListItem> </ListItem>
@@ -112,28 +116,15 @@ const HelpInformation: FC = () => {
{me.admin && ( {me.admin && (
<> <>
<Typography sx={{ pt: 2, pb: 1 }} variant="h6" color="primary"> <Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
Export Data Download Settings
</Typography> </Typography>
<Box color="warning.main"> <Box color="warning.main">
<Typography sx={{ pb: 1 }} variant="body2"> <Typography variant="body2">
Download the current system information to show EMS statistics and connected devices
</Typography>
</Box>
<Button startIcon={<DownloadIcon />} variant="outlined" color="secondary" onClick={() => onDownload('info')}>
system info
</Button>
<Box color="warning.main">
<Typography sx={{ pt: 2 }} variant="body2">
Export the application settings and any customizations to a JSON file. These files can later be uploaded Export the application settings and any customizations to a JSON file. These files can later be uploaded
via the System menu. via System&rarr;Upload.
</Typography>
<Typography sx={{ pt: 2 }} variant="body2">
Be careful when sharing the settings as the file contains passwords and other sensitive system
information.
</Typography> </Typography>
</Box> </Box>
<Box sx={{ display: 'flex' }}> <Box sx={{ display: 'flex' }}>
<ButtonRow> <ButtonRow>
<Button <Button
@@ -154,6 +145,12 @@ const HelpInformation: FC = () => {
</Button> </Button>
</ButtonRow> </ButtonRow>
</Box> </Box>
<MessageBox
my={2}
level="warning"
message="Be careful when sharing your Settings as the file contains passwords and other sensitive system
information!"
/>
</> </>
)} )}

View File

@@ -689,7 +689,7 @@ void System::commands_init() {
// these commands will return data in JSON format // these commands will return data in JSON format
Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, F("show system status")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(info), System::command_info, F("show system status"));
Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(settings), System::command_settings, F("fetch system settings"), CommandFlag::ADMIN_ONLY);
Command::add(EMSdevice::DeviceType::SYSTEM, F_(customizations), System::command_customizations, F("fetch system customizations")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(customizations), System::command_customizations, F("fetch system customizations"));
Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("fetch system commands")); Command::add(EMSdevice::DeviceType::SYSTEM, F_(commands), System::command_commands, F("fetch system commands"));
@@ -915,10 +915,7 @@ bool System::check_upgrade() {
reboot_required |= saveSettings(EMSESP_SETTINGS_FILE, "Settings", input); reboot_required |= saveSettings(EMSESP_SETTINGS_FILE, "Settings", input);
} else if (settings_type == "customizations") { } else if (settings_type == "customizations") {
// it's a customization file, just replace it and there's no need to reboot // it's a customization file, just replace it and there's no need to reboot
LOG_INFO(F("Applying new customizations")); saveSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", input);
new_file.close();
LITTLEFS.remove(EMSESP_CUSTOMIZATION_FILE);
LITTLEFS.rename(TEMP_FILENAME_PATH, EMSESP_CUSTOMIZATION_FILE);
return false; // no reboot required return false; // no reboot required
} else { } else {
LOG_ERROR(F("Unrecognized file uploaded")); LOG_ERROR(F("Unrecognized file uploaded"));
@@ -927,7 +924,7 @@ bool System::check_upgrade() {
LOG_ERROR(F("Unrecognized file uploaded, not json")); LOG_ERROR(F("Unrecognized file uploaded, not json"));
} }
// close (just in case) and remove the file // close (just in case) and remove the temp file
new_file.close(); new_file.close();
LITTLEFS.remove(TEMP_FILENAME_PATH); LITTLEFS.remove(TEMP_FILENAME_PATH);
} }
@@ -1011,36 +1008,26 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
JsonObject node; JsonObject node;
// System // System
node = output.createNestedObject("System"); node = output.createNestedObject("System Status");
node["version"] = EMSESP_APP_VERSION; node["version"] = EMSESP_APP_VERSION;
node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
node["uptime (seconds)"] = uuid::get_uptime_sec(); // node["uptime (seconds)"] = uuid::get_uptime_sec();
node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected";
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
node["freemem"] = ESP.getFreeHeap() / 1000L; // kilobytes node["freemem"] = ESP.getFreeHeap() / 1000L; // kilobytes
#endif #endif
node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1);
if (EMSESP::dallas_enabled()) {
node["temperature sensors"] = EMSESP::dallassensor_.no_sensors();
}
if (EMSESP::analog_enabled()) {
node["analog sensors"] = EMSESP::analogsensor_.no_sensors();
}
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
// Network // Network Status
node = output.createNestedObject("Network"); node = output.createNestedObject("Network Status");
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
node["connection"] = F("WiFi"); node["connection"] = F("WiFi");
node["hostname"] = WiFi.getHostname(); node["hostname"] = WiFi.getHostname();
node["SSID"] = WiFi.SSID(); // node["SSID"] = WiFi.SSID();
node["BSSID"] = WiFi.BSSIDstr(); // node["BSSID"] = WiFi.BSSIDstr();
node["RSSI"] = WiFi.RSSI(); node["RSSI"] = WiFi.RSSI();
node["MAC"] = WiFi.macAddress(); // node["MAC"] = WiFi.macAddress();
node["IPv4 address"] = uuid::printable_to_string(WiFi.localIP()) + "/" + uuid::printable_to_string(WiFi.subnetMask()); node["IPv4 address"] = uuid::printable_to_string(WiFi.localIP()) + "/" + uuid::printable_to_string(WiFi.subnetMask());
node["IPv4 gateway"] = uuid::printable_to_string(WiFi.gatewayIP()); node["IPv4 gateway"] = uuid::printable_to_string(WiFi.gatewayIP());
node["IPv4 nameserver"] = uuid::printable_to_string(WiFi.dnsIP()); node["IPv4 nameserver"] = uuid::printable_to_string(WiFi.dnsIP());
@@ -1057,18 +1044,111 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") { if (ETH.localIPv6().toString() != "0000:0000:0000:0000:0000:0000:0000:0000") {
node["IPv6 address"] = uuid::printable_to_string(ETH.localIPv6()); node["IPv6 address"] = uuid::printable_to_string(ETH.localIPv6());
} }
EMSESP::webSettingsService.read([&](WebSettings & settings) {
node["phy type"] = settings.phy_type;
node["eth power"] = settings.eth_power;
node["eth phy addr"] = settings.eth_phy_addr;
node["eth clock mode"] = settings.eth_clock_mode;
});
}
#endif
EMSESP::esp8266React.getNetworkSettingsService()->read([&](NetworkSettings & settings) {
node["static ip config"] = settings.staticIPConfig;
node["enable IPv6"] = settings.enableIPv6;
node["low bandwidth"] = settings.bandwidth20;
node["disable sleep"] = settings.nosleep;
});
EMSESP::esp8266React.getAPSettingsService()->read([&](APSettings & settings) {
const char * pM[] = {"always", "disconnected", "never"};
node["AP provision mode"] = pM[settings.provisionMode];
node["AP security"] = settings.password.length() ? "wpa2" : "open";
node["AP ssid"] = settings.ssid;
});
// NTP status
node = output.createNestedObject("NTP Status");
node["network time"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected";
EMSESP::esp8266React.getNTPSettingsService()->read([&](NTPSettings & settings) {
node["enabled"] = settings.enabled;
node["server"] = settings.server;
node["tz label"] = settings.tzLabel;
// node["tz format"] = settings.tzFormat;
});
// OTA status
node = output.createNestedObject("OTA Status");
EMSESP::esp8266React.getOTASettingsService()->read([&](OTASettings & settings) {
node["enabled"] = settings.enabled;
node["port"] = settings.port;
});
// MQTT Status
node = output.createNestedObject("MQTT Status");
node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected);
if (Mqtt::enabled()) {
node["MQTT publishes"] = Mqtt::publish_count();
node["MQTT publish fails"] = Mqtt::publish_fails();
}
EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & settings) {
node["enabled"] = settings.enabled;
node["client_id"] = settings.clientId;
node["keep alive"] = settings.keepAlive;
node["clean session"] = settings.cleanSession;
node["base"] = settings.base;
node["discovery prefix"] = settings.discovery_prefix;
node["nested format"] = settings.nested_format;
node["ha enabled"] = settings.ha_enabled;
node["mqtt qos"] = settings.mqtt_qos;
node["mqtt retain"] = settings.mqtt_retain;
node["publish time boiler"] = settings.publish_time_boiler;
node["publish time thermostat"] = settings.publish_time_thermostat;
node["publish time solar"] = settings.publish_time_solar;
node["publish time mixer"] = settings.publish_time_mixer;
node["publish time other"] = settings.publish_time_other;
node["publish time sensor"] = settings.publish_time_sensor;
node["publish single"] = settings.publish_single;
node["publish2command"] = settings.publish_single2cmd;
node["send response"] = settings.send_response;
});
// Syslog Status
node = output.createNestedObject("Syslog Status");
node["enabled"] = EMSESP::system_.syslog_enabled_;
#ifndef EMSESP_STANDALONE
if (EMSESP::system_.syslog_enabled_) {
node["syslog started"] = syslog_.started();
node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1];
node["syslog ip"] = syslog_.ip();
node["syslog queue"] = syslog_.queued();
} }
#endif #endif
// Status // Sensor Status
node = output.createNestedObject("Status"); node = output.createNestedObject("Sensor Status");
if (EMSESP::dallas_enabled()) {
node["temperature sensors"] = EMSESP::dallassensor_.no_sensors();
node["temperature sensor reads"] = EMSESP::dallassensor_.reads();
node["temperature sensor fails"] = EMSESP::dallassensor_.fails();
}
if (EMSESP::analog_enabled()) {
node["analog sensors"] = EMSESP::analogsensor_.no_sensors();
node["analog sensor reads"] = EMSESP::analogsensor_.reads();
node["analog sensor fails"] = EMSESP::analogsensor_.fails();
}
// API Status
node = output.createNestedObject("API Status");
node["API calls"] = WebAPIService::api_count();
node["API fails"] = WebAPIService::api_fails();
// EMS Bus Status
node = output.createNestedObject("Bus Status");
switch (EMSESP::bus_status()) { switch (EMSESP::bus_status()) {
case EMSESP::BUS_STATUS_OFFLINE: case EMSESP::BUS_STATUS_OFFLINE:
node["bus status"] = (F("disconnected")); node["bus status"] = (F("disconnected"));
break; break;
case EMSESP::BUS_STATUS_TX_ERRORS: case EMSESP::BUS_STATUS_TX_ERRORS:
node["bus status"] = (F("connected, tx issues - try a different tx-mode")); node["bus status"] = (F("connected, tx issues - try a different Tx Mode"));
break; break;
case EMSESP::BUS_STATUS_CONNECTED: case EMSESP::BUS_STATUS_CONNECTED:
node["bus status"] = (F("connected")); node["bus status"] = (F("connected"));
@@ -1077,7 +1157,6 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
node["bus status"] = (F("unknown")); node["bus status"] = (F("unknown"));
break; break;
} }
if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) { if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) {
node["bus protocol"] = EMSbus::is_ht3() ? F("HT3") : F("Buderus"); node["bus protocol"] = EMSbus::is_ht3() ? F("HT3") : F("Buderus");
node["bus telegrams received (rx)"] = EMSESP::rxservice_.telegram_count(); node["bus telegrams received (rx)"] = EMSESP::rxservice_.telegram_count();
@@ -1088,33 +1167,36 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
node["bus writes failed"] = EMSESP::txservice_.telegram_write_fail_count(); node["bus writes failed"] = EMSESP::txservice_.telegram_write_fail_count();
node["bus rx line quality"] = EMSESP::rxservice_.quality(); node["bus rx line quality"] = EMSESP::rxservice_.quality();
node["bus tx line quality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2; node["bus tx line quality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2;
if (Mqtt::enabled()) {
node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected);
node["MQTT publishes"] = Mqtt::publish_count();
node["MQTT publish fails"] = Mqtt::publish_fails();
} }
node["temperature sensors"] = EMSESP::dallassensor_.no_sensors();
if (EMSESP::dallas_enabled()) {
node["temperature sensor reads"] = EMSESP::dallassensor_.reads();
node["temperature sensor fails"] = EMSESP::dallassensor_.fails();
}
node["analog sensors"] = EMSESP::analogsensor_.no_sensors();
if (EMSESP::analog_enabled()) {
node["analog sensor reads"] = EMSESP::analogsensor_.reads();
node["analog sensor fails"] = EMSESP::analogsensor_.fails();
}
node["API calls"] = WebAPIService::api_count();
node["API fails"] = WebAPIService::api_fails();
#ifndef EMSESP_STANDALONE // Settings
if (EMSESP::system_.syslog_enabled_) { node = output.createNestedObject("Settings");
node["syslog started"] = syslog_.started(); EMSESP::webSettingsService.read([&](WebSettings & settings) {
node["syslog level"] = FL_(enum_syslog_level)[syslog_.log_level() + 1]; node["board profile"] = settings.board_profile;
node["syslog ip"] = syslog_.ip(); node["tx mode"] = settings.tx_mode;
node["syslog queue"] = syslog_.queued(); node["ems bus id"] = settings.ems_bus_id;
} node["shower timer"] = settings.shower_timer;
#endif node["shower alert"] = settings.shower_alert;
if (settings.shower_alert) {
node["shower alert coldshot"] = settings.shower_alert_coldshot; // seconds
node["shower alert trigger"] = settings.shower_alert_trigger; // minutes
} }
node["rx gpio"] = settings.rx_gpio;
node["tx gpio"] = settings.tx_gpio;
node["dallas gpio"] = settings.dallas_gpio;
node["pbutton gpio"] = settings.pbutton_gpio;
node["led gpio"] = settings.led_gpio;
node["hide led"] = settings.hide_led;
node["notoken api"] = settings.notoken_api;
node["readonly mode"] = settings.readonly_mode;
node["fahrenheit"] = settings.fahrenheit;
node["dallas parasite"] = settings.dallas_parasite;
node["bool format"] = settings.bool_format;
node["bool dashboard"] = settings.bool_dashboard;
node["enum format"] = settings.enum_format;
node["analog enabled"] = settings.analog_enabled;
node["telnet enabled"] = settings.telnet_enabled;
});
// Devices - show EMS devices // Devices - show EMS devices
JsonArray devices = output.createNestedArray("Devices"); JsonArray devices = output.createNestedArray("Devices");