SRC modes from MenuConfig F7

This commit is contained in:
MichaelDvP
2026-07-09 19:42:32 +02:00
parent 5c2205cf65
commit ed8adf2617
2 changed files with 45 additions and 5 deletions

View File

@@ -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(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted
} }
register_telegram_type(0x0B65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); 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: // 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: 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) // 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<Connect::RoomCircuit>
register_device_value( register_device_value(
tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp), 5, 30); 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->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->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->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)); 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<const Telegram> telegram) {
has_update(telegram, rc->seltemp_, 3); has_update(telegram, rc->seltemp_, 3);
} }
// calculate dew temperature // 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 // gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 // icon in offset 0
@@ -161,11 +162,11 @@ void Connect::process_roomThermostatSettings(std::shared_ptr<const Telegram> tel
if (rc == nullptr) { if (rc == nullptr) {
return; 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->mode_, 0); // modes: auto, heat, cool, off
// has_update(telegram, rc->tempautotemp_, 1); // FF means off // has_update(telegram, rc->tempautotemp_, 1); // FF means off
// has_update(telegram, rc->manualtemp_, 3); // 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->coolautotemp_, 5);
// has_update(telegram, rc->cooltemp_, 6); // has_update(telegram, rc->cooltemp_, 6);
has_update(telegram, rc->childlock_, 7); has_update(telegram, rc->childlock_, 7);
@@ -199,6 +200,44 @@ void Connect::process_roomSchedule(std::shared_ptr<const Telegram> telegram) {
toggle_fetch(telegram->type_id, false); // fetch only once if all is initialized toggle_fetch(telegram->type_id, false); // fetch only once if all is initialized
} }
void Connect::process_roomConfig(std::shared_ptr<const Telegram> 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: // Settings:
bool Connect::set_mode(const char * value, const int8_t id) { 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; 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; return true;
} }

View File

@@ -65,6 +65,7 @@ class Connect : public EMSdevice {
void process_roomThermostatParam(std::shared_ptr<const Telegram> telegram); void process_roomThermostatParam(std::shared_ptr<const Telegram> telegram);
void process_roomThermostatData(std::shared_ptr<const Telegram> telegram); void process_roomThermostatData(std::shared_ptr<const Telegram> telegram);
void process_roomSchedule(std::shared_ptr<const Telegram> telegram); void process_roomSchedule(std::shared_ptr<const Telegram> telegram);
void process_roomConfig(std::shared_ptr<const Telegram> telegram);
bool set_mode(const char * value, const int8_t id); bool set_mode(const char * value, const int8_t id);
bool set_seltemp(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); bool set_name(const char * value, const int8_t id);