add some boiler and thermostat parameters

This commit is contained in:
MichaelDvP
2021-08-23 16:14:06 +02:00
parent 4d1ba9bede
commit 1311cad913
5 changed files with 243 additions and 8 deletions

View File

@@ -193,6 +193,9 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
// warm water - boiler_data_ww topic // warm water - boiler_data_ww topic
register_device_value(TAG_BOILER_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_warmwater_temp)); register_device_value(TAG_BOILER_DATA_WW, &wwSelTemp_, DeviceValueType::UINT, nullptr, FL_(wwSelTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_warmwater_temp));
register_device_value(TAG_BOILER_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES); register_device_value(TAG_BOILER_DATA_WW, &wwSetTemp_, DeviceValueType::UINT, nullptr, FL_(wwSetTemp), DeviceValueUOM::DEGREES);
register_device_value(TAG_BOILER_DATA_WW, &wwSelTempLow_, DeviceValueType::UINT, nullptr, FL_(wwSelTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_warmwater_temp_low));
register_device_value(TAG_BOILER_DATA_WW, &wwSelTempOff_, DeviceValueType::UINT, nullptr, FL_(wwSelTempOff), DeviceValueUOM::DEGREES);
register_device_value(TAG_BOILER_DATA_WW, &wwSelTempSingle_, DeviceValueType::UINT, nullptr, FL_(wwSelTempSingle), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_warmwater_temp_single));
register_device_value(TAG_BOILER_DATA_WW, &wwType_, DeviceValueType::ENUM, FL_(enum_flow), FL_(wwType), DeviceValueUOM::NONE); register_device_value(TAG_BOILER_DATA_WW, &wwType_, DeviceValueType::ENUM, FL_(enum_flow), FL_(wwType), DeviceValueUOM::NONE);
register_device_value( register_device_value(
TAG_BOILER_DATA_WW, &wwComfort_, DeviceValueType::ENUM, FL_(enum_comfort), FL_(wwComfort), DeviceValueUOM::LIST, MAKE_CF_CB(set_warmwater_mode)); TAG_BOILER_DATA_WW, &wwComfort_, DeviceValueType::ENUM, FL_(enum_comfort), FL_(wwComfort), DeviceValueUOM::LIST, MAKE_CF_CB(set_warmwater_mode));
@@ -563,6 +566,9 @@ void Boiler::process_UBAParameterWWPlus(std::shared_ptr<const Telegram> telegram
// has_update(telegram->read_value(wWSelTemp_, 6)); // settings, status in E9 // has_update(telegram->read_value(wWSelTemp_, 6)); // settings, status in E9
has_update(telegram->read_value(wwHystOn_, 7)); has_update(telegram->read_value(wwHystOn_, 7));
has_update(telegram->read_value(wwHystOff_, 8)); has_update(telegram->read_value(wwHystOff_, 8));
has_update(telegram->read_value(wwSelTempOff_, 0)); // confusing description in #96, hopefully this is right
has_update(telegram->read_value(wwSelTempSingle_, 16));
has_update(telegram->read_value(wwSelTempLow_, 18));
} }
// 0xE9 - WW monitor ems+ // 0xE9 - WW monitor ems+
@@ -778,6 +784,32 @@ bool Boiler::set_warmwater_temp(const char * value, const int8_t id) {
return true; return true;
} }
// Set the lower warm water temperature 0xEA
bool Boiler::set_warmwater_temp_low(const char * value, const int8_t id) {
int v = 0;
if (!Helpers::value2number(value, v)) {
LOG_WARNING(F("Set boiler lower warm water temperature: Invalid value"));
return false;
}
LOG_INFO(F("Setting boiler lower warm water temperature to %d C"), v);
write_command(EMS_TYPE_UBAParameterWWPlus, 18, v, EMS_TYPE_UBAParameterWWPlus);
return true;
}
// Set the warm water single charge temperature 0xEA
bool Boiler::set_warmwater_temp_single(const char * value, const int8_t id) {
int v = 0;
if (!Helpers::value2number(value, v)) {
LOG_WARNING(F("Set single charge warm water temperature: Invalid value"));
return false;
}
LOG_INFO(F("Setting single charge warm water temperature to %d C"), v);
write_command(EMS_TYPE_UBAParameterWWPlus, 16, v, EMS_TYPE_UBAParameterWWPlus);
return true;
}
// Set the warm water disinfection temperature // Set the warm water disinfection temperature
bool Boiler::set_disinfect_temp(const char * value, const int8_t id) { bool Boiler::set_disinfect_temp(const char * value, const int8_t id) {
int v = 0; int v = 0;
@@ -795,6 +827,7 @@ bool Boiler::set_disinfect_temp(const char * value, const int8_t id) {
return true; return true;
} }
// flow temp // flow temp
bool Boiler::set_flow_temp(const char * value, const int8_t id) { bool Boiler::set_flow_temp(const char * value, const int8_t id) {
int v = 0; int v = 0;

View File

@@ -57,6 +57,9 @@ class Boiler : public EMSdevice {
// ww // ww
uint8_t wwSetTemp_; // Warm Water set temperature uint8_t wwSetTemp_; // Warm Water set temperature
uint8_t wwSelTemp_; // Warm Water selected temperature uint8_t wwSelTemp_; // Warm Water selected temperature
uint8_t wwSelTempLow_; // Warm Water lower selected temperature
uint8_t wwSelTempOff_; // Warm Water selected temperature for off position
uint8_t wwSelTempSingle_; // Warm Water single charge temperature
uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer uint8_t wwType_; // 0-off, 1-flow, 2-flowbuffer, 3-buffer, 4-layered buffer
uint8_t wwComfort_; // WW comfort mode uint8_t wwComfort_; // WW comfort mode
uint8_t wwCircPump_; // Warm Water circulation pump available uint8_t wwCircPump_; // Warm Water circulation pump available
@@ -205,6 +208,8 @@ class Boiler : public EMSdevice {
bool set_warmwater_circulation_pump(const char * value, const int8_t id); bool set_warmwater_circulation_pump(const char * value, const int8_t id);
bool set_warmwater_circulation_mode(const char * value, const int8_t id); bool set_warmwater_circulation_mode(const char * value, const int8_t id);
bool set_warmwater_temp(const char * value, const int8_t id); bool set_warmwater_temp(const char * value, const int8_t id);
bool set_warmwater_temp_low(const char * value, const int8_t id);
bool set_warmwater_temp_single(const char * value, const int8_t id);
bool set_disinfect_temp(const char * value, const int8_t id); bool set_disinfect_temp(const char * value, const int8_t id);
bool set_warmwater_maxpower(const char * value, const int8_t id); bool set_warmwater_maxpower(const char * value, const int8_t id);
bool set_wWFlowTempOffset(const char * value, const int8_t id); bool set_wWFlowTempOffset(const char * value, const int8_t id);

View File

@@ -762,12 +762,20 @@ void Thermostat::process_IBASettings(std::shared_ptr<const Telegram> telegram) {
has_update(telegram->read_value(ibaBuildingType_, 6)); // building type: 0 = light, 1 = medium, 2 = heavy has_update(telegram->read_value(ibaBuildingType_, 6)); // building type: 0 = light, 1 = medium, 2 = heavy
has_update(telegram->read_value(ibaMinExtTemperature_, 5)); // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 has_update(telegram->read_value(ibaMinExtTemperature_, 5)); // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1
has_update(telegram->read_value(ibaClockOffset_, 12)); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s has_update(telegram->read_value(ibaClockOffset_, 12)); // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s
has_update(telegram->read_value(ibaDamping_, 21)); // damping 0-off, 0xff-on
} }
// Settings WW 0x37 - RC35 // Settings WW 0x37 - RC35
void Thermostat::process_RC35wwSettings(std::shared_ptr<const Telegram> telegram) { void Thermostat::process_RC35wwSettings(std::shared_ptr<const Telegram> telegram) {
has_update(telegram->read_value(wwMode_, 2)); // 0 off, 1-on, 2-auto has_update(telegram->read_value(wwProgMode_, 0)); // 0-like hc, 0xFF own prog
has_update(telegram->read_value(wwCircMode_, 3)); // 0 off, 1-on, 2-auto has_update(telegram->read_value(wwCircProg_, 1)); // 0-like hc, 0xFF own prog
has_update(telegram->read_value(wwMode_, 2)); // 0 off, 1-on, 2-auto
has_update(telegram->read_value(wwCircMode_, 3)); // 0 off, 1-on, 2-auto
has_update(telegram->read_value(wwDisinfect_, 4)); // 0-off, 0xFF on
has_update(telegram->read_value(wwDisinfectDay_, 5)); // 0-6 Day of week, 7 every day
has_update(telegram->read_value(wwDisinfectHour_, 6));
has_update(telegram->read_value(wwMaxTemp_, 8)); // Limiter 60 degrees
has_update(telegram->read_value(wwOneTimeKey_, 9)); // 0-off, 0xFF on
} }
// type 0x6F - FR10/FR50/FR100/FR110/FR120 Junkers // type 0x6F - FR10/FR50/FR100/FR110/FR120 Junkers
@@ -902,8 +910,9 @@ void Thermostat::process_RC300WWmode(std::shared_ptr<const Telegram> telegram) {
// circulation pump see: https://github.com/Th3M3/buderus_ems-wiki/blob/master/Einstellungen%20der%20Bedieneinheit%20RC310.md // circulation pump see: https://github.com/Th3M3/buderus_ems-wiki/blob/master/Einstellungen%20der%20Bedieneinheit%20RC310.md
has_update(telegram->read_value(wwCircPump_, 1)); // FF=off, 0=on ? has_update(telegram->read_value(wwCircPump_, 1)); // FF=off, 0=on ?
has_update(telegram->read_value(wwMode_, 2)); // 0=off, 1=low, 2=high, 3=auto, 4=own prog has_update(telegram->read_value(wwMode_, 2)); // 0=off, 1=low, 2=high, 3=auto, 4=own prog
has_update(telegram->read_value(wwCircMode_, 3)); // 0=off, 1=on, 2=auto, 4=own? has_update(telegram->read_value(wwCircMode_, 3)); // 0=off, 1=on, 2=auto, 4=own?
has_update(telegram->read_value(wwChargeDuration_, 10)); // value in steps of 15 min
} }
// types 0x31D and 0x31E // types 0x31D and 0x31E
@@ -1223,6 +1232,18 @@ bool Thermostat::set_building(const char * value, const int8_t id) {
return false; return false;
} }
// 0xA5 - Set the building settings
bool Thermostat::set_damping(const char * value, const int8_t id) {
bool dmp;
if (Helpers::value2bool(value, dmp)) {
LOG_INFO(F("Setting damping %s"), dmp ? "on" : "off");
write_command(EMS_TYPE_IBASettings, 21, dmp ? 0xFF : 0, EMS_TYPE_IBASettings);
return true;
}
LOG_WARNING(F("Set damping: Invalid value"));
return false;
}
// 0xA5 Set the language settings // 0xA5 Set the language settings
bool Thermostat::set_language(const char * value, const int8_t id) { bool Thermostat::set_language(const char * value, const int8_t id) {
uint8_t lg = 0; uint8_t lg = 0;
@@ -1303,6 +1324,38 @@ bool Thermostat::set_wwtemplow(const char * value, const int8_t id) {
return true; return true;
} }
// Set ww charge duration in steps of 15 min, ems+
bool Thermostat::set_wwchargeduration(const char * value, const int8_t id) {
uint8_t t = 0xFF;
if (!Helpers::value2enum(value, t, FL_(enum_wwChargeDuration))) {
LOG_WARNING(F("Set warm water charge duration: Invalid value"));
return false;
}
LOG_INFO(F("Setting warm water charge duration to %d min"), t * 15);
write_command(0x2F5, 10, t, 0x02F5);
return true;
}
// set ww prio
bool Thermostat::set_wwprio(const char * value, const int8_t id) {
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
if (hc == nullptr) {
LOG_WARNING(F("Set wwprio: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, device_id());
return false;
}
bool b;
if (!Helpers::value2bool(value, b)) {
LOG_WARNING(F("Set wwprio: Invalid value"));
return false;
}
LOG_INFO(F("Setting wwprio: %s"), b ? "on" : "off");
write_command(set_typeids[hc->hc_num() - 1], 21, b ? 0xFF : 0x00, set_typeids[hc->hc_num() - 1]);
return true;
}
// Set ww onetime RC300, ems+ // Set ww onetime RC300, ems+
bool Thermostat::set_wwonetime(const char * value, const int8_t id) { bool Thermostat::set_wwonetime(const char * value, const int8_t id) {
bool b = false; bool b = false;
@@ -1338,6 +1391,90 @@ bool Thermostat::set_wwcircmode(const char * value, const int8_t id) {
return true; return true;
} }
bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) {
bool b = false;
if (!Helpers::value2bool(value, b)) {
LOG_WARNING(F("Set warm water disinfect: Invalid value"));
return false;
}
LOG_INFO(F("Setting warm water disinfect to %s"), b ? F_(on) : F_(off));
write_command(0x37, 4, b ? 0xFF : 0x00, 0x37);
return true;
}
bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) {
uint8_t set = 0xFF;
if (!Helpers::value2enum(value, set, FL_(enum_wwDisinfectDay))) {
LOG_WARNING(F("Set warm water disinfection day: Invalid day"));
return false;
}
LOG_INFO(F("Setting warm water disinfection day to %s"), value);
write_command(0x37, 5, set, 0x37);
return true;
}
bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) {
int set;
if (!Helpers::value2number(value, set)) {
LOG_WARNING(F("Set warm water disinfection hour: Invalid"));
return false;
}
if (set < 0 || set > 23) {
LOG_WARNING(F("Set warm water disinfection hour: Invalid"));
return false;
}
LOG_INFO(F("Setting warm water disinfection hour to %s"), value);
write_command(0x37, 6, set, 0x37);
return true;
}
bool Thermostat::set_wwMaxTemp(const char * value, const int8_t id) {
int t = 0;
if (!Helpers::value2number(value, t)) {
LOG_WARNING(F("Set warm water max temperature: Invalid value"));
return false;
}
if (t < 0 || t > 90) {
LOG_WARNING(F("Set warm water max temperature: Invalid value"));
return false;
}
LOG_INFO(F("Setting warm water max temperature to %d C"), t);
write_command(0x37, 8, t, 0x37);
return true;
}
bool Thermostat::set_wwOneTimeKey(const char * value, const int8_t id) {
bool b = false;
if (!Helpers::value2bool(value, b)) {
LOG_WARNING(F("Set warm water loading one time key: Invalid value"));
return false;
}
LOG_INFO(F("Setting warm water loading one time key to %s"), value);
write_command(0x37, 9, b ? 0xFF : 0x00, 0x37);
return true;
}
bool Thermostat::set_wwProgMode(const char * value, const int8_t id) {
uint8_t set = 0xFF;
if (!Helpers::value2enum(value, set, FL_(enum_wwProgMode))) {
LOG_WARNING(F("Set warm water program mode: Invalid mode"));
return false;
}
LOG_INFO(F("Setting warm water program mode to %s"), value);
write_command(0x37, 0, set ? 0xFF : 0x00, 0x37);
return true;
}
bool Thermostat::set_wwCircProg(const char * value, const int8_t id) {
uint8_t set = 0xFF;
if (!Helpers::value2enum(value, set, FL_(enum_wwProgMode))) {
LOG_WARNING(F("Set warm water circulation program mode: Invalid mode"));
return false;
}
LOG_INFO(F("Setting warm water circulation program mode to %s"), value);
write_command(0x37, 1, set ? 0xFF : 0x00, 0x37);
return true;
}
// set the holiday as string dd.mm.yyyy-dd.mm.yyyy // set the holiday as string dd.mm.yyyy-dd.mm.yyyy
bool Thermostat::set_holiday(const char * value, const int8_t id) { bool Thermostat::set_holiday(const char * value, const int8_t id) {
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id; uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
@@ -2188,6 +2325,13 @@ void Thermostat::register_device_values() {
TAG_THERMOSTAT_DATA, &wwSetTempLow_, DeviceValueType::UINT, nullptr, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow)); TAG_THERMOSTAT_DATA, &wwSetTempLow_, DeviceValueType::UINT, nullptr, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow));
register_device_value( register_device_value(
TAG_THERMOSTAT_DATA, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwcircmode)); TAG_THERMOSTAT_DATA, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwcircmode));
register_device_value(TAG_THERMOSTAT_DATA,
&wwChargeDuration_,
DeviceValueType::ENUM,
FL_(enum_wwChargeDuration),
FL_(wwChargeDuration),
DeviceValueUOM::LIST,
MAKE_CF_CB(set_wwchargeduration));
register_device_value(TAG_THERMOSTAT_DATA, &wwExtra1_, DeviceValueType::UINT, nullptr, FL_(wwExtra1), DeviceValueUOM::DEGREES); register_device_value(TAG_THERMOSTAT_DATA, &wwExtra1_, DeviceValueType::UINT, nullptr, FL_(wwExtra1), DeviceValueUOM::DEGREES);
register_device_value(TAG_THERMOSTAT_DATA, &wwExtra2_, DeviceValueType::UINT, nullptr, FL_(wwExtra2), DeviceValueUOM::DEGREES); register_device_value(TAG_THERMOSTAT_DATA, &wwExtra2_, DeviceValueType::UINT, nullptr, FL_(wwExtra2), DeviceValueUOM::DEGREES);
break; break;
@@ -2260,6 +2404,19 @@ void Thermostat::register_device_values() {
register_device_value(TAG_THERMOSTAT_DATA, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwmode)); register_device_value(TAG_THERMOSTAT_DATA, &wwMode_, DeviceValueType::ENUM, FL_(enum_wwMode2), FL_(wwMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwmode));
register_device_value( register_device_value(
TAG_THERMOSTAT_DATA, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode2), FL_(wwCircMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwcircmode)); TAG_THERMOSTAT_DATA, &wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode2), FL_(wwCircMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwcircmode));
register_device_value(
TAG_THERMOSTAT_DATA, &wwProgMode_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwProgMode), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwProgMode));
register_device_value(
TAG_THERMOSTAT_DATA, &wwCircProg_, DeviceValueType::ENUM, FL_(enum_wwProgMode), FL_(wwCircProg), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwCircProg));
register_device_value(
TAG_THERMOSTAT_DATA, &wwDisinfect_, DeviceValueType::BOOL, nullptr, FL_(wwDisinfect), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_wwDisinfect));
register_device_value(
TAG_THERMOSTAT_DATA, &wwDisinfectDay_, DeviceValueType::ENUM, FL_(enum_wwDisinfectDay), FL_(wwDisinfectDay), DeviceValueUOM::LIST, MAKE_CF_CB(set_wwDisinfectDay));
register_device_value(
TAG_THERMOSTAT_DATA, &wwDisinfectHour_, DeviceValueType::UINT, nullptr, FL_(wwDisinfectHour), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwDisinfectHour), 0, 23);
register_device_value(TAG_THERMOSTAT_DATA, &wwMaxTemp_, DeviceValueType::UINT, nullptr, FL_(wwMaxTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwMaxTemp));
register_device_value(
TAG_THERMOSTAT_DATA, &wwOneTimeKey_, DeviceValueType::BOOL, nullptr, FL_(wwOneTimeKey), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_wwOneTimeKey));
break; break;
case EMS_DEVICE_FLAG_JUNKERS: case EMS_DEVICE_FLAG_JUNKERS:
register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::TEXT, nullptr, FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime)); register_device_value(TAG_THERMOSTAT_DATA, &dateTime_, DeviceValueType::TEXT, nullptr, FL_(dateTime), DeviceValueUOM::NONE, MAKE_CF_CB(set_datetime));
@@ -2405,6 +2562,7 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp)); register_device_value(tag, &hc->noreducetemp, DeviceValueType::INT, nullptr, FL_(noreducetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_noreducetemp));
register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp)); register_device_value(tag, &hc->remotetemp, DeviceValueType::SHORT, FL_(div10), FL_(remotetemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_remotetemp));
register_device_value(tag, &dummy_, DeviceValueType::CMD, nullptr, FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime)); register_device_value(tag, &dummy_, DeviceValueType::CMD, nullptr, FL_(switchtime), DeviceValueUOM::NONE, MAKE_CF_CB(set_switchtime));
register_device_value(tag, &hc->wwprio, DeviceValueType::BOOL, nullptr, FL_(wwprio), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_wwprio));
break; break;
case EMS_DEVICE_FLAG_JUNKERS: case EMS_DEVICE_FLAG_JUNKERS:
register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode4), FL_(mode), DeviceValueUOM::LIST, MAKE_CF_CB(set_mode)); register_device_value(tag, &hc->mode, DeviceValueType::ENUM, FL_(enum_mode4), FL_(mode), DeviceValueUOM::LIST, MAKE_CF_CB(set_mode));

