diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index e13bb401e..7c3d3377a 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -45,6 +45,7 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c if (device_id >= 0x20 && device_id <= 0x27) { register_telegram_type(device_id - 0x20 + 0x02D7, "MMPLUSStatusMessage_HC", false, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); // register_telegram_type(device_id - 0x20 + 0x02E1, "MMPLUSSetMessage_HC", true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); + register_telegram_type(2 * (device_id - 0x20) + 0x02CC, "MMPLUSSetMessage_HC", false, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = DeviceValueTAG::TAG_HC1 + hc_ - 1; @@ -52,6 +53,17 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const c register_device_value(tag, &status_, DeviceValueType::INT, FL_(mixerStatus), DeviceValueUOM::PERCENT); register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, FL_(pumpStatus), DeviceValueUOM::NONE, MAKE_CF_CB(set_pump)); + register_device_value(tag, &activated_, DeviceValueType::BOOL, FL_(activated), DeviceValueUOM::NONE, MAKE_CF_CB(set_activated)); + register_device_value(tag, + &setValveTime_, + DeviceValueType::UINT, + DeviceValueNumOp::DV_NUMOP_MUL10, + FL_(mixerSetTime), + DeviceValueUOM::SECONDS, + MAKE_CF_CB(set_setValveTime), + 10, + 600); + register_device_value(tag, &flowTempOffset_, DeviceValueType::UINT, FL_(flowtempoffset), DeviceValueUOM::K, MAKE_CF_CB(set_flowTempOffset), 0, 20); } else if (device_id >= 0x28 && device_id <= 0x29) { register_telegram_type(device_id - 0x28 + 0x0331, "MMPLUSStatusMessage_WWC", false, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); register_telegram_type(device_id - 0x28 + 0x0313, "MMPLUSConfigMessage_WWC", true, MAKE_PF_CB(process_MMPLUSConfigMessage_WWC)); @@ -273,16 +285,23 @@ void Mixer::process_IPMHydrTemp(std::shared_ptr telegram) { has_update(telegram, HydrTemp_, 0); } +// Mixer Setting 0x2CC +void Mixer::process_MMPLUSSetMessage_HC(std::shared_ptr telegram) { + has_update(telegram, activated_, 0); // on = 0xFF + has_update(telegram, setValveTime_, 1); // valve runtime in 10 sec, max 120 s + has_update(telegram, flowTempOffset_, 2); // Mixer increase [0-20 K] +} + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" // Thermostat(0x10) -> Mixer(0x20), ?(0x2E1), data: 01 1C 64 00 01 // Thermostat(0x10) -> Mixing Module(0x20), (0x2E1), data: 01 00 00 00 01 // Thermostat(0x10) -> Mixing Module(0x20), (0x2EB), data: 00 -void Mixer::process_MMPLUSSetMessage_HC(std::shared_ptr telegram) { - // pos 1: setpoint - // pos2: pump -} +// void Mixer::process_MMPLUSSetMessage_HC(std::shared_ptr telegram) { +// pos 1: setpoint +// pos2: pump +// } // unknown, 2 examples from older threads // Thermostat(0x10) -> Mixer(0x28), ?(0x33B), data: 01 01 00 @@ -373,6 +392,11 @@ bool Mixer::set_activated(const char * value, const int8_t id) { write_command(0xAA, 0, b ? 0xFF : 0, 0xAA); return true; } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + uint8_t hc = device_id() - 0x20; + write_command(0x2CC + hc * 2, 0, b ? 0xFF : 0, 0x2CC + hc * 2); + return true; + } return false; } @@ -386,6 +410,12 @@ bool Mixer::set_setValveTime(const char * value, const int8_t id) { write_command(0xAA, 1, v, 0xAA); return true; } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + v = (v + 5) / 10; + uint8_t hc = device_id() - 0x20; + write_command(0x2CC + hc * 2, 1, v, 0x2CC + hc * 2); + return true; + } return false; } @@ -498,4 +528,17 @@ bool Mixer::set_wwHystOff(const char * value, const int8_t id) { return true; } +bool Mixer::set_flowTempOffset(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + uint8_t hc = device_id() - 0x20; + write_command(0x2CC + hc * 2, 2, v, 0x2CC + hc * 2); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/mixer.h b/src/devices/mixer.h index f3c513cbc..a02162946 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -51,6 +51,7 @@ class Mixer : public EMSdevice { bool set_pump(const char * value, const int8_t id); bool set_activated(const char * value, const int8_t id); bool set_setValveTime(const char * value, const int8_t id); + bool set_flowTempOffset(const char * value, const int8_t id); bool set_wwMaxTemp(const char * value, const int8_t id); bool set_wwDiffTemp(const char * value, const int8_t id); @@ -80,6 +81,7 @@ class Mixer : public EMSdevice { uint8_t flowSetTemp_; uint8_t activated_; uint8_t setValveTime_; + uint8_t flowTempOffset_; // MM100wwParam - 0x0313, 0x033B uint8_t wwMaxTemp_;