diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index 30e046cca..ea7aaeeca 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -8146,11 +8146,12 @@ uint8 | datetime | date/time | string | | false | DEVICE_DATA | 0 | 13 | 1 | | outdoortemp | outside temperature | int16 | C | false | DEVICE_DATA | 13 | 1 | 1/10 | | src1.currtemp | current room temperature | int16 | C | false | SRC | 0 | 1 | 1/10 | -| src1.airhumidity | relative air humidity | int8 | % | false | SRC | 1 | 1 | 1 | +| src1.airhumidity | relative air humidity | uint8 | % | false | SRC | 1 | 1 | 1 | | src1.dewtemperature | dew point temperature | int16 | C | false | SRC | 2 | 1 | 1/10 | uint8 | src1.seltemp | selected room temperature | uint8 (>=5<=30) | C | true | SRC | 3 | 1 | 1/2 | | src1.mode | operating mode | enum | | true | SRC | 4 | 1 | 1 | +| src1.cooling | Kühlen | boolean | | true | SRC | -1 | 1 | 1 | | src1.name | name | string | | true | SRC | 5 | 26 | 1 | | src1.childlock | child lock | boolean | | true | SRC | 31 | 1 | 1 | | src1.icon | icon | enum | | true | SRC | 32 | 1 | 1 | diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index 6d2e31c99..a9d5c9df1 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -5861,10 +5861,11 @@ device name,device type,product id,shortname,fullname,type [options...] \| (min/ "MX400",connect,17,datetime,date/time,string, ,false,sensor.connect_date/time,sensor.connect_datetime,13,0,1,0,13 "MX400",connect,17,outdoortemp,outside temperature,int16,C,false,sensor.connect_outside_temperature,sensor.connect_outdoortemp,13,0,1/10,13,1 "MX400",connect,17,src1.currtemp,current room temperature,int16,C,false,sensor.connect_src1_current_room_temperature,sensor.connect_src1_currtemp,13,36,1/10,0,1 -"MX400",connect,17,src1.airhumidity,relative air humidity,int8,%,false,sensor.connect_src1_relative_air_humidity,sensor.connect_src1_airhumidity,13,36,1,1,1 +"MX400",connect,17,src1.airhumidity,relative air humidity,uint8,%,false,sensor.connect_src1_relative_air_humidity,sensor.connect_src1_airhumidity,13,36,1,1,1 "MX400",connect,17,src1.dewtemperature,dew point temperature,int16,C,false,sensor.connect_src1_dew_point_temperature,sensor.connect_src1_dewtemperature,13,36,1/10,2,1 "MX400",connect,17,src1.seltemp,selected room temperature,uint8 (>=5<=30),C,true,number.connect_src1_selected_room_temperature,number.connect_src1_seltemp,13,36,1/2,3,1 "MX400",connect,17,src1.mode,operating mode,enum [off\|manual\|auto] (>=0<=0), ,true,select.connect_src1_operating_mode,select.connect_src1_mode,13,36,1,4,1 +"MX400",connect,17,src1.cooling,Kühlen,boolean (>=0<=0), ,true,switch.connect_src1_Kühlen,switch.connect_src1_cooling,13,36,1,-1,1 "MX400",connect,17,src1.name,name,string (>=0<=0), ,true,sensor.connect_src1_name,sensor.connect_src1_name,13,36,1,5,26 "MX400",connect,17,src1.childlock,child lock,boolean (>=0<=0), ,true,switch.connect_src1_child_lock,switch.connect_src1_childlock,13,36,1,31,1 "MX400",connect,17,src1.icon,icon,enum [none\|mdi:chef-hat\|mdi:sofa-single-outline\|mdi:bowl-mix-outline\|mdi:bed-single-outline\|mdi:bed-double-outline\|mdi:teddy-bear\|mdi:shower\|mdi:laptop\|mdi:door\|mdi:palette-outline\|mdi:washing-machine\|mdi:bookshelf] (>=0<=0), ,true,select.connect_src1_icon,select.connect_src1_icon,13,36,1,32,1 diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 1b87a695e..0abf28f84 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -45,7 +45,7 @@ Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, con register_telegram_type(0x1230 + i, "Roomparams", false, MAKE_PF_CB(process_roomThermostatParam)); // fetch for active circuits register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted } - register_telegram_type(0xDB65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); + register_telegram_type(0x0B65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); // 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) @@ -88,11 +88,12 @@ void Connect::process_RCTime(std::shared_ptr telegram) { void Connect::register_device_values_room(std::shared_ptr room) { auto tag = DeviceValueTAG::TAG_SRC1 + room->room(); register_device_value(tag, &room->temp_, DeviceValueType::INT16, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(roomTemp), DeviceValueUOM::DEGREES); - register_device_value(tag, &room->humidity_, DeviceValueType::INT8, FL_(airHumidity), DeviceValueUOM::PERCENT); + register_device_value(tag, &room->humidity_, DeviceValueType::UINT8, FL_(airHumidity), DeviceValueUOM::PERCENT); register_device_value(tag, &room->dewtemp_, DeviceValueType::INT16, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(dewTemperature), DeviceValueUOM::DEGREES); 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_(cooling), 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)); @@ -133,16 +134,8 @@ void Connect::process_roomThermostat(std::shared_ptr telegram) { if (!Mqtt::ha_enabled() || (Helpers::hasValue(rc->mode_) && Helpers::hasValue(rc->icon_))) { has_update(telegram, rc->seltemp_, 3); } - // calculate dew temperature - if (rc->humidity_ >= 0 && rc->humidity_ <= 100) { - const float k2 = 17.62; - const float k3 = 243.12; - const float t = (float)rc->temp_ / 10; - const float h = (float)rc->humidity_ / 100; - int16_t dt = (10 * k3 * (((k2 * t) / (k3 + t)) + log(h)) / (((k2 * k3) / (k3 + t)) - log(h))); - has_update(rc->dewtemp_, dt); - } + has_update(rc->dewtemp_, Roomctrl::calc_dew(rc->temp_, rc->humidity_)); } // gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 // icon in offset 0 @@ -172,6 +165,9 @@ void Connect::process_roomThermostatSettings(std::shared_ptr tel // 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->coolautotemp_, 5); + // has_update(telegram, rc->cooltemp_, 6); has_update(telegram, rc->childlock_, 7); } @@ -226,10 +222,13 @@ bool Connect::set_seltemp(const char * value, const int8_t id) { return false; } float v; - if (Helpers::value2float(value, v)) { + if (Helpers::value2temperature(value, v)) { // depends on mode, auto (2 for enum_mode2, 0 for enum_mode8) set in offset 1 - write_command(0xBB5 + rc->room(), rc->mode_ == 2 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); - // write_command(0xBB5 + rc->room(), rc->mode_ == 0 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); + if (rc->coolmode_ == 1) { + write_command(0xBB5 + rc->room(), rc->mode_ == 2 ? 5 : 6, v == -1 ? 0xFF : uint8_t(v * 2)); + } else { + write_command(0xBB5 + rc->room(), rc->mode_ == 2 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); + } return true; } return false; @@ -257,6 +256,19 @@ bool Connect::set_name(const char * value, const int8_t id) { return true; } +bool Connect::set_coolmode(const char * value, const int8_t id) { + auto rc = room_circuit(id - DeviceValueTAG::TAG_SRC1); + if (rc == nullptr) { + return false; + } + bool b; + if (Helpers::value2bool(value, b)) { + write_command(0xBB5 + rc->room(), 4, b ? 1 : 0, 0xBB5 + rc->room()); + return true; + } + return false; +} + bool Connect::set_childlock(const char * value, const int8_t id) { auto rc = room_circuit(id - DeviceValueTAG::TAG_SRC1); if (rc == nullptr) { diff --git a/src/devices/connect.h b/src/devices/connect.h index bbe647119..2ff585c11 100644 --- a/src/devices/connect.h +++ b/src/devices/connect.h @@ -34,15 +34,18 @@ class Connect : public EMSdevice { } ~RoomCircuit() = default; int16_t temp_; - int8_t humidity_; + uint8_t humidity_; uint8_t seltemp_; uint8_t mode_; char name_[51]; int16_t dewtemp_; uint8_t childlock_; uint8_t icon_; + uint8_t coolmode_; // uint8_t tempautotemp_; // uint8_t manualtemp_; + // uint8_t coolautotemp_; + // uint8_t cooltemp_; uint8_t room() { return room_; @@ -65,6 +68,7 @@ class Connect : public EMSdevice { 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); + bool set_coolmode(const char * value, const int8_t id); bool set_childlock(const char * value, const int8_t id); bool set_icon(const char * value, const int8_t id);