View File

@@ -65,6 +65,7 @@ class Thermostat : public EMSdevice {
uint8_t pause; uint8_t pause;
uint8_t party; uint8_t party;
int8_t noreducetemp; // signed -20°C to +10°C int8_t noreducetemp; // signed -20°C to +10°C
uint8_t wwprio;
uint8_t hc_num() const { uint8_t hc_num() const {
return hc_num_; return hc_num_;
@@ -155,6 +156,7 @@ class Thermostat : public EMSdevice {
int8_t ibaMinExtTemperature_; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1 int8_t ibaMinExtTemperature_; // min ext temp for heating curve, in deg., 0xF6=-10, 0x0 = 0, 0xFF=-1
uint8_t ibaBuildingType_; // building type: 0 = light, 1 = medium, 2 = heavy uint8_t ibaBuildingType_; // building type: 0 = light, 1 = medium, 2 = heavy
uint8_t ibaClockOffset_; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s uint8_t ibaClockOffset_; // offset (in sec) to clock, 0xff = -1 s, 0x02 = 2 s
uint8_t ibaDamping_; // damping 0-off, 0xff-on
int8_t dampedoutdoortemp_; int8_t dampedoutdoortemp_;
uint16_t tempsensor1_; uint16_t tempsensor1_;
@@ -170,6 +172,14 @@ class Thermostat : public EMSdevice {
uint8_t wwCircMode_; uint8_t wwCircMode_;
uint8_t wwSetTemp_; uint8_t wwSetTemp_;
uint8_t wwSetTempLow_; uint8_t wwSetTempLow_;
uint8_t wwChargeDuration_;
uint8_t wwDisinfect_;
uint8_t wwDisinfectDay_;
uint8_t wwDisinfectHour_;
uint8_t wwMaxTemp_;
uint8_t wwOneTimeKey_;
uint8_t wwProgMode_;
uint8_t wwCircProg_;
std::vector<std::shared_ptr<HeatingCircuit>> heating_circuits_; // each thermostat can have multiple heating circuits std::vector<std::shared_ptr<HeatingCircuit>> heating_circuits_; // each thermostat can have multiple heating circuits
@@ -331,6 +341,7 @@ class Thermostat : public EMSdevice {
bool set_switchtime(const char * value, const int8_t id); bool set_switchtime(const char * value, const int8_t id);
bool set_program(const char * value, const int8_t id); bool set_program(const char * value, const int8_t id);
bool set_controlmode(const char * value, const int8_t id); bool set_controlmode(const char * value, const int8_t id);
bool set_wwprio(const char * value, const int8_t id);
// set functions - these don't use the id/hc, the parameters are ignored // set functions - these don't use the id/hc, the parameters are ignored
bool set_wwmode(const char * value, const int8_t id); bool set_wwmode(const char * value, const int8_t id);
@@ -338,12 +349,22 @@ class Thermostat : public EMSdevice {
bool set_wwtemplow(const char * value, const int8_t id); bool set_wwtemplow(const char * value, const int8_t id);
bool set_wwonetime(const char * value, const int8_t id); bool set_wwonetime(const char * value, const int8_t id);
bool set_wwcircmode(const char * value, const int8_t id); bool set_wwcircmode(const char * value, const int8_t id);
bool set_wwchargeduration(const char * value, const int8_t id);
bool set_wwDisinfect(const char * value, const int8_t id);
bool set_wwDisinfectDay(const char * value, const int8_t id);
bool set_wwDisinfectHour(const char * value, const int8_t id);
bool set_wwMaxTemp(const char * value, const int8_t id);
bool set_wwOneTimeKey(const char * value, const int8_t id);
bool set_wwProgMode(const char * value, const int8_t id);
bool set_wwCircProg(const char * value, const int8_t id);
bool set_datetime(const char * value, const int8_t id); bool set_datetime(const char * value, const int8_t id);
bool set_minexttemp(const char * value, const int8_t id); bool set_minexttemp(const char * value, const int8_t id);
bool set_clockoffset(const char * value, const int8_t id); bool set_clockoffset(const char * value, const int8_t id);
bool set_calinttemp(const char * value, const int8_t id); bool set_calinttemp(const char * value, const int8_t id);
bool set_display(const char * value, const int8_t id); bool set_display(const char * value, const int8_t id);
bool set_building(const char * value, const int8_t id); bool set_building(const char * value, const int8_t id);
bool set_damping(const char * value, const int8_t id);
bool set_language(const char * value, const int8_t id); bool set_language(const char * value, const int8_t id);
}; };

View File

@@ -83,6 +83,7 @@ MAKE_PSTR_WORD(commands)
MAKE_PSTR_WORD(info) MAKE_PSTR_WORD(info)
MAKE_PSTR_WORD(settings) MAKE_PSTR_WORD(settings)
MAKE_PSTR_WORD(value) MAKE_PSTR_WORD(value)
MAKE_PSTR_WORD(error)
// devices // devices
MAKE_PSTR_WORD(boiler) MAKE_PSTR_WORD(boiler)
@@ -115,7 +116,7 @@ MAKE_PSTR(log_level_fmt, "Log level: %s")
MAKE_STR(productid_fmt, "%s EMS Product ID") MAKE_STR(productid_fmt, "%s EMS Product ID")
MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F("error"), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all")) MAKE_PSTR_LIST(enum_syslog_level, F_(off), F("emerg"), F("alert"), F("crit"), F_(error), F("warn"), F("notice"), F_(info), F_(debug), F("trace"), F("all"))
MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown)) MAKE_PSTR_LIST(enum_watch, F_(off), F_(on), F_(raw), F_(unknown))
// strings // strings
MAKE_PSTR(EMSESP, "EMS-ESP") MAKE_PSTR(EMSESP, "EMS-ESP")
@@ -239,7 +240,6 @@ MAKE_PSTR_WORD(buffer)
MAKE_PSTR(bufferedflow, "buffered flow") MAKE_PSTR(bufferedflow, "buffered flow")
MAKE_PSTR(layeredbuffer, "layered buffer") MAKE_PSTR(layeredbuffer, "layered buffer")
MAKE_PSTR_WORD(maintenance) MAKE_PSTR_WORD(maintenance)
MAKE_PSTR_WORD(error)
// boiler lists // boiler lists
MAKE_PSTR_LIST(enum_off_time_date, F_(off), F_(time), F_(date)) MAKE_PSTR_LIST(enum_off_time_date, F_(off), F_(time), F_(date))
@@ -329,6 +329,8 @@ MAKE_PSTR_LIST(enum_mode3, F_(night), F_(day), F_(auto)) // RC35, RC
MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS MAKE_PSTR_LIST(enum_mode4, F_(nofrost), F_(eco), F_(heat), F_(auto)) // JUNKERS
MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF MAKE_PSTR_LIST(enum_mode5, F_(auto), F_(off)) // CRF
MAKE_PSTR_LIST(enum_hamode, F_(off), F_(heat), F_(auto), F_(heat), F_(off), F_(heat), F_(auto), F_(auto), F_(auto), F_(auto))
MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort)) MAKE_PSTR_LIST(enum_modetype, F_(eco), F_(comfort))
MAKE_PSTR_LIST(enum_modetype2, F_(day)) MAKE_PSTR_LIST(enum_modetype2, F_(day))
MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day)) MAKE_PSTR_LIST(enum_modetype3, F_(night), F_(day))
@@ -342,7 +344,9 @@ MAKE_PSTR_LIST(enum_controlmode2, F_(outdoor), F_(room))
MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor")) MAKE_PSTR_LIST(enum_controlmode3, F_(off), F_(room), F_(outdoor), F("room+outdoor"))
MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x)) MAKE_PSTR_LIST(enum_control, F_(off), F_(rc20), F_(rc3x))
MAKE_PSTR_LIST(enum_hamode, F_(off), F_(heat), F_(auto), F_(heat), F_(off), F_(heat), F_(auto), F_(auto), F_(auto), F_(auto)) MAKE_PSTR_LIST(enum_wwProgMode, F("std prog"), F_(own_prog))
MAKE_PSTR_LIST(enum_wwDisinfectDay, F("mo"), F("tu"), F("we"), F("th"), F("fr"), F("sa"), F("so"), F("every day"))
MAKE_PSTR_LIST(enum_wwChargeDuration, F_(off), F("15min"), F("30min"), F("45min"), F("60min"), F("75min"), F("90min"), F("105min"), F("120min"))
// solar list // solar list
MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog")) MAKE_PSTR_LIST(enum_solarmode, F_(constant), F("pwm"), F("analog"))
@@ -442,6 +446,9 @@ MAKE_PSTR_LIST(hpPh1, F("hpph1"), F("high pressure side temperature (PH1)"))
// the following are warm water for the boiler and automatically tagged with 'ww' // the following are warm water for the boiler and automatically tagged with 'ww'
MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature")) MAKE_PSTR_LIST(wwSelTemp, F("wwseltemp"), F("selected temperature"))
MAKE_PSTR_LIST(wwSelTempLow, F("wwseltemplow"), F("selected lower temperature"))
MAKE_PSTR_LIST(wwSelTempOff, F("wwseltempoff"), F("selected temperature for off"))
MAKE_PSTR_LIST(wwSelTempSingle, F("wwseltempsingle"), F("single charge temperature"))
MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature")) MAKE_PSTR_LIST(wwSetTemp, F("wwsettemp"), F("set temperature"))
MAKE_PSTR_LIST(wwType, F("wwtype"), F("type")) MAKE_PSTR_LIST(wwType, F("wwtype"), F("type"))
MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort")) MAKE_PSTR_LIST(wwComfort, F("wwcomfort"), F("comfort"))
@@ -473,6 +480,13 @@ MAKE_PSTR_LIST(wwStarts2, F("wwstarts2"), F("# control starts"))
MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time")) MAKE_PSTR_LIST(wwWorkM, F("wwworkm"), F("active time"))
MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature")) MAKE_PSTR_LIST(wwHystOn, F("wwhyston"), F("hysteresis on temperature"))
MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature")) MAKE_PSTR_LIST(wwHystOff, F("wwhystoff"), F("hysteresis off temperature"))
MAKE_PSTR_LIST(wwProgMode, F("wwprogmode"), F("program mode"))
MAKE_PSTR_LIST(wwCircProg, F("wwcircprog"), F("circulation program mode"))
MAKE_PSTR_LIST(wwDisinfect, F("wwdisinfect"), F("disinfection"))
MAKE_PSTR_LIST(wwDisinfectDay, F("wwdisinfectday"), F("disinfection day"))
MAKE_PSTR_LIST(wwDisinfectHour, F("wwdisinfecthour"), F("disinfection hour"))
MAKE_PSTR_LIST(wwMaxTemp, F("wwmaxtemp"), F("maximum temperature"))
MAKE_PSTR_LIST(wwOneTimeKey, F("wwonetimekey"), F("one time key function"))
// thermostat // thermostat
// extra commands // extra commands
@@ -491,20 +505,23 @@ MAKE_PSTR_LIST(ibaClockOffset, F("clockoffset"), F("clock offset"))
MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building")) MAKE_PSTR_LIST(ibaBuildingType, F("building"), F("building"))
MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("offset internal temperature")) MAKE_PSTR_LIST(ibaCalIntTemperature, F("intoffset"), F("offset internal temperature"))
MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("minimal external temperature")) MAKE_PSTR_LIST(ibaMinExtTemperature, F("minexttemp"), F("minimal external temperature"))
MAKE_PSTR_LIST(damping, F("damping"), F("damping outdoor temperature"))
MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("temperature sensor 1")) MAKE_PSTR_LIST(tempsensor1, F("inttemp1"), F("temperature sensor 1"))
MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2")) MAKE_PSTR_LIST(tempsensor2, F("inttemp2"), F("temperature sensor 2"))
MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature")) MAKE_PSTR_LIST(dampedoutdoortemp, F("dampedoutdoortemp"), F("damped outdoor temperature"))
MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying")) MAKE_PSTR_LIST(floordrystatus, F("floordry"), F("floor drying"))
MAKE_PSTR_LIST(dampedoutdoortemp2, F("dampedoutdoortemp"), F("damped outdoor temperature"))
MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature")) MAKE_PSTR_LIST(floordrytemp, F("floordrytemp"), F("floor drying temperature"))
MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode")) MAKE_PSTR_LIST(wwMode, F("wwmode"), F("mode"))
MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature")) MAKE_PSTR_LIST(wwSetTempLow, F("wwsettemplow"), F("set low temperature"))
MAKE_PSTR_LIST(wwChargeDuration, F("wwchargeduration"), F("charge duration"))
MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra")) MAKE_PSTR_LIST(wwExtra1, F("wwextra1"), F("circuit 1 extra"))
MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra")) MAKE_PSTR_LIST(wwExtra2, F("wwextra2"), F("circuit 2 extra"))
MAKE_PSTR_LIST(setpoint_roomTemp, F("seltemp"), F("selected room temperature")) MAKE_PSTR_LIST(setpoint_roomTemp, F("seltemp"), F("selected room temperature"))
MAKE_PSTR_LIST(curr_roomTemp, F("currtemp"), F("current room temperature")) MAKE_PSTR_LIST(curr_roomTemp, F("currtemp"), F("current room temperature"))
MAKE_PSTR_LIST(mode, F("mode"), F("mode")) MAKE_PSTR_LIST(mode, F("mode"), F("mode"))
MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type")) MAKE_PSTR_LIST(modetype, F("modetype"), F("mode type"))
MAKE_PSTR_LIST(daytemp, F("daytemp"), F("day temperature")) MAKE_PSTR_LIST(daytemp, F("daytemp"), F("day temperature"))
MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature")) MAKE_PSTR_LIST(heattemp, F("heattemp"), F("heat temperature"))
MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature")) MAKE_PSTR_LIST(nighttemp, F("nighttemp"), F("night temperature"))
@@ -527,6 +544,7 @@ MAKE_PSTR_LIST(control, F("control"), F("control device"))
MAKE_PSTR_LIST(program, F("program"), F("program")) MAKE_PSTR_LIST(program, F("program"), F("program"))
MAKE_PSTR_LIST(pause, F("pause"), F("pause time")) MAKE_PSTR_LIST(pause, F("pause"), F("pause time"))
MAKE_PSTR_LIST(party, F("party"), F("party time")) MAKE_PSTR_LIST(party, F("party"), F("party time"))
MAKE_PSTR_LIST(wwprio, F("wwprio"), F("warm water priority"))
MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("holiday temperature")) MAKE_PSTR_LIST(holidaytemp, F("holidaytemp"), F("holiday temperature"))
MAKE_PSTR_LIST(summermode, F("summermode"), F("summer mode")) MAKE_PSTR_LIST(summermode, F("summermode"), F("summer mode"))