Merge branch 'dev' into idf4

This commit is contained in:
MichaelDvP
2022-05-18 17:09:38 +02:00
17 changed files with 162 additions and 118 deletions

View File

@@ -130,6 +130,7 @@
// Heat Pumps - 0x38
{200, DeviceType::HEATPUMP, F("HP Module"), DeviceFlags::EMS_DEVICE_FLAG_NONE},
{248, DeviceType::HEATPUMP, F("Hybrid Manager HM200"), DeviceFlags::EMS_DEVICE_FLAG_NONE},
{252, DeviceType::HEATPUMP, F("HP Module"), DeviceFlags::EMS_DEVICE_FLAG_NONE},
// Connect devices - 0x02

View File

@@ -1164,7 +1164,7 @@ bool Boiler::set_ww_temp(const char * value, const int8_t id) {
return false;
}
if (is_fetch(EMS_TYPE_UBAParametersPlus)) {
if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) {
// write_command(EMS_TYPE_UBAFlags, 3, v, EMS_TYPE_UBAParameterWWPlus); // test for #96
write_command(EMS_TYPE_UBAParameterWWPlus, 6, v, EMS_TYPE_UBAParameterWWPlus);
} else {
@@ -1206,7 +1206,7 @@ bool Boiler::set_ww_disinfect_temp(const char * value, const int8_t id) {
return false;
}
if (is_fetch(EMS_TYPE_UBAParametersPlus)) {
if (is_fetch(EMS_TYPE_UBAParameterWWPlus)) {
write_command(EMS_TYPE_UBAParameterWWPlus, 12, v, EMS_TYPE_UBAParameterWWPlus);
} else {
write_command(EMS_TYPE_UBAParameterWW, 8, v, EMS_TYPE_UBAParameterWW);

View File

@@ -973,7 +973,7 @@ void Thermostat::process_RC300Summer(std::shared_ptr<const Telegram> telegram) {
has_update(telegram, hc->offsettemp, 2);
if (!is_fetch(summer2_typeids[hc->hc()])) {
has_update(telegram, hc->summertemp, 6);
has_update(telegram, hc->summer_setmode, 7);
has_update(telegram, hc->summersetmode, 7);
}
if (hc->heatingtype < 3) {
@@ -993,7 +993,7 @@ void Thermostat::process_RC300Summer2(std::shared_ptr<const Telegram> telegram)
if (hc == nullptr) {
return;
}
has_update(telegram, hc->summer_setmode, 0);
has_update(telegram, hc->hpoperatingmode, 0);
has_update(telegram, hc->summertemp, 1);
}
@@ -1246,7 +1246,8 @@ void Thermostat::process_RC35Set(std::shared_ptr<const Telegram> telegram) {
has_update(telegram, hc->vacreducemode, 41); // vacations reduce mode
has_update(telegram, hc->minflowtemp, 16);
if (hc->heatingtype == 3) { // floor heating
// RC35 stores values for floorheating in different position
if (hc->heatingtype == 3 && model() == EMS_DEVICE_FLAG_RC35) {
has_update(telegram, hc->designtemp, 36); // is * 1
has_update(telegram, hc->maxflowtemp, 35); // is * 1
} else { // radiator/convector
@@ -2347,13 +2348,16 @@ bool Thermostat::set_summermode(const char * value, const int8_t id) {
}
uint8_t set = 0xFF;
if (!Helpers::value2enum(value, set, FL_(enum_summermode))) {
return false;
}
if (is_fetch(summer2_typeids[hc->hc()])) {
if (!Helpers::value2enum(value, set, FL_(enum_hpoperatingmode))) {
return false;
}
write_command(summer2_typeids[hc->hc()], 0, set, summer2_typeids[hc->hc()]);
} else {
if (!Helpers::value2enum(value, set, FL_(enum_summermode))) {
return false;
}
write_command(summer_typeids[hc->hc()], 7, set, summer_typeids[hc->hc()]);
}
@@ -2962,7 +2966,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co
factor = 1;
break;
case HeatingCircuit::Mode::DESIGN:
if (hc->heatingtype == 3) {
if (hc->heatingtype == 3 && model == EMS_DEVICE_FLAG_RC35) {
offset = EMS_OFFSET_RC35Set_temp_design_floor;
} else {
offset = EMS_OFFSET_RC35Set_temp_design;
@@ -3001,7 +3005,7 @@ bool Thermostat::set_temperature(const float temperature, const uint8_t mode, co
factor = 1;
break;
case HeatingCircuit::Mode::MAXFLOW:
if (hc->heatingtype == 3) {
if (hc->heatingtype == 3 && model == EMS_DEVICE_FLAG_RC35) {
offset = 35;
} else {
offset = 15;
@@ -3830,7 +3834,9 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
register_device_value(
tag, &hc->heatingtype, DeviceValueType::ENUM, FL_(enum_heatingtype), FL_(heatingtype), DeviceValueUOM::NONE, MAKE_CF_CB(set_heatingtype));
register_device_value(
tag, &hc->summer_setmode, DeviceValueType::ENUM, FL_(enum_summermode), FL_(summersetmode), DeviceValueUOM::NONE, MAKE_CF_CB(set_summermode));
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->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));

View File

@@ -54,7 +54,8 @@ class Thermostat : public EMSdevice {
uint8_t designtemp; // heating curve design temp at MinExtTemp
int8_t offsettemp; // heating curve offest temp at roomtemp signed!
uint8_t manualtemp;
uint8_t summer_setmode;
uint8_t summersetmode;
uint8_t hpoperatingmode;
uint8_t roominfluence;
uint8_t roominfl_factor;
int16_t curroominfl;

View File

@@ -364,6 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto))
MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto))
MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor))
MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter))
MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F("heizen"), F("kühlen"))
MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer))
MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310
@@ -649,6 +650,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("Frostschutztemperatur"))
MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("berechnete Flusstemperatur"))
MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("Heizungstyp"))
MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("Einstellung Sommerbetrieb"))
MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("Wärmepumpe Betriebsmodus"))
MAKE_PSTR_LIST(controlmode, F("controlmode"), F("Kontrollmodus"))
MAKE_PSTR_LIST(control, F("control"), F("Fernsteuerung"))
MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates"))

