mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
@@ -355,7 +355,7 @@ const DashboardData: FC = () => {
|
|||||||
if (sc === '' || sc === '""') {
|
if (sc === '' || sc === '""') {
|
||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
if (sc.includes('"') || sc.includes(',') || sc.includes('\n') || sc.includes('\r')) {
|
if (sc.includes('"') || sc.includes(';') || sc.includes('\n') || sc.includes('\r')) {
|
||||||
return '"' + sc.replace(/"/g, '""') + '"';
|
return '"' + sc.replace(/"/g, '""') + '"';
|
||||||
}
|
}
|
||||||
return sc;
|
return sc;
|
||||||
@@ -363,13 +363,13 @@ const DashboardData: FC = () => {
|
|||||||
|
|
||||||
const makeCsvData = (columns: any, data: any) => {
|
const makeCsvData = (columns: any, data: any) => {
|
||||||
return data.reduce((csvString: any, rowItem: any) => {
|
return data.reduce((csvString: any, rowItem: any) => {
|
||||||
return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(',') + '\r\n';
|
return csvString + columns.map(({ accessor }: any) => escapeCsvCell(accessor(rowItem))).join(';') + '\r\n';
|
||||||
}, columns.map(({ name }: any) => escapeCsvCell(name)).join(',') + '\r\n');
|
}, columns.map(({ name }: any) => escapeCsvCell(name)).join(';') + '\r\n');
|
||||||
};
|
};
|
||||||
|
|
||||||
const downloadAsCsv = (columns: any, data: any, filename: string) => {
|
const downloadAsCsv = (columns: any, data: any, filename: string) => {
|
||||||
const csvData = makeCsvData(columns, data);
|
const csvData = makeCsvData(columns, data);
|
||||||
const csvFile = new Blob([csvData], { type: 'text/csv' });
|
const csvFile = new Blob([csvData], { type: 'text/csv;charset:utf-8' });
|
||||||
const downloadLink = document.createElement('a');
|
const downloadLink = document.createElement('a');
|
||||||
|
|
||||||
downloadLink.download = filename;
|
downloadLink.download = filename;
|
||||||
@@ -384,8 +384,8 @@ const DashboardData: FC = () => {
|
|||||||
const handleDownloadCsv = () => {
|
const handleDownloadCsv = () => {
|
||||||
const columns = [
|
const columns = [
|
||||||
{ accessor: (dv: any) => dv.id.slice(2), name: 'Entity' },
|
{ accessor: (dv: any) => dv.id.slice(2), name: 'Entity' },
|
||||||
{ accessor: (dv: any) => dv.v, name: 'Value' },
|
{ accessor: (dv: any) => (typeof dv.v === 'number') ? new Intl.NumberFormat().format(dv.v) : dv.v, name: 'Value' },
|
||||||
{ accessor: (dv: any) => (dv.u >= 1 && dv.u <= 2 ? 'C' : DeviceValueUOM_s[dv.u]), name: 'UoM' }
|
{ accessor: (dv: any) => DeviceValueUOM_s[dv.u], name: 'UoM' }
|
||||||
];
|
];
|
||||||
downloadAsCsv(
|
downloadAsCsv(
|
||||||
columns,
|
columns,
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ class DummySettings {
|
|||||||
String dnsIP1 = "";
|
String dnsIP1 = "";
|
||||||
String dnsIP2 = "";
|
String dnsIP2 = "";
|
||||||
bool enableIPv6 = false;
|
bool enableIPv6 = false;
|
||||||
|
bool enableMDNS = true;
|
||||||
|
|
||||||
uint8_t phy_type = 0;
|
uint8_t phy_type = 0;
|
||||||
uint8_t eth_power = 0; // 0 means -1
|
uint8_t eth_power = 0; // 0 means -1
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ class Shower {
|
|||||||
|
|
||||||
void set_shower_state(bool state, bool force = false);
|
void set_shower_state(bool state, bool force = false);
|
||||||
|
|
||||||
|
/* unused header
|
||||||
|
*
|
||||||
bool shower_alert() const {
|
bool shower_alert() const {
|
||||||
return shower_alert_;
|
return shower_alert_;
|
||||||
}
|
}
|
||||||
@@ -45,6 +47,7 @@ class Shower {
|
|||||||
void shower_timer(const bool shower_timer) {
|
void shower_timer(const bool shower_timer) {
|
||||||
shower_timer_ = shower_timer;
|
shower_timer_ = shower_timer;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uuid::log::Logger logger_;
|
static uuid::log::Logger logger_;
|
||||||
|
|||||||
@@ -1000,8 +1000,8 @@ bool System::command_settings(const char * value, const int8_t id, JsonObject &
|
|||||||
node["shower_timer"] = settings.shower_timer;
|
node["shower_timer"] = settings.shower_timer;
|
||||||
node["shower_alert"] = settings.shower_alert;
|
node["shower_alert"] = settings.shower_alert;
|
||||||
if (settings.shower_alert) {
|
if (settings.shower_alert) {
|
||||||
node["shower_alert_coldshot"] = settings.shower_alert_coldshot / 1000; // seconds
|
node["shower_alert_coldshot"] = settings.shower_alert_coldshot; // seconds
|
||||||
node["shower_alert_trigger"] = settings.shower_alert_trigger / 60000; // minutes
|
node["shower_alert_trigger"] = settings.shower_alert_trigger; // minutes
|
||||||
}
|
}
|
||||||
|
|
||||||
node["rx_gpio"] = settings.rx_gpio;
|
node["rx_gpio"] = settings.rx_gpio;
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) {
|
|||||||
// https://github.com/emsesp/EMS-ESP32/issues/462#issuecomment-1093877210
|
// https://github.com/emsesp/EMS-ESP32/issues/462#issuecomment-1093877210
|
||||||
if (output.containsKey("api_data")) {
|
if (output.containsKey("api_data")) {
|
||||||
JsonVariant data = output["api_data"];
|
JsonVariant data = output["api_data"];
|
||||||
request->send(200, "text/plain", data.as<String>());
|
request->send(200, "text/plain; charset=utf-8", data.as<String>());
|
||||||
api_count_++;
|
api_count_++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user