mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
code optimizations on EMS device library
This commit is contained in:
@@ -33,6 +33,7 @@ There are breaking changes in this release. See `publish_time` below and make su
|
|||||||
- Keeping Thermostat day/night modes separate from off/auto/manual, and setting this for the Junkers FR50
|
- Keeping Thermostat day/night modes separate from off/auto/manual, and setting this for the Junkers FR50
|
||||||
- Removed `publish_always` and use `publish_time`. For automatic mode you will need to change `publish_time` to 0 which will send MQTT every time data has changed (every 10 seconds).
|
- Removed `publish_always` and use `publish_time`. For automatic mode you will need to change `publish_time` to 0 which will send MQTT every time data has changed (every 10 seconds).
|
||||||
- Changed NTP interval from 1 hour to 12 hours
|
- Changed NTP interval from 1 hour to 12 hours
|
||||||
|
- Refactored EMS device library to make it support multi-EMS devices easier (e.g. multiple thermostats)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ static const command_t project_cmds[] PROGMEM = {
|
|||||||
{true, "publish_time <seconds>", "set frequency for publishing data to MQTT (0=automatic)"},
|
{true, "publish_time <seconds>", "set frequency for publishing data to MQTT (0=automatic)"},
|
||||||
{true, "tx_mode <n>", "changes Tx logic. 1=EMS generic, 2=EMS+, 3=HT3"},
|
{true, "tx_mode <n>", "changes Tx logic. 1=EMS generic, 2=EMS+, 3=HT3"},
|
||||||
|
|
||||||
{false, "info", "show current captured on the devices"},
|
{false, "info", "show current values deciphered from the EMS messages"},
|
||||||
{false, "log <n | b | t | s | r | j | v>", "set logging mode to none, basic, thermostat only, solar module only, raw, jabber or verbose"},
|
{false, "log <n | b | t | s | r | j | v>", "set logging mode to none, basic, thermostat only, solar module only, raw, jabber or verbose"},
|
||||||
|
|
||||||
#ifdef TESTS
|
#ifdef TESTS
|
||||||
@@ -111,7 +111,7 @@ static const command_t project_cmds[] PROGMEM = {
|
|||||||
|
|
||||||
{false, "publish", "publish all values to MQTT"},
|
{false, "publish", "publish all values to MQTT"},
|
||||||
{false, "refresh", "fetch values from the EMS devices"},
|
{false, "refresh", "fetch values from the EMS devices"},
|
||||||
{false, "devices [all]", "list all supported and detected EMS devices"},
|
{false, "devices", "list detected EMS devices"},
|
||||||
{false, "queue", "show current Tx queue"},
|
{false, "queue", "show current Tx queue"},
|
||||||
{false, "autodetect [quick]", "detect EMS devices and attempt to automatically set boiler and thermostat types"},
|
{false, "autodetect [quick]", "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, "send XX ...", "send raw telegram data to EMS bus (XX are hex values)"},
|
||||||
@@ -143,11 +143,11 @@ void myDebugLog(const char * s) {
|
|||||||
// hc_num is 1 to 4
|
// hc_num is 1 to 4
|
||||||
_EMS_THERMOSTAT_MODE _getThermostatMode(uint8_t hc_num) {
|
_EMS_THERMOSTAT_MODE _getThermostatMode(uint8_t hc_num) {
|
||||||
_EMS_THERMOSTAT_MODE thermoMode = EMS_THERMOSTAT_MODE_UNKNOWN;
|
_EMS_THERMOSTAT_MODE thermoMode = EMS_THERMOSTAT_MODE_UNKNOWN;
|
||||||
uint8_t model = ems_getThermostatModel();
|
|
||||||
|
|
||||||
uint8_t mode = EMS_Thermostat.hc[hc_num - 1].mode;
|
uint8_t mode = EMS_Thermostat.hc[hc_num - 1].mode;
|
||||||
|
uint8_t model = ems_getThermostatModel();
|
||||||
|
|
||||||
if (model == EMS_MODEL_RC20) {
|
if (model == EMS_DEVICE_FLAG_RC20) {
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_OFF;
|
thermoMode = EMS_THERMOSTAT_MODE_OFF;
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
@@ -155,13 +155,13 @@ _EMS_THERMOSTAT_MODE _getThermostatMode(uint8_t hc_num) {
|
|||||||
} else if (mode == 2) {
|
} else if (mode == 2) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_AUTO;
|
thermoMode = EMS_THERMOSTAT_MODE_AUTO;
|
||||||
}
|
}
|
||||||
} else if (model == EMS_MODEL_RC300) {
|
} else if (model == EMS_DEVICE_FLAG_RC300) {
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_MANUAL;
|
thermoMode = EMS_THERMOSTAT_MODE_MANUAL;
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_AUTO;
|
thermoMode = EMS_THERMOSTAT_MODE_AUTO;
|
||||||
}
|
}
|
||||||
} else if (model == EMS_MODEL_FR10 || model == EMS_MODEL_FR50 || model == EMS_MODEL_FR100) {
|
} else if (model == EMS_DEVICE_FLAG_JUNKERS) {
|
||||||
if (mode == 1) {
|
if (mode == 1) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_MANUAL;
|
thermoMode = EMS_THERMOSTAT_MODE_MANUAL;
|
||||||
} else if (mode == 2) {
|
} else if (mode == 2) {
|
||||||
@@ -181,7 +181,7 @@ _EMS_THERMOSTAT_MODE _getThermostatMode(uint8_t hc_num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// figures out the thermostat day/night mode depending on the thermostat type
|
// figures out the thermostat day/night mode depending on the thermostat type
|
||||||
// returns {EMS_THERMOSTAT_MODE_UNKNOWN, EMS_THERMOSTAT_MODE_OFF, EMS_THERMOSTAT_MODE_MANUAL, EMS_THERMOSTAT_MODE_AUTO, EMS_THERMOSTAT_MODE_NIGHT, EMS_THERMOSTAT_MODE_DAY}
|
// returns {EMS_THERMOSTAT_MODE_NIGHT, EMS_THERMOSTAT_MODE_DAY}
|
||||||
// hc_num is 1 to 4
|
// hc_num is 1 to 4
|
||||||
_EMS_THERMOSTAT_MODE _getThermostatDayMode(uint8_t hc_num) {
|
_EMS_THERMOSTAT_MODE _getThermostatDayMode(uint8_t hc_num) {
|
||||||
_EMS_THERMOSTAT_MODE thermoMode = EMS_THERMOSTAT_MODE_UNKNOWN;
|
_EMS_THERMOSTAT_MODE thermoMode = EMS_THERMOSTAT_MODE_UNKNOWN;
|
||||||
@@ -189,19 +189,19 @@ _EMS_THERMOSTAT_MODE _getThermostatDayMode(uint8_t hc_num) {
|
|||||||
|
|
||||||
uint8_t mode = EMS_Thermostat.hc[hc_num - 1].day_mode;
|
uint8_t mode = EMS_Thermostat.hc[hc_num - 1].day_mode;
|
||||||
|
|
||||||
if (model == EMS_MODEL_FW100 || model == EMS_MODEL_FW120 || model == EMS_MODEL_FR10 || model == EMS_MODEL_FR100 || model == EMS_MODEL_FR50) {
|
if (model == EMS_DEVICE_FLAG_JUNKERS) {
|
||||||
if (mode == 3) {
|
if (mode == 3) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_DAY;
|
thermoMode = EMS_THERMOSTAT_MODE_DAY;
|
||||||
} else if (mode == 2) {
|
} else if (mode == 2) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
||||||
}
|
}
|
||||||
} else if (model == EMS_MODEL_RC35 || model == EMS_MODEL_ES73) {
|
} else if (model == EMS_DEVICE_FLAG_RC35) {
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_DAY;
|
thermoMode = EMS_THERMOSTAT_MODE_DAY;
|
||||||
}
|
}
|
||||||
} else if (model == EMS_MODEL_RC100 || model == EMS_MODEL_RC300) {
|
} else if (model == EMS_DEVICE_FLAG_RC300) {
|
||||||
if (mode == 0) {
|
if (mode == 0) {
|
||||||
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
thermoMode = EMS_THERMOSTAT_MODE_NIGHT;
|
||||||
} else if (mode == 1) {
|
} else if (mode == 1) {
|
||||||
@@ -271,7 +271,7 @@ void showInfo() {
|
|||||||
myDebug_P(PSTR("%sBoiler stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
myDebug_P(PSTR("%sBoiler stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
||||||
|
|
||||||
// version details
|
// version details
|
||||||
myDebug_P(PSTR(" Boiler: %s"), ems_getBoilerDescription(buffer_type));
|
myDebug_P(PSTR(" Boiler: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_BOILER, buffer_type));
|
||||||
|
|
||||||
// active stats
|
// active stats
|
||||||
if (ems_getBusConnected()) {
|
if (ems_getBusConnected()) {
|
||||||
@@ -364,7 +364,7 @@ void showInfo() {
|
|||||||
if (ems_getSolarModuleEnabled()) {
|
if (ems_getSolarModuleEnabled()) {
|
||||||
myDebug_P(PSTR("")); // newline
|
myDebug_P(PSTR("")); // newline
|
||||||
myDebug_P(PSTR("%sSolar Module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
myDebug_P(PSTR("%sSolar Module stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
||||||
myDebug_P(PSTR(" Solar module: %s"), ems_getSolarModuleDescription(buffer_type));
|
myDebug_P(PSTR(" Solar module: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_SOLAR, buffer_type));
|
||||||
_renderShortValue("Collector temperature", "C", EMS_SolarModule.collectorTemp);
|
_renderShortValue("Collector temperature", "C", EMS_SolarModule.collectorTemp);
|
||||||
_renderShortValue("Bottom temperature", "C", EMS_SolarModule.bottomTemp);
|
_renderShortValue("Bottom temperature", "C", EMS_SolarModule.bottomTemp);
|
||||||
_renderIntValue("Pump modulation", "%", EMS_SolarModule.pumpModulation);
|
_renderIntValue("Pump modulation", "%", EMS_SolarModule.pumpModulation);
|
||||||
@@ -384,7 +384,7 @@ void showInfo() {
|
|||||||
if (ems_getHeatPumpEnabled()) {
|
if (ems_getHeatPumpEnabled()) {
|
||||||
myDebug_P(PSTR("")); // newline
|
myDebug_P(PSTR("")); // newline
|
||||||
myDebug_P(PSTR("%sHeat Pump stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
myDebug_P(PSTR("%sHeat Pump stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
||||||
myDebug_P(PSTR(" Heat Pump module: %s"), ems_getHeatPumpDescription(buffer_type));
|
myDebug_P(PSTR(" Heat Pump module: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_HEATPUMP, buffer_type));
|
||||||
_renderIntValue("Pump modulation", "%", EMS_HeatPump.HPModulation);
|
_renderIntValue("Pump modulation", "%", EMS_HeatPump.HPModulation);
|
||||||
_renderIntValue("Pump speed", "%", EMS_HeatPump.HPSpeed);
|
_renderIntValue("Pump speed", "%", EMS_HeatPump.HPSpeed);
|
||||||
}
|
}
|
||||||
@@ -393,24 +393,21 @@ void showInfo() {
|
|||||||
if (ems_getThermostatEnabled()) {
|
if (ems_getThermostatEnabled()) {
|
||||||
myDebug_P(PSTR("")); // newline
|
myDebug_P(PSTR("")); // newline
|
||||||
myDebug_P(PSTR("%sThermostat stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
myDebug_P(PSTR("%sThermostat stats:%s"), COLOR_BOLD_ON, COLOR_BOLD_OFF);
|
||||||
myDebug_P(PSTR(" Thermostat: %s"), ems_getThermostatDescription(buffer_type, false));
|
myDebug_P(PSTR(" Thermostat: %s"), ems_getDeviceDescription(EMS_DEVICE_TYPE_THERMOSTAT, buffer_type, false));
|
||||||
|
|
||||||
// Render Thermostat Date & Time
|
// Render Thermostat Date & Time
|
||||||
uint8_t model = ems_getThermostatModel();
|
uint8_t model = ems_getThermostatModel();
|
||||||
if ((model != EMS_MODEL_EASY)) {
|
if ((model != EMS_DEVICE_FLAG_EASY)) {
|
||||||
myDebug_P(PSTR(" Thermostat time is %s"), EMS_Thermostat.datetime);
|
myDebug_P(PSTR(" Thermostat time is %s"), EMS_Thermostat.datetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t _m_setpoint, _m_curr;
|
uint8_t _m_setpoint, _m_curr;
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case EMS_MODEL_EASY:
|
case EMS_DEVICE_FLAG_EASY:
|
||||||
_m_setpoint = 10; // *100
|
_m_setpoint = 10; // *100
|
||||||
_m_curr = 10; // *100
|
_m_curr = 10; // *100
|
||||||
break;
|
break;
|
||||||
case EMS_MODEL_FR10:
|
case EMS_DEVICE_FLAG_JUNKERS:
|
||||||
case EMS_MODEL_FR50:
|
|
||||||
case EMS_MODEL_FW100:
|
|
||||||
case EMS_MODEL_FW120:
|
|
||||||
_m_setpoint = 1; // *10
|
_m_setpoint = 1; // *10
|
||||||
_m_curr = 1; // *10
|
_m_curr = 1; // *10
|
||||||
break;
|
break;
|
||||||
@@ -430,7 +427,7 @@ void showInfo() {
|
|||||||
|
|
||||||
// Render Day/Night/Holiday Temperature on RC35s
|
// Render Day/Night/Holiday Temperature on RC35s
|
||||||
// there is no single setpoint temp, but one for day, night and vacation
|
// there is no single setpoint temp, but one for day, night and vacation
|
||||||
if (model == EMS_MODEL_RC35) {
|
if (model == EMS_DEVICE_FLAG_RC35) {
|
||||||
if (EMS_Thermostat.hc[hc_num - 1].summer_mode) {
|
if (EMS_Thermostat.hc[hc_num - 1].summer_mode) {
|
||||||
myDebug_P(PSTR(" Program is set to Summer mode"));
|
myDebug_P(PSTR(" Program is set to Summer mode"));
|
||||||
} else if (EMS_Thermostat.hc[hc_num - 1].holiday_mode) {
|
} else if (EMS_Thermostat.hc[hc_num - 1].holiday_mode) {
|
||||||
@@ -732,15 +729,15 @@ void publishEMSValues(bool force) {
|
|||||||
strlcpy(hc, THERMOSTAT_HC, sizeof(hc));
|
strlcpy(hc, THERMOSTAT_HC, sizeof(hc));
|
||||||
strlcat(hc, _int_to_char(s, thermostat->hc), sizeof(hc));
|
strlcat(hc, _int_to_char(s, thermostat->hc), sizeof(hc));
|
||||||
JsonObject dataThermostat = rootThermostat.createNestedObject(hc);
|
JsonObject dataThermostat = rootThermostat.createNestedObject(hc);
|
||||||
|
uint8_t model = ems_getThermostatModel();
|
||||||
|
|
||||||
// different logic depending on thermostat types
|
// different logic depending on thermostat types
|
||||||
if (ems_getThermostatModel() == EMS_MODEL_EASY) {
|
if (model == EMS_DEVICE_FLAG_EASY) {
|
||||||
if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 100;
|
dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 100;
|
||||||
if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
dataThermostat[THERMOSTAT_CURRTEMP] = (float)thermostat->curr_roomTemp / 100;
|
dataThermostat[THERMOSTAT_CURRTEMP] = (float)thermostat->curr_roomTemp / 100;
|
||||||
} else if ((ems_getThermostatModel() == EMS_MODEL_FR10) || (ems_getThermostatModel() == EMS_MODEL_FR50)
|
} else if (model == EMS_DEVICE_FLAG_JUNKERS) {
|
||||||
|| (ems_getThermostatModel() == EMS_MODEL_FW100) || (ems_getThermostatModel() == EMS_MODEL_FW120)) {
|
|
||||||
if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (thermostat->setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 10;
|
dataThermostat[THERMOSTAT_SELTEMP] = (float)thermostat->setpoint_roomTemp / 10;
|
||||||
if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (thermostat->curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
@@ -1264,14 +1261,7 @@ void TelnetCommandCallback(uint8_t wc, const char * commandLine) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(first_cmd, "devices") == 0) {
|
if (strcmp(first_cmd, "devices") == 0) {
|
||||||
if (wc == 2) {
|
|
||||||
char * second_cmd = _readWord();
|
|
||||||
if (strcmp(second_cmd, "all") == 0) {
|
|
||||||
ems_printAllDevices(); // verbose
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ems_printDevices();
|
ems_printDevices();
|
||||||
}
|
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1714,23 +1704,32 @@ void WebCallback(JsonObject root) {
|
|||||||
|
|
||||||
// send over EMS devices
|
// send over EMS devices
|
||||||
JsonArray list = emsbus.createNestedArray("devices");
|
JsonArray list = emsbus.createNestedArray("devices");
|
||||||
|
char buffer[50];
|
||||||
|
|
||||||
for (std::list<_Generic_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
|
for (std::list<_Detected_Device>::iterator it = Devices.begin(); it != Devices.end(); ++it) {
|
||||||
JsonObject item = list.createNestedObject();
|
JsonObject item = list.createNestedObject();
|
||||||
item["type"] = (it)->model_type;
|
|
||||||
item["model"] = (it)->model_string;
|
(void)ems_getDeviceTypeDescription((it)->device_id, buffer);
|
||||||
|
item["type"] = buffer;
|
||||||
|
|
||||||
|
if ((it)->known) {
|
||||||
|
item["model"] = EMS_Devices[(it)->device_index].device_desc;
|
||||||
|
} else {
|
||||||
|
item["model"] = EMS_MODELTYPE_UNKNOWN_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
item["version"] = (it)->version;
|
item["version"] = (it)->version;
|
||||||
item["productid"] = (it)->product_id;
|
item["productid"] = (it)->product_id;
|
||||||
|
|
||||||
char buffer[10];
|
char tmp_hex[10];
|
||||||
// copy of my _hextoa() function from ems.cpp, to convert device_id into a 0xNN hex value string
|
// copy of my _hextoa() function from ems.cpp, to convert device_id into a 0xNN hex value string
|
||||||
char * p = buffer;
|
char * p = tmp_hex;
|
||||||
byte nib1 = ((it)->device_id >> 4) & 0x0F;
|
byte nib1 = ((it)->device_id >> 4) & 0x0F;
|
||||||
byte nib2 = ((it)->device_id >> 0) & 0x0F;
|
byte nib2 = ((it)->device_id >> 0) & 0x0F;
|
||||||
*p++ = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
|
*p++ = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
|
||||||
*p++ = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
|
*p++ = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
|
||||||
*p = '\0'; // null terminate just in case
|
*p = '\0'; // null terminate just in case
|
||||||
item["deviceid"] = buffer;
|
item["deviceid"] = tmp_hex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send over Thermostat data
|
// send over Thermostat data
|
||||||
@@ -1740,18 +1739,18 @@ void WebCallback(JsonObject root) {
|
|||||||
thermostat["ok"] = true;
|
thermostat["ok"] = true;
|
||||||
|
|
||||||
char buffer[200];
|
char buffer[200];
|
||||||
thermostat["tm"] = ems_getThermostatDescription(buffer, true);
|
thermostat["tm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_THERMOSTAT, buffer, true);
|
||||||
|
|
||||||
uint8_t hc_num = EMS_THERMOSTAT_DEFAULTHC; // default to HC1
|
uint8_t hc_num = EMS_THERMOSTAT_DEFAULTHC; // default to HC1
|
||||||
|
uint8_t model = ems_getThermostatModel();
|
||||||
|
|
||||||
// Render Current & Setpoint Room Temperature
|
// Render Current & Setpoint Room Temperature
|
||||||
if (ems_getThermostatModel() == EMS_MODEL_EASY) {
|
if (model == EMS_DEVICE_FLAG_EASY) {
|
||||||
if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 100;
|
thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 100;
|
||||||
if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
thermostat["tc"] = (float)EMS_Thermostat.hc[hc_num - 1].curr_roomTemp / 100;
|
thermostat["tc"] = (float)EMS_Thermostat.hc[hc_num - 1].curr_roomTemp / 100;
|
||||||
} else if ((ems_getThermostatModel() == EMS_MODEL_FR10) || (ems_getThermostatModel() == EMS_MODEL_FR50) || (ems_getThermostatModel() == EMS_MODEL_FW100)
|
} else if (model == EMS_DEVICE_FLAG_JUNKERS) {
|
||||||
|| (ems_getThermostatModel() == EMS_MODEL_FW120)) {
|
|
||||||
if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 10;
|
thermostat["ts"] = (float)EMS_Thermostat.hc[hc_num - 1].setpoint_roomTemp / 10;
|
||||||
if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
if (EMS_Thermostat.hc[hc_num - 1].curr_roomTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
@@ -1781,7 +1780,7 @@ void WebCallback(JsonObject root) {
|
|||||||
boiler["ok"] = true;
|
boiler["ok"] = true;
|
||||||
|
|
||||||
char buffer[200];
|
char buffer[200];
|
||||||
boiler["bm"] = ems_getBoilerDescription(buffer, true);
|
boiler["bm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_BOILER, buffer, true);
|
||||||
|
|
||||||
boiler["b1"] = (EMS_Boiler.tapwaterActive ? "running" : "off");
|
boiler["b1"] = (EMS_Boiler.tapwaterActive ? "running" : "off");
|
||||||
boiler["b2"] = (EMS_Boiler.heatingActive ? "active" : "off");
|
boiler["b2"] = (EMS_Boiler.heatingActive ? "active" : "off");
|
||||||
@@ -1808,7 +1807,7 @@ void WebCallback(JsonObject root) {
|
|||||||
sm["ok"] = true;
|
sm["ok"] = true;
|
||||||
|
|
||||||
char buffer[200];
|
char buffer[200];
|
||||||
sm["sm"] = ems_getSolarModuleDescription(buffer, true);
|
sm["sm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_SOLAR, buffer, true);
|
||||||
|
|
||||||
if (EMS_SolarModule.collectorTemp != EMS_VALUE_SHORT_NOTSET)
|
if (EMS_SolarModule.collectorTemp != EMS_VALUE_SHORT_NOTSET)
|
||||||
sm["sm1"] = (float)EMS_SolarModule.collectorTemp / 10; // Collector temperature oC
|
sm["sm1"] = (float)EMS_SolarModule.collectorTemp / 10; // Collector temperature oC
|
||||||
@@ -1841,7 +1840,7 @@ void WebCallback(JsonObject root) {
|
|||||||
if (ems_getHeatPumpEnabled()) {
|
if (ems_getHeatPumpEnabled()) {
|
||||||
hp["ok"] = true;
|
hp["ok"] = true;
|
||||||
char buffer[200];
|
char buffer[200];
|
||||||
hp["hm"] = ems_getHeatPumpDescription(buffer, true);
|
hp["hm"] = ems_getDeviceDescription(EMS_DEVICE_TYPE_HEATPUMP, buffer, true);
|
||||||
|
|
||||||
if (EMS_HeatPump.HPModulation != EMS_VALUE_INT_NOTSET)
|
if (EMS_HeatPump.HPModulation != EMS_VALUE_INT_NOTSET)
|
||||||
hp["hp1"] = EMS_HeatPump.HPModulation; // Pump modulation %
|
hp["hp1"] = EMS_HeatPump.HPModulation; // Pump modulation %
|
||||||
|
|||||||
866
src/ems.cpp
866
src/ems.cpp
File diff suppressed because it is too large
Load Diff
156
src/ems.h
156
src/ems.h
@@ -24,13 +24,15 @@
|
|||||||
#define EMS_ID_BOILER 0x08 // all UBA Boilers have 0x08
|
#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 and ISM1
|
||||||
#define EMS_ID_HP 0x38 // HeatPump
|
#define EMS_ID_HP 0x38 // HeatPump
|
||||||
#define EMS_ID_GATEWAY 0x48 // KM200 Web Gateway
|
#define EMS_ID_GATEWAY 0x48 // e.g. KM200 Web Gateway
|
||||||
|
#define EMS_ID_MIXING1 0x20 // Mixing
|
||||||
// Product IDs
|
#define EMS_ID_MIXING2 0x21 // Mixing
|
||||||
#define EMS_PRODUCTID_SM10 73 // SM10 solar module
|
#define EMS_ID_SWITCH 0x11 // Switch
|
||||||
#define EMS_PRODUCTID_SM50 162 // SM50 solar module
|
#define EMS_ID_CONTROLLER 0x09 // Controller
|
||||||
#define EMS_PRODUCTID_SM100 163 // SM100 solar module
|
#define EMS_ID_CONNECT 0x02 // Connect
|
||||||
#define EMS_PRODUCTID_ISM1 101 // Junkers ISM1 solar module
|
#define EMS_ID_THERMOSTAT1 0x10 // Thermostat
|
||||||
|
#define EMS_ID_THERMOSTAT2 0x17 // Thermostat
|
||||||
|
#define EMS_ID_THERMOSTAT3 0x18 // Thermostat
|
||||||
|
|
||||||
#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
|
||||||
#define EMS_MAX_TELEGRAM_LENGTH 32 // max length of a telegram, including CRC, for Rx and Tx.
|
#define EMS_MAX_TELEGRAM_LENGTH 32 // max length of a telegram, including CRC, for Rx and Tx.
|
||||||
@@ -191,50 +193,81 @@ const _EMS_TxTelegram EMS_TX_TELEGRAM_NEW = {
|
|||||||
{0x00} // data
|
{0x00} // data
|
||||||
};
|
};
|
||||||
|
|
||||||
// where defintions are stored
|
typedef enum {
|
||||||
typedef struct {
|
EMS_DEVICE_TYPE_NONE,
|
||||||
uint8_t product_id;
|
EMS_DEVICE_TYPE_SERVICEKEY,
|
||||||
char model_string[100];
|
EMS_DEVICE_TYPE_BOILER,
|
||||||
} _Boiler_Device;
|
EMS_DEVICE_TYPE_THERMOSTAT,
|
||||||
|
EMS_DEVICE_TYPE_MIXING,
|
||||||
|
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_UNKNOWN
|
||||||
|
} _EMS_DEVICE_TYPE;
|
||||||
|
|
||||||
|
// to store all know EMS devices
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char model_string[50];
|
_EMS_DEVICE_TYPE type;
|
||||||
} _SolarModule_Device;
|
char device_desc[100];
|
||||||
|
uint8_t flags;
|
||||||
|
} _EMS_Device;
|
||||||
|
|
||||||
|
// to store mapping of device_ids to their string name
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t product_id;
|
|
||||||
uint8_t device_id;
|
uint8_t device_id;
|
||||||
char model_string[50];
|
_EMS_DEVICE_TYPE device_type;
|
||||||
} _Other_Device;
|
char device_type_string[30];
|
||||||
|
} _EMS_Device_Types;
|
||||||
|
|
||||||
|
// 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_CONNECT, EMS_DEVICE_TYPE_CONNECT, "Connect"}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// for storing all recognised EMS devices
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t product_id;
|
_EMS_DEVICE_TYPE device_type; // type
|
||||||
char model_string[50];
|
uint8_t product_id; // product id for looking up details in _EMS_Devices
|
||||||
} _HeatPump_Device;
|
uint8_t device_id; // the device_id
|
||||||
|
uint8_t device_index; // where it is in the EMS_Devices table
|
||||||
|
char version[10]; // the version number XX.XX
|
||||||
|
bool known; // is this a known device?
|
||||||
|
} _Detected_Device;
|
||||||
|
|
||||||
typedef struct {
|
#define EMS_DEVICE_FLAG_NONE 0 // no flags set
|
||||||
uint8_t model_id;
|
|
||||||
uint8_t product_id;
|
|
||||||
uint8_t device_id;
|
|
||||||
char model_string[50];
|
|
||||||
bool write_supported;
|
|
||||||
} _Thermostat_Device;
|
|
||||||
|
|
||||||
typedef struct {
|
#define EMS_DEVICE_FLAG_SM10 10
|
||||||
uint8_t product_id;
|
#define EMS_DEVICE_FLAG_SM100 11
|
||||||
char model_string[50];
|
|
||||||
} _Mixing_Device;
|
|
||||||
|
|
||||||
// for consolidating all types
|
|
||||||
typedef struct {
|
|
||||||
uint8_t model_type; // 1=boiler, 2=thermostat, 3=sm, 4=other, 5=unknown
|
|
||||||
uint8_t product_id;
|
|
||||||
uint8_t device_id;
|
|
||||||
char version[10];
|
|
||||||
char model_string[50];
|
|
||||||
} _Generic_Device;
|
|
||||||
|
|
||||||
|
// group flags for thermostats
|
||||||
|
#define EMS_DEVICE_FLAG_NO_WRITE 0x80 // top bit set if can't write yet
|
||||||
|
#define EMS_DEVICE_FLAG_EASY 1
|
||||||
|
#define EMS_DEVICE_FLAG_RC10 2
|
||||||
|
#define EMS_DEVICE_FLAG_RC20 3
|
||||||
|
#define EMS_DEVICE_FLAG_RC30 4
|
||||||
|
#define EMS_DEVICE_FLAG_RC35 5
|
||||||
|
#define EMS_DEVICE_FLAG_RC300 6
|
||||||
|
#define EMS_DEVICE_FLAG_JUNKERS 7
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Telegram package defintions
|
* Telegram package defintions
|
||||||
@@ -242,6 +275,8 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
// settings
|
// settings
|
||||||
uint8_t device_id; // this is typically always 0x08
|
uint8_t device_id; // this is typically always 0x08
|
||||||
|
uint8_t device_flags;
|
||||||
|
uint8_t device_index;
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char version[10];
|
char version[10];
|
||||||
|
|
||||||
@@ -304,29 +339,22 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t device_id; // the device ID of the Heat Pump (e.g. 0x30)
|
uint8_t device_id; // the device ID of the Heat Pump (e.g. 0x30)
|
||||||
uint8_t model_id; // Solar Module / Heat Pump model
|
uint8_t device_flags;
|
||||||
|
uint8_t device_index;
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char version[10];
|
char version[10];
|
||||||
|
|
||||||
uint8_t HPModulation; // heatpump modulation in %
|
uint8_t HPModulation; // heatpump modulation in %
|
||||||
uint8_t HPSpeed; // speed 0-100 %
|
uint8_t HPSpeed; // speed 0-100 %
|
||||||
} _EMS_HeatPump;
|
} _EMS_HeatPump;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t device_id;
|
uint8_t device_id;
|
||||||
uint8_t model_id;
|
uint8_t device_flags;
|
||||||
uint8_t product_id;
|
uint8_t device_index;
|
||||||
char version[10];
|
|
||||||
} _EMS_Other;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t device_id;
|
|
||||||
uint8_t model_id;
|
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char version[10];
|
char version[10];
|
||||||
uint8_t hc; // heating circuit 1, 2, 3 or 4
|
uint8_t hc; // heating circuit 1, 2, 3 or 4
|
||||||
bool active; // true if there is data for this HC
|
bool active; // true if there is data for this HC
|
||||||
|
|
||||||
uint16_t flowTemp;
|
uint16_t flowTemp;
|
||||||
uint8_t pumpMod;
|
uint8_t pumpMod;
|
||||||
uint8_t valveStatus;
|
uint8_t valveStatus;
|
||||||
@@ -334,6 +362,10 @@ typedef struct {
|
|||||||
|
|
||||||
// Mixer data
|
// Mixer data
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
uint8_t device_id;
|
||||||
|
uint8_t device_flags;
|
||||||
|
uint8_t device_index;
|
||||||
|
uint8_t product_id;
|
||||||
bool detected;
|
bool detected;
|
||||||
_EMS_Mixing_HC hc[EMS_THERMOSTAT_MAXHC]; // array for the 4 heating circuits
|
_EMS_Mixing_HC hc[EMS_THERMOSTAT_MAXHC]; // array for the 4 heating circuits
|
||||||
} _EMS_Mixing;
|
} _EMS_Mixing;
|
||||||
@@ -341,10 +373,10 @@ typedef struct {
|
|||||||
// SM Solar Module - SM10/SM100/ISM1
|
// SM Solar Module - SM10/SM100/ISM1
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t device_id; // the device ID of the Solar Module
|
uint8_t device_id; // the device ID of the Solar Module
|
||||||
uint8_t model_id; // Solar Module
|
uint8_t device_flags; // Solar Module flags
|
||||||
|
uint8_t device_index;
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char version[10];
|
char version[10];
|
||||||
|
|
||||||
int16_t collectorTemp; // collector temp
|
int16_t collectorTemp; // collector temp
|
||||||
int16_t bottomTemp; // bottom temp
|
int16_t bottomTemp; // bottom temp
|
||||||
uint8_t pumpModulation; // modulation solar pump
|
uint8_t pumpModulation; // modulation solar pump
|
||||||
@@ -376,7 +408,8 @@ typedef struct {
|
|||||||
// Thermostat data
|
// Thermostat data
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t device_id; // the device ID of the thermostat
|
uint8_t device_id; // the device ID of the thermostat
|
||||||
uint8_t model_id; // thermostat model
|
uint8_t device_flags; // thermostat model flags
|
||||||
|
uint8_t device_index;
|
||||||
uint8_t product_id;
|
uint8_t product_id;
|
||||||
char version[10];
|
char version[10];
|
||||||
char datetime[25]; // HH:MM:SS DD/MM/YYYY
|
char datetime[25]; // HH:MM:SS DD/MM/YYYY
|
||||||
@@ -389,9 +422,8 @@ typedef void (*EMS_processType_cb)(_EMS_RxTelegram * EMS_RxTelegram);
|
|||||||
|
|
||||||
// Definition for each EMS type, including the relative callback function
|
// Definition for each EMS type, including the relative callback function
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t model_id;
|
uint16_t type;
|
||||||
uint16_t type; // long to support EMS+ types
|
const char typeString[30];
|
||||||
const char typeString[50];
|
|
||||||
EMS_processType_cb processType_cb;
|
EMS_processType_cb processType_cb;
|
||||||
} _EMS_Type;
|
} _EMS_Type;
|
||||||
|
|
||||||
@@ -402,7 +434,6 @@ void ems_init();
|
|||||||
void ems_doReadCommand(uint16_t type, uint8_t dest, bool forceRefresh = false);
|
void ems_doReadCommand(uint16_t type, uint8_t dest, bool forceRefresh = false);
|
||||||
void ems_sendRawTelegram(char * telegram);
|
void ems_sendRawTelegram(char * telegram);
|
||||||
void ems_scanDevices();
|
void ems_scanDevices();
|
||||||
void ems_printAllDevices();
|
|
||||||
void ems_printDevices();
|
void ems_printDevices();
|
||||||
uint8_t ems_printDevices_s(char * buffer, uint16_t len);
|
uint8_t ems_printDevices_s(char * buffer, uint16_t len);
|
||||||
void ems_printTxQueue();
|
void ems_printTxQueue();
|
||||||
@@ -428,10 +459,8 @@ void ems_setTxMode(uint8_t mode);
|
|||||||
|
|
||||||
uint8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram);
|
uint8_t _getHeatingCircuit(_EMS_RxTelegram * EMS_RxTelegram);
|
||||||
|
|
||||||
char * ems_getThermostatDescription(char * buffer, bool name_only = false);
|
char * ems_getDeviceDescription(_EMS_DEVICE_TYPE device_type, char * buffer, bool name_only = false);
|
||||||
char * ems_getBoilerDescription(char * buffer, bool name_only = false);
|
bool ems_getDeviceTypeDescription(uint8_t device_id, char * buffer);
|
||||||
char * ems_getSolarModuleDescription(char * buffer, bool name_only = false);
|
|
||||||
char * ems_getHeatPumpDescription(char * buffer, bool name_only = false);
|
|
||||||
void ems_getThermostatValues();
|
void ems_getThermostatValues();
|
||||||
void ems_getBoilerValues();
|
void ems_getBoilerValues();
|
||||||
void ems_getSolarModuleValues();
|
void ems_getSolarModuleValues();
|
||||||
@@ -465,7 +494,6 @@ extern _EMS_Boiler EMS_Boiler;
|
|||||||
extern _EMS_Thermostat EMS_Thermostat;
|
extern _EMS_Thermostat EMS_Thermostat;
|
||||||
extern _EMS_SolarModule EMS_SolarModule;
|
extern _EMS_SolarModule EMS_SolarModule;
|
||||||
extern _EMS_HeatPump EMS_HeatPump;
|
extern _EMS_HeatPump EMS_HeatPump;
|
||||||
extern _EMS_Other EMS_Other;
|
|
||||||
extern _EMS_Mixing EMS_Mixing;
|
extern _EMS_Mixing EMS_Mixing;
|
||||||
|
|
||||||
extern std::list<_Generic_Device> Devices;
|
extern std::list<_Detected_Device> Devices;
|
||||||
|
|||||||
@@ -155,155 +155,106 @@
|
|||||||
#define EMS_OFFSET_MMPLUSStatusMessage_pump_mod 5 // pump modulation
|
#define EMS_OFFSET_MMPLUSStatusMessage_pump_mod 5 // pump modulation
|
||||||
#define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent
|
#define EMS_OFFSET_MMPLUSStatusMessage_valve_status 2 // valve in percent
|
||||||
|
|
||||||
|
|
||||||
// Known EMS devices
|
|
||||||
typedef enum {
|
|
||||||
EMS_MODEL_NONE, // unset
|
|
||||||
EMS_MODEL_ALL, // common for all devices
|
|
||||||
|
|
||||||
EMS_MODEL_HP, // heatpump
|
|
||||||
EMS_MODEL_SM, // solar module
|
|
||||||
EMS_MODEL_MM, // mixer module
|
|
||||||
EMS_MODEL_UBA, // boiler
|
|
||||||
|
|
||||||
// and the various thermostats
|
|
||||||
EMS_MODEL_ES73,
|
|
||||||
EMS_MODEL_RC10,
|
|
||||||
EMS_MODEL_RC20,
|
|
||||||
EMS_MODEL_RC20RF,
|
|
||||||
EMS_MODEL_RC30,
|
|
||||||
EMS_MODEL_RC35,
|
|
||||||
EMS_MODEL_EASY,
|
|
||||||
EMS_MODEL_RC300,
|
|
||||||
EMS_MODEL_CW100,
|
|
||||||
EMS_MODEL_RC100,
|
|
||||||
EMS_MODEL_OT,
|
|
||||||
EMS_MODEL_FW100,
|
|
||||||
EMS_MODEL_FR10,
|
|
||||||
EMS_MODEL_FR50,
|
|
||||||
EMS_MODEL_FR100,
|
|
||||||
EMS_MODEL_FR110,
|
|
||||||
EMS_MODEL_FW120,
|
|
||||||
EMS_MODEL_FW200,
|
|
||||||
EMS_MODEL_FR120
|
|
||||||
|
|
||||||
} _EMS_MODEL_ID;
|
|
||||||
|
|
||||||
// EMS types for known boilers. This list will be extended when new devices are recognized.
|
|
||||||
// The device_id is always 0x08
|
|
||||||
// format is PRODUCT ID, DESCRIPTION
|
|
||||||
const _Boiler_Device Boiler_Devices[] = {
|
|
||||||
|
|
||||||
{72, "MC10 Module"},
|
|
||||||
{123, "Buderus GBx72/Nefit Trendline/Junkers Cerapur/Worcester Greenstar Si/27i"},
|
|
||||||
{133, "Buderus GB125/Logamatic MC110"},
|
|
||||||
{115, "Nefit Topline/Buderus GB162"},
|
|
||||||
{203, "Buderus Logamax U122/Junkers Cerapur"},
|
|
||||||
{208, "Buderus Logamax plus/GB192/Bosch Condens GC9000"},
|
|
||||||
{64, "Sieger BK13,BK15/Nefit Smartline/Buderus GB1x2"},
|
|
||||||
{234, "Buderus Logamax Plus GB122"},
|
|
||||||
{95, "Bosch Condens 2500/Buderus Logamax GB062/Junkers Cerapur Top/Worcester Greenstar i/Generic HT3"},
|
|
||||||
{122, "Nefit Proline"},
|
|
||||||
{170, "Buderus Logano GB212"},
|
|
||||||
{172, "Nefit Enviline"}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Known Solar Module types, device id is 0x30
|
* Table of all known EMS Devices
|
||||||
* format is PRODUCT ID, DESCRIPTION
|
* ProductID, DeviceType, Description, Flags
|
||||||
*/
|
*/
|
||||||
const _SolarModule_Device SolarModule_Devices[] = {
|
const _EMS_Device EMS_Devices[] = {
|
||||||
|
|
||||||
{EMS_PRODUCTID_SM10, "SM10 Solar Module"},
|
//
|
||||||
{EMS_PRODUCTID_SM100, "SM100 Solar Module"},
|
// UBA Masters - typically with device_id of 0x08
|
||||||
{EMS_PRODUCTID_ISM1, "Junkers ISM1 Solar Module"},
|
//
|
||||||
{EMS_PRODUCTID_SM50, "SM50 Solar Module"}
|
|
||||||
|
|
||||||
};
|
{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},
|
||||||
|
{133, EMS_DEVICE_TYPE_BOILER, "Buderus GB125/Logamatic MC110", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{115, EMS_DEVICE_TYPE_BOILER, "Nefit Topline/Buderus GB162", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{203, EMS_DEVICE_TYPE_BOILER, "Buderus Logamax U122/Junkers Cerapur", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{208, EMS_DEVICE_TYPE_BOILER, "Buderus Logamax plus/GB192/Bosch Condens GC9000", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{64, EMS_DEVICE_TYPE_BOILER, "Sieger BK13,BK15/Nefit Smartline/Buderus GB1x2", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{234, EMS_DEVICE_TYPE_BOILER, "Buderus Logamax Plus GB122", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{95, EMS_DEVICE_TYPE_BOILER, "Bosch Condens 2500/Buderus Logamax GB062/Junkers Cerapur Top/Worcester Greenstar i/Generic HT3", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{122, EMS_DEVICE_TYPE_BOILER, "Nefit Proline", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{170, EMS_DEVICE_TYPE_BOILER, "Buderus Logano GB212", EMS_DEVICE_FLAG_NONE},
|
||||||
|
{172, EMS_DEVICE_TYPE_BOILER, "Nefit Enviline", EMS_DEVICE_FLAG_NONE},
|
||||||
|
|
||||||
/*
|
//
|
||||||
* Mixing Units
|
// Solar Modules - type 0x30
|
||||||
* Typically device id is 0x20 or 0x21
|
//
|
||||||
* format is PRODUCT ID, DESCRIPTION
|
|
||||||
*/
|
|
||||||
const _Mixing_Device Mixing_Devices[] = {
|
|
||||||
|
|
||||||
{160, "MM100 Mixing Module"},
|
{73, EMS_DEVICE_TYPE_SOLAR, "SM10 Solar Module", EMS_DEVICE_FLAG_SM10},
|
||||||
{161, "MM200 Mixing Module"},
|
{163, EMS_DEVICE_TYPE_SOLAR, "SM100 Solar Module", EMS_DEVICE_FLAG_SM100},
|
||||||
{69, "MM10 Mixer Module"},
|
{101, EMS_DEVICE_TYPE_SOLAR, "Junkers ISM1 Solar Module", EMS_DEVICE_FLAG_SM100},
|
||||||
{159, "MM50 Mixing Module"},
|
{162, EMS_DEVICE_TYPE_SOLAR, "SM50 Solar Module", EMS_DEVICE_FLAG_SM100},
|
||||||
{79, "MM100 Mixer Module"},
|
|
||||||
{80, "MM200 Mixer Module"},
|
|
||||||
{78, "MM400 Mixer Module"}
|
|
||||||
|
|
||||||
};
|
//
|
||||||
|
// Mixing Devices - type 0x20 or 0x21
|
||||||
|
//
|
||||||
|
|
||||||
// Other EMS devices which are not considered boilers, thermostats or solar modules
|
{160, EMS_DEVICE_TYPE_MIXING, "MM100 Mixing Module", EMS_DEVICE_FLAG_NONE},
|
||||||
// format is PRODUCT ID, DEVICE ID, DESCRIPTION
|
{161, EMS_DEVICE_TYPE_MIXING, "MM200 Mixing Module", EMS_DEVICE_FLAG_NONE},
|
||||||
const _Other_Device Other_Devices[] = {
|
{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},
|
||||||
|
|
||||||
{71, 0x11, "WM10 Switch Module"},
|
//
|
||||||
|
// HeatPump - type 0x38
|
||||||
|
//
|
||||||
|
|
||||||
{68, 0x09, "BC10/RFM20 Receiver"},
|
{252, EMS_DEVICE_TYPE_HEATPUMP, "HeatPump Module", EMS_DEVICE_FLAG_NONE},
|
||||||
{190, 0x09, "BC10 Base Controller"},
|
{200, EMS_DEVICE_TYPE_HEATPUMP, "HeatPump Module", EMS_DEVICE_FLAG_NONE},
|
||||||
{114, 0x09, "BC10 Base Controller"},
|
|
||||||
{125, 0x09, "BC25 Base Controller"},
|
|
||||||
{169, 0x09, "BC40 Base Controller"},
|
|
||||||
{152, 0x09, "Controller"},
|
|
||||||
{95, 0x09, "HT3 Controller"},
|
|
||||||
{230, 0x09, "BC Base Controller"},
|
|
||||||
|
|
||||||
{205, 0x02, "Nefit Moduline Easy Connect"},
|
//
|
||||||
{206, 0x02, "Bosch Easy Connect"},
|
// Other devices, like 0x11 for Switching, 0x09 for controllers, 0x02 for Connect, 0x48 for Gateway
|
||||||
{171, 0x02, "EMS-OT OpenTherm converter"},
|
//
|
||||||
|
|
||||||
{189, EMS_ID_GATEWAY, "Web Gateway KM200"}
|
{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
|
||||||
|
{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
|
||||||
|
{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
|
||||||
|
|
||||||
};
|
//
|
||||||
|
// Thermostats, typically device id of 0x10, 0x17 and 0x18
|
||||||
// heatpump, device ID 0x38
|
//
|
||||||
// format is PRODUCT ID, DEVICE ID, DESCRIPTION
|
|
||||||
const _HeatPump_Device HeatPump_Devices[] = {
|
|
||||||
|
|
||||||
{252, "HeatPump Module"},
|
|
||||||
{200, "HeatPump Module"}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Known thermostat types and their capabilities
|
|
||||||
* format is MODEL_ID, PRODUCT ID, DEVICE ID, DESCRIPTION
|
|
||||||
* Typically on DeviceID 0x10 or 0x18
|
|
||||||
*/
|
|
||||||
const _Thermostat_Device Thermostat_Devices[] = {
|
|
||||||
|
|
||||||
// Easy devices - not currently supporting write operations
|
// Easy devices - not currently supporting write operations
|
||||||
{EMS_MODEL_EASY, 202, 0x18, "Logamatic TC100/Nefit Moduline Easy", EMS_THERMOSTAT_WRITE_NO},
|
{202, EMS_DEVICE_TYPE_THERMOSTAT, "Logamatic TC100/Nefit Moduline Easy", EMS_DEVICE_FLAG_EASY & EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
|
||||||
{EMS_MODEL_EASY, 203, 0x18, "Bosch EasyControl CT200", EMS_THERMOSTAT_WRITE_NO},
|
{203, EMS_DEVICE_TYPE_THERMOSTAT, "Bosch EasyControl CT200", EMS_DEVICE_FLAG_EASY & EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
|
||||||
{EMS_MODEL_CW100, 157, 0x18, "Buderus RC200/Bosch CW100/Junkers CW100", EMS_THERMOSTAT_WRITE_NO},
|
{157, EMS_DEVICE_TYPE_THERMOSTAT, "Buderus RC200/Bosch CW100/Junkers CW100", EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
|
||||||
|
|
||||||
// Buderus/Nefit
|
// Buderus/Nefit
|
||||||
{EMS_MODEL_RC10, 79, 0x17, "RC10/Moduline 100", EMS_THERMOSTAT_WRITE_YES},
|
{79, EMS_DEVICE_TYPE_THERMOSTAT, "RC10/Moduline 100", EMS_DEVICE_FLAG_RC10}, // 0x17
|
||||||
{EMS_MODEL_RC20, 77, 0x17, "RC20/Moduline 300", EMS_THERMOSTAT_WRITE_YES},
|
{77, EMS_DEVICE_TYPE_THERMOSTAT, "RC20/Moduline 300", EMS_DEVICE_FLAG_RC20}, // 0x17
|
||||||
{EMS_MODEL_RC20RF, 93, 0x18, "RC20RF", EMS_THERMOSTAT_WRITE_YES},
|
{93, EMS_DEVICE_TYPE_THERMOSTAT, "RC20RF", EMS_DEVICE_FLAG_RC20}, // 0x18
|
||||||
{EMS_MODEL_RC30, 67, 0x10, "RC30", EMS_THERMOSTAT_WRITE_YES},
|
{67, EMS_DEVICE_TYPE_THERMOSTAT, "RC30", EMS_DEVICE_FLAG_RC30}, // 0x10
|
||||||
{EMS_MODEL_RC30, 78, 0x10, "RC30/Moduline 400", EMS_THERMOSTAT_WRITE_YES},
|
{78, EMS_DEVICE_TYPE_THERMOSTAT, "RC30/Moduline 400", EMS_DEVICE_FLAG_RC30}, // 0x10
|
||||||
{EMS_MODEL_RC35, 86, 0x10, "RC35", EMS_THERMOSTAT_WRITE_YES},
|
{86, EMS_DEVICE_TYPE_THERMOSTAT, "RC35", EMS_DEVICE_FLAG_RC35}, // 0x10
|
||||||
{EMS_MODEL_RC300, 158, 0x10, "RC300/RC310/Moduline 3000/Bosch CW400", EMS_THERMOSTAT_WRITE_YES},
|
{158, EMS_DEVICE_TYPE_THERMOSTAT, "RC300/RC310/Moduline 3000/Bosch CW400", EMS_DEVICE_FLAG_RC300}, // 0x10
|
||||||
{EMS_MODEL_RC100, 165, 0x18, "RC100/Moduline 1010", EMS_THERMOSTAT_WRITE_NO},
|
{165, EMS_DEVICE_TYPE_THERMOSTAT, "RC100/Moduline 1010", EMS_DEVICE_FLAG_RC300 & EMS_DEVICE_FLAG_NO_WRITE}, // 0x18, cannot write
|
||||||
|
|
||||||
// Sieger
|
// Sieger
|
||||||
{EMS_MODEL_ES73, 76, 0x10, "Sieger ES73", EMS_THERMOSTAT_WRITE_YES},
|
{076, EMS_DEVICE_TYPE_THERMOSTAT, "Sieger ES73", EMS_DEVICE_FLAG_RC35}, // 0x10
|
||||||
|
|
||||||
// Junkers
|
// Junkers
|
||||||
{EMS_MODEL_FW100, 105, 0x10, "Junkers FW100", EMS_THERMOSTAT_WRITE_NO},
|
{105, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW100", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FW200, 106, 0x10, "Junkers FW200", EMS_THERMOSTAT_WRITE_NO},
|
{106, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW200", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FR100, 107, 0x18, "Junkers FR100", EMS_THERMOSTAT_WRITE_NO},
|
{107, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR100", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FR110, 108, 0x18, "Junkers FR110", EMS_THERMOSTAT_WRITE_NO},
|
{108, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR110", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FR10, 111, 0x18, "Junkers FR10", EMS_THERMOSTAT_WRITE_NO},
|
{111, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR10", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FR120, 191, 0x10, "Junkers FR120", EMS_THERMOSTAT_WRITE_NO},
|
{191, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR120", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FW120, 192, 0x10, "Junkers FW120", EMS_THERMOSTAT_WRITE_NO},
|
{192, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FW120", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE}, // 0x10, cannot write
|
||||||
{EMS_MODEL_FR50, 147, 0x10, "Junkers FR50", EMS_THERMOSTAT_WRITE_NO}
|
{147, EMS_DEVICE_TYPE_THERMOSTAT, "Junkers FR50", EMS_DEVICE_FLAG_JUNKERS & EMS_DEVICE_FLAG_NO_WRITE} // 0x10, cannot write
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
#define APP_VERSION "1.9.4b10"
|
#define APP_VERSION "1.9.4b11"
|
||||||
|
|||||||
Reference in New Issue
Block a user