mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
fix #554, add dhw vacation/holiday
This commit is contained in:
@@ -95,6 +95,8 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
|
|||||||
register_telegram_type(timer_typeids[i], F("RC30Timer"), false, MAKE_PF_CB(process_RC30Timer));
|
register_telegram_type(timer_typeids[i], F("RC30Timer"), false, MAKE_PF_CB(process_RC30Timer));
|
||||||
}
|
}
|
||||||
register_telegram_type(EMS_TYPE_RC30wwSettings, F("RC30WWSettings"), true, MAKE_PF_CB(process_RC30wwSettings));
|
register_telegram_type(EMS_TYPE_RC30wwSettings, F("RC30WWSettings"), true, MAKE_PF_CB(process_RC30wwSettings));
|
||||||
|
register_telegram_type(0x38, F("WWTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
|
||||||
|
register_telegram_type(0x39, F("WWCircTimer"), true, MAKE_PF_CB(process_RC35wwTimer));
|
||||||
|
|
||||||
// EASY
|
// EASY
|
||||||
} else if (model == EMSdevice::EMS_DEVICE_FLAG_EASY) {
|
} else if (model == EMSdevice::EMS_DEVICE_FLAG_EASY) {
|
||||||
@@ -817,6 +819,38 @@ void Thermostat::process_RC35wwTimer(std::shared_ptr<const Telegram> telegram) {
|
|||||||
toggle_fetch(telegram->type_id, false); // dont fetch again
|
toggle_fetch(telegram->type_id, false); // dont fetch again
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// vacation/holiday only from dhw timer
|
||||||
|
if (telegram->type_id != 0x38) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (telegram->message_length + telegram->offset >= 92 && telegram->offset <= 87) {
|
||||||
|
char data[sizeof(wwVacation_)];
|
||||||
|
snprintf(data,
|
||||||
|
sizeof(data),
|
||||||
|
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||||
|
telegram->message_data[87 - telegram->offset],
|
||||||
|
telegram->message_data[88 - telegram->offset],
|
||||||
|
telegram->message_data[89 - telegram->offset] + 2000,
|
||||||
|
telegram->message_data[90 - telegram->offset],
|
||||||
|
telegram->message_data[91 - telegram->offset],
|
||||||
|
telegram->message_data[92 - telegram->offset] + 2000);
|
||||||
|
has_update(wwVacation_, data, sizeof(wwVacation_));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telegram->message_length + telegram->offset >= 98 && telegram->offset <= 93) {
|
||||||
|
char data[sizeof(wwHoliday_)];
|
||||||
|
snprintf(data,
|
||||||
|
sizeof(data),
|
||||||
|
"%02d.%02d.%04d-%02d.%02d.%04d",
|
||||||
|
telegram->message_data[93 - telegram->offset],
|
||||||
|
telegram->message_data[94 - telegram->offset],
|
||||||
|
telegram->message_data[95 - telegram->offset] + 2000,
|
||||||
|
telegram->message_data[96 - telegram->offset],
|
||||||
|
telegram->message_data[97 - telegram->offset],
|
||||||
|
telegram->message_data[98 - telegram->offset] + 2000);
|
||||||
|
has_update(wwHoliday_, data, sizeof(wwHoliday_));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// type 0x6F - FR10/FR50/FR100/FR110/FR120 Junkers
|
// type 0x6F - FR10/FR50/FR100/FR110/FR120 Junkers
|
||||||
@@ -2016,7 +2050,7 @@ bool Thermostat::set_holiday(const char * value, const int8_t id, const bool vac
|
|||||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||||
|
|
||||||
if ((hc == nullptr) || (value == nullptr)) {
|
if (value == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2037,9 +2071,20 @@ bool Thermostat::set_holiday(const char * value, const int8_t id, const bool vac
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!vacation || value[10] == '+') { // + for compatibility
|
if (!vacation || value[10] == '+') { // + for compatibility
|
||||||
write_command(timer_typeids[hc->hc()], 93, data, 6, 0);
|
if (hc) {
|
||||||
|
write_command(timer_typeids[hc->hc()], 93, data, 6, timer_typeids[hc->hc()]);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
write_command(timer_typeids[hc->hc()], 87, data, 6, 0);
|
write_command(0x38, 93, data, 6, 0x38); // dhw
|
||||||
|
write_command(0x39, 93, data, 6, 0); // circ, no validate
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (hc) {
|
||||||
|
write_command(timer_typeids[hc->hc()], 87, data, 6, timer_typeids[hc->hc()]);
|
||||||
|
} else {
|
||||||
|
write_command(0x38, 87, data, 6, 0x38); // dhw
|
||||||
|
write_command(0x39, 87, data, 6, 0); // circ
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -3505,6 +3550,20 @@ void Thermostat::register_device_values() {
|
|||||||
MAKE_CF_CB(set_wwDisinfectHour),
|
MAKE_CF_CB(set_wwDisinfectHour),
|
||||||
0,
|
0,
|
||||||
23);
|
23);
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwHoliday_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(holidays),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwHoliday));
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwVacation_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(vacations),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwVacation));
|
||||||
break;
|
break;
|
||||||
case EMS_DEVICE_FLAG_RC30_N:
|
case EMS_DEVICE_FLAG_RC30_N:
|
||||||
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, nullptr, FL_(dateTime), DeviceValueUOM::NONE); // can't set datetime
|
||||||
@@ -3617,6 +3676,20 @@ void Thermostat::register_device_values() {
|
|||||||
FL_(wwcircswitchtime),
|
FL_(wwcircswitchtime),
|
||||||
DeviceValueUOM::NONE,
|
DeviceValueUOM::NONE,
|
||||||
MAKE_CF_CB(set_wwCircSwitchTime));
|
MAKE_CF_CB(set_wwCircSwitchTime));
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwHoliday_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(holidays),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwHoliday));
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwVacation_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(vacations),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwVacation));
|
||||||
break;
|
break;
|
||||||
case EMS_DEVICE_FLAG_RC35:
|
case EMS_DEVICE_FLAG_RC35:
|
||||||
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA,
|
||||||
@@ -3728,6 +3801,20 @@ void Thermostat::register_device_values() {
|
|||||||
FL_(wwcircswitchtime),
|
FL_(wwcircswitchtime),
|
||||||
DeviceValueUOM::NONE,
|
DeviceValueUOM::NONE,
|
||||||
MAKE_CF_CB(set_wwCircSwitchTime));
|
MAKE_CF_CB(set_wwCircSwitchTime));
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwHoliday_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(holidays),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwHoliday));
|
||||||
|
register_device_value(DeviceValueTAG::TAG_DEVICE_DATA_WW,
|
||||||
|
&wwVacation_,
|
||||||
|
DeviceValueType::STRING,
|
||||||
|
FL_(tpl_holidays),
|
||||||
|
FL_(vacations),
|
||||||
|
DeviceValueUOM::NONE,
|
||||||
|
MAKE_CF_CB(set_wwVacation));
|
||||||
break;
|
break;
|
||||||
case EMS_DEVICE_FLAG_JUNKERS:
|
case EMS_DEVICE_FLAG_JUNKERS:
|
||||||
if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) {
|
if (has_flags(EMS_DEVICE_FLAG_JUNKERS_OLD)) {
|
||||||
|
|||||||
@@ -219,6 +219,8 @@ class Thermostat : public EMSdevice {
|
|||||||
uint8_t wwDailyHeating_;
|
uint8_t wwDailyHeating_;
|
||||||
uint8_t wwDailyHeatTime_;
|
uint8_t wwDailyHeatTime_;
|
||||||
uint8_t wwWhenModeOff_;
|
uint8_t wwWhenModeOff_;
|
||||||
|
char wwHoliday_[26];
|
||||||
|
char wwVacation_[26];
|
||||||
|
|
||||||
// HybridHP
|
// HybridHP
|
||||||
uint8_t hybridStrategy_; // co2 = 1, cost = 2, temperature = 3, mix = 4
|
uint8_t hybridStrategy_; // co2 = 1, cost = 2, temperature = 3, mix = 4
|
||||||
@@ -449,6 +451,12 @@ class Thermostat : public EMSdevice {
|
|||||||
bool set_wwDailyHeating(const char * value, const int8_t id);
|
bool set_wwDailyHeating(const char * value, const int8_t id);
|
||||||
bool set_wwDailyHeatTime(const char * value, const int8_t id);
|
bool set_wwDailyHeatTime(const char * value, const int8_t id);
|
||||||
bool set_wwwhenmodeoff(const char * value, const int8_t id);
|
bool set_wwwhenmodeoff(const char * value, const int8_t id);
|
||||||
|
bool set_wwVacation(const char * value, const int8_t id) {
|
||||||
|
return set_holiday(value, DeviceValueTAG::TAG_WWC1, true);
|
||||||
|
}
|
||||||
|
bool set_wwHoliday(const char * value, const int8_t id) {
|
||||||
|
return set_holiday(value, DeviceValueTAG::TAG_WWC1);
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user