mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 16:29:51 +03:00
FR10 Junkers
This commit is contained in:
16
CHANGELOG.md
16
CHANGELOG.md
@@ -5,26 +5,26 @@ 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/),
|
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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [1.7.0 dev] 2019-05
|
## [1.7.0] 2019-05-05
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Buderus Logamax plus boiler added
|
- EMS+ support (thanks too @gl3nni3 for doing the first research)
|
||||||
- EMS+ support (thanks too @gl3nni3 for making the first implementation)
|
|
||||||
- MQTT 'restart' topic to reboot ESP (thanks @balk77)
|
- MQTT 'restart' topic to reboot ESP (thanks @balk77)
|
||||||
- Support for multiple thermostat heating circuits like the HC1/HC2 on a RC35, also via MQTT (thanks @lobocobra)
|
- Support for multiple thermostat heating circuits like the HC1/HC2 on a RC35, also via MQTT (thanks @lobocobra)
|
||||||
- `boiler flowtemp` command to set the flow temperature [(issue 59)](https://github.com/proddy/EMS-ESP/issues/59)
|
- `boiler flowtemp` command to set the flow temperature [(issue 59)](https://github.com/proddy/EMS-ESP/issues/59)
|
||||||
|
- added a test harness to try out response to various telegrams
|
||||||
- `tx_delay` setting for circuits where we needed to slow down Tx transmission
|
- `tx_delay` setting for circuits where we needed to slow down Tx transmission
|
||||||
- new boiler: Nefit proline hrc 24 cw4 thermostat
|
- new boiler: Nefit proline hrc 24 cw4 thermostat
|
||||||
- new thermostats: Buderus RC300 and RC310 thermostats [(issue 37)](https://github.com/proddy/EMS-ESP/issues/37)
|
- new boiler: Buderus Logamax plus
|
||||||
- added a test harness to try out response to various telegrams
|
- new thermostat: Buderus RC300 and RC310 thermostats [(issue 37)](https://github.com/proddy/EMS-ESP/issues/37)
|
||||||
- new devices: Buderus Web Gateway KM200, Solar Module SM100
|
- new thermostat: Junkers FR10 [(issue 98)](https://github.com/proddy/EMS-ESP/issues/98)
|
||||||
|
- new devices: Buderus Web Gateway KM200, Buderus Solar Module SM100
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- `types` renamed to `devices` to also show all detected devices
|
- `types` renamed to `devices` to also show all detected devices
|
||||||
- EMS Plus logic optimized
|
- renamed `silent_mode` to `listen_mode`
|
||||||
- `silent_mode` to `listen_mode`
|
|
||||||
- increased Tx queue to 100
|
- increased Tx queue to 100
|
||||||
|
|
||||||
## [1.6.0] 2019-03-24
|
## [1.6.0] 2019-03-24
|
||||||
|
|||||||
@@ -460,10 +460,13 @@ void showInfo() {
|
|||||||
myDebug("%sThermostat stats:%s", COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
myDebug("%sThermostat stats:%s", COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
||||||
myDebug(" Thermostat: %s", ems_getThermostatDescription(buffer_type));
|
myDebug(" Thermostat: %s", ems_getThermostatDescription(buffer_type));
|
||||||
if ((ems_getThermostatModel() == EMS_MODEL_EASY) || (ems_getThermostatModel() == EMS_MODEL_BOSCHEASY)) {
|
if ((ems_getThermostatModel() == EMS_MODEL_EASY) || (ems_getThermostatModel() == EMS_MODEL_BOSCHEASY)) {
|
||||||
// for easy temps are * 100
|
// for easy temps are * 100, also we don't have the time or mode
|
||||||
// also we don't have the time or mode
|
_renderShortValue("Set room temperature", "C", EMS_Thermostat.setpoint_roomTemp, 10); // *100
|
||||||
_renderShortValue("Set room temperature", "C", EMS_Thermostat.setpoint_roomTemp, 10);
|
_renderShortValue("Current room temperature", "C", EMS_Thermostat.curr_roomTemp, 10); // *100
|
||||||
_renderShortValue("Current room temperature", "C", EMS_Thermostat.curr_roomTemp, 10);
|
} else if (ems_getThermostatModel() == EMS_MODEL_FR10) {
|
||||||
|
// Junkers are *10
|
||||||
|
_renderIntValue("Set room temperature", "C", EMS_Thermostat.setpoint_roomTemp, 10); // *10
|
||||||
|
_renderIntValue("Current room temperature", "C", EMS_Thermostat.curr_roomTemp, 10); // *10
|
||||||
} else {
|
} else {
|
||||||
// because we store in 2 bytes short, when converting to a single byte we'll loose the negative value if its unset
|
// because we store in 2 bytes short, when converting to a single byte we'll loose the negative value if its unset
|
||||||
if (EMS_Thermostat.setpoint_roomTemp <= 0) {
|
if (EMS_Thermostat.setpoint_roomTemp <= 0) {
|
||||||
@@ -673,12 +676,19 @@ void publishValues(bool force) {
|
|||||||
|
|
||||||
rootThermostat[THERMOSTAT_HC] = _int_to_char(s, EMSESP_Status.heating_circuit);
|
rootThermostat[THERMOSTAT_HC] = _int_to_char(s, EMSESP_Status.heating_circuit);
|
||||||
|
|
||||||
|
// different logic depending on thermostat types
|
||||||
if ((ems_getThermostatModel() == EMS_MODEL_EASY) || (ems_getThermostatModel() == EMS_MODEL_BOSCHEASY)) {
|
if ((ems_getThermostatModel() == EMS_MODEL_EASY) || (ems_getThermostatModel() == EMS_MODEL_BOSCHEASY)) {
|
||||||
if (abs(EMS_Thermostat.setpoint_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
if (abs(EMS_Thermostat.setpoint_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
||||||
rootThermostat[THERMOSTAT_SELTEMP] = (double)EMS_Thermostat.setpoint_roomTemp / 10;
|
rootThermostat[THERMOSTAT_SELTEMP] = (double)EMS_Thermostat.setpoint_roomTemp / 10;
|
||||||
if (abs(EMS_Thermostat.curr_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
if (abs(EMS_Thermostat.curr_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
||||||
rootThermostat[THERMOSTAT_CURRTEMP] = (double)EMS_Thermostat.curr_roomTemp / 10;
|
rootThermostat[THERMOSTAT_CURRTEMP] = (double)EMS_Thermostat.curr_roomTemp / 10;
|
||||||
|
|
||||||
|
} else if (ems_getThermostatModel() == EMS_MODEL_FR10) {
|
||||||
|
if (abs(EMS_Thermostat.setpoint_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
||||||
|
rootThermostat[THERMOSTAT_SELTEMP] = (double)EMS_Thermostat.setpoint_roomTemp / 10;
|
||||||
|
if (abs(EMS_Thermostat.curr_roomTemp) < EMS_VALUE_SHORT_NOTSET)
|
||||||
|
rootThermostat[THERMOSTAT_CURRTEMP] = (double)EMS_Thermostat.curr_roomTemp / 10;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (EMS_Thermostat.setpoint_roomTemp != EMS_VALUE_INT_NOTSET)
|
if (EMS_Thermostat.setpoint_roomTemp != EMS_VALUE_INT_NOTSET)
|
||||||
rootThermostat[THERMOSTAT_SELTEMP] = (double)EMS_Thermostat.setpoint_roomTemp / 2;
|
rootThermostat[THERMOSTAT_SELTEMP] = (double)EMS_Thermostat.setpoint_roomTemp / 2;
|
||||||
|
|||||||
34
src/ems.cpp
34
src/ems.cpp
@@ -81,13 +81,16 @@ void _process_RC30StatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
|||||||
void _process_RC35Set(_EMS_RxTelegram * EMS_RxTelegram);
|
void _process_RC35Set(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
void _process_RC35StatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
|
|
||||||
// Easy
|
// Easy type devices like C100
|
||||||
void _process_EasyStatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
void _process_EasyStatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
|
|
||||||
// RC1010, RC300, RC310
|
// RC1010, RC300, RC310
|
||||||
void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
void _process_RCPLUSSetMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
void _process_RCPLUSSetMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
|
|
||||||
|
// Junkers FR10
|
||||||
|
void _process_FR10StatusMessage(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Recognized EMS types and the functions they call to process the telegrams
|
* Recognized EMS types and the functions they call to process the telegrams
|
||||||
* Format: MODEL ID, TYPE ID, Description, function, emsplus
|
* Format: MODEL ID, TYPE ID, Description, function, emsplus
|
||||||
@@ -156,7 +159,11 @@ const _EMS_Type EMS_Types[] = {
|
|||||||
|
|
||||||
// Nefit 1010, RC300, RC310 (EMS Plus)
|
// Nefit 1010, RC300, RC310 (EMS Plus)
|
||||||
{EMS_MODEL_ALL, EMS_TYPE_RCPLUSStatusMessage, "RCPLUSStatusMessage", _process_RCPLUSStatusMessage},
|
{EMS_MODEL_ALL, EMS_TYPE_RCPLUSStatusMessage, "RCPLUSStatusMessage", _process_RCPLUSStatusMessage},
|
||||||
{EMS_MODEL_ALL, EMS_TYPE_RCPLUSSet, "RCPLUSSetMessage", _process_RCPLUSSetMessage}
|
{EMS_MODEL_ALL, EMS_TYPE_RCPLUSSet, "RCPLUSSetMessage", _process_RCPLUSSetMessage},
|
||||||
|
|
||||||
|
// Junkers FR10
|
||||||
|
{EMS_MODEL_ALL, EMS_TYPE_FR10StatusMessage, "FR10StatusMessage", _process_FR10StatusMessage}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1252,6 +1259,17 @@ void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FR10 Junkers - type x6F01
|
||||||
|
*/
|
||||||
|
void _process_FR10StatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
||||||
|
if (EMS_RxTelegram->data_length == 6) {
|
||||||
|
// e.g. 90 00 FF 00 00 6F 03 01 00 BE 00 BF
|
||||||
|
EMS_Thermostat.curr_roomTemp = _toByte(EMS_OFFSET_FR10StatusMessage_curr); // value is * 10
|
||||||
|
EMS_Thermostat.setpoint_roomTemp = _toByte(EMS_OFFSET_FR10StatusMessage_setpoint); // value is * 10, which is different from other EMS+ devices
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* to complete....
|
* to complete....
|
||||||
*/
|
*/
|
||||||
@@ -1742,7 +1760,11 @@ char * ems_getThermostatDescription(char * buffer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
strlcat(buffer, " (ProductID:", size);
|
strlcat(buffer, " (ProductID:", size);
|
||||||
strlcat(buffer, itoa(EMS_Thermostat.product_id, tmp, 10), size);
|
if (EMS_Thermostat.product_id == EMS_ID_NONE) {
|
||||||
|
strlcat(buffer, "?", size);
|
||||||
|
} else {
|
||||||
|
strlcat(buffer, itoa(EMS_Thermostat.product_id, tmp, 10), size);
|
||||||
|
}
|
||||||
strlcat(buffer, " Version:", size);
|
strlcat(buffer, " Version:", size);
|
||||||
strlcat(buffer, EMS_Thermostat.version, size);
|
strlcat(buffer, EMS_Thermostat.version, size);
|
||||||
strlcat(buffer, ")", size);
|
strlcat(buffer, ")", size);
|
||||||
@@ -1779,7 +1801,11 @@ char * ems_getBoilerDescription(char * buffer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
strlcat(buffer, " (ProductID:", size);
|
strlcat(buffer, " (ProductID:", size);
|
||||||
strlcat(buffer, itoa(EMS_Boiler.product_id, tmp, 10), size);
|
if (EMS_Boiler.product_id == EMS_ID_NONE) {
|
||||||
|
strlcat(buffer, "?", size);
|
||||||
|
} else {
|
||||||
|
strlcat(buffer, itoa(EMS_Boiler.product_id, tmp, 10), size);
|
||||||
|
}
|
||||||
strlcat(buffer, " Version:", size);
|
strlcat(buffer, " Version:", size);
|
||||||
strlcat(buffer, EMS_Boiler.version, size);
|
strlcat(buffer, EMS_Boiler.version, size);
|
||||||
strlcat(buffer, ")", size);
|
strlcat(buffer, ")", size);
|
||||||
|
|||||||
@@ -100,10 +100,16 @@
|
|||||||
|
|
||||||
// RC1010, RC310 and RC300 specific (EMS Plus)
|
// RC1010, RC310 and RC300 specific (EMS Plus)
|
||||||
#define EMS_TYPE_RCPLUSStatusMessage 0x01A5 // is an automatic thermostat broadcast giving us temps
|
#define EMS_TYPE_RCPLUSStatusMessage 0x01A5 // is an automatic thermostat broadcast giving us temps
|
||||||
#define EMS_TYPE_RCPLUSSet 0x03 // setpoint temp message - this is incorrect!
|
#define EMS_TYPE_RCPLUSSet 0x03 // setpoint temp message
|
||||||
#define EMS_OFFSET_RCPLUSStatusMessage_setpoint 3 // setpoint temp
|
#define EMS_OFFSET_RCPLUSStatusMessage_setpoint 3 // setpoint temp
|
||||||
#define EMS_OFFSET_RCPLUSStatusMessage_curr 0 // current temp
|
#define EMS_OFFSET_RCPLUSStatusMessage_curr 0 // current temp
|
||||||
|
|
||||||
|
// Junkers FR10 (EMS Plus)
|
||||||
|
#define EMS_TYPE_FR10StatusMessage 0x6F // is an automatic thermostat broadcast giving us temps
|
||||||
|
#define EMS_OFFSET_FR10StatusMessage_setpoint 3 // setpoint temp
|
||||||
|
#define EMS_OFFSET_FR10StatusMessage_curr 5 // current temp
|
||||||
|
|
||||||
|
|
||||||
// Known EMS types
|
// Known EMS types
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EMS_MODEL_NONE,
|
EMS_MODEL_NONE,
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ static const char * TEST_DATA[] = {
|
|||||||
"30 00 FF 00 02 62 00 E4", // test 40 - SM100
|
"30 00 FF 00 02 62 00 E4", // test 40 - SM100
|
||||||
"10 48 F7 00 FF 01 A5 DF FF F7 7F 1F", // test 41 - gateway
|
"10 48 F7 00 FF 01 A5 DF FF F7 7F 1F", // test 41 - gateway
|
||||||
"30 00 FF 09 02 64 1E", // test 42 - SM100
|
"30 00 FF 09 02 64 1E", // test 42 - SM100
|
||||||
"08 00 18 00 05 03 30 00 00 00 00 04 40 80 00 02 17 80 00 00 00 FF 30 48 00 CB 00 00 00" // test 43 - sys pressure
|
"08 00 18 00 05 03 30 00 00 00 00 04 40 80 00 02 17 80 00 00 00 FF 30 48 00 CB 00 00 00", // test 43 - sys pressure
|
||||||
|
"90 00 FF 00 00 6F 03 01 00 BE 00 BF" // test 44 - FR10
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define APP_NAME "EMS-ESP"
|
#define APP_NAME "EMS-ESP"
|
||||||
#define APP_VERSION "1.7.0b14"
|
#define APP_VERSION "1.7.0b15"
|
||||||
#define APP_HOSTNAME "ems-esp"
|
#define APP_HOSTNAME "ems-esp"
|
||||||
|
|||||||
Reference in New Issue
Block a user