diff --git a/interface/src/framework/system/SystemStatusForm.tsx b/interface/src/framework/system/SystemStatusForm.tsx index ae4414baf..e5eed6246 100644 --- a/interface/src/framework/system/SystemStatusForm.tsx +++ b/interface/src/framework/system/SystemStatusForm.tsx @@ -86,8 +86,10 @@ const SystemStatusForm: FC = () => { const restart = async () => { setProcessing(true); try { - await SystemApi.restart(); - setRestarting(true); + const response = await SystemApi.restart(); + if (response.status === 200) { + setRestarting(true); + } } catch (error) { enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_LOADING()), { variant: 'error' }); } finally { @@ -208,7 +210,7 @@ const SystemStatusForm: FC = () => { setProcessing(true); try { await SystemApi.factoryReset(); - enqueueSnackbar(LL.SYSTEM_FACTORY_TEXT(), { variant: 'info' }); + setRestarting(true); } catch (error) { enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); } finally { diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/project/DeviceIcon.tsx index 5594cdf40..347a1f1cd 100644 --- a/interface/src/project/DeviceIcon.tsx +++ b/interface/src/project/DeviceIcon.tsx @@ -9,6 +9,8 @@ import { GiHeatHaze } from 'react-icons/gi'; import { TiFlowSwitch } from 'react-icons/ti'; import { VscVmConnect } from 'react-icons/vsc'; import { AiOutlineGateway } from 'react-icons/ai'; +import { AiOutlineAlert } from 'react-icons/ai'; +import { AiOutlineChrome } from 'react-icons/ai'; interface DeviceIconProps { type: string; @@ -34,6 +36,10 @@ const DeviceIcon: FC = ({ type }) => { return ; case 'Gateway': return ; + case 'Alert': + return ; + case 'Pump': + return ; default: return null; } diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 7bf0143c4..c4a83c384 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -192,7 +192,7 @@ export const DeviceValueUOM_s = [ 'Wh', 'hours', 'minutes', - 'uA', + 'µA', 'bar', 'kW', 'W', @@ -201,8 +201,8 @@ export const DeviceValueUOM_s = [ 'dBm', '°F', 'mV', - 'sqm', - 'm3', + 'm²', + 'm³', 'l' ]; diff --git a/src/device_library.h b/src/device_library.h index 8b04cafa3..1234245a2 100644 --- a/src/device_library.h +++ b/src/device_library.h @@ -153,8 +153,11 @@ // Switches - 0x11 { 71, DeviceType::SWITCH, "WM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +// PM10 Pump module - 0x15 +{ 243, DeviceType::PUMP, "PM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, + // EM10 error contact and analog flowtemp control- 0x12 -{ 74, DeviceType::GATEWAY, "Error Module EM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, +{ 74, DeviceType::ALERT, "EM10", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // Gateways - 0x48 {189, DeviceType::GATEWAY, "KM200/MB LAN 2", DeviceFlags::EMS_DEVICE_FLAG_NONE}, diff --git a/src/devices/alert.cpp b/src/devices/alert.cpp new file mode 100644 index 000000000..72ed0a382 --- /dev/null +++ b/src/devices/alert.cpp @@ -0,0 +1,29 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "alert.h" + +namespace emsesp { + +REGISTER_FACTORY(Alert, EMSdevice::DeviceType::ALERT); + +Alert::Alert(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) + : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { +} + +} // namespace emsesp \ No newline at end of file diff --git a/src/devices/alert.h b/src/devices/alert.h new file mode 100644 index 000000000..7989e6fd6 --- /dev/null +++ b/src/devices/alert.h @@ -0,0 +1,33 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_ALERT_H +#define EMSESP_ALERT_H + +#include "emsesp.h" + +namespace emsesp { + +class Alert : public EMSdevice { + public: + Alert(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand); +}; + +} // namespace emsesp + +#endif diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 3078b68a2..cfa74d4c0 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -321,10 +321,10 @@ class Boiler : public EMSdevice { bool set_max_pump(const char * value, const int8_t id); bool set_hyst_on(const char * value, const int8_t id); bool set_hyst_off(const char * value, const int8_t id); - bool set_hyst2_on(const char * value, const int8_t id) { + inline bool set_hyst2_on(const char * value, const int8_t id) { return set_hyst_on(value, 2); } - bool set_hyst2_off(const char * value, const int8_t id) { + inline bool set_hyst2_off(const char * value, const int8_t id) { return set_hyst_off(value, 2); } bool set_burn_period(const char * value, const int8_t id); @@ -356,26 +356,26 @@ class Boiler : public EMSdevice { bool set_blockHyst(const char * value, const int8_t id); // pos 14?: Hyst. for bolier block (K) bool set_releaseWait(const char * value, const int8_t id); // pos 15: Boiler release wait time (min) bool set_HpInLogic(const char * value, const int8_t id); - bool set_HpIn1Logic(const char * value, const int8_t id) { + inline bool set_HpIn1Logic(const char * value, const int8_t id) { return set_HpInLogic(value, 1); } - bool set_HpIn2Logic(const char * value, const int8_t id) { + inline bool set_HpIn2Logic(const char * value, const int8_t id) { return set_HpInLogic(value, 2); } - bool set_HpIn3Logic(const char * value, const int8_t id) { + inline bool set_HpIn3Logic(const char * value, const int8_t id) { return set_HpInLogic(value, 3); } - bool set_HpIn4Logic(const char * value, const int8_t id) { + inline bool set_HpIn4Logic(const char * value, const int8_t id) { return set_HpInLogic(value, 4); } bool set_maxHeat(const char * value, const int8_t id); - bool set_maxHeatComp(const char * value, const int8_t id) { + inline bool set_maxHeatComp(const char * value, const int8_t id) { return set_maxHeat(value, 2); } - bool set_maxHeatHeat(const char * value, const int8_t id) { + inline bool set_maxHeatHeat(const char * value, const int8_t id) { return set_maxHeat(value, 3); } - bool set_maxHeatDhw(const char * value, const int8_t id) { + inline bool set_maxHeatDhw(const char * value, const int8_t id) { return set_maxHeat(value, 4); } diff --git a/src/devices/pump.cpp b/src/devices/pump.cpp new file mode 100644 index 000000000..e0a69c545 --- /dev/null +++ b/src/devices/pump.cpp @@ -0,0 +1,29 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "pump.h" + +namespace emsesp { + +REGISTER_FACTORY(Pump, EMSdevice::DeviceType::PUMP); + +Pump::Pump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) + : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { +} + +} // namespace emsesp \ No newline at end of file diff --git a/src/devices/pump.h b/src/devices/pump.h new file mode 100644 index 000000000..4b1eee247 --- /dev/null +++ b/src/devices/pump.h @@ -0,0 +1,33 @@ +/* + * EMS-ESP - https://github.com/emsesp/EMS-ESP + * Copyright 2020 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_PUMP_H +#define EMSESP_PUMP_H + +#include "emsesp.h" + +namespace emsesp { + +class Pump : public EMSdevice { + public: + Pump(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand); +}; + +} // namespace emsesp + +#endif diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 074f98ca8..a75de3da0 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -396,7 +396,7 @@ class Thermostat : public EMSdevice { bool set_mode(const char * value, const int8_t id); bool set_control(const char * value, const int8_t id); bool set_holiday(const char * value, const int8_t id, const bool vacation = false); - bool set_vacation(const char * value, const int8_t id) { + inline bool set_vacation(const char * value, const int8_t id) { return set_holiday(value, id, true); } bool set_pause(const char * value, const int8_t id); @@ -458,10 +458,10 @@ class Thermostat : public EMSdevice { bool set_wwDailyHeating(const char * value, const int8_t id); bool set_wwDailyHeatTime(const char * value, const int8_t id); bool set_wwwhenmodeoff(const char * value, const int8_t id); - bool set_wwVacation(const char * value, const int8_t id) { + inline bool set_wwVacation(const char * value, const int8_t id) { return set_holiday(value, DeviceValueTAG::TAG_WWC1, true); } - bool set_wwHoliday(const char * value, const int8_t id) { + inline bool set_wwHoliday(const char * value, const int8_t id) { return set_holiday(value, DeviceValueTAG::TAG_WWC1); } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index a7711a36b..90dac5a49 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -51,12 +51,21 @@ std::string EMSdevice::tag_to_mqtt(uint8_t tag) { return (DeviceValue::DeviceValueTAG_mqtt[tag]); } -// convert UOM to a string - these don't need translating +// convert UOM to a string - translating only for hours/minutes/seconds std::string EMSdevice::uom_to_string(uint8_t uom) { - if (EMSESP::system_.fahrenheit() && (uom == DeviceValueUOM::DEGREES || uom == DeviceValueUOM::DEGREES_R)) { - return (DeviceValue::DeviceValueUOM_s[DeviceValueUOM::FAHRENHEIT]); + switch (uom) { + case DeviceValueUOM::DEGREES: + case DeviceValueUOM::DEGREES_R: + return EMSESP::system_.fahrenheit() ? DeviceValue::DeviceValueUOM_s[DeviceValueUOM::FAHRENHEIT] : DeviceValue::DeviceValueUOM_s[uom]; + case DeviceValueUOM::HOURS: + return Helpers::translated_word(FL_(hours)); + case DeviceValueUOM::MINUTES: + return Helpers::translated_word(FL_(minutes)); + case DeviceValueUOM::SECONDS: + return Helpers::translated_word(FL_(seconds)); + default: + return DeviceValue::DeviceValueUOM_s[uom]; } - return (DeviceValue::DeviceValueUOM_s[uom]); } std::string EMSdevice::brand_to_string() const { @@ -107,6 +116,10 @@ const char * EMSdevice::device_type_2_device_name(const uint8_t device_type) { return F_(switch); case DeviceType::GATEWAY: return F_(gateway); + case DeviceType::ALERT: + return F_(alert); + case DeviceType::PUMP: + return F_(pump); default: return Helpers::translated_word(FL_(unknown)); } @@ -128,42 +141,39 @@ uint8_t EMSdevice::device_name_2_device_type(const char * topic) { if (!strcmp(lowtopic, F_(boiler))) { return DeviceType::BOILER; } - if (!strcmp(lowtopic, F_(thermostat))) { return DeviceType::THERMOSTAT; } - if (!strcmp(lowtopic, F_(system))) { return DeviceType::SYSTEM; } - if (!strcmp(lowtopic, F_(heatpump))) { return DeviceType::HEATPUMP; } - if (!strcmp(lowtopic, F_(solar))) { return DeviceType::SOLAR; } - if (!strcmp(lowtopic, F_(mixer))) { return DeviceType::MIXER; } - if (!strcmp(lowtopic, F_(dallassensor))) { return DeviceType::DALLASSENSOR; } - if (!strcmp(lowtopic, F_(analogsensor))) { return DeviceType::ANALOGSENSOR; } - if (!strcmp(lowtopic, F_(switch))) { return DeviceType::SWITCH; } - if (!strcmp(lowtopic, F_(gateway))) { return DeviceType::GATEWAY; } + if (!strcmp(lowtopic, F_(alert))) { + return DeviceType::ALERT; + } + if (!strcmp(lowtopic, F_(pump))) { + return DeviceType::PUMP; + } return DeviceType::UNKNOWN; } diff --git a/src/emsdevice.h b/src/emsdevice.h index 9268d8aa2..49c54e7fc 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -338,6 +338,8 @@ class EMSdevice { SWITCH, CONTROLLER, CONNECT, + ALERT, + PUMP, GENERIC, UNKNOWN }; diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp index 9fedd8c7a..33bfe113e 100644 --- a/src/emsdevicevalue.cpp +++ b/src/emsdevicevalue.cpp @@ -112,18 +112,20 @@ const char * DeviceValue::DeviceValueUOM_s[] = { F_(uom_lmin), F_(uom_kwh), F_(uom_wh), - F_(uom_hours), - F_(uom_minutes), + FL_(hours)[0], + FL_(minutes)[0], F_(uom_ua), F_(uom_bar), F_(uom_kw), F_(uom_w), F_(uom_kb), - F_(uom_seconds), + FL_(seconds)[0], F_(uom_dbm), F_(uom_fahrenheit), F_(uom_mv), - F_(uom_sqm) + F_(uom_sqm), + F_(uom_m3), + F_(uom_l) }; diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 9b8bef5df..5690fc264 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -416,7 +416,7 @@ void EMSESP::publish_all(bool force) { publish_device_values(EMSdevice::DeviceType::THERMOSTAT); publish_device_values(EMSdevice::DeviceType::SOLAR); publish_device_values(EMSdevice::DeviceType::MIXER); - publish_other_values(); // switch and heat pump + publish_other_values(); // switch and heat pump, ... publish_sensor_values(true); // includes dallas and analog sensors system_.send_heartbeat(); } @@ -546,6 +546,12 @@ void EMSESP::publish_device_values(uint8_t device_type) { void EMSESP::publish_other_values() { publish_device_values(EMSdevice::DeviceType::SWITCH); publish_device_values(EMSdevice::DeviceType::HEATPUMP); + // other devices without values yet + // publish_device_values(EMSdevice::DeviceType::GATEWAY); + // publish_device_values(EMSdevice::DeviceType::CONNECT); + // publish_device_values(EMSdevice::DeviceType::ALERT); + // publish_device_values(EMSdevice::DeviceType::PUMP); + // publish_device_values(EMSdevice::DeviceType::GENERIC); } // publish both the dallas and analog sensor values diff --git a/src/locale_common.h b/src/locale_common.h index a70e51c6f..3be006d96 100644 --- a/src/locale_common.h +++ b/src/locale_common.h @@ -102,6 +102,8 @@ MAKE_PSTR_WORD(heatpump) MAKE_PSTR_WORD(generic) MAKE_PSTR_WORD(analogsensor) MAKE_PSTR_WORD(dallassensor) +MAKE_PSTR_WORD(alert) +MAKE_PSTR_WORD(pump) MAKE_PSTR(number, "number") MAKE_PSTR(enum, "enum") @@ -195,17 +197,14 @@ MAKE_PSTR_LIST(tpl_input, "Format: [[]") // Unit Of Measurement mapping - maps to DeviceValueUOM_s in emsdevice.cpp -// These don't need translating, it will mess up HA and the API +// Translating hours/minute/seconds in emsdevice.cpp MAKE_PSTR(uom_blank, " ") MAKE_PSTR(uom_percent, "%") MAKE_PSTR(uom_degrees, "°C") -MAKE_PSTR(uom_hours, "hours") -MAKE_PSTR(uom_minutes, "minutes") -MAKE_PSTR(uom_seconds, "seconds") MAKE_PSTR(uom_kwh, "kWh") MAKE_PSTR(uom_wh, "Wh") MAKE_PSTR(uom_bar, "bar") -MAKE_PSTR(uom_ua, "uA") +MAKE_PSTR(uom_ua, "µA") MAKE_PSTR(uom_lmin, "l/min") MAKE_PSTR(uom_kw, "kW") MAKE_PSTR(uom_w, "W") @@ -213,8 +212,8 @@ MAKE_PSTR(uom_kb, "KB") MAKE_PSTR(uom_dbm, "dBm") MAKE_PSTR(uom_fahrenheit, "°F") MAKE_PSTR(uom_mv, "mV") -MAKE_PSTR(uom_sqm, "sqm") -MAKE_PSTR(uom_m3, "m3") +MAKE_PSTR(uom_sqm, "m²") +MAKE_PSTR(uom_m3, "m³") MAKE_PSTR(uom_l, "l") // MQTT topics and prefixes