From b51d34add049efdda4c732c9ecc4347af39e6888 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 23 Mar 2020 11:40:48 +0100 Subject: [PATCH] merge of Yves' "Added retrieving settings (0xA5)" feature --- CHANGELOG.md | 1 + src/ems-esp.cpp | 16 ++++---- src/ems.cpp | 98 ++++++++++++++++++++++++----------------------- src/ems.h | 26 ++++++------- src/ems_devices.h | 14 +++---- src/version.h | 2 +- 6 files changed, 80 insertions(+), 77 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 268cb9e45..d880e97a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - MQTT publish messages are queued and gracefully published every second to avoid TCP blocks - Added features to WW messages (0x33, 0x34) to improve WW monitoring. (PR#338 by @ypaindaveine) - Added mixing log and stub for EMS type 0xAC (PR#338 by @ypaindaveine) +- Added Thermostat retrieving settings (0xA5) (validated on RC30N) with MQTT support (thanks Yves @ypaindaveine. See #352) ### Fixed - set boiler warm water temp on Junkers/Bosch HT3 diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 77210dea7..82a418381 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -476,7 +476,7 @@ void showInfo() { _renderIntValue("Offset int. temperature", "K", EMS_Thermostat.ibaCalIntTemperature, 10); // offset int. temperature sensor, by * 0.1 Kelvin } if (EMS_Thermostat.ibaMinExtTemperature != EMS_VALUE_SHORT_NOTSET) { - _renderShortValue("Min ext. temperature", "C", EMS_Thermostat.ibaMinExtTemperature, 0); // min ext temp for heating curve, in deg. + _renderShortValue("Min ext. temperature", "C", EMS_Thermostat.ibaMinExtTemperature, 0); // min ext temp for heating curve, in deg. } if (EMS_Thermostat.ibaBuildingType != EMS_VALUE_INT_NOTSET) { if (EMS_Thermostat.ibaBuildingType == EMS_VALUE_IBASettings_BUILDING_LIGHT) { @@ -488,7 +488,7 @@ void showInfo() { } } if (EMS_Thermostat.ibaClockOffset != EMS_VALUE_INT_NOTSET) { - _renderIntValue("Offset clock", "s", EMS_Thermostat.ibaClockOffset); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + _renderIntValue("Offset clock", "s", EMS_Thermostat.ibaClockOffset); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s } uint8_t _m_setpoint, _m_curr; @@ -1011,10 +1011,10 @@ bool publishEMSValues_settings() { } } if (EMS_Thermostat.ibaCalIntTemperature != EMS_VALUE_INT_NOTSET) { - rootSettings["CalIntTemperature"] = (float)EMS_Thermostat.ibaCalIntTemperature / 10; // offset int. temperature sensor, by * 0.1 Kelvin + rootSettings["CalIntTemperature"] = (float)EMS_Thermostat.ibaCalIntTemperature / 10; // offset int. temperature sensor, by * 0.1 Kelvin } if (EMS_Thermostat.ibaMinExtTemperature != EMS_VALUE_SHORT_NOTSET) { - rootSettings["MinExtTemperature"] = EMS_Thermostat.ibaMinExtTemperature; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 + rootSettings["MinExtTemperature"] = EMS_Thermostat.ibaMinExtTemperature; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 } if (EMS_Thermostat.ibaBuildingType != EMS_VALUE_INT_NOTSET) { if (EMS_Thermostat.ibaBuildingType == EMS_VALUE_IBASettings_BUILDING_LIGHT) { @@ -1026,7 +1026,7 @@ bool publishEMSValues_settings() { } } if (EMS_Thermostat.ibaClockOffset != EMS_VALUE_INT_NOTSET) { - rootSettings["clockOffset"] = EMS_Thermostat.ibaClockOffset; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + rootSettings["clockOffset"] = EMS_Thermostat.ibaClockOffset; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s } return (myESP.mqttPublish(TOPIC_SETTINGS_DATA, doc)); } @@ -1192,7 +1192,7 @@ bool publishEMSValues(bool force) { } if (ems_getBoilerEnabled() && (ems_Device_has_flags(EMS_DEVICE_UPDATE_FLAG_SETTINGS))) { - // never force publication of settings + // never force publication of settings settings = publishEMSValues_settings(); ems_Device_remove_flags(EMS_DEVICE_UPDATE_FLAG_SETTINGS); // unset flag } @@ -1670,7 +1670,7 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) { if (strcmp(first_cmd, "refresh") == 0) { do_regularUpdates(); - do_dailyUpdates(); + do_dailyUpdates(); ok = true; } @@ -2130,7 +2130,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { } uint8_t t = atoi((char *)data); if (t) { - ems_setSettingsDisplay(t-1); + ems_setSettingsDisplay(t - 1); } return; } diff --git a/src/ems.cpp b/src/ems.cpp index bf1e7df8c..656c765d1 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -104,12 +104,13 @@ void ems_init() { EMS_Thermostat.write_supported = false; EMS_Thermostat.device_id = EMS_ID_NONE; // settings - EMS_Thermostat.ibaMainDisplay = EMS_VALUE_INT_NOTSET; // display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 boiler temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp - EMS_Thermostat.ibaLanguage = EMS_VALUE_INT_NOTSET; // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian - EMS_Thermostat.ibaCalIntTemperature = EMS_VALUE_INT_NOTSET; // offset int. temperature sensor, by * 0.1 Kelvin - EMS_Thermostat.ibaMinExtTemperature = EMS_VALUE_SHORT_NOTSET; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 - EMS_Thermostat.ibaBuildingType = EMS_VALUE_INT_NOTSET; // building type: 0 = light, 1 = medium, 2 = heavy - EMS_Thermostat.ibaClockOffset = EMS_VALUE_INT_NOTSET; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + EMS_Thermostat.ibaMainDisplay = + EMS_VALUE_INT_NOTSET; // display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 boiler temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp + EMS_Thermostat.ibaLanguage = EMS_VALUE_INT_NOTSET; // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian + EMS_Thermostat.ibaCalIntTemperature = EMS_VALUE_INT_NOTSET; // offset int. temperature sensor, by * 0.1 Kelvin + EMS_Thermostat.ibaMinExtTemperature = EMS_VALUE_SHORT_NOTSET; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 + EMS_Thermostat.ibaBuildingType = EMS_VALUE_INT_NOTSET; // building type: 0 = light, 1 = medium, 2 = heavy + EMS_Thermostat.ibaClockOffset = EMS_VALUE_INT_NOTSET; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s // init all heating circuits for (uint8_t i = 0; i < EMS_THERMOSTAT_MAXHC; i++) { @@ -960,7 +961,6 @@ void _checkActive() { if (EMS_Boiler.selFlowTemp != EMS_VALUE_INT_NOTSET && EMS_Boiler.burnGas != EMS_VALUE_INT_NOTSET) { EMS_Boiler.heatingActive = ((EMS_Boiler.selFlowTemp >= EMS_BOILER_SELFLOWTEMP_HEATING) && (EMS_Boiler.burnGas == EMS_VALUE_BOOL_ON)); } - } /** @@ -1300,21 +1300,23 @@ void _process_IBASettingsMessage(_EMS_RxTelegram * EMS_RxTelegram) { // at init, and every 24h, send read request for settings parameters message, done with Ticker on do_dailyUpdates() // send 0B 90 A5 00 20: // 10 0B A5 00 00 02 00 00 FF F6 01 06 00 01 0D 03 03 - // 00 01 02 03 04 05 06 07 08 09 10 11 12 + // 00 01 02 03 04 05 06 07 08 09 10 11 12 // values validated for RC30N - uint8_t extTemp = 100; // Min. ext temperature is coded as int8, 0xF6=-10, 0x0 = 0, 0xFF=-1. 100 is out of permissible range + uint8_t extTemp = 100; // Min. ext temperature is coded as int8, 0xF6=-10, 0x0 = 0, 0xFF=-1. 100 is out of permissible range - _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaMainDisplay, EMS_OFFSET_IBASettings_Display); // display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 burner temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp - _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaLanguage, EMS_OFFSET_IBASettings_Language); // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian - _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaBuildingType, EMS_OFFSET_IBASettings_Building); // building type: 0 = light, 1 = medium, 2 = heavy + _setValue(EMS_RxTelegram, + &EMS_Thermostat.ibaMainDisplay, + EMS_OFFSET_IBASettings_Display); // display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 burner temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp + _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaLanguage, EMS_OFFSET_IBASettings_Language); // language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian + _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaBuildingType, EMS_OFFSET_IBASettings_Building); // building type: 0 = light, 1 = medium, 2 = heavy _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaCalIntTemperature, EMS_OFFSET_IBASettings_CalIntTemp); // offset int. temperature sensor, by * 0.1 Kelvin _setValue(EMS_RxTelegram, &extTemp, EMS_OFFSET_IBASettings_MinExtTemp); // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 if (extTemp != 100) { // code as signed short, to benefit from negative value rendering - EMS_Thermostat.ibaMinExtTemperature = (int16_t)(extTemp > 127) ? (extTemp-256) : extTemp; + EMS_Thermostat.ibaMinExtTemperature = (int16_t)(extTemp > 127) ? (extTemp - 256) : extTemp; } - _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaClockOffset, EMS_OFFSET_IBASettings_ClockOffset); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + _setValue(EMS_RxTelegram, &EMS_Thermostat.ibaClockOffset, EMS_OFFSET_IBASettings_ClockOffset); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s // publish settings to mqtt (assuming this is a very low frequency message), done in publishEMSValues_settings() ems_Device_add_flags(EMS_DEVICE_UPDATE_FLAG_SETTINGS); @@ -2814,16 +2816,16 @@ void ems_setSettingsLanguage(uint8_t lg) { EMS_TxTelegram.timestamp = millis(); // set timestamp EMS_Sys_Status.txRetryCount = 0; // reset retry counter - switch(lg) { - case EMS_VALUE_IBASettings_LANG_FRENCH: - case EMS_VALUE_IBASettings_LANG_GERMAN: - case EMS_VALUE_IBASettings_LANG_DUTCH: - case EMS_VALUE_IBASettings_LANG_ITALIAN: - myDebug_P(PSTR("Setting language to %d"),lg); - EMS_TxTelegram.dataValue = lg; - break; - default: - return; // invalid value + switch (lg) { + case EMS_VALUE_IBASettings_LANG_FRENCH: + case EMS_VALUE_IBASettings_LANG_GERMAN: + case EMS_VALUE_IBASettings_LANG_DUTCH: + case EMS_VALUE_IBASettings_LANG_ITALIAN: + myDebug_P(PSTR("Setting language to %d"), lg); + EMS_TxTelegram.dataValue = lg; + break; + default: + return; // invalid value } EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; @@ -2845,15 +2847,15 @@ void ems_setSettingsBuilding(uint8_t bg) { EMS_TxTelegram.timestamp = millis(); // set timestamp EMS_Sys_Status.txRetryCount = 0; // reset retry counter - switch(bg) { - case EMS_VALUE_IBASettings_BUILDING_LIGHT: - case EMS_VALUE_IBASettings_BUILDING_MEDIUM: - case EMS_VALUE_IBASettings_BUILDING_HEAVY: - myDebug_P(PSTR("Setting building to %d"),bg); - EMS_TxTelegram.dataValue = bg; - break; - default: - return; // invalid value + switch (bg) { + case EMS_VALUE_IBASettings_BUILDING_LIGHT: + case EMS_VALUE_IBASettings_BUILDING_MEDIUM: + case EMS_VALUE_IBASettings_BUILDING_HEAVY: + myDebug_P(PSTR("Setting building to %d"), bg); + EMS_TxTelegram.dataValue = bg; + break; + default: + return; // invalid value } EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; @@ -2875,21 +2877,21 @@ void ems_setSettingsDisplay(uint8_t ds) { EMS_TxTelegram.timestamp = millis(); // set timestamp EMS_Sys_Status.txRetryCount = 0; // reset retry counter - switch(ds) { - case EMS_VALUE_IBASettings_DISPLAY_INTTEMP: - case EMS_VALUE_IBASettings_DISPLAY_INTSETPOINT: - case EMS_VALUE_IBASettings_DISPLAY_EXTTEMP: - case EMS_VALUE_IBASettings_DISPLAY_BURNERTEMP: - case EMS_VALUE_IBASettings_DISPLAY_WWTEMP: - case EMS_VALUE_IBASettings_DISPLAY_FUNCMODE: - case EMS_VALUE_IBASettings_DISPLAY_TIME: - case EMS_VALUE_IBASettings_DISPLAY_DATE: - case EMS_VALUE_IBASettings_DISPLAY_SMOKETEMP: - myDebug_P(PSTR("Setting display to %d"),ds); - EMS_TxTelegram.dataValue = ds; - break; - default: - return; // invalid value + switch (ds) { + case EMS_VALUE_IBASettings_DISPLAY_INTTEMP: + case EMS_VALUE_IBASettings_DISPLAY_INTSETPOINT: + case EMS_VALUE_IBASettings_DISPLAY_EXTTEMP: + case EMS_VALUE_IBASettings_DISPLAY_BURNERTEMP: + case EMS_VALUE_IBASettings_DISPLAY_WWTEMP: + case EMS_VALUE_IBASettings_DISPLAY_FUNCMODE: + case EMS_VALUE_IBASettings_DISPLAY_TIME: + case EMS_VALUE_IBASettings_DISPLAY_DATE: + case EMS_VALUE_IBASettings_DISPLAY_SMOKETEMP: + myDebug_P(PSTR("Setting display to %d"), ds); + EMS_TxTelegram.dataValue = ds; + break; + default: + return; // invalid value } EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; diff --git a/src/ems.h b/src/ems.h index 88434ead8..abfe45f01 100644 --- a/src/ems.h +++ b/src/ems.h @@ -424,21 +424,21 @@ typedef struct { // Thermostat data typedef struct { - uint8_t device_id; // the device ID of the thermostat - uint8_t device_flags; // thermostat model flags - const char * device_desc_p; - uint8_t product_id; - char version[10]; - char datetime[25]; // HH:MM:SS DD/MM/YYYY - bool write_supported; + uint8_t device_id; // the device ID of the thermostat + uint8_t device_flags; // thermostat model flags + const char * device_desc_p; + uint8_t product_id; + char version[10]; + char datetime[25]; // HH:MM:SS DD/MM/YYYY + bool write_supported; // Installation parameters (tested on RC30) - uint8_t ibaMainDisplay; // 00, display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 burner temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp - uint8_t ibaLanguage; // 01, language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian - uint8_t ibaCalIntTemperature; // 02, offset int. temperature sensor, by * 0.1 Kelvin - int16_t ibaMinExtTemperature; // 05, min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 (actually a int8_t, coded as int16_t to benefit from negative value rendering) - uint8_t ibaBuildingType; // 06, building type: 0 = light, 1 = medium, 2 = heavy - uint8_t ibaClockOffset; // 12, offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s + uint8_t ibaMainDisplay; // 00, display on Thermostat: 0 int. temp, 1 int. setpoint, 2 ext. temp., 3 burner temp., 4 ww temp, 5 functioning mode, 6 time, 7 data, 9 smoke temp + uint8_t ibaLanguage; // 01, language on Thermostat: 0 german, 1 dutch, 2 french, 3 italian + uint8_t ibaCalIntTemperature; // 02, offset int. temperature sensor, by * 0.1 Kelvin + int16_t ibaMinExtTemperature; // 05, min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 (actually a int8_t, coded as int16_t to benefit from negative value rendering) + uint8_t ibaBuildingType; // 06, building type: 0 = light, 1 = medium, 2 = heavy + uint8_t ibaClockOffset; // 12, offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s _EMS_Thermostat_HC hc[EMS_THERMOSTAT_MAXHC]; // array for the 4 heating circuits } _EMS_Thermostat; diff --git a/src/ems_devices.h b/src/ems_devices.h index cf8151cc0..907ec4abd 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -53,13 +53,13 @@ #define EMS_OFFSET_UBASetPoints_flowtemp 0 // flow temp // Installation settings -#define EMS_TYPE_IBASettingsMessage 0xA5 // installation settings -#define EMS_OFFSET_IBASettings_Display 0 // display -#define EMS_OFFSET_IBASettings_Language 1 // language -#define EMS_OFFSET_IBASettings_MinExtTemp 5 // min. ext. temperature -#define EMS_OFFSET_IBASettings_Building 6 // building -#define EMS_OFFSET_IBASettings_CalIntTemp 2 // cal. int. temperature -#define EMS_OFFSET_IBASettings_ClockOffset 12 // clock offset +#define EMS_TYPE_IBASettingsMessage 0xA5 // installation settings +#define EMS_OFFSET_IBASettings_Display 0 // display +#define EMS_OFFSET_IBASettings_Language 1 // language +#define EMS_OFFSET_IBASettings_MinExtTemp 5 // min. ext. temperature +#define EMS_OFFSET_IBASettings_Building 6 // building +#define EMS_OFFSET_IBASettings_CalIntTemp 2 // cal. int. temperature +#define EMS_OFFSET_IBASettings_ClockOffset 12 // clock offset #define EMS_VALUE_IBASettings_LANG_GERMAN 0 #define EMS_VALUE_IBASettings_LANG_DUTCH 1 diff --git a/src/version.h b/src/version.h index 1086d0eba..84bf4b23e 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define APP_VERSION "1.9.5b57" +#define APP_VERSION "1.9.5b58"