From 2e9c1b76eaf2ea01142541ff0e7daf5c35f28b42 Mon Sep 17 00:00:00 2001
From: Paul
Date: Sun, 15 Dec 2019 23:20:45 +0100
Subject: [PATCH 001/195] 1.9.5 beta prep
---
CHANGELOG.md | 13 ++++++++++++-
src/version.h | 2 +-
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 630609ce2..6b4a4a328 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,18 @@ 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.4 beta]
+## [1.9.5 beta]
+
+### Added
+
+### Fixed
+
+### Changed
+
+### Removed
+
+
+## [1.9.4] 15-12-2019
There are breaking changes in this release. See `publish_time` below and make sure you set this value to 0.
diff --git a/src/version.h b/src/version.h
index 1e9e1751b..8ce1c1208 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.4b25"
+#define APP_VERSION "1.9.5b1"
From a0e265c119a001e632150237fc406d4e6ce81e14 Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 16 Dec 2019 17:03:21 +0100
Subject: [PATCH 002/195] fixes to publish_time
---
src/ems-esp.cpp | 9 +++++----
src/version.h | 2 +-
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index d9b29c308..a80890c53 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -545,7 +545,6 @@ void publishEMSValues(bool force) {
char s[20] = {0}; // for formatting strings
StaticJsonDocument doc;
char data[MQTT_MAX_PAYLOAD_SIZE] = {0};
- uint8_t jsonSize;
static uint8_t last_boilerActive = 0xFF; // for remembering last setting of the tap water or heating on/off
@@ -1924,12 +1923,14 @@ void loop() {
ds18.loop();
}
- // publish EMS data to MQTT
- // because of the force=false argument, it will see if there is anything received that must be published
- publishEMSValues(false);
+ // publish EMS data to MQTT, only if in automatic mode (publish_time=0) otherwise it'll use the timer
+ if (EMSESP_Settings.publish_time == 0) {
+ publishEMSValues(false);
+ }
// if we have an EMS connect go and fetch some data and MQTT publish it
if (_need_first_publish) {
+ publishEMSValues(false);
publishSensorValues();
_need_first_publish = false; // reset flag
}
diff --git a/src/version.h b/src/version.h
index 8ce1c1208..abc657ea0 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b1"
+#define APP_VERSION "1.9.5b2"
From 33d930b7cdf3fe44260bba79d2bc76074abe0749 Mon Sep 17 00:00:00 2001
From: Paul
Date: Fri, 20 Dec 2019 14:53:12 +0100
Subject: [PATCH 003/195] fixes for #263, MQTT flooding,
---
platformio.ini | 2 +-
src/ems-esp.cpp | 83 +++++++++++-----------
src/ems.cpp | 179 ++++++++++++++++++++----------------------------
src/ems.h | 3 +-
src/version.h | 2 +-
5 files changed, 120 insertions(+), 149 deletions(-)
diff --git a/platformio.ini b/platformio.ini
index 747006030..80fc57d1a 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -110,5 +110,5 @@ board = d1_mini
build_type = release
build_flags = ${common.build_flags} ${common.custom_flags}
extra_scripts =
- pre:scripts/pre_script.py
+ ;pre:scripts/pre_script.py
scripts/main_script.py
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index a80890c53..c4d6fb017 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -33,9 +33,8 @@ DS18 ds18;
#define APP_URL_API "https://api.github.com/repos/proddy/EMS-ESP"
// timers, all values are in seconds
-#define DEFAULT_PUBLISHTIME 0
+#define DEFAULT_PUBLISHTIME 10 // 10 seconds
Ticker publishValuesTimer;
-Ticker publishSensorValuesTimer;
bool _need_first_publish = true; // this ensures on boot we always send out MQTT messages
@@ -824,9 +823,39 @@ void publishEMSValues(bool force) {
}
}
-// call PublishValues without forcing
+// Publish shower data
+bool do_publishShowerData() {
+ StaticJsonDocument<200> doc;
+ JsonObject rootShower = doc.to();
+ rootShower[TOPIC_SHOWER_TIMER] = EMSESP_Settings.shower_timer ? "1" : "0";
+ rootShower[TOPIC_SHOWER_ALERT] = EMSESP_Settings.shower_alert ? "1" : "0";
+
+ // only publish shower duration if there is a value
+ char s[50] = {0};
+ if (EMSESP_Shower.duration > SHOWER_MIN_DURATION) {
+ char buffer[16] = {0};
+ strlcpy(s, itoa((uint8_t)((EMSESP_Shower.duration / (1000 * 60)) % 60), buffer, 10), sizeof(s));
+ strlcat(s, " minutes and ", sizeof(s));
+ strlcat(s, itoa((uint8_t)((EMSESP_Shower.duration / 1000) % 60), buffer, 10), sizeof(s));
+ strlcat(s, " seconds", sizeof(s));
+ rootShower[TOPIC_SHOWER_DURATION] = s;
+ }
+
+ char data[300] = {0};
+ serializeJson(doc, data, sizeof(data));
+
+ myDebugLog("Publishing shower data via MQTT");
+
+ // Publish MQTT forcing retain to be off
+ return (myESP.mqttPublish(TOPIC_SHOWER_DATA, data, false));
+}
+
+// call PublishValues with forcing forcing
void do_publishValues() {
- publishEMSValues(true); // force publish
+ myDebugLog("Starting scheduled MQTT publish...");
+ publishEMSValues(false);
+ publishSensorValues();
+ do_publishShowerData();
}
// callback to light up the LED, called via Ticker every second
@@ -851,6 +880,7 @@ void do_systemCheck() {
// force calls to get data from EMS for the types that aren't sent as broadcasts
// only if we have a EMS connection
+// which will cause the values to get published
void do_regularUpdates() {
if (ems_getBusConnected() && !ems_getTxDisabled()) {
myDebugLog("Fetching data from EMS devices");
@@ -936,33 +966,6 @@ bool LoadSaveCallback(MYESP_FSACTION_t action, JsonObject settings) {
return false;
}
-// Publish shower data
-bool do_publishShowerData() {
- StaticJsonDocument<200> doc;
- JsonObject rootShower = doc.to();
- rootShower[TOPIC_SHOWER_TIMER] = EMSESP_Settings.shower_timer ? "1" : "0";
- rootShower[TOPIC_SHOWER_ALERT] = EMSESP_Settings.shower_alert ? "1" : "0";
-
- // only publish shower duration if there is a value
- char s[50] = {0};
- if (EMSESP_Shower.duration > SHOWER_MIN_DURATION) {
- char buffer[16] = {0};
- strlcpy(s, itoa((uint8_t)((EMSESP_Shower.duration / (1000 * 60)) % 60), buffer, 10), sizeof(s));
- strlcat(s, " minutes and ", sizeof(s));
- strlcat(s, itoa((uint8_t)((EMSESP_Shower.duration / 1000) % 60), buffer, 10), sizeof(s));
- strlcat(s, " seconds", sizeof(s));
- rootShower[TOPIC_SHOWER_DURATION] = s;
- }
-
- char data[300] = {0};
- serializeJson(doc, data, sizeof(data));
-
- myDebugLog("Publishing shower data via MQTT");
-
- // Publish MQTT forcing retain to be off
- return (myESP.mqttPublish(TOPIC_SHOWER_DATA, data, false));
-}
-
// callback for custom settings when showing Stored Settings with the 'set' command
// wc is number of arguments after the 'set' command
// returns true if the setting was recognized and changed and should be saved back to SPIFFs
@@ -1087,7 +1090,7 @@ bool SetListCallback(MYESP_FSACTION_t action, uint8_t wc, const char * setting,
if (EMSESP_Settings.publish_time) {
myDebug_P(PSTR(" publish_time=%d"), EMSESP_Settings.publish_time);
} else {
- myDebug_P(PSTR(" publish_time=0 (always publish when data received)"), EMSESP_Settings.publish_time);
+ myDebug_P(PSTR(" publish_time=0 (always publish on data received)"), EMSESP_Settings.publish_time);
}
}
@@ -1154,8 +1157,6 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) {
if (strcmp(first_cmd, "publish") == 0) {
do_publishValues();
- publishSensorValues();
- do_publishShowerData();
ok = true;
}
@@ -1886,16 +1887,14 @@ void setup() {
}
}
- // enable regular checks
+ // enable regular checks to fetch data and publish
if (!EMSESP_Settings.listen_mode) {
regularUpdatesTimer.attach(REGULARUPDATES_TIME, do_regularUpdates); // regular reads from the EMS
}
- // set timers for MQTT publish
- // only if publish_time is not 0 (automatic mode)
+ // set timers for MQTT publish, only if publish_time is not 0 (automatic mode)
if (EMSESP_Settings.publish_time) {
- publishValuesTimer.attach(EMSESP_Settings.publish_time, do_publishValues); // post MQTT EMS values
- publishSensorValuesTimer.attach(EMSESP_Settings.publish_time, publishSensorValues); // post MQTT dallas sensor values
+ publishValuesTimer.attach(EMSESP_Settings.publish_time, do_publishValues); // post MQTT EMS values
}
// set pin for LED
@@ -1905,10 +1904,11 @@ void setup() {
ledcheckTimer.attach_ms(LEDCHECK_TIME, do_ledcheck); // blink heartbeat LED
}
+ // system check
+ systemCheckTimer.attach(SYSTEMCHECK_TIME, do_systemCheck); // check if EMS is reachable
+
// check for Dallas sensors
EMSESP_Settings.dallas_sensors = ds18.setup(EMSESP_Settings.dallas_gpio, EMSESP_Settings.dallas_parasite); // returns #sensors
-
- systemCheckTimer.attach(SYSTEMCHECK_TIME, do_systemCheck); // check if EMS is reachable
}
//
@@ -1918,7 +1918,6 @@ void loop() {
myESP.loop(); // handle telnet, mqtt, wifi etc
// check Dallas sensors, using same schedule as publish_time (default 2 mins in DS18_READ_INTERVAL)
- // these values are published to MQTT separately via the timer publishSensorValuesTimer
if (EMSESP_Settings.dallas_sensors) {
ds18.loop();
}
diff --git a/src/ems.cpp b/src/ems.cpp
index fe9416bab..af7fb292e 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -325,13 +325,21 @@ uint8_t _crcCalculator(uint8_t * data, uint8_t len) {
return crc;
}
+// validate we have data at the offset (index) requested
+// returns -1 if out of bounds
+int8_t _getDataPosition(_EMS_RxTelegram * EMS_RxTelegram, uint8_t index) {
+ int8_t pos = index - EMS_RxTelegram->offset; // get adjusted index position based on offset
+ return (pos >= EMS_RxTelegram->data_length) ? -1 : pos; // return -1 if out of bounds
+}
+
// unsigned short
void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint16_t * param_op, uint8_t index) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- uint16_t value = (EMS_RxTelegram->data[index] << 8) + EMS_RxTelegram->data[index + 1];
+ uint16_t value = (EMS_RxTelegram->data[pos] << 8) + EMS_RxTelegram->data[pos + 1];
// check for undefined/unset values, 0x8000
if (value == EMS_VALUE_USHORT_NOTSET) {
@@ -343,14 +351,15 @@ void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint16_t * param_op, uint8_t in
// signed short
void _setValue(_EMS_RxTelegram * EMS_RxTelegram, int16_t * param_op, uint8_t index) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- int16_t value = (EMS_RxTelegram->data[index] << 8) + EMS_RxTelegram->data[index + 1];
+ int16_t value = (EMS_RxTelegram->data[pos] << 8) + EMS_RxTelegram->data[pos + 1];
// check for undefined/unset values, 0x8000
- if ((value == EMS_VALUE_SHORT_NOTSET) || (EMS_RxTelegram->data[index] == 0x7D)) {
+ if ((value == EMS_VALUE_SHORT_NOTSET) || (EMS_RxTelegram->data[pos] == 0x7D)) {
return;
}
@@ -359,38 +368,42 @@ void _setValue(_EMS_RxTelegram * EMS_RxTelegram, int16_t * param_op, uint8_t ind
// Byte
void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint8_t * param_op, uint8_t index) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- *param_op = (uint8_t)EMS_RxTelegram->data[index];
+ *param_op = (uint8_t)EMS_RxTelegram->data[pos];
}
// convert signed short to single 8 byte, for setpoint thermostat temperatures that don't store their temps in 2 bytes
void _setValue8(_EMS_RxTelegram * EMS_RxTelegram, int16_t * param_op, uint8_t index) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- *param_op = EMS_RxTelegram->data[index];
+ *param_op = EMS_RxTelegram->data[pos];
}
// Long
void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint32_t * param_op, uint8_t index) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- *param_op = (uint32_t)((EMS_RxTelegram->data[index] << 16) + (EMS_RxTelegram->data[index + 1] << 8) + (EMS_RxTelegram->data[index + 2]));
+ *param_op = (uint32_t)((EMS_RxTelegram->data[pos] << 16) + (EMS_RxTelegram->data[pos + 1] << 8) + (EMS_RxTelegram->data[pos + 2]));
}
// bit from a byte
void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint8_t * param_op, uint8_t index, uint8_t bit) {
- if (index >= EMS_RxTelegram->data_length) {
+ int8_t pos = _getDataPosition(EMS_RxTelegram, index);
+ if (pos < 0) {
return;
}
- *param_op = (uint8_t)(((EMS_RxTelegram->data[index]) >> (bit)) & 0x01);
+ *param_op = (uint8_t)(((EMS_RxTelegram->data[pos]) >> (bit)) & 0x01);
}
void ems_setTxMode(uint8_t mode) {
@@ -1019,7 +1032,7 @@ void _process_UBAMonitorFast(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Boiler.sysPress, 17); // is *10
// read the service code / installation status as appears on the display
- if (EMS_RxTelegram->data_length > 18) {
+ if ((EMS_RxTelegram->data_length > 18) && (EMS_RxTelegram->offset == 0)) {
EMS_Boiler.serviceCodeChar[0] = char(EMS_RxTelegram->data[18]); // ascii character 1
EMS_Boiler.serviceCodeChar[1] = char(EMS_RxTelegram->data[19]); // ascii character 2
EMS_Boiler.serviceCodeChar[2] = '\0'; // null terminate string
@@ -1042,7 +1055,7 @@ void _process_UBAMonitorFast2(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Boiler.flameCurr, 19);
// read the service code / installation status as appears on the display
- if (EMS_RxTelegram->data_length > 4) {
+ if ((EMS_RxTelegram->data_length > 4) && (EMS_RxTelegram->offset == 0)) {
EMS_Boiler.serviceCodeChar[0] = char(EMS_RxTelegram->data[4]); // ascii character 1
EMS_Boiler.serviceCodeChar[1] = char(EMS_RxTelegram->data[5]); // ascii character 2
EMS_Boiler.serviceCodeChar[2] = '\0';
@@ -1222,36 +1235,20 @@ void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
}
EMS_Thermostat.hc[hc].active = true;
- // handle single data values. data will always be at position data[0]
- if (EMS_RxTelegram->data_length == 1) {
- switch (EMS_RxTelegram->offset) {
- case EMS_OFFSET_RCPLUSStatusMessage_curr: // setpoint target temp
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, 0); // value is * 10
- break;
- case EMS_OFFSET_RCPLUSStatusMessage_setpoint: // current target temp
- EMS_Thermostat.hc[hc].setpoint_roomTemp = EMS_RxTelegram->data[0]; // convert to single byte, value is * 2
- break;
- case EMS_OFFSET_RCPLUSStatusMessage_currsetpoint: // current setpoint temp, e.g. Thermostat -> all, telegram: 10 00 FF 06 01 A5 22
- EMS_Thermostat.hc[hc].setpoint_roomTemp = EMS_RxTelegram->data[0]; // convert to single byte, value is * 2
- break;
- case EMS_OFFSET_RCPLUSStatusMessage_mode: // thermostat mode auto/manual
- // manual : 10 00 FF 0A 01 A5 02
- // auto : 10 00 FF 0A 01 A5 03
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, 0,
- 0); // bit 1, mode (auto=1 or manual=0). Note this may be bit 2 - still need to validate
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, 0, 1); // get day mode flag
+ // the whole telegram
+ // e.g. Thermostat -> all, telegram: 10 00 FF 00 01 A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00
+ // 10 00 FF 00 01 A5 80 00 01 30 28 00 30 28 01 54 03 03 01 01 54 02 A8 00 00 11 01 03 FF FF 00
+ // or prtial, e.g. for modes:
+ // manual : 10 00 FF 0A 01 A5 02
+ // auto : 10 00 FF 0A 01 A5 03
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_RCPLUSStatusMessage_curr); // value is * 10
+ _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RCPLUSStatusMessage_setpoint); // convert to single byte, value is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_RCPLUSStatusMessage_mode, 1);
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_RCPLUSStatusMessage_mode, 0); // bit 1, mode (auto=1 or manual=0)
- break;
- }
- } else if (EMS_RxTelegram->data_length > 20) {
- // the whole telegram
- // e.g. Thermostat -> all, telegram: 10 00 FF 00 01 A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00
- // 10 00 FF 00 01 A5 80 00 01 30 28 00 30 28 01 54 03 03 01 01 54 02 A8 00 00 11 01 03 FF FF 00
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_RCPLUSStatusMessage_curr); // value is * 10
- _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RCPLUSStatusMessage_setpoint); // convert to single byte, value is * 2
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_RCPLUSStatusMessage_mode, 1);
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_RCPLUSStatusMessage_mode, 0); // bit 1, mode (auto=1 or manual=0)
- }
+ // TODO figure out current setpoint temp at offset 6
+ // e.g. Thermostat -> all, telegram: 10 00 FF 06 01 A5 22
+ // EMS_Thermostat.hc[hc].setpoint_roomTemp = EMS_RxTelegram->data[EMS_OFFSET_RCPLUSStatusMessage_currsetpoint];
}
/**
@@ -1267,15 +1264,13 @@ void _process_RCPLUSStatusMode(_EMS_RxTelegram * EMS_RxTelegram) {
* for FW100: 90 00 FF 00 00 6F 03 02 00 D7 00 DA F3 34 00 C4
*/
void _process_JunkersStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- if (EMS_RxTelegram->offset == 0 && EMS_RxTelegram->data_length > 1) {
- uint8_t hc = EMS_THERMOSTAT_DEFAULTHC - 1; // use HC1
- EMS_Thermostat.hc[hc].active = true;
+ uint8_t hc = EMS_THERMOSTAT_DEFAULTHC - 1; // use HC1
+ EMS_Thermostat.hc[hc].active = true;
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_JunkersStatusMessage_curr); // value is * 10
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_JunkersStatusMessage_setpoint); // value is * 10
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_JunkersStatusMessage_daymode); // 3 = day, 2 = night
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_JunkersStatusMessage_mode); // 1 = manual, 2 = auto
- }
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_JunkersStatusMessage_curr); // value is * 10
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_JunkersStatusMessage_setpoint); // value is * 10
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_JunkersStatusMessage_daymode); // 3 = day, 2 = night
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_JunkersStatusMessage_mode); // 1 = manual, 2 = auto
}
/**
@@ -1290,25 +1285,18 @@ void _process_RCPLUSSetMessage(_EMS_RxTelegram * EMS_RxTelegram) {
uint8_t hc = EMS_THERMOSTAT_DEFAULTHC - 1; // use HC1
EMS_Thermostat.hc[hc].active = true;
- // check for one data value
- // but ignore values of 0xFF, e.g. 10 00 FF 08 01 B9 FF
- if ((EMS_RxTelegram->data_length == 1) && (EMS_RxTelegram->data[0] != 0xFF)) {
- // check for setpoint temps, e.g. Thermostat -> all, type 0x01B9, telegram: 10 00 FF 08 01 B9 26
- if ((EMS_RxTelegram->offset == EMS_OFFSET_RCPLUSSet_temp_setpoint) || (EMS_RxTelegram->offset == EMS_OFFSET_RCPLUSSet_manual_setpoint)) {
- _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, 0); // single byte conversion, value is * 2
- } else if (EMS_RxTelegram->offset == EMS_OFFSET_RCPLUSSet_mode) {
- // check for mode, eg. 10 00 FF 08 01 B9 FF
- EMS_Thermostat.hc[hc].mode = (EMS_RxTelegram->data[0] == 0xFF); // Auto = xFF, Manual = x00 (auto=1 or manual=0)
- }
- return; // quit
+ // ignore single values of 0xFF, e.g. 10 00 FF 08 01 B9 FF
+ if ((EMS_RxTelegram->data_length == 1) && (EMS_RxTelegram->data[0] == 0xFF)) {
+ return;
}
- // check for long broadcasts
- if (EMS_RxTelegram->offset == 0) {
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_RCPLUSSet_mode);
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].daytemp, EMS_OFFSET_RCPLUSSet_temp_comfort2); // is * 2
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].nighttemp, EMS_OFFSET_RCPLUSSet_temp_eco); // is * 2
- }
+ // check for setpoint temps, e.g. Thermostat -> all, type 0x01B9, telegram: 10 00 FF 08 01 B9 26
+ // NOTE when setting the room temp we pick from two values, hopefully one is correct!
+ _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RCPLUSSet_temp_setpoint); // single byte conversion, value is * 2
+ _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RCPLUSSet_manual_setpoint); // single byte conversion, value is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_RCPLUSSet_mode); // Auto = xFF, Manual = x00 eg. 10 00 FF 08 01 B9 FF
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].daytemp, EMS_OFFSET_RCPLUSSet_temp_comfort2); // is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].nighttemp, EMS_OFFSET_RCPLUSSet_temp_eco); // is * 2
}
/**
@@ -1417,11 +1405,6 @@ void _process_SM10Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
* 30 00 FF 00 02 62 01 A1 - for bottom temps
*/
void _process_SM100Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
- // only process the complete telegram, not partial
- if (EMS_RxTelegram->offset) {
- return;
- }
-
_setValue(EMS_RxTelegram, &EMS_SolarModule.collectorTemp, 0); // is *10
_setValue(EMS_RxTelegram, &EMS_SolarModule.bottomTemp, 2); // is *10
}
@@ -1432,22 +1415,14 @@ void _process_SM100Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
* 30 00 FF 09 02 64 1E = 30%
*/
void _process_SM100Status(_EMS_RxTelegram * EMS_RxTelegram) {
- if (EMS_RxTelegram->offset == 0) {
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pumpModulation, 9); // check for complete telegram
- } else if (EMS_RxTelegram->offset == 0x09) {
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pumpModulation, 0); // data at offset 09
- }
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.pumpModulation, 9); // check for complete telegram
}
/*
* SM100Status2 - type 0x026A EMS+ for pump on/off at offset 0x0A
*/
void _process_SM100Status2(_EMS_RxTelegram * EMS_RxTelegram) {
- if (EMS_RxTelegram->offset == 0) {
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pump, 10, 2); // 03=off 04=on
- } else if (EMS_RxTelegram->offset == 0x0A) {
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pump, 0, 2); // 03=off 04=on at offset 0A
- }
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.pump, 10, 2); // 03=off 04=on
}
/*
@@ -1479,18 +1454,11 @@ void _process_HPMonitor2(_EMS_RxTelegram * EMS_RxTelegram) {
* e.g. B0 00 FF 00 00 03 32 00 00 00 00 13 00 D6 00 00 00 FB D0 F0
*/
void _process_ISM1StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- if (EMS_RxTelegram->offset == 0) {
- _setValue(EMS_RxTelegram, &EMS_SolarModule.collectorTemp, 4); // Collector Temperature
- _setValue(EMS_RxTelegram, &EMS_SolarModule.bottomTemp, 6); // Temperature Bottom of Solar Boiler
- _setValue(EMS_RxTelegram, &EMS_SolarModule.EnergyLastHour, 2); // Solar Energy produced in last hour - is * 10 and handled in ems-esp.cpp
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pump, 8, 0); // Solar pump on (1) or off (0)
- _setValue(EMS_RxTelegram, &EMS_SolarModule.pumpWorkMin, 10);
- }
-
- if (EMS_RxTelegram->offset == 4) {
- // e.g. B0 00 FF 04 00 03 02 E5
- _setValue(EMS_RxTelegram, &EMS_SolarModule.collectorTemp, 0); // Collector Temperature
- }
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.collectorTemp, 4); // Collector Temperature
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.bottomTemp, 6); // Temperature Bottom of Solar Boiler
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.EnergyLastHour, 2); // Solar Energy produced in last hour - is * 10 and handled in ems-esp.cpp
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.pump, 8, 0); // Solar pump on (1) or off (0)
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.pumpWorkMin, 10);
}
@@ -1498,11 +1466,12 @@ void _process_ISM1StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
* Junkers ISM1 Solar Module - type 0x0001 EMS+ for setting values
*/
void _process_ISM1Set(_EMS_RxTelegram * EMS_RxTelegram) {
- if (EMS_RxTelegram->offset == 6) {
- // e.g. 90 30 FF 06 00 01 50 (CRC=2C)
- // to implement: change max solar boiler temperature
- EMS_SolarModule.setpoint_maxBottomTemp = EMS_RxTelegram->data[0];
- }
+ // e.g. 90 30 FF 06 00 01 50
+ // only trigger if at offset 6
+ _setValue(EMS_RxTelegram, &EMS_SolarModule.setpoint_maxBottomTemp, 6);
+
+ // TODO: we may need to convert this to a single byte like
+ // EMS_SolarModule.setpoint_maxBottomTemp = EMS_RxTelegram->data[0];
}
/**
@@ -1523,7 +1492,7 @@ void _process_SetPoints(_EMS_RxTelegram * EMS_RxTelegram) {
myDebug_P(PSTR(" Boiler flow temp %s C, Warm Water power %d %"), s, ww_power);
*/
- myDebug_P(PSTR(" Boiler flow temperature is %d C"), setpoint);
+ myDebug_P(PSTR("Boiler flow temperature is %d C"), setpoint);
}
}
}
@@ -2387,7 +2356,7 @@ void ems_setThermostatMode(uint8_t mode, uint8_t hc_num) {
*/
void ems_setWarmWaterTemp(uint8_t temperature) {
// check for invalid temp values
- if ((temperature < 30) || (temperature > EMS_BOILER_TAPWATER_TEMPERATURE_MAX)) {
+ if ((temperature < EMS_BOILER_TAPWATER_TEMPERATURE_MIN) || (temperature > EMS_BOILER_TAPWATER_TEMPERATURE_MAX)) {
return;
}
@@ -2429,7 +2398,9 @@ void ems_setFlowTemp(uint8_t temperature) {
EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH;
EMS_TxTelegram.dataValue = temperature; // int value to compare against
- EMS_TxTelegram.type_validate = EMS_TYPE_UBASetPoints; // validate
+ // EMS_TxTelegram.type_validate = EMS_TYPE_UBASetPoints; // validate
+ EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate after the write
+
EMS_TxTelegram.comparisonOffset = EMS_OFFSET_UBASetPoints_flowtemp;
EMS_TxTelegram.comparisonValue = temperature;
EMS_TxTelegram.comparisonPostRead = EMS_TYPE_UBASetPoints;
diff --git a/src/ems.h b/src/ems.h
index 03f619291..ecb10e951 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -66,8 +66,9 @@ typedef enum {
#define EMS_BOILER_BURNPOWER_TAPWATER 100
#define EMS_BOILER_SELFLOWTEMP_HEATING 30 // was 70, changed to 30 for https://github.com/proddy/EMS-ESP/issues/193
-// define maximum setable tapwater temperature
+// define min & maximum setable tapwater temperature
#define EMS_BOILER_TAPWATER_TEMPERATURE_MAX 60
+#define EMS_BOILER_TAPWATER_TEMPERATURE_MIN 30
#define EMS_TX_TELEGRAM_QUEUE_MAX 50 // max size of Tx FIFO queue. Number of Tx records to send.
diff --git a/src/version.h b/src/version.h
index abc657ea0..67cdd773f 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b2"
+#define APP_VERSION "1.9.5b3"
From b5eebea6a1e65169a32dc45fef43f45af0e5a650 Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 23 Dec 2019 16:18:10 +0100
Subject: [PATCH 004/195] remove MM400 #262
---
src/ems_devices.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 3d09e6ec0..b2f389108 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -235,7 +235,7 @@ static const _EMS_Device EMS_Devices[] = {
{159, EMS_DEVICE_TYPE_MIXING, "MM50 Mixing Module", EMS_DEVICE_FLAG_NONE},
{79, EMS_DEVICE_TYPE_MIXING, "MM100 Mixer Module", EMS_DEVICE_FLAG_NONE},
{80, EMS_DEVICE_TYPE_MIXING, "MM200 Mixer Module", EMS_DEVICE_FLAG_NONE},
- {78, EMS_DEVICE_TYPE_MIXING, "MM400 Mixer Module", EMS_DEVICE_FLAG_NONE},
+ //{78, EMS_DEVICE_TYPE_MIXING, "MM400 Mixer Module", EMS_DEVICE_FLAG_NONE},
//
// HeatPump - type 0x38
From 35f3a291be262d4feca4c31f0524e3a48dcf35f6 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 23 Dec 2019 20:27:51 +0100
Subject: [PATCH 005/195] disable MQTT last will. dont think anyone was using
it
---
src/MyESP.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/MyESP.cpp b/src/MyESP.cpp
index eba5cde68..d587bba0b 100644
--- a/src/MyESP.cpp
+++ b/src/MyESP.cpp
@@ -501,11 +501,19 @@ void MyESP::_mqtt_setup() {
mqttClient.setCleanSession(false);
// last will
+
+ /****************
+ *
+ * disabling last will, since version 1.9.5
+ *
+
if (_hasValue(_mqtt_will_topic)) {
mqttClient.setWill(_mqttTopic(_mqtt_will_topic), 1, true,
_mqtt_will_offline_payload); // retain always true
}
+ */
+
// set credentials if we have them
if (_hasValue(_mqtt_user)) {
mqttClient.setCredentials(_mqtt_user, _mqtt_password);
From 591bc7c119177967c772644abe396da087ba5d99 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 23 Dec 2019 20:27:58 +0100
Subject: [PATCH 006/195] bump
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 67cdd773f..1e23d4d57 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b3"
+#define APP_VERSION "1.9.5b4"
From 1a2c58d9a875f37cf153ba9b610af65be2a009ca Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 23 Dec 2019 20:28:26 +0100
Subject: [PATCH 007/195] take only boilTemp from 0x18 Fast telegrams
---
src/ems.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index af7fb292e..4801b2de2 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1023,7 +1023,10 @@ void _process_UBAMonitorFast(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Boiler.wWHeat, 7, 6);
_setValue(EMS_RxTelegram, &EMS_Boiler.wWCirc, 7, 7);
- _setValue(EMS_RxTelegram, &EMS_Boiler.boilTemp, 11); // 0x8000 if not available
+ // there may also be an BoilTemp here but can't remember what it is, so commenting out for now
+ // we use the one from UBAMonitorSlow
+ // _setValue(EMS_RxTelegram, &EMS_Boiler.boilTemp, 11); // 0x8000 if not available
+
_setValue(EMS_RxTelegram, &EMS_Boiler.retTemp, 13);
_setValue(EMS_RxTelegram, &EMS_Boiler.flameCurr, 15);
_setValue(EMS_RxTelegram, &EMS_Boiler.serviceCode, 20);
From 990d65492015622db744f2dc2524b35fa4e99d92 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 23 Dec 2019 20:28:42 +0100
Subject: [PATCH 008/195] added comment
---
src/ems-esp.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index c4d6fb017..7cd4fa0f5 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -1887,7 +1887,7 @@ void setup() {
}
}
- // enable regular checks to fetch data and publish
+ // enable regular checks to fetch data and publish using Tx (unless listen_mode is enabled)
if (!EMSESP_Settings.listen_mode) {
regularUpdatesTimer.attach(REGULARUPDATES_TIME, do_regularUpdates); // regular reads from the EMS
}
From 3002e0dfac137e15692998b14b1a50af326d1fee Mon Sep 17 00:00:00 2001
From: proddy
Date: Tue, 24 Dec 2019 08:09:21 +0100
Subject: [PATCH 009/195] rollback MQTT last will change
---
src/MyESP.cpp | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/src/MyESP.cpp b/src/MyESP.cpp
index d587bba0b..1a5afe520 100644
--- a/src/MyESP.cpp
+++ b/src/MyESP.cpp
@@ -501,19 +501,10 @@ void MyESP::_mqtt_setup() {
mqttClient.setCleanSession(false);
// last will
-
- /****************
- *
- * disabling last will, since version 1.9.5
- *
-
if (_hasValue(_mqtt_will_topic)) {
- mqttClient.setWill(_mqttTopic(_mqtt_will_topic), 1, true,
- _mqtt_will_offline_payload); // retain always true
+ mqttClient.setWill(_mqttTopic(_mqtt_will_topic), 1, true, _mqtt_will_offline_payload); // retain always true
}
- */
-
// set credentials if we have them
if (_hasValue(_mqtt_user)) {
mqttClient.setCredentials(_mqtt_user, _mqtt_password);
From f27088c035324d1674f4a152e3b3426db7a0fa0b Mon Sep 17 00:00:00 2001
From: proddy
Date: Thu, 26 Dec 2019 17:34:37 +0100
Subject: [PATCH 010/195] fix for sieger, typo in devices library - #266
---
src/ems_devices.h | 2 +-
src/version.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index b2f389108..25865e9ff 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -281,7 +281,7 @@ static const _EMS_Device EMS_Devices[] = {
{165, EMS_DEVICE_TYPE_THERMOSTAT, "RC100/Moduline 1010", EMS_DEVICE_FLAG_RC300 | EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
// Sieger
- {076, EMS_DEVICE_TYPE_THERMOSTAT, "Sieger ES73", EMS_DEVICE_FLAG_RC35}, // 0x10
+ {76, EMS_DEVICE_TYPE_THERMOSTAT, "Sieger ES73", EMS_DEVICE_FLAG_RC35}, // 0x10
// Junkers
{105, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW100", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
diff --git a/src/version.h b/src/version.h
index 1e23d4d57..4b432793d 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b4"
+#define APP_VERSION "1.9.5b5"
From a22e64a8caaa8b1f9b2f11c0e45f89abb74eda14 Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Mon, 30 Dec 2019 13:35:23 +0100
Subject: [PATCH 011/195] MM10 mixer added, changed WWDesired to
WWDesinfection, added boier exhaust temperature
---
src/ems-esp.cpp | 18 +++++++++++++-----
src/ems.cpp | 23 ++++++++++++++++++++---
src/ems.h | 4 +++-
src/ems_devices.h | 7 +++++++
4 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index 7cd4fa0f5..c1ca94e1c 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -296,7 +296,7 @@ void showInfo() {
}
_renderIntValue("Warm Water selected temperature", "C", EMS_Boiler.wWSelTemp);
- _renderIntValue("Warm Water desired temperature", "C", EMS_Boiler.wWDesiredTemp);
+ _renderIntValue("Warm Water desinfection temperature", "C", EMS_Boiler.wWDesinfectTemp);
// UBAMonitorWWMessage
_renderUShortValue("Warm Water current temperature", "C", EMS_Boiler.wWCurTmp);
@@ -339,6 +339,7 @@ void showInfo() {
_renderShortValue("Outside temperature", "C", EMS_Boiler.extTemp);
}
_renderUShortValue("Boiler temperature", "C", EMS_Boiler.boilTemp);
+ _renderUShortValue("Exhaust temperature", "C", EMS_Boiler.exhaustTemp);
_renderIntValue("Pump modulation", "%", EMS_Boiler.pumpMod);
_renderLongValue("Burner # starts", "times", EMS_Boiler.burnStarts);
if (EMS_Boiler.burnWorkMin != EMS_VALUE_LONG_NOTSET) {
@@ -475,8 +476,12 @@ void showInfo() {
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].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);
- _renderIntValue(" Current valve status", "%", EMS_Mixing.hc[hc_num - 1].valveStatus);
+ if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET)
+ _renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus);
+
}
}
}
@@ -561,8 +566,8 @@ void publishEMSValues(bool force) {
if (EMS_Boiler.wWSelTemp != EMS_VALUE_INT_NOTSET)
rootBoiler["wWSelTemp"] = EMS_Boiler.wWSelTemp;
- if (EMS_Boiler.wWDesiredTemp != EMS_VALUE_INT_NOTSET)
- rootBoiler["wWDesiredTemp"] = EMS_Boiler.wWDesiredTemp;
+ if (EMS_Boiler.wWDesinfectTemp != EMS_VALUE_INT_NOTSET)
+ rootBoiler["wWDesinfectionTemp"] = EMS_Boiler.wWDesinfectTemp;
if (EMS_Boiler.selFlowTemp != EMS_VALUE_INT_NOTSET)
rootBoiler["selFlowTemp"] = EMS_Boiler.selFlowTemp;
if (EMS_Boiler.selBurnPow != EMS_VALUE_INT_NOTSET)
@@ -590,7 +595,8 @@ void publishEMSValues(bool force) {
rootBoiler["sysPress"] = (float)EMS_Boiler.sysPress / 10;
if (EMS_Boiler.boilTemp != EMS_VALUE_USHORT_NOTSET)
rootBoiler["boilTemp"] = (float)EMS_Boiler.boilTemp / 10;
-
+ 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);
@@ -750,6 +756,8 @@ void publishEMSValues(bool force) {
if (mixing->flowTemp != EMS_VALUE_SHORT_NOTSET)
dataMixing["flowTemp"] = (float)mixing->flowTemp / 10;
+ if (mixing->flowSetTemp != EMS_VALUE_INT_NOTSET)
+ dataMixing["setflowTemp"] = mixing->flowSetTemp;
if (mixing->pumpMod != EMS_VALUE_INT_NOTSET)
dataMixing["pumpMod"] = mixing->pumpMod;
if (mixing->valveStatus != EMS_VALUE_INT_NOTSET)
diff --git a/src/ems.cpp b/src/ems.cpp
index 4801b2de2..756261a5d 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -121,13 +121,14 @@ void ems_init() {
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;
}
// UBAParameterWW
EMS_Boiler.wWActivated = EMS_VALUE_BOOL_NOTSET; // Warm Water activated
EMS_Boiler.wWSelTemp = EMS_VALUE_INT_NOTSET; // Warm Water selected temperature
EMS_Boiler.wWCircPump = EMS_VALUE_BOOL_NOTSET; // Warm Water circulation pump available
- EMS_Boiler.wWDesiredTemp = EMS_VALUE_INT_NOTSET; // Warm Water desired temperature to prevent infection
+ EMS_Boiler.wWDesinfectTemp = EMS_VALUE_INT_NOTSET; // Warm Water desinfection temperature to prevent infection
EMS_Boiler.wWComfort = EMS_VALUE_INT_NOTSET; // WW comfort mode
// UBAMonitorFast
@@ -150,6 +151,7 @@ void ems_init() {
// UBAMonitorSlow
EMS_Boiler.extTemp = EMS_VALUE_SHORT_NOTSET; // Outside temperature
EMS_Boiler.boilTemp = EMS_VALUE_USHORT_NOTSET; // Boiler temperature
+ EMS_Boiler.exhaustTemp = EMS_VALUE_USHORT_NOTSET; // Exhaust temperature
EMS_Boiler.pumpMod = EMS_VALUE_INT_NOTSET; // Pump modulation %
EMS_Boiler.burnStarts = EMS_VALUE_LONG_NOTSET; // # burner restarts
EMS_Boiler.burnWorkMin = EMS_VALUE_LONG_NOTSET; // Total burner operating time
@@ -951,7 +953,7 @@ void _process_UBAParameterWW(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Boiler.wWActivated, 1); // 0xFF means on
_setValue(EMS_RxTelegram, &EMS_Boiler.wWCircPump, 6); // 0xFF means on
_setValue(EMS_RxTelegram, &EMS_Boiler.wWSelTemp, 2);
- _setValue(EMS_RxTelegram, &EMS_Boiler.wWDesiredTemp, 8);
+ _setValue(EMS_RxTelegram, &EMS_Boiler.wWDesinfectTemp, 8);
_setValue(EMS_RxTelegram, &EMS_Boiler.wWComfort, EMS_OFFSET_UBAParameterWW_wwComfort);
}
@@ -1083,6 +1085,7 @@ void _process_UBAMonitorFast2(_EMS_RxTelegram * EMS_RxTelegram) {
void _process_UBAMonitorSlow(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Boiler.extTemp, 0);
_setValue(EMS_RxTelegram, &EMS_Boiler.boilTemp, 2);
+ _setValue(EMS_RxTelegram, &EMS_Boiler.exhaustTemp, 4);
_setValue(EMS_RxTelegram, &EMS_Boiler.switchTemp, 25); // only if there is a mixer
_setValue(EMS_RxTelegram, &EMS_Boiler.pumpMod, 9);
_setValue(EMS_RxTelegram, &EMS_Boiler.burnStarts, 10);
@@ -1226,6 +1229,19 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMPLUSStatusMessage_valve_status);
}
+void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
+ uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage);
+ if (hc!=0) {
+ return; // invalid type
+ }
+ EMS_Mixing.hc[hc].active = true;
+
+ _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp);
+ _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].pumpMod, EMS_OFFSET_MMStatusMessage_pump_mod);
+ //_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMStatusMessage_valve_status);
+ _setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowSetTemp, EMS_OFFSET_MMStatusMessage_flow_set);
+}
+
/**
* type 0x01A5 - data from the Nefit RC1010/3000 thermostat (0x18) and RC300/310s on 0x10
* EMS+ messages may come in with different offsets so handle them here
@@ -2667,7 +2683,8 @@ const _EMS_Type EMS_Types[] = {
// Mixing devices
{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_HC2, "MMPLUSStatusMessage_HC2", _process_MMPLUSStatusMessage},
+ {EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMStatusMessage, "MMStatusMessage", _process_MMStatusMessage}
};
diff --git a/src/ems.h b/src/ems.h
index ecb10e951..9956b1dc9 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -253,7 +253,7 @@ typedef struct {
uint8_t wWActivated; // Warm Water activated
uint8_t wWSelTemp; // Warm Water selected temperature
uint8_t wWCircPump; // Warm Water circulation pump Available
- uint8_t wWDesiredTemp; // Warm Water desired temperature
+ uint8_t wWDesinfectTemp; // Warm Water desinfection temperature
uint8_t wWComfort; // Warm water comfort or ECO mode
// UBAMonitorFast
@@ -276,6 +276,7 @@ typedef struct {
// UBAMonitorSlow
int16_t extTemp; // Outside temperature
uint16_t boilTemp; // Boiler temperature
+ uint16_t exhaustTemp; // Exhaust temperature
uint8_t pumpMod; // Pump modulation
uint32_t burnStarts; // # burner starts
uint32_t burnWorkMin; // Total burner operating time
@@ -323,6 +324,7 @@ typedef struct {
uint16_t flowTemp;
uint8_t pumpMod;
uint8_t valveStatus;
+ uint8_t flowSetTemp;
} _EMS_Mixing_HC;
// Mixer data
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 25865e9ff..8ea8e34d0 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -196,6 +196,13 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
#define EMS_OFFSET_MMPLUSStatusMessage_pump_mod 5 // pump modulation
#define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent
+// MM10
+#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
+#define EMS_OFFSET_MMStatusMessage_valve_status 4 // valve 0..255
+
/*
* Table of all known EMS Devices
* ProductID, DeviceType, Description, Flags
From a3faf2cf188274109517799bcb7bd19dd150439b Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 14:46:08 +0100
Subject: [PATCH 012/195] SM200 support
---
src/ems_devices.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 25865e9ff..62572294b 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -14,7 +14,7 @@
// Fixed EMS Device IDs
#define EMS_ID_ME 0x0B // our device, hardcoded as the "Service Key"
#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
-#define EMS_ID_SM 0x30 // Solar Module SM10, SM100 and ISM1
+#define EMS_ID_SM 0x30 // Solar Module SM10, SM100, SM200 and ISM1
#define EMS_ID_HP 0x38 // HeatPump
#define EMS_ID_GATEWAY 0x48 // Gateway e.g. KM200 Web Gateway
#define EMS_ID_MIXING1 0x20 // Mixing
@@ -85,6 +85,7 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
#define EMS_OFFSET_UBASetPoints_flowtemp 0 // flow temp
// SM and HP Types
+// Assuming SM100 behaves like SM200
#define EMS_TYPE_SM10Monitor 0x97 // SM10Monitor
#define EMS_TYPE_SM100Monitor 0x0262 // SM100Monitor
#define EMS_TYPE_SM100Status 0x0264 // SM100Status
@@ -223,6 +224,7 @@ static const _EMS_Device EMS_Devices[] = {
//
{73, EMS_DEVICE_TYPE_SOLAR, "SM10 Solar Module", EMS_DEVICE_FLAG_SM10},
{163, EMS_DEVICE_TYPE_SOLAR, "SM100 Solar Module", EMS_DEVICE_FLAG_SM100},
+ {164, EMS_DEVICE_TYPE_SOLAR, "SM200 Solar Module", EMS_DEVICE_FLAG_SM100},
{101, EMS_DEVICE_TYPE_SOLAR, "Junkers ISM1 Solar Module", EMS_DEVICE_FLAG_SM100},
{162, EMS_DEVICE_TYPE_SOLAR, "SM50 Solar Module", EMS_DEVICE_FLAG_SM100},
@@ -262,7 +264,7 @@ static const _EMS_Device EMS_Devices[] = {
{189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
//
- // Thermostats, typically device id of 0x10, 0x17 and 0x18
+ // Thermostats, typically device id of 0x10, 0x17, 0x18 and 0x39 (easy)
//
// Easy devices - not currently supporting write operations
From 52a82277e9bc0c2333dc3015b53e31301dc4e697 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 14:46:26 +0100
Subject: [PATCH 013/195] 1.9.5b5
---
CHANGELOG.md | 5 +++++
src/version.h | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6b4a4a328..5360bebfd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,11 +8,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.9.5 beta]
### Added
+- Solar Module SM200 support
+- `set master_thermostat ` to choose with thermostat is master when there are multiple on the bus
### Fixed
+- set boiler warm water temp on Junkers/Bosch HT3
### Changed
+- improved MQTT publishing to stop flooding
+
### Removed
diff --git a/src/version.h b/src/version.h
index 4b432793d..8575109af 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b5"
+#define APP_VERSION "1.9.5b6"
From f0c7b954a54c9878c4c00df47facf6111b2941ec Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 14:47:02 +0100
Subject: [PATCH 014/195] SM200 support
---
src/my_config.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/my_config.h b/src/my_config.h
index a36662d9d..8fcec4e4f 100644
--- a/src/my_config.h
+++ b/src/my_config.h
@@ -52,7 +52,7 @@
// MQTT for mixing device
#define TOPIC_MIXING_DATA "mixing_data" // for sending mixing device values to MQTT
-// MQTT for SM10/SM100 Solar Module
+// MQTT for SM10/SM100/SM200 Solar Module
#define TOPIC_SM_DATA "sm_data" // topic name
#define SM_COLLECTORTEMP "collectortemp" // collector temp
#define SM_BOTTOMTEMP "bottomtemp" // bottom temp
From b64c35732ea678552ca923b8a1a4f606d279e9fe Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 14:47:23 +0100
Subject: [PATCH 015/195] spelling checks
---
src/MyESP.cpp | 2 +-
src/emsuart.cpp | 42 +++++++++++++++++++++---------------------
2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/src/MyESP.cpp b/src/MyESP.cpp
index 1a5afe520..f0b6b79eb 100644
--- a/src/MyESP.cpp
+++ b/src/MyESP.cpp
@@ -524,7 +524,7 @@ void MyESP::_wifi_setup() {
WiFi.setSleepMode(WIFI_NONE_SLEEP); // added to possibly fix wifi dropouts in arduino core 2.5.0
// ref: https://github.com/esp8266/Arduino/issues/6471
// ref: https://github.com/esp8266/Arduino/issues/6366
- // high tx power causing weird behavior, slighly lowering from 20.5 to 20.0 may help stability
+ // high tx power causing weird behavior, slightly lowering from 20.5 to 20.0 may help stability
WiFi.setOutputPower(20.0); // in DBM
#endif
diff --git a/src/emsuart.cpp b/src/emsuart.cpp
index 923583298..c99fee1eb 100644
--- a/src/emsuart.cpp
+++ b/src/emsuart.cpp
@@ -224,27 +224,27 @@ _EMS_TX_STATUS ICACHE_FLASH_ATTR emsuart_tx_buffer(uint8_t * buf, uint8_t len) {
}
emsuart_tx_brk(); // send
} else if (EMS_Sys_Status.emsTxMode == EMS_TXMODE_DEFAULT) {
- /*
- * based on code from https://github.com/proddy/EMS-ESP/issues/103 by @susisstrolch
- * we emit the whole telegram, with Rx interrupt disabled, collecting busmaster response in FIFO.
- * after sending the last char we poll the Rx status until either
- * - size(Rx FIFO) == size(Tx-Telegram)
- * - is detected
- * At end of receive we re-enable Rx-INT and send a Tx-BRK in loopback mode.
- *
- * EMS-Bus error handling
- * 1. Busmaster stops echoing on Tx w/o permission
- * 2. Busmaster cancel telegram by sending a BRK
- *
- * Case 1. is handled by a watchdog counter which is reset on each
- * Tx attempt. The timeout should be 20x EMSUART_BIT_TIME plus
- * some smart guess for processing time on targeted EMS device.
- * We set EMS_Sys_Status.emsTxStatus to EMS_TX_WTD_TIMEOUT and return
- *
- * Case 2. is handled via a BRK chk during transmission.
- * We set EMS_Sys_Status.emsTxStatus to EMS_TX_BRK_DETECT and return
- *
- */
+ /*
+ * based on code from https://github.com/proddy/EMS-ESP/issues/103 by @susisstrolch
+ * we emit the whole telegram, with Rx interrupt disabled, collecting busmaster response in FIFO.
+ * after sending the last char we poll the Rx status until either
+ * - size(Rx FIFO) == size(Tx-Telegram)
+ * - is detected
+ * At end of receive we re-enable Rx-INT and send a Tx-BRK in loopback mode.
+ *
+ * EMS-Bus error handling
+ * 1. Busmaster stops echoing on Tx w/o permission
+ * 2. Busmaster cancel telegram by sending a BRK
+ *
+ * Case 1. is handled by a watchdog counter which is reset on each
+ * Tx attempt. The timeout should be 20x EMSUART_BIT_TIME plus
+ * some smart guess for processing time on targeted EMS device.
+ * We set EMS_Sys_Status.emsTxStatus to EMS_TX_WTD_TIMEOUT and return
+ *
+ * Case 2. is handled via a BRK chk during transmission.
+ * We set EMS_Sys_Status.emsTxStatus to EMS_TX_BRK_DETECT and return
+ *
+ */
uint16_t wdc = EMS_TX_TO_COUNT;
ETS_UART_INTR_DISABLE(); // disable rx interrupt
From 4fbd135bfe50dd0de7faeb3603a12a7a62ea1e4a Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 14:48:06 +0100
Subject: [PATCH 016/195] multiple thermostat choice - #238
---
src/ems-esp.cpp | 102 ++++++++++++++++++++++++++++++++----------------
src/ems.cpp | 58 ++++++++++++++++++++-------
src/ems.h | 5 ++-
3 files changed, 117 insertions(+), 48 deletions(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index 7cd4fa0f5..e76e40a7f 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -69,15 +69,16 @@ typedef struct {
uint8_t dallas_sensors; // count of dallas sensors
// custom params
- bool shower_timer; // true if we want to report back on shower times
- bool shower_alert; // true if we want the alert of cold water
- bool led; // LED on/off
- bool listen_mode; // stop automatic Tx on/off
- uint16_t publish_time; // frequency of MQTT publish in seconds
- uint8_t led_gpio; // pin for LED
- uint8_t dallas_gpio; // pin for attaching external dallas temperature sensors
- bool dallas_parasite; // on/off is using parasite
- uint8_t tx_mode; // TX mode 1,2 or 3
+ bool shower_timer; // true if we want to report back on shower times
+ bool shower_alert; // true if we want the alert of cold water
+ bool led; // LED on/off
+ bool listen_mode; // stop automatic Tx on/off
+ uint16_t publish_time; // frequency of MQTT publish in seconds
+ uint8_t led_gpio; // pin for LED
+ uint8_t dallas_gpio; // pin for attaching external dallas temperature sensors
+ bool dallas_parasite; // on/off is using parasite
+ uint8_t tx_mode; // TX mode 1,2 or 3
+ uint8_t master_thermostat; // Product ID of master thermostat to use
} _EMSESP_Settings;
typedef struct {
@@ -99,6 +100,7 @@ static const command_t project_cmds[] PROGMEM = {
{true, "shower_alert ", "stop hot water to send 3 cold burst warnings after max shower time is exceeded"},
{true, "publish_time ", "set frequency for publishing data to MQTT (0=automatic)"},
{true, "tx_mode ", "changes Tx logic. 1=EMS generic, 2=EMS+, 3=HT3"},
+ {true, "master_thermostat [product id]", "product id to use as the master thermostat. Use no args for list."},
{false, "info", "show current values deciphered from the EMS messages"},
{false, "log "));
}
}
+
+ // master_thermostat
+ if (strcmp(setting, "master_thermostat") == 0) {
+ if (wc == 1) {
+ // show list
+ char device_string[100];
+ myDebug_P(PSTR("Available thermostat Product ids:"));
+ for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
+ if (it->device_type == EMS_DEVICE_TYPE_THERMOSTAT) {
+ strlcpy(device_string, (it)->device_desc_p, sizeof(device_string));
+ myDebug_P(PSTR(" %d = %s"), (it)->product_id, device_string);
+ }
+ }
+ myDebug_P(PSTR("Usage: set master_thermostat "));
+ } else if (wc == 2) {
+ uint8_t pid = atoi(value);
+ EMSESP_Settings.master_thermostat = pid;
+ ems_setMasterThermostat(pid);
+ ok = true;
+ }
+ }
}
if (action == MYESP_FSACTION_LIST) {
@@ -1087,11 +1113,18 @@ bool SetListCallback(MYESP_FSACTION_t action, uint8_t wc, const char * setting,
myDebug_P(PSTR(" listen_mode=%s"), EMSESP_Settings.listen_mode ? "on" : "off");
myDebug_P(PSTR(" shower_timer=%s"), EMSESP_Settings.shower_timer ? "on" : "off");
myDebug_P(PSTR(" shower_alert=%s"), EMSESP_Settings.shower_alert ? "on" : "off");
+
if (EMSESP_Settings.publish_time) {
myDebug_P(PSTR(" publish_time=%d"), EMSESP_Settings.publish_time);
} else {
myDebug_P(PSTR(" publish_time=0 (always publish on data received)"), EMSESP_Settings.publish_time);
}
+
+ if (EMSESP_Settings.master_thermostat) {
+ myDebug_P(PSTR(" master_thermostat=%d"), EMSESP_Settings.master_thermostat);
+ } else {
+ myDebug_P(PSTR(" master_thermostat=0 (use first one detected)"), EMSESP_Settings.master_thermostat);
+ }
}
return ok;
@@ -1360,7 +1393,7 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) {
// this is used for example for comfort, flowtemp
myESP.mqttSubscribe(TOPIC_BOILER_CMD);
- // these three need to be unqiue topics
+ // these three need to be unique topics
myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWACTIVATED);
myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWONETIME);
myESP.mqttSubscribe(TOPIC_BOILER_CMD_WWTEMP);
@@ -1396,6 +1429,8 @@ void MQTTCallback(unsigned int type, const char * topic, const char * message) {
const char * command = doc["cmd"];
// Check whatever the command is and act accordingly
+
+ // we only have one now, this is for the shower coldshot
if (strcmp(command, TOPIC_SHOWER_COLDSHOT) == 0) {
_showerColdShotStart();
return;
@@ -1708,7 +1743,7 @@ void WebCallback(JsonObject root) {
boiler["ok"] = false;
}
- // For SM10/SM100 Solar Module
+ // For SM10/SM100/SM200 Solar Module
JsonObject sm = root.createNestedObject("sm");
if (ems_getSolarModuleEnabled()) {
sm["ok"] = true;
@@ -1766,15 +1801,16 @@ void WebCallback(JsonObject root) {
// Most of these will be overwritten after the SPIFFS config file is loaded
void initEMSESP() {
// general settings
- EMSESP_Settings.shower_timer = false;
- EMSESP_Settings.shower_alert = false;
- EMSESP_Settings.led = true; // LED is on by default
- EMSESP_Settings.listen_mode = false;
- EMSESP_Settings.publish_time = DEFAULT_PUBLISHTIME;
- EMSESP_Settings.dallas_sensors = 0;
- EMSESP_Settings.led_gpio = EMSESP_LED_GPIO;
- EMSESP_Settings.dallas_gpio = EMSESP_DALLAS_GPIO;
- EMSESP_Settings.tx_mode = EMS_TXMODE_DEFAULT; // default tx mode
+ EMSESP_Settings.shower_timer = false;
+ EMSESP_Settings.shower_alert = false;
+ EMSESP_Settings.led = true; // LED is on by default
+ EMSESP_Settings.listen_mode = false;
+ EMSESP_Settings.publish_time = DEFAULT_PUBLISHTIME;
+ EMSESP_Settings.dallas_sensors = 0;
+ EMSESP_Settings.led_gpio = EMSESP_LED_GPIO;
+ EMSESP_Settings.dallas_gpio = EMSESP_DALLAS_GPIO;
+ EMSESP_Settings.tx_mode = EMS_TXMODE_DEFAULT; // default tx mode
+ EMSESP_Settings.master_thermostat = 0;
// shower settings
EMSESP_Shower.timerStart = 0;
diff --git a/src/ems.cpp b/src/ems.cpp
index 4801b2de2..6c709cf67 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -71,6 +71,11 @@ void ems_Device_remove_flags(unsigned int flags) {
EMS_Sys_Status.emsRefreshedFlags &= ~flags;
}
+// returns true if HT3, other Buderus protocol
+bool ems_isHT3() {
+ return (EMS_Sys_Status.emsIDMask == 0x80);
+}
+
// init stats and counters and buffers
void ems_init() {
ems_clearDeviceList(); // init the device map
@@ -171,9 +176,9 @@ void ems_init() {
EMS_Boiler.pump_mod_min = EMS_VALUE_INT_NOTSET; // Boiler circuit pump modulation min. power %
// Solar Module values
- EMS_SolarModule.collectorTemp = EMS_VALUE_SHORT_NOTSET; // collector temp from SM10/SM100
- EMS_SolarModule.bottomTemp = EMS_VALUE_SHORT_NOTSET; // bottom temp from SM10/SM100
- EMS_SolarModule.pumpModulation = EMS_VALUE_INT_NOTSET; // modulation solar pump SM10/SM100
+ EMS_SolarModule.collectorTemp = EMS_VALUE_SHORT_NOTSET; // collector temp from SM10/SM100/SM200
+ EMS_SolarModule.bottomTemp = EMS_VALUE_SHORT_NOTSET; // bottom temp from SM10/SM100/SM200
+ EMS_SolarModule.pumpModulation = EMS_VALUE_INT_NOTSET; // modulation solar pump SM10/SM100/SM200
EMS_SolarModule.pump = EMS_VALUE_BOOL_NOTSET; // pump active
EMS_SolarModule.EnergyLastHour = EMS_VALUE_USHORT_NOTSET;
EMS_SolarModule.EnergyToday = EMS_VALUE_USHORT_NOTSET;
@@ -410,6 +415,10 @@ void ems_setTxMode(uint8_t mode) {
EMS_Sys_Status.emsTxMode = mode;
}
+void ems_setMasterThermostat(uint8_t product_id) {
+ EMS_Sys_Status.emsMasterThermostat = product_id;
+}
+
/**
* debug print a telegram to telnet/serial including the CRC
*/
@@ -1241,7 +1250,7 @@ void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
// the whole telegram
// e.g. Thermostat -> all, telegram: 10 00 FF 00 01 A5 00 D7 21 00 00 00 00 30 01 84 01 01 03 01 84 01 F1 00 00 11 01 00 08 63 00
// 10 00 FF 00 01 A5 80 00 01 30 28 00 30 28 01 54 03 03 01 01 54 02 A8 00 00 11 01 03 FF FF 00
- // or prtial, e.g. for modes:
+ // or partial, e.g. for modes:
// manual : 10 00 FF 0A 01 A5 02
// auto : 10 00 FF 0A 01 A5 03
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_RCPLUSStatusMessage_curr); // value is * 10
@@ -1665,6 +1674,17 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
strlcat(version, ".", sizeof(version));
strlcat(version, _smallitoa(EMS_RxTelegram->data[offset + 2], buf), sizeof(version));
+ // some devices store the protocol type (HT3, Buderus) in tbe last byte
+ // we don't do anything with this yet.
+ if (EMS_RxTelegram->data_length >= 10) {
+ uint8_t protocol_type = EMS_RxTelegram->data[9];
+ if (protocol_type == 2) {
+ // it's a junkers
+ } else if (protocol_type >= 3) {
+ // it's buderus
+ }
+ }
+
// scan through known devices matching the productid
uint8_t product_id = EMS_RxTelegram->data[offset];
uint8_t i = 0;
@@ -1677,7 +1697,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
i++;
}
- // if not found, just add it
+ // if not found, just add it as an unknown device
if (!typeFound) {
(void)_addDevice(EMS_DEVICE_TYPE_UNKNOWN, product_id, device_id, nullptr, version);
return;
@@ -1701,13 +1721,17 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
strlcpy(EMS_Boiler.version, version, sizeof(EMS_Boiler.version));
ems_getBoilerValues(); // get Boiler values that we would usually have to wait for
} else if (type == EMS_DEVICE_TYPE_THERMOSTAT) {
- EMS_Thermostat.device_id = device_id;
- EMS_Thermostat.device_flags = (flags & 0x7F); // remove 7th bit
- EMS_Thermostat.write_supported = (flags & EMS_DEVICE_FLAG_NO_WRITE) == 0;
- EMS_Thermostat.product_id = product_id;
- EMS_Thermostat.device_desc_p = device_desc_p;
- strlcpy(EMS_Thermostat.version, version, sizeof(EMS_Thermostat.version));
- ems_getThermostatValues(); // get Thermostat values
+ // we can only support a single thermostat currently, so check which product_id we may have chosen
+ // to be the master - see https://github.com/proddy/EMS-ESP/issues/238
+ if ((EMS_Sys_Status.emsMasterThermostat == 0) || (EMS_Sys_Status.emsMasterThermostat == product_id)) {
+ EMS_Thermostat.device_id = device_id;
+ EMS_Thermostat.device_flags = (flags & 0x7F); // remove 7th bit
+ EMS_Thermostat.write_supported = (flags & EMS_DEVICE_FLAG_NO_WRITE) == 0;
+ EMS_Thermostat.product_id = product_id;
+ EMS_Thermostat.device_desc_p = device_desc_p;
+ strlcpy(EMS_Thermostat.version, version, sizeof(EMS_Thermostat.version));
+ ems_getThermostatValues(); // get Thermostat values
+ }
} else if (type == EMS_DEVICE_TYPE_SOLAR) {
EMS_SolarModule.device_id = device_id;
EMS_SolarModule.product_id = product_id;
@@ -2459,8 +2483,14 @@ void ems_setWarmWaterActivated(bool activated) {
EMS_TxTelegram.type = EMS_TYPE_UBAParameterWW;
EMS_TxTelegram.offset = EMS_OFFSET_UBAParameterWW_wwactivated;
EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH;
- EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate
- EMS_TxTelegram.dataValue = (activated ? 0xFF : 0x00); // 0xFF is on, 0x00 is off
+ EMS_TxTelegram.type_validate = EMS_ID_NONE; // don't validate
+
+ // https://github.com/proddy/EMS-ESP/issues/268
+ if (ems_isHT3()) {
+ EMS_TxTelegram.dataValue = (activated ? 0x08 : 0x00); // 0x08 is on, 0x00 is off
+ } else {
+ EMS_TxTelegram.dataValue = (activated ? 0xFF : 0x00); // 0xFF is on, 0x00 is off
+ }
EMS_TxQueue.push(EMS_TxTelegram);
}
diff --git a/src/ems.h b/src/ems.h
index ecb10e951..7afda360a 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -137,6 +137,7 @@ typedef struct {
uint8_t emsIDMask; // Buderus: 0x00, Junkers: 0x80
uint8_t emsPollAck[1]; // acknowledge buffer for Poll
uint8_t emsTxMode; // Tx mode 1, 2 or 3
+ uint8_t emsMasterThermostat; // product ID for the default thermostat to use
char emsDeviceMap[EMS_SYS_DEVICEMAP_LENGTH]; // contents of 0x07 telegram with bitmasks for all active EMS devices
} _EMS_Sys_Status;
@@ -336,7 +337,7 @@ typedef struct {
_EMS_Mixing_HC hc[EMS_THERMOSTAT_MAXHC]; // array for the 4 heating circuits
} _EMS_Mixing;
-// Solar Module - SM10/SM100/ISM1
+// Solar Module - SM10/SM100/SM200/ISM1
typedef struct {
uint8_t device_id; // the device ID of the Solar Module
uint8_t device_flags; // Solar Module flags
@@ -421,6 +422,7 @@ void ems_setWarmWaterModeComfort(uint8_t comfort);
void ems_setModels();
void ems_setTxDisabled(bool b);
void ems_setTxMode(uint8_t mode);
+void ems_setMasterThermostat(uint8_t product_id);
char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, bool name_only = false);
bool ems_getDeviceTypeDescription(uint8_t device_id, char * buffer);
void ems_getThermostatValues();
@@ -444,6 +446,7 @@ bool ems_getTxDisabled();
void ems_Device_add_flags(unsigned int flags);
bool ems_Device_has_flags(unsigned int flags);
void ems_Device_remove_flags(unsigned int flags);
+bool ems_isHT3();
// private functions
uint8_t _crcCalculator(uint8_t * data, uint8_t len);
From 7a1b1603cd51a02063e5d175d69c237acf630270 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 15:53:13 +0100
Subject: [PATCH 017/195] MM10 merge from MichaelDvP
---
CHANGELOG.md | 1 +
src/ems-esp.cpp | 7 +++----
src/ems.cpp | 12 ++++++------
src/ems.h | 8 ++++----
src/version.h | 2 +-
5 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5360bebfd..714ded96c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Solar Module SM200 support
- `set master_thermostat ` to choose with thermostat is master when there are multiple on the bus
+- MM10 Mixer support (thanks @MichaelDvP)
### Fixed
- set boiler warm water temp on Junkers/Bosch HT3
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index 4797234b3..728b45b33 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -478,12 +478,11 @@ void showInfo() {
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].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);
_renderIntValue(" Current pump modulation", "%", EMS_Mixing.hc[hc_num - 1].pumpMod);
- if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET)
+ if (EMS_Mixing.hc[hc_num - 1].valveStatus != EMS_VALUE_INT_NOTSET)
_renderIntValue(" Current valve status", "", EMS_Mixing.hc[hc_num - 1].valveStatus);
-
}
}
}
@@ -597,7 +596,7 @@ void publishEMSValues(bool force) {
rootBoiler["sysPress"] = (float)EMS_Boiler.sysPress / 10;
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);
diff --git a/src/ems.cpp b/src/ems.cpp
index c82e20d3e..b47b791f2 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -130,11 +130,11 @@ void ems_init() {
}
// UBAParameterWW
- EMS_Boiler.wWActivated = EMS_VALUE_BOOL_NOTSET; // Warm Water activated
- EMS_Boiler.wWSelTemp = EMS_VALUE_INT_NOTSET; // Warm Water selected temperature
- EMS_Boiler.wWCircPump = EMS_VALUE_BOOL_NOTSET; // Warm Water circulation pump available
+ EMS_Boiler.wWActivated = EMS_VALUE_BOOL_NOTSET; // Warm Water activated
+ EMS_Boiler.wWSelTemp = EMS_VALUE_INT_NOTSET; // Warm Water selected temperature
+ EMS_Boiler.wWCircPump = EMS_VALUE_BOOL_NOTSET; // Warm Water circulation pump available
EMS_Boiler.wWDesinfectTemp = EMS_VALUE_INT_NOTSET; // Warm Water desinfection temperature to prevent infection
- EMS_Boiler.wWComfort = EMS_VALUE_INT_NOTSET; // WW comfort mode
+ EMS_Boiler.wWComfort = EMS_VALUE_INT_NOTSET; // WW comfort mode
// UBAMonitorFast
EMS_Boiler.selFlowTemp = EMS_VALUE_INT_NOTSET; // Selected flow temperature
@@ -1239,8 +1239,8 @@ void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
}
void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage);
- if (hc!=0) {
+ uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage);
+ if (hc != 0) {
return; // invalid type
}
EMS_Mixing.hc[hc].active = true;
diff --git a/src/ems.h b/src/ems.h
index abf802e34..efc3a3f27 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -251,11 +251,11 @@ typedef struct {
char version[10];
// UBAParameterWW
- uint8_t wWActivated; // Warm Water activated
- uint8_t wWSelTemp; // Warm Water selected temperature
- uint8_t wWCircPump; // Warm Water circulation pump Available
+ uint8_t wWActivated; // Warm Water activated
+ uint8_t wWSelTemp; // Warm Water selected temperature
+ uint8_t wWCircPump; // Warm Water circulation pump Available
uint8_t wWDesinfectTemp; // Warm Water desinfection temperature
- uint8_t wWComfort; // Warm water comfort or ECO mode
+ uint8_t wWComfort; // Warm water comfort or ECO mode
// UBAMonitorFast
uint8_t selFlowTemp; // Selected flow temperature
diff --git a/src/version.h b/src/version.h
index 8575109af..1caa42c6a 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b6"
+#define APP_VERSION "1.9.5b7"
From 1e7a9483e22f5d14a39d3374383abb725c24d6af Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 20:45:09 +0100
Subject: [PATCH 018/195] added w-B ErP controller (#240)
---
src/ems_devices.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 620aebf5b..2ecdc8c20 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 0xAB // mixer status
+#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
@@ -264,6 +264,7 @@ static const _EMS_Device EMS_Devices[] = {
{169, EMS_DEVICE_TYPE_CONTROLLER, "BC40 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{152, EMS_DEVICE_TYPE_CONTROLLER, "Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{95, EMS_DEVICE_TYPE_CONTROLLER, "HT3 Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {209, EMS_DEVICE_TYPE_CONTROLLER, "W-B Greenstar Erp Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{230, EMS_DEVICE_TYPE_CONTROLLER, "BC Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{205, EMS_DEVICE_TYPE_CONNECT, "Nefit Moduline Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
{206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
From 75b47c1609efc5e39832f37c03cc455cbe5b3006 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 30 Dec 2019 20:48:03 +0100
Subject: [PATCH 019/195] force autodetect after changing thermostat - #238
---
src/ems-esp.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index 728b45b33..f146d7e5c 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -1106,6 +1106,9 @@ bool SetListCallback(MYESP_FSACTION_t action, uint8_t wc, const char * setting,
uint8_t pid = atoi(value);
EMSESP_Settings.master_thermostat = pid;
ems_setMasterThermostat(pid);
+ // force a scan
+ ems_clearDeviceList();
+ ems_doReadCommand(EMS_TYPE_UBADevices, EMS_Boiler.device_id);
ok = true;
}
}
From 6798b59246c1d19b29a3c17ca28af14788004fbb Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 31 Dec 2019 11:34:40 +0100
Subject: [PATCH 020/195] prevent controller and boiler competing for ubamaster
- #271
---
src/ems.cpp | 43 +++++++++++++++++++++++++------------------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index b47b791f2..1aa312bb2 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1729,7 +1729,8 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
uint8_t flags = EMS_Devices[i].flags; // its a new entry, set the specifics
- if (type == EMS_DEVICE_TYPE_BOILER) {
+ if ((type == EMS_DEVICE_TYPE_BOILER) && (device_id == EMS_ID_BOILER)) {
+ // with UBAMasters, there is only one device_id 0x08. To avoid https://github.com/proddy/EMS-ESP/issues/271
EMS_Boiler.device_id = device_id;
EMS_Boiler.product_id = product_id;
EMS_Boiler.device_flags = flags;
@@ -2018,17 +2019,19 @@ void ems_scanDevices() {
std::list Device_Ids; // create a new list
- Device_Ids.push_back(EMS_ID_BOILER); // UBAMaster/Boilers - 0x08
- Device_Ids.push_back(EMS_ID_HP); // HeatPump - 0x38
- Device_Ids.push_back(EMS_ID_SM); // Solar Module - 0x30
- Device_Ids.push_back(0x09); // Controllers - 0x09
- Device_Ids.push_back(0x02); // Connect - 0x02
- Device_Ids.push_back(0x48); // Gateway - 0x48
- Device_Ids.push_back(0x20); // Mixing Devices - 0x20, 0x21
- Device_Ids.push_back(0x21); // Mixing Devices - 0x20, 0x21
- Device_Ids.push_back(0x10); // Thermostats - 0x10, 0x17, 0x18
- Device_Ids.push_back(0x17); // Thermostats - 0x10, 0x17, 0x18
- Device_Ids.push_back(0x18); // Thermostats - 0x10, 0x17, 0x18
+ Device_Ids.push_back(EMS_ID_BOILER); // UBAMaster/Boilers - 0x08
+ Device_Ids.push_back(EMS_ID_HP); // HeatPump - 0x38
+ Device_Ids.push_back(EMS_ID_SM); // Solar Module - 0x30
+ Device_Ids.push_back(EMS_ID_CONTROLLER); // Controllers - 0x09
+ Device_Ids.push_back(EMS_ID_CONNECT1); // Connect - 0x02
+ Device_Ids.push_back(EMS_ID_CONNECT2); // Connect - 0x50
+ Device_Ids.push_back(EMS_ID_GATEWAY); // Gateway - 0x48
+ Device_Ids.push_back(EMS_ID_MIXING1); // Mixing Devices - 0x20, 0x21
+ Device_Ids.push_back(EMS_ID_MIXING2); // Mixing Devices - 0x20, 0x21
+ Device_Ids.push_back(EMS_ID_THERMOSTAT1); // Thermostats - 0x10, 0x17, 0x18
+ Device_Ids.push_back(EMS_ID_THERMOSTAT2); // Thermostats - 0x10, 0x17, 0x18
+ Device_Ids.push_back(EMS_ID_THERMOSTAT3); // Thermostats - 0x10, 0x17, 0x18
+ Device_Ids.push_back(EMS_ID_SWITCH); // Switch - 0x11
// remove duplicates and reserved IDs (like our own device)
Device_Ids.sort();
@@ -2075,22 +2078,26 @@ void ems_printDevices() {
if (!Devices.empty()) {
bool have_unknowns = false;
char device_string[100];
+ char device_type[30];
myDebug_P(PSTR("and %d were recognized by EMS-ESP as:"), Devices.size());
for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
- if ((it)->known) {
- strlcpy(device_string, (it)->device_desc_p, sizeof(device_string));
+ ems_getDeviceTypeDescription(it->device_id, device_type); // get type string, e.g. "Boiler"
+
+ if (it->known) {
+ strlcpy(device_string, it->device_desc_p, sizeof(device_string));
} else {
strlcpy(device_string, EMS_MODELTYPE_UNKNOWN_STRING, sizeof(device_string)); // Unknown
have_unknowns = true;
}
- myDebug_P(PSTR(" %s%s%s (DeviceID:0x%02X ProductID:%d Version:%s)"),
+ myDebug_P(PSTR(" %s: %s%s%s (DeviceID:0x%02X ProductID:%d Version:%s)"),
+ device_type,
COLOR_BOLD_ON,
device_string,
COLOR_BOLD_OFF,
- (it)->device_id,
- (it)->product_id,
- (it)->version);
+ it->device_id,
+ it->product_id,
+ it->version);
}
myDebug_P(PSTR("")); // newline
From a8d993188d048293aafc9c7f8229b99ab36ffb0e Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 31 Dec 2019 11:34:59 +0100
Subject: [PATCH 021/195] b8
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 1caa42c6a..72543df5c 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b7"
+#define APP_VERSION "1.9.5b8"
From d8bf33e4dbdbd274b8b27108bcdb8cb5da393a31 Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 31 Dec 2019 11:48:07 +0100
Subject: [PATCH 022/195] rename W-B ErP Boiler Control Panel
---
src/ems_devices.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 2ecdc8c20..5a52eb7ba 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -264,7 +264,7 @@ static const _EMS_Device EMS_Devices[] = {
{169, EMS_DEVICE_TYPE_CONTROLLER, "BC40 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{152, EMS_DEVICE_TYPE_CONTROLLER, "Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{95, EMS_DEVICE_TYPE_CONTROLLER, "HT3 Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {209, EMS_DEVICE_TYPE_CONTROLLER, "W-B Greenstar Erp Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {209, EMS_DEVICE_TYPE_CONTROLLER, "W-B ErP Boiler Control Panel", EMS_DEVICE_FLAG_NONE}, // 0x09
{230, EMS_DEVICE_TYPE_CONTROLLER, "BC Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
{205, EMS_DEVICE_TYPE_CONNECT, "Nefit Moduline Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
{206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
From ca5912ddbdbf9ce0184bcdafd653c52d695997c6 Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 31 Dec 2019 11:48:20 +0100
Subject: [PATCH 023/195] codacy/lint warnings
---
src/ems-esp.cpp | 3 +--
src/ems.cpp | 12 ++++++------
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index f146d7e5c..24310a706 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -551,8 +551,6 @@ void publishEMSValues(bool force) {
StaticJsonDocument doc;
char data[MQTT_MAX_PAYLOAD_SIZE] = {0};
- static uint8_t last_boilerActive = 0xFF; // for remembering last setting of the tap water or heating on/off
-
// do we have boiler changes?
if (ems_getBoilerEnabled() && (ems_Device_has_flags(EMS_DEVICE_UPDATE_FLAG_BOILER) || force)) {
JsonObject rootBoiler = doc.to();
@@ -657,6 +655,7 @@ void publishEMSValues(bool force) {
// see if the heating or hot tap water has changed, if so send
// last_boilerActive stores heating in bit 1 and tap water in bit 2
+ static uint8_t last_boilerActive = 0xFF; // for remembering last setting of the tap water or heating on/off
if ((last_boilerActive != ((EMS_Boiler.tapwaterActive << 1) + EMS_Boiler.heatingActive)) || force) {
myDebugLog("Publishing hot water and heating states via MQTT");
myESP.mqttPublish(TOPIC_BOILER_TAPWATER_ACTIVE, EMS_Boiler.tapwaterActive == 1 ? "1" : "0");
diff --git a/src/ems.cpp b/src/ems.cpp
index 1aa312bb2..d0de591d0 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -749,14 +749,14 @@ void ems_parseTelegram(uint8_t * telegram, uint8_t length) {
* or either a return code like 0x01 or 0x04 from the last Write command
*/
if (length == 1) {
- uint8_t value = telegram[0]; // 1st byte of data package
- static uint32_t _last_emsPollFrequency = 0;
+ uint8_t value = telegram[0]; // 1st byte of data package
// check first for a Poll for us
if ((value ^ 0x80 ^ EMS_Sys_Status.emsIDMask) == EMS_ID_ME) {
- uint32_t timenow_microsecs = micros();
- EMS_Sys_Status.emsPollFrequency = (timenow_microsecs - _last_emsPollFrequency);
- _last_emsPollFrequency = timenow_microsecs;
+ static uint32_t _last_emsPollFrequency = 0;
+ uint32_t timenow_microsecs = micros();
+ EMS_Sys_Status.emsPollFrequency = (timenow_microsecs - _last_emsPollFrequency);
+ _last_emsPollFrequency = timenow_microsecs;
// do we have something to send thats waiting in the Tx queue?
// if so send it if the Queue is not in a wait state
@@ -877,7 +877,6 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) {
uint8_t length = EMS_RxTelegram->data_length;
char output_str[200] = {0};
- char buffer[16] = {0};
char color_s[20] = {0};
char type_s[30];
@@ -899,6 +898,7 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) {
}
if (length) {
+ char buffer[16] = {0};
// type
strlcat(output_str, ", type 0x", sizeof(output_str));
From 9358544a7d6c64a215b6e2efa3d6c2155f272cb8 Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 31 Dec 2019 13:31:13 +0100
Subject: [PATCH 024/195] minor fix for rendering mixer flowtemp - #270
---
src/ems.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index d0de591d0..2b7dc589c 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;
From 3005e0553d74bd447c7708760018c6fd9fed25a4 Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Wed, 1 Jan 2020 13:23:57 +0100
Subject: [PATCH 025/195] 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 026/195] 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 d3427011fb6d7d8ae9cbc262147219aeb8c92752 Mon Sep 17 00:00:00 2001
From: Paul
Date: Wed, 1 Jan 2020 14:58:39 +0100
Subject: [PATCH 027/195] added 0xAC for HC2 on switch and mixers
---
src/ems_devices.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 5a52eb7ba..3dc105356 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -198,7 +198,8 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
#define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent
// MM10
-#define EMS_TYPE_MMStatusMessage 0xAB // mixer status
+#define EMS_TYPE_MMStatusMessage_HC1 0xAB // mixer status HC1
+#define EMS_TYPE_MMStatusMessage_HC2 0xAC // 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 2684ccc59401a1d19f5594a089abed2dc459db00 Mon Sep 17 00:00:00 2001
From: Paul
Date: Wed, 1 Jan 2020 14:59:11 +0100
Subject: [PATCH 028/195] any unsigned short >0x8000 is a non-value
---
src/ems.cpp | 16 ++++++++++------
src/ems_utils.cpp | 4 ++--
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 2b7dc589c..c6312a8b9 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -349,7 +349,7 @@ void _setValue(_EMS_RxTelegram * EMS_RxTelegram, uint16_t * param_op, uint8_t in
uint16_t value = (EMS_RxTelegram->data[pos] << 8) + EMS_RxTelegram->data[pos + 1];
// check for undefined/unset values, 0x8000
- if (value == EMS_VALUE_USHORT_NOTSET) {
+ if (value >= EMS_VALUE_USHORT_NOTSET) {
return;
}
@@ -1226,6 +1226,7 @@ void _process_EasyStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_EasyStatusMessage_setpoint); // is * 100
}
+// 0x01D7, 0x01D8
void _process_MMPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMPLUSStatusMessage_HC1); // 0 to 3
if (hc >= EMS_THERMOSTAT_MAXHC) {
@@ -1238,17 +1239,19 @@ 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
void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage);
- if (hc != 0) {
+ uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage_HC1); // 0 to 3
+ if (hc >= EMS_THERMOSTAT_MAXHC) {
return; // invalid type
}
EMS_Mixing.hc[hc].active = true;
_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowTemp, EMS_OFFSET_MMStatusMessage_flow_temp);
_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].pumpMod, EMS_OFFSET_MMStatusMessage_pump_mod);
- //_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMStatusMessage_valve_status);
_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].flowSetTemp, EMS_OFFSET_MMStatusMessage_flow_set);
+
+ //_setValue(EMS_RxTelegram, &EMS_Mixing.hc[hc].valveStatus, EMS_OFFSET_MMStatusMessage_valve_status);
}
/**
@@ -2718,10 +2721,11 @@ const _EMS_Type EMS_Types[] = {
// Junkers FR10
{EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage, "JunkersStatusMessage", _process_JunkersStatusMessage},
- // Mixing devices
+ // 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, "MMStatusMessage", _process_MMStatusMessage}
+ {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_utils.cpp b/src/ems_utils.cpp
index 4d61cdfef..46465fb86 100644
--- a/src/ems_utils.cpp
+++ b/src/ems_utils.cpp
@@ -76,11 +76,11 @@ char * _short_to_char(char * s, int16_t value, uint8_t decimals) {
return s;
}
-// convert short (two bytes) to text string and prints it
+// convert unsigned short (two bytes) to text string and prints it
// decimals: 0 = no division, 1=divide value by 10, 2=divide by 2, 10=divide value by 100
char * _ushort_to_char(char * s, uint16_t value, uint8_t decimals) {
// remove errors or invalid values
- if (value == EMS_VALUE_USHORT_NOTSET) {
+ if (value >= EMS_VALUE_USHORT_NOTSET) {
strlcpy(s, "?", 10);
return (s);
}
From dcbccc86044e207f7572757ef2de0551f0fd2579 Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Wed, 1 Jan 2020 18:35:54 +0100
Subject: [PATCH 029/195] 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 c8b4f57b32a93db1e99798fdf83567563aecf5e5 Mon Sep 17 00:00:00 2001
From: Paul
Date: Wed, 1 Jan 2020 21:59:21 +0100
Subject: [PATCH 030/195] rollback MM10 HC2 (which isn't)
---
src/ems.cpp | 10 +++-------
src/ems_devices.h | 3 +--
2 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index c6312a8b9..b13464664 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1239,12 +1239,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
void _process_MMStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- uint8_t hc = (EMS_RxTelegram->type - EMS_TYPE_MMStatusMessage_HC1); // 0 to 3
- if (hc >= EMS_THERMOSTAT_MAXHC) {
- return; // invalid type
- }
+ 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);
@@ -2724,8 +2721,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_HC1, "MMStatusMessage", _process_MMStatusMessage},
- {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_devices.h b/src/ems_devices.h
index 3dc105356..5a52eb7ba 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 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
From a8aa5e4f7f6223075d290a4cdae3a6ecb888c7fa Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Thu, 2 Jan 2020 09:43:26 +0100
Subject: [PATCH 031/195] 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 d2316518acb98e20be6ad122c21659187e2c615b Mon Sep 17 00:00:00 2001
From: Paul
Date: Thu, 2 Jan 2020 18:05:40 +0100
Subject: [PATCH 032/195] don't detect HCs if there not active - #238
---
scripts/main_script.py | 2 +-
src/ems.cpp | 48 ++++++++++++++++++++++--------------------
src/ems.h | 2 +-
src/version.h | 2 +-
4 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/scripts/main_script.py b/scripts/main_script.py
index 61b873da9..cc0c8b47d 100644
--- a/scripts/main_script.py
+++ b/scripts/main_script.py
@@ -25,7 +25,7 @@ def clr(color, text):
def remove_float_support():
flags = " ".join(env['LINKFLAGS'])
- print(clr(Color.BLUE, "** LINKFLAGS = %ss" % flags))
+ print(clr(Color.BLUE, "LINKFLAGS = %ss" % flags))
flags = flags.replace("-u _printf_float", "")
flags = flags.replace("-u _scanf_float", "")
newflags = flags.split()
diff --git a/src/ems.cpp b/src/ems.cpp
index b13464664..cb383837c 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1199,7 +1199,10 @@ void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
return;
}
- uint8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ int8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ if (hc_num == -1) {
+ return;
+ }
// ignore if the value is 0 (see https://github.com/proddy/EMS-ESP/commit/ccc30738c00f12ae6c89177113bd15af9826b836)
if (EMS_RxTelegram->data[EMS_OFFSET_RC35StatusMessage_setpoint] != 0x00) {
@@ -1357,29 +1360,25 @@ void _process_RC30Set(_EMS_RxTelegram * EMS_RxTelegram) {
// return which heating circuit it is, 0-3 for HC1 to HC4
// based on type 0x3E (HC1), 0x48 (HC2), 0x52 (HC3), 0x5C (HC4)
-uint8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram) {
- uint8_t hc_num;
- switch (EMS_RxTelegram->type) {
- case EMS_TYPE_RC35StatusMessage_HC1:
- case EMS_TYPE_RC35Set_HC1:
- default:
- hc_num = 1; // also default
- break;
- case EMS_TYPE_RC35StatusMessage_HC2:
- case EMS_TYPE_RC35Set_HC2:
- hc_num = 2;
- break;
- case EMS_TYPE_RC35StatusMessage_HC3:
- case EMS_TYPE_RC35Set_HC3:
- hc_num = 3;
- break;
- case EMS_TYPE_RC35StatusMessage_HC4:
- case EMS_TYPE_RC35Set_HC4:
- hc_num = 4;
- break;
+int8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram) {
+ // check to see we have an active HC. Assuming first byte must have some bit status set.
+ // see https://github.com/proddy/EMS-ESP/issues/238
+ if (EMS_RxTelegram->data[0] == 0x00) {
+ return -1;
+ }
+
+ int8_t hc_num = 0; // default is HC1
+
+ if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC2) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC2)) {
+ hc_num = 1;
+ } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC3) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC3)) {
+ hc_num = 2;
+ } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC4) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC4)) {
+ hc_num = 3;
+ } else {
+ return -1; // not a valid HC
}
- hc_num--;
EMS_Thermostat.hc[hc_num].active = true;
return (hc_num);
@@ -1400,7 +1399,10 @@ void _process_RC35Set(_EMS_RxTelegram * EMS_RxTelegram) {
return;
}
- uint8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it?
+ int8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ if (hc_num == -1) {
+ return;
+ }
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].mode, EMS_OFFSET_RC35Set_mode); // night, day, auto
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].daytemp, EMS_OFFSET_RC35Set_temp_day); // is * 2
diff --git a/src/ems.h b/src/ems.h
index efc3a3f27..4ffa61eb0 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -456,7 +456,7 @@ void _processType(_EMS_RxTelegram * EMS_RxTelegram);
void _debugPrintPackage(const char * prefix, _EMS_RxTelegram * EMS_RxTelegram, const char * color);
void _ems_clearTxData();
void _removeTxQueue();
-uint8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram);
+int8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram);
// global so can referenced in other classes
extern _EMS_Sys_Status EMS_Sys_Status;
diff --git a/src/version.h b/src/version.h
index 72543df5c..065e5b802 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b8"
+#define APP_VERSION "1.9.5b9"
From 18c6f7a7b72d51faee69157b39384e68c4dadb6a Mon Sep 17 00:00:00 2001
From: Paul
Date: Thu, 2 Jan 2020 22:45:13 +0100
Subject: [PATCH 033/195] clean up HCs - #238
---
src/ems.cpp | 46 ++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index cb383837c..3f6d2482c 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1199,22 +1199,22 @@ void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
return;
}
- int8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
- if (hc_num == -1) {
+ int8_t hc = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ if (hc == -1) {
return;
}
// ignore if the value is 0 (see https://github.com/proddy/EMS-ESP/commit/ccc30738c00f12ae6c89177113bd15af9826b836)
if (EMS_RxTelegram->data[EMS_OFFSET_RC35StatusMessage_setpoint] != 0x00) {
- _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].setpoint_roomTemp, EMS_OFFSET_RC35StatusMessage_setpoint); // is * 2, force to single byte
+ _setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RC35StatusMessage_setpoint); // is * 2, force to single byte
}
// ignore if the value is unset. Hopefully it will be picked up via a later message
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].curr_roomTemp, EMS_OFFSET_RC35StatusMessage_curr); // is * 10
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].day_mode, EMS_OFFSET_RC35StatusMessage_mode, 1);
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].summer_mode, EMS_OFFSET_RC35StatusMessage_mode, 0);
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].holiday_mode, EMS_OFFSET_RC35StatusMessage_mode1, 5);
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].circuitcalctemp, EMS_OFFSET_RC35Set_circuitcalctemp);
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_RC35StatusMessage_curr); // is * 10
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_RC35StatusMessage_mode, 1);
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].summer_mode, EMS_OFFSET_RC35StatusMessage_mode, 0);
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].holiday_mode, EMS_OFFSET_RC35StatusMessage_mode1, 5);
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].circuitcalctemp, EMS_OFFSET_RC35Set_circuitcalctemp);
}
/**
@@ -1367,21 +1367,23 @@ int8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram) {
return -1;
}
- int8_t hc_num = 0; // default is HC1
+ int8_t hc;
- if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC2) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC2)) {
- hc_num = 1;
+ 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)) {
+ hc = 1;
} else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC3) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC3)) {
- hc_num = 2;
+ hc = 2;
} else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC4) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC4)) {
- hc_num = 3;
+ hc = 3;
} else {
return -1; // not a valid HC
}
- EMS_Thermostat.hc[hc_num].active = true;
+ EMS_Thermostat.hc[hc].active = true;
- return (hc_num);
+ return (hc);
}
/**
@@ -1399,16 +1401,16 @@ void _process_RC35Set(_EMS_RxTelegram * EMS_RxTelegram) {
return;
}
- int8_t hc_num = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
- if (hc_num == -1) {
+ int8_t hc = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ if (hc == -1) {
return;
}
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].mode, EMS_OFFSET_RC35Set_mode); // night, day, auto
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].daytemp, EMS_OFFSET_RC35Set_temp_day); // is * 2
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].nighttemp, EMS_OFFSET_RC35Set_temp_night); // is * 2
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].holidaytemp, EMS_OFFSET_RC35Set_temp_holiday); // is * 2
- _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc_num].heatingtype, EMS_OFFSET_RC35Set_heatingtype); // byte 0 bit floor heating = 3
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].mode, EMS_OFFSET_RC35Set_mode); // night, day, auto
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].daytemp, EMS_OFFSET_RC35Set_temp_day); // is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].nighttemp, EMS_OFFSET_RC35Set_temp_night); // is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].holidaytemp, EMS_OFFSET_RC35Set_temp_holiday); // is * 2
+ _setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].heatingtype, EMS_OFFSET_RC35Set_heatingtype); // byte 0 bit floor heating = 3
}
/**
From 0af60a320d5b2c7f9b84924529fed7e5ff57611a Mon Sep 17 00:00:00 2001
From: Paul
Date: Fri, 3 Jan 2020 11:24:12 +0100
Subject: [PATCH 034/195] writing to Junkers thermostats - #138
---
CHANGELOG.md | 1 +
src/ems.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++----
src/ems_devices.h | 25 +++++++++++++----
src/version.h | 2 +-
4 files changed, 86 insertions(+), 13 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 714ded96c..9ec62a5f5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Solar Module SM200 support
- `set master_thermostat ` to choose with thermostat is master when there are multiple on the bus
- MM10 Mixer support (thanks @MichaelDvP)
+- First implementation of writing to Junker Thermostats (thanks @Neonox31)
### Fixed
- set boiler warm water temp on Junkers/Bosch HT3
diff --git a/src/ems.cpp b/src/ems.cpp
index 3f6d2482c..8a0b16cc0 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -534,7 +534,7 @@ void _ems_sendTelegram() {
_EMS_RxTelegram EMS_RxTelegram; // create new Rx object
EMS_RxTelegram.length = EMS_TxTelegram.length; // full length of telegram
EMS_RxTelegram.telegram = EMS_TxTelegram.data;
- EMS_RxTelegram.data_length = 0; // ignore #data=
+ EMS_RxTelegram.data_length = 0; // surpress #data=
EMS_RxTelegram.timestamp = myESP.getSystemTime(); // now
_debugPrintTelegram("Sending raw: ", &EMS_RxTelegram, COLOR_CYAN, true);
}
@@ -1209,7 +1209,6 @@ void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
_setValue8(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_RC35StatusMessage_setpoint); // is * 2, force to single byte
}
- // ignore if the value is unset. Hopefully it will be picked up via a later message
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_RC35StatusMessage_curr); // is * 10
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].day_mode, EMS_OFFSET_RC35StatusMessage_mode, 1);
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].summer_mode, EMS_OFFSET_RC35StatusMessage_mode, 0);
@@ -1290,13 +1289,15 @@ void _process_RCPLUSStatusMode(_EMS_RxTelegram * EMS_RxTelegram) {
}
/**
- * FR10/FR50/FR100 Junkers - type x006F
+ * FR10/FR50/FR100 Junkers - type x6F
* e.g. for FR10: 90 00 FF 00 00 6F 03 01 00 BE 00 BF
* for FW100: 90 00 FF 00 00 6F 03 02 00 D7 00 DA F3 34 00 C4
*/
void _process_JunkersStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
- uint8_t hc = EMS_THERMOSTAT_DEFAULTHC - 1; // use HC1
- EMS_Thermostat.hc[hc].active = true;
+ int8_t hc = _getHeatingCircuit(EMS_RxTelegram); // which HC is it, 0-3
+ if (hc == -1) {
+ return;
+ }
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].curr_roomTemp, EMS_OFFSET_JunkersStatusMessage_curr); // value is * 10
_setValue(EMS_RxTelegram, &EMS_Thermostat.hc[hc].setpoint_roomTemp, EMS_OFFSET_JunkersStatusMessage_setpoint); // value is * 10
@@ -2286,6 +2287,44 @@ void ems_setThermostatTemp(float temperature, uint8_t hc_num, uint8_t temptype)
EMS_TxTelegram.type_validate = EMS_TxTelegram.type;
}
+ else if (model == EMS_DEVICE_FLAG_JUNKERS) {
+ switch (temptype) {
+ case 1: // change the no frost temp
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_no_frost_temp;
+ break;
+ case 2: // change the night temp
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_night_temp;
+ break;
+ case 3: // change the day temp
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_day_temp;
+ break;
+ default:
+ case 0: // automatic selection, if no type is defined, we use the standard code
+ // not sure if this is correct for Junkers
+ if (EMS_Thermostat.hc[hc_num - 1].day_mode == 0) {
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_night_temp;
+ } else if (EMS_Thermostat.hc[hc_num - 1].day_mode == 1) {
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_day_temp;
+ }
+ break;
+ }
+
+ if (hc_num == 1) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC1;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC1;
+ } else if (hc_num == 2) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC1;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC1;
+ } else if (hc_num == 3) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC1;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC1;
+ } else if (hc_num == 4) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC1;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC1;
+ }
+ EMS_TxTelegram.type_validate = EMS_TxTelegram.type;
+ }
+
EMS_TxTelegram.length = EMS_MIN_TELEGRAM_LENGTH;
EMS_TxTelegram.dataValue = (uint8_t)((float)temperature * (float)2); // value * 2
EMS_TxTelegram.comparisonOffset = EMS_TxTelegram.offset;
@@ -2379,6 +2418,23 @@ void ems_setThermostatMode(uint8_t mode, uint8_t hc_num) {
EMS_TxTelegram.offset = EMS_OFFSET_RC35Set_mode;
EMS_TxTelegram.type_validate = EMS_TxTelegram.type;
+ } else if (model == EMS_DEVICE_FLAG_JUNKERS) {
+ if (hc_num == 1) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC1;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC1;
+ } else if (hc_num == 2) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC2;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC2;
+ } else if (hc_num == 3) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC3;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC3;
+ } else if (hc_num == 4) {
+ EMS_TxTelegram.type = EMS_TYPE_JunkersSetMessage_HC4;
+ EMS_TxTelegram.comparisonPostRead = EMS_TYPE_JunkersStatusMessage_HC4;
+ }
+ EMS_TxTelegram.offset = EMS_OFFSET_JunkersSetMessage_set_mode;
+ EMS_TxTelegram.type_validate = EMS_TxTelegram.type;
+
} else if (model == EMS_DEVICE_FLAG_RC300) {
EMS_TxTelegram.offset = EMS_OFFSET_RCPLUSSet_mode;
@@ -2720,7 +2776,10 @@ const _EMS_Type EMS_Types[] = {
{EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_RCPLUSStatusMode, "RCPLUSStatusMode", _process_RCPLUSStatusMode},
// Junkers FR10
- {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage, "JunkersStatusMessage", _process_JunkersStatusMessage},
+ {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage_HC1, "JunkersStatusMessage_HC1", _process_JunkersStatusMessage},
+ {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage_HC2, "JunkersStatusMessage_HC2", _process_JunkersStatusMessage},
+ {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage_HC3, "JunkersStatusMessage_HC3", _process_JunkersStatusMessage},
+ {EMS_DEVICE_UPDATE_FLAG_THERMOSTAT, EMS_TYPE_JunkersStatusMessage_HC4, "JunkersStatusMessage_HC4", _process_JunkersStatusMessage},
// Mixing devices MM10 - MM400
{EMS_DEVICE_UPDATE_FLAG_MIXING, EMS_TYPE_MMPLUSStatusMessage_HC1, "MMPLUSStatusMessage_HC1", _process_MMPLUSStatusMessage},
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 5a52eb7ba..2bdeeff68 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -181,13 +181,26 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
#define EMS_OFFSET_RCPLUSSet_temp_setpoint 8 // temp setpoint, when changing of templevel (in auto) value is reset and set to FF
#define EMS_OFFSET_RCPLUSSet_manual_setpoint 10 // manual setpoint
-// Junkers FR10, FR50, FW100 (EMS Plus)
-#define EMS_TYPE_JunkersStatusMessage 0x6F // is an automatic thermostat broadcast giving us temps
+// Junkers FR10, FR50, FW100, FW120 (EMS Plus)
+#define EMS_TYPE_JunkersStatusMessage_HC1 0x6F // is an automatic thermostat broadcast giving us temps
+#define EMS_TYPE_JunkersStatusMessage_HC2 0x70 // is an automatic thermostat broadcast giving us temps
+#define EMS_TYPE_JunkersStatusMessage_HC3 0x71 // is an automatic thermostat broadcast giving us temps
+#define EMS_TYPE_JunkersStatusMessage_HC4 0x72 // is an automatic thermostat broadcast giving us temps
+
#define EMS_OFFSET_JunkersStatusMessage_daymode 0 // 3 = day, 2 = night
#define EMS_OFFSET_JunkersStatusMessage_mode 1 // current mode, 1 = manual, 2 = auto
#define EMS_OFFSET_JunkersStatusMessage_setpoint 2 // setpoint temp
#define EMS_OFFSET_JunkersStatusMessage_curr 4 // current temp
+#define EMS_TYPE_JunkersSetMessage_HC1 0x65 // EMS type to set temperature on thermostat for heating circuit 1
+#define EMS_TYPE_JunkersSetMessage_HC2 0x66 // EMS type to set temperature on thermostat for heating circuit 2
+#define EMS_TYPE_JunkersSetMessage_HC3 0x67 // EMS type to set temperature on thermostat for heating circuit 3
+#define EMS_TYPE_JunkersSetMessage_HC4 0x68 // EMS type to set temperature on thermostat for heating circuit 4
+#define EMS_OFFSET_JunkersSetMessage_day_temp 0x11 // EMS offset to set temperature on thermostat for day mode
+#define EMS_OFFSET_JunkersSetMessage_night_temp 0x10 // EMS offset to set temperature on thermostat for night mode
+#define EMS_OFFSET_JunkersSetMessage_no_frost_temp 0x0F // EMS offset to set temperature on thermostat for no frost mode
+#define EMS_OFFSET_JunkersSetMessage_set_mode 0x0E // EMS offset to set mode on thermostat
+
// MM100 (EMS Plus)
#define EMS_TYPE_MMPLUSStatusMessage_HC1 0x01D7 // mixer status HC1
#define EMS_TYPE_MMPLUSStatusMessage_HC2 0x01D8 // mixer status HC2
@@ -294,14 +307,14 @@ static const _EMS_Device EMS_Devices[] = {
{76, EMS_DEVICE_TYPE_THERMOSTAT, "Sieger ES73", EMS_DEVICE_FLAG_RC35}, // 0x10
// Junkers
- {105, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW100", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
+ {105, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW100", EMS_DEVICE_FLAG_JUNKERS}, // 0x10
{106, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW200", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
{107, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR100", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
{108, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR110", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
- {111, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR10", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
+ {111, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR10", EMS_DEVICE_FLAG_JUNKERS}, // 0x10
+ {147, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR50", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
{191, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR120", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
- {192, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW120", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
- {147, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR50", EMS_DEVICE_FLAG_JUNKERS | EMS_DEVICE_FLAG_NO_WRITE} // 0x10, cannot write
+ {192, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW120", EMS_DEVICE_FLAG_JUNKERS} // 0x10
};
diff --git a/src/version.h b/src/version.h
index 065e5b802..955986cb8 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b9"
+#define APP_VERSION "1.9.5b10"
From 5ce0b64bb46274a45ad08da7ffc4633054025dad Mon Sep 17 00:00:00 2001
From: Paul
Date: Fri, 3 Jan 2020 13:10:26 +0100
Subject: [PATCH 035/195] support for multiple productids - #278
---
src/ems.cpp | 30 +++++++++++++++++++-----------
src/ems.h | 1 +
src/ems_devices.h | 12 ++++++++----
src/version.h | 2 +-
4 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 8a0b16cc0..17de38bfc 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1707,13 +1707,22 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
}
// scan through known devices matching the productid
- uint8_t product_id = EMS_RxTelegram->data[offset];
- uint8_t i = 0;
- bool typeFound = false;
- while (i < _EMS_Devices_max) {
+ uint8_t product_id = EMS_RxTelegram->data[offset];
+ uint8_t i = 0;
+ uint8_t found_index = 0;
+ bool typeFound = false;
+ while ((i < _EMS_Devices_max) || (!typeFound)) {
if (EMS_Devices[i].product_id == product_id) {
- typeFound = true; // we have a matching product id. i is the index.
- break;
+ // we have a matching product id
+ // now lets see if there is a matching device_id since product_id can be on multiple devices
+ // e.g. with UBAMasters, there is only one device_id 0x08. To avoid https://github.com/proddy/EMS-ESP/issues/271
+ _EMS_DEVICE_TYPE device_type = EMS_Devices[i].type;
+ for (uint8_t j = 0; j < _EMS_Devices_Types_max; j++) {
+ if ((EMS_Devices_Types[j].device_type == device_type) && (EMS_Devices_Types[j].device_id == device_id)) {
+ typeFound = true;
+ found_index = i;
+ }
+ }
}
i++;
}
@@ -1724,18 +1733,17 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
return;
}
- const char * device_desc_p = (EMS_Devices[i].device_desc); // pointer to the full description of the device
- _EMS_DEVICE_TYPE type = EMS_Devices[i].type; // type
+ const char * device_desc_p = (EMS_Devices[found_index].device_desc); // pointer to the full description of the device
+ _EMS_DEVICE_TYPE type = EMS_Devices[found_index].type; // type
// we recognized it, see if we already have it in our recognized list
if (_addDevice(type, product_id, device_id, device_desc_p, version)) {
return; // already in list
}
- uint8_t flags = EMS_Devices[i].flags; // its a new entry, set the specifics
+ uint8_t flags = EMS_Devices[found_index].flags; // it's a new entry, set the specifics
- if ((type == EMS_DEVICE_TYPE_BOILER) && (device_id == EMS_ID_BOILER)) {
- // with UBAMasters, there is only one device_id 0x08. To avoid https://github.com/proddy/EMS-ESP/issues/271
+ if (type == EMS_DEVICE_TYPE_BOILER) {
EMS_Boiler.device_id = device_id;
EMS_Boiler.product_id = product_id;
EMS_Boiler.device_flags = flags;
diff --git a/src/ems.h b/src/ems.h
index 4ffa61eb0..8c0b05fe7 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -211,6 +211,7 @@ typedef enum : uint8_t {
EMS_DEVICE_TYPE_SWITCH,
EMS_DEVICE_TYPE_CONTROLLER,
EMS_DEVICE_TYPE_CONNECT,
+ EMS_DEVICE_TYPE_MODEM,
EMS_DEVICE_TYPE_UNKNOWN
} _EMS_DEVICE_TYPE;
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 2bdeeff68..1fdac9178 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -26,6 +26,7 @@
#define EMS_ID_THERMOSTAT1 0x10 // Thermostat
#define EMS_ID_THERMOSTAT2 0x17 // Thermostat
#define EMS_ID_THERMOSTAT3 0x18 // Thermostat
+#define EMS_ID_MODEM 0x19 // Modem
// mapping for EMS_Devices_Type
const _EMS_Device_Types EMS_Devices_Types[] = {
@@ -44,7 +45,8 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
{EMS_ID_SWITCH, EMS_DEVICE_TYPE_SWITCH, "Switching Module"},
{EMS_ID_CONTROLLER, EMS_DEVICE_TYPE_CONTROLLER, "Controller"},
{EMS_ID_CONNECT1, EMS_DEVICE_TYPE_CONNECT, "Connect"},
- {EMS_ID_CONNECT2, EMS_DEVICE_TYPE_CONNECT, "Connect"}
+ {EMS_ID_CONNECT2, EMS_DEVICE_TYPE_CONNECT, "Connect"},
+ {EMS_ID_MODEM, EMS_DEVICE_TYPE_MODEM, "Modem"}
};
@@ -257,7 +259,7 @@ static const _EMS_Device EMS_Devices[] = {
{159, EMS_DEVICE_TYPE_MIXING, "MM50 Mixing Module", EMS_DEVICE_FLAG_NONE},
{79, EMS_DEVICE_TYPE_MIXING, "MM100 Mixer Module", EMS_DEVICE_FLAG_NONE},
{80, EMS_DEVICE_TYPE_MIXING, "MM200 Mixer Module", EMS_DEVICE_FLAG_NONE},
- //{78, EMS_DEVICE_TYPE_MIXING, "MM400 Mixer Module", EMS_DEVICE_FLAG_NONE},
+ {78, EMS_DEVICE_TYPE_MIXING, "MM400 Mixer Module", EMS_DEVICE_FLAG_NONE},
//
// HeatPump - type 0x38
@@ -266,7 +268,8 @@ static const _EMS_Device EMS_Devices[] = {
{200, EMS_DEVICE_TYPE_HEATPUMP, "HeatPump Module", EMS_DEVICE_FLAG_NONE},
//
- // Other devices, like 0x11 for Switching, 0x09 for controllers, 0x02 for Connect, 0x48 for Gateway
+ // Other devices like controllers and modems
+ // such as 0x11 for Switching, 0x09 for controllers, 0x02 for Connect, 0x48 for Gateway
//
{71, EMS_DEVICE_TYPE_SWITCH, "WM10 Switch Module", EMS_DEVICE_FLAG_NONE}, // 0x11
{68, EMS_DEVICE_TYPE_CONTROLLER, "BC10/RFM20 Receiver", EMS_DEVICE_FLAG_NONE}, // 0x09
@@ -283,6 +286,7 @@ static const _EMS_Device EMS_Devices[] = {
{206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
{171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
{189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
+ {94, EMS_DEVICE_TYPE_MODEM, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x19
//
// Thermostats, typically device id of 0x10, 0x17, 0x18 and 0x39 (easy)
@@ -296,10 +300,10 @@ static const _EMS_Device EMS_Devices[] = {
// Buderus/Nefit
{79, EMS_DEVICE_TYPE_THERMOSTAT, "RC10/Moduline 100", EMS_DEVICE_FLAG_RC10}, // 0x17
{77, EMS_DEVICE_TYPE_THERMOSTAT, "RC20/Moduline 300", EMS_DEVICE_FLAG_RC20}, // 0x17
- {93, EMS_DEVICE_TYPE_THERMOSTAT, "RC20RF", EMS_DEVICE_FLAG_RC20}, // 0x18
{67, EMS_DEVICE_TYPE_THERMOSTAT, "RC30", EMS_DEVICE_FLAG_RC30}, // 0x10
{78, EMS_DEVICE_TYPE_THERMOSTAT, "RC30/Moduline 400", EMS_DEVICE_FLAG_RC30}, // 0x10
{86, EMS_DEVICE_TYPE_THERMOSTAT, "RC35", EMS_DEVICE_FLAG_RC35}, // 0x10
+ {93, EMS_DEVICE_TYPE_THERMOSTAT, "RC20RF", EMS_DEVICE_FLAG_RC20}, // 0x18
{158, EMS_DEVICE_TYPE_THERMOSTAT, "RC300/RC310/Moduline 3000/Bosch CW400/W-B Sense II", EMS_DEVICE_FLAG_RC300}, // 0x10
{165, EMS_DEVICE_TYPE_THERMOSTAT, "RC100/Moduline 1010", EMS_DEVICE_FLAG_RC300 | EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
diff --git a/src/version.h b/src/version.h
index 955986cb8..bea92a4f9 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b10"
+#define APP_VERSION "1.9.5b11"
From 5577685d85e6b6170041432f09475e685bdd2904 Mon Sep 17 00:00:00 2001
From: Paul
Date: Fri, 3 Jan 2020 21:19:22 +0100
Subject: [PATCH 036/195] bug fix for processing version when no match found
---
src/ems.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 17de38bfc..837e6c8c9 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1711,7 +1711,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) || (!typeFound)) {
+ while ((i < _EMS_Devices_max) && (!typeFound)) {
if (EMS_Devices[i].product_id == product_id) {
// we have a matching product id
// now lets see if there is a matching device_id since product_id can be on multiple devices
@@ -1721,6 +1721,7 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
if ((EMS_Devices_Types[j].device_type == device_type) && (EMS_Devices_Types[j].device_id == device_id)) {
typeFound = true;
found_index = i;
+ break;
}
}
}
From 5c6f931d5a3de1654a416fe1ebbd1775d2867bff Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Sat, 4 Jan 2020 09:55:22 +0100
Subject: [PATCH 037/195] 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 038/195] 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 039/195] 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 1ec05d7eb1daf248897fb851c2921e2bebe395db Mon Sep 17 00:00:00 2001
From: Paul
Date: Sat, 4 Jan 2020 13:47:26 +0100
Subject: [PATCH 040/195] 1.9.5b12
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index bea92a4f9..4d590e577 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b11"
+#define APP_VERSION "1.9.5b12"
From f31b2f3a6d9dc51d9ef21f2eb627797039512d0c Mon Sep 17 00:00:00 2001
From: Paul
Date: Sat, 4 Jan 2020 13:48:02 +0100
Subject: [PATCH 041/195] tidy up
---
src/ems_devices.h | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 1fdac9178..a8d3d5046 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -16,7 +16,7 @@
#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
#define EMS_ID_SM 0x30 // Solar Module SM10, SM100, SM200 and ISM1
#define EMS_ID_HP 0x38 // HeatPump
-#define EMS_ID_GATEWAY 0x48 // Gateway e.g. KM200 Web Gateway
+#define EMS_ID_GATEWAY 0x48 // Gateway Modem e.g. KM200 Web Gateway. Also on 0x0A->0x0D
#define EMS_ID_MIXING1 0x20 // Mixing
#define EMS_ID_MIXING2 0x21 // Mixing
#define EMS_ID_SWITCH 0x11 // Switch
@@ -26,7 +26,6 @@
#define EMS_ID_THERMOSTAT1 0x10 // Thermostat
#define EMS_ID_THERMOSTAT2 0x17 // Thermostat
#define EMS_ID_THERMOSTAT3 0x18 // Thermostat
-#define EMS_ID_MODEM 0x19 // Modem
// mapping for EMS_Devices_Type
const _EMS_Device_Types EMS_Devices_Types[] = {
@@ -45,8 +44,7 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
{EMS_ID_SWITCH, EMS_DEVICE_TYPE_SWITCH, "Switching Module"},
{EMS_ID_CONTROLLER, EMS_DEVICE_TYPE_CONTROLLER, "Controller"},
{EMS_ID_CONNECT1, EMS_DEVICE_TYPE_CONNECT, "Connect"},
- {EMS_ID_CONNECT2, EMS_DEVICE_TYPE_CONNECT, "Connect"},
- {EMS_ID_MODEM, EMS_DEVICE_TYPE_MODEM, "Modem"}
+ {EMS_ID_CONNECT2, EMS_DEVICE_TYPE_CONNECT, "Connect"}
};
@@ -226,7 +224,7 @@ const _EMS_Device_Types EMS_Devices_Types[] = {
static const _EMS_Device EMS_Devices[] = {
//
- // UBA Masters - typically with device_id of 0x08
+ // UBA Masters - must have device_id of 0x08
//
{72, EMS_DEVICE_TYPE_BOILER, "MC10 Module", EMS_DEVICE_FLAG_NONE},
{123, EMS_DEVICE_TYPE_BOILER, "Buderus GBx72/Nefit Trendline/Junkers Cerapur/Worcester Greenstar Si/27i", EMS_DEVICE_FLAG_NONE},
@@ -257,9 +255,8 @@ static const _EMS_Device EMS_Devices[] = {
{161, EMS_DEVICE_TYPE_MIXING, "MM200 Mixing Module", EMS_DEVICE_FLAG_NONE},
{69, EMS_DEVICE_TYPE_MIXING, "MM10 Mixer Module", EMS_DEVICE_FLAG_NONE},
{159, EMS_DEVICE_TYPE_MIXING, "MM50 Mixing Module", EMS_DEVICE_FLAG_NONE},
- {79, EMS_DEVICE_TYPE_MIXING, "MM100 Mixer Module", EMS_DEVICE_FLAG_NONE},
- {80, EMS_DEVICE_TYPE_MIXING, "MM200 Mixer Module", EMS_DEVICE_FLAG_NONE},
- {78, EMS_DEVICE_TYPE_MIXING, "MM400 Mixer Module", EMS_DEVICE_FLAG_NONE},
+ {79, EMS_DEVICE_TYPE_MIXING, "Junkers M100", EMS_DEVICE_FLAG_NONE},
+ {80, EMS_DEVICE_TYPE_MIXING, "Junkers M200", EMS_DEVICE_FLAG_NONE},
//
// HeatPump - type 0x38
@@ -286,10 +283,10 @@ static const _EMS_Device EMS_Devices[] = {
{206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
{171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
{189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
- {94, EMS_DEVICE_TYPE_MODEM, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x19
+ {94, EMS_DEVICE_TYPE_MODEM, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
//
- // Thermostats, typically device id of 0x10, 0x17, 0x18 and 0x39 (easy)
+ // Thermostats, typically device id of 0x10, 0x17, 0x18, 0x38 (RC100), 0x39 (Easy)
//
// Easy devices - not currently supporting write operations
@@ -303,9 +300,9 @@ static const _EMS_Device EMS_Devices[] = {
{67, EMS_DEVICE_TYPE_THERMOSTAT, "RC30", EMS_DEVICE_FLAG_RC30}, // 0x10
{78, EMS_DEVICE_TYPE_THERMOSTAT, "RC30/Moduline 400", EMS_DEVICE_FLAG_RC30}, // 0x10
{86, EMS_DEVICE_TYPE_THERMOSTAT, "RC35", EMS_DEVICE_FLAG_RC35}, // 0x10
- {93, EMS_DEVICE_TYPE_THERMOSTAT, "RC20RF", EMS_DEVICE_FLAG_RC20}, // 0x18
+ {93, EMS_DEVICE_TYPE_THERMOSTAT, "RC20RF", EMS_DEVICE_FLAG_RC20}, // 0x19
{158, EMS_DEVICE_TYPE_THERMOSTAT, "RC300/RC310/Moduline 3000/Bosch CW400/W-B Sense II", EMS_DEVICE_FLAG_RC300}, // 0x10
- {165, EMS_DEVICE_TYPE_THERMOSTAT, "RC100/Moduline 1010", EMS_DEVICE_FLAG_RC300 | EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
+ {165, EMS_DEVICE_TYPE_THERMOSTAT, "RC100/Moduline 1010", EMS_DEVICE_FLAG_RC300 | EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, 0x38 - cannot write
// Sieger
{76, EMS_DEVICE_TYPE_THERMOSTAT, "Sieger ES73", EMS_DEVICE_FLAG_RC35}, // 0x10
From 4484c6db60cc5b727baeb29c47d3792f25404a31 Mon Sep 17 00:00:00 2001
From: Paul
Date: Sat, 4 Jan 2020 13:49:11 +0100
Subject: [PATCH 042/195] #284 #283
---
src/ems.cpp | 58 ++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 14 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 837e6c8c9..5375cac26 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1370,19 +1370,43 @@ 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)) {
+ switch (EMS_RxTelegram->type) {
+ case EMS_TYPE_RC35StatusMessage_HC1:
+ case EMS_TYPE_RC35Set_HC1:
+ case EMS_TYPE_JunkersStatusMessage_HC1:
+ case EMS_TYPE_JunkersSetMessage_HC1:
hc = 0;
- } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC2) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC2)) {
+ break;
+
+ case EMS_TYPE_RC35StatusMessage_HC2:
+ case EMS_TYPE_RC35Set_HC2:
+ case EMS_TYPE_JunkersStatusMessage_HC2:
+ case EMS_TYPE_JunkersSetMessage_HC2:
hc = 1;
- } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC3) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC3)) {
+ break;
+
+ case EMS_TYPE_RC35StatusMessage_HC3:
+ case EMS_TYPE_RC35Set_HC3:
+ case EMS_TYPE_JunkersStatusMessage_HC3:
+ case EMS_TYPE_JunkersSetMessage_HC3:
hc = 2;
- } else if ((EMS_RxTelegram->type == EMS_TYPE_RC35StatusMessage_HC4) || (EMS_RxTelegram->type = EMS_TYPE_RC35Set_HC4)) {
+ break;
+
+ case EMS_TYPE_RC35StatusMessage_HC4:
+ case EMS_TYPE_RC35Set_HC4:
+ case EMS_TYPE_JunkersStatusMessage_HC4:
+ case EMS_TYPE_JunkersSetMessage_HC4:
hc = 3;
- } else {
- return -1; // not a valid HC
+ break;
+
+ default:
+ hc = -1; // not a valid HC
+ break;
}
- EMS_Thermostat.hc[hc].active = true;
+ if (hc != -1) {
+ EMS_Thermostat.hc[hc].active = true;
+ }
return (hc);
}
@@ -1577,7 +1601,7 @@ bool _addDevice(_EMS_DEVICE_TYPE device_type, uint8_t product_id, uint8_t device
_Detected_Device device;
// check for duplicates
- // a combi of product_id and device_id make it unique
+ // a pair of product_id and device_id together make it unique
for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
if (((it)->product_id == product_id) && ((it)->device_id == device_id)) {
return (true); // it already exists in the list, don't add
@@ -1711,9 +1735,11 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
uint8_t i = 0;
uint8_t found_index = 0;
bool typeFound = false;
- while ((i < _EMS_Devices_max) && (!typeFound)) {
+ while (i++ < _EMS_Devices_max) {
if (EMS_Devices[i].product_id == product_id) {
// we have a matching product id
+ /*
+ // this code is to check also that we have a matching device type (e.g. boiler, thermostat etc)
// now lets see if there is a matching device_id since product_id can be on multiple devices
// e.g. with UBAMasters, there is only one device_id 0x08. To avoid https://github.com/proddy/EMS-ESP/issues/271
_EMS_DEVICE_TYPE device_type = EMS_Devices[i].type;
@@ -1724,27 +1750,31 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
break;
}
}
+ */
+ typeFound = true;
+ found_index = i;
+ break;
}
- i++;
}
- // if not found, just add it as an unknown device
+ // if not found, just add it as an unknown device and exit
if (!typeFound) {
(void)_addDevice(EMS_DEVICE_TYPE_UNKNOWN, product_id, device_id, nullptr, version);
return;
}
const char * device_desc_p = (EMS_Devices[found_index].device_desc); // pointer to the full description of the device
- _EMS_DEVICE_TYPE type = EMS_Devices[found_index].type; // type
+ _EMS_DEVICE_TYPE type = EMS_Devices[found_index].type; // device type
// we recognized it, see if we already have it in our recognized list
if (_addDevice(type, product_id, device_id, device_desc_p, version)) {
return; // already in list
}
- uint8_t flags = EMS_Devices[found_index].flags; // it's a new entry, set the specifics
+ uint8_t flags = EMS_Devices[found_index].flags; // it's a new entry, get the specifics
- if (type == EMS_DEVICE_TYPE_BOILER) {
+ // for a boiler, sometimes we get a device_id of 0x09 with the same product_id, so lets make sure it is the UBA Master
+ if ((type == EMS_DEVICE_TYPE_BOILER) && (device_id == EMS_ID_BOILER)) {
EMS_Boiler.device_id = device_id;
EMS_Boiler.product_id = product_id;
EMS_Boiler.device_flags = flags;
From ae61c357c0b9718e8ffc991396868ecfe5704c52 Mon Sep 17 00:00:00 2001
From: Paul
Date: Sat, 4 Jan 2020 15:39:07 +0100
Subject: [PATCH 043/195] fix #285
---
src/ems.cpp | 3 ++-
src/version.h | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 5375cac26..586a99ff4 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1735,7 +1735,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 +1755,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
diff --git a/src/version.h b/src/version.h
index 4d590e577..b4147c440 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b12"
+#define APP_VERSION "1.9.5b13"
From 05377059242eb4cd1524961324325330ad28c91a Mon Sep 17 00:00:00 2001
From: MichaelDvP
Date: Sat, 4 Jan 2020 16:05:21 +0100
Subject: [PATCH 044/195] 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 daf24af323b3fec595614d43ad29ebe9f176d048 Mon Sep 17 00:00:00 2001
From: Paul
Date: Sat, 4 Jan 2020 23:15:41 +0100
Subject: [PATCH 045/195] cleaned up detection - #283
---
CHANGELOG.md | 1 +
src/ems-esp.cpp | 16 ++-----
src/ems.cpp | 118 ++++++++++++++++++++--------------------------
src/ems.h | 35 ++++++++++----
src/ems_devices.h | 35 +-------------
src/version.h | 2 +-
6 files changed, 84 insertions(+), 123 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9ec62a5f5..9e000000a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- improved MQTT publishing to stop flooding
### Removed
+ - `autodetect scan`
## [1.9.4] 15-12-2019
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index 24310a706..ffaf528ee 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -113,7 +113,7 @@ static const command_t project_cmds[] PROGMEM = {
{false, "refresh", "fetch values from the EMS devices"},
{false, "devices", "list detected EMS devices"},
{false, "queue", "show current Tx queue"},
- {false, "autodetect [scan]", "detect EMS devices and attempt to automatically set boiler and thermostat types"},
+ {false, "autodetect", "detect EMS devices and attempt to automatically set boiler and thermostat types"},
{false, "send XX ...", "send raw telegram data to EMS bus (XX are hex values)"},
{false, "thermostat read ", "send read request to the thermostat for heating circuit hc 1-4"},
{false, "thermostat temp [hc] ", "set current thermostat temperature"},
@@ -1218,17 +1218,9 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) {
}
if (strcmp(first_cmd, "autodetect") == 0) {
- if (wc == 2) {
- char * second_cmd = _readWord();
- if (strcmp(second_cmd, "scan") == 0) {
- ems_scanDevices(); // known device scan
- ok = true;
- }
- } else {
- ems_clearDeviceList();
- ems_doReadCommand(EMS_TYPE_UBADevices, EMS_Boiler.device_id);
- ok = true;
- }
+ ems_clearDeviceList();
+ ems_doReadCommand(EMS_TYPE_UBADevices, EMS_Boiler.device_id);
+ ok = true;
}
// logging
diff --git a/src/ems.cpp b/src/ems.cpp
index 586a99ff4..cf4e98e49 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -881,7 +881,7 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) {
char type_s[30];
// source
- ems_getDeviceTypeDescription(src, type_s);
+ (void)ems_getDeviceTypeDescription(src, type_s);
strlcpy(output_str, type_s, sizeof(output_str));
strlcat(output_str, " -> ", sizeof(output_str));
@@ -1622,10 +1622,8 @@ bool _addDevice(_EMS_DEVICE_TYPE device_type, uint8_t product_id, uint8_t device
// get type as a string
char type_s[50];
- if (ems_getDeviceTypeDescription(device_id, type_s)) {
+ if (ems_getDeviceTypeName(device_type, type_s)) {
strlcat(line, type_s, sizeof(line));
- } else {
- strlcat(line, "?", sizeof(line));
}
char tmp[6] = {0}; // for formatting numbers
@@ -1738,19 +1736,6 @@ void _process_Version(_EMS_RxTelegram * EMS_RxTelegram) {
while (i < _EMS_Devices_max) {
if (EMS_Devices[i].product_id == product_id) {
// we have a matching product id
- /*
- // this code is to check also that we have a matching device type (e.g. boiler, thermostat etc)
- // now lets see if there is a matching device_id since product_id can be on multiple devices
- // e.g. with UBAMasters, there is only one device_id 0x08. To avoid https://github.com/proddy/EMS-ESP/issues/271
- _EMS_DEVICE_TYPE device_type = EMS_Devices[i].type;
- for (uint8_t j = 0; j < _EMS_Devices_Types_max; j++) {
- if ((EMS_Devices_Types[j].device_type == device_type) && (EMS_Devices_Types[j].device_id == device_id)) {
- typeFound = true;
- found_index = i;
- break;
- }
- }
- */
typeFound = true;
found_index = i;
break;
@@ -1960,35 +1945,67 @@ void ems_getSolarModuleValues() {
}
}
-/**
- * takes a device_id and tries to find the corresponding type name (e.g. Boiler)
- * If it can't find it, it will use the hex value and function returns false
- */
-bool ems_getDeviceTypeDescription(uint8_t device_id, char * buffer) {
+// takes a device type (e.g. EMS_DEVICE_TYPE_MIXING) and stores the english name in the given buffer
+// returns buffer or "unknown"
+char * ems_getDeviceTypeName(_EMS_DEVICE_TYPE device_type, char * buffer) {
uint8_t i = 0;
bool typeFound = false;
-
// scan through known ID types
while (i < _EMS_Devices_Types_max) {
- if (EMS_Devices_Types[i].device_id == device_id) {
+ if (EMS_Devices_Types[i].device_type == device_type) {
typeFound = true; // we have a match
break;
}
i++;
}
- if (typeFound) {
- strlcpy(buffer, EMS_Devices_Types[i].device_type_string, 30);
- return true;
- } else {
- // print as hex value
- char hexbuffer[16] = {0};
- strlcpy(buffer, "0x", 30);
- strlcat(buffer, _hextoa(device_id, hexbuffer), 30);
- return false;
+ if (!typeFound) {
+ i = 0; // this will point to "Unknown" in the lookup
}
+
+ strlcpy(buffer, EMS_Devices_Types[i].device_type_string, 30);
+
+ return buffer;
}
+/**
+ * takes a device_id and tries to find the corresponding type name (e.g. Boiler)
+ * If it can't find it, it will use the hex value and function returns false
+ */
+bool ems_getDeviceTypeDescription(uint8_t device_id, char * buffer) {
+ _EMS_DEVICE_TYPE device_type = EMS_DEVICE_TYPE_UNKNOWN;
+
+ // check for the fixed device IDs we already know about, like 0x00 for broadcast, 0x0B for me, 0x08 for Boiler
+ if (device_id == EMS_ID_BOILER) {
+ device_type = EMS_DEVICE_TYPE_BOILER;
+ } else if (device_id == EMS_ID_ME) {
+ device_type = EMS_DEVICE_TYPE_SERVICEKEY;
+ } else if (device_id == EMS_ID_NONE) {
+ device_type = EMS_DEVICE_TYPE_NONE;
+ } else {
+ // see if its a device we already know about (via earlier detection)
+ if (!Devices.empty()) {
+ for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
+ if (it->device_id == device_id) {
+ device_type = it->device_type;
+ break;
+ }
+ }
+ }
+ }
+
+ // if its not unknown, fetch the real name of the type
+ if (device_type != EMS_DEVICE_TYPE_UNKNOWN) {
+ ems_getDeviceTypeName(device_type, buffer);
+ return true;
+ }
+
+ // we didn't find anything. Use the hex value of the device ID
+ char hexbuffer[16] = {0};
+ strlcpy(buffer, "0x", 30);
+ strlcat(buffer, _hextoa(device_id, hexbuffer), 30);
+ return false;
+}
/**
* returns current device details as a string for known thermostat,boiler,solar and heatpump
@@ -2056,38 +2073,6 @@ char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, boo
return buffer;
}
-/**
- * Find the versions of our connected devices
- */
-void ems_scanDevices() {
- myDebug_P(PSTR("Started scanning the EMS bus for known devices"));
-
- std::list Device_Ids; // create a new list
-
- Device_Ids.push_back(EMS_ID_BOILER); // UBAMaster/Boilers - 0x08
- Device_Ids.push_back(EMS_ID_HP); // HeatPump - 0x38
- Device_Ids.push_back(EMS_ID_SM); // Solar Module - 0x30
- Device_Ids.push_back(EMS_ID_CONTROLLER); // Controllers - 0x09
- Device_Ids.push_back(EMS_ID_CONNECT1); // Connect - 0x02
- Device_Ids.push_back(EMS_ID_CONNECT2); // Connect - 0x50
- Device_Ids.push_back(EMS_ID_GATEWAY); // Gateway - 0x48
- Device_Ids.push_back(EMS_ID_MIXING1); // Mixing Devices - 0x20, 0x21
- Device_Ids.push_back(EMS_ID_MIXING2); // Mixing Devices - 0x20, 0x21
- Device_Ids.push_back(EMS_ID_THERMOSTAT1); // Thermostats - 0x10, 0x17, 0x18
- Device_Ids.push_back(EMS_ID_THERMOSTAT2); // Thermostats - 0x10, 0x17, 0x18
- Device_Ids.push_back(EMS_ID_THERMOSTAT3); // Thermostats - 0x10, 0x17, 0x18
- Device_Ids.push_back(EMS_ID_SWITCH); // Switch - 0x11
-
- // remove duplicates and reserved IDs (like our own device)
- Device_Ids.sort();
- // Device_Ids.unique();
-
- // send the read command with Version command
- for (uint8_t device_id : Device_Ids) {
- ems_doReadCommand(EMS_TYPE_Version, device_id);
- }
-}
-
/**
* print out contents of the device list that was captured
*/
@@ -2126,8 +2111,7 @@ void ems_printDevices() {
char device_type[30];
myDebug_P(PSTR("and %d were recognized by EMS-ESP as:"), Devices.size());
for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
- ems_getDeviceTypeDescription(it->device_id, device_type); // get type string, e.g. "Boiler"
-
+ ems_getDeviceTypeName(it->device_type, device_type); // get type string, e.g. "Boiler"
if (it->known) {
strlcpy(device_string, it->device_desc_p, sizeof(device_string));
} else {
diff --git a/src/ems.h b/src/ems.h
index 8c0b05fe7..5efd8d89c 100644
--- a/src/ems.h
+++ b/src/ems.h
@@ -207,14 +207,36 @@ typedef enum : uint8_t {
EMS_DEVICE_TYPE_SOLAR,
EMS_DEVICE_TYPE_HEATPUMP,
EMS_DEVICE_TYPE_GATEWAY,
- EMS_DEVICE_TYPE_OTHER,
EMS_DEVICE_TYPE_SWITCH,
EMS_DEVICE_TYPE_CONTROLLER,
EMS_DEVICE_TYPE_CONNECT,
- EMS_DEVICE_TYPE_MODEM,
EMS_DEVICE_TYPE_UNKNOWN
} _EMS_DEVICE_TYPE;
+// to store mapping of device_ids to their string name
+typedef struct {
+ _EMS_DEVICE_TYPE device_type;
+ char device_type_string[30];
+} _EMS_Device_Types;
+
+// mapping for EMS_Devices_Type
+const _EMS_Device_Types EMS_Devices_Types[] = {
+
+ {EMS_DEVICE_TYPE_UNKNOWN, EMS_MODELTYPE_UNKNOWN_STRING}, // the first, at index 0 is reserved for "unknown"
+ {EMS_DEVICE_TYPE_NONE, "All"},
+ {EMS_DEVICE_TYPE_SERVICEKEY, "Me"},
+ {EMS_DEVICE_TYPE_BOILER, "UBAMaster"},
+ {EMS_DEVICE_TYPE_THERMOSTAT, "Thermostat"},
+ {EMS_DEVICE_TYPE_MIXING, "Mixing Module"},
+ {EMS_DEVICE_TYPE_SOLAR, "Solar Module"},
+ {EMS_DEVICE_TYPE_HEATPUMP, "Heat Pump"},
+ {EMS_DEVICE_TYPE_GATEWAY, "Gateway"},
+ {EMS_DEVICE_TYPE_SWITCH, "Switching Module"},
+ {EMS_DEVICE_TYPE_CONTROLLER, "Controller"},
+ {EMS_DEVICE_TYPE_CONNECT, "Connect"}
+
+};
+
// to store all known EMS devices to date
typedef struct {
uint8_t product_id;
@@ -223,13 +245,6 @@ typedef struct {
uint8_t flags;
} _EMS_Device;
-// to store mapping of device_ids to their string name
-typedef struct {
- uint8_t device_id;
- _EMS_DEVICE_TYPE device_type;
- char device_type_string[30];
-} _EMS_Device_Types;
-
// for storing all recognised EMS devices
typedef struct {
_EMS_DEVICE_TYPE device_type; // type (see above)
@@ -404,7 +419,6 @@ void ems_parseTelegram(uint8_t * telegram, uint8_t len);
void ems_init();
void ems_doReadCommand(uint16_t type, uint8_t dest);
void ems_sendRawTelegram(char * telegram);
-void ems_scanDevices();
void ems_printDevices();
uint8_t ems_printDevices_s(char * buffer, uint16_t len);
void ems_printTxQueue();
@@ -428,6 +442,7 @@ void ems_setTxMode(uint8_t mode);
void ems_setMasterThermostat(uint8_t product_id);
char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, bool name_only = false);
bool ems_getDeviceTypeDescription(uint8_t device_id, char * buffer);
+char * ems_getDeviceTypeName(_EMS_DEVICE_TYPE device_type, char * buffer);
void ems_getThermostatValues();
void ems_getBoilerValues();
void ems_getSolarModuleValues();
diff --git a/src/ems_devices.h b/src/ems_devices.h
index a8d3d5046..486a7d813 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -14,39 +14,8 @@
// Fixed EMS Device IDs
#define EMS_ID_ME 0x0B // our device, hardcoded as the "Service Key"
#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
+
#define EMS_ID_SM 0x30 // Solar Module SM10, SM100, SM200 and ISM1
-#define EMS_ID_HP 0x38 // HeatPump
-#define EMS_ID_GATEWAY 0x48 // Gateway Modem e.g. KM200 Web Gateway. Also on 0x0A->0x0D
-#define EMS_ID_MIXING1 0x20 // Mixing
-#define EMS_ID_MIXING2 0x21 // Mixing
-#define EMS_ID_SWITCH 0x11 // Switch
-#define EMS_ID_CONTROLLER 0x09 // Controller
-#define EMS_ID_CONNECT1 0x02 // Connect
-#define EMS_ID_CONNECT2 0x50 // Connect
-#define EMS_ID_THERMOSTAT1 0x10 // Thermostat
-#define EMS_ID_THERMOSTAT2 0x17 // Thermostat
-#define EMS_ID_THERMOSTAT3 0x18 // Thermostat
-
-// mapping for EMS_Devices_Type
-const _EMS_Device_Types EMS_Devices_Types[] = {
-
- {EMS_ID_BOILER, EMS_DEVICE_TYPE_BOILER, "UBAMaster"},
- {EMS_ID_THERMOSTAT1, EMS_DEVICE_TYPE_THERMOSTAT, "Thermostat"},
- {EMS_ID_THERMOSTAT2, EMS_DEVICE_TYPE_THERMOSTAT, "Thermostat"},
- {EMS_ID_THERMOSTAT3, EMS_DEVICE_TYPE_THERMOSTAT, "Thermostat"},
- {EMS_ID_SM, EMS_DEVICE_TYPE_SOLAR, "Solar Module"},
- {EMS_ID_HP, EMS_DEVICE_TYPE_HEATPUMP, "Heat Pump"},
- {EMS_ID_GATEWAY, EMS_DEVICE_TYPE_GATEWAY, "Gateway"},
- {EMS_ID_ME, EMS_DEVICE_TYPE_SERVICEKEY, "Me"},
- {EMS_ID_NONE, EMS_DEVICE_TYPE_NONE, "All"},
- {EMS_ID_MIXING1, EMS_DEVICE_TYPE_MIXING, "Mixing Module"},
- {EMS_ID_MIXING2, EMS_DEVICE_TYPE_MIXING, "Mixing Module"},
- {EMS_ID_SWITCH, EMS_DEVICE_TYPE_SWITCH, "Switching Module"},
- {EMS_ID_CONTROLLER, EMS_DEVICE_TYPE_CONTROLLER, "Controller"},
- {EMS_ID_CONNECT1, EMS_DEVICE_TYPE_CONNECT, "Connect"},
- {EMS_ID_CONNECT2, EMS_DEVICE_TYPE_CONNECT, "Connect"}
-
-};
/*
* Common Type
@@ -283,7 +252,7 @@ static const _EMS_Device EMS_Devices[] = {
{206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
{171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
{189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
- {94, EMS_DEVICE_TYPE_MODEM, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
+ {94, EMS_DEVICE_TYPE_GATEWAY, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
//
// Thermostats, typically device id of 0x10, 0x17, 0x18, 0x38 (RC100), 0x39 (Easy)
diff --git a/src/version.h b/src/version.h
index b4147c440..53f287e97 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b13"
+#define APP_VERSION "1.9.5b14"
From 9c8d180c8e843c3872b40be4445582541cb7740c Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 6 Jan 2020 14:11:49 +0100
Subject: [PATCH 046/195] ignore .bin files from build script
---
.gitignore | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.gitignore b/.gitignore
index 559d0aabf..4c5ca7a42 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,6 @@ node_modules
# project specfic
scripts/stackdmp.txt
firmware
+
+# firmware
+*.bin
From 66b2595d4e3cd78d41d93f619dcdf0cb1b9e00ef Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 6 Jan 2020 14:12:04 +0100
Subject: [PATCH 047/195] added Sense II / Bosch CS200
---
src/ems_devices.h | 41 +++++++++++++++++++++--------------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 486a7d813..1217b158f 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -12,10 +12,10 @@
#include "ems.h"
// Fixed EMS Device IDs
-#define EMS_ID_ME 0x0B // our device, hardcoded as the "Service Key"
-#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
+#define EMS_ID_ME 0x0B // our device, hardcoded as the "Service Key"
+#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
-#define EMS_ID_SM 0x30 // Solar Module SM10, SM100, SM200 and ISM1
+#define EMS_ID_SM 0x30 // Solar Module SM10, SM100, SM200 and ISM1
/*
* Common Type
@@ -237,22 +237,23 @@ static const _EMS_Device EMS_Devices[] = {
// Other devices like controllers and modems
// such as 0x11 for Switching, 0x09 for controllers, 0x02 for Connect, 0x48 for Gateway
//
- {71, EMS_DEVICE_TYPE_SWITCH, "WM10 Switch Module", EMS_DEVICE_FLAG_NONE}, // 0x11
- {68, EMS_DEVICE_TYPE_CONTROLLER, "BC10/RFM20 Receiver", EMS_DEVICE_FLAG_NONE}, // 0x09
- {218, EMS_DEVICE_TYPE_CONTROLLER, "Junkers M200/Buderus RFM200 Receiver", EMS_DEVICE_FLAG_NONE}, // 0x50
- {190, EMS_DEVICE_TYPE_CONTROLLER, "BC10 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {114, EMS_DEVICE_TYPE_CONTROLLER, "BC10 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {125, EMS_DEVICE_TYPE_CONTROLLER, "BC25 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {169, EMS_DEVICE_TYPE_CONTROLLER, "BC40 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {152, EMS_DEVICE_TYPE_CONTROLLER, "Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {95, EMS_DEVICE_TYPE_CONTROLLER, "HT3 Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {209, EMS_DEVICE_TYPE_CONTROLLER, "W-B ErP Boiler Control Panel", EMS_DEVICE_FLAG_NONE}, // 0x09
- {230, EMS_DEVICE_TYPE_CONTROLLER, "BC Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
- {205, EMS_DEVICE_TYPE_CONNECT, "Nefit Moduline Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
- {206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
- {171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
- {189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
- {94, EMS_DEVICE_TYPE_GATEWAY, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
+ {71, EMS_DEVICE_TYPE_SWITCH, "WM10 Switch Module", EMS_DEVICE_FLAG_NONE}, // 0x11
+ {68, EMS_DEVICE_TYPE_CONTROLLER, "BC10/RFM20 Receiver", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {218, EMS_DEVICE_TYPE_CONTROLLER, "Junkers M200/Buderus RFM200 Receiver", EMS_DEVICE_FLAG_NONE}, // 0x50
+ {190, EMS_DEVICE_TYPE_CONTROLLER, "BC10 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {114, EMS_DEVICE_TYPE_CONTROLLER, "BC10 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {125, EMS_DEVICE_TYPE_CONTROLLER, "BC25 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {169, EMS_DEVICE_TYPE_CONTROLLER, "BC40 Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {152, EMS_DEVICE_TYPE_CONTROLLER, "Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {95, EMS_DEVICE_TYPE_CONTROLLER, "HT3 Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {209, EMS_DEVICE_TYPE_CONTROLLER, "W-B ErP Boiler Control Panel", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {230, EMS_DEVICE_TYPE_CONTROLLER, "BC Base Controller", EMS_DEVICE_FLAG_NONE}, // 0x09
+ {205, EMS_DEVICE_TYPE_CONNECT, "Nefit Moduline Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
+ {206, EMS_DEVICE_TYPE_CONNECT, "Bosch Easy Connect", EMS_DEVICE_FLAG_NONE}, // 0x02
+ {171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
+ {189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
+ {94, EMS_DEVICE_TYPE_GATEWAY, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
+ {207, EMS_DEVICE_TYPE_CONTROLLER, "Worcester Sense II/Bosch CS100 Solar Controller", EMS_DEVICE_FLAG_NONE}, // 0x10
//
// Thermostats, typically device id of 0x10, 0x17, 0x18, 0x38 (RC100), 0x39 (Easy)
@@ -263,7 +264,7 @@ static const _EMS_Device EMS_Devices[] = {
{203, EMS_DEVICE_TYPE_THERMOSTAT, "Bosch EasyControl CT200", EMS_DEVICE_FLAG_EASY | EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
{157, EMS_DEVICE_TYPE_THERMOSTAT, "Buderus RC200/Bosch CW100/Junkers CW100", EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
- // Buderus/Nefit
+ // Buderus/Nefit specific
{79, EMS_DEVICE_TYPE_THERMOSTAT, "RC10/Moduline 100", EMS_DEVICE_FLAG_RC10}, // 0x17
{77, EMS_DEVICE_TYPE_THERMOSTAT, "RC20/Moduline 300", EMS_DEVICE_FLAG_RC20}, // 0x17
{67, EMS_DEVICE_TYPE_THERMOSTAT, "RC30", EMS_DEVICE_FLAG_RC30}, // 0x10
From 2efa908551dbd5dea99902dacdcd7e88fe9e8a2b Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 6 Jan 2020 14:12:13 +0100
Subject: [PATCH 048/195] upgrade to python 3.8
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index fc4d9ac79..81e566588 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
os: linux
language: python
python:
- - "2.7"
+ - "3.8"
cache:
directories:
From ce03746c928902c27aa42500c5f92a9d7095e466 Mon Sep 17 00:00:00 2001
From: proddy
Date: Mon, 6 Jan 2020 14:48:43 +0100
Subject: [PATCH 049/195] get off dev branch for travis dpl
---
.travis.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 81e566588..bc7e3798c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -54,8 +54,8 @@ before_deploy:
deploy:
provider: releases
- edge:
- branch: master
+ #edge:
+ # branch: master
token: ${GITHUB_TOKEN}
file_glob: true
# file: "firmware/*.bin"
From 68f487d2703edc4766dcc8c9f9936bec50f8250a Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 6 Jan 2020 20:51:23 +0100
Subject: [PATCH 050/195] trying to fix travis build with gem error
---
.travis.yml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index bc7e3798c..da7b07755 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -44,6 +44,7 @@ jobs:
# - env: BUILDER_THREAD=3
before_deploy:
+ - gem install 'faraday:<0.16'
- export FIRMWARE_VERSION=$(grep -E '^#define APP_VERSION' ./src/version.h | awk '{print $3}' | sed 's/"//g')
- git tag -f travis-${TAG}-build
- git remote add gh
@@ -54,8 +55,8 @@ before_deploy:
deploy:
provider: releases
- #edge:
- # branch: master
+ edge:
+ branch: master
token: ${GITHUB_TOKEN}
file_glob: true
# file: "firmware/*.bin"
From fff38f900397304b9ba59a8666d53316dc1cd811 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 6 Jan 2020 21:27:16 +0100
Subject: [PATCH 051/195] travis fix again
---
.travis.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.travis.yml b/.travis.yml
index da7b07755..f108c2321 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -44,7 +44,6 @@ jobs:
# - env: BUILDER_THREAD=3
before_deploy:
- - gem install 'faraday:<0.16'
- export FIRMWARE_VERSION=$(grep -E '^#define APP_VERSION' ./src/version.h | awk '{print $3}' | sed 's/"//g')
- git tag -f travis-${TAG}-build
- git remote add gh
@@ -56,6 +55,7 @@ before_deploy:
deploy:
provider: releases
edge:
+ source: wenkokke/dpl
branch: master
token: ${GITHUB_TOKEN}
file_glob: true
From 62fff2c3bfdae3fe8a89db5c6320d799355feb90 Mon Sep 17 00:00:00 2001
From: Paul
Date: Mon, 6 Jan 2020 21:51:02 +0100
Subject: [PATCH 052/195] #238 - various optimizatons for multiple HCs on RC35s
---
src/ems.cpp | 10 ++++++++--
src/version.h | 2 +-
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index cf4e98e49..026633dbc 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -1194,8 +1194,9 @@ void _process_RC30StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
// exit if...
// - the 15th byte (second from last) is 0x00, which I think is flow temp, means HC is not is use
- // - its not a broadcast, so destination is 0x00
- if ((EMS_RxTelegram->data[14] == 0x00) || (EMS_RxTelegram->dest != EMS_ID_NONE)) {
+ // - its not a broadcast, so destination is 0x00 (not in use since 6/1/2020 - issue #238)
+ // if ((EMS_RxTelegram->data[14] == 0x00) || (EMS_RxTelegram->dest != EMS_ID_NONE)) {
+ if (EMS_RxTelegram->data[14] == 0x00) {
return;
}
@@ -1368,6 +1369,11 @@ int8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram) {
return -1;
}
+ // ignore telegrams that have no data, or only a single byte
+ if (EMS_RxTelegram->data_length <= 1) {
+ return -1;
+ }
+
int8_t hc;
switch (EMS_RxTelegram->type) {
diff --git a/src/version.h b/src/version.h
index 53f287e97..5e99652ca 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b14"
+#define APP_VERSION "1.9.5b15"
From f99991bf858e52597ca2674cb6cbb61bab33b63d Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 7 Jan 2020 22:03:07 +0100
Subject: [PATCH 053/195] also build web on release target
---
platformio.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/platformio.ini b/platformio.ini
index 80fc57d1a..747006030 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -110,5 +110,5 @@ board = d1_mini
build_type = release
build_flags = ${common.build_flags} ${common.custom_flags}
extra_scripts =
- ;pre:scripts/pre_script.py
+ pre:scripts/pre_script.py
scripts/main_script.py
From 46f32682f019c9a88de3760d64b1d63159fda335 Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 7 Jan 2020 22:03:31 +0100
Subject: [PATCH 054/195] don't show boiler details if it isnt connected
---
src/ems-esp.cpp | 166 +++++++++++++++++++++++++-----------------------
1 file changed, 85 insertions(+), 81 deletions(-)
diff --git a/src/ems-esp.cpp b/src/ems-esp.cpp
index ffaf528ee..b802e584a 100644
--- a/src/ems-esp.cpp
+++ b/src/ems-esp.cpp
@@ -270,97 +270,101 @@ void showInfo() {
}
myDebug_P(PSTR(""));
- myDebug_P(PSTR("%sBoiler stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
- // version details
- myDebug_P(PSTR(" Boiler: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_BOILER, buffer_type));
+ // show boiler stats if connected
+ if (ems_getBoilerEnabled()) {
+ myDebug_P(PSTR("%sBoiler stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
- // active stats
- if (ems_getBusConnected()) {
- if (EMS_Boiler.tapwaterActive != EMS_VALUE_INT_NOTSET) {
- myDebug_P(PSTR(" Hot tap water: %s"), EMS_Boiler.tapwaterActive ? "running" : "off");
+ // version details
+ myDebug_P(PSTR(" Boiler: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_BOILER, buffer_type));
+
+ // active stats
+ if (ems_getBusConnected()) {
+ if (EMS_Boiler.tapwaterActive != EMS_VALUE_INT_NOTSET) {
+ myDebug_P(PSTR(" Hot tap water: %s"), EMS_Boiler.tapwaterActive ? "running" : "off");
+ }
+
+ if (EMS_Boiler.heatingActive != EMS_VALUE_INT_NOTSET) {
+ myDebug_P(PSTR(" Central heating: %s"), EMS_Boiler.heatingActive ? "active" : "off");
+ }
}
- if (EMS_Boiler.heatingActive != EMS_VALUE_INT_NOTSET) {
- myDebug_P(PSTR(" Central heating: %s"), EMS_Boiler.heatingActive ? "active" : "off");
+ // UBAParameterWW
+ _renderBoolValue("Warm Water activated", EMS_Boiler.wWActivated);
+ _renderBoolValue("Warm Water circulation pump available", EMS_Boiler.wWCircPump);
+ if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Hot) {
+ myDebug_P(PSTR(" Warm Water comfort setting: Hot"));
+ } else if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Eco) {
+ myDebug_P(PSTR(" Warm Water comfort setting: Eco"));
+ } else if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Intelligent) {
+ myDebug_P(PSTR(" Warm Water comfort setting: Intelligent"));
}
- }
- // UBAParameterWW
- _renderBoolValue("Warm Water activated", EMS_Boiler.wWActivated);
- _renderBoolValue("Warm Water circulation pump available", EMS_Boiler.wWCircPump);
- if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Hot) {
- myDebug_P(PSTR(" Warm Water comfort setting: Hot"));
- } else if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Eco) {
- myDebug_P(PSTR(" Warm Water comfort setting: Eco"));
- } else if (EMS_Boiler.wWComfort == EMS_VALUE_UBAParameterWW_wwComfort_Intelligent) {
- myDebug_P(PSTR(" Warm Water comfort setting: Intelligent"));
- }
+ _renderIntValue("Warm Water selected temperature", "C", EMS_Boiler.wWSelTemp);
+ _renderIntValue("Warm Water desinfection temperature", "C", EMS_Boiler.wWDesinfectTemp);
- _renderIntValue("Warm Water selected temperature", "C", EMS_Boiler.wWSelTemp);
- _renderIntValue("Warm Water desinfection temperature", "C", EMS_Boiler.wWDesinfectTemp);
+ // UBAMonitorWWMessage
+ _renderUShortValue("Warm Water current temperature", "C", EMS_Boiler.wWCurTmp);
+ _renderIntValue("Warm Water current tap water flow", "l/min", EMS_Boiler.wWCurFlow, 10);
+ _renderLongValue("Warm Water # starts", "times", EMS_Boiler.wWStarts);
+ if (EMS_Boiler.wWWorkM != EMS_VALUE_LONG_NOTSET) {
+ myDebug_P(PSTR(" Warm Water active time: %d days %d hours %d minutes"),
+ EMS_Boiler.wWWorkM / 1440,
+ (EMS_Boiler.wWWorkM % 1440) / 60,
+ EMS_Boiler.wWWorkM % 60);
+ }
+ _renderBoolValue("Warm Water 3-way valve", EMS_Boiler.wWHeat);
- // UBAMonitorWWMessage
- _renderUShortValue("Warm Water current temperature", "C", EMS_Boiler.wWCurTmp);
- _renderIntValue("Warm Water current tap water flow", "l/min", EMS_Boiler.wWCurFlow, 10);
- _renderLongValue("Warm Water # starts", "times", EMS_Boiler.wWStarts);
- if (EMS_Boiler.wWWorkM != EMS_VALUE_LONG_NOTSET) {
- myDebug_P(PSTR(" Warm Water active time: %d days %d hours %d minutes"),
- EMS_Boiler.wWWorkM / 1440,
- (EMS_Boiler.wWWorkM % 1440) / 60,
- EMS_Boiler.wWWorkM % 60);
- }
- _renderBoolValue("Warm Water 3-way valve", EMS_Boiler.wWHeat);
+ // UBAMonitorFast
+ _renderIntValue("Selected flow temperature", "C", EMS_Boiler.selFlowTemp);
+ _renderUShortValue("Current flow temperature", "C", EMS_Boiler.curFlowTemp);
+ _renderUShortValue("Return temperature", "C", EMS_Boiler.retTemp);
+ _renderBoolValue("Gas", EMS_Boiler.burnGas);
+ _renderBoolValue("Boiler pump", EMS_Boiler.heatPmp);
+ _renderBoolValue("Fan", EMS_Boiler.fanWork);
+ _renderBoolValue("Ignition", EMS_Boiler.ignWork);
+ _renderBoolValue("Circulation pump", EMS_Boiler.wWCirc);
+ _renderIntValue("Burner selected max power", "%", EMS_Boiler.selBurnPow);
+ _renderIntValue("Burner current power", "%", EMS_Boiler.curBurnPow);
+ _renderShortValue("Flame current", "uA", EMS_Boiler.flameCurr);
+ _renderIntValue("System pressure", "bar", EMS_Boiler.sysPress, 10);
+ if (EMS_Boiler.serviceCode == EMS_VALUE_USHORT_NOTSET) {
+ myDebug_P(PSTR(" System service code: %s"), EMS_Boiler.serviceCodeChar);
+ } else {
+ myDebug_P(PSTR(" System service code: %s (%d)"), EMS_Boiler.serviceCodeChar, EMS_Boiler.serviceCode);
+ }
- // UBAMonitorFast
- _renderIntValue("Selected flow temperature", "C", EMS_Boiler.selFlowTemp);
- _renderUShortValue("Current flow temperature", "C", EMS_Boiler.curFlowTemp);
- _renderUShortValue("Return temperature", "C", EMS_Boiler.retTemp);
- _renderBoolValue("Gas", EMS_Boiler.burnGas);
- _renderBoolValue("Boiler pump", EMS_Boiler.heatPmp);
- _renderBoolValue("Fan", EMS_Boiler.fanWork);
- _renderBoolValue("Ignition", EMS_Boiler.ignWork);
- _renderBoolValue("Circulation pump", EMS_Boiler.wWCirc);
- _renderIntValue("Burner selected max power", "%", EMS_Boiler.selBurnPow);
- _renderIntValue("Burner current power", "%", EMS_Boiler.curBurnPow);
- _renderShortValue("Flame current", "uA", EMS_Boiler.flameCurr);
- _renderIntValue("System pressure", "bar", EMS_Boiler.sysPress, 10);
- if (EMS_Boiler.serviceCode == EMS_VALUE_USHORT_NOTSET) {
- myDebug_P(PSTR(" System service code: %s"), EMS_Boiler.serviceCodeChar);
- } else {
- myDebug_P(PSTR(" System service code: %s (%d)"), EMS_Boiler.serviceCodeChar, EMS_Boiler.serviceCode);
- }
+ // UBAParametersMessage
+ _renderIntValue("Heating temperature setting on the boiler", "C", EMS_Boiler.heating_temp);
+ _renderIntValue("Boiler circuit pump modulation max power", "%", EMS_Boiler.pump_mod_max);
+ _renderIntValue("Boiler circuit pump modulation min power", "%", EMS_Boiler.pump_mod_min);
- // UBAParametersMessage
- _renderIntValue("Heating temperature setting on the boiler", "C", EMS_Boiler.heating_temp);
- _renderIntValue("Boiler circuit pump modulation max power", "%", EMS_Boiler.pump_mod_max);
- _renderIntValue("Boiler circuit pump modulation min power", "%", EMS_Boiler.pump_mod_min);
-
- // UBAMonitorSlow
- if (EMS_Boiler.extTemp != EMS_VALUE_SHORT_NOTSET) {
- _renderShortValue("Outside temperature", "C", EMS_Boiler.extTemp);
- }
- _renderUShortValue("Boiler temperature", "C", EMS_Boiler.boilTemp);
- _renderUShortValue("Exhaust temperature", "C", EMS_Boiler.exhaustTemp);
- _renderIntValue("Pump modulation", "%", EMS_Boiler.pumpMod);
- _renderLongValue("Burner # starts", "times", EMS_Boiler.burnStarts);
- if (EMS_Boiler.burnWorkMin != EMS_VALUE_LONG_NOTSET) {
- myDebug_P(PSTR(" Total burner operating time: %d days %d hours %d minutes"),
- EMS_Boiler.burnWorkMin / 1440,
- (EMS_Boiler.burnWorkMin % 1440) / 60,
- EMS_Boiler.burnWorkMin % 60);
- }
- if (EMS_Boiler.heatWorkMin != EMS_VALUE_LONG_NOTSET) {
- myDebug_P(PSTR(" Total heat operating time: %d days %d hours %d minutes"),
- EMS_Boiler.heatWorkMin / 1440,
- (EMS_Boiler.heatWorkMin % 1440) / 60,
- EMS_Boiler.heatWorkMin % 60);
- }
- if (EMS_Boiler.UBAuptime != EMS_VALUE_LONG_NOTSET) {
- myDebug_P(PSTR(" Total UBA working time: %d days %d hours %d minutes"),
- EMS_Boiler.UBAuptime / 1440,
- (EMS_Boiler.UBAuptime % 1440) / 60,
- EMS_Boiler.UBAuptime % 60);
+ // UBAMonitorSlow
+ if (EMS_Boiler.extTemp != EMS_VALUE_SHORT_NOTSET) {
+ _renderShortValue("Outside temperature", "C", EMS_Boiler.extTemp);
+ }
+ _renderUShortValue("Boiler temperature", "C", EMS_Boiler.boilTemp);
+ _renderUShortValue("Exhaust temperature", "C", EMS_Boiler.exhaustTemp);
+ _renderIntValue("Pump modulation", "%", EMS_Boiler.pumpMod);
+ _renderLongValue("Burner # starts", "times", EMS_Boiler.burnStarts);
+ if (EMS_Boiler.burnWorkMin != EMS_VALUE_LONG_NOTSET) {
+ myDebug_P(PSTR(" Total burner operating time: %d days %d hours %d minutes"),
+ EMS_Boiler.burnWorkMin / 1440,
+ (EMS_Boiler.burnWorkMin % 1440) / 60,
+ EMS_Boiler.burnWorkMin % 60);
+ }
+ if (EMS_Boiler.heatWorkMin != EMS_VALUE_LONG_NOTSET) {
+ myDebug_P(PSTR(" Total heat operating time: %d days %d hours %d minutes"),
+ EMS_Boiler.heatWorkMin / 1440,
+ (EMS_Boiler.heatWorkMin % 1440) / 60,
+ EMS_Boiler.heatWorkMin % 60);
+ }
+ if (EMS_Boiler.UBAuptime != EMS_VALUE_LONG_NOTSET) {
+ myDebug_P(PSTR(" Total UBA working time: %d days %d hours %d minutes"),
+ EMS_Boiler.UBAuptime / 1440,
+ (EMS_Boiler.UBAuptime % 1440) / 60,
+ EMS_Boiler.UBAuptime % 60);
+ }
}
// For SM10/SM100/SM200 Solar Module
From 9d9884065ebaf547021f208992d8514c53d642ae Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 7 Jan 2020 22:03:38 +0100
Subject: [PATCH 055/195] bump
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 5e99652ca..55b458466 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define APP_VERSION "1.9.5b15"
+#define APP_VERSION "1.9.5b16"
From 382946846e5dac9faf7e59dbb9915eccdd4e6386 Mon Sep 17 00:00:00 2001
From: Paul
Date: Tue, 7 Jan 2020 22:04:14 +0100
Subject: [PATCH 056/195] increase bus offline timeout from 15 to 45 seconds -
#267
---
src/ems.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems.cpp b/src/ems.cpp
index 026633dbc..11f1e4fbc 100644
--- a/src/ems.cpp
+++ b/src/ems.cpp
@@ -49,7 +49,7 @@ const uint8_t ems_crc_table[] = {0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E,
0xF9, 0xFB, 0xFD, 0xFF, 0xF1, 0xF3, 0xF5, 0xF7, 0xE9, 0xEB, 0xED, 0xEF, 0xE1, 0xE3, 0xE5, 0xE7};
const uint8_t TX_WRITE_TIMEOUT_COUNT = 2; // 3 retries before timeout
-const uint32_t EMS_BUS_TIMEOUT = 15000; // timeout in ms before recognizing the ems bus is offline (15 seconds)
+const uint32_t EMS_BUS_TIMEOUT = 45000; // timeout in ms before recognizing the ems bus is offline (45 seconds)
const uint32_t EMS_POLL_TIMEOUT = 5000000; // timeout in microseconds before recognizing the ems bus is offline (5 seconds)
/*
From 10f50b1974af035a6ce684e4fae8fc27ca141b33 Mon Sep 17 00:00:00 2001
From: proddy
Date: Wed, 8 Jan 2020 12:34:58 +0100
Subject: [PATCH 057/195] typo with CS100 -> CS200
---
src/ems_devices.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ems_devices.h b/src/ems_devices.h
index 1217b158f..9d65b40c4 100644
--- a/src/ems_devices.h
+++ b/src/ems_devices.h
@@ -253,7 +253,7 @@ static const _EMS_Device EMS_Devices[] = {
{171, EMS_DEVICE_TYPE_CONNECT, "EMS-OT OpenTherm converter", EMS_DEVICE_FLAG_NONE}, // 0x02
{189, EMS_DEVICE_TYPE_GATEWAY, "Web Gateway KM200", EMS_DEVICE_FLAG_NONE}, // 0x48
{94, EMS_DEVICE_TYPE_GATEWAY, "RC Remote Device", EMS_DEVICE_FLAG_NONE}, // 0x18
- {207, EMS_DEVICE_TYPE_CONTROLLER, "Worcester Sense II/Bosch CS100 Solar Controller", EMS_DEVICE_FLAG_NONE}, // 0x10
+ {207, EMS_DEVICE_TYPE_CONTROLLER, "Worcester Sense II/Bosch CS200 Solar Controller", EMS_DEVICE_FLAG_NONE}, // 0x10
//
// Thermostats, typically device id of 0x10, 0x17, 0x18, 0x38 (RC100), 0x39 (Easy)
From 7b561f0540451da7abea1c66a1a81f4f88434b74 Mon Sep 17 00:00:00 2001
From: Paul
Date: Thu, 9 Jan 2020 23:04:27 +0100
Subject: [PATCH 058/195] updated wiki
---
README.md | 22 +-
doc/ems gateway/logo-proddy-fw.jpg | Bin 23115 -> 0 bytes
doc/ems references/HT3-Bus_Telegramme.html | 7862 -----------------
doc/ems references/wiki_ ems_ telegrams.pdf | Bin 195670 -> 0 bytes
docs/.nojekyll | 1 +
docs/Building-firmware.md | 60 +
docs/Building-your-own-test-circuit.md | 24 +
docs/Configure-firmware.md | 35 +
docs/Contributing.md | 15 +
docs/Deciphering-EMS-Plus.md | 66 +
docs/Domoticz.md | 1 +
docs/EMS-Telegram-Types.md | 66 +
docs/FAQ.md | 16 +
docs/Home-Assistant.md | 171 +
docs/Home.md | 61 +
docs/How-the-Code-Works.md | 21 +
docs/How-the-EMS-bus-works.md | 69 +
docs/MC110-controller.md | 130 +
docs/MQTT.md | 94 +
docs/RC3xx-Thermostats.md | 128 +
docs/README.md | 69 +
docs/Running-and-Monitoring.md | 32 +
docs/SM100.md | 180 +
docs/Supported-EMS-Devices.md | 51 +
docs/Thermostat-Modes-RC35-vs-RC300.md | 15 +
docs/Troubleshooting.md | 70 +
docs/Uploading-firmware.md | 14 +
docs/Web-test.md | 7 +
docs/What's-New.md | 1 +
docs/_assets/edit-link.js | 28 +
docs/_assets/prism-bash.min.js | 1 +
docs/_assets/prism-ems-esp.js | 17 +
docs/_assets/prism-http.min.js | 1 +
docs/_assets/prism-json.min.js | 1 +
docs/_assets/prism-yaml.min.js | 1 +
docs/_assets/prism.css | 143 +
docs/_assets/prism.js | 14 +
docs/_assets/theme-custom.css | 78 +
docs/_glossary.md | 12 +
docs/_media/EMS-ESP_logo.png | Bin 0 -> 4159 bytes
docs/_media/boiler.svg | 1 +
docs/_media/boiler_128.png | Bin 0 -> 4329 bytes
docs/_media/boiler_16.png | Bin 0 -> 594 bytes
docs/_media/boiler_16x16.ico | Bin 0 -> 1150 bytes
docs/_media/boiler_24.png | Bin 0 -> 856 bytes
docs/_media/boiler_256.png | Bin 0 -> 8572 bytes
docs/_media/boiler_32.png | Bin 0 -> 1186 bytes
docs/_media/boiler_512.png | Bin 0 -> 18042 bytes
docs/_media/boiler_64.png | Bin 0 -> 2238 bytes
.../_media}/ems gateway/ems-board-white.jpg | Bin
.../_media}/ems gateway/ems-kit-2.jpg | Bin
.../_media}/ems gateway/on-boiler.jpg | Bin
docs/_media/esp8266.png | Bin 0 -> 92063 bytes
docs/_media/favicon.ico | Bin 0 -> 16958 bytes
{doc => docs/_media}/home assistant/ha.png | Bin
.../_media}/home assistant/ha_notify.jpg | Bin
docs/_media/logo-proddy-fw.jpg | Bin 0 -> 8478 bytes
docs/_media/logo/domoticz.png | Bin 0 -> 27057 bytes
docs/_media/logo/home-assistant.png | Bin 0 -> 4257 bytes
.../_media}/schematics/Schematic_EMS-ESP.png | Bin
.../_media}/schematics/breadboard.png | Bin
.../_media}/schematics/breadboard_example.png | Bin
{doc => docs/_media}/schematics/circuit.png | Bin
{doc => docs/_media}/schematics/ems_full.diy | 0
.../_media}/schematics/wemos_kees.png | Bin
{doc => docs/_media}/telnet/telnet_menu.jpg | Bin
{doc => docs/_media}/telnet/telnet_stats.PNG | Bin
.../_media}/telnet/telnet_verbose.PNG | Bin
{doc => docs/_media}/web/ems_dashboard.PNG | Bin
{doc => docs/_media}/web/system_status.PNG | Bin
docs/_navbar.md | 8 +
docs/_sidebar.md | 27 +
docs/favicon.ico | Bin 0 -> 16958 bytes
docs/getting_started.md | 22 +
docs/index.html | 141 +
.../homeassistant}/automation.yaml | 0
.../homeassistant}/binary_sensor.yaml | 0
.../integrations/homeassistant}/climate.yaml | 0
.../homeassistant}/customize.yaml | 0
docs/integrations/homeassistant/ha.md | 22 +
.../integrations/homeassistant}/notify.yaml | 0
.../integrations/homeassistant}/script.yaml | 0
.../integrations/homeassistant}/sensor.yaml | 0
.../integrations/homeassistant}/switch.yaml | 0
.../homeassistant}/ui-lovelace.yaml | 0
docs/wish-list.md | 11 +
86 files changed, 1933 insertions(+), 7876 deletions(-)
delete mode 100644 doc/ems gateway/logo-proddy-fw.jpg
delete mode 100644 doc/ems references/HT3-Bus_Telegramme.html
delete mode 100644 doc/ems references/wiki_ ems_ telegrams.pdf
create mode 100644 docs/.nojekyll
create mode 100644 docs/Building-firmware.md
create mode 100644 docs/Building-your-own-test-circuit.md
create mode 100644 docs/Configure-firmware.md
create mode 100644 docs/Contributing.md
create mode 100644 docs/Deciphering-EMS-Plus.md
create mode 100644 docs/Domoticz.md
create mode 100644 docs/EMS-Telegram-Types.md
create mode 100644 docs/FAQ.md
create mode 100644 docs/Home-Assistant.md
create mode 100644 docs/Home.md
create mode 100644 docs/How-the-Code-Works.md
create mode 100644 docs/How-the-EMS-bus-works.md
create mode 100644 docs/MC110-controller.md
create mode 100644 docs/MQTT.md
create mode 100644 docs/RC3xx-Thermostats.md
create mode 100644 docs/README.md
create mode 100644 docs/Running-and-Monitoring.md
create mode 100644 docs/SM100.md
create mode 100644 docs/Supported-EMS-Devices.md
create mode 100644 docs/Thermostat-Modes-RC35-vs-RC300.md
create mode 100644 docs/Troubleshooting.md
create mode 100644 docs/Uploading-firmware.md
create mode 100644 docs/Web-test.md
create mode 100644 docs/What's-New.md
create mode 100644 docs/_assets/edit-link.js
create mode 100644 docs/_assets/prism-bash.min.js
create mode 100644 docs/_assets/prism-ems-esp.js
create mode 100644 docs/_assets/prism-http.min.js
create mode 100644 docs/_assets/prism-json.min.js
create mode 100644 docs/_assets/prism-yaml.min.js
create mode 100644 docs/_assets/prism.css
create mode 100644 docs/_assets/prism.js
create mode 100644 docs/_assets/theme-custom.css
create mode 100644 docs/_glossary.md
create mode 100644 docs/_media/EMS-ESP_logo.png
create mode 100644 docs/_media/boiler.svg
create mode 100644 docs/_media/boiler_128.png
create mode 100644 docs/_media/boiler_16.png
create mode 100644 docs/_media/boiler_16x16.ico
create mode 100644 docs/_media/boiler_24.png
create mode 100644 docs/_media/boiler_256.png
create mode 100644 docs/_media/boiler_32.png
create mode 100644 docs/_media/boiler_512.png
create mode 100644 docs/_media/boiler_64.png
rename {doc => docs/_media}/ems gateway/ems-board-white.jpg (100%)
rename {doc => docs/_media}/ems gateway/ems-kit-2.jpg (100%)
rename {doc => docs/_media}/ems gateway/on-boiler.jpg (100%)
create mode 100644 docs/_media/esp8266.png
create mode 100644 docs/_media/favicon.ico
rename {doc => docs/_media}/home assistant/ha.png (100%)
rename {doc => docs/_media}/home assistant/ha_notify.jpg (100%)
create mode 100644 docs/_media/logo-proddy-fw.jpg
create mode 100644 docs/_media/logo/domoticz.png
create mode 100644 docs/_media/logo/home-assistant.png
rename {doc => docs/_media}/schematics/Schematic_EMS-ESP.png (100%)
rename {doc => docs/_media}/schematics/breadboard.png (100%)
rename {doc => docs/_media}/schematics/breadboard_example.png (100%)
rename {doc => docs/_media}/schematics/circuit.png (100%)
rename {doc => docs/_media}/schematics/ems_full.diy (100%)
rename {doc => docs/_media}/schematics/wemos_kees.png (100%)
rename {doc => docs/_media}/telnet/telnet_menu.jpg (100%)
rename {doc => docs/_media}/telnet/telnet_stats.PNG (100%)
rename {doc => docs/_media}/telnet/telnet_verbose.PNG (100%)
rename {doc => docs/_media}/web/ems_dashboard.PNG (100%)
rename {doc => docs/_media}/web/system_status.PNG (100%)
create mode 100644 docs/_navbar.md
create mode 100644 docs/_sidebar.md
create mode 100644 docs/favicon.ico
create mode 100644 docs/getting_started.md
create mode 100644 docs/index.html
rename {doc/home assistant => docs/integrations/homeassistant}/automation.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/binary_sensor.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/climate.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/customize.yaml (100%)
create mode 100644 docs/integrations/homeassistant/ha.md
rename {doc/home assistant => docs/integrations/homeassistant}/notify.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/script.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/sensor.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/switch.yaml (100%)
rename {doc/home assistant => docs/integrations/homeassistant}/ui-lovelace.yaml (100%)
create mode 100644 docs/wish-list.md
diff --git a/README.md b/README.md
index 3d58fb72c..1970b4d78 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+
# EMS-ESP
[](https://github.com/proddy/EMS-ESP/blob/master/CHANGELOG.md)
@@ -15,7 +15,7 @@ EMS-ESP is a open-source system to communicate with **EMS** (Energy Management S
The code is written for the Espressif **ESP8266** microcontroller and supports a telnet console for real-time monitoring and configuration and customizable MQTT support for publishing the information to a home automation system such as Home Assistant or Domoticz.
-#### Please reference the [Wiki](https://github.com/proddy/EMS-ESP/wiki) for further details and instructions on how to build and configure the firmware.
+#### Please reference the [Wiki](https://proddy.github.io/EMS-ESP) for further details and instructions on how to build and configure the firmware.
---
@@ -23,31 +23,25 @@ The code is written for the Espressif **ESP8266** microcontroller and supports a
#### A web interface for easy configuration and real-time monitoring of the EMS bus
-|  |  |
+|  |  |
| -------------------------------------------------------- | ---------------------------------------------------------- |
#### MQTT support for Home Assistant and Domoticz
-
+
#### Telnet for advanced configuration and verbose traffic logging
-|  |  |
+|  |  |
| ------------------------------------------------------------ | -------------------------------------------------------- |
## Supported EMS devices
-More than **50** EMS devices are currently supported. See the [complete list](https://github.com/proddy/EMS-ESP/wiki/Supported-EMS-Devices) from the [Wiki](https://github.com/proddy/EMS-ESP/wiki).
-
-## Uploading the firmware
-
-Latest stable firmware build can be found [here](https://github.com/proddy/EMS-ESP/releases/latest).
-
-Follow [these instructions](https://github.com/proddy/EMS-ESP/wiki/Building-and-Uploading-the-Firmware) on how to upload to the ESP8266.
+More than **50** EMS devices are currently supported. See the [complete list](https://proddy.github.io/EMS-ESP/#/Supported-EMS-Devices).
## Compatible with bbqkees' EMS Gateway
-The firmware fully supports BBQKees' [EMS Gateway](https://shop.hotgoodies.nl/ems/) board with integrated Wemos D1 ESP8266.
+The firmware fully supports BBQKees' [EMS Gateway](https://bbqkees-electronics.nl/) board with integrated Wemos D1 ESP8266.
-|  |  |  |
+|  |  |  |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
diff --git a/doc/ems gateway/logo-proddy-fw.jpg b/doc/ems gateway/logo-proddy-fw.jpg
deleted file mode 100644
index 3f0d7c36fa4db310a889b899fe105afb64e6d61f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 23115
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
-
-Tabelle 1: Telegramm Übersicht
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
|
-
-
-
|
-
|
-
|
-
|
-
|
-
-
- | Datum: |
- 14.10.2016 |
-
|
-
|
-
|
-
-
- | Version: |
- 0.2.0 |
-
|
-
|
-
|
-
-
-
|
-
|
-
|
-
|
-
|
-
-
- | Message-ID |
- Telegramm(hex) |
- Beschreibung |
- Source-Werte (hex) |
- Bemerkung |
-
-
-
|
-
|
-
|
- (SO) |
-
|
-
-
- | 2 |
- SO TT 02 xy |
- Software-Version / Busteilnehmer |
- 88 |
- TT = <Target-/Token-Nr> |
-
-
- | 7 |
- SO 00 07 xy |
- Steuerung: EMS Token Status |
- 88 |
-
|
-
-
- | 6 |
- SO 00 06 xy |
- Datum / Zeit |
- 90 | 98 |
- Mit 14 und 17 Bytes Länge |
-
-
- | 190 |
- TT 00 BE xy |
- ErrorCode / DisplayCode von Target |
-
|
- TT = <Target-/Token-Nr> |
-
-
- | 24 |
- SO 00 18 xy |
- Heizgerät: Kesseldaten |
- 88 |
- Mit 31 und 33 Bytes Länge |
-
-
- | 25 |
- SO 00 19 xy |
- Heizgerät: Heizungsdaten |
- 88 |
-
|
-
-
- | 188 |
- SO 00 BC xy |
- Heizgerät: Hybrid (Wärmepumpe) |
-
|
-
|
-
-
- | 27 |
- SO 00 1B xy |
- Sollwert Warmwasser |
- 90 |
-
|
-
-
- | 51 |
- SO 00 33 xy |
- Warmwasser: Daten von Steuerung |
- 88 |
-
|
-
-
- | 52 |
- SO 00 34 xy |
- Warmwasser: Daten von Steuerung | IPM |
- 88 | Ax (x:=0...7) |
- Mit 22,23 und 25 Bytes Länge |
-
-
- | 467...468 |
- SO 00 FF xy 00 D3...D4 |
- Betriebsart WW-System |
- 90 |
-
|
-
-
- | 26 |
- SO 08 1A xy |
- Heizkreis: Systemwerte |
- 90 |
-
|
-
-
- | 268 |
- SO 00 FF xy 00 0C |
- Heizkreis: von IPM1/IPM2 für Mischer |
- Ax (x:=0...7) |
-
|
-
-
- | 296 |
- SO 00 FF xy 00 28 |
- Heizkreis: Fehlermeldungen |
- 90 |
-
|
-
-
- | 357...366 |
- SO 00 FF xy 00 65...6E |
- Heizkreis: Bauart1 |
- 90 |
-
|
-
-
- | 367...376 |
- SO 00 FF xy 00 6F...78 |
- Heizkreis: Temperaturniveau |
- 90 | 9x (x:=8...F) |
-
|
-
-
- | 377...386 |
- SO 00 FF xy 00 79...82 |
- Heizkreis: Bauart2 |
- 90 |
-
|
-
-
- | 677...684 |
- SO 00 FF xy 01 A5...AC |
- Heizkreis: Systemwerte |
- 90 | 98 |
- Cxyz-Controller (z.B. CW100) |
-
-
- | 259 |
- SO 00 FF xy 00 03 |
- Solar: Solardaten von ISM1 |
- B0 |
-
|
-
-
- | 260 |
- SO 00 FF xy 00 04 |
- Solar: Solardaten von ISM2 |
- B0 |
- Mit 24 und 35 Bytes Länge |
-
-
- | 866 |
- SO 00 FF xy 02 62 |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 868 |
- SO 00 FF xy 02 64 |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 873 |
- SO 00 FF xy 02 69 |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 874 |
- SO 00 FF xy 02 6A |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 910 |
- SO 00 FF xy 02 8E |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 913 |
- SO 00 FF xy 02 91 |
- Solar: Solardaten von MS100 |
- B0 |
- EMS2-Bus |
-
-
- | 357_14...366_14 |
- SO TA FF 0E 00 65...6E |
- Modem-CMD: Betriebsart setzen |
- 8D | C8 |
- TA = <Target-Nr> |
-
-
- | 377_4 ...386_4 |
- SO TA FF 04 00 79...82 |
- Modem-CMD: Betriebsart setzen |
- 8D | C8 |
- TA = <Target-Nr> |
-
-
- | 357_17...366_17 |
- SO TA FF 11 00 65...6E |
- Modem-CMD: Temp-Niveau setzen |
- 8D | C8 |
- TA = <Target-Nr> |
-
-
- | 377_7 ...386_7 |
- SO TA FF 07 00 79...82 |
- Modem-CMD: Temp-Niveau setzen |
- 8D | C8 |
- TA = <Target-Nr> |
-
-
-
|
-
|
-
|
-
|
-
|
-
-
- | 1: ( Hi-Byte * 256 + Lo-Byte ) / 10 |
-
|
- Calculation-Type: 1 |
-
-
- | 2: ( Byte3 * 65536 + Byte2 * 256 + Byte1 ) |
-
|
- Calculation-Type: 2 |
-
-
- | 3: ( Byte4 * 1048576 + Byte3 * 65536 + Byte2 * 256 + Byte1 ) |
-
|
- Calculation-Type: 3 |
-
-
- | 4: ( Type 3 ) / 10 |
-
|
- Calculation-Type: 4 |
-
-
- | 5: ( Type 3 ) / 1000 |
-
|
- Calculation-Type: 5 |
-
-
-
-
-Tabelle 2: ID 2
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
-
-
|
-
|
- Message-ID: 2_x_0 |
-
|
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
- Beispiel (Hex) |
-
-
-
|
- 16Byte |
-
|
-
|
-
|
-
-
-
|
-
|
- Telegramm: Software-Version / Busteilnehmer |
-
|
-
|
-
-
- | 0 |
- SO |
-
|
- Source |
- 88 |
-
-
- | 1 |
- TT |
- <Token-/Target-Nr> (Geräteadr. Ungleich 0) |
- Target |
- 18 |
-
-
- | 2 |
- 02 |
-
|
- 2_x_0 |
- 02 |
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...9). |
-
|
- 00 |
-
-
- | 4 |
- xy |
- Erste Erkennung Busteilnehmer |
- 2_0_0 |
- 5F |
-
-
-
|
-
|
- - 00 = Variantenerkennung in Betrieb oder fehlerhaft |
-
|
-
|
-
-
-
|
-
|
- ….. |
-
|
-
|
-
-
-
|
-
|
- - 5F = Heatronic III |
-
|
-
|
-
-
-
|
-
|
- - 64 = Schaltmodul IPM1 |
-
|
-
|
-
-
-
|
-
|
- - 65 = Solarmodul ISM1 |
-
|
-
|
-
-
-
|
-
|
- - 66 = Schaltmodul IPM2 |
-
|
-
|
-
-
-
|
-
|
- - 67 = Solarmodul ISM2 |
-
|
-
|
-
-
-
|
-
|
- - 67 = Solarmodul ISM2 |
-
|
-
|
-
-
-
|
-
|
- - 69 = Witterungsgeführter Regler FW100 |
-
|
-
|
-
-
-
|
-
|
- - 6A = Witterungsgeführter Regler FW200 |
-
|
-
|
-
-
-
|
-
|
- - 6B = Raumtemperaturregler FR100 |
-
|
-
|
-
-
-
|
-
|
- - 6C = Raumtemperaturregler FR110 |
-
|
-
|
-
-
-
|
-
|
- - 6D = Fernbedienung FB 10 |
-
|
-
|
-
-
-
|
-
|
- - 6E = Fernbedienung FB100 |
-
|
-
|
-
-
-
|
-
|
- - 6F = Raumtemperaturregler FR10 |
-
|
-
|
-
-
-
|
-
|
- ….. |
-
|
-
|
-
-
-
|
-
|
- - BD = KM200 |
-
|
-
|
-
-
-
|
-
|
- - BF = Raumtemperaturregler FR120 |
-
|
-
|
-
-
-
|
-
|
- - C0 = Witterungsgefuehrter Regler FW120 |
-
|
-
|
-
-
-
|
-
|
- ….. |
-
|
-
|
-
-
- | 5 |
- xy |
- Software-Familie |
- 2_1_0 |
- 22 |
-
-
- | 6 |
- xy |
- Version der Softwarefamilie |
- 2_2_0 |
- 04 |
-
-
- | 7 |
- xy |
- Zweite Erkennung Busteilnehmern |
- 2_3_0 |
- 00 |
-
-
- | 8 |
- xy |
- Kennzahl f. Grosse Änderung in HW- und SW |
- 2_4_0 |
- 00 |
-
-
- | 9 |
- xy |
- Kennzahl f. Kleine Änderung in HW- und SW |
- 2_5_0 |
- 00 |
-
-
- | 10 |
- xy |
- Dritte Erkennung Busteilnehmern |
- 2_6_0 |
- 00 |
-
-
- | 11 |
- xy |
- Kennzahl f. Kleine Änderung in HW- und SW |
- 2_7_0 |
- 00 |
-
-
- | 12 |
- xy |
- Kennzahl f. Grosse Änderung in HW- und SW |
- 2_8_0 |
- 00 |
-
-
- | 13 |
- xy |
- Markenidentifizierung |
- 2_9_0 |
- 00 |
-
-
-
|
-
|
- - 00 = keine Markenerkennung |
-
|
-
|
-
-
-
|
-
|
- - 01 = Bosch |
-
|
-
|
-
-
-
|
-
|
- - 02 = Junkers |
-
|
-
|
-
-
-
|
-
|
- - 03 = Buderus |
-
|
-
|
-
-
-
|
-
|
- ….. |
-
|
-
|
-
-
- | 14 |
- <CRC> |
- CRC |
-
|
- 63 |
-
-
- | 15 |
- <Ende> |
- Ende |
-
|
- 00 |
-
-
-
-
-Tabelle 3: ID 7
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID: 7_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 21Byte |
-
|
-
|
-
-
-
|
-
|
- EMS Token Status |
-
|
-
-
- | 0 |
- SO |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 07 |
-
|
- 7_x_y |
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...14). |
-
|
-
-
- | 4 |
- Bit0...Bit7 |
- EMS Token Status 8: EMS Master |
- 7_0_0 bis |
-
-
-
|
-
|
- - EMS Token Status 9 … 15 |
- 7_0_7 |
-
-
- | 5 |
- Bit0...Bit7 |
- EMS Token Status 16 … 23 |
- 7_1_0 bis |
-
-
-
|
-
|
-
|
- 7_1_7 |
-
-
- | 6 |
- Bit0...Bit7 |
- Busadresse 24 vorhanden |
- 7_2_0 bis |
-
-
-
|
-
|
- - EMS Token Status 25 … 31 |
- 7_2_7 |
-
-
- | 7 |
- Bit0...Bit7 |
- Busadresse 32:Mischerstellmotor im HK1 vorhanden |
- 7_3_0 bis |
-
-
-
|
-
|
- - EMS Token Status 33 … 39 |
- 7_3_7 |
-
-
- | 8 |
- Bit0...Bit7 |
- Busadresse 40:Warmwassersystem im HK1 vorhanden |
- 7_4_0 bis |
-
-
-
|
-
|
- - EMS Token Status 41 … 47 |
- 7_4_7 |
-
-
- | 9 |
- Bit0...Bit7 |
- Busadresse 48:Solarmodul vorhanden |
- 7_5_0 bis |
-
-
-
|
-
|
- - EMS Token Status 49 … 55 |
- 7_5_7 |
-
-
- | 10 |
- Bit0...Bit7 |
- Busadresse 56:Fernbedienung f. HK1 vorhanden |
- 7_6_0 bis |
-
-
-
|
-
|
- - EMS Token Status 57 … 63 |
- 7_6_7 |
-
-
- | 11 |
- Bit0...Bit7 |
- Busadresse 64:Temperaturfühler im HK1 vorhanden |
- 7_7_0 bis |
-
-
-
|
-
|
- - EMS Token Status 65 … 71 |
- 7_7_7 |
-
-
- | 12 |
- Bit0...Bit7 |
- Status für Busadresse 72...79 |
- 7_8_0 bis |
-
-
-
|
-
|
-
|
- 7_8_7 |
-
-
- | 13 |
- Bit0...Bit7 |
- EMS Token Status 80 … 87 |
- 7_9_0 bis |
-
-
-
|
-
|
-
|
- 7_9_7 |
-
-
- | 14 |
- Bit0...Bit7 |
- EMS Token Status 88 … 95 |
- 7_10_0 bis |
-
-
-
|
-
|
-
|
- 7_10_7 |
-
-
- | 15 |
- Bit0...Bit7 |
- EMS Token Status 96 … 103 |
- 7_11_0 bis |
-
-
-
|
-
|
-
|
- 7_11_7 |
-
-
- | 16 |
- Bit0...Bit7 |
- EMS Token Status 104 … 111 |
- 7_12_0 bis |
-
-
-
|
-
|
-
|
- 7_12_7 |
-
-
- | 17 |
- Bit0...Bit7 |
- EMS Token Status 112 … 119 (Cascaded EMS) |
- 7_13_0 bis |
-
-
-
|
-
|
-
|
- 7_13_7 |
-
-
- | 18 |
- Bit0...Bit7 |
- EMS Token Status 120 … 127 (Cascaded EMS) |
- 7_14_0 bis |
-
-
-
|
-
|
-
|
- 7_14_7 |
-
-
- | 19 |
- <CRC> |
- CRC |
-
|
-
-
- | 20 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 4: ID 6
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
-
|
- Message-ID:6_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 14Byte |
- 17Byte |
-
|
-
|
-
-
-
|
-
|
-
|
- Datum/Zeit – Telegramm |
-
|
-
-
- | 0 |
- 90 | 98 |
- 90 | 98 |
- Source :=90h oder :=98h |
- Source |
-
-
- | 1 |
- 00 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 06 |
- 06 |
-
|
- 6_x_y |
-
-
- | 3 |
- xy |
- xy |
- Telegramm-Offset (hier 0...6|10). |
-
|
-
-
- | 4 |
- xy |
- xy |
- Jahr (Wert + 2000)dez. |
- 6_0_0 |
-
-
- | 5 |
- xy |
- xy |
- Monat (01 … 12)dez. |
- 6_1_0 |
-
-
- | 6 |
- xy |
- xy |
- Stunden (00 … 23)dez. |
- 6_2_0 |
-
-
- | 7 |
- xy |
- xy |
- Tag (01 … 31)dez. |
- 6_3_0 |
-
-
- | 8 |
- xy |
- xy |
- Minute (00 … 59)dez. |
- 6_4_0 |
-
-
- | 9 |
- xy |
- xy |
- Sekunde (00 … 59)dez. |
- 6_5_0 |
-
-
- | 10 |
- xy |
- xy |
- Wochentag |
- 6_6_0 |
-
-
-
|
-
|
-
|
- 01=Montag; 02=Dienstag;... für Fxyz – Regler |
-
|
-
-
-
|
-
|
-
|
- 00=Montag; 01=Dienstag;... für Cxyz – Regler |
-
|
-
-
- | 11 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Uhrstatus |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Sommerzeit |
- 6_7_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Funkempfang vorhanden |
- 6_7_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - Funksignal vorhanden |
- 6_7_2 |
-
-
-
|
- Bit3...Bit7 |
- Bit3...Bit7 |
- - Immer 0 |
-
|
-
-
- | 12 |
- <CRC> |
- xy |
- Token-Adresse des aktuellen RTC-Owner |
- 6_8_0 |
-
-
- | 13 |
- <Ende> |
- xy |
- Automatische Sommer/Winter Umschaltung |
- 6_9_0 |
-
-
- | 14 |
-
|
- xy |
- RTC Benutzer Kalibierungswert |
- 6_10_0 |
-
-
- | 15 |
-
|
- <CRC> |
-
|
-
|
-
-
- | 16 |
-
|
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 5: ID 190
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID: 190_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 11Byte |
-
|
-
|
-
-
-
|
-
|
- ErrorCode von Target-/Token |
-
|
-
-
- | 0 |
- TT |
- Target-/Token Nummer |
- Source |
-
-
- | 1 |
- 00 |
- - 00 = An Alle |
- Target |
-
-
- | 2 |
- BE |
-
|
- 190_x_0 |
-
-
- | 3 |
- 00 |
- Immer 0 |
-
|
-
-
- | 4 |
- xy |
- Bus-Adresse des Fehlercodes |
- 190_0_0 |
-
-
- | 5 |
- Hi-Byte |
- Displaycode |
- 190_1_0 |
-
-
- | 6 |
- Lo-Byte |
-
-
- | 7 |
- Hi-Byte |
- Cause Code |
- 190_3_0 |
-
-
- | 8 |
- Lo-Byte |
-
-
- | 9 |
- <CRC> |
- CRC |
-
|
-
-
- | 10 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 6: ID 24
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
-
|
- Message-ID:24_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 31Byte |
- 33Byte |
-
|
-
|
-
-
-
|
-
|
-
|
- Kessel-Telegramm: Heizgerät |
-
|
-
-
- | 0 |
- 88 |
- 88 |
-
|
- Source |
-
-
- | 1 |
- 00 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 18 |
- 18 |
-
|
- 24_x_y |
-
-
- | 3 |
- xy |
- xy |
- Telegramm-Offset (hier 0...25). |
-
|
-
-
- | 4 |
- xy |
- xy |
- Vorlauf Soll-Temperatur |
- 24_0_0 |
-
-
- | 5 |
- Hi-Byte |
- Hi-Byte |
- Vorlauf Ist-Temperatur |
- 24_1_0 |
-
-
- | 6 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 7 |
- xy |
- xy |
- Kessel maximale Leistung (76/84/100; 100)% |
- 24_3_0 |
-
-
- | 8 |
- 0-100 |
- 0-100 |
- Aktuelle Brennerleistung in % |
- 24_4_0 |
-
-
- | 9 |
- Bit0...Bit7 |
- Bitfeld |
- Betriebsmode |
-
|
-
-
-
|
- Bit0 |
- Bit1 |
- - Heizungs-Mode |
- 24_5_0 |
-
-
-
|
- Bit1 |
- Bit2 |
- - Warmwasser-Mode |
- 24_5_1 |
-
-
-
|
- Bit2 |
- Bit3:=0 |
- - Status Servicebetrieb |
- 24_5_2 |
-
-
-
|
- Bit3 |
- Bit4 |
- - Brennerflamme an |
- 24_5_3 |
-
-
-
|
- Bit4 |
- Bit5:=0 |
- - Aufheizphase des Wärmeerzeugers |
- 24_5_4 |
-
-
-
|
- Bit5 |
- Bit6:=0 |
- - Verriegelnder Fehler |
- 24_5_5 |
-
-
-
|
- Bit6 |
- Bit7:=0 |
- - Blockierender Fehler |
- 24_5_6 |
-
-
-
|
- Bit7 |
- Bit8:=0 |
- - Status Wartungsanforderung |
- 24_5_7 |
-
-
- | 10 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Status Heizbetrieb |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Heizbetrieb im Bussystem |
- 24_6_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Wärmeanforderung (durch Schalter) |
- 24_6_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - Wärmeanforderung bei Betriebsart: Frost |
- 24_6_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- - Wärmeanforderung im WW-Betrieb bei Betriebsart: Frost |
- 24_6_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- - Interne Wärmeanforderung bei WW |
- 24_6_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- - Wärmeanforderung f. WW-Erkennung im Bussystem |
- 24_6_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- - Wärmeanforderung |
- 24_6_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- - Wärmeanforderung im Testmodus |
- 24_6_7 |
-
-
- | 11 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Betriebs-Status |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Brenner an (Relais-Signal erste Brennstufe) |
- 24_7_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Brenner an (Relais-Signal zweite Brennstufe) |
- 24_7_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - Lüfter an (Relais-Signal f. Lüfter) |
- 24_7_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- - Zündung an (Relais-Signal f. Zündung) |
- 24_7_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- - Ölvorwärmer an (Relais-Signal f. Ölvorwärmer) |
- 24_7_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- - Heizungspumpe an (Relais-Signal f. HP) |
- 24_7_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- - 3-Wege-Ventil auf Speicherladung |
- 24_7_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- - Zirkulationspumpe an (Relais-Signal f. ZP) |
- 24_7_7 |
-
-
- | 12 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Status 1 |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Meldesignal Abgasklappe f. Freigabe Ölbrenner |
- 24_8_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Signal vom Luftdruckschalter |
- 24_8_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - Signal vom Flüssiggasbrenner |
- 24_8_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- - Signal vom Gasdruckwächter |
- 24_8_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- - Signal vom externen Ein-/Aus-Schalter |
- 24_8_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- - Digitales Eingangssignal |
- 24_8_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- - Signal vom Sicherheitstemperaturbegrenzer (TB) |
- 24_8_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- - Signal vom Raumthermostat |
- 24_8_7 |
-
-
- | 13 |
- Hi-Byte |
- Hi-Byte |
- WW-Temperatur Speicherfühler1 |
- 24_9_0 |
-
-
- | 14 |
- Lo-Byte |
- Lo-Byte |
- - (0x8300 := Nicht vorhanden) |
-
-
- | 15 |
- Hi-Byte |
- Hi-Byte |
- WW-Temperatur Speicherfühler2 |
- 24_11_0 |
-
-
- | 16 |
- Lo-Byte |
- Lo-Byte |
- - (0x8000 | 0x7D00 := Nicht vorhanden) |
-
-
- | 17 |
- Hi-Byte |
- Hi-Byte |
- Temperatur Kessel-Rücklauf |
- 24_13_0 |
-
-
- | 18 |
- Lo-Byte |
- Lo-Byte |
- - (0x8000 | 0x7D00 := Nicht vorhanden) |
-
-
- | 19 |
- Hi-Byte |
- Hi-Byte |
- Ionisationsstrom |
- 24_15_0 |
-
-
- | 20 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 21 |
- FF |
- FF |
- Anlagendruck am Wärmeerzeuger |
- 24_17_0 |
-
-
-
|
-
|
-
|
- - (FF := ungültig) |
-
|
-
-
- | 22 |
- Hi-Byte |
- Hi-Byte |
- Displaycode |
- 24_18_0 |
-
-
- | 23 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 24 |
- Hi-Byte |
- Hi-Byte |
- Cause Code |
- 24_20_0 |
-
-
- | 25 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 26 |
- 00 |
- FF |
- Warmwasserdurchfluss-Menge |
- 24_22_0 |
-
-
-
|
-
|
-
|
- - (FF := ungültig) |
-
-
- | 27 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Status 2 |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Status Speicherlade-Pumpe (SP) |
- 24_23_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Flüssiggasventil an |
- 24_23_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - Status Gaswärmepumpe |
- 24_23_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- - Status d. Relais im Schaltmodul UM10 |
- 24_23_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- - Zirkulationspumpe an (Relais-Signal f. ZP) |
- 24_23_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- - Status Brenner Relais |
- 24_23_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- - FB reservierte Bit |
- 24_23_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- - FB reservierte Bit |
- 24_23_7 |
-
-
- | 28 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Status 3 |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- - Status der Füllfunktion |
- 24_24_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- - Status Schaltmodul UM10 |
- 24_24_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- - UM10 Signal für Brenner-Blockierung |
- 24_24_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- - Brennerfreigabe durch Schaltmodul |
- 24_24_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- - Status Brenneranlauf im Schaltmodul |
- 24_24_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- - Heizbetrieb blockiert bei Heatronic III |
- 24_24_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- - STB – Test aktiv |
- 24_24_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- - Tastensperre ein |
- 24_24_7 |
-
-
- | 29 |
- <CRC> |
- Hi-Byte |
- CRC | Hi-Byte - Ansauglufttemperatur |
- xy | 24_25_0 |
-
-
- | 30 |
- <Ende> |
- Lo-Byte |
- Ende | Lo-Byte - Ansauglufttemperatur |
-
|
-
-
- | 31 |
- – |
- <CRC> |
- -– | CRC |
-
|
-
-
- | 32 |
- – |
- <Ende> |
- –- | Ende |
-
|
-
-
-
-
-Tabelle 7: ID 25
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:25_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 33Byte |
-
|
-
|
-
-
-
|
-
|
- Kessel-Telegramm: Heizgerät |
-
|
-
-
- | 0 |
- 88 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 19 |
-
|
- 25_x_0 |
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...25). |
-
|
-
-
- | 4 |
- Hi-Byte |
- Außentemperatur |
- 25_0_0 |
-
-
- | 5 |
- Lo-Byte |
-
-
- | 6 |
- Hi-Byte |
- Maximale Temperatur |
- 25_2_0 |
-
-
- | 7 |
- Lo-Byte |
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 8 |
- Hi-Byte |
- Abgastemperatur |
- 25_4_0 |
-
-
- | 9 |
- Lo-Byte |
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 10 |
- Hi-Byte |
- Gasdruck / Luftdruck |
- 25_6_0 |
-
-
- | 11 |
- Lo-Byte |
- - 0xFFFF = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
- | 12 |
- xy |
- Taktsperre im Zweipunkt Betrieb |
- 25_8_0 |
-
-
- | 13 |
- xy |
- Modulationsbereich Heizungspumpe (HP) |
- 25_9_0 |
-
-
- | 14 |
- Byte 3 |
- Brennerstarts Total (für Warmwasser und Heizung) |
- 25_10_0 |
-
-
- | 15 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 16 |
- Byte 1 |
- „ |
-
-
- | 17 |
- Byte 3 |
- Betriebsminuten Brenner Total (für Warmwasser und Heizung) |
- 25_13_0 |
-
-
- | 18 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 19 |
- Byte 1 |
- „ |
-
-
- | 20 |
- Byte 3 |
- Betriebszeit f. Zweite Brennerstufe |
- 25_16_0 |
-
-
- | 21 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 22 |
- Byte 1 |
- „ |
-
-
- | 23 |
- Byte 3 |
- Betriebsminuten Brenner (nur Heizung) |
- 25_19_0 |
-
-
- | 24 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 25 |
- Byte 1 |
- „ |
-
-
- | 26 |
- Byte 3 |
- Brennerstarts (nur Heizung) |
- 25_22_0 |
-
-
- | 27 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 28 |
- Byte 1 |
- „ |
-
-
- | 29 |
- Hi-Byte |
- Temperatur an hydraulischer Weiche |
- 25_25_0 |
-
-
- | 30 |
- Lo-Byte |
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 31 |
- <CRC> |
- CRC |
-
|
-
-
- | 32 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 8: ID 188
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:188_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- Kessel-Telegramm: Heizgerät |
-
|
-
-
- | 0 |
- 88 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- BC |
-
|
- 188_x_y |
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...13). |
-
|
-
-
- | 4 |
- Hi-Byte |
- Temperatur Puffer-Speicher oben |
- 188_0_0 |
-
-
- | 5 |
- Lo-Byte |
-
-
- | 6 |
- Hi-Byte |
- Temperatur Puffer-Speicher unten |
- 188_2_0 |
-
-
- | 7 |
- Lo-Byte |
-
-
- | 8 |
- Hi-Byte |
- Temperatur Vorlauf Verflüssiger |
- 188_4_0 |
-
-
- | 9 |
- Lo-Byte |
-
-
- | 10 |
- Hi-Byte |
- Temperatur Rücklauf Verflüssiger |
- 188_6_0 |
-
-
- | 11 |
- Lo-Byte |
-
-
- | 12 |
- Bit0...Bit7 |
- Betriebs-Status1 |
-
|
-
-
-
|
- Bit0 |
- - Wärmepumpe |
- 188_8_0 |
-
-
-
|
- Bit1 |
-
|
- 188_8_1 |
-
-
-
|
- Bit2 |
-
|
- 188_8_2 |
-
-
-
|
- Bit3 |
-
|
- 188_8_3 |
-
-
-
|
- Bit4 |
- - Status Abtaumöglichkeit an W-Pumpe |
- 188_8_4 |
-
-
-
|
- Bit5 |
-
|
- 188_8_5 |
-
-
-
|
- Bit6 |
-
|
- 188_8_6 |
-
-
-
|
- Bit7 |
-
|
- 188_8_7 |
-
-
- | 13 |
- Bit0...Bit7 |
- Betriebs-Status2 |
-
|
-
-
-
|
- Bit0 |
- - Abtaufunktion an W-Pumpe |
- 188_9_0 |
-
-
-
|
- Bit1 |
- - Status Verdichter |
- 188_9_1 |
-
-
-
|
- Bit2 |
- - Fehlerstatus Wärmepumpe |
- 188_9_2 |
-
-
-
|
- Bit3 |
-
|
- 188_9_3 |
-
-
-
|
- Bit4 |
-
|
- 188_9_4 |
-
-
-
|
- Bit5 |
-
|
- 188_9_5 |
-
-
-
|
- Bit6 |
-
|
- 188_9_6 |
-
-
-
|
- Bit7 |
-
|
- 188_9_7 |
-
-
- | 14 |
- <CRC> |
- CRC |
-
|
-
-
- | 15 |
- <Ende> |
- Ende |
-
|
-
-
-
-
-Tabelle 9: ID 27
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:27_0_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 7Byte |
-
|
-
|
-
-
-
|
-
|
- Telegramm: Solltemperatur WW-System |
-
|
-
-
- | 0 |
- 90 |
- |
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 1B |
-
|
- 27_x_0 |
-
-
- | 3 |
- 00 |
- Immer 00 |
-
|
-
-
- | 4 |
- 32 |
- Sollwert Warmwasser-Temperatur |
- 27_0_0 |
-
-
- | 5 |
- <CRC> |
- CRC |
-
|
-
-
- | 6 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 10: ID 51
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID: 51_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- Kessel-Telegramm: Warmwasser |
-
|
-
-
- | 0 |
- 88 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 33 |
-
|
- 51_x_y |
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...12). |
-
|
-
-
- | 4 |
- xy |
- Soll-Temperatur Warmwasser |
- 51_0_0 |
-
-
- | 5 |
- xy |
-
|
- 51_1_0 |
-
-
- | 6 |
- xy |
- Soll-Temperatur Warmwasser |
- 51_2_0 |
-
-
- | 7 |
- xy |
- Temperaturhysterese bei T-Soll |
- 51_3_0 |
-
-
- | 8 |
- xy |
-
|
- 51_4_0 |
-
-
- | 9 |
- xy |
-
|
- 51_5_0 |
-
-
- | 10 |
- xy |
-
|
- 51_6_0 |
-
-
- | 11 |
- xy |
-
|
- 51_7_0 |
-
-
- | 12 |
- xy |
-
|
- 51_8_0 |
-
-
- | 13 |
- xy |
-
|
- 51_9_0 |
-
-
- | 14 |
- xy |
-
|
- 51_10_0 |
-
-
- | 15 |
- xy |
-
|
- 51_11_0 |
-
-
- | 16 |
- xy |
-
|
- 51_12_0 |
-
-
- | 17 |
- <CRC> |
-
|
-
|
-
-
- | 18 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 11: ID 52
-
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
|
-
-
-
|
-
|
-
|
-
|
- Message-ID: 52_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 23Byte |
- 22Byte |
- 25Byte |
-
|
-
|
-
-
-
|
-
|
-
|
-
|
- Kessel-Telegramm: Warmwasser |
-
|
-
-
- | 0 |
- 88 |
- 88 |
- 88 |
-
|
- Source |
-
-
- | 1 |
- 00 |
- 00 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- 34 |
- 34 |
- 34 |
-
|
- 52_x_y |
-
-
- | 3 |
- xy |
- xy |
- xy |
- Telegramm-Offset (hier 0...17). |
-
|
-
-
- | 4 |
- xy |
- xy |
- xy |
- Soll-Temperatur Warmwasser |
- 52_0_0 |
-
-
- | 5 |
- Hi-Byte |
- Hi-Byte |
- Hi-Byte |
- Ist-Temperatur Warmwasser |
- 52_1_0 |
-
-
- | 6 |
- Lo-Byte |
- Lo-Byte |
- Lo-Byte |
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
-
|
-
|
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 7 |
- Hi-Byte |
- Hi-Byte |
- Hi-Byte |
- Ist-Temperatur im Warmwasser - Speicher |
- 52_3_0 |
-
-
- | 8 |
- Lo-Byte |
- Lo-Byte |
- Lo-Byte |
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
-
-
|
-
|
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 9 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Warmwasser-Status |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- Bit0 |
- - WW-Bereitung im Normalbetrieb |
- 52_5_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- Bit1 |
- - Einmalige Speicher-Ladung |
- 52_5_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- Bit2 |
- - Thermische Desinfektion |
- 52_5_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- Bit3 |
- - Speicherladung im WW-System |
- 52_5_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- Bit4 |
- - Speicherladung im Nachwärmsystem |
- 52_5_4 |
-
-
-
|
- Bit5 |
- Bit5 |
- Bit5 |
- - Erreichter Sollwert Warmwasser-Temperatur |
- 52_5_5 |
-
-
-
|
- Bit6 |
- Bit6 |
- Bit6 |
- - Warmwasserbetrieb |
- 52_5_6 |
-
-
-
|
- Bit7 |
- Bit7 |
- Bit7 |
- - Status f. Art der Warmwasserbereitung |
- 52_5_7 |
-
-
-
|
-
|
-
|
-
|
- -- 0 = Warmwasserteilvorrang |
-
|
-
-
-
|
-
|
-
|
-
|
- -- 1 = Warmwasservorrang |
-
|
-
-
- | 10 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- WW-Fehlersignale |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- Bit0 |
- - WW-Temperaturfühler 1 defekt |
- 52_6_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- Bit1 |
- - WW-Temperaturfühler 2 defekt |
- 52_6_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- Bit2 |
- - WW-System wird nicht aufgeheizt |
- 52_6_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- Bit3 |
- - Thermische Desinfektion ist nicht in Betrieb |
- 52_6_3 |
-
-
-
|
- Bit4 |
- Bit4 |
- Bit4 |
- - WW ist nicht blockiert |
- 52_6_4 |
-
-
-
|
- Bit5...Bit7 |
- Bit5...Bit7 |
- Bit5...Bit7 |
- - Immer 0 |
- 52_6_5 bis |
-
-
-
|
-
|
-
|
-
|
-
|
- 52_6_7 |
-
-
- | 11 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Bit0...Bit7 |
- Zirkulationspumpen-Status |
-
|
-
-
-
|
- Bit0 |
- Bit0 |
- Bit0 |
- - Zirkulationspumpe (ZP) im Normalbetrieb |
- 52_7_0 |
-
-
-
|
- Bit1 |
- Bit1 |
- Bit1 |
- - Zirkulationspumpe (ZP) an bei einmaliger Speicherladung |
- 52_7_1 |
-
-
-
|
- Bit2 |
- Bit2 |
- Bit2 |
- - Zirkulationspumpe (ZP) an |
- 52_7_2 |
-
-
-
|
- Bit3 |
- Bit3 |
- Bit3 |
- - Ansteuersignal f. Zirkulationspumpe (ZP) |
- 52_7_3 |
-
-
-
|
- Bit4...Bit7 |
- Bit4...Bit7 |
- Bit4...Bit7 |
- - Immer 0 |
-
|
-
-
- | 12 |
- 0...4 |
- 0...4 |
- 0...4 |
- Bauart des Warmwassersystems |
- 52_8_0 |
-
-
-
|
-
|
-
|
-
|
- - 0 = ohne Warmwasserbereitung |
-
|
-
-
-
|
-
|
-
|
-
|
- - 1 = nach Durchlaufprinzip |
-
|
-
-
-
|
-
|
-
|
-
|
- - 2 = Druckloser Speicher |
-
|
-
-
-
|
-
|
-
|
-
|
- - 3 = Warmwasser-Speicherprinzip |
-
|
-
-
-
|
-
|
-
|
-
|
- - 4 = Schichtlade-Speicher |
-
|
-
-
- | 13 |
- xy |
- xy |
- xy |
- Aktuelle Wasserduchflussmenge |
- 52_9_0 |
-
-
- | 14 |
- Byte 3 |
- Byte 3 |
- Byte 3 |
- Betriebszeit Warmwasser-Erzeugung (Minuten) |
- 52_10_0 |
-
-
- | 15 |
- Byte 2 |
- Byte 2 |
- Byte 2 |
-
-
- | 16 |
- Byte 1 |
- Byte 1 |
- Byte 1 |
-
-
- | 17 |
- Byte 3 |
- Byte 3 |
- Byte 3 |
- Anzahl Brennerstarts für Warmwassererzeugung |
- 52_13_0 |
-
-
- | 18 |
- Byte 2 |
- Byte 2 |
- Byte 2 |
-
-
- | 19 |
- Byte 1 |
- Byte 1 |
- Byte 1 |
-
-
- | 20 |
- xy |
- <CRC> |
- xy |
- Modulationsbereich ZP im WW-System 1 |
- 52_16_0 |
-
-
- | 21 |
- <CRC> |
- <Ende> |
- Hi-Byte |
- Hi-Byte Warmwasser Eingangstemperatur |
- 52_17_0 |
-
-
- | 22 |
- <Ende> |
- -- |
- Lo-Byte |
- Lo-Byte Warmwasser Eingangstemperatur |
-
|
-
-
-
|
-
|
-
|
-
|
- - 0x8000 = Sensorunterbrechung / Fühler nicht vorhanden |
-
|
-
-
-
|
-
|
-
|
-
|
- - 0x7FFF = Sensorkurzschluss |
-
|
-
-
- | 23 |
-
|
-
|
- <CRC> |
-
|
-
|
-
-
- | 24 |
-
|
-
|
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 12: ID 467...468
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:467_x_0 bis 468_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 11Byte |
-
|
-
|
-
-
-
|
-
|
- Telegramm: Betriebsart WW-System |
-
|
-
-
- | 0 |
- 90 |
- |
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- D3 / D4 |
- WW-System |
-
|
-
-
-
|
-
|
- - D3=WW-System1 |
- 467_0_0 |
-
-
-
|
-
|
- - D4=WW-System2 |
- 468_0_0 |
-
-
- | 6 |
- xy |
- Betriebsart Warmwasser-System |
-
|
-
-
-
|
-
|
- - 0=Automatikbetrieb f. WW-Speicher |
-
|
-
-
-
|
-
|
- - 1=Automatikbetrieb b. Kombigerät aktiv |
-
|
-
-
-
|
-
|
- - 2=Automatikbetrieb b. Kombigerät ausgeschaltet |
-
|
-
-
-
|
-
|
- - 3=Automatikbetrieb i. Urlaubsmodus f. WW-Speicher |
-
|
-
-
-
|
-
|
- - 4=Urlaubsfunktion eingeschaltet a. Kombigerät |
-
|
-
-
-
|
-
|
- - 5=Urlaubsfunktion ausgeschaltet a. Kombigerät |
-
|
-
-
-
|
-
|
- - 6=Fest eingestellte Speichertemperatur im Urlaubsprogramm |
-
|
-
-
-
|
-
|
- - 7=Thermische Desinfektion f. WW-Speicher |
-
|
-
-
-
|
-
|
- - 8=Warmwasser sofort |
-
|
-
-
-
|
-
|
- - 9=Estrichtrocknung in Betrieb oder angehalten |
-
|
-
-
- | 7 |
- xy |
- Wert f. Temperaturreduzierung bei solarer Unterstuetzung |
- 467_1_0 bis 468_1_0 |
-
-
- | 8 |
- xy |
- Status der letzten thermischen Desinfektion |
- 467_2_0 bis 468_2_0 |
-
-
-
|
-
|
- - 0=Abgeschlossen |
-
|
-
-
-
|
-
|
- - 1=In Betrieb |
-
|
-
-
-
|
-
|
- - 2=Abgebrochen |
-
|
-
-
- | 9 |
- <CRC> |
- CRC |
-
|
-
-
- | 10 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 13: ID 26
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
-
-
|
-
|
- Message-ID:26_x_0 |
-
|
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
- Beispiel (Hex) |
-
-
-
|
- 11Byte |
-
|
-
|
-
|
-
-
-
|
-
|
- Telegramm: Heizkreis Systemwerte |
-
|
-
|
-
-
- | 0 |
- 90 |
-
|
- Source |
-
|
-
-
- | 1 |
- 08 |
- Target = Steuerung |
- Target |
-
|
-
-
- | 2 |
- 1A |
- Immer 1A |
- 26_x_0 |
-
|
-
-
- | 3 |
- xy |
- Telegramm-Offset (hier 0...4). |
-
|
-
|
-
-
- | 4 |
- 26 |
- Sollwert f. Vorlauftemperatur im Heizkreis |
- 26_0_0 |
-
|
-
-
- | 5 |
- 64 |
- Maximale Leistung des Wärmeerzeugers |
- 26_1_0 |
-
|
-
-
- | 6 |
- 64 |
- Sollwert f. Drehzahl der Umwälzpumpe |
- 26_2_0 |
-
|
-
-
- | 7 |
- 0 / FF |
- Status f. Aufheizen mit hohem Wirkungsgrad |
- 26_3_0 |
-
|
-
-
- | 8 |
- 3 |
- Betriebsart f. Umwälzpumpe im Energiesparmodus |
- 26_4_0 |
-
|
-
-
- | 9 |
- <CRC> |
- CRC |
-
|
-
|
-
-
- | 10 |
- <Ende> |
- Ende Marker |
-
|
-
|
-
-
-
-
-Tabelle 14: ID 268
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:268_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 14Byte |
-
|
-
|
-
-
-
|
-
|
- IPM – Telegramm (Schaltmodul) |
-
|
-
-
- | 0 |
- A0...A7 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 0C |
- Immer 0C |
- EMS Type(L) |
-
-
- | 6 |
- 0...2 |
- Bauart des Heizkreises (Mischer ja/nein) |
-
|
-
-
-
|
-
|
- - 0=Nicht vorhanden |
-
|
-
-
-
|
-
|
- - 1=Ungemischter Heizkreis |
- 268_0_0 |
-
-
-
|
-
|
- - 2=Gemischter Heizkreis |
- 268_0_1 |
-
-
- | 7 |
- 0...1 |
- Status Heizungspumpe im Heizkreis |
- 268_1_0 |
-
-
-
|
-
|
- - 0=Pumpe aus |
-
|
-
-
-
|
-
|
- - 1=Pumpe Ein |
-
|
-
-
- | 8 |
- xy |
- Mischer Position (Prozentwert) |
- 268_2_0 |
-
-
- | 9 |
- Hi-Byte |
- Vorlauftemperatur 'Ist' für gemischten Heizkreis |
- 268_3_0 |
-
-
- | 10 |
- Lo-Byte |
-
-
- | 11 |
- xy |
- Sollwert Vorlauftemperatur (Grad) |
- 268_5_0 |
-
-
- | 12 |
- <CRC> |
- CRC |
-
|
-
-
- | 13 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 15: ID 296
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:296_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 32Byte |
-
|
-
|
-
-
-
|
-
|
- Telegramm: Heizkreis Fehlermeldungen |
-
|
-
-
- | 0 |
- 90 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
- Offset auf nächste Fehlermeldung |
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 28 |
- Fehler |
- EMS Type(L) |
-
-
- | 6 |
- xy1 |
- Fehler1: Display-Code1 |
- 296_0_0 |
-
-
- | 7 |
- xy2 |
- Fehler1: Display-Code2 |
- 296_1_0 |
-
-
- | 8 |
- Hi-Byte |
- Fehler1: Fehlercode |
- 296_2_0 |
-
-
- | 9 |
- Lo-Byte |
-
|
-
|
-
-
- | 10 |
- xy |
- Fehler1: Jahr (+2000) |
- 296_4_0 |
-
-
- | 11 |
- xy |
- Fehler1: Monat |
- 296_5_0 |
-
-
- | 12 |
- xy |
- Fehler1: Stunde |
- 296_6_0 |
-
-
- | 13 |
- xy |
- Fehler1: Tag |
- 296_7_0 |
-
-
- | 14 |
- xy |
- Fehler1: Minute |
- 296_8_0 |
-
-
- | 15 |
- Hi-Byte |
- Fehler1: Minute (Reserviert) |
- 296_9_0 |
-
-
- | 16 |
- Lo-Byte |
-
|
-
|
-
-
- | 17 |
- xy |
- Fehler1: Busadresse |
- 296_11_0 |
-
-
- | 18 |
- xy1 |
- Fehler2: Display-Code1 |
- 296_12_0 |
-
-
- | 19 |
- xy2 |
- Fehler2: Display-Code2 |
- 296_13_0 |
-
-
- | 20 |
- Hi-Byte |
- Fehler2: Fehlercode |
- 296_14_0 |
-
-
- | 21 |
- Lo-Byte |
-
|
-
|
-
-
- | 22 |
- xy |
- Fehler2: Jahr (+2000) |
- 296_16_0 |
-
-
- | 23 |
- xy |
- Fehler2: Monat |
- 296_17_0 |
-
-
- | 24 |
- xy |
- Fehler2: Stunde |
- 296_18_0 |
-
-
- | 25 |
- xy |
- Fehler2: Tag |
- 296_19_0 |
-
-
- | 26 |
- xy |
- Fehler2: Minute |
- 296_20_0 |
-
-
- | 27 |
- Hi-Byte |
- Fehler2: Minute (Reserviert) |
- 296_21_0 |
-
-
- | 28 |
- Lo-Byte |
-
|
-
|
-
-
- | 29 |
- xy |
- Fehler2: Busadresse |
- 296_23_0 |
-
-
- | 30 |
- <CRC> |
- CRC |
-
|
-
-
- | 31 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 16: ID 357...366
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:357_x_0 bis 366_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 29Byte |
-
|
-
|
-
-
-
|
-
|
- Telegramm: Heizkreis Steuerung |
-
|
-
-
-
|
-
|
- (Bauart des Heizkreises) |
-
|
-
-
- | 0 |
- 90 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 65...6E |
- Heizkreis x |
- EMS Type(L) |
-
-
-
|
- 65 |
- 65=Heizkreis1 |
- 357_0_0 |
-
-
-
|
- 66 |
- 66=Heizkreis2 |
- 358_0_0 |
-
-
-
|
- 67 |
- 67=Heizkreis3 |
- 359_0_0 |
-
-
-
|
- 68 |
- 68=Heizkreis4 |
- 360_0_0 |
-
-
-
|
- 69 |
- 69=Heizkreis5 |
- 361_0_0 |
-
-
-
|
- 6A |
- 6A=Heizkreis6 |
- 362_0_0 |
-
-
-
|
- 6B |
- 6B=Heizkreis7 |
- 363_0_0 |
-
-
-
|
- 6C |
- 6C=Heizkreis8 |
- 364_0_0 |
-
-
-
|
- 6D |
- 6D=Heizkreis9 |
- 365_0_0 |
-
-
-
|
- 6E |
- 6E=Heizkreis10 |
- 366_0_0 |
-
-
- | 6 |
- 0...3 |
- Bauart-Werte |
- 357_1_0 bis |
-
-
-
|
-
|
- - 0=Nicht vorhanden |
- 366_1_0 |
-
-
-
|
-
|
- - 1=Ungemischter Heizkreis ohne Schaltmodul IPM |
-
|
-
-
-
|
-
|
- - 2=Ungemischter Heizkreis mit Schaltmodul IPM |
-
|
-
-
-
|
-
|
- - 3=Gemischter Heizkreis |
-
|
-
-
- | 7 |
- 0...2 |
- Fernbedienung für Heizkreis x |
-
|
-
-
-
|
-
|
- - 0=Nicht vorhanden |
-
|
-
-
-
|
-
|
- - 1=Fernbedienung FB 10 |
-
|
-
-
-
|
-
|
- - 2=Fernbedienung FB100 |
-
|
-
-
- | 8 |
- 0...4 |
- Bauart des Heizkreis x |
-
|
-
-
-
|
-
|
- - 0=nicht definiert |
- 357_2_0 bis |
-
-
-
|
-
|
- - 1=Fußpunkt/Endpunkt |
- 366_2_0 |
-
-
-
|
-
|
- - 2=Radiatoren |
-
|
-
-
-
|
-
|
- - 3=Konvektoren |
-
|
-
-
-
|
-
|
- - 4=Fußbodenheizung |
-
|
-
-
- | 9 |
- z.B. 19 |
- Fußpunkt für Heizkurve (in Grad) |
- 357_3_0 bis |
-
-
-
|
-
|
-
|
- 366_3_0 |
-
-
- | 10 |
- z.B. 30 |
- Endpunkt für Heizkurve (in Grad) |
- 357_4_0 bis |
-
-
-
|
-
|
-
|
- 366_4_0 |
-
-
- | 11 |
- z.B. 50 |
- Maximale Vorlauftemperatur (in Grad) für Heizkreis x |
- 357_5_0 bis |
-
-
-
|
-
|
-
|
- 366_5_0 |
-
-
- | 12 |
-
|
- Raumeinfluss-Faktor (%) im Heizkreis x |
- 357_6_0 bis |
-
-
-
|
-
|
-
|
- 366_6_0 |
-
-
- | 13 |
- 0...2 |
- Raumeinfluss im Heizkreis x bei Betriebsart |
- 357_7_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_7_0 |
-
-
-
|
-
|
- - 1=Normalbetrieb / Sparbetrieb / Frostschutzbetrieb |
-
|
-
-
-
|
-
|
- - 2=Sparbetrieb / Frostschutzbetrieb |
-
|
-
-
- | 14 |
-
|
- Einstellung dauerhafte Raumtemperatur-Korrektur im Heizkreis x |
- 357_8_0 bis |
-
-
-
|
-
|
-
|
- 366_8_0 |
-
-
- | 15 |
- 0...3 |
- Betriebsart Raumtemperaturfühler für Heizkreis x |
- 357_9_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_9_0 |
-
-
-
|
-
|
- - 1=Externer Temperaturfühler |
-
|
-
-
-
|
-
|
- - 2=Interner Temperaturfühler |
-
|
-
-
-
|
-
|
- - 3=Temperatur im Sparmodus |
-
|
-
-
-
|
-
|
-
|
-
|
-
-
- | 16 |
- 0/FF |
- Status für Temperaturniveau Frost |
- 357_10_0 bis |
-
-
-
|
-
|
- - 0 = Aus |
- 366_10_0 |
-
-
-
|
-
|
- - FF = Ein |
-
|
-
-
- | 17 |
- z.B. 2B |
- Abschaltung (Außentemperaturgesteuert) von Heizkreis x |
- 357_11_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_11_0 |
-
-
- | 18 |
-
|
- Frostgrenztemperatur für Heizkreis x |
- 357_12_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_12_0 |
-
-
- | 19 |
- 0...6 |
- Aktives Heizprogramm im Heizkreis x |
- 357_13_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_13_0 |
-
-
-
|
-
|
- - 1-6=Nummer des aktiven Heizprogramms |
-
|
-
-
-
|
-
|
- - (1:A; 2:=B;3:=C; …) |
-
|
-
-
- | 20 |
- 0....4 |
- Betriebsart für den Heizkreis x |
- 357_14_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_14_0 |
-
-
-
|
-
|
- - 1=Betrieb im Frostschutzmodus |
-
|
-
-
-
|
-
|
- - 2=Betrieb im Sparmodus |
-
|
-
-
-
|
-
|
- - 3=Betrieb im Normalmodus |
-
|
-
-
-
|
-
|
- - 4=Automatikbetrieb |
-
|
-
-
- | 21 |
- z.B. 14 |
- Temperaturniveau für Betriebsart Frost im Heizkreis x |
- 357_15_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_15_0 |
-
-
- | 22 |
- z.B. 28 |
- Temperaturniveau für Betriebsart Sparen im Heizkreis x |
- 357_16_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_16_0 |
-
-
- | 23 |
- z.B. 2B |
- Temperaturniveau für Betriebsart Normal im Heizkreis x |
- 357_17_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_17_0 |
-
-
- | 24 |
- 0...3 |
- Aufheizgeschwindigkeit für Heizkreis x |
- 357_18_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_18_0 |
-
-
-
|
-
|
- - 1=Langsam |
-
|
-
-
-
|
-
|
- - 2=Normal |
-
|
-
-
-
|
-
|
- - 3=Schnell |
-
|
-
-
- | 25 |
- 0...4 |
- Urlaubsprogramm Betriebsart für Heizkreis x |
- 357_19_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 366_19_0 |
-
-
-
|
-
|
- - 1=Betrieb im Frostschutzmodus |
-
|
-
-
-
|
-
|
- - 2=Betrieb im Sparmodus |
-
|
-
-
-
|
-
|
- - 3=Betrieb im Normalmodus |
-
|
-
-
-
|
-
|
- - 4=Automatikbetrieb |
-
|
-
-
- | 26 |
-
|
- Optimierungseinfluss für solare Unterstützung im Heizkreis x |
- 357_20_0 bis |
-
-
-
|
-
|
- - (in 1 Grad Schritten) |
- 366_20_0 |
-
-
- | 27 |
- <CRC> |
- CRC |
-
|
-
-
- | 28 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 17: ID 367...376
-
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
|
-
-
-
|
-
|
-
|
-
|
- Message-ID:367_x_0 bis 376_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 17Byte |
- 14Byte |
- 9Byte |
-
|
-
|
-
-
-
|
-
|
-
|
-
|
- Telegramm: Heizkreis Steuerung |
-
|
-
-
-
|
-
|
-
|
-
|
- (Temperaturniveau für den Heizkreis) |
-
|
-
-
- | 0 |
- 90 | 9x |
- 90 | 9x |
- 90 | 9x |
- (wobei: x:= 8...F) |
- Source |
-
-
- | 1 |
- 00 |
- 00 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
- FF |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
- xy |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- 00 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 6F...78 |
- 6F...78 |
- 6F...78 |
- Heizkreis-Zuordnung |
- EMS Type(L) |
-
-
-
|
-
|
-
|
-
|
- 6F=Heizkreis1 |
- 367_0_0 |
-
-
-
|
-
|
-
|
-
|
- 70=Heizkreis2 |
- 368_0_0 |
-
-
-
|
-
|
-
|
-
|
- 71=Heizkreis3 |
- 369_0_0 |
-
-
-
|
-
|
-
|
-
|
- 72=Heizkreis4 |
- 370_0_0 |
-
-
-
|
-
|
-
|
-
|
- 73=Heizkreis5 |
- 371_0_0 |
-
-
-
|
-
|
-
|
-
|
- 74=Heizkreis6 |
- 372_0_0 |
-
-
-
|
-
|
-
|
-
|
- 75=Heizkreis7 |
- 373_0_0 |
-
-
-
|
-
|
-
|
-
|
- 76=Heizkreis8 |
- 374_0_0 |
-
-
-
|
-
|
-
|
-
|
- 77=Heizkreis9 |
- 375_0_0 |
-
-
-
|
-
|
-
|
-
|
- 78=Heizkreis10 |
- 376_0_0 |
-
-
- | 6 |
- 0...3 |
- 0...3 |
- 0...3 |
- Betriebsart Heizung: |
- 367_0_0 bis |
-
-
-
|
-
|
-
|
-
|
- - 0=nicht definiert |
- 376_0_0 |
-
-
-
|
-
|
-
|
-
|
- - 1=Frost |
-
|
-
-
-
|
-
|
-
|
-
|
- - 2=Sparen |
-
|
-
-
-
|
-
|
-
|
-
|
- - 3=Heizen |
-
|
-
-
- | 7 |
- 0...5 |
- 0...5 |
- <CRC> |
- Betriebsart Heizkreis | | CRC |
- 367_1_0 bis |
-
-
-
|
-
|
-
|
-
|
- - 0=nicht definiert |
- 376_1_0 |
-
-
-
|
-
|
-
|
- – |
- - 1=dauernd |
-
|
-
-
-
|
-
|
-
|
- – |
- - 2=Automatikbetrieb |
-
|
-
-
-
|
-
|
-
|
- – |
- - 3=Urlaub |
-
|
-
-
-
|
-
|
-
|
- – |
- - 4=Estrichtrocknung im StandbyModus |
-
|
-
-
-
|
-
|
-
|
- – |
- - 5=Estrichtrocknung in Betrieb |
-
|
-
-
- | 8 |
- Hi-Byte |
- Hi-Byte |
- <Ende> |
- Soll-Temperatur (HK1 bis HK10) | | Ende Marker |
- 367_2_0 bis |
-
-
- | 9 |
- Lo-Byte |
- Lo-Byte |
- – |
- 376_2_0 |
-
-
- | 10 |
- Hi-Byte |
- Hi-Byte |
- – |
- Ist-Temperatur (HK1 bis HK10 vom Regler) |
- 367_4_0 bis |
-
-
- | 11 |
- Lo-Byte |
- Lo-Byte |
- – |
- 376_4_0 |
-
-
- | 12 |
- Hi-Byte |
- <CRC> |
- – |
- T-Raum FB10x | CRC |
- 367_6_0 |
-
-
- | 13 |
- Lo-Byte |
- <Ende> |
- – |
- T-Raum FB10x | Ende Marker |
-
|
-
-
- | 14 |
- 00 … 07 |
- – |
- – |
- Temperaturwert für solare Unterstützung der Vorlauftemperatur |
- 367_8_0 |
-
-
- | 15 |
- <CRC> |
- – |
- – |
- CRC |
-
|
-
-
- | 16 |
- <Ende> |
- – |
- – |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 18: ID 377...386
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:377_x_0 bis 386_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 19Byte |
-
|
-
|
-
-
-
|
-
|
- Telegramm: Heizkreis Steuerung |
-
|
-
-
- | 0 |
- 90 |
- (Bauart des Heizkreises) |
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 79...82 |
- Heizkreis x Kennung |
- EMS Type(L) |
-
-
-
|
-
|
- 79=Heizkreis1 |
- 377_0_0 |
-
-
-
|
-
|
- 7A=Heizkreis2 |
- 378_0_0 |
-
-
-
|
-
|
- 7B=Heizkreis3 |
- 379_0_0 |
-
-
-
|
-
|
- 7C=Heizkreis4 |
- 380_0_0 |
-
-
-
|
-
|
- 7D=Heizkreis5 |
- 381_0_0 |
-
-
-
|
-
|
- 7E=Heizkreis6 |
- 382_0_0 |
-
-
-
|
-
|
- 7F=Heizkreis7 |
- 383_0_0 |
-
-
-
|
-
|
- 80=Heizkreis8 |
- 384_0_0 |
-
-
-
|
-
|
- 81=Heizkreis9 |
- 385_0_0 |
-
-
-
|
-
|
- 82=Heizkreis10 |
- 386_0_0 |
-
-
- | 6 |
- 0...3 |
- Bauart-Werte |
- 377_0_0 bis |
-
-
-
|
-
|
- - 0=Nicht vorhanden |
- 386_0_0 |
-
-
-
|
-
|
- - 1=Ungemischter Heizkreis ohne Schaltmodul IPM |
-
|
-
-
-
|
-
|
- - 2=Ungemischter Heizkreis mit Schaltmodul IPM |
-
|
-
-
-
|
-
|
- - 3=Gemischter Heizkreis |
-
|
-
-
- | 7 |
-
|
- Anpassungsfaktor im Heizkreis x |
- 377_1_0 bis |
-
-
-
|
-
|
-
|
- 386_1_0 |
-
-
- | 8 |
-
|
- Verstärkungsfaktor im Heizkreis x |
- 377_2_0 bis |
-
-
-
|
-
|
-
|
- 386_2_0 |
-
-
- | 9 |
-
|
- Maximale Vorlauftemperatur im Heizkreis x |
- 377_3_0 bis |
-
-
-
|
-
|
-
|
- 386_3_0 |
-
-
- | 10 |
- 0...4 |
- Betriebsart für Heizkreis x |
- 377_4_0 bis |
-
-
-
|
-
|
- - 0=nicht definiert |
- 386_4_0 |
-
-
-
|
-
|
- - 1=Betrieb im Frostschutzmodus |
-
|
-
-
-
|
-
|
- - 2=Betrieb im Sparmodus |
-
|
-
-
-
|
-
|
- - 3=Betrieb im Normalmodus |
-
|
-
-
-
|
-
|
- - 4=Automatikbetrieb |
-
|
-
-
- | 11 |
-
|
- Temperaturniveau bei Betriebsart Frost |
- 377_5_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 386_5_0 |
-
-
- | 12 |
-
|
- Temperaturniveau bei Betriebsart Sparen |
- 377_6_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 386_6_0 |
-
-
- | 13 |
-
|
- Temperaturniveau bei Betriebsart Normal |
- 377_7_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 386_7_0 |
-
-
- | 14 |
-
|
- Urlaubsprogramm Betriebsart für Heizkreis x |
- 377_8_0 bis |
-
-
-
|
-
|
- - ( Werte wie bei Byte:10 Betriebsart Heizkreis) |
- 386_8_0 |
-
-
- | 15 |
- 0/FF |
- Status Optimierungsfunktion im Heizkreis x |
- 377_9_0 bis |
-
-
-
|
-
|
- - 0 = Aus |
- 386_9_0 |
-
-
-
|
-
|
- - FF = Ein |
-
|
-
-
- | 16 |
- 0...6 |
- Aktiviertes Heizprogramm |
- 377_10_0 bis |
-
-
-
|
-
|
- - 0=Nicht definiert |
- 386_10_0 |
-
-
-
|
-
|
- - 1-6=Nummer des aktiven Heizprogramms |
-
|
-
-
-
|
-
|
- - (1=A; 2=B; 3=C; …) |
-
|
-
-
- | 17 |
- <CRC> |
- CRC |
-
|
-
-
- | 18 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 19: ID 677...684
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:677_x_0 bis 684_x_0 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- Telegramm: Heizkreis Steuerung |
-
|
-
-
-
|
-
|
- (Temperaturniveau für den Heizkreis) |
-
|
-
-
- | 0 |
- 90 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 01 |
- Immer 01 |
- EMS Type(H) |
-
-
- | 5 |
- A5...AC |
- Heizkreis-Zuordnung |
- EMS Type(L) |
-
-
-
|
-
|
- A5=Heizkreis1 |
- 677_0_0 |
-
-
-
|
-
|
- A6=Heizkreis2 |
- 678_0_0 |
-
-
-
|
-
|
- A7=Heizkreis3 |
- 679_0_0 |
-
-
-
|
-
|
- A8=Heizkreis4 |
- 680_0_0 |
-
-
-
|
-
|
- A9=Heizkreis5 |
- 681_0_0 |
-
-
-
|
-
|
- AA=Heizkreis6 |
- 682_0_0 |
-
-
-
|
-
|
- AB=Heizkreis7 |
- 683_0_0 |
-
-
-
|
-
|
- AC=Heizkreis8 |
- 684_0_0 |
-
-
- | 6 |
- Hi-Byte |
- Ist-Raumtemperatur (HK1 bis HK8) |
- 677_0_0 bis |
-
-
- | 7 |
- Lo-Byte |
- 684_0_0 |
-
-
- | 8 |
- xy |
- Status Heizkreis |
- 6xy_2_0 |
-
-
- | 9 |
- xy |
-
|
- 6xy_3_0 |
-
-
- | 10 |
- xy |
-
|
- 6xy_4_0 |
-
-
- | 11 |
- xy |
-
|
- 6xy_5_0 |
-
-
- | 12 |
- xy |
- Soll-Raumtemperatur (HK1 bis HK8) |
- 6xy_6_0 |
-
-
- | 13 |
- xy |
-
|
- 6xy_7_0 |
-
-
- | 14 |
- Hi-Byte |
-
|
- 6xy_8_0 |
-
-
- | 15 |
- Lo-Byte |
-
|
-
-
- | 16 |
- xy |
-
|
- 6xy_10_0 |
-
-
- | 17 |
- xy |
- Temperatur-Niveau |
- 6xy_11_0 |
-
-
- | 18 |
- xy |
-
|
- 6xy_12_0 |
-
-
- | 19 |
- Hi-Byte |
-
|
- 6xy_13_0 |
-
-
- | 20 |
- Lo-Byte |
-
|
-
-
- | 21 |
- Hi-Byte |
-
|
- 6xy_15_0 |
-
-
- | 22 |
- Lo-Byte |
-
|
-
-
- | 23 |
- xy |
-
|
- 6xy_17_0 |
-
-
- | 24 |
- xy |
-
|
- 6xy_18_0 |
-
-
- | 25 |
- xy |
-
|
- 6xy_19_0 |
-
-
- | 26 |
- xy |
-
|
- 6xy_20_0 |
-
-
- | 27 |
- xy |
- Betriebsstatus (HK1 bis HK8) {Auto / Manuell} |
- 6xy_21_0 |
-
-
- | 28 |
- Hi-Byte |
-
|
- 6xy_22_0 |
-
-
- | 29 |
- Lo-Byte |
-
|
-
-
- | 30 |
- xy |
-
|
- 6xy_24_0 |
-
-
- | 31 |
- xy |
-
|
- 6xy_25_0 |
-
-
- | 32 |
- xy |
-
|
- 6xy_26_0 |
-
-
- | 33 |
- Hi-Byte |
-
|
- 6xy_27_0 |
-
-
- | 34 |
- Lo-Byte |
-
|
-
-
- | 35 |
- xy |
-
|
- 6xy_29_0 |
-
-
- | 36 |
- xy |
-
|
- 6xy_30_0 |
-
-
- | 37 |
- <CRC> |
- CRC |
-
|
-
-
- | 38 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 20: ID 259
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:259_x_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 21Byte |
-
|
-
|
-
-
-
|
-
|
- ISM Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 03 |
- Immer 03 |
- EMS Type(L) |
-
-
- | 6 |
- xy |
- Optimierungsfaktor WW mit solarer Unterstützung |
- 259_0_0 |
-
-
- | 7 |
- xy |
- Optimierungsfaktor Heiz. mit solarer Unterstützung |
- 259_1_0 |
-
-
- | 8 |
- Hi-Byte |
- Solarertrag in der letzten Stunde (Wh) |
- 259_2_0 |
-
-
- | 9 |
- Lo-Byte |
-
-
- | 10 |
- Hi-Byte |
- Solarkollektor1 Temperatur T1 |
- 259_4_0 |
-
-
- | 11 |
- Lo-Byte |
-
-
- | 12 |
- Hi-Byte |
- Solarspeicher Temperatur T2 |
- 259_6_0 |
-
-
- | 13 |
- Lo-Byte |
-
-
- | 14 |
- Bit0...Bit7 |
- Betriebsart Solarpumpe (1. Kollektorfeld) |
-
|
-
-
-
|
- Bit0 |
- - Solarpumpe (SP); 0=aus; 1=ein |
- 259_8_0 |
-
-
-
|
- Bit1 |
- - Relaysignal Umwälzpumpe(PE) bei thermischer Desinfektion |
- 259_8_1 |
-
-
-
|
- Bit2..Bit7 |
- - Immer 0 |
-
|
-
-
- | 15 |
- Bit0...Bit7 |
- Solar Systemstatus |
-
|
-
-
-
|
- Bit0 |
- - Abschaltung 1.Kollektorfeld bei Stagnation |
- 259_9_0 |
-
-
-
|
-
|
- -- 0 =Nein |
-
|
-
-
-
|
-
|
- -- 1 =Ja (5 Grad Hysterese) |
-
|
-
-
-
|
- Bit1 |
- - Status Temperatur bei thermischer Desinfektion |
- 259_9_1 |
-
-
-
|
- Bit2 |
- - Status Solarspeicher |
- 259_9_2 |
-
-
-
|
-
|
- -- 0 =Nicht voll geladen |
-
|
-
-
-
|
-
|
- -- 1 =Voll geladen (2 Grad Hysterese) |
-
|
-
-
-
|
- Bit3-8 |
- Immer 0 |
-
|
-
-
- | 16 |
- Byte 3 |
- Laufzeit Solarpumpe (Minuten) |
-
|
-
-
- | 17 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
- 259_10_0 |
-
-
- | 18 |
- Byte 1 |
- „ |
-
|
-
-
- | 19 |
- <CRC> |
- CRC |
-
|
-
-
- | 20 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 21: ID 260
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
-
|
- Message-ID:260_x_y |
-
|
-
-
- | Byte |
- Werte (Hex) |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 24Byte |
- 35Byte |
-
|
-
|
-
-
-
|
-
|
-
|
- ISM Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
- 00 |
- Immer 00 |
- EMS Type(H) |
-
-
- | 5 |
- 04 |
- 04 |
- Immer 04 |
- EMS Type(L) |
-
-
- | 6 |
- Hi-Byte T3 |
- Hi-Byte T3 |
- Temperatur T3 im Pufferspeicher f. Rücklaufanhebung |
- 260_0_0 |
-
-
- | 7 |
- Lo-Byte T3 |
- Lo-Byte T3 |
-
-
- | 8 |
- Hi-Byte |
- Hi-Byte |
- Heizungsrücklauftemperatur |
- 260_2_0 |
-
-
- | 9 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 10 |
- Hi-Byte T5 |
- Hi-Byte T5 |
- Temperatur T5 im Pufferspeicher (oben) |
- 260_4_0 |
-
-
- | 11 |
- Lo-Byte T5 |
- Lo-Byte T5 |
-
-
- | 12 |
- Hi-Byte T6 |
- Hi-Byte T6 |
- Temperatur T6 im Bereitschaftsspeicher (unten) |
- 260_6_0 |
-
-
- | 13 |
- Lo-Byte T6 |
- Lo-Byte T6 |
-
-
- | 14 |
- Hi-Byte |
- Hi-Byte |
- Temperatur 2. Kollektorfeld |
- 260_8_0 |
-
-
- | 15 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 16 |
- Hi-Byte |
- Hi-Byte |
- Temperatur TB im Pufferspeicher (oben) |
- 260_10_0 |
-
-
- | 17 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 18 |
- Hi-Byte |
- Hi-Byte |
- Temperatur TC im Vorrang-/Nachrangspeicher |
- 260_12_0 |
-
-
- | 19 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 20 |
- Hi-Byte |
- Hi-Byte |
- Temperatur am externen Wärmetauscher f. Solarsystem |
- 260_14_0 |
-
-
- | 21 |
- Lo-Byte |
- Lo-Byte |
-
-
- | 22 |
- <CRC> |
- Bit0...Bit7 |
- Status 1 |
-
|
-
-
-
|
-
|
- Bit0 |
- - Betriebsart Ventil (DWU) f. Rücklaufanhebung |
- 260_16_0 |
-
-
-
|
-
|
- Bit1 |
- - Relaisansteuerung f. Umwälzpumpe Umladesystem |
- 260_16_1 |
-
-
-
|
-
|
- Bit2 |
- - Umwälzpumpe (PA) im 2. Kollektorfeld |
- 260_16_2 |
-
-
-
|
-
|
- Bit3 |
- - Relaisansteuerung f. Umwälzpumpe (PB) Umladesystem |
- 260_16_3 |
-
-
-
|
-
|
- Bit4 |
- - Betriebsart Umwälzpumpe (PC)/Umschaltventil |
- 260_16_4 |
-
-
-
|
-
|
- Bit5 |
- - Betriebsart Umwälzpumpe (PD) im Sekundärkreis |
- 260_16_5 |
-
-
-
|
-
|
- Bit6 |
- - Relaissignal bei Option F |
- 260_16_6 |
-
-
-
|
-
|
- Bit7 |
- - unbenutzt |
- 260_16_7 |
-
-
- | 23 |
- <Ende> |
- Bit0...Bit7 |
- Status 2 |
-
|
-
-
-
|
-
|
- Bit0 |
- - Ansteuerung Ventil DWU1 f. Rücklaufanhebung |
- 260_17_0 |
-
-
-
|
-
|
- Bit1 |
- - Status maximale Temperatur im Umladespeicher |
- 260_17_1 |
-
-
-
|
-
|
- Bit2 |
- - Status Umwälzpumpe (PA) im 2.Kollektorfeld (Stagnation) |
- 260_17_2 |
-
-
-
|
-
|
- Bit3 |
- - Maximaltemperatur erreicht im WW-Speicher B |
- 260_17_3 |
-
-
-
|
-
|
- Bit4 |
- - WW-Speicher geladen |
- 260_17_4 |
-
-
-
|
-
|
- Bit5 |
- - Testmodus (Speicherladung Vorrangspeicher) |
- 260_17_5 |
-
-
-
|
-
|
- Bit6 |
- - Maximaltemperatur erreicht im WW-Speicher C |
- 260_17_6 |
-
-
-
|
-
|
- Bit7 |
- - Testmodus |
- 260_17_7 |
-
-
- | 24 |
-
|
- Byte 3 |
- Betriebszeit f. Solarmumpe (PA) im zweiten Kollektorfeld |
- 260_18_0 |
-
-
- | 25 |
-
|
- Byte 2 |
-
-
- | 26 |
-
|
- Byte 1 |
-
-
- | 27 |
-
|
- Hi-Byte |
- Zeitintervall f. Überprüfung ob Speicher C geladen wird |
- 260_21_0 |
-
-
- | 28 |
-
|
- Lo-Byte |
-
|
-
|
-
-
- | 29 |
-
|
- Hi-Byte |
- Temperatur TF 1 in Wärmequelle |
- 260_23_0 |
-
-
- | 30 |
-
|
- Lo-Byte |
-
|
-
|
-
-
- | 31 |
-
|
- Hi-Byte |
- Temperatur TF 2 in Wärmesenke |
- 260_25_0 |
-
-
- | 32 |
-
|
- Lo-Byte |
-
|
-
|
-
-
- | 33 |
-
|
- <CRC> |
-
|
-
|
-
-
- | 34 |
-
|
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 22: ID 866
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:866 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 62 |
- Immer 62 |
- EMS Type(L) |
-
-
- | 6 |
- Hi-Byte |
- Solarkollektor1 Temperatur |
- 866_0_0 |
-
-
- | 7 |
- Lo-Byte |
-
-
- | 8 |
- Hi-Byte |
- Solarspeicher Temperatur unten |
- 866_2_0 |
-
-
- | 9 |
- Lo-Byte |
-
-
- | 10 |
- Hi-Byte |
- Solarspeicher Temperatur mittlerer Sensor |
- 866_4_0 |
-
-
- | 11 |
- Lo-Byte |
-
-
- | 12 |
- Hi-Byte |
- Solarkollektor2 Temperatur |
- 866_6_0 |
-
-
- | 13 |
- Lo-Byte |
-
-
- | 14 |
- Hi-Byte |
- Solarspeicher Beipass Temperatur |
- 866_8_0 |
-
-
- | 15 |
- Lo-Byte |
-
-
- | 16 |
- Hi-Byte |
- Solarspeicher Beipass Return-Temperatur |
- 866_10_0 |
-
-
- | 17 |
- Lo-Byte |
-
-
- | 18 |
- Hi-Byte |
-
|
- 866_12_0 |
-
-
- | 19 |
- Lo-Byte |
-
-
- | 20 |
- Hi-Byte |
-
|
- 866_14_0 |
-
-
- | 21 |
- Lo-Byte |
-
-
- | 22 |
- Hi-Byte |
-
|
- 866_16_0 |
-
-
- | 23 |
- Lo-Byte |
-
|
-
-
- | 24 |
- Hi-Byte |
-
|
- 866_18_0 |
-
-
- | 25 |
- Lo-Byte |
-
|
-
-
- | 26 |
- Hi-Byte |
-
|
- 866_20_0 |
-
-
- | 27 |
- Lo-Byte |
-
|
-
-
- | 28 |
- Hi-Byte |
-
|
- 866_22_0 |
-
-
- | 29 |
- Lo-Byte |
-
|
-
-
- | 30 |
- Hi-Byte |
-
|
- 866_24_0 |
-
-
- | 31 |
- Lo-Byte |
-
|
-
-
- | 32 |
- <CRC> |
-
|
-
|
-
-
- | 33 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 23: ID 868
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:868_x_y |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 64 |
- Immer 64 |
- EMS Type(L) |
-
-
- | 6 |
- xy |
-
|
- 868_0_0 |
-
-
- | 7 |
- xy |
-
|
- 868_1_0 |
-
-
- | 8 |
- Bit0...Bit7 |
-
|
- 868_2_x |
-
-
-
|
- Bit0 |
-
|
- 868_2_0 |
-
-
-
|
- Bit1 |
-
|
- 868_2_1 |
-
-
-
|
- Bit2 |
-
|
- 868_2_2 |
-
-
-
|
- Bit3 |
-
|
- 868_2_3 |
-
-
-
|
- Bit4 |
-
|
- 868_2_4 |
-
-
-
|
- Bit5 |
-
|
- 868_2_5 |
-
-
-
|
- Bit6 |
-
|
- 868_2_6 |
-
-
-
|
- Bit7 |
-
|
- 868_2_7 |
-
-
- | 9 |
- Bit0...Bit7 |
- Solar Systemstatus |
- 868_3_x |
-
-
-
|
- Bit0 |
- - Abschaltung 1.Kollektorfeld bei Stagnation |
- 868_3_0 |
-
-
-
|
-
|
- -- 0 =Nein |
-
|
-
-
-
|
-
|
- -- 1 =Ja |
-
|
-
-
-
|
- Bit1 |
- -- 1 =Solarspeicher maximale Temperatur erreicht |
- 868_3_1 |
-
-
-
|
- Bit2 |
- -- 1 =Solarspeicher minimale Temperatur erreicht |
- 868_3_2 |
-
-
-
|
- Bit3 |
-
|
- 868_3_3 |
-
-
-
|
- Bit4 |
-
|
- 868_3_4 |
-
-
-
|
- Bit5 |
-
|
- 868_3_5 |
-
-
-
|
- Bit6 |
-
|
- 868_3_6 |
-
-
-
|
- Bit7 |
-
|
- 868_3_7 |
-
-
- | 10 |
- xy |
-
|
- 868_4_0 |
-
-
- | 11 |
- xy |
-
|
- 868_5_0 |
-
-
- | 12 |
- xy |
-
|
- 868_6_0 |
-
-
- | 13 |
- xy |
-
|
- 868_7_0 |
-
-
- | 14 |
- xy |
-
|
- 868_8_0 |
-
-
- | 15 |
- xy |
- Aktuelle Solarpumpen – Leistung |
- 868_9_0 |
-
-
- | 16 |
- xy |
-
|
- 868_10_0 |
-
-
- | 17 |
- xy |
- 868_11_0 |
-
-
- | 18 |
- xy |
-
|
- 868_12_0 |
-
-
- | 19 |
- xy |
- 868_13_0 |
-
-
- | 20 |
- xy |
-
|
- 868_14_0 |
-
-
- | 21 |
- xy |
- 868_15_0 |
-
-
- | 22 |
- <CRC> |
-
|
-
|
-
-
- | 23 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 24: ID 873
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:873_x_0 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 69 |
- Immer 69 |
- EMS Type(L) |
-
-
- | 6 |
- Byte 4 |
- Solarertrag letzte Stunde |
- 873_0_0 |
-
-
- | 7 |
- Byte 3 |
- „ |
-
-
- | 8 |
- Byte 2 |
- „ ( Calculation-Type: 4 ) |
-
-
- | 9 |
- Byte 1 |
- „ |
-
-
- | 10 |
- Byte 4 |
- Solarertrag aktueller Tag |
- 873_4_0 |
-
-
- | 11 |
- Byte 3 |
- „ |
-
-
- | 12 |
- Byte 2 |
- „ |
-
-
- | 13 |
- Byte 1 |
- „ |
-
-
- | 14 |
- Byte 4 |
- Solarertrag Summe |
- 873_8_0 |
-
-
- | 15 |
- Byte 3 |
- „ |
-
-
- | 16 |
- Byte 2 |
- „ |
-
-
- | 17 |
- Byte 1 |
- „ |
-
-
- | 18 |
- <CRC> |
-
|
-
|
-
-
- | 19 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 25: ID 874
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:874_x_0 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 6A |
- Immer 6A |
- EMS Type(L) |
-
-
- | 6 |
- xy |
-
|
- 874_0_0 |
-
-
- | 7 |
- xy |
-
|
- 874_1_0 |
-
-
- | 8 |
- xy |
-
|
- 874_2_0 |
-
-
- | 9 |
- xy |
-
|
- 874_3_0 |
-
-
- | 10 |
- xy |
-
|
- 874_4_0 |
-
-
- | 11 |
- xy |
-
|
- 874_5_0 |
-
-
- | 12 |
- xy |
-
|
- 874_6_0 |
-
-
- | 13 |
- xy |
-
|
- 874_7_0 |
-
-
- | 14 |
- xy |
-
|
- 874_8_0 |
-
-
- | 15 |
- xy |
-
|
- 874_9_0 |
-
-
- | 16 |
- Bit0...Bit7 |
-
|
- 874_10_x |
-
-
-
|
- Bit0 |
-
|
- 874_10_0 |
-
-
-
|
- Bit1 |
-
|
- 874_10_1 |
-
-
-
|
- Bit2 |
- - Solarpumpe (SP); 0=aus; 1=ein |
- 874_10_2 |
-
-
-
|
- Bit3 |
-
|
- 874_10_3 |
-
-
-
|
- Bit4 |
-
|
- 874_10_4 |
-
-
-
|
- Bit5 |
-
|
- 874_10_5 |
-
-
-
|
- Bit6 |
-
|
- 874_10_6 |
-
-
-
|
- Bit7 |
-
|
- 874_10_7 |
-
-
- | 17 |
- xy |
-
|
- 874_11_0 |
-
-
- | 18 |
- xy |
-
|
- 874_12_0 |
-
-
- | 19 |
- xy |
- 874_13_0 |
-
-
- | 20 |
- xy |
-
|
- 874_14_0 |
-
-
- | 21 |
- xy |
- 874_15_0 |
-
-
- | 22 |
- <CRC> |
-
|
-
|
-
-
- | 23 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 26: ID 910
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:910_x_0 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 8E |
- Immer 8E |
- EMS Type(L) |
-
-
- | 6 |
- Byte 4 |
- Solarertrag letzte Stunde |
- 910_0_0 |
-
-
- | 7 |
- Byte 3 |
- „ |
-
-
- | 8 |
- Byte 2 |
- „ ( Calculation-Type: 4 ) |
-
-
- | 9 |
- Byte 1 |
- „ |
-
-
- | 10 |
- Byte 4 |
- Solarertrag aktueller Tag |
- 910_4_0 |
-
-
- | 11 |
- Byte 3 |
- „ |
-
-
- | 12 |
- Byte 2 |
- „ ( Calculation-Type: 5 ) |
-
-
- | 13 |
- Byte 1 |
- „ |
-
-
- | 14 |
- Byte 4 |
- Solarertrag Summe |
- 910_8_0 |
-
-
- | 15 |
- Byte 3 |
- „ |
-
-
- | 16 |
- Byte 2 |
- „ ( Calculation-Type: 4 ) |
-
-
- | 17 |
- Byte 1 |
- „ |
-
-
- | 18 |
- <CRC> |
-
|
-
|
-
-
- | 19 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 27: ID 913
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:913_x_0 |
-
|
-
-
- | Byte |
-
|
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- MS100 Solar-Telegramm |
-
|
-
-
- | 0 |
- B0 |
-
|
- Source |
-
-
- | 1 |
- 00 |
-
|
- Target |
-
-
- | 2 |
- FF |
-
|
- EMS Marker |
-
-
- | 3 |
- xy |
-
|
- EMS Offset |
-
-
- | 4 |
- 02 |
- Immer 02 |
- EMS Type(H) |
-
-
- | 5 |
- 91 |
- Immer 91 |
- EMS Type(L) |
-
-
- | 6 |
- Byte 4 |
- Laufzeit Solarpumpe (Minuten) |
- 913_0_0 |
-
-
- | 7 |
- Byte 3 |
- „ |
-
-
- | 8 |
- Byte 2 |
- „ ( Calculation-Type: 2 ) |
-
-
- | 9 |
- Byte 1 |
- „ |
-
-
- | 10 |
- xy |
-
|
- 913_4_0 |
-
-
- | 11 |
- xy |
-
|
- 913_5_0 |
-
-
- | 12 |
- xy |
-
|
- 913_6_0 |
-
-
- | 13 |
- xy |
-
|
- 913_7_0 |
-
-
- | 14 |
- xy |
-
|
- 913_8_0 |
-
-
- | 15 |
- xy |
-
|
- 913_9_0 |
-
-
- | 16 |
- xy |
-
|
- 913_10_0 |
-
-
- | 17 |
- xy |
-
|
- 913_11_0 |
-
-
- | 18 |
- <CRC> |
-
|
-
|
-
-
- | 19 |
- <Ende> |
-
|
-
|
-
-
-
-
-Tabelle 28: ID 357_366_14_Modem
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:357_14_0 bis 366_14_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 9Byte |
-
|
-
|
-
-
-
|
-
|
- Modem-CMD:: Betriebsart setzen |
-
|
-
-
- | 0 |
- 8D |
- Source: Modem |
- Source |
-
-
- | 1 |
- 10 |
- Target |
- Target |
-
-
- | 2 |
- FF |
- EMS-Type |
- EMS Marker |
-
-
- | 3 |
- 0E |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
-
|
- EMS Type(H) |
-
-
- | 5 |
- 65...6E |
- Heizkreis x |
- EMS Type(L) |
-
-
-
|
-
|
- 65=Heizkreis1 |
-
|
-
-
-
|
-
|
- 66=Heizkreis2 |
-
|
-
-
-
|
-
|
- 67=Heizkreis3 |
-
|
-
-
-
|
-
|
- 68=Heizkreis4 |
-
|
-
-
-
|
-
|
- 69=Heizkreis5 |
-
|
-
-
-
|
-
|
- 6A=Heizkreis6 |
-
|
-
-
-
|
-
|
- 6B=Heizkreis7 |
-
|
-
-
-
|
-
|
- 6C=Heizkreis8 |
-
|
-
-
-
|
-
|
- 6D=Heizkreis9 |
-
|
-
-
-
|
-
|
- 6E=Heizkreis10 |
-
|
-
-
- | 6 |
- 0...4 |
- Heizkreisbetriebsart-Werte |
- 357_14_0 bis |
-
-
-
|
-
|
- - 0=Nicht definiert |
- 366_14_0 |
-
-
-
|
-
|
- - 1=Betrieb im Frostschutzmodus |
-
|
-
-
-
|
-
|
- - 2=Betrieb im Sparmodus |
-
|
-
-
-
|
-
|
- - 3=Betrieb im Normalmodus |
-
|
-
-
-
|
-
|
- - 4=Automatikbetrieb |
-
|
-
-
- | 7 |
- <CRC> |
- CRC |
-
|
-
-
- | 8 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 29: ID 377_387_4_Modem
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
-
-
|
-
|
- Message-ID:377_4_0 bis 386_4_0 |
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
-
-
|
- 9Byte |
-
|
-
|
-
-
-
|
-
|
- Modem-CMD: Betriebsart setzen |
-
|
-
-
- | 0 |
- 8D |
- Source: Modem |
- Source |
-
-
- | 1 |
- 10 |
- Target |
- Target |
-
-
- | 2 |
- FF |
- EMS-Type |
- EMS Marker |
-
-
- | 3 |
- 04 |
-
|
- EMS Offset |
-
-
- | 4 |
- 00 |
-
|
- EMS Type(H) |
-
-
- | 5 |
- 79...82 |
- Heizkreis x Kennung |
- EMS Type(L) |
-
-
-
|
-
|
- 79=Heizkreis1 |
-
|
-
-
-
|
-
|
- 7A=Heizkreis2 |
-
|
-
-
-
|
-
|
- 7B=Heizkreis3 |
-
|
-
-
-
|
-
|
- 7C=Heizkreis4 |
-
|
-
-
-
|
-
|
- 7D=Heizkreis5 |
-
|
-
-
-
|
-
|
- 7E=Heizkreis6 |
-
|
-
-
-
|
-
|
- 7F=Heizkreis7 |
-
|
-
-
-
|
-
|
- 80=Heizkreis8 |
-
|
-
-
-
|
-
|
- 81=Heizkreis9 |
-
|
-
-
-
|
-
|
- 82=Heizkreis10 |
-
|
-
-
- | 6 |
- 0...4 |
- Heizkreisbetriebsart-Werte |
- 357_4_0 bis |
-
-
-
|
-
|
- - 0=Nicht definiert |
- 366_4_0 |
-
-
-
|
-
|
- - 1=Betrieb im Frostschutzmodus |
-
|
-
-
-
|
-
|
- - 2=Betrieb im Sparmodus |
-
|
-
-
-
|
-
|
- - 3=Betrieb im Normalmodus |
-
|
-
-
-
|
-
|
- - 4=Automatikbetrieb |
-
|
-
-
- | 7 |
- <CRC> |
- CRC |
-
|
-
-
- | 8 |
- <Ende> |
- Ende Marker |
-
|
-
-
-
-
-Tabelle 30: ID 357...366_1x_Modem
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
|
-
-
-
|
-
|
- Message-ID:357_1x_0 bis 366_1x_0 |
-
|
-
|
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
|
-
|
-
-
-
|
- 9Byte |
-
|
- Betriebsart |
-
|
-
|
-
-
-
|
-
|
- Modem-CMD: Temperatur-Niveau setzen (Betriebsart Normal/Sparen/Frost) |
- Normal |
- Sparen |
- Frost |
-
-
- | 0 |
- 8D |
- Source: Modem |
- Source |
- Source |
- Source |
-
-
- | 1 |
- 10 |
- Target |
- Target |
- Target |
- Target |
-
-
- | 2 |
- FF |
- EMS-Type |
- EMS Marker |
- EMS Marker |
- EMS Marker |
-
-
- | 3 |
- 11/10/0F |
- EMS-Offset |
- 11 (hex) |
- 10 (hex) |
- F (hex) |
-
-
- | 4 |
- 00 |
-
|
- EMS Type(H) |
- EMS Type(H) |
- EMS Type(H) |
-
-
- | 5 |
- 65...6E |
- Heizkreis x |
- EMS Type(L) |
- EMS Type(L) |
- EMS Type(L) |
-
-
-
|
-
|
- 65=Heizkreis1 |
-
|
-
|
-
|
-
-
-
|
-
|
- 66=Heizkreis2 |
-
|
-
|
-
|
-
-
-
|
-
|
- 67=Heizkreis3 |
-
|
-
|
-
|
-
-
-
|
-
|
- 68=Heizkreis4 |
-
|
-
|
-
|
-
-
-
|
-
|
- 69=Heizkreis5 |
-
|
-
|
-
|
-
-
-
|
-
|
- 6A=Heizkreis6 |
-
|
-
|
-
|
-
-
-
|
-
|
- 6B=Heizkreis7 |
-
|
-
|
-
|
-
-
-
|
-
|
- 6C=Heizkreis8 |
-
|
-
|
-
|
-
-
-
|
-
|
- 6D=Heizkreis9 |
-
|
-
|
-
|
-
-
-
|
-
|
- 6E=Heizkreis10 |
-
|
-
|
-
|
-
-
- | 6 |
-
|
- Temperaturniveau für Betriebsart: y im Heizkreis x |
- 357_17_0 bis |
- 357_16_0 bis |
- 357_15_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 366_17_0 |
- 366_16_0 |
- 366_15_0 |
-
-
- | 7 |
- <CRC> |
- CRC |
-
|
-
|
-
|
-
-
- | 8 |
- <Ende> |
- Ende Marker |
-
|
-
|
-
|
-
-
-
-
-Tabelle 31: ID 377...386_x_Modem
-
-
-
-
-
-
-
- | HT Bus-Telegramme |
-
|
-
|
-
|
-
-
-
|
-
|
- Message-ID:377_x_0 bis 386_x_0 |
-
|
-
|
-
|
-
-
- | Byte |
- Werte (Hex) |
- Bemerkung |
- Bedeutung / ID |
-
|
-
|
-
-
-
|
- 9Byte |
-
|
-
|
-
|
-
|
-
-
-
|
-
|
- Modem-CMD: Temperatur-Niveau setzen (Betriebsart Normal/Sparen/Frost) |
- Normal |
- Sparen |
- Frost |
-
-
- | 0 |
- 8D |
- Source: Modem |
- Source |
- Source |
- Source |
-
-
- | 1 |
- 10 |
- Target |
- Target |
- Target |
- Target |
-
-
- | 2 |
- FF |
- EMS-Type |
- EMS Marker |
- EMS Marker |
- EMS Marker |
-
-
- | 3 |
- 07/06/05 |
- EMS-Offset |
- 7 (hex) |
- 6 (hex) |
- 5 (hex) |
-
-
- | 4 |
- 00 |
-
|
- EMS Type(H) |
- EMS Type(H) |
- EMS Type(H) |
-
-
- | 5 |
- 79...82 |
- Heizkreis x Kennung |
- EMS Type(L) |
- EMS Type(L) |
- EMS Type(L) |
-
-
-
|
-
|
- 79=Heizkreis1 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7A=Heizkreis2 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7B=Heizkreis3 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7C=Heizkreis4 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7D=Heizkreis5 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7E=Heizkreis6 |
-
|
-
|
-
|
-
-
-
|
-
|
- 7F=Heizkreis7 |
-
|
-
|
-
|
-
-
-
|
-
|
- 80=Heizkreis8 |
-
|
-
|
-
|
-
-
-
|
-
|
- 81=Heizkreis9 |
-
|
-
|
-
|
-
-
-
|
-
|
- 82=Heizkreis10 |
-
|
-
|
-
|
-
-
- | 6 |
- 0...4 |
- Temperaturniveau für Betriebsart: y im Heizkreis x |
- 377_7_0 bis |
- 377_6_0 bis |
- 377_5_0 bis |
-
-
-
|
-
|
- - (in 0.5 Grad Schritten) |
- 386_7_0 |
- 386_6_0 |
- 386_5_0 |
-
-
- | 7 |
- <CRC> |
- CRC |
-
|
-
|
-
|
-
-
- | 8 |
- <Ende> |
- Ende Marker |
-
|
-
|
-
|
-
-
-
-
-
-
diff --git a/doc/ems references/wiki_ ems_ telegrams.pdf b/doc/ems references/wiki_ ems_ telegrams.pdf
deleted file mode 100644
index 882a997ab51421c585e316172c527cbb5be922a6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 195670
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