mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-10 09:49:54 +03:00
thermostat dhw circuits use offset only
This commit is contained in:
@@ -557,10 +557,10 @@ uint8_t Thermostat::HeatingCircuit::get_mode_type() const {
|
|||||||
return HeatingCircuit::Mode::DAY;
|
return HeatingCircuit::Mode::DAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Thermostat::DhwCircuit> Thermostat::dhw_circuit(const uint8_t offset, const uint8_t dhw_num, const bool create) {
|
std::shared_ptr<Thermostat::DhwCircuit> Thermostat::dhw_circuit(const uint8_t offset, const bool create) {
|
||||||
// check for existing circuit
|
// check for existing circuit
|
||||||
for (const auto & dhw_circuit : dhw_circuits_) {
|
for (const auto & dhw_circuit : dhw_circuits_) {
|
||||||
if (dhw_circuit->dhw() == dhw_num - 1 || dhw_circuit->offset() == offset) {
|
if (dhw_circuit->offset() == offset) {
|
||||||
return dhw_circuit;
|
return dhw_circuit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -568,7 +568,7 @@ std::shared_ptr<Thermostat::DhwCircuit> Thermostat::dhw_circuit(const uint8_t of
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
// create a new circuit object and add to the list
|
// create a new circuit object and add to the list
|
||||||
auto new_dhw = std::make_shared<Thermostat::DhwCircuit>(offset, dhw_num == 255 ? offset + 1 : dhw_num);
|
auto new_dhw = std::make_shared<Thermostat::DhwCircuit>(offset);
|
||||||
dhw_circuits_.push_back(new_dhw);
|
dhw_circuits_.push_back(new_dhw);
|
||||||
// register the device values
|
// register the device values
|
||||||
register_device_values_dhw(new_dhw);
|
register_device_values_dhw(new_dhw);
|
||||||
@@ -600,7 +600,7 @@ void Thermostat::process_RC10Set(std::shared_ptr<const Telegram> telegram) {
|
|||||||
if (hc == nullptr) {
|
if (hc == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
has_update(telegram, ibaCalIntTemperature_, 0);
|
has_update(telegram, ibaCalIntTemperature_, 0);
|
||||||
has_update(telegram, backlight_, 1);
|
has_update(telegram, backlight_, 1);
|
||||||
has_update(telegram, dhw->wwMode_, 2);
|
has_update(telegram, dhw->wwMode_, 2);
|
||||||
@@ -867,7 +867,7 @@ void Thermostat::process_IBASettings(std::shared_ptr<const Telegram> telegram) {
|
|||||||
|
|
||||||
// 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) {
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
has_update(telegram, dhw->wwProgMode_, 0); // 0-like hc, 0xFF own prog
|
has_update(telegram, dhw->wwProgMode_, 0); // 0-like hc, 0xFF own prog
|
||||||
has_update(telegram, dhw->wwCircProg_, 1); // 0-like hc, 0xFF own prog
|
has_update(telegram, dhw->wwCircProg_, 1); // 0-like hc, 0xFF own prog
|
||||||
has_update(telegram, dhw->wwMode_, 2); // 0-off, 1-on, 2-auto
|
has_update(telegram, dhw->wwMode_, 2); // 0-off, 1-on, 2-auto
|
||||||
@@ -881,7 +881,7 @@ void Thermostat::process_RC35wwSettings(std::shared_ptr<const Telegram> telegram
|
|||||||
|
|
||||||
// Settings WW 0x3A - RC30
|
// Settings WW 0x3A - RC30
|
||||||
void Thermostat::process_RC30wwSettings(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_RC30wwSettings(std::shared_ptr<const Telegram> telegram) {
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
has_update(telegram, dhw->wwMode_, 0); // 0-on, 1-off, 2-auto
|
has_update(telegram, dhw->wwMode_, 0); // 0-on, 1-off, 2-auto
|
||||||
has_update(telegram, dhw->wwWhenModeOff_, 1); // 0-off, 0xFF on
|
has_update(telegram, dhw->wwWhenModeOff_, 1); // 0-off, 0xFF on
|
||||||
has_update(telegram, dhw->wwDisinfecting_, 2); // 0-off, 0xFF on
|
has_update(telegram, dhw->wwDisinfecting_, 2); // 0-off, 0xFF on
|
||||||
@@ -891,7 +891,7 @@ void Thermostat::process_RC30wwSettings(std::shared_ptr<const Telegram> telegram
|
|||||||
|
|
||||||
// type 0x38 (ww) and 0x39 (circ)
|
// type 0x38 (ww) and 0x39 (circ)
|
||||||
void Thermostat::process_RC35wwTimer(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_RC35wwTimer(std::shared_ptr<const Telegram> telegram) {
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1))
|
if ((telegram->message_length == 2 && telegram->offset < 83 && !(telegram->offset & 1))
|
||||||
|| (!telegram->offset && telegram->type_id == 0x38 && !strlen(dhw->wwSwitchTime_) && telegram->message_length > 1)
|
|| (!telegram->offset && telegram->type_id == 0x38 && !strlen(dhw->wwSwitchTime_) && telegram->message_length > 1)
|
||||||
|| (!telegram->offset && telegram->type_id == 0x39 && !strlen(dhw->wwCircSwitchTime_) && telegram->message_length > 1)) {
|
|| (!telegram->offset && telegram->type_id == 0x39 && !strlen(dhw->wwCircSwitchTime_) && telegram->message_length > 1)) {
|
||||||
@@ -1004,7 +1004,7 @@ void Thermostat::process_JunkersSetMixer(std::shared_ptr<const Telegram> telegra
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Thermostat::process_JunkersWW(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_JunkersWW(std::shared_ptr<const Telegram> telegram) {
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
has_bitupdate(telegram, dhw->wwCharge_, 0, 3);
|
has_bitupdate(telegram, dhw->wwCharge_, 0, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1185,7 +1185,7 @@ void Thermostat::process_RC300Curve(std::shared_ptr<const Telegram> telegram) {
|
|||||||
|
|
||||||
// types 0x31B
|
// types 0x31B
|
||||||
void Thermostat::process_RC300WWtemp(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_RC300WWtemp(std::shared_ptr<const Telegram> telegram) {
|
||||||
auto dhw = dhw_circuit(0, 1, true);
|
auto dhw = dhw_circuit(0, true);
|
||||||
has_update(telegram, dhw->wwSetTemp_, 0);
|
has_update(telegram, dhw->wwSetTemp_, 0);
|
||||||
has_update(telegram, dhw->wwSetTempLow_, 1);
|
has_update(telegram, dhw->wwSetTempLow_, 1);
|
||||||
}
|
}
|
||||||
@@ -1196,7 +1196,7 @@ void Thermostat::process_RC300WWtemp(std::shared_ptr<const Telegram> telegram) {
|
|||||||
void Thermostat::process_RC300WWmode(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_RC300WWmode(std::shared_ptr<const Telegram> telegram) {
|
||||||
uint8_t circuit = 0;
|
uint8_t circuit = 0;
|
||||||
telegram->read_value(circuit, 0); // 00-no circuit, 01-boiler, 02-mixer
|
telegram->read_value(circuit, 0); // 00-no circuit, 01-boiler, 02-mixer
|
||||||
auto dhw = dhw_circuit(telegram->type_id - 0x2F5, 255, circuit != 0);
|
auto dhw = dhw_circuit(telegram->type_id - 0x2F5, circuit != 0);
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2105,7 +2105,7 @@ bool Thermostat::set_roomsensor(const char * value, const int8_t id) {
|
|||||||
|
|
||||||
// sets the thermostat ww working mode, where mode is a string, ems and ems+
|
// sets the thermostat ww working mode, where mode is a string, ems and ems+
|
||||||
bool Thermostat::set_wwmode(const char * value, const int8_t id) {
|
bool Thermostat::set_wwmode(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2192,7 +2192,7 @@ bool Thermostat::set_wwtemplow(const char * value, const int8_t id) {
|
|||||||
|
|
||||||
// Set ww charge RC300, ems+
|
// Set ww charge RC300, ems+
|
||||||
bool Thermostat::set_wwcharge(const char * value, const int8_t id) {
|
bool Thermostat::set_wwcharge(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2212,7 +2212,7 @@ bool Thermostat::set_wwcharge(const char * value, const int8_t id) {
|
|||||||
|
|
||||||
// Set ww charge duration in steps of 15 min, ems+
|
// Set ww charge duration in steps of 15 min, ems+
|
||||||
bool Thermostat::set_wwchargeduration(const char * value, const int8_t id) {
|
bool Thermostat::set_wwchargeduration(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2305,7 +2305,7 @@ bool Thermostat::set_switchProgMode(const char * value, const int8_t id) {
|
|||||||
|
|
||||||
// sets the thermostat ww circulation working mode, where mode is a string
|
// sets the thermostat ww circulation working mode, where mode is a string
|
||||||
bool Thermostat::set_wwcircmode(const char * value, const int8_t id) {
|
bool Thermostat::set_wwcircmode(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2328,7 +2328,7 @@ bool Thermostat::set_wwcircmode(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Thermostat::set_wwDailyHeating(const char * value, const int8_t id) {
|
bool Thermostat::set_wwDailyHeating(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2342,7 +2342,7 @@ bool Thermostat::set_wwDailyHeating(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) {
|
bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2363,7 +2363,7 @@ bool Thermostat::set_wwDailyHeatTime(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) {
|
bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2384,7 +2384,7 @@ bool Thermostat::set_wwDisinfect(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) {
|
bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -2405,7 +2405,7 @@ bool Thermostat::set_wwDisinfectDay(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) {
|
bool Thermostat::set_wwDisinfectHour(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit( id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -3428,7 +3428,7 @@ bool Thermostat::set_switchtime2(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
// sets a single switchtime in the thermostat dhw program for RC35
|
// sets a single switchtime in the thermostat dhw program for RC35
|
||||||
bool Thermostat::set_wwCircSwitchTime(const char * value, const int8_t id) {
|
bool Thermostat::set_wwCircSwitchTime(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw == nullptr) {
|
if (dhw == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -3445,7 +3445,7 @@ bool Thermostat::set_wwCircSwitchTime(const char * value, const int8_t id) {
|
|||||||
|
|
||||||
// sets a single switchtime in the thermostat circulation program for RC35
|
// sets a single switchtime in the thermostat circulation program for RC35
|
||||||
bool Thermostat::set_wwSwitchTime(const char * value, const int8_t id) {
|
bool Thermostat::set_wwSwitchTime(const char * value, const int8_t id) {
|
||||||
auto dhw = dhw_circuit(255, id2dhw(id));
|
auto dhw = dhw_circuit(id2dhw(id));
|
||||||
if (dhw != nullptr) {
|
if (dhw != nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -4393,7 +4393,7 @@ void Thermostat::register_device_values() {
|
|||||||
register_device_values_hc(new_hc);
|
register_device_values_hc(new_hc);
|
||||||
|
|
||||||
// also a dhw circuit...
|
// also a dhw circuit...
|
||||||
auto new_dhw = std::make_shared<Thermostat::DhwCircuit>(0, 1); // offset 0, dhw num 1
|
auto new_dhw = std::make_shared<Thermostat::DhwCircuit>(0); // offset 0, dhw num 1
|
||||||
dhw_circuits_.push_back(new_dhw);
|
dhw_circuits_.push_back(new_dhw);
|
||||||
register_device_values_dhw(new_dhw);
|
register_device_values_dhw(new_dhw);
|
||||||
#endif
|
#endif
|
||||||
@@ -4863,7 +4863,7 @@ void Thermostat::register_device_values_hc(std::shared_ptr<Thermostat::HeatingCi
|
|||||||
|
|
||||||
// registers the values for a heating circuit
|
// registers the values for a heating circuit
|
||||||
void Thermostat::register_device_values_dhw(std::shared_ptr<Thermostat::DhwCircuit> dhw) {
|
void Thermostat::register_device_values_dhw(std::shared_ptr<Thermostat::DhwCircuit> dhw) {
|
||||||
int8_t tag = DeviceValueTAG::TAG_DHW1 + dhw->dhw();
|
int8_t tag = dhw->id();
|
||||||
switch (this->model()) {
|
switch (this->model()) {
|
||||||
case EMSdevice::EMS_DEVICE_FLAG_RC100:
|
case EMSdevice::EMS_DEVICE_FLAG_RC100:
|
||||||
case EMSdevice::EMS_DEVICE_FLAG_RC300:
|
case EMSdevice::EMS_DEVICE_FLAG_RC300:
|
||||||
|
|||||||
@@ -173,9 +173,8 @@ class Thermostat : public EMSdevice {
|
|||||||
|
|
||||||
class DhwCircuit {
|
class DhwCircuit {
|
||||||
public:
|
public:
|
||||||
DhwCircuit(const uint8_t offset, const uint8_t dhw_num)
|
DhwCircuit(const uint8_t offset)
|
||||||
: offset_(offset)
|
: dhw_num_(offset) {
|
||||||
, dhw_num_(dhw_num) {
|
|
||||||
}
|
}
|
||||||
~DhwCircuit() = default;
|
~DhwCircuit() = default;
|
||||||
uint8_t wwExtra_;
|
uint8_t wwExtra_;
|
||||||
@@ -201,16 +200,16 @@ class Thermostat : public EMSdevice {
|
|||||||
char wwHoliday_[22];
|
char wwHoliday_[22];
|
||||||
char wwVacation_[22];
|
char wwVacation_[22];
|
||||||
|
|
||||||
uint8_t dhw() const {
|
uint8_t id() const { // returns TAG(id)
|
||||||
return dhw_num_ - 1;
|
return DeviceValueTAG::TAG_DHW1 + dhw_num_;
|
||||||
}
|
}
|
||||||
uint8_t offset() const {
|
|
||||||
return offset_;
|
uint8_t offset() const { // returns telegram offset
|
||||||
|
return dhw_num_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t offset_; // telegram offset to base telegram
|
uint8_t dhw_num_; // dhw circuit number 0..10
|
||||||
uint8_t dhw_num_; // dhw circuit number 1..10
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -230,8 +229,8 @@ class Thermostat : public EMSdevice {
|
|||||||
|| (model() == EMSdevice::EMS_DEVICE_FLAG_CR120));
|
|| (model() == EMSdevice::EMS_DEVICE_FLAG_CR120));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint8_t id2dhw(const int8_t id) const {
|
inline uint8_t id2dhw(const int8_t id) const { // returns telegram offset for TAG(id)
|
||||||
return id - DeviceValueTAG::TAG_DHW1 + 1;
|
return id - DeviceValueTAG::TAG_DHW1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// each thermostat has a list of heating controller type IDs for reading and writing
|
// each thermostat has a list of heating controller type IDs for reading and writing
|
||||||
@@ -394,7 +393,7 @@ class Thermostat : public EMSdevice {
|
|||||||
|
|
||||||
std::shared_ptr<Thermostat::HeatingCircuit> heating_circuit(std::shared_ptr<const Telegram> telegram);
|
std::shared_ptr<Thermostat::HeatingCircuit> heating_circuit(std::shared_ptr<const Telegram> telegram);
|
||||||
std::shared_ptr<Thermostat::HeatingCircuit> heating_circuit(const int8_t id);
|
std::shared_ptr<Thermostat::HeatingCircuit> heating_circuit(const int8_t id);
|
||||||
std::shared_ptr<Thermostat::DhwCircuit> dhw_circuit(const uint8_t offset = 0, const uint8_t dhw_num = 255, const bool create = false);
|
std::shared_ptr<Thermostat::DhwCircuit> dhw_circuit(const uint8_t offset, const bool create = false);
|
||||||
|
|
||||||
void register_device_values_hc(std::shared_ptr<Thermostat::HeatingCircuit> hc);
|
void register_device_values_hc(std::shared_ptr<Thermostat::HeatingCircuit> hc);
|
||||||
void register_device_values_dhw(std::shared_ptr<Thermostat::DhwCircuit> dhw);
|
void register_device_values_dhw(std::shared_ptr<Thermostat::DhwCircuit> dhw);
|
||||||
|
|||||||
Reference in New Issue
Block a user