From 3005e0553d74bd447c7708760018c6fd9fed25a4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 1 Jan 2020 13:23:57 +0100 Subject: [PATCH 01/14] changed some values from ushort to short and notset-value to -32000 --- src/ems-esp.cpp | 12 +++++++++--- src/ems.cpp | 9 +++++++++ src/ems.h | 6 +++--- src/ems_utils.cpp | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 728b45b33..e15787e9f 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -441,6 +441,8 @@ void showInfo() { _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 } + if (EMS_Thermostat.hc[hc_num - 1].circuitcalctemp != EMS_VALUE_USHORT_NOTSET) + _renderIntValue(" calculatet flow temperature", "C",EMS_Thermostat.hc[hc_num - 1].circuitcalctemp); // Render Thermostat Mode _EMS_THERMOSTAT_MODE thermoMode; @@ -472,15 +474,19 @@ void showInfo() { if (ems_getMixingDeviceEnabled()) { myDebug_P(PSTR("")); // newline myDebug_P(PSTR("%sMixing module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF); - _renderUShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); + myDebug_P(PSTR(" Mixing: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_MIXING, buffer_type,false)); + if (EMS_Boiler.switchTemp != EMS_VALUE_SHORT_NOTSET) + _renderShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); for (uint8_t hc_num = 1; hc_num <= EMS_THERMOSTAT_MAXHC; hc_num++) { if (EMS_Mixing.hc[hc_num - 1].active) { myDebug_P(PSTR(" Mixing Circuit %d"), hc_num); - _renderUShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); + if (EMS_Mixing.hc[hc_num - 1].flowTemp != EMS_VALUE_SHORT_NOTSET) + _renderShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) _renderIntValue(" Setpoint flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowSetTemp); - _renderIntValue(" Current pump modulation", "%", EMS_Mixing.hc[hc_num - 1].pumpMod); + if (EMS_Mixing.hc[hc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) + _renderIntValue(" Current pump modulation", "%", EMS_Mixing.hc[hc_num - 1].pumpMod); if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET) _renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus); } diff --git a/src/ems.cpp b/src/ems.cpp index b47b791f2..b052decf9 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -161,6 +161,7 @@ void ems_init() { EMS_Boiler.burnStarts = EMS_VALUE_LONG_NOTSET; // # burner restarts EMS_Boiler.burnWorkMin = EMS_VALUE_LONG_NOTSET; // Total burner operating time EMS_Boiler.heatWorkMin = EMS_VALUE_LONG_NOTSET; // Total heat operating time + EMS_Boiler.switchTemp = EMS_VALUE_SHORT_NOTSET; // UBAMonitorWWMessage EMS_Boiler.wWCurTmp = EMS_VALUE_USHORT_NOTSET; // Warm Water current temperature @@ -1243,6 +1244,7 @@ void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { if (hc != 0) { return; // invalid type } + //hc++; EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); @@ -1767,6 +1769,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) { EMS_Mixing.device_desc_p = device_desc_p; EMS_Mixing.device_flags = flags; EMS_Mixing.detected = true; + strlcpy(EMS_Mixing.version, version, sizeof(EMS_Mixing.version)); ems_doReadCommand(EMS_TYPE_MMPLUSStatusMessage_HC1, device_id); // fetch MM values } } @@ -1979,6 +1982,12 @@ char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, boo product_id = EMS_HeatPump.product_id; device_desc_p = EMS_HeatPump.device_desc_p; version = EMS_HeatPump.version; + } else if (device_type == EMS_DEVICE_TYPE_MIXING) { + enabled = ems_getMixingDeviceEnabled(); + device_id = EMS_Mixing.device_id; + product_id = EMS_Mixing.product_id; + device_desc_p = EMS_Mixing.device_desc_p; + version = EMS_Mixing.version; } if (!enabled) { diff --git a/src/ems.h b/src/ems.h index efc3a3f27..c6fde8fd7 100644 --- a/src/ems.h +++ b/src/ems.h @@ -27,7 +27,7 @@ #define EMS_VALUE_BOOL_ON2 0xFF // boolean true, EMS sometimes uses 0xFF for TRUE #define EMS_VALUE_BOOL_OFF 0x00 // boolean false #define EMS_VALUE_INT_NOTSET 0xFF // for 8-bit unsigned ints/bytes -#define EMS_VALUE_SHORT_NOTSET -32768 // for 2-byte signed shorts +#define EMS_VALUE_SHORT_NOTSET -32000 //-32768 // for 2-byte signed shorts #define EMS_VALUE_USHORT_NOTSET 0x8000 // for 2-byte unsigned shorts #define EMS_VALUE_LONG_NOTSET 0xFFFFFF // for 3-byte longs #define EMS_VALUE_BOOL_NOTSET 0xFE // random number that's not 0, 1 or FF @@ -282,7 +282,7 @@ typedef struct { uint32_t burnStarts; // # burner starts uint32_t burnWorkMin; // Total burner operating time uint32_t heatWorkMin; // Total heat operating time - uint16_t switchTemp; // Switch temperature + int16_t switchTemp; // Switch temperature // UBAMonitorWWMessage uint16_t wWCurTmp; // Warm Water current temperature @@ -322,7 +322,7 @@ typedef struct { typedef struct { uint8_t hc; // heating circuit 1, 2, 3 or 4 bool active; // true if there is data for this HC - uint16_t flowTemp; + int16_t flowTemp; uint8_t pumpMod; uint8_t valveStatus; uint8_t flowSetTemp; diff --git a/src/ems_utils.cpp b/src/ems_utils.cpp index 4d61cdfef..286020c13 100644 --- a/src/ems_utils.cpp +++ b/src/ems_utils.cpp @@ -40,7 +40,7 @@ char * _bool_to_char(char * s, uint8_t value) { // negative values are assumed stored as 1-compliment (https://medium.com/@LeeJulija/how-integers-are-stored-in-memory-using-twos-complement-5ba04d61a56c) char * _short_to_char(char * s, int16_t value, uint8_t decimals) { // remove errors or invalid values - if (value == EMS_VALUE_SHORT_NOTSET) { + if (value == EMS_VALUE_SHORT_NOTSET || value == EMS_VALUE_USHORT_NOTSET) { strlcpy(s, "?", 10); return (s); } From 0b6c1715d55c42aa497b0f398e218d15ff56ea64 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 1 Jan 2020 14:00:29 +0100 Subject: [PATCH 02/14] changed some values from ushort to short and notset-value to -32000 --- src/ems.cpp | 1 - src/ems.h | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ems.cpp b/src/ems.cpp index 98ea21195..62691d884 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1244,7 +1244,6 @@ void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { if (hc != 0) { return; // invalid type } - //hc++; EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); diff --git a/src/ems.h b/src/ems.h index c6fde8fd7..152033679 100644 --- a/src/ems.h +++ b/src/ems.h @@ -27,7 +27,7 @@ #define EMS_VALUE_BOOL_ON2 0xFF // boolean true, EMS sometimes uses 0xFF for TRUE #define EMS_VALUE_BOOL_OFF 0x00 // boolean false #define EMS_VALUE_INT_NOTSET 0xFF // for 8-bit unsigned ints/bytes -#define EMS_VALUE_SHORT_NOTSET -32000 //-32768 // for 2-byte signed shorts +#define EMS_VALUE_SHORT_NOTSET -32000 // was -32768 for 2-byte signed shorts #define EMS_VALUE_USHORT_NOTSET 0x8000 // for 2-byte unsigned shorts #define EMS_VALUE_LONG_NOTSET 0xFFFFFF // for 3-byte longs #define EMS_VALUE_BOOL_NOTSET 0xFE // random number that's not 0, 1 or FF @@ -282,7 +282,7 @@ typedef struct { uint32_t burnStarts; // # burner starts uint32_t burnWorkMin; // Total burner operating time uint32_t heatWorkMin; // Total heat operating time - int16_t switchTemp; // Switch temperature + int16_t switchTemp; // Switch temperature // UBAMonitorWWMessage uint16_t wWCurTmp; // Warm Water current temperature @@ -322,7 +322,7 @@ typedef struct { typedef struct { uint8_t hc; // heating circuit 1, 2, 3 or 4 bool active; // true if there is data for this HC - int16_t flowTemp; + int16_t flowTemp; uint8_t pumpMod; uint8_t valveStatus; uint8_t flowSetTemp; From dcbccc86044e207f7572757ef2de0551f0fd2579 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 1 Jan 2020 18:35:54 +0100 Subject: [PATCH 03/14] MM10 assigned to HC2 --- src/ems-esp.cpp | 2 +- src/ems.cpp | 5 ++--- src/ems_devices.h | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 5a2c16b4d..6de507d08 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -442,7 +442,7 @@ void showInfo() { _renderIntValue(" Vacation temperature", "C", EMS_Thermostat.hc[hc_num - 1].holidaytemp, 2); // convert to a single byte * 2 } if (EMS_Thermostat.hc[hc_num - 1].circuitcalctemp != EMS_VALUE_USHORT_NOTSET) - _renderIntValue(" calculatet flow temperature", "C",EMS_Thermostat.hc[hc_num - 1].circuitcalctemp); + _renderIntValue(" Calculatet flow temperature", "C",EMS_Thermostat.hc[hc_num - 1].circuitcalctemp); // Render Thermostat Mode _EMS_THERMOSTAT_MODE thermoMode; diff --git a/src/ems.cpp b/src/ems.cpp index 53d7d96a7..332ab5b6b 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1240,9 +1240,9 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMPLUSStatusMessage_valve_status); } -// 0xAB, 0xAC - for MM10 HC1 and HC2 on a switch +// 0xAB for MM10 HC2 void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage_HC1); // 0 to 3 + uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage_HC2+1); // 1 to 3 if (hc >= EMS_THERMOSTAT_MAXHC) { return; // invalid type } @@ -2732,7 +2732,6 @@ const _EMS_Type EMS_Types[] = { // Mixing devices MM10 - MM400 {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC1, "MMPLUSStatusMessage_HC1", _process_MMPLUSStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC2, "MMPLUSStatusMessage_HC2", _process_MMPLUSStatusMessage}, - {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage_HC1, "MMStatusMessage", _process_MMStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage_HC2, "MMStatusMessage", _process_MMStatusMessage} }; diff --git a/src/ems_devices.h b/src/ems_devices.h index 3dc105356..8542f7488 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -198,8 +198,7 @@ const _EMS_Device_Types EMS_Devices_Types[] = { #define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent // MM10 -#define EMS_TYPE_MMStatusMessage_HC1 0xAB // mixer status HC1 -#define EMS_TYPE_MMStatusMessage_HC2 0xAC // mixer status HC2 +#define EMS_TYPE_MMStatusMessage_HC2 0xAB // mixer status HC2 #define EMS_OFFSET_MMStatusMessage_flow_set 0 // flow setpoint #define EMS_OFFSET_MMStatusMessage_flow_temp 1 // flow temperature #define EMS_OFFSET_MMStatusMessage_pump_mod 3 // pump modulation in percent From a8aa5e4f7f6223075d290a4cdae3a6ecb888c7fa Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 2 Jan 2020 09:43:26 +0100 Subject: [PATCH 04/14] merge with proddy dev branch --- src/ems-esp.cpp | 8 ++++---- src/ems.cpp | 9 +++------ src/ems.h | 2 +- src/ems_devices.h | 2 +- src/ems_utils.cpp | 2 +- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 6de507d08..7da76ce3a 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -475,17 +475,17 @@ void showInfo() { myDebug_P(PSTR("")); // newline myDebug_P(PSTR("%sMixing module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF); myDebug_P(PSTR(" Mixing: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_MIXING, buffer_type,false)); - if (EMS_Boiler.switchTemp != EMS_VALUE_SHORT_NOTSET) + //if (EMS_Boiler.switchTemp != EMS_VALUE_SHORT_NOTSET) _renderShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); for (uint8_t hc_num = 1; hc_num <= EMS_THERMOSTAT_MAXHC; hc_num++) { if (EMS_Mixing.hc[hc_num - 1].active) { myDebug_P(PSTR(" Mixing Circuit %d"), hc_num); - if (EMS_Mixing.hc[hc_num - 1].flowTemp != EMS_VALUE_SHORT_NOTSET) + //if (EMS_Mixing.hc[hc_num - 1].flowTemp != EMS_VALUE_SHORT_NOTSET) _renderShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); - if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) + //if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) _renderIntValue(" Setpoint flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowSetTemp); - if (EMS_Mixing.hc[hc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) + //if (EMS_Mixing.hc[hc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) _renderIntValue(" Current pump modulation", "%", EMS_Mixing.hc[hc_num - 1].pumpMod); if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET) _renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus); diff --git a/src/ems.cpp b/src/ems.cpp index 332ab5b6b..4d3a72943 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1240,12 +1240,9 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMPLUSStatusMessage_valve_status); } -// 0xAB for MM10 HC2 +// 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage_HC2+1); // 1 to 3 - if (hc >= EMS_THERMOSTAT_MAXHC) { - return; // invalid type - } + uint8_t hc = 1; // fixed, for 0xAB EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); @@ -2732,7 +2729,7 @@ const _EMS_Type EMS_Types[] = { // Mixing devices MM10 - MM400 {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC1, "MMPLUSStatusMessage_HC1", _process_MMPLUSStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC2, "MMPLUSStatusMessage_HC2", _process_MMPLUSStatusMessage}, - {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage_HC2, "MMStatusMessage", _process_MMStatusMessage} + {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage, "MMStatusMessage", _process_MMStatusMessage} }; diff --git a/src/ems.h b/src/ems.h index 152033679..6badb513e 100644 --- a/src/ems.h +++ b/src/ems.h @@ -28,7 +28,7 @@ #define EMS_VALUE_BOOL_OFF 0x00 // boolean false #define EMS_VALUE_INT_NOTSET 0xFF // for 8-bit unsigned ints/bytes #define EMS_VALUE_SHORT_NOTSET -32000 // was -32768 for 2-byte signed shorts -#define EMS_VALUE_USHORT_NOTSET 0x8000 // for 2-byte unsigned shorts +#define EMS_VALUE_USHORT_NOTSET 32000 // was 0x8000 for 2-byte unsigned shorts #define EMS_VALUE_LONG_NOTSET 0xFFFFFF // for 3-byte longs #define EMS_VALUE_BOOL_NOTSET 0xFE // random number that's not 0, 1 or FF diff --git a/src/ems_devices.h b/src/ems_devices.h index 8542f7488..5a52eb7ba 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -198,7 +198,7 @@ const _EMS_Device_Types EMS_Devices_Types[] = { #define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent // MM10 -#define EMS_TYPE_MMStatusMessage_HC2 0xAB // mixer status HC2 +#define EMS_TYPE_MMStatusMessage 0xAB // mixer status #define EMS_OFFSET_MMStatusMessage_flow_set 0 // flow setpoint #define EMS_OFFSET_MMStatusMessage_flow_temp 1 // flow temperature #define EMS_OFFSET_MMStatusMessage_pump_mod 3 // pump modulation in percent diff --git a/src/ems_utils.cpp b/src/ems_utils.cpp index a617018f4..6746f289c 100644 --- a/src/ems_utils.cpp +++ b/src/ems_utils.cpp @@ -40,7 +40,7 @@ char * _bool_to_char(char * s, uint8_t value) { // negative values are assumed stored as 1-compliment (https://medium.com/@LeeJulija/how-integers-are-stored-in-memory-using-twos-complement-5ba04d61a56c) char * _short_to_char(char * s, int16_t value, uint8_t decimals) { // remove errors or invalid values - if (value == EMS_VALUE_SHORT_NOTSET || value == EMS_VALUE_USHORT_NOTSET) { + if (value <= EMS_VALUE_SHORT_NOTSET) { strlcpy(s, "?", 10); return (s); } From 5c6f931d5a3de1654a416fe1ebbd1775d2867bff Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 4 Jan 2020 09:55:22 +0100 Subject: [PATCH 05/14] HC2 fixed for MM10 --- src/ems.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ems.cpp b/src/ems.cpp index c4d213c3d..4d3a72943 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1242,7 +1242,7 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { // 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = 0; // fixed, for 0xAB + uint8_t hc = 1; // fixed, for 0xAB EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); From 6a2fd4402849f2d42e8358e2cc906435388e76c2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 4 Jan 2020 12:28:50 +0100 Subject: [PATCH 06/14] MM10 Mixing circuit defaults to hc1 --- src/ems.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ems.cpp b/src/ems.cpp index 45cd3fad9..0c54f0007 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1244,7 +1244,7 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { // 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = 1; // fixed, for 0xAB + uint8_t hc = 0; // fixed, for 0xAB EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); From a45aae4b98c0eaf8c81ed2073e4b39322ccb2557 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 4 Jan 2020 13:43:14 +0100 Subject: [PATCH 07/14] fixed bug in _getHeatingCirciut --- src/ems.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ems.cpp b/src/ems.cpp index 0c54f0007..845fd4336 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1244,7 +1244,7 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { // 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = 0; // fixed, for 0xAB + uint8_t hc = 1; // fixed, for 0xAB EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); @@ -1371,13 +1371,13 @@ int8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram) { int8_t hc; - if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC1) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC1)) { + if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC1) || (EMS_RxTelegram->type == EMS_TYPE_RC35Set_HC1)) { hc = 0; - } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC2) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC2)) { + } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC2) || (EMS_RxTelegram->type == EMS_TYPE_RC35Set_HC2)) { hc = 1; - } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC3) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC3)) { + } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC3) || (EMS_RxTelegram->type == EMS_TYPE_RC35Set_HC3)) { hc = 2; - } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC4) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC4)) { + } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC4) || (EMS_RxTelegram->type == EMS_TYPE_RC35Set_HC4)) { hc = 3; } else { return -1; // not a valid HC @@ -2776,7 +2776,7 @@ const _EMS_Type EMS_Types[] = { {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC1, "RC35StatusMessage_HC1", _process_RC35StatusMessage}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC2, "RC35Set_HC2", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC2, "RC35StatusMessage_HC2", _process_RC35StatusMessage}, - {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC3, "RC35Set_HC2", _process_RC35Set}, + {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC3, "RC35Set_HC3", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC3, "RC35StatusMessage_HC3", _process_RC35StatusMessage}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC4, "RC35Set_HC4", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC4, "RC35StatusMessage_HC4", _process_RC35StatusMessage}, From 05377059242eb4cd1524961324325330ad28c91a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 4 Jan 2020 16:05:21 +0100 Subject: [PATCH 08/14] Fix unknown device --- src/ems.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ems.cpp b/src/ems.cpp index 5375cac26..5d0279c06 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -161,6 +161,7 @@ void ems_init() { EMS_Boiler.burnStarts = EMS_VALUE_LONG_NOTSET; // # burner restarts EMS_Boiler.burnWorkMin = EMS_VALUE_LONG_NOTSET; // Total burner operating time EMS_Boiler.heatWorkMin = EMS_VALUE_LONG_NOTSET; // Total heat operating time + EMS_Boiler.switchTemp = EMS_VALUE_SHORT_NOTSET; // UBAMonitorWWMessage EMS_Boiler.wWCurTmp = EMS_VALUE_USHORT_NOTSET; // Warm Water current temperature @@ -1243,7 +1244,7 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { // 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { - uint8_t hc = 0; // fixed, for 0xAB + uint8_t hc = 1; // fixed, for 0xAB EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); @@ -1735,7 +1736,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) { uint8_t i = 0; uint8_t found_index = 0; bool typeFound = false; - while (i++ < _EMS_Devices_max) { + while (i < _EMS_Devices_max) { if (EMS_Devices[i].product_id == product_id) { // we have a matching product id /* @@ -1755,6 +1756,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) { found_index = i; break; } + i++; } // if not found, just add it as an unknown device and exit @@ -1812,6 +1814,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) { EMS_Mixing.device_desc_p = device_desc_p; EMS_Mixing.device_flags = flags; EMS_Mixing.detected = true; + strlcpy(EMS_Mixing.version, version, sizeof(EMS_Mixing.version)); ems_doReadCommand(EMS_TYPE_MMPLUSStatusMessage_HC1, device_id); // fetch MM values } } @@ -2024,6 +2027,12 @@ char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, boo product_id = EMS_HeatPump.product_id; device_desc_p = EMS_HeatPump.device_desc_p; version = EMS_HeatPump.version; + } else if (device_type == EMS_DEVICE_TYPE_MIXING) { + enabled = ems_getMixingDeviceEnabled(); + device_id = EMS_Mixing.device_id; + product_id = EMS_Mixing.product_id; + device_desc_p = EMS_Mixing.device_desc_p; + version = EMS_Mixing.version; } if (!enabled) { @@ -2798,7 +2807,7 @@ const _EMS_Type EMS_Types[] = { {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC1, "RC35StatusMessage_HC1", _process_RC35StatusMessage}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC2, "RC35Set_HC2", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC2, "RC35StatusMessage_HC2", _process_RC35StatusMessage}, - {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC3, "RC35Set_HC2", _process_RC35Set}, + {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC3, "RC35Set_HC3", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC3, "RC35StatusMessage_HC3", _process_RC35StatusMessage}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35Set_HC4, "RC35Set_HC4", _process_RC35Set}, {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RC35StatusMessage_HC4, "RC35StatusMessage_HC4", _process_RC35StatusMessage}, From 1c424d372fb80d79838d91a4902ff453af72ad2b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 12 Jan 2020 09:59:19 +0100 Subject: [PATCH 09/14] change command for WW-OneTime --- src/ems-esp.cpp | 87 +++++++++++++++++++++++++------------------------ src/ems.cpp | 8 +++-- 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 132f22a68..706354e7a 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -302,6 +302,7 @@ void showInfo() { _renderIntValue("Warm Water selected temperature", "C", EMS_Boiler.wWSelTemp); _renderIntValue("Warm Water desinfection temperature", "C", EMS_Boiler.wWDesinfectTemp); + _renderBoolValue("Warm Water Circulation active",EMS_Boiler.wWCirc); // UBAMonitorWWMessage _renderUShortValue("Warm Water current temperature", "C", EMS_Boiler.wWCurTmp); @@ -340,7 +341,7 @@ void showInfo() { _renderIntValue("Boiler circuit pump modulation min power", "%", EMS_Boiler.pump_mod_min); // UBAMonitorSlow - if (EMS_Boiler.extTemp != EMS_VALUE_SHORT_NOTSET) { + if (EMS_Boiler.extTemp > EMS_VALUE_SHORT_NOTSET) { _renderShortValue("Outside temperature", "C", EMS_Boiler.extTemp); } _renderUShortValue("Boiler temperature", "C", EMS_Boiler.boilTemp); @@ -445,7 +446,7 @@ void showInfo() { _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 } - if (EMS_Thermostat.hc[hc_num - 1].circuitcalctemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].circuitcalctemp < EMS_VALUE_USHORT_NOTSET) _renderIntValue(" Calculatet flow temperature", "C",EMS_Thermostat.hc[hc_num - 1].circuitcalctemp); // Render Thermostat Mode @@ -479,13 +480,13 @@ void showInfo() { myDebug_P(PSTR("")); // newline myDebug_P(PSTR("%sMixing module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF); myDebug_P(PSTR(" Mixing: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_MIXING, buffer_type,false)); - //if (EMS_Boiler.switchTemp != EMS_VALUE_SHORT_NOTSET) + //if (EMS_Boiler.switchTemp > EMS_VALUE_SHORT_NOTSET) _renderShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); for (uint8_t hc_num = 1; hc_num <= EMS_THERMOSTAT_MAXHC; hc_num++) { if (EMS_Mixing.hc[hc_num - 1].active) { myDebug_P(PSTR(" Mixing Circuit %d"), hc_num); - //if (EMS_Mixing.hc[hc_num - 1].flowTemp != EMS_VALUE_SHORT_NOTSET) + //if (EMS_Mixing.hc[hc_num - 1].flowTemp > EMS_VALUE_SHORT_NOTSET) _renderShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); //if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) _renderIntValue(" Setpoint flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowSetTemp); @@ -588,23 +589,23 @@ void publishEMSValues(bool force) { if (EMS_Boiler.wWCircPump != EMS_VALUE_BOOL_NOTSET) rootBoiler["wWCircPump"] = EMS_Boiler.wWCircPump; - if (EMS_Boiler.extTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Boiler.extTemp > EMS_VALUE_SHORT_NOTSET) rootBoiler["outdoorTemp"] = (float)EMS_Boiler.extTemp / 10; - if (EMS_Boiler.wWCurTmp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.wWCurTmp < EMS_VALUE_USHORT_NOTSET) rootBoiler["wWCurTmp"] = (float)EMS_Boiler.wWCurTmp / 10; if (EMS_Boiler.wWCurFlow != EMS_VALUE_INT_NOTSET) rootBoiler["wWCurFlow"] = (float)EMS_Boiler.wWCurFlow / 10; - if (EMS_Boiler.curFlowTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.curFlowTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["curFlowTemp"] = (float)EMS_Boiler.curFlowTemp / 10; - if (EMS_Boiler.retTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.retTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["retTemp"] = (float)EMS_Boiler.retTemp / 10; - if (EMS_Boiler.switchTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.switchTemp > EMS_VALUE_SHORT_NOTSET) rootBoiler["switchTemp"] = (float)EMS_Boiler.switchTemp / 10; if (EMS_Boiler.sysPress != EMS_VALUE_INT_NOTSET) rootBoiler["sysPress"] = (float)EMS_Boiler.sysPress / 10; - if (EMS_Boiler.boilTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.boilTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["boilTemp"] = (float)EMS_Boiler.boilTemp / 10; - if (EMS_Boiler.exhaustTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.exhaustTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["exhaustTemp"] = (float)EMS_Boiler.exhaustTemp / 10; if (EMS_Boiler.wWActivated != EMS_VALUE_BOOL_NOTSET) rootBoiler["wWActivated"] = _bool_to_char(s, EMS_Boiler.wWActivated); @@ -612,10 +613,13 @@ void publishEMSValues(bool force) { if (EMS_Boiler.wWActivated != EMS_VALUE_BOOL_NOTSET) rootBoiler["wWOnetime"] = _bool_to_char(s, EMS_Boiler.wWOneTime); + if (EMS_Boiler.wWCirc != EMS_VALUE_BOOL_NOTSET) + rootBoiler["wWCirc"] = _bool_to_char(s, EMS_Boiler.wWCirc); + if (EMS_Boiler.burnGas != EMS_VALUE_BOOL_NOTSET) rootBoiler["burnGas"] = _bool_to_char(s, EMS_Boiler.burnGas); - if (EMS_Boiler.flameCurr != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.flameCurr < EMS_VALUE_USHORT_NOTSET) rootBoiler["flameCurr"] = (float)(int16_t)EMS_Boiler.flameCurr / 10; if (EMS_Boiler.heatPmp != EMS_VALUE_BOOL_NOTSET) @@ -627,9 +631,6 @@ void publishEMSValues(bool force) { if (EMS_Boiler.ignWork != EMS_VALUE_BOOL_NOTSET) rootBoiler["ignWork"] = _bool_to_char(s, EMS_Boiler.ignWork); - if (EMS_Boiler.wWCirc != EMS_VALUE_BOOL_NOTSET) - rootBoiler["wWCirc"] = _bool_to_char(s, EMS_Boiler.wWCirc); - if (EMS_Boiler.heating_temp != EMS_VALUE_INT_NOTSET) rootBoiler["heating_temp"] = EMS_Boiler.heating_temp; if (EMS_Boiler.pump_mod_max != EMS_VALUE_INT_NOTSET) @@ -654,7 +655,7 @@ void publishEMSValues(bool force) { if (abs(EMS_Boiler.heatWorkMin) != EMS_VALUE_LONG_NOTSET) rootBoiler["heatWorkMin"] = (float)EMS_Boiler.heatWorkMin; - if (EMS_Boiler.serviceCode != EMS_VALUE_USHORT_NOTSET) { + if (EMS_Boiler.serviceCode < EMS_VALUE_USHORT_NOTSET) { rootBoiler["ServiceCode"] = EMS_Boiler.serviceCodeChar; rootBoiler["ServiceCodeNumber"] = EMS_Boiler.serviceCode; } @@ -696,19 +697,19 @@ void publishEMSValues(bool force) { // different logic depending on thermostat types if (model == EMS_DEVICE_FLAG_EASY) { - if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 100; - if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->curr_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_CURRTEMP] = (float)thermostat->curr_roomTemp / 100; } else if (model == EMS_DEVICE_FLAG_JUNKERS) { - if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 10; - if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->curr_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_CURRTEMP] = (float)thermostat->curr_roomTemp / 10; } else { - if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 2; - if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (thermostat->curr_roomTemp > EMS_VALUE_SHORT_NOTSET) dataThermostat[THERMOSTAT_CURRTEMP] = (float)thermostat->curr_roomTemp / 10; if (thermostat->daytemp != EMS_VALUE_INT_NOTSET) @@ -764,7 +765,7 @@ void publishEMSValues(bool force) { strlcat(hc, _int_to_char(s, mixing->hc), sizeof(hc)); JsonObject dataMixing = rootMixing.createNestedObject(hc); - if (mixing->flowTemp != EMS_VALUE_SHORT_NOTSET) + if (mixing->flowTemp > EMS_VALUE_SHORT_NOTSET) dataMixing["flowTemp"] = (float)mixing->flowTemp / 10; if (mixing->flowSetTemp != EMS_VALUE_INT_NOTSET) dataMixing["setflowTemp"] = mixing->flowSetTemp; @@ -788,10 +789,10 @@ void publishEMSValues(bool force) { doc.clear(); JsonObject rootSM = doc.to(); - if (EMS_SolarModule.collectorTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_SolarModule.collectorTemp > EMS_VALUE_SHORT_NOTSET) rootSM[SM_COLLECTORTEMP] = (float)EMS_SolarModule.collectorTemp / 10; - if (EMS_SolarModule.bottomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_SolarModule.bottomTemp > EMS_VALUE_SHORT_NOTSET) rootSM[SM_BOTTOMTEMP] = (float)EMS_SolarModule.bottomTemp / 10; if (EMS_SolarModule.pumpModulation != EMS_VALUE_INT_NOTSET) @@ -805,13 +806,13 @@ void publishEMSValues(bool force) { rootSM[SM_PUMPWORKMIN] = (float)EMS_SolarModule.pumpWorkMin; } - if (EMS_SolarModule.EnergyLastHour != EMS_VALUE_USHORT_NOTSET) + if (EMS_SolarModule.EnergyLastHour < EMS_VALUE_USHORT_NOTSET) rootSM[SM_ENERGYLASTHOUR] = (float)EMS_SolarModule.EnergyLastHour / 10; - if (EMS_SolarModule.EnergyToday != EMS_VALUE_USHORT_NOTSET) + if (EMS_SolarModule.EnergyToday < EMS_VALUE_USHORT_NOTSET) rootSM[SM_ENERGYTODAY] = EMS_SolarModule.EnergyToday; - if (EMS_SolarModule.EnergyTotal != EMS_VALUE_USHORT_NOTSET) + if (EMS_SolarModule.EnergyTotal < EMS_VALUE_USHORT_NOTSET) rootSM[SM_ENERGYTOTAL] = (float)EMS_SolarModule.EnergyTotal / 10; data[0] = '\0'; // reset data for next package @@ -1694,24 +1695,24 @@ void WebCallback(JsonObject root) { char buffer[200]; thermostat["tm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_THERMOSTAT, buffer, true); - uint8_t hc_num = EMS_THERMOSTAT_DEFAULTHC; // default to HC1 + uint8_t hc_num = 1; // default to HC1 uint8_t model = ems_getThermostatModel(); - + while (hc_num <= EMS_THERMOSTAT_MAXHC && !EMS_Thermostat.hc[hc_num - 1].active) hc_num++; // Render Current & Setpoint Room Temperature if (model == EMS_DEVICE_FLAG_EASY) { - if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 100; - if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["tc"] = (float)EMS_Thermostat.hc[hc_num - 1].curr_roomTemp / 100; } else if (model == EMS_DEVICE_FLAG_JUNKERS) { - if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 10; - if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["tc"] = (float)EMS_Thermostat.hc[hc_num - 1].curr_roomTemp / 10; } else { - if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 2; - if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp > EMS_VALUE_SHORT_NOTSET) thermostat["tc"] = (float)EMS_Thermostat.hc[hc_num - 1].curr_roomTemp / 10; } @@ -1744,10 +1745,10 @@ void WebCallback(JsonObject root) { if (EMS_Boiler.curFlowTemp != EMS_VALUE_INT_NOTSET) boiler["b4"] = EMS_Boiler.curFlowTemp / 10; - if (EMS_Boiler.boilTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.boilTemp < EMS_VALUE_USHORT_NOTSET) boiler["b5"] = (float)EMS_Boiler.boilTemp / 10; - if (EMS_Boiler.retTemp != EMS_VALUE_USHORT_NOTSET) + if (EMS_Boiler.retTemp < EMS_VALUE_USHORT_NOTSET) boiler["b6"] = (float)EMS_Boiler.retTemp / 10; } else { @@ -1762,10 +1763,10 @@ void WebCallback(JsonObject root) { char buffer[200]; sm["sm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_SOLAR, buffer, true); - if (EMS_SolarModule.collectorTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_SolarModule.collectorTemp > EMS_VALUE_SHORT_NOTSET) sm["sm1"] = (float)EMS_SolarModule.collectorTemp / 10; // Collector temperature oC - if (EMS_SolarModule.bottomTemp != EMS_VALUE_SHORT_NOTSET) + if (EMS_SolarModule.bottomTemp > EMS_VALUE_SHORT_NOTSET) sm["sm2"] = (float)EMS_SolarModule.bottomTemp / 10; // Bottom temperature oC if (EMS_SolarModule.pumpModulation != EMS_VALUE_INT_NOTSET) @@ -1776,13 +1777,13 @@ void WebCallback(JsonObject root) { sm["sm4"] = _bool_to_char(s, EMS_SolarModule.pump); // Pump active on/off } - if (EMS_SolarModule.EnergyLastHour != EMS_VALUE_USHORT_NOTSET) + if (EMS_SolarModule.EnergyLastHour < EMS_VALUE_USHORT_NOTSET) sm["sm5"] = (float)EMS_SolarModule.EnergyLastHour / 10; // Energy last hour Wh - if (EMS_SolarModule.EnergyToday != EMS_VALUE_USHORT_NOTSET) // Energy today Wh + if (EMS_SolarModule.EnergyToday < EMS_VALUE_USHORT_NOTSET) // Energy today Wh sm["sm6"] = EMS_SolarModule.EnergyToday; - if (EMS_SolarModule.EnergyTotal != EMS_VALUE_USHORT_NOTSET) // Energy total KWh + if (EMS_SolarModule.EnergyTotal < EMS_VALUE_USHORT_NOTSET) // Energy total KWh sm["sm7"] = (float)EMS_SolarModule.EnergyTotal / 10; } else { sm["ok"] = false; diff --git a/src/ems.cpp b/src/ems.cpp index e477c59f3..a99124959 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -123,7 +123,7 @@ void ems_init() { // init all mixing modules for (uint8_t i = 0; i < EMS_THERMOSTAT_MAXHC; i++) { EMS_Mixing.hc[i].hc = i + 1; - EMS_Mixing.hc[i].flowTemp = EMS_VALUE_USHORT_NOTSET; + EMS_Mixing.hc[i].flowTemp = EMS_VALUE_SHORT_NOTSET; EMS_Mixing.hc[i].pumpMod = EMS_VALUE_INT_NOTSET; EMS_Mixing.hc[i].valveStatus = EMS_VALUE_INT_NOTSET; EMS_Mixing.hc[i].flowSetTemp = EMS_VALUE_INT_NOTSET; @@ -1011,9 +1011,11 @@ void ems_setWarmWaterOnetime(bool activated) { EMS_TxTelegram.dest = EMS_Boiler.device_id; EMS_TxTelegram.type = EMS_TYPE_UBAFlags; EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwOneTime; - EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH; + EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH+1; EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate - EMS_TxTelegram.dataValue = (activated ? 0x22 : 0x02); // 0x22 is on, 0x02 is off for RC20RF +// EMS_TxTelegram.dataValue = (activated ? 0x22 : 0x02); // 0x22 is on, 0x02 is off for RC20RF + EMS_TxTelegram.data[4] = 0x11; + EMS_TxTelegram.data[5] = (activated ? 0x33 : 0x11); EMS_TxQueue.push(EMS_TxTelegram); } From fc13004093073295cc24124cd1faadfd3ac65062 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 12 Jan 2020 13:46:05 +0100 Subject: [PATCH 10/14] add mqtt-subscription for WWcirculation --- src/ems-esp.cpp | 11 +++++++++++ src/ems.cpp | 22 +++++++++++++++++++++- src/ems.h | 1 + src/my_config.h | 1 + 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 8fb7b7f2a..9068152df 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -1423,6 +1423,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // these three need to be unique topics myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWACTIVATED); myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWONETIME); + myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWCIRCULATION); myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWTEMP); // generic incoming MQTT command for EMS-ESP @@ -1552,6 +1553,16 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { return; } + // wwCirculation + if (strcmp(topic, TOPIC_BOILER_CMD_WWCIRCULATION) == 0) { + if (message[0] == '1' || strcmp(message, "on") == 0) { + ems_setWarmWaterCirculation(true); + } else if (message[0] == '0' || strcmp(message, "off") == 0) { + ems_setWarmWaterCirculation(false); + } + return; + } + // boiler wwtemp changes if (strcmp(topic, TOPIC_BOILER_CMD_WWTEMP) == 0) { uint8_t t = atoi((char *)message); diff --git a/src/ems.cpp b/src/ems.cpp index 1cbd8cff4..959bb29aa 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1013,13 +1013,33 @@ void ems_setWarmWaterOnetime(bool activated) { EMS_TxTelegram.timestamp = millis(); // set timestamp EMS_Sys_Status.txRetryCount = 0; // reset retry counter + EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; + EMS_TxTelegram.dest = EMS_Boiler.device_id; + EMS_TxTelegram.type = EMS_TYPE_UBAFlags; + EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwOneTime; + EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH; + EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate + EMS_TxTelegram.dataValue = (activated ? 0x22 : 0x02); // 0x22 is on, 0x02 is off for RC20RF + + EMS_TxQueue.push(EMS_TxTelegram); +} +/** + * Activate / De-activate circulation of warm water 0x35 + * true = on, false = off + */ +void ems_setWarmWaterCirculation(bool activated) { + myDebug_P(PSTR("Setting boiler warm water circulation %s"), activated ? "on" : "off"); + + _EMS_TxTelegram EMS_TxTelegram = EMS_TX_TELEGRAM_NEW; // create new Tx + EMS_TxTelegram.timestamp = millis(); // set timestamp + EMS_Sys_Status.txRetryCount = 0; // reset retry counter + EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; EMS_TxTelegram.dest = EMS_Boiler.device_id; EMS_TxTelegram.type = EMS_TYPE_UBAFlags; EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwOneTime; EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH+1; EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate -// EMS_TxTelegram.dataValue = (activated ? 0x22 : 0x02); // 0x22 is on, 0x02 is off for RC20RF EMS_TxTelegram.data[4] = 0x11; EMS_TxTelegram.data[5] = (activated ? 0x33 : 0x11); diff --git a/src/ems.h b/src/ems.h index 993a04e9f..644806e47 100644 --- a/src/ems.h +++ b/src/ems.h @@ -432,6 +432,7 @@ void ems_setWarmWaterTemp(uint8_t temperature); void ems_setFlowTemp(uint8_t temperature); void ems_setWarmWaterActivated(bool activated); void ems_setWarmWaterOnetime(bool activated); +void ems_setWarmWaterCirculation(bool activated); void ems_setWarmTapWaterActivated(bool activated); void ems_setPoll(bool b); void ems_setLogging(_EMS_SYS_LOGGING loglevel, uint16_t type_id); diff --git a/src/my_config.h b/src/my_config.h index 8fcec4e4f..231f8e3c1 100644 --- a/src/my_config.h +++ b/src/my_config.h @@ -45,6 +45,7 @@ #define TOPIC_BOILER_CMD "boiler_cmd" // for receiving boiler commands via MQTT #define TOPIC_BOILER_CMD_WWACTIVATED "boiler_cmd_wwactivated" // change water on/off #define TOPIC_BOILER_CMD_WWONETIME "boiler_cmd_wwonetime" // warm warter one time loading +#define TOPIC_BOILER_CMD_WWCIRCULATION "boiler_cmd_wwcirculation" // start warm warter circulation #define TOPIC_BOILER_CMD_WWTEMP "boiler_cmd_wwtemp" // wwtemp changes via MQTT #define TOPIC_BOILER_CMD_COMFORT "comfort" // ww comfort setting via MQTT #define TOPIC_BOILER_CMD_FLOWTEMP "flowtemp" // flowtemp value via MQTT From 0fb9019c5110f9388740e4d5bc018924cb6f2867 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 12 Jan 2020 18:41:53 +0100 Subject: [PATCH 11/14] Sync with upstream/dev --- src/MyESP.cpp | 16 ++++++++++++++-- src/MyESP.h | 13 +++++++------ src/ems-esp.cpp | 20 ++++++++------------ src/ems.cpp | 9 ++------- src/ems.h | 4 ++-- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/MyESP.cpp b/src/MyESP.cpp index 98ae302c7..0d0f3f645 100644 --- a/src/MyESP.cpp +++ b/src/MyESP.cpp @@ -78,6 +78,7 @@ MyESP::MyESP() { _mqtt_will_topic = strdup(MQTT_WILL_TOPIC); _mqtt_will_online_payload = strdup(MQTT_WILL_ONLINE_PAYLOAD); _mqtt_will_offline_payload = strdup(MQTT_WILL_OFFLINE_PAYLOAD); + _mqtt_publish_fails = 0; // count of number of failed MQTT topic publishes // network _network_password = nullptr; @@ -425,9 +426,19 @@ bool MyESP::mqttPublish(const char * topic, const char * payload, bool retain) { if (packet_id) { _addMQTTLog(topic, payload, MYESP_MQTTLOGTYPE_PUBLISH); // add to the log return true; - } else { - myDebug_P(PSTR("[MQTT] Error publishing to %s with payload %s [error %d]"), _mqttTopic(topic), payload, packet_id); } + + // it failed, try again https://github.com/proddy/EMS-ESP/issues/264 + delay(100); // this is blocking and probably not a good idea + packet_id = mqttClient.publish(_mqttTopic(topic), _mqtt_qos, retain, payload); + if (packet_id) { + _addMQTTLog(topic, payload, MYESP_MQTTLOGTYPE_PUBLISH); // add to the log + return true; // ok this time + } + + // it didn't work again, will return false + myDebug_P(PSTR("[MQTT] Error publishing to %s with payload %s [error %d]"), _mqttTopic(topic), payload, packet_id); + _mqtt_publish_fails++; // increment failure counter } return false; // failed @@ -1372,6 +1383,7 @@ void MyESP::showSystemStats() { if (isMQTTConnected()) { myDebug_P(PSTR(" [MQTT] is connected (heartbeat %s)"), getHeartbeat() ? "enabled" : "disabled"); + myDebug_P(PSTR(" [MQTT] # failed topic publishes: %d"), _mqtt_publish_fails); } else { myDebug_P(PSTR(" [MQTT] is disconnected")); } diff --git a/src/MyESP.h b/src/MyESP.h index d6df5ccc1..3f78b7b5b 100644 --- a/src/MyESP.h +++ b/src/MyESP.h @@ -335,12 +335,12 @@ class MyESP { private: // mqtt - void _mqttOnMessage(char * topic, char * payload, size_t len); - void _mqttConnect(); - void _mqtt_setup(); - void _mqttOnConnect(); - void _sendStart(); - char * _mqttTopic(const char * topic); + void _mqttOnMessage(char * topic, char * payload, size_t len); + void _mqttConnect(); + void _mqtt_setup(); + void _mqttOnConnect(); + void _sendStart(); + char * _mqttTopic(const char * topic); // mqtt log _MQTT_Log_t MQTT_log[MYESP_MQTTLOG_MAX]; // log for publish and subscribe messages @@ -366,6 +366,7 @@ class MyESP { uint32_t _mqtt_last_connection; bool _mqtt_connecting; bool _mqtt_heartbeat; + uint16_t _mqtt_publish_fails; // wifi void _wifiCallback(justwifi_messages_t code, char * parameter); diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 0032ad4bf..f1a624557 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -480,17 +480,17 @@ void showInfo() { myDebug_P(PSTR("")); // newline myDebug_P(PSTR("%sMixing module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF); myDebug_P(PSTR(" Mixing: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_MIXING, buffer_type,false)); - //if (EMS_Boiler.switchTemp > EMS_VALUE_SHORT_NOTSET) + if (EMS_Boiler.switchTemp < EMS_VALUE_USHORT_NOTSET) _renderShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); for (uint8_t hc_num = 1; hc_num <= EMS_THERMOSTAT_MAXHC; hc_num++) { if (EMS_Mixing.hc[hc_num - 1].active) { myDebug_P(PSTR(" Mixing Circuit %d"), hc_num); - //if (EMS_Mixing.hc[hc_num - 1].flowTemp > EMS_VALUE_SHORT_NOTSET) - _renderShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); - //if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) + if (EMS_Mixing.hc[hc_num - 1].flowTemp < EMS_VALUE_USHORT_NOTSET) + _renderUShortValue(" Current flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowTemp); + if (EMS_Mixing.hc[hc_num - 1].flowSetTemp != EMS_VALUE_INT_NOTSET) _renderIntValue(" Setpoint flow temperature", "C", EMS_Mixing.hc[hc_num - 1].flowSetTemp); - //if (EMS_Mixing.hc[hc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) + if (EMS_Mixing.hc[hc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) _renderIntValue(" Current pump modulation", "%", EMS_Mixing.hc[hc_num - 1].pumpMod); if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET) _renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus); @@ -612,7 +612,7 @@ void publishEMSValues(bool force) { rootBoiler["curFlowTemp"] = (float)EMS_Boiler.curFlowTemp / 10; if (EMS_Boiler.retTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["retTemp"] = (float)EMS_Boiler.retTemp / 10; - if (EMS_Boiler.switchTemp > EMS_VALUE_SHORT_NOTSET) + if (EMS_Boiler.switchTemp < EMS_VALUE_USHORT_NOTSET) rootBoiler["switchTemp"] = (float)EMS_Boiler.switchTemp / 10; if (EMS_Boiler.sysPress != EMS_VALUE_INT_NOTSET) rootBoiler["sysPress"] = (float)EMS_Boiler.sysPress / 10; @@ -668,7 +668,7 @@ void publishEMSValues(bool force) { if (abs(EMS_Boiler.heatWorkMin) != EMS_VALUE_LONG_NOTSET) rootBoiler["heatWorkMin"] = (float)EMS_Boiler.heatWorkMin; - if (EMS_Boiler.serviceCode < EMS_VALUE_USHORT_NOTSET) { + if (EMS_Boiler.serviceCode != EMS_VALUE_USHORT_NOTSET) { rootBoiler["ServiceCode"] = EMS_Boiler.serviceCodeChar; rootBoiler["ServiceCodeNumber"] = EMS_Boiler.serviceCode; } @@ -778,11 +778,7 @@ void publishEMSValues(bool force) { strlcat(hc, _int_to_char(s, mixing->hc), sizeof(hc)); JsonObject dataMixing = rootMixing.createNestedObject(hc); -<<<<<<< HEAD - if (mixing->flowTemp > EMS_VALUE_SHORT_NOTSET) -======= - if (mixing->flowTemp != EMS_VALUE_USHORT_NOTSET) ->>>>>>> upstream/dev + if (mixing->flowTemp < EMS_VALUE_USHORT_NOTSET) dataMixing["flowTemp"] = (float)mixing->flowTemp / 10; if (mixing->flowSetTemp != EMS_VALUE_INT_NOTSET) dataMixing["setflowTemp"] = mixing->flowSetTemp; diff --git a/src/ems.cpp b/src/ems.cpp index e42de13fb..5ad2c6048 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -123,7 +123,7 @@ void ems_init() { // init all mixing modules for (uint8_t i = 0; i < EMS_THERMOSTAT_MAXHC; i++) { EMS_Mixing.hc[i].hc = i + 1; - EMS_Mixing.hc[i].flowTemp = EMS_VALUE_SHORT_NOTSET; + EMS_Mixing.hc[i].flowTemp = EMS_VALUE_USHORT_NOTSET; EMS_Mixing.hc[i].pumpMod = EMS_VALUE_INT_NOTSET; EMS_Mixing.hc[i].valveStatus = EMS_VALUE_INT_NOTSET; EMS_Mixing.hc[i].flowSetTemp = EMS_VALUE_INT_NOTSET; @@ -161,7 +161,7 @@ void ems_init() { EMS_Boiler.burnStarts = EMS_VALUE_LONG_NOTSET; // # burner restarts EMS_Boiler.burnWorkMin = EMS_VALUE_LONG_NOTSET; // Total burner operating time EMS_Boiler.heatWorkMin = EMS_VALUE_LONG_NOTSET; // Total heat operating time - EMS_Boiler.switchTemp = EMS_VALUE_SHORT_NOTSET; + EMS_Boiler.switchTemp = EMS_VALUE_USHORT_NOTSET; // UBAMonitorWWMessage EMS_Boiler.wWCurTmp = EMS_VALUE_USHORT_NOTSET; // Warm Water current temperature @@ -1273,11 +1273,7 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { // Mixer - 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { -<<<<<<< HEAD uint8_t hc = 1; // fixed, for 0xAB -======= - uint8_t hc = 0; // fixed, for 0xAB (HC1 only ->>>>>>> upstream/dev EMS_Mixing.hc[hc].active = true; _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp); @@ -2865,7 +2861,6 @@ const _EMS_Type EMS_Types[] = { {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC1, "MMPLUSStatusMessage_HC1", _process_MMPLUSStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC2, "MMPLUSStatusMessage_HC2", _process_MMPLUSStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage, "MMStatusMessage", _process_MMStatusMessage} - }; // calculate sizes of arrays at compile time diff --git a/src/ems.h b/src/ems.h index 644806e47..b7c596fb2 100644 --- a/src/ems.h +++ b/src/ems.h @@ -298,7 +298,7 @@ typedef struct { uint32_t burnStarts; // # burner starts uint32_t burnWorkMin; // Total burner operating time uint32_t heatWorkMin; // Total heat operating time - int16_t switchTemp; // Switch temperature + uint16_t switchTemp; // Switch temperature // UBAMonitorWWMessage uint16_t wWCurTmp; // Warm Water current temperature @@ -338,7 +338,7 @@ typedef struct { typedef struct { uint8_t hc; // heating circuit 1, 2, 3 or 4 bool active; // true if there is data for this HC - int16_t flowTemp; + uint16_t flowTemp; uint8_t pumpMod; uint8_t valveStatus; uint8_t flowSetTemp; From 093df344e267418a670a22a80a39349327a42af0 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 13 Jan 2020 10:25:37 +0100 Subject: [PATCH 12/14] Test --- platformio.ini | 1 + src/ems.cpp | 7 +++---- src/ems_devices.h | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index 747006030..1c0fd31b0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -112,3 +112,4 @@ build_flags = ${common.build_flags} ${common.custom_flags} extra_scripts = pre:scripts/pre_script.py scripts/main_script.py + diff --git a/src/ems.cpp b/src/ems.cpp index 5ad2c6048..03f65ad2c 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -1037,11 +1037,10 @@ void ems_setWarmWaterCirculation(bool activated) { EMS_TxTelegram.action = EMS_TX_TELEGRAM_WRITE; EMS_TxTelegram.dest = EMS_Boiler.device_id; EMS_TxTelegram.type = EMS_TYPE_UBAFlags; - EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwOneTime; - EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH+1; + EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwCirulation; + EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH; EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate - EMS_TxTelegram.data[4] = 0x11; - EMS_TxTelegram.data[5] = (activated ? 0x33 : 0x11); + EMS_TxTelegram.dataValue = (activated ? 0x22 : 0x02); EMS_TxQueue.push(EMS_TxTelegram); } diff --git a/src/ems_devices.h b/src/ems_devices.h index 9d65b40c4..c780b0c37 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -46,6 +46,7 @@ #define EMS_OFFSET_UBAParameterWW_wwtemp 2 // WW Temperature #define EMS_OFFSET_UBAParameterWW_wwactivated 1 // WW Activated #define EMS_OFFSET_UBAParameterWW_wwOneTime 0x00 // WW OneTime loading +#define EMS_OFFSET_UBAParameterWW_wwCirulation 1 // WW circulation #define EMS_OFFSET_UBAParameterWW_wwComfort 9 // WW is in comfort or eco mode #define EMS_VALUE_UBAParameterWW_wwComfort_Hot 0x00 // the value for hot #define EMS_VALUE_UBAParameterWW_wwComfort_Eco 0xD8 // the value for eco From b950cf824679c52a731c05cf94e205a590117926 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 18 Jan 2020 19:12:53 +0100 Subject: [PATCH 13/14] summery over last commitsto MM10 - add MM200 warm water circuits (#299) - add terminal boiler wwactive on/off command (#301) - show first active thermostat hc in web (instead always 1) - add log d [id] to show messages from/to specific ID (may replace log t and log s) - add mixer version to info - add warm water circulation active to terminal and mqtt - mqtt subscribe only to active hc - change NOTSET values for short/ushort and set the compare to level (match 0x7D00, 0x8000 and 0x8300 as notset) - add calculated flow temperature to thermostat stats --- src/ems-esp.cpp | 81 ++++++++++++++++++++++++++++++++++++----------- src/ems.cpp | 41 +++++++++++++++++++++--- src/ems.h | 18 +++++++++-- src/ems_devices.h | 7 +++- src/version.h | 2 +- 5 files changed, 122 insertions(+), 27 deletions(-) diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index f1a624557..634070e98 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -103,8 +103,8 @@ static const command_t project_cmds[] PROGMEM = { {true, "master_thermostat [product id]", "set default thermostat to use. Omit [product id] to show options."}, {false, "info", "show current values deciphered from the EMS messages"}, - {false, "log ", "logging: none, basic, thermo, solar, raw, jabber, verbose, watch a type or device"}, + #ifdef TESTS {false, "test ", "insert a test telegram on to the EMS bus"}, #endif @@ -120,6 +120,7 @@ static const command_t project_cmds[] PROGMEM = { {false, "thermostat mode [hc] ", "set mode (0=off, 1=manual, 2=auto) for heating circuit hc 1-4"}, {false, "boiler read ", "send read request to boiler"}, {false, "boiler wwtemp ", "set boiler warm water temperature"}, + {false, "boiler wwactive ", "set boiler warm water on/off"}, {false, "boiler tapwater ", "set boiler warm tap water on/off"}, {false, "boiler flowtemp ", "set boiler flow temperature"}, {false, "boiler comfort ", "set boiler warm water comfort setting"} @@ -232,6 +233,8 @@ void showInfo() { myDebug_P(PSTR(" System logging set to Jabber")); } else if (sysLog == EMS_SYS_LOGGING_WATCH) { myDebug_P(PSTR(" System logging set to Watch")); + } else if (sysLog == EMS_SYS_LOGGING_DEVICE) { + myDebug_P(PSTR(" System logging set to device")); } else { myDebug_P(PSTR(" System logging set to None")); } @@ -481,7 +484,7 @@ void showInfo() { myDebug_P(PSTR("%sMixing module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF); myDebug_P(PSTR(" Mixing: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_MIXING, buffer_type,false)); if (EMS_Boiler.switchTemp < EMS_VALUE_USHORT_NOTSET) - _renderShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); + _renderUShortValue("Switch temperature", "C", EMS_Boiler.switchTemp); for (uint8_t hc_num = 1; hc_num <= EMS_THERMOSTAT_MAXHC; hc_num++) { if (EMS_Mixing.hc[hc_num - 1].active) { @@ -496,6 +499,17 @@ void showInfo() { _renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus); } } + for (uint8_t wwc_num = 1; wwc_num <= EMS_THERMOSTAT_MAXWWC; wwc_num++) { + if (EMS_Mixing.wwc[wwc_num - 1].active) { + myDebug_P(PSTR(" Warm Water Buffer %d"), wwc_num); + if (EMS_Mixing.wwc[wwc_num - 1].flowTemp < EMS_VALUE_USHORT_NOTSET) + _renderUShortValue(" Current warm water temperature", "C", EMS_Mixing.wwc[wwc_num - 1].flowTemp); + if (EMS_Mixing.wwc[wwc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET) + _renderIntValue(" Current pump status", "", EMS_Mixing.wwc[wwc_num - 1].pumpMod); + if (EMS_Mixing.wwc[wwc_num - 1].tempStatus != EMS_VALUE_INT_NOTSET) + _renderIntValue(" Current temp status", "", EMS_Mixing.wwc[wwc_num - 1].tempStatus); + } + } } // Dallas external temp sensors @@ -777,7 +791,6 @@ void publishEMSValues(bool force) { strlcpy(hc, THERMOSTAT_HC, sizeof(hc)); strlcat(hc, _int_to_char(s, mixing->hc), sizeof(hc)); JsonObject dataMixing = rootMixing.createNestedObject(hc); - if (mixing->flowTemp < EMS_VALUE_USHORT_NOTSET) dataMixing["flowTemp"] = (float)mixing->flowTemp / 10; if (mixing->flowSetTemp != EMS_VALUE_INT_NOTSET) @@ -788,6 +801,23 @@ void publishEMSValues(bool force) { dataMixing["valveStatus"] = mixing->valveStatus; } } + for (uint8_t wwc_v = 1; wwc_v <= EMS_THERMOSTAT_MAXWWC; wwc_v++) { + _EMS_Mixing_WWC * mixing = &EMS_Mixing.wwc[wwc_v - 1]; + // only send if we have an active Warm water Circuit with real data + if (mixing->active) { + // build new json object + char wwc[10]; // wc{1-2} + strlcpy(wwc, "wwc", sizeof(wwc)); + strlcat(wwc, _int_to_char(s, mixing->wwc), sizeof(wwc)); + JsonObject dataMixing = rootMixing.createNestedObject(wwc); + if (mixing->flowTemp < EMS_VALUE_USHORT_NOTSET) + dataMixing["wwTemp"] = (float)mixing->flowTemp / 10; + if (mixing->pumpMod != EMS_VALUE_INT_NOTSET) + dataMixing["pumpStatus"] = mixing->pumpMod; + if (mixing->tempStatus != EMS_VALUE_INT_NOTSET) + dataMixing["tempStatus"] = mixing->tempStatus; + } + } data[0] = '\0'; // reset data for next package serializeJson(doc, data, sizeof(data)); @@ -1276,6 +1306,9 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) { } else if ((strcmp(second_cmd, "w") == 0) && (wc == 3)) { ems_setLogging(EMS_SYS_LOGGING_WATCH, _readHexNumber()); // get type_id ok = true; + } else if ((strcmp(second_cmd, "d") == 0) && (wc == 3)) { + ems_setLogging(EMS_SYS_LOGGING_DEVICE, _readHexNumber()); // get device_id + ok = true; } } @@ -1335,6 +1368,15 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) { } else if (strcmp(second_cmd, "flowtemp") == 0) { ems_setFlowTemp(_readIntNumber()); ok = true; + } else if (strcmp(second_cmd, "wwactive") == 0) { + char * third_cmd = _readWord(); + if (strcmp(third_cmd, "on") == 0) { + ems_setWarmWaterActivated(true); + ok = true; + } else if (strcmp(third_cmd, "off") == 0) { + ems_setWarmWaterActivated(false); + ok = true; + } } } @@ -1403,13 +1445,16 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { char topic_s[50]; char buffer[4]; for (uint8_t hc = 1; hc <= EMS_THERMOSTAT_MAXHC; hc++) { - strlcpy(topic_s, TOPIC_THERMOSTAT_CMD_TEMP_HA, sizeof(topic_s)); - strlcat(topic_s, itoa(hc, buffer, 10), sizeof(topic_s)); - myESP.mqttSubscribe(topic_s); + // subscribe onlyto active hc + if(EMS_Thermostat.hc[hc - 1].active) { + strlcpy(topic_s, TOPIC_THERMOSTAT_CMD_TEMP_HA, sizeof(topic_s)); + strlcat(topic_s, itoa(hc, buffer, 10), sizeof(topic_s)); + myESP.mqttSubscribe(topic_s); - strlcpy(topic_s, TOPIC_THERMOSTAT_CMD_MODE_HA, sizeof(topic_s)); - strlcat(topic_s, itoa(hc, buffer, 10), sizeof(topic_s)); - myESP.mqttSubscribe(topic_s); + strlcpy(topic_s, TOPIC_THERMOSTAT_CMD_MODE_HA, sizeof(topic_s)); + strlcat(topic_s, itoa(hc, buffer, 10), sizeof(topic_s)); + myESP.mqttSubscribe(topic_s); + } } // generic incoming MQTT command for Thermostat @@ -1574,7 +1619,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { uint8_t hc; // thermostat temp changes hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_TEMP_HA, topic); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { float f = strtof((char *)message, 0); ems_setThermostatTemp(f, hc); publishEMSValues(true); // publish back immediately @@ -1583,7 +1628,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // thermostat mode changes hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_MODE_HA, topic); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { if (strncmp(message, "auto", 4) == 0) { ems_setThermostatMode(2, hc); } else if ((strncmp(message, "day", 4) == 0) || (strncmp(message, "manual", 6) == 0) || (strncmp(message, "heat", 4) == 0)) { @@ -1607,7 +1652,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // thermostat temp changes hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_TEMP, command); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { float f = doc["data"]; ems_setThermostatTemp(f, hc); publishEMSValues(true); // publish back immediately @@ -1616,7 +1661,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // thermostat mode changes hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_MODE, command); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { const char * data_cmd = doc["data"]; if (strncmp(data_cmd, "auto", 4) == 0) { ems_setThermostatMode(2, hc); @@ -1630,7 +1675,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // set night temp value hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_NIGHTTEMP, command); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { float f = doc["data"]; ems_setThermostatTemp(f, hc, 1); // night return; @@ -1638,7 +1683,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // set daytemp value hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_DAYTEMP, command); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { float f = doc["data"]; ems_setThermostatTemp(f, hc, 2); // day return; @@ -1646,7 +1691,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) { // set holiday value hc = _hasHCspecified(TOPIC_THERMOSTAT_CMD_HOLIDAYTEMP, command); - if (hc) { + if (hc && EMS_Thermostat.hc[hc - 1].active) { float f = doc["data"]; ems_setThermostatTemp(f, hc, 3); // holiday return; @@ -1727,7 +1772,7 @@ void WebCallback(JsonObject root) { uint8_t hc_num = 1; // default to HC1 uint8_t model = ems_getThermostatModel(); - while (hc_num <= EMS_THERMOSTAT_MAXHC && !EMS_Thermostat.hc[hc_num - 1].active) hc_num++; + while (hc_num < EMS_THERMOSTAT_MAXHC && !EMS_Thermostat.hc[hc_num - 1].active) hc_num++; // first active hc // Render Current & Setpoint Room Temperature if (model == EMS_DEVICE_FLAG_EASY) { if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp > EMS_VALUE_SHORT_NOTSET) diff --git a/src/ems.cpp b/src/ems.cpp index 03f65ad2c..c4a40b791 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -128,6 +128,12 @@ void ems_init() { EMS_Mixing.hc[i].valveStatus = EMS_VALUE_INT_NOTSET; EMS_Mixing.hc[i].flowSetTemp = EMS_VALUE_INT_NOTSET; } + for (uint8_t i = 0; i < EMS_THERMOSTAT_MAXWWC; i++) { + EMS_Mixing.wwc[i].wwc = i + 1; + EMS_Mixing.wwc[i].flowTemp = EMS_VALUE_USHORT_NOTSET; + EMS_Mixing.wwc[i].pumpMod = EMS_VALUE_INT_NOTSET; + EMS_Mixing.wwc[i].tempStatus = EMS_VALUE_INT_NOTSET; + } // UBAParameterWW EMS_Boiler.wWActivated = EMS_VALUE_BOOL_NOTSET; // Warm Water activated @@ -281,9 +287,9 @@ _EMS_SYS_LOGGING ems_getLogging() { return EMS_Sys_Status.emsLogging; } -void ems_setLogging(_EMS_SYS_LOGGING loglevel, uint16_t type_id) { - EMS_Sys_Status.emsLogging_typeID = type_id; - ems_setLogging(EMS_SYS_LOGGING_WATCH, false); +void ems_setLogging(_EMS_SYS_LOGGING loglevel, uint16_t id) { + EMS_Sys_Status.emsLogging_ID = id; + ems_setLogging(loglevel, false); } void ems_setLogging(_EMS_SYS_LOGGING loglevel, bool quiet) { @@ -309,6 +315,8 @@ void ems_setLogging(_EMS_SYS_LOGGING loglevel, bool quiet) { myDebug_P(PSTR("System Logging set to Jabber mode")); } else if (loglevel == EMS_SYS_LOGGING_WATCH) { myDebug_P(PSTR("System Logging set to Watch mode")); + } else if (loglevel == EMS_SYS_LOGGING_DEVICE) { + myDebug_P(PSTR("System Logging set to Device mode")); } } @@ -850,8 +858,11 @@ void ems_parseTelegram(uint8_t * telegram, uint8_t length) { // but still continue to process it if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_RAW)) { _debugPrintTelegram("", &EMS_RxTelegram, COLOR_WHITE, true); - } else if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_WATCH) && (EMS_RxTelegram.type == EMS_Sys_Status.emsLogging_typeID)) { + } else if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_WATCH) && (EMS_RxTelegram.type == EMS_Sys_Status.emsLogging_ID)) { _debugPrintTelegram("", &EMS_RxTelegram, COLOR_WHITE, true); + // raw printout for log d [id] disabled, moved to _printMessage() +// } else if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_DEVICE) && ((EMS_RxTelegram.src == EMS_Sys_Status.emsLogging_ID) || (EMS_RxTelegram.dest == EMS_Sys_Status.emsLogging_ID))) { +// _debugPrintTelegram("", &EMS_RxTelegram, COLOR_WHITE, true); } // Assume at this point we have something that vaguely resembles a telegram in the format [src] [dest] [type] [offset] [data] [crc] @@ -929,6 +940,11 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) { if ((src == EMS_SolarModule.device_id) || (dest == EMS_SolarModule.device_id)) { _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); } + } else if (EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_DEVICE) { + // only print ones to/from DeviceID + if ((src == EMS_Sys_Status.emsLogging_ID) || (dest == EMS_Sys_Status.emsLogging_ID)) { + _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); + } } else { // always print _debugPrintTelegram(output_str, EMS_RxTelegram, color_s); @@ -1269,6 +1285,19 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].pumpMod, EMS_OFFSET_MMPLUSStatusMessage_pump_mod); _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMPLUSStatusMessage_valve_status); } +// Mixer warm water loading - 0x0231, 0x0232 + +void _process_MMPLUSStatusMessageWW(_EMS_RxTelegram * EMS_RxTelegram) { + uint8_t wwc = (EMS_RxTelegram->type - EMS_TYPE_MMPLUSStatusMessage_WWC1); // 0 to 3 + if (wwc >= EMS_THERMOSTAT_MAXWWC) { + return; // invalid type + } + EMS_Mixing.wwc[wwc].active = true; + + _setValue(EMS_RxTelegram, &EMS_Mixing.wwc[wwc].flowTemp, EMS_OFFSET_MMPLUSStatusMessage_WW_flow_temp); + _setValue(EMS_RxTelegram, &EMS_Mixing.wwc[wwc].pumpMod, EMS_OFFSET_MMPLUSStatusMessage_WW_pump_mod); + _setValue(EMS_RxTelegram, &EMS_Mixing.wwc[wwc].tempStatus, EMS_OFFSET_MMPLUSStatusMessage_WW_temp_status); +} // Mixer - 0xAB void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) { @@ -2859,6 +2888,10 @@ const _EMS_Type EMS_Types[] = { // Mixing devices MM10 - MM400 {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC1, "MMPLUSStatusMessage_HC1", _process_MMPLUSStatusMessage}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC2, "MMPLUSStatusMessage_HC2", _process_MMPLUSStatusMessage}, + {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC3, "MMPLUSStatusMessage_HC3", _process_MMPLUSStatusMessage}, + {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC4, "MMPLUSStatusMessage_HC4", _process_MMPLUSStatusMessage}, + {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_WWC1, "MMPLUSStatusMessage_WWC1", _process_MMPLUSStatusMessageWW}, + {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_WWC2, "MMPLUSStatusMessage_WWC2", _process_MMPLUSStatusMessageWW}, {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage, "MMStatusMessage", _process_MMStatusMessage} }; diff --git a/src/ems.h b/src/ems.h index b7c596fb2..56c829474 100644 --- a/src/ems.h +++ b/src/ems.h @@ -34,6 +34,7 @@ // thermostat specific #define EMS_THERMOSTAT_MAXHC 4 // max number of heating circuits +#define EMS_THERMOSTAT_MAXWWC 2 // max number of warm water circuits #define EMS_THERMOSTAT_DEFAULTHC 1 // default heating circuit is 1 #define EMS_THERMOSTAT_WRITE_YES true #define EMS_THERMOSTAT_WRITE_NO false @@ -112,9 +113,10 @@ typedef enum { EMS_SYS_LOGGING_WATCH, // watch a specific type ID EMS_SYS_LOGGING_BASIC, // only basic read/write messages EMS_SYS_LOGGING_THERMOSTAT, // only telegrams sent from thermostat - EMS_SYS_LOGGING_SOLARMODULE, // only telegrams sent from thermostat + EMS_SYS_LOGGING_SOLARMODULE, // only telegrams sent from solarmodule EMS_SYS_LOGGING_VERBOSE, // everything - EMS_SYS_LOGGING_JABBER // lots of debug output... + EMS_SYS_LOGGING_JABBER, // lots of debug output... + EMS_SYS_LOGGING_DEVICE // watch the device ID } _EMS_SYS_LOGGING; // status/counters since last power on @@ -126,7 +128,7 @@ typedef struct { uint16_t emxCrcErr; // CRC errors bool emsPollEnabled; // flag enable the response to poll messages _EMS_SYS_LOGGING emsLogging; // logging - uint16_t emsLogging_typeID; // the typeID to watch + uint16_t emsLogging_ID; // the type or device ID to watch uint8_t emsRefreshedFlags; // fresh data, needs to be pushed out to MQTT bool emsBusConnected; // is there an active bus uint32_t emsRxTimestamp; // timestamp of last EMS message received @@ -344,6 +346,15 @@ typedef struct { uint8_t flowSetTemp; } _EMS_Mixing_HC; +// Mixing Module per WWC +typedef struct { + uint8_t wwc; // warm water circuit 1, 2 + bool active; // true if there is data for this WWC + uint16_t flowTemp; + uint8_t pumpMod; + uint8_t tempStatus; +} _EMS_Mixing_WWC; + // Mixer data typedef struct { uint8_t device_id; @@ -353,6 +364,7 @@ typedef struct { char version[10]; bool detected; _EMS_Mixing_HC hc[EMS_THERMOSTAT_MAXHC]; // array for the 4 heating circuits + _EMS_Mixing_WWC wwc[EMS_THERMOSTAT_MAXWWC]; // array for the 2 ww circuits } _EMS_Mixing; // Solar Module - SM10/SM100/SM200/ISM1 diff --git a/src/ems_devices.h b/src/ems_devices.h index c780b0c37..f44b414b7 100644 --- a/src/ems_devices.h +++ b/src/ems_devices.h @@ -46,7 +46,7 @@ #define EMS_OFFSET_UBAParameterWW_wwtemp 2 // WW Temperature #define EMS_OFFSET_UBAParameterWW_wwactivated 1 // WW Activated #define EMS_OFFSET_UBAParameterWW_wwOneTime 0x00 // WW OneTime loading -#define EMS_OFFSET_UBAParameterWW_wwCirulation 1 // WW circulation +#define EMS_OFFSET_UBAParameterWW_wwCirulation 1 // WW circulation #define EMS_OFFSET_UBAParameterWW_wwComfort 9 // WW is in comfort or eco mode #define EMS_VALUE_UBAParameterWW_wwComfort_Hot 0x00 // the value for hot #define EMS_VALUE_UBAParameterWW_wwComfort_Eco 0xD8 // the value for eco @@ -176,9 +176,14 @@ #define EMS_TYPE_MMPLUSStatusMessage_HC2 0x01D8 // mixer status HC2 #define EMS_TYPE_MMPLUSStatusMessage_HC3 0x01D9 // mixer status HC3 #define EMS_TYPE_MMPLUSStatusMessage_HC4 0x01DA // mixer status HC4 +#define EMS_TYPE_MMPLUSStatusMessage_WWC1 0x0231 // mixer status WWC1 +#define EMS_TYPE_MMPLUSStatusMessage_WWC2 0x0232 // mixer status WWC2 #define EMS_OFFSET_MMPLUSStatusMessage_flow_temp 3 // flow temperature #define EMS_OFFSET_MMPLUSStatusMessage_pump_mod 5 // pump modulation #define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent +#define EMS_OFFSET_MMPLUSStatusMessage_WW_flow_temp 0 // flow temperature +#define EMS_OFFSET_MMPLUSStatusMessage_WW_pump_mod 2 // pump on 6, off 0 +#define EMS_OFFSET_MMPLUSStatusMessage_WW_temp_status 11 // 0,1,2 // MM10 #define EMS_TYPE_MMStatusMessage 0xAB // mixer status diff --git a/src/version.h b/src/version.h index 32897e3e2..1cfb1f22a 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define APP_VERSION "1.9.5b17" +#define APP_VERSION "1.9.5b17m" From e819d082d72f561daeb733586d341cc1b1d90cce Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 20 Jan 2020 15:01:25 +0100 Subject: [PATCH 14/14] Namings --- platformio.ini | 2 +- src/ems-esp.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 1c0fd31b0..eb4a0f4a4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -52,7 +52,7 @@ lib_deps = JustWifi@2.0.2 ; https://github.com/xoseperez/justwifi AsyncMqttClient@0.8.2 ; https://github.com/marvinroger/async-mqtt-client EEPROM_Rotate@0.9.2 ; https://github.com/xoseperez/eeprom_rotate - ArduinoJson@6.13.0 ; https://github.com/bblanchon/ArduinoJson + ArduinoJson@6.14.0 ; https://github.com/bblanchon/ArduinoJson ESPAsyncTCP@1.2.2 ; https://github.com/me-no-dev/ESPAsyncTCP upload_speed = 921600 monitor_speed = 115200 diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp index 634070e98..a4c8aedfa 100644 --- a/src/ems-esp.cpp +++ b/src/ems-esp.cpp @@ -501,7 +501,7 @@ void showInfo() { } for (uint8_t wwc_num = 1; wwc_num <= EMS_THERMOSTAT_MAXWWC; wwc_num++) { if (EMS_Mixing.wwc[wwc_num - 1].active) { - myDebug_P(PSTR(" Warm Water Buffer %d"), wwc_num); + myDebug_P(PSTR(" Warm Water Circuit %d"), wwc_num); if (EMS_Mixing.wwc[wwc_num - 1].flowTemp < EMS_VALUE_USHORT_NOTSET) _renderUShortValue(" Current warm water temperature", "C", EMS_Mixing.wwc[wwc_num - 1].flowTemp); if (EMS_Mixing.wwc[wwc_num - 1].pumpMod != EMS_VALUE_INT_NOTSET)