From 4b4ef4b426c55861a715d0ddf3131ff6f3bb670e Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 27 Sep 2019 14:35:23 +0200 Subject: [PATCH] modifications for RC35 temps - https://github.com/proddy/EMS-ESP/issues/162 --- CHANGELOG.md | 13 ++++++++----- src/ems-esp.cpp | 11 +++++++++-- src/ems.cpp | 33 ++++++++++++++++++++++----------- src/ems.h | 6 ++++-- src/ems_devices.h | 4 +++- 5 files changed, 46 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae9a2f704..af06484fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,13 +5,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.9.1 beta] 2019-09-16 +## [1.9.1 beta] 2019-09-27 ### Added -- Support for multiple Heating Circuits (RC35 only for now and writing via telnet) - https://github.com/proddy/EMS-ESP/issues/162 -- mqttlog command also shows which MQTT topics it is subscribed too -- Optimized event log loading in web and added integrity checks on all config and log files +- Support for multiple Heating Circuits - https://github.com/proddy/EMS-ESP/issues/162 +- new `mqttlog` command also shows which MQTT topics it is subscribed too +- Optimized event log loading in web and added integrity checks on all config and log files during boot ### Fixed @@ -21,10 +21,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Web login password is now mandatory +- Faster detection of EMS devices on bus by using the 0x07 telegram instead of the brute-force scan +- Fixes to the default HA climate component .yaml file to support latest Home Assistance ('heat' added) +- Update documentation in Wiki on MQTT and troubleshooting ### Removed -- Removed `heating_circuit` parameter +- Removed `heating_circuit` config setting ## [1.9.0] 2019-09-01 diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index def52ba85..ee5a772a9 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -631,15 +631,22 @@ void showInfo() { // only show if we have data for the Heating Circuit if (EMS_Thermostat.hc[hc_num - 1].active) { myDebug_P(PSTR(" Heating Circuit %d"), hc_num); - // Render Current & Setpoint Room Temperature for each thermostat type - _renderShortValue(" Setpoint room temperature", "C", EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp, _m_setpoint); _renderShortValue(" Current room temperature", "C", EMS_Thermostat.hc[hc_num - 1].curr_roomTemp, _m_curr); // Render Day/Night/Holiday Temperature on RC35s + // there is no single setpoint temp, but one for day, night and vacation if (model == EMS_MODEL_RC35) { + if (EMS_Thermostat.hc[hc_num - 1].summer_mode) { + myDebug_P(PSTR(" Program is set to Summer mode")); + } else if (EMS_Thermostat.hc[hc_num - 1].holiday_mode) { + myDebug_P(PSTR(" Program is set to Holiday mode")); + } + _renderIntValue(" Day temperature", "C", EMS_Thermostat.hc[hc_num - 1].daytemp, 2); // convert to a single byte * 2 _renderIntValue(" Night temperature", "C", EMS_Thermostat.hc[hc_num - 1].nighttemp, 2); // convert to a single byte * 2 _renderIntValue(" Vacation temperature", "C", EMS_Thermostat.hc[hc_num - 1].holidaytemp, 2); // convert to a single byte * 2 + } else { + _renderShortValue(" Setpoint room temperature", "C", EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp, _m_setpoint); } // Render Termostat Mode, if we have a mode diff --git a/src/ems.cpp b/src/ems.cpp index c2265d916..746337425 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -256,8 +256,10 @@ void ems_init() { for (uint8_t i = 0; i < EMS_THERMOSTAT_MAXHC; i++) { EMS_Thermostat.hc[i].hc = i + 1; EMS_Thermostat.hc[i].active = false; - EMS_Thermostat.hc[i].mode = EMS_VALUE_INT_NOTSET; + EMS_Thermostat.hc[i].mode = EMS_VALUE_INT_NOTSET; // night, day, auto EMS_Thermostat.hc[i].day_mode = EMS_VALUE_INT_NOTSET; + EMS_Thermostat.hc[i].summer_mode = EMS_VALUE_INT_NOTSET; + EMS_Thermostat.hc[i].holiday_mode = EMS_VALUE_INT_NOTSET; EMS_Thermostat.hc[i].daytemp = EMS_VALUE_INT_NOTSET; EMS_Thermostat.hc[i].nighttemp = EMS_VALUE_INT_NOTSET; EMS_Thermostat.hc[i].holidaytemp = EMS_VALUE_INT_NOTSET; @@ -1400,28 +1402,37 @@ void _process_RC30StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { * 10 0B 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 * 10 0B 5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 * - * For reading the temp values only + * night mode: + * 10 00 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00 + * 10 00 48 00 00 00 10 00 E9 00 00 00 00 00 00 00 00 11 05 00 + * + * day mode: + * 10 0B 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00 + * 10 0B 48 00 00 00 10 00 E8 00 00 00 00 00 00 00 00 11 05 00 + * + * auto day: + * 10 00 3E 00 04 03 00 7D 00 00 00 00 00 00 00 00 00 11 05 00 + * 10 0B 48 00 04 03 00 00 EB 00 00 00 00 00 00 00 00 11 05 00 + * + * For reading the current room temperature only and picking up the modes * received every 60 seconds */ void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - // ignore if first byte is 0x00 - if (EMS_RxTelegram->data[0] == 0x00) { + // ignore if 14th byte is 0x00, which I think is flow temp? + if (EMS_RxTelegram->data[14] == 0x00) { return; } uint8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it? - // check if setpoint temp sensor is unavailable - if (EMS_RxTelegram->data[EMS_OFFSET_RC35StatusMessage_setpoint] != 0x7D) { - EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp = _toByte(EMS_OFFSET_RC35StatusMessage_setpoint); // is * 2 - } - // check if current temp sensor is unavailable if (EMS_RxTelegram->data[EMS_OFFSET_RC35StatusMessage_curr] != 0x7D) { EMS_Thermostat.hc[hc_num - 1].curr_roomTemp = _toShort(EMS_OFFSET_RC35StatusMessage_curr); // is * 10 } - EMS_Thermostat.hc[hc_num - 1].day_mode = _bitRead(EMS_OFFSET_RC35StatusMessage_mode, 1); // get day mode flag + EMS_Thermostat.hc[hc_num - 1].day_mode = _bitRead(EMS_OFFSET_RC35StatusMessage_mode, 1); // get day mode flag + EMS_Thermostat.hc[hc_num - 1].summer_mode = _bitRead(EMS_OFFSET_RC35StatusMessage_mode, 0); // summer mode? + EMS_Thermostat.hc[hc_num - 1].holiday_mode = _bitRead(EMS_OFFSET_RC35StatusMessage_mode1, 5); // holiday mode? EMS_Thermostat.hc[hc_num - 1].circuitcalctemp = _toByte(EMS_OFFSET_RC35Set_circuitcalctemp); // calculated temperature @@ -1623,7 +1634,7 @@ void _process_RC35Set(_EMS_RxTelegram * EMS_RxTelegram) { uint8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it? - EMS_Thermostat.hc[hc_num - 1].mode = _toByte(EMS_OFFSET_RC35Set_mode); + EMS_Thermostat.hc[hc_num - 1].mode = _toByte(EMS_OFFSET_RC35Set_mode); // night, day, auto EMS_Thermostat.hc[hc_num - 1].daytemp = _toByte(EMS_OFFSET_RC35Set_temp_day); // is * 2 EMS_Thermostat.hc[hc_num - 1].nighttemp = _toByte(EMS_OFFSET_RC35Set_temp_night); // is * 2 EMS_Thermostat.hc[hc_num - 1].holidaytemp = _toByte(EMS_OFFSET_RC35Set_temp_holiday); // is * 2 diff --git a/src/ems.h b/src/ems.h index a8ccf6d91..1ab088bff 100644 --- a/src/ems.h +++ b/src/ems.h @@ -385,8 +385,10 @@ typedef struct { bool active; // true if there is data for this HC int16_t setpoint_roomTemp; // current set temp int16_t curr_roomTemp; // current room temp - uint8_t mode; // 0=low, 1=manual, 2=auto - bool day_mode; // 0=night, 1=day + uint8_t mode; // 0=low, 1=manual, 2=auto (or night, day on RC35s) + uint8_t day_mode; // 0=night, 1=day + uint8_t summer_mode; + uint8_t holiday_mode; uint8_t daytemp; uint8_t nighttemp; uint8_t holidaytemp; diff --git a/src/ems_devices.h b/src/ems_devices.h index 9a33b38c7..ce683fb54 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -97,7 +97,9 @@ #define EMS_OFFSET_RC35StatusMessage_setpoint 2 // desired temp #define EMS_OFFSET_RC35StatusMessage_curr 3 // current temp -#define EMS_OFFSET_RC35StatusMessage_mode 1 //day mode +#define EMS_OFFSET_RC35StatusMessage_mode 1 // day mode, also summer on RC3's +#define EMS_OFFSET_RC35StatusMessage_mode1 0 // for holiday mode + #define EMS_TYPE_RC35Set_HC1 0x3D // for setting values like temp and mode (Working mode HC1) #define EMS_TYPE_RC35Set_HC2 0x47 // for setting values like temp and mode (Working mode HC2)