Skip to content

Commit

Permalink
Merge branch 'idf4' into idf4_no_master
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelDvP committed May 18, 2022
2 parents a045494 + 4023d78 commit 95927fc
Show file tree
Hide file tree
Showing 19 changed files with 1,197 additions and 1,111 deletions.
2,069 changes: 1,045 additions & 1,024 deletions interface/package-lock.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions interface/package.json
Expand Up @@ -7,11 +7,11 @@
"@emotion/react": "^11.9.0",
"@emotion/styled": "^11.8.1",
"@msgpack/msgpack": "^2.7.2",
"@mui/icons-material": "^5.6.2",
"@mui/material": "^5.6.4",
"@table-library/react-table-library": "^3.1.0",
"@mui/icons-material": "^5.8.0",
"@mui/material": "^5.8.0",
"@table-library/react-table-library": "^3.1.2",
"@types/lodash": "^4.14.182",
"@types/node": "^17.0.31",
"@types/node": "^17.0.34",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
"@types/react-router-dom": "^5.3.3",
Expand All @@ -20,7 +20,7 @@
"http-proxy-middleware": "^2.0.6",
"jwt-decode": "^3.1.2",
"lodash": "^4.17.21",
"notistack": "^2.0.4",
"notistack": "^2.0.5",
"parse-ms": "^3.0.0",
"react": "^17.0.2",
"react-app-rewired": "^2.2.1",
Expand Down
1 change: 1 addition & 0 deletions interface/src/api/system.ts
Expand Up @@ -38,3 +38,4 @@ export function updateLogSettings(logSettings: LogSettings): AxiosPromise<LogSet
export function readLogEntries(): AxiosPromise<LogEntries> {
return AXIOS_BIN.get('/fetchLog');
}