View File

@@ -364,6 +364,7 @@ MAKE_PSTR_LIST(enum_wwMode2, F_(off), F_(on), F_(auto))
MAKE_PSTR_LIST(enum_wwMode3, F_(on), F_(off), F_(auto))
MAKE_PSTR_LIST(enum_heatingtype, F_(off), F_(radiator), F_(convector), F_(floor))
MAKE_PSTR_LIST(enum_summermode, F_(summer), F_(auto), F_(winter))
MAKE_PSTR_LIST(enum_hpoperatingmode, F_(off), F_(auto), F("heating"), F("cooling"))
MAKE_PSTR_LIST(enum_summer, F_(winter), F_(summer))
MAKE_PSTR_LIST(enum_mode, F_(manual), F_(auto)) // RC100, RC300, RC310
@@ -638,6 +639,7 @@ MAKE_PSTR_LIST(nofrosttemp, F("nofrosttemp"), F("nofrost temperature"))
MAKE_PSTR_LIST(targetflowtemp, F("targetflowtemp"), F("target flow temperature"))
MAKE_PSTR_LIST(heatingtype, F("heatingtype"), F("heating type"))
MAKE_PSTR_LIST(summersetmode, F("summersetmode"), F("set summer mode"))
MAKE_PSTR_LIST(hpoperatingmode, F("hpoperatingmode"), F("heatpump operating mode"))
MAKE_PSTR_LIST(controlmode, F("controlmode"), F("control mode"))
MAKE_PSTR_LIST(control, F("control"), F("control device"))
MAKE_PSTR_LIST(holidays, F("holidays"), F("holiday dates"))

View File

