mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-08 16:59:50 +03:00
EMS+ updates
This commit is contained in:
@@ -5,7 +5,7 @@ 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-04-17
|
## [1.7.0 dev] 2019-05
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
@@ -15,16 +15,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- 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)
|
||||||
- `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
|
||||||
- nefit proline hrc 24 cw4 thermostat
|
- new boiler: Nefit proline hrc 24 cw4 thermostat
|
||||||
- support for Buderus RC300 and RC310 thermostats [(issue 37)](https://github.com/proddy/EMS-ESP/issues/37)
|
- new thermostats: Buderus RC300 and RC310 thermostats [(issue 37)](https://github.com/proddy/EMS-ESP/issues/37)
|
||||||
- added a test harness to try out response to various telegrams
|
- added a test harness to try out response to various telegrams
|
||||||
- EMS_ID_GATEWAY for Buderus Web Gateway KM200
|
- new devices: Buderus Web Gateway KM200, 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
|
- EMS Plus logic optimized
|
||||||
- `silent_mode` to `listen_mode`
|
- `silent_mode` to `listen_mode`
|
||||||
|
- increased Tx queue to 100
|
||||||
|
|
||||||
## [1.6.0] 2019-03-24
|
## [1.6.0] 2019-03-24
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ uint8_t scanThermostat_count = 0;
|
|||||||
|
|
||||||
// ems bus scan
|
// ems bus scan
|
||||||
Ticker scanDevices;
|
Ticker scanDevices;
|
||||||
#define SCANDEVICES_TIME 250 // ms
|
#define SCANDEVICES_TIME 350 // ms
|
||||||
uint8_t scanDevices_count;
|
uint8_t scanDevices_count;
|
||||||
|
|
||||||
Ticker showerColdShotStopTimer;
|
Ticker showerColdShotStopTimer;
|
||||||
@@ -324,7 +324,7 @@ void showInfo() {
|
|||||||
myDebug(" System logging set to None");
|
myDebug(" System logging set to None");
|
||||||
}
|
}
|
||||||
|
|
||||||
myDebug(" LED is %s, Silent mode is %s", EMSESP_Status.led ? "on" : "off", EMSESP_Status.listen_mode ? "on" : "off");
|
myDebug(" LED is %s, Listen mode is %s", EMSESP_Status.led ? "on" : "off", EMSESP_Status.listen_mode ? "on" : "off");
|
||||||
if (EMSESP_Status.dallas_sensors > 0) {
|
if (EMSESP_Status.dallas_sensors > 0) {
|
||||||
myDebug(" %d external temperature sensor%s found", EMSESP_Status.dallas_sensors, (EMSESP_Status.dallas_sensors == 1) ? "" : "s");
|
myDebug(" %d external temperature sensor%s found", EMSESP_Status.dallas_sensors, (EMSESP_Status.dallas_sensors == 1) ? "" : "s");
|
||||||
}
|
}
|
||||||
@@ -893,7 +893,7 @@ void startDeviceScan() {
|
|||||||
publishSensorValuesTimer.detach();
|
publishSensorValuesTimer.detach();
|
||||||
scanDevices_count = 1; // starts at 1
|
scanDevices_count = 1; // starts at 1
|
||||||
ems_setLogging(EMS_SYS_LOGGING_NONE);
|
ems_setLogging(EMS_SYS_LOGGING_NONE);
|
||||||
myDebug("Starting a deep EMS device scan. This will take about 1 minute. Please wait...");
|
myDebug("Starting a deep EMS device scan. This can take up to 2 minutes. Please wait...");
|
||||||
scanThermostat.attach_ms(SCANDEVICES_TIME, do_scanDevices);
|
scanThermostat.attach_ms(SCANDEVICES_TIME, do_scanDevices);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -971,7 +971,7 @@ bool FSCallback(MYESP_FSACTION action, const JsonObject json) {
|
|||||||
EMS_Boiler.device_id = EMSESP_BOILER_TYPE; // set default
|
EMS_Boiler.device_id = EMSESP_BOILER_TYPE; // set default
|
||||||
}
|
}
|
||||||
|
|
||||||
// silent mode
|
// listen mode
|
||||||
EMSESP_Status.listen_mode = json["listen_mode"];
|
EMSESP_Status.listen_mode = json["listen_mode"];
|
||||||
ems_setTxDisabled(EMSESP_Status.listen_mode);
|
ems_setTxDisabled(EMSESP_Status.listen_mode);
|
||||||
|
|
||||||
@@ -1512,7 +1512,7 @@ void WIFICallback() {
|
|||||||
emsuart_init();
|
emsuart_init();
|
||||||
myDebug("[UART] Opened Rx/Tx connection");
|
myDebug("[UART] Opened Rx/Tx connection");
|
||||||
if (!EMSESP_Status.listen_mode) {
|
if (!EMSESP_Status.listen_mode) {
|
||||||
// go and find the boiler and thermostat types, if not in silent mode
|
// go and find the boiler and thermostat types, if not in listen mode
|
||||||
ems_discoverModels();
|
ems_discoverModels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
71
src/ems.cpp
71
src/ems.cpp
@@ -15,7 +15,7 @@
|
|||||||
#include <list> // std::list
|
#include <list> // std::list
|
||||||
|
|
||||||
#ifdef TESTS
|
#ifdef TESTS
|
||||||
#include "unit_tests.h"
|
#include "test_data.h"
|
||||||
uint8_t _TEST_DATA_max = ArraySize(TEST_DATA);
|
uint8_t _TEST_DATA_max = ArraySize(TEST_DATA);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -382,8 +382,7 @@ void ems_setLogging(_EMS_SYS_LOGGING loglevel) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate CRC checksum using lookup table for speed
|
* Calculate CRC checksum using lookup table for speed
|
||||||
* len is length of data in bytes (including the CRC byte at end)
|
* len is length of all the data in bytes (including the header & CRC byte at end)
|
||||||
* So its the complete telegram with the header. CRC is calculated only over the data bytes
|
|
||||||
*/
|
*/
|
||||||
uint8_t _crcCalculator(uint8_t * data, uint8_t len) {
|
uint8_t _crcCalculator(uint8_t * data, uint8_t len) {
|
||||||
uint8_t crc = 0;
|
uint8_t crc = 0;
|
||||||
@@ -456,8 +455,8 @@ void _debugPrintTelegram(const char * prefix, _EMS_RxTelegram * EMS_RxTelegram,
|
|||||||
char output_str[200] = {0};
|
char output_str[200] = {0};
|
||||||
char buffer[16] = {0};
|
char buffer[16] = {0};
|
||||||
uint8_t * data = EMS_RxTelegram->telegram;
|
uint8_t * data = EMS_RxTelegram->telegram;
|
||||||
uint8_t len = EMS_RxTelegram->data_length; // length of data block
|
uint8_t data_len = EMS_RxTelegram->data_length; // length of data block
|
||||||
uint8_t full_len = EMS_RxTelegram->length - 1; // no CRC
|
uint8_t length = EMS_RxTelegram->length; // includes CRC
|
||||||
|
|
||||||
strlcpy(output_str, "(", sizeof(output_str));
|
strlcpy(output_str, "(", sizeof(output_str));
|
||||||
strlcat(output_str, COLOR_CYAN, sizeof(output_str));
|
strlcat(output_str, COLOR_CYAN, sizeof(output_str));
|
||||||
@@ -475,19 +474,19 @@ void _debugPrintTelegram(const char * prefix, _EMS_RxTelegram * EMS_RxTelegram,
|
|||||||
strlcat(output_str, prefix, sizeof(output_str));
|
strlcat(output_str, prefix, sizeof(output_str));
|
||||||
strlcat(output_str, " telegram: ", sizeof(output_str));
|
strlcat(output_str, " telegram: ", sizeof(output_str));
|
||||||
|
|
||||||
for (int i = 0; i < full_len; i++) {
|
for (int i = 0; i < (length - 1); i++) {
|
||||||
strlcat(output_str, _hextoa(data[i], buffer), sizeof(output_str));
|
strlcat(output_str, _hextoa(data[i], buffer), sizeof(output_str));
|
||||||
strlcat(output_str, " ", sizeof(output_str)); // add space
|
strlcat(output_str, " ", sizeof(output_str)); // add space
|
||||||
}
|
}
|
||||||
|
|
||||||
strlcat(output_str, "(CRC=", sizeof(output_str));
|
strlcat(output_str, "(CRC=", sizeof(output_str));
|
||||||
strlcat(output_str, _hextoa(data[full_len], buffer), sizeof(output_str));
|
strlcat(output_str, _hextoa(data[length - 1], buffer), sizeof(output_str));
|
||||||
strlcat(output_str, ")", sizeof(output_str));
|
strlcat(output_str, ")", sizeof(output_str));
|
||||||
|
|
||||||
// print number of data bytes only if its a valid telegram
|
// print number of data bytes only if its a valid telegram
|
||||||
if (len > 5) {
|
if (data_len) {
|
||||||
strlcat(output_str, ", #data=", sizeof(output_str));
|
strlcat(output_str, " #data=", sizeof(output_str));
|
||||||
strlcat(output_str, itoa(len, buffer, 10), sizeof(output_str));
|
strlcat(output_str, itoa(data_len, buffer, 10), sizeof(output_str));
|
||||||
}
|
}
|
||||||
|
|
||||||
strlcat(output_str, COLOR_RESET, sizeof(output_str));
|
strlcat(output_str, COLOR_RESET, sizeof(output_str));
|
||||||
@@ -638,7 +637,7 @@ void ems_parseTelegram(uint8_t * telegram, uint8_t length) {
|
|||||||
/**
|
/**
|
||||||
* the main logic that parses the telegram message
|
* the main logic that parses the telegram message
|
||||||
* When we receive a Poll Request we need to send any Tx packages quickly within a 200ms window
|
* When we receive a Poll Request we need to send any Tx packages quickly within a 200ms window
|
||||||
* length is total number of bytes of the telegram including the CRC byte at the end if it exists
|
* length is total number of bytes of the telegram including the CRC byte at the end (if it exists)
|
||||||
*/
|
*/
|
||||||
void _ems_readTelegram(uint8_t * telegram, uint8_t length) {
|
void _ems_readTelegram(uint8_t * telegram, uint8_t length) {
|
||||||
// create the Rx package
|
// create the Rx package
|
||||||
@@ -712,7 +711,7 @@ void _ems_readTelegram(uint8_t * telegram, uint8_t length) {
|
|||||||
if (length <= 7) {
|
if (length <= 7) {
|
||||||
EMS_RxTelegram.data_length = 0; // special broadcast on ems+ have no data values
|
EMS_RxTelegram.data_length = 0; // special broadcast on ems+ have no data values
|
||||||
} else {
|
} else {
|
||||||
EMS_RxTelegram.data_length = length - 8; // remove 5 bytes header plus CRC + length byte + 0x00 at end
|
EMS_RxTelegram.data_length = length - 7; // remove 6 byte header plus CRC
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
EMS_RxTelegram.emsplus = false;
|
EMS_RxTelegram.emsplus = false;
|
||||||
@@ -832,16 +831,21 @@ void _printMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
* and then call its callback if there is one defined
|
* and then call its callback if there is one defined
|
||||||
*/
|
*/
|
||||||
void _ems_processTelegram(_EMS_RxTelegram * EMS_RxTelegram) {
|
void _ems_processTelegram(_EMS_RxTelegram * EMS_RxTelegram) {
|
||||||
// header
|
|
||||||
uint8_t src = EMS_RxTelegram->src;
|
|
||||||
uint16_t type = EMS_RxTelegram->type;
|
|
||||||
uint8_t offset = EMS_RxTelegram->offset;
|
|
||||||
|
|
||||||
// print out the telegram
|
// print out the telegram for verbose mode
|
||||||
if (EMS_Sys_Status.emsLogging >= EMS_SYS_LOGGING_THERMOSTAT) {
|
if (EMS_Sys_Status.emsLogging >= EMS_SYS_LOGGING_THERMOSTAT) {
|
||||||
_printMessage(EMS_RxTelegram);
|
_printMessage(EMS_RxTelegram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ignore telegrams that don't have any data
|
||||||
|
if (EMS_RxTelegram->data_length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// header
|
||||||
|
uint8_t src = EMS_RxTelegram->src;
|
||||||
|
uint16_t type = EMS_RxTelegram->type;
|
||||||
|
|
||||||
// see if we recognize the type first by scanning our known EMS types list
|
// see if we recognize the type first by scanning our known EMS types list
|
||||||
bool typeFound = false;
|
bool typeFound = false;
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
@@ -866,14 +870,13 @@ void _ems_processTelegram(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_BASIC) || (EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_VERBOSE)) {
|
if ((EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_BASIC) || (EMS_Sys_Status.emsLogging == EMS_SYS_LOGGING_VERBOSE)) {
|
||||||
myDebug("<--- %s(0x%02X) received", EMS_Types[i].typeString, type);
|
myDebug("<--- %s(0x%02X) received", EMS_Types[i].typeString, type);
|
||||||
}
|
}
|
||||||
// call callback function to process it
|
// call callback function to process the telegram, only if there is data
|
||||||
// as we only handle complete telegrams (not partial) check that the offset is 0
|
|
||||||
// if EMS+ always proces it
|
|
||||||
if (EMS_RxTelegram->emsplus) {
|
if (EMS_RxTelegram->emsplus) {
|
||||||
|
// if EMS+ always proces it
|
||||||
(void)EMS_Types[i].processType_cb(EMS_RxTelegram);
|
(void)EMS_Types[i].processType_cb(EMS_RxTelegram);
|
||||||
} else {
|
} else {
|
||||||
// only if the offset is 0 as we want to handle full telegrams and not partial
|
// only if the offset is 0 as we want to handle full telegrams and not partial
|
||||||
if (offset == EMS_ID_NONE) {
|
if (EMS_RxTelegram->offset == EMS_ID_NONE) {
|
||||||
(void)EMS_Types[i].processType_cb(EMS_RxTelegram);
|
(void)EMS_Types[i].processType_cb(EMS_RxTelegram);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1193,7 +1196,8 @@ void _process_EasyStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
||||||
if (EMS_RxTelegram->offset == 0) {
|
if (EMS_RxTelegram->offset == 0) {
|
||||||
// the whole telegram
|
// 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 (CRC=CC), #data=27
|
// 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
|
||||||
EMS_Thermostat.curr_roomTemp = _toShort(EMS_OFFSET_RCPLUSStatusMessage_curr); // value is * 10
|
EMS_Thermostat.curr_roomTemp = _toShort(EMS_OFFSET_RCPLUSStatusMessage_curr); // value is * 10
|
||||||
EMS_Thermostat.setpoint_roomTemp = _toByte(EMS_OFFSET_RCPLUSStatusMessage_setpoint); // value is * 2
|
EMS_Thermostat.setpoint_roomTemp = _toByte(EMS_OFFSET_RCPLUSStatusMessage_setpoint); // value is * 2
|
||||||
|
|
||||||
@@ -1202,14 +1206,14 @@ void _process_RCPLUSStatusMessage(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
// day night is byte(8), 0x01 for night, 0x00 for day
|
// day night is byte(8), 0x01 for night, 0x00 for day
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is a temp value but not sure which one
|
// actual set point
|
||||||
// e.g. Thermostat -> all, telegram: 10 00 FF 07 01 A5 32 (CRC=4E), #data=3
|
// e.g. Thermostat -> all, telegram: 10 00 FF 07 01 A5 32
|
||||||
if (EMS_RxTelegram->offset == 7) {
|
if (EMS_RxTelegram->offset == 7) {
|
||||||
// to add...
|
// to add...
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is a temp value but not sure which one
|
// next set point
|
||||||
// e.g. Thermostat -> all, telegram: 18 00 FF 06 01 A5 22 (CRC=64), #data=3
|
// e.g. Thermostat -> all, telegram: 18 00 FF 06 01 A5 22
|
||||||
if (EMS_RxTelegram->offset == 6) {
|
if (EMS_RxTelegram->offset == 6) {
|
||||||
// to add...
|
// to add...
|
||||||
}
|
}
|
||||||
@@ -1286,8 +1290,13 @@ void _process_SM10Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
|
|||||||
* SM100Monitor - type 0x0262 EMS+
|
* SM100Monitor - type 0x0262 EMS+
|
||||||
*/
|
*/
|
||||||
void _process_SM100Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
|
void _process_SM100Monitor(_EMS_RxTelegram * EMS_RxTelegram) {
|
||||||
|
if (EMS_RxTelegram->data_length <= 2) {
|
||||||
EMS_Other.SMcollectorTemp = _toShort(0); // collector temp from SM100, is *10
|
EMS_Other.SMcollectorTemp = _toShort(0); // collector temp from SM100, is *10
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EMS_RxTelegram->data_length > 2) {
|
||||||
EMS_Other.SMbottomTemp = _toShort(2); // bottom temp from SM100, is *10
|
EMS_Other.SMbottomTemp = _toShort(2); // bottom temp from SM100, is *10
|
||||||
|
}
|
||||||
|
|
||||||
EMS_Other.SM = true;
|
EMS_Other.SM = true;
|
||||||
EMS_Sys_Status.emsRefreshed = true; // triggers a send the values back via MQTT
|
EMS_Sys_Status.emsRefreshed = true; // triggers a send the values back via MQTT
|
||||||
@@ -1819,7 +1828,7 @@ void ems_doReadCommand(uint16_t type, uint8_t dest, bool forceRefresh) {
|
|||||||
|
|
||||||
// if we're preventing all outbound traffic, quit
|
// if we're preventing all outbound traffic, quit
|
||||||
if (EMS_Sys_Status.emsTxDisabled) {
|
if (EMS_Sys_Status.emsTxDisabled) {
|
||||||
myDebug("in Silent Mode. All Tx is disabled.");
|
myDebug("in Listen Mode. All Tx is disabled.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2202,18 +2211,16 @@ void ems_setWarmTapWaterActivated(bool activated) {
|
|||||||
*/
|
*/
|
||||||
void ems_startupTelegrams() {
|
void ems_startupTelegrams() {
|
||||||
if ((EMS_Sys_Status.emsTxDisabled) || (!EMS_Sys_Status.emsBusConnected)) {
|
if ((EMS_Sys_Status.emsTxDisabled) || (!EMS_Sys_Status.emsBusConnected)) {
|
||||||
myDebug("Unable to send startup sequence when in silent mode or bus is disabled");
|
myDebug("Unable to send startup sequence when in listen mode or the bus is disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
myDebug("Sending startup sequence...");
|
myDebug("Sending startup sequence...");
|
||||||
char s[20] = {0};
|
char s[20] = {0};
|
||||||
|
|
||||||
// (00:07:27.512) Telegram echo: telegram: 0B 08 1D 00 00 (CRC=84), #data=1
|
|
||||||
// Write type 0x1D to get out of function test mode
|
// Write type 0x1D to get out of function test mode
|
||||||
snprintf(s, sizeof(s), "%02X %02X 1D 00 00", EMS_ID_ME, EMS_Boiler.device_id);
|
snprintf(s, sizeof(s), "%02X %02X 1D 00 00", EMS_ID_ME, EMS_Boiler.device_id);
|
||||||
ems_sendRawTelegram(s);
|
ems_sendRawTelegram(s);
|
||||||
|
|
||||||
// (00:07:35.555) Telegram echo: telegram: 0B 88 01 00 1B (CRC=8B), #data=1
|
|
||||||
// Read type 0x01
|
// Read type 0x01
|
||||||
snprintf(s, sizeof(s), "%02X %02X 01 00 1B", EMS_ID_ME, EMS_Boiler.device_id | 0x80);
|
snprintf(s, sizeof(s), "%02X %02X 01 00 1B", EMS_ID_ME, EMS_Boiler.device_id | 0x80);
|
||||||
ems_sendRawTelegram(s);
|
ems_sendRawTelegram(s);
|
||||||
@@ -2262,11 +2269,11 @@ void ems_testTelegram(uint8_t test_num) {
|
|||||||
length++; // this is the total amount of bytes
|
length++; // this is the total amount of bytes
|
||||||
telegram[length] = _crcCalculator(telegram, length + 1); // add the CRC
|
telegram[length] = _crcCalculator(telegram, length + 1); // add the CRC
|
||||||
|
|
||||||
myDebug("[TEST %d] Injecting telegram %s (data length %d)", test_num, TEST_DATA[test_num - 1], length);
|
myDebug("[TEST %d] Injecting telegram %s", test_num, TEST_DATA[test_num - 1]);
|
||||||
|
|
||||||
// go an parse it
|
// go an parse it
|
||||||
_ems_readTelegram(telegram, length + 1); // include CRC in length
|
_ems_readTelegram(telegram, length + 1); // include CRC in length
|
||||||
#else
|
#else
|
||||||
myDebug("Firmware not compiled with tests");
|
myDebug("Firmware not compiled with test data set");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
#define EMS_ID_SM 0x30 // Solar Module SM10 and SM100
|
#define EMS_ID_SM 0x30 // Solar Module SM10 and SM100
|
||||||
#define EMS_ID_GATEWAY 0x48 // KM200 Web Gateway
|
#define EMS_ID_GATEWAY 0x48 // KM200 Web Gateway
|
||||||
|
|
||||||
|
|
||||||
#define EMS_MIN_TELEGRAM_LENGTH 6 // minimal length for a validation telegram, including CRC
|
#define EMS_MIN_TELEGRAM_LENGTH 6 // minimal length for a validation telegram, including CRC
|
||||||
|
|
||||||
// max length of a telegram, including CRC, for Rx and Tx.
|
// max length of a telegram, including CRC, for Rx and Tx.
|
||||||
@@ -40,10 +39,10 @@
|
|||||||
#define EMS_BOILER_BURNPOWER_TAPWATER 100
|
#define EMS_BOILER_BURNPOWER_TAPWATER 100
|
||||||
#define EMS_BOILER_SELFLOWTEMP_HEATING 70
|
#define EMS_BOILER_SELFLOWTEMP_HEATING 70
|
||||||
|
|
||||||
//define maximum settable tapwater temperature, not every installation supports 90 degrees
|
// define maximum settable tapwater temperature
|
||||||
#define EMS_BOILER_TAPWATER_TEMPERATURE_MAX 60
|
#define EMS_BOILER_TAPWATER_TEMPERATURE_MAX 60
|
||||||
|
|
||||||
#define EMS_TX_TELEGRAM_QUEUE_MAX 50 // max size of Tx FIFO queue
|
#define EMS_TX_TELEGRAM_QUEUE_MAX 100 // max size of Tx FIFO queue
|
||||||
|
|
||||||
// #define EMS_SYS_LOGGING_DEFAULT EMS_SYS_LOGGING_VERBOSE
|
// #define EMS_SYS_LOGGING_DEFAULT EMS_SYS_LOGGING_VERBOSE
|
||||||
#define EMS_SYS_LOGGING_DEFAULT EMS_SYS_LOGGING_NONE
|
#define EMS_SYS_LOGGING_DEFAULT EMS_SYS_LOGGING_NONE
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
// 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 - this is incorrect!
|
||||||
#define EMS_OFFSET_RCPLUSStatusMessage_setpoint 2 // 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
|
||||||
|
|
||||||
// Known EMS types
|
// Known EMS types
|
||||||
|
|||||||
29
src/test_data.h
Normal file
29
src/test_data.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
#ifdef TESTS
|
||||||
|
|
||||||
|
static const char * TEST_DATA[] = {
|
||||||
|
|
||||||
|
"08 00 34 00 3E 02 1D 80 00 31 00 00 01 00 01 0B AE 02", // test 1 - EMS
|
||||||
|
"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", // test 2 - RC310 ems+
|
||||||
|
"10 00 FF 19 01 A5 06 04 00 00 00 00 FF 64 37 00 3C 01 FF 01", // test 3 - RC310 ems+
|
||||||
|
"30 00 FF 00 02 62 00 A1 01 3F 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00", // test 4 - SM100
|
||||||
|
"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", // test 5 - RC1010
|
||||||
|
"18 00 FF 00 01 A5 00 DD 21 23 00 00 23 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00", // test 6 - RC300
|
||||||
|
"90 00 FF 00 00 6F 01 01 00 46 00 B9", // test 7 - FR10
|
||||||
|
"30 00 FF 00 02 62 01 FB 01 9E 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 2B", // test 8 - SM100
|
||||||
|
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 0C 20 64 00 00 00 00 E9", // test 9 - SM100
|
||||||
|
"30 09 FF 00 00 01", // test 10 - EMS+
|
||||||
|
"30 0B 97 00", // test 11 - SM100
|
||||||
|
"30 00 FF 00 02 62 1 CA", // test 12 - SM100
|
||||||
|
"30 00 FF 00 02 8E 00 00 00 00 00 00 05 19 00 00 75 D3", // test 13 - SM100
|
||||||
|
"30 00 FF 00 02 63 80 00 80 00 00 00 80 00 80 00 80 00 00", // test 14 - SM100
|
||||||
|
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 0B 09 64 00 00 00 00", // test 15 - SM100
|
||||||
|
"30 00 FF 00 02 62 01 CA 01 93 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00", // test 16 - SM100
|
||||||
|
"30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 03 03", // test 17 - SM100
|
||||||
|
"30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 04 03", // test 18 - SM100
|
||||||
|
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 09 08 64 00 00 00 00", // test 19 - SM100
|
||||||
|
"10 00 FF 07 01 A5 32" // test 20 - RC EMS+
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
#ifdef TESTS
|
|
||||||
|
|
||||||
static const char * TEST_DATA[] = {
|
|
||||||
|
|
||||||
"08 00 34 00 3E 02 1D 80 00 31 00 00 01 00 01 0B AE 02", // test 1 - EMS
|
|
||||||
"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", // test 2 - RC310 ems+
|
|
||||||
"10 00 FF 19 01 A5 06 04 00 00 00 00 FF 64 37 00 3C 01 FF 01", // test 3 - RC310 ems+
|
|
||||||
"30 00 FF 00 02 62 00 A1 01 3F 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00", // test 4 - SM100
|
|
||||||
"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", // test 5 - RC1010
|
|
||||||
"18 00 FF 00 01 A5 00 DD 21 23 00 00 23 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00", // test 6 - RC300
|
|
||||||
"90 00 FF 00 00 6F 01 01 00 46 00 B9", // test 7 - FR10
|
|
||||||
"30 00 FF 00 02 62 01 FB 01 9E 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 2B", // test 8 - SM100
|
|
||||||
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 0C 20 64 00 00 00 00 E9", // test 9 - SM100
|
|
||||||
"30 09 FF 00 00 01", // test 10 - EMS+
|
|
||||||
"30 0B 97 00", // test 11 - SM100
|
|
||||||
"30 00 FF 00 02 62 1 CA", // test 12 - SM100
|
|
||||||
"30 00 FF 00 02 8E 00 00 00 00 00 00 05 19 00 00 75 D3", // test 13 - SM100
|
|
||||||
"30 00 FF 00 02 63 80 00 80 00 00 00 80 00 80 00 80 00 00", // test 14 - SM100
|
|
||||||
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 0B 09 64 00 00 00 00", // test 15 - SM100
|
|
||||||
"30 00 FF 00 02 62 01 CA 01 93 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00 80 00", // test 16 - SM100
|
|
||||||
"30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 03 03", // test 17 - SM100
|
|
||||||
"30 00 FF 00 02 6A 03 03 03 00 03 03 03 03 03 00 04 03", // test 18 - SM100
|
|
||||||
"30 00 FF 00 02 64 00 00 00 04 00 00 FF 00 00 1E 09 08 64 00 00 00 00" // test 19 - SM100
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user