63 changes: 46 additions & 17 deletions interface/src/project/HelpInformation.tsx
Expand Up @@ -24,7 +24,22 @@ const HelpInformation: FC = () => {

const { me } = useContext(AuthenticatedContext);

const onDownload = async (endpoint: string) => {
const saveFile = (json: any, endpoint: string) => {
const a = document.createElement('a');
const filename = 'emsesp_' + endpoint + '.json';
a.href = URL.createObjectURL(
new Blob([JSON.stringify(json, null, 2)], {
type: 'text/plain'
})
);
a.setAttribute('download', filename);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
enqueueSnackbar('File downloaded', { variant: 'info' });
};

const callAPI = async (endpoint: string) => {
try {
const response = await EMSESP.API({
device: 'system',
Expand All @@ -34,19 +49,33 @@ const HelpInformation: FC = () => {
if (response.status !== 200) {
enqueueSnackbar('API call failed', { variant: 'error' });
} else {
const json = response.data;
const a = document.createElement('a');
const filename = 'emsesp_' + endpoint + '.json';
a.href = URL.createObjectURL(
new Blob([JSON.stringify(json, null, 2)], {
type: 'text/plain'
})
);
a.setAttribute('download', filename);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
enqueueSnackbar('File downloaded', { variant: 'info' });
saveFile(response.data, endpoint);
}
} catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' });
}
};

const downloadSettings = async () => {
try {
const response = await EMSESP.getSettings();
if (response.status !== 200) {
enqueueSnackbar('Unable to get settings', { variant: 'error' });
} else {
saveFile(response.data, 'settings');
}
} catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' });
}
};

const downloadCustomizations = async () => {
try {
const response = await EMSESP.getCustomizations();
if (response.status !== 200) {
enqueueSnackbar('Unable to get customizations', { variant: 'error' });
} else {
saveFile(response.data, 'customizations');
}
} catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, 'Problem with downloading'), { variant: 'error' });
Expand Down Expand Up @@ -103,7 +132,7 @@ const HelpInformation: FC = () => {
</ListItemAvatar>
<ListItemText>
To report an issue or request a feature, please&nbsp;
<Link component="button" variant="body1" onClick={() => onDownload('info')}>
<Link component="button" variant="body1" onClick={() => callAPI('info')}>
download
</Link>
&nbsp;the debug information and include in a new&nbsp;
Expand Down Expand Up @@ -131,15 +160,15 @@ const HelpInformation: FC = () => {
startIcon={<DownloadIcon />}
variant="outlined"
color="primary"
onClick={() => onDownload('settings')}
onClick={() => downloadSettings()}
>
settings
</Button>
<Button
startIcon={<DownloadIcon />}
variant="outlined"
color="primary"
onClick={() => onDownload('customizations')}
onClick={() => downloadCustomizations()}
>
customizations
</Button>
Expand Down
8 changes: 8 additions & 0 deletions interface/src/project/api.ts
Expand Up @@ -86,3 +86,11 @@ export function resetCustomizations(): AxiosPromise<void> {
export function API(apiCall: APIcall): AxiosPromise<void> {
return AXIOS_API.post('/', apiCall);
}

export function getSettings(): AxiosPromise<void> {
return AXIOS.get('/getSettings');
}

export function getCustomizations(): AxiosPromise<void> {
return AXIOS.get('/getCustomizations');
}
17 changes: 10 additions & 7 deletions mock-api/server.js
Expand Up @@ -1192,16 +1192,19 @@ rest_server.get(SYSTEM_INFO_ENDPOINT, (req, res) => {
res.json(emsesp_info)
})

const SYSTEM_SETTINGS_ENDPOINT = API_ENDPOINT_ROOT + 'system/settings'
rest_server.post(SYSTEM_SETTINGS_ENDPOINT, (req, res) => {
console.log('System Settings POST: ' + JSON.stringify(req.body))
res.sendStatus(200)
})
rest_server.get(SYSTEM_SETTINGS_ENDPOINT, (req, res) => {
console.log('System Settings GET')
const GET_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'getSettings'
rest_server.get(GET_SETTINGS_ENDPOINT, (req, res) => {
console.log('System Settings:')
res.json(settings)
})

const GET_CUSTOMIZATIONS_ENDPOINT = REST_ENDPOINT_ROOT + 'getCustomizations'
rest_server.get(GET_CUSTOMIZATIONS_ENDPOINT, (req, res) => {
console.log('Customizations:')
// not implemented yet
res.sendStatus(200)
})

// start server
const expressServer = rest_server.listen(port, () =>
console.log(`Mock server for EMS-ESP is up and running at http://localhost:${port}`),
Expand Down
1 change: 1 addition & 0 deletions src/device_library.h
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/devices/boiler.cpp
Expand Up @@ -1163,7 +1163,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 {
Expand Down Expand Up @@ -1205,7 +1205,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);
Expand Down
24 changes: 15 additions & 9 deletions src/devices/thermostat.cpp
Expand Up @@ -936,7 +936,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) {
Expand All @@ -956,7 +956,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);
}

Expand Down Expand Up @@ -1209,7 +1209,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
Expand Down Expand Up @@ -2309,13 +2310,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()]);
}

Expand Down Expand Up @@ -2924,7 +2928,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;
Expand Down Expand Up @@ -2963,7 +2967,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;
Expand Down Expand Up @@ -3770,7 +3774,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));
Expand Down
3 changes: 2 additions & 1 deletion src/devices/thermostat.h
Expand Up @@ -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;
Expand Down
14 changes: 6 additions & 8 deletions src/emsesp.cpp
Expand Up @@ -645,7 +645,6 @@ std::string EMSESP::pretty_telegram(std::shared_ptr<const Telegram> telegram) {
std::string src_name("");
std::string dest_name("");
std::string type_name("");
std::string direction("");
for (const auto & emsdevice : emsdevices) {
if (emsdevice) {
// get src & dest
Expand Down Expand Up @@ -682,17 +681,16 @@ std::string EMSESP::pretty_telegram(std::shared_ptr<const Telegram> telegram) {
type_name = read_flash_string(F("?"));
}

std::string str;
str.reserve(200);
if (telegram->operation == Telegram::Operation::RX_READ) {
direction = read_flash_string(F("<-"));
str = src_name + "(" + Helpers::hextoa(src) + ") <- " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "("
+ Helpers::hextoa(telegram->type_id) + "), length: " + Helpers::hextoa(telegram->message_data[0]);
} else {
direction = read_flash_string(F("->"));
str = src_name + "(" + Helpers::hextoa(src) + ") -> " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "("
+ Helpers::hextoa(telegram->type_id) + "), data: " + telegram->to_string_message();
}

std::string str;
str.reserve(200);
str = src_name + "(" + Helpers::hextoa(src) + ") " + direction + " " + dest_name + "(" + Helpers::hextoa(dest) + "), " + type_name + "("
+ Helpers::hextoa(telegram->type_id) + "), data: " + telegram->to_string_message();

if (offset) {
str += " (offset " + Helpers::itoa(offset) + ")";
}
Expand Down
2 changes: 2 additions & 0 deletions src/locale_DE.h
Expand Up @@ -361,6 +361,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
Expand Down Expand Up @@ -646,6 +647,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"))
Expand Down
2 changes: 2 additions & 0 deletions src/locale_EN.h
Expand Up @@ -362,6 +362,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
Expand Down Expand Up @@ -636,6 +637,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"))
Expand Down
30 changes: 0 additions & 30 deletions src/system.cpp
Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 0 additions & 2 deletions src/system.h
Expand Up @@ -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;
Expand Down

0 comments on commit 95927fc

Please sign in to comment.