@@ -689,8 +689,6 @@ void System::commands_init() {
// 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_(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_(commands), System::command_commands, F("fetch system commands"));
#if defined(EMSESP_DEBUG)
@@ -973,34 +971,6 @@ bool System::saveSettings(const char * filename, const char * section, JsonObjec
return false; // not found
}
// export all settings to JSON text
// we need to keep the original format so the import/upload works as we just replace files
// http://ems-esp/api/system/settings
bool System::command_settings(const char * value, const int8_t id, JsonObject & output) {
output["type"] = "settings";
JsonObject node = output.createNestedObject("System");
node["version"] = EMSESP_APP_VERSION;
extractSettings(NETWORK_SETTINGS_FILE, "Network", output);
extractSettings(AP_SETTINGS_FILE, "AP", output);
extractSettings(MQTT_SETTINGS_FILE, "MQTT", output);
extractSettings(NTP_SETTINGS_FILE, "NTP", output);
extractSettings(OTA_SETTINGS_FILE, "OTA", output);
extractSettings(SECURITY_SETTINGS_FILE, "Security", output);
extractSettings(EMSESP_SETTINGS_FILE, "Settings", output);
return true;
}
// http://ems-esp/api/system/customizations
// we need to keep the original format so the import/upload works as we just replace file
bool System::command_customizations(const char * value, const int8_t id, JsonObject & output) {
output["type"] = "customizations";
extractSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", output);
return true;
}
// export status information including the device information
// http://ems-esp/api/system/info
bool System::command_info(const char * value, const int8_t id, JsonObject & output) {

View File

@@ -61,8 +61,6 @@ class System {
static bool command_watch(const char * value, const int8_t id);
static bool command_info(const char * value, const int8_t id, JsonObject & output);
static bool command_settings(const char * value, const int8_t id, JsonObject & output);
static bool command_customizations(const char * value, const int8_t id, JsonObject & output);
static bool command_commands(const char * value, const int8_t id, JsonObject & output);
std::string reset_reason(uint8_t cpu) const;

View File

@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.4.0b17idf4"
#define EMSESP_APP_VERSION "3.4.0b18idf4"

View File

@@ -32,6 +32,12 @@ WebAPIService::WebAPIService(AsyncWebServer * server, SecurityManager * security
, _apiHandler("/api", std::bind(&WebAPIService::webAPIService_post, this, _1, _2), 256) { // for POSTS, must use 'Content-Type: application/json' in header
server->on("/api", HTTP_GET, std::bind(&WebAPIService::webAPIService_get, this, _1)); // for GETS
server->addHandler(&_apiHandler);
// for settings
server->on(GET_SETTINGS_PATH, HTTP_GET, securityManager->wrapRequest(std::bind(&WebAPIService::getSettings, this, _1), AuthenticationPredicates::IS_ADMIN));
server->on(GET_CUSTOMIZATIONS_PATH,
HTTP_GET,
securityManager->wrapRequest(std::bind(&WebAPIService::getCustomizations, this, _1), AuthenticationPredicates::IS_ADMIN));
}
// HTTP GET
@@ -150,4 +156,37 @@ void WebAPIService::parse(AsyncWebServerRequest * request, JsonObject & input) {
#endif
}
void WebAPIService::getSettings(AsyncWebServerRequest * request) {
auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN);
JsonObject root = response->getRoot();
root["type"] = "settings";
JsonObject node = root.createNestedObject("System");
node["version"] = EMSESP_APP_VERSION;
System::extractSettings(NETWORK_SETTINGS_FILE, "Network", root);
System::extractSettings(AP_SETTINGS_FILE, "AP", root);
System::extractSettings(MQTT_SETTINGS_FILE, "MQTT", root);
System::extractSettings(NTP_SETTINGS_FILE, "NTP", root);
System::extractSettings(OTA_SETTINGS_FILE, "OTA", root);
System::extractSettings(SECURITY_SETTINGS_FILE, "Security", root);
System::extractSettings(EMSESP_SETTINGS_FILE, "Settings", root);
response->setLength();
request->send(response);
}
void WebAPIService::getCustomizations(AsyncWebServerRequest * request) {
auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_XLARGE_DYN);
JsonObject root = response->getRoot();
root["type"] = "customizations";
System::extractSettings(EMSESP_CUSTOMIZATION_FILE, "Customizations", root);
response->setLength();
request->send(response);
}
} // namespace emsesp

View File

@@ -20,6 +20,8 @@
#define WebAPIService_h
#define EMSESP_API_SERVICE_PATH "/api"
#define GET_SETTINGS_PATH "/rest/getSettings"
#define GET_CUSTOMIZATIONS_PATH "/rest/getCustomizations"
namespace emsesp {
@@ -46,6 +48,9 @@ class WebAPIService {
static uint16_t api_fails_;
void parse(AsyncWebServerRequest * request, JsonObject & input);
void getSettings(AsyncWebServerRequest * request);
void getCustomizations(AsyncWebServerRequest * request);
};
} // namespace emsesp