diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6a0ddf1e1..7a62dcb07 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -29,7 +29,7 @@ assignees: '' *If applicable, add screenshots to help explain your problem.* **Device information** -*Copy-paste here the information as it is outputted by the device. You can get this information by from http://ems-esp.local/api?device=system&cmd=info* +*Copy-paste here the information as it is outputted by the device. You can get this information by from http://ems-esp.local/api/system* **Additional context** *Add any other context about the problem here.* diff --git a/.github/ISSUE_TEMPLATE/questions---troubleshooting.md b/.github/ISSUE_TEMPLATE/questions---troubleshooting.md index fa26a177b..0e8175477 100644 --- a/.github/ISSUE_TEMPLATE/questions---troubleshooting.md +++ b/.github/ISSUE_TEMPLATE/questions---troubleshooting.md @@ -23,7 +23,7 @@ assignees: '' *If applicable, add screenshots to help explain your problem.* **Device information** -*Copy-paste here the information as it is outputted by the device. You can get this information from http://ems-esp.local/api?device=system&cmd=info* +*Copy-paste here the information as it is outputted by the device. You can get this information from http://ems-esp.local/api/system* **Additional context** *Add any other context about the problem here.* diff --git a/README.md b/README.md index 4f3893c9c..063a55364 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Note, EMS-ESP requires a small hardware circuit that can convert the EMS bus dat - Native support for Home Assistant and Domoticz via [MQTT Discovery](https://www.home-assistant.io/docs/mqtt/discovery/) - Can run standalone as an independent WiFi Access Point or join an existing WiFi network - Easy first-time configuration via a web Captive Portal -- Support for more than [80 EMS devices](https://emsesp.github.io/docs/#/Supported-EMS-Devices) (boilers, thermostats, solar modules, mixer modules, heat pumps, gateways) +- Support for more than [100 EMS devices](https://emsesp.github.io/docs/#/Supported-EMS-Devices) (boilers, thermostats, solar modules, mixer modules, heat pumps, gateways) ## **Demo** diff --git a/interface/package-lock.json b/interface/package-lock.json index 40b708044..cb883cd5d 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -15,7 +15,7 @@ "@mui/material": "^5.8.0", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.34", + "@types/node": "^17.0.35", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", @@ -3867,9 +3867,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.34.tgz", - "integrity": "sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==" + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -20574,9 +20574,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/node": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.34.tgz", - "integrity": "sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA==" + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.35.tgz", + "integrity": "sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg==" }, "@types/parse-json": { "version": "4.0.0", diff --git a/interface/package.json b/interface/package.json index f916f7383..375f96cb6 100644 --- a/interface/package.json +++ b/interface/package.json @@ -11,7 +11,7 @@ "@mui/material": "^5.8.0", "@table-library/react-table-library": "^3.1.2", "@types/lodash": "^4.14.182", - "@types/node": "^17.0.34", + "@types/node": "^17.0.35", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-router-dom": "^5.3.3", diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 05dca4571..a5cac3aae 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -376,22 +376,22 @@ const SettingsCustomization: FC = () => { }} > - + - + - + - + @@ -403,26 +403,30 @@ const SettingsCustomization: FC = () => { : - + + + - + + + diff --git a/media/web_devices.png b/media/web_devices.png index 8d4f8794a..75055909f 100644 Binary files a/media/web_devices.png and b/media/web_devices.png differ diff --git a/media/web_edit.png b/media/web_edit.png index 93e0170f7..91c7c4f00 100644 Binary files a/media/web_edit.png and b/media/web_edit.png differ diff --git a/media/web_sensor.png b/media/web_sensor.png new file mode 100644 index 000000000..9419070e3 Binary files /dev/null and b/media/web_sensor.png differ diff --git a/media/web_settings.png b/media/web_settings.png index 6fd91c775..23b076143 100644 Binary files a/media/web_settings.png and b/media/web_settings.png differ diff --git a/media/web_status.png b/media/web_status.png index 0c37b9639..55c6e923e 100644 Binary files a/media/web_status.png and b/media/web_status.png differ diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 9369ec297..86c3b3762 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -238,7 +238,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), 0, - 19.9); + 20); register_device_value(DeviceValueTAG::TAG_BOILER_DATA, &fossileFactor_, DeviceValueType::UINT, @@ -393,13 +393,29 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const FL_(wwComfort), DeviceValueUOM::NONE, MAKE_CF_CB(set_ww_mode)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwComfort1_, + DeviceValueType::ENUM, + FL_(enum_comfort1), + FL_(wwComfort1), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_mode1)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwFlowTempOffset_, DeviceValueType::UINT, nullptr, FL_(wwFlowTempOffset), DeviceValueUOM::DEGREES_R, - MAKE_CF_CB(set_ww_flowTempOffset)); + MAKE_CF_CB(set_ww_flowTempOffset), + 0, + 40); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, + &wwChargeOptimization_, + DeviceValueType::BOOL, + nullptr, + FL_(wwChargeOptimization), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_ww_chargeOptimization)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW, &wwMaxPower_, DeviceValueType::UINT, @@ -773,11 +789,24 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr telegram has_update(telegram, wwSelTemp_, 6); // setting here has_update(telegram, wwHystOn_, 7); has_update(telegram, wwHystOff_, 8); + has_update(telegram, wwFlowTempOffset_, 9); has_update(telegram, wwCircPump_, 10); // 0x01 means yes has_update(telegram, wwCircMode_, 11); // 1=1x3min... 6=6x3min, 7=continuous has_update(telegram, wwDisinfectionTemp_, 12); // setting here, status in E9 has_update(telegram, wwSelTempSingle_, 16); has_update(telegram, wwSelTempLow_, 18); + has_update(telegram, wwChargeOptimization_, 25); + + uint8_t wwComfort1 = EMS_VALUE_UINT_NOTSET; + telegram->read_value(wwComfort1, 13); + if (wwComfort1 == 0) { + wwComfort1 = 0; // High_Comfort + } else if (wwComfort1 == 0xD8) { + wwComfort1 = 1; // Eco + } else { + wwComfort1 = EMS_VALUE_UINT_NOTSET; + } + has_update(wwComfort1_, wwComfort1); } // 0xE9 - WW monitor ems+ @@ -1249,7 +1278,11 @@ bool Boiler::set_ww_flowTempOffset(const char * value, const int8_t id) { return false; } - write_command(EMS_TYPE_UBAParameterWW, 5, v, EMS_TYPE_UBAParameterWW); + if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 9, v, EMS_TYPE_UBAParameterWWPlus); + } else { + write_command(EMS_TYPE_UBAParameterWW, 5, v, EMS_TYPE_UBAParameterWW); + } return true; } @@ -1350,6 +1383,23 @@ bool Boiler::set_ww_hyst_off(const char * value, const int8_t id) { return true; } +// set ww charge optimization +bool Boiler::set_ww_chargeOptimization(const char * value, const int8_t id) { + bool v = false; + if (!Helpers::value2bool(value, v)) { + return false; + } + + if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + write_command(EMS_TYPE_UBAParameterWWPlus, 25, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus); + } + + return true; +} + + + + // set dhw max power bool Boiler::set_ww_maxpower(const char * value, const int8_t id) { int v = 0; @@ -1485,6 +1535,31 @@ bool Boiler::set_ww_mode(const char * value, const int8_t id) { return true; } +// wwcomfort1 for RC310 +// on a RC310 it's 1=high, 2=eco +bool Boiler::set_ww_mode1(const char * value, const int8_t id) { + uint8_t set; + if (!Helpers::value2enum(value, set, FL_(enum_comfort1))) { + return false; + } + + if (!is_fetch(EMS_TYPE_UBAParameterWWPlus)) { + return false; + } + + if (set == 0) { + // LOG_INFO(F("Setting boiler dhw to High")); + } else if (set == 1) { + // LOG_INFO(F("Setting boiler dhw to Eco")); + set = 0xD8; + } else { + return false; // do nothing + } + + write_command(EMS_TYPE_UBAParameterWWPlus, 13, set, EMS_TYPE_UBAParameterWWPlus); + return true; +} + // turn on/off dhw bool Boiler::set_ww_activated(const char * value, const int8_t id) { bool v = false; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index 71e71365c..e02465905 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -51,37 +51,39 @@ class Boiler : public EMSdevice { static constexpr uint16_t EMS_TYPE_UBAEnergySupplied = 0x494; // ww - uint8_t wwSetTemp_; // DHW set temperature - uint8_t wwSelTemp_; // DHW selected temperature - uint8_t wwSelTempLow_; // DHW lower selected temperature - uint8_t wwSelTempOff_; // DHW selected temperature for off position - uint8_t wwSelTempSingle_; // DHW single charge temperature - uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer - uint8_t wwComfort_; // WW comfort mode - uint8_t wwCircPump_; // DHW circulation pump available - uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) - uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection - uint8_t wwCircMode_; // DHW circulation pump mode - uint8_t wwCirc_; // Circulation on/off - uint16_t wwCurTemp_; // DHW current temperature - uint16_t wwCurTemp2_; // DHW current temperature storage - uint8_t wwCurFlow_; // DHW current flow temp in l/min - uint16_t wwStorageTemp1_; // DHW storage temp 1 - uint16_t wwStorageTemp2_; // DHW storage temp 2 - uint8_t wwActivated_; // DHW activated - uint8_t wwOneTime_; // DHW one time function on/off - uint8_t wwDisinfect_; // DHW disinfection on/off - uint8_t wwCharging_; // DHW charging on/off - uint8_t wwRecharging_; // DHW recharge on/off - uint8_t wwTempOK_; // DHW temperature ok on/off - uint8_t wwActive_; // - uint8_t ww3wayValve_; // 3-way valve on WW - uint8_t wwSetPumpPower_; // ww pump speed/power? - uint8_t wwFlowTempOffset_; // Boiler offset for ww heating - uint8_t wwMaxPower_; // DHW maximum power - uint32_t wwStarts_; // DHW starts - uint32_t wwStarts2_; // DHW control starts - uint32_t wwWorkM_; // DHW minutes + uint8_t wwSetTemp_; // DHW set temperature + uint8_t wwSelTemp_; // DHW selected temperature + uint8_t wwSelTempLow_; // DHW lower selected temperature + uint8_t wwSelTempOff_; // DHW selected temperature for off position + uint8_t wwSelTempSingle_; // DHW single charge temperature + uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer + uint8_t wwComfort_; // WW comfort mode + uint8_t wwComfort1_; // WW comfort mode RC310 + uint8_t wwCircPump_; // DHW circulation pump available + uint8_t wwChargeType_; // DHW charge type (pump or 3-way-valve) + uint8_t wwChargeOptimization_; // DHW charge optimization + uint8_t wwDisinfectionTemp_; // DHW disinfection temperature to prevent infection + uint8_t wwCircMode_; // DHW circulation pump mode + uint8_t wwCirc_; // Circulation on/off + uint16_t wwCurTemp_; // DHW current temperature + uint16_t wwCurTemp2_; // DHW current temperature storage + uint8_t wwCurFlow_; // DHW current flow temp in l/min + uint16_t wwStorageTemp1_; // DHW storage temp 1 + uint16_t wwStorageTemp2_; // DHW storage temp 2 + uint8_t wwActivated_; // DHW activated + uint8_t wwOneTime_; // DHW one time function on/off + uint8_t wwDisinfect_; // DHW disinfection on/off + uint8_t wwCharging_; // DHW charging on/off + uint8_t wwRecharging_; // DHW recharge on/off + uint8_t wwTempOK_; // DHW temperature ok on/off + uint8_t wwActive_; // + uint8_t ww3wayValve_; // 3-way valve on WW + uint8_t wwSetPumpPower_; // ww pump speed/power? + uint8_t wwFlowTempOffset_; // Boiler offset for ww heating + uint8_t wwMaxPower_; // DHW maximum power + uint32_t wwStarts_; // DHW starts + uint32_t wwStarts2_; // DHW control starts + uint32_t wwWorkM_; // DHW minutes int8_t wwHystOn_; int8_t wwHystOff_; uint8_t wwTapActivated_; // maintenance-mode to switch DHW off @@ -240,6 +242,7 @@ class Boiler : public EMSdevice { // commands - none of these use the additional id parameter bool set_ww_mode(const char * value, const int8_t id); + bool set_ww_mode1(const char * value, const int8_t id); bool set_ww_activated(const char * value, const int8_t id); bool set_tapwarmwater_activated(const char * value, const int8_t id); bool set_ww_onetime(const char * value, const int8_t id); @@ -253,6 +256,7 @@ class Boiler : public EMSdevice { bool set_ww_disinfect_temp(const char * value, const int8_t id); bool set_ww_maxpower(const char * value, const int8_t id); bool set_ww_flowTempOffset(const char * value, const int8_t id); + bool set_ww_chargeOptimization(const char * value, const int8_t id); bool set_flow_temp(const char * value, const int8_t id); bool set_burn_power(const char * value, const int8_t id); bool set_heating_activated(const char * value, const int8_t id); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 726ecf98b..7be718f9b 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -3723,7 +3723,7 @@ void Thermostat::register_device_values() { DeviceValueUOM::NONE, MAKE_CF_CB(set_energyCostRatio), 0, - 19.9); + 20); register_device_value(DeviceValueTAG::TAG_THERMOSTAT_DATA, &fossileFactor_, DeviceValueType::UINT, @@ -3835,8 +3835,13 @@ void Thermostat::register_device_values_hc(std::shared_ptrheatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype)); register_device_value( tag, &hc->summersetmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); - register_device_value( - tag, &hc->hpoperatingmode, DeviceValueType::ENUM, FL_(enum_hpoperatingmode), FL_(hpoperatingmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode)); + register_device_value(tag, + &hc->hpoperatingmode, + DeviceValueType::ENUM, + FL_(enum_hpoperatingmode), + FL_(hpoperatingmode), + DeviceValueUOM::NONE, + MAKE_CF_CB(set_summermode)); register_device_value(tag, &hc->summermode, DeviceValueType::ENUM, FL_(enum_summer), FL_(summermode), DeviceValueUOM::NONE); register_device_value( tag, &hc->controlmode, DeviceValueType::ENUM, FL_(enum_controlmode), FL_(controlmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_controlmode)); diff --git a/src/locale_EN.h b/src/locale_EN.h index 938d5f912..57653f1af 100644 --- a/src/locale_EN.h +++ b/src/locale_EN.h @@ -262,6 +262,7 @@ MAKE_PSTR_WORD(continuous) MAKE_PSTR(3wayvalve, "3-way valve") MAKE_PSTR(chargepump, "charge pump") MAKE_PSTR_WORD(hot) +MAKE_PSTR_WORD(high_comfort) MAKE_PSTR_WORD(eco) MAKE_PSTR_WORD(intelligent) MAKE_PSTR_WORD(flow) @@ -277,6 +278,7 @@ MAKE_PSTR_LIST(enum_off_time_date_manual, F_(off), F_(time), F_(date), F_(manual MAKE_PSTR_LIST(enum_freq, F_(off), F_(1x3min), F_(2x3min), F_(3x3min), F_(4x3min), F_(5x3min), F_(6x3min), F_(continuous)) MAKE_PSTR_LIST(enum_charge, F_(chargepump), F_(3wayvalve)) MAKE_PSTR_LIST(enum_comfort, F_(hot), F_(eco), F_(intelligent)) +MAKE_PSTR_LIST(enum_comfort1, F_(high_comfort), F_(eco)) MAKE_PSTR_LIST(enum_flow, F_(off), F_(flow), F_(bufferedflow), F_(buffer), F_(layeredbuffer)) MAKE_PSTR_LIST(enum_reset, F("-"), F_(maintenance), F_(error)) // MAKE_PSTR_LIST(enum_bool, F_(off), F_(on)) @@ -535,6 +537,7 @@ MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperatu MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) +MAKE_PSTR_LIST(wwComfort1, F("wwcomfort1"), F("comfort mode")) MAKE_PSTR_LIST(wwFlowTempOffset, F("wwflowtempoffset"), F("flow temperature offset")) MAKE_PSTR_LIST(wwMaxPower, F("wwmaxpower"), F("max power")) MAKE_PSTR_LIST(wwCircPump, F("wwcircpump"), F("circulation pump available")) @@ -551,6 +554,7 @@ MAKE_PSTR_LIST(wwActivated, F("wwactivated"), F("activated")) MAKE_PSTR_LIST(wwOneTime, F("wwonetime"), F("one time charging")) MAKE_PSTR_LIST(wwDisinfecting, F("wwdisinfecting"), F("disinfecting")) MAKE_PSTR_LIST(wwCharging, F("wwcharging"), F("charging")) +MAKE_PSTR_LIST(wwChargeOptimization, F("wwchargeoptimization"), F("charge optimization")) MAKE_PSTR_LIST(wwRecharging, F("wwrecharging"), F("recharging")) MAKE_PSTR_LIST(wwTempOK, F("wwtempok"), F("temperature ok")) MAKE_PSTR_LIST(wwActive, F("wwactive"), F("active"))