From b8c07e31cf41a990ec69f7728eb76089946902d4 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 9 Sep 2021 11:33:57 +0200 Subject: [PATCH] mixer: add id to pool, sort registering, add commands --- src/devices/mixer.cpp | 151 +++++++++++++++++++++++++++++------------- src/devices/mixer.h | 2 + 2 files changed, 108 insertions(+), 45 deletions(-) diff --git a/src/devices/mixer.cpp b/src/devices/mixer.cpp index 89d958d0d..9bf5ce51e 100644 --- a/src/devices/mixer.cpp +++ b/src/devices/mixer.cpp @@ -26,52 +26,35 @@ uuid::log::Logger Mixer::logger_{F_(mixer), uuid::log::Facility::CONSOLE}; Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const std::string & version, const std::string & name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { + LOG_DEBUG(F("Adding new Mixer with device ID 0x%02X"), device_id); + // Pool module if (flags == EMSdevice::EMS_DEVICE_FLAG_MP) { - type_ = Type::MP; register_telegram_type(0x5BA, F("HpPoolStatus"), true, MAKE_PF_CB(process_HpPoolStatus)); + type_ = Type::MP; + register_device_value(TAG_NONE, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); register_device_value(TAG_NONE, &poolTemp_, DeviceValueType::SHORT, FL_(div10), FL_(poolTemp), DeviceValueUOM::DEGREES); register_device_value(TAG_NONE, &poolShuntStatus_, DeviceValueType::ENUM, FL_(enum_shunt), FL_(poolShuntStatus), DeviceValueUOM::LIST); register_device_value(TAG_NONE, &poolShunt_, DeviceValueType::UINT, nullptr, FL_(poolShunt), DeviceValueUOM::PERCENT); + } - } else { - if (flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { - if (device_id <= 0x27) { - // telegram handlers 0x20 - 0x27 for HC - register_telegram_type(device_id - 0x20 + 0x02D7, F("MMPLUSStatusMessage_HC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); - } else { - // telegram handlers for warm water/DHW 0x28, 0x29 - register_telegram_type(device_id - 0x28 + 0x0331, F("MMPLUSStatusMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); - } - } - - // EMS 1.0 - if (flags == EMSdevice::EMS_DEVICE_FLAG_MM10) { - register_telegram_type(0x00AA, F("MMConfigMessage"), false, MAKE_PF_CB(process_MMConfigMessage)); - register_telegram_type(0x00AB, F("MMStatusMessage"), true, MAKE_PF_CB(process_MMStatusMessage)); - register_telegram_type(0x00AC, F("MMSetMessage"), false, MAKE_PF_CB(process_MMSetMessage)); - } - - // HT3 - if (flags == EMSdevice::EMS_DEVICE_FLAG_IPM) { - register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); - register_telegram_type(0x001E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); - // register_telegram_type(0x0023, F("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage)); - } - - // register the device values and set hc_ and type_ - if (device_id <= 0x27) { + // EMS+ + if (flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + if (device_id >= 0x20 && device_id <= 0x27) { + register_telegram_type(device_id - 0x20 + 0x02D7, F("MMPLUSStatusMessage_HC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_HC)); + // register_telegram_type(device_id - 0x20 + 0x02E1, F("MMPLUSStetMessage_HC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_HC)); type_ = Type::HC; hc_ = device_id - 0x20 + 1; uint8_t tag = TAG_HC1 + hc_ - 1; register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); - register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES); register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); - register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::BOOLEAN); register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); - register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); - } else { + register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_pump)); + } else if (device_id >= 0x28 && device_id <= 0x29) { + register_telegram_type(device_id - 0x28 + 0x0331, F("MMPLUSStatusMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSStatusMessage_WWC)); + // register_telegram_type(device_id - 0x28 + 0x033B, F("MMPLUSSetMessage_WWC"), true, MAKE_PF_CB(process_MMPLUSSetMessage_WWC)); type_ = Type::WWC; hc_ = device_id - 0x28 + 1; uint8_t tag = TAG_WWC1 + hc_ - 1; @@ -81,6 +64,39 @@ Mixer::Mixer(uint8_t device_type, uint8_t device_id, uint8_t product_id, const s register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(wwTempStatus), DeviceValueUOM::NONE); } } + + // EMS 1.0 + if (flags == EMSdevice::EMS_DEVICE_FLAG_MM10) { + register_telegram_type(0x00AA, F("MMConfigMessage"), true, MAKE_PF_CB(process_MMConfigMessage)); + register_telegram_type(0x00AB, F("MMStatusMessage"), false, MAKE_PF_CB(process_MMStatusMessage)); + register_telegram_type(0x00AC, F("MMSetMessage"), false, MAKE_PF_CB(process_MMSetMessage)); + // EMSESP::send_read_request(0xAA, device_id); + type_ = Type::HC; + hc_ = device_id - 0x20 + 1; + uint8_t tag = TAG_HC1 + hc_ - 1; + register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); + register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_pump)); + } + + // HT3 + if (flags == EMSdevice::EMS_DEVICE_FLAG_IPM) { + register_telegram_type(0x010C, F("IPMStatusMessage"), false, MAKE_PF_CB(process_IPMStatusMessage)); + register_telegram_type(0x011E, F("IPMTempMessage"), false, MAKE_PF_CB(process_IPMTempMessage)); + // register_telegram_type(0x0123, F("IPMSetMessage"), false, MAKE_PF_CB(process_IPMSetMessage)); + type_ = Type::HC; + hc_ = device_id - 0x20 + 1; + uint8_t tag = TAG_HC1 + hc_ - 1; + register_device_value(tag, &id_, DeviceValueType::UINT, nullptr, FL_(ID), DeviceValueUOM::NONE); + register_device_value(tag, &flowTempHc_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempHc), DeviceValueUOM::DEGREES); + register_device_value(tag, &status_, DeviceValueType::INT, nullptr, FL_(mixerStatus), DeviceValueUOM::PERCENT); + register_device_value(tag, &flowSetTemp_, DeviceValueType::UINT, nullptr, FL_(flowSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_flowSetTemp)); + register_device_value(tag, &pumpStatus_, DeviceValueType::BOOL, nullptr, FL_(pumpStatus), DeviceValueUOM::BOOLEAN, MAKE_CF_CB(set_pump)); + register_device_value(tag, &flowTempVf_, DeviceValueType::USHORT, FL_(div10), FL_(flowTempVf), DeviceValueUOM::DEGREES); + } + id_ = product_id; } @@ -94,10 +110,11 @@ bool Mixer::publish_ha_config() { StaticJsonDocument doc; char uniq_id[20]; - if (type_ == Type::MP) + if (type_ == Type::MP) { snprintf_P(uniq_id, sizeof(uniq_id), PSTR("MixerMP")); - else + } else { snprintf_P(uniq_id, sizeof(uniq_id), PSTR("Mixer%02X"), device_id() - 0x20 + 1); + } doc["uniq_id"] = uniq_id; doc["ic"] = F_(icondevice); @@ -107,11 +124,11 @@ bool Mixer::publish_ha_config() { doc["stat_t"] = stat_t; char name[20]; - if (type_ == Type::MP) + if (type_ == Type::MP) { snprintf_P(name, sizeof(name), PSTR("Mixer MP")); - else + } else { snprintf_P(name, sizeof(name), PSTR("Mixer %02X"), device_id() - 0x20 + 1); - + } doc["name"] = name; char tpl[30]; @@ -207,6 +224,14 @@ void Mixer::process_MMStatusMessage(std::shared_ptr telegram) { has_update(telegram->read_value(status_, 4)); // valve status -100 to 100 } +// Pool mixer MP100, - 0x5BA +void Mixer::process_HpPoolStatus(std::shared_ptr telegram) { + has_update(telegram->read_value(poolTemp_, 0)); + has_update(telegram->read_value(poolShuntStatus__, 2)); + has_update(telegram->read_value(poolShunt_, 3)); // 0-100% how much is the shunt open? + poolShuntStatus_ = poolShunt_ == 100 ? 3 : (poolShunt_ == 0 ? 4 : poolShuntStatus__); +} + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -230,14 +255,50 @@ void Mixer::process_IPMSetMessage(std::shared_ptr telegram) { // pos 1: position in %? } -void Mixer::process_HpPoolStatus(std::shared_ptr telegram) { - has_update(telegram->read_value(poolTemp_, 0)); - has_update(telegram->read_value(poolShuntStatus__, 2)); - has_update(telegram->read_value(poolShunt_, 3)); // 0-100% how much is the shunt open? - poolShuntStatus_ = poolShunt_ == 100 ? 3 : (poolShunt_ == 0 ? 4 : poolShuntStatus__); -} - - #pragma GCC diagnostic pop +bool Mixer::set_flowSetTemp(const char * value, const int8_t id) { + int v; + if (!Helpers::value2number(value, v)) { + return false; + } + LOG_INFO(F("Setting mixer flow set temperature to %d"), v); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { + write_command(0xAC, 0, v, 0xAB); + return true; + } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_IPM) { + write_command(0x123, 0, v, 0x10C); + return true; + } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + uint8_t hc = device_id() -0x20; + write_command(0x2E1 + hc, 1, v, 0x2D7 + hc); + return true; + } + return false; +} + +bool Mixer::set_pump(const char * value, const int8_t id) { + bool b; + if (!Helpers::value2bool(value, b)) { + return false; + } + LOG_INFO(F("Setting mixer pump %s"), b ? "on" : "off"); + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MM10) { + write_command(0xAC, 1, b ? 0x64 : 0, 0xAB); + return true; + } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_IPM) { + write_command(0x123, 1, b ? 0x64 : 0, 0x10C); + return true; + } + if (flags() == EMSdevice::EMS_DEVICE_FLAG_MMPLUS) { + uint8_t hc = device_id() - 0x20; + write_command(0x2E1 + hc, 2, b ? 0x64 : 0, 0x2D7 + hc); + return true; + } + return false; +} + } // namespace emsesp diff --git a/src/devices/mixer.h b/src/devices/mixer.h index 0b602555c..556b00146 100644 --- a/src/devices/mixer.h +++ b/src/devices/mixer.h @@ -42,6 +42,8 @@ class Mixer : public EMSdevice { void process_MMSetMessage(std::shared_ptr telegram); void process_HpPoolStatus(std::shared_ptr telegram); + bool set_flowSetTemp(const char * value, const int8_t id); + bool set_pump(const char * value, const int8_t id); enum class Type { NONE,