diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 911a77743..61d5f5d40 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -46,6 +46,7 @@ Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, con register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted } register_telegram_type(0x0B65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); + register_telegram_type(0xF7, "MenuConfig", false, MAKE_PF_CB(process_roomConfig)); // 0x2040, broadcast 36 bytes: // data: 0E 60 00 DF 0D AF 0A 46 0A 46 02 9A 1C 53 1C 53 12 AD 12 AD 00 00 13 C2 // data: 1F 37 1F 37 00 00 00 00 18 97 11 27 (offset 24) @@ -93,7 +94,7 @@ void Connect::register_device_values_room(std::shared_ptr register_device_value( tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp), 5, 30); register_device_value(tag, &room->mode_, DeviceValueType::ENUM, FL_(enum_mode2), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); - register_device_value(tag, &room->coolmode_, DeviceValueType::BOOL, FL_(coolingOn), DeviceValueUOM::NONE, MAKE_CF_CB(set_coolmode)); + // register_device_value(tag, &room->coolmode_, DeviceValueType::BOOL, FL_(coolingOn), DeviceValueUOM::NONE, MAKE_CF_CB(set_coolmode)); register_device_value(tag, &room->name_, DeviceValueType::STRING, FL_(name), DeviceValueUOM::NONE, MAKE_CF_CB(set_name)); register_device_value(tag, &room->childlock_, DeviceValueType::BOOL, FL_(childlock), DeviceValueUOM::NONE, MAKE_CF_CB(set_childlock)); register_device_value(tag, &room->icon_, DeviceValueType::ENUM, FL_(enum_icons), FL_(icon), DeviceValueUOM::NONE, MAKE_CF_CB(set_icon)); @@ -135,7 +136,7 @@ void Connect::process_roomThermostat(std::shared_ptr telegram) { has_update(telegram, rc->seltemp_, 3); } // calculate dew temperature - has_update(rc->dewtemp_, Roomctrl::calc_dew(rc->temp_, rc->humidity_)); + has_update(rc->dewtemp_, Helpers::calc_dew(rc->temp_, rc->humidity_)); } // gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 // icon in offset 0 @@ -161,11 +162,11 @@ void Connect::process_roomThermostatSettings(std::shared_ptr tel if (rc == nullptr) { return; } - has_enumupdate(telegram, rc->mode_, 0, {3, 1, 0}); // modes off, manual auto + // has_enumupdate(telegram, rc->mode_, 0, {3, 1, 0}); // modes off, manual auto // has_update(telegram, rc->mode_, 0); // modes: auto, heat, cool, off // has_update(telegram, rc->tempautotemp_, 1); // FF means off // has_update(telegram, rc->manualtemp_, 3); - has_update(telegram, rc->coolmode_, 4); // 01-cooling, 00-heating + // has_update(telegram, rc->coolmode_, 4); // 01-cooling, 00-heating // has_update(telegram, rc->coolautotemp_, 5); // has_update(telegram, rc->cooltemp_, 6); has_update(telegram, rc->childlock_, 7); @@ -199,6 +200,44 @@ void Connect::process_roomSchedule(std::shared_ptr telegram) { toggle_fetch(telegram->type_id, false); // fetch only once if all is initialized } +void Connect::process_roomConfig(std::shared_ptr telegram) { + if (telegram->offset == 0 && telegram->message_length > 3) { + uint16_t t = 0; + telegram->read_value(t, 1); + if (t >= 0x0AB5 && t <= 0x0AB5 + 15) { + auto rc = room_circuit(t - 0x0AB5); + if (rc == nullptr) { + return; + } + uint8_t bits = telegram->message_data[3]; + switch (bits & 0x6A) { + case 0: // cooling off + rc->mode_ = 0; + rc->coolmode_ = 1; + break; + case 0x40: // manual cooling or heating off + rc->mode_ = 1; + rc->coolmode_ = 1; + break; + case 0x20: // auto cooling + rc->mode_ = 2; + rc->coolmode_ = 1; + break; + case 0x48: // manual heating + case 0x08: // manual heating + rc->mode_ = 1; + rc->coolmode_ = 0; + break; + case 0x42: // auto heating + case 0x02: // auto heating + rc->mode_ = 2; + rc->coolmode_ = 0; + break; + } + } + } +} + // Settings: bool Connect::set_mode(const char * value, const int8_t id) { @@ -212,7 +251,7 @@ bool Connect::set_mode(const char * value, const int8_t id) { return false; } } - write_command(0xBB5 + rc->room(), 0, v); // no validate, mode change is broadcasted + write_command(0xBB5 + rc->room(), rc->coolmode_ == 1 ? 4 : 0, v); // no validate, mode change is broadcasted return true; } diff --git a/src/devices/connect.h b/src/devices/connect.h index 2ff585c11..72cdcebd6 100644 --- a/src/devices/connect.h +++ b/src/devices/connect.h @@ -65,6 +65,7 @@ class Connect : public EMSdevice { void process_roomThermostatParam(std::shared_ptr telegram); void process_roomThermostatData(std::shared_ptr telegram); void process_roomSchedule(std::shared_ptr telegram); + void process_roomConfig(std::shared_ptr telegram); bool set_mode(const char * value, const int8_t id); bool set_seltemp(const char * value, const int8_t id); bool set_name(const char * value, const int8_t id);