mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 15:59:52 +03:00
add RC300 floordrying, error, building, damped temperature #583
This commit is contained in:
@@ -61,7 +61,7 @@ void Shell::start() {
|
|||||||
uuid::log::Logger::register_handler(this, uuid::log::Level::DEBUG); // added by proddy
|
uuid::log::Logger::register_handler(this, uuid::log::Level::DEBUG); // added by proddy
|
||||||
//uuid::log::Logger::register_handler(this, uuid::log::Level::INFO); // added by proddy
|
//uuid::log::Logger::register_handler(this, uuid::log::Level::INFO); // added by proddy
|
||||||
#else
|
#else
|
||||||
uuid::log::Logger::register_handler(this, uuid::log::Level::INFO);
|
uuid::log::Logger::register_handler(this, uuid::log::Level::NOTICE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
line_buffer_.reserve(maximum_command_line_length_);
|
line_buffer_.reserve(maximum_command_line_length_);
|
||||||
|
|||||||
@@ -123,6 +123,10 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
|
|||||||
register_telegram_type(0x31B, F("RC300WWtemp"), true, [&](std::shared_ptr<const Telegram> t) { process_RC300WWtemp(t); });
|
register_telegram_type(0x31B, F("RC300WWtemp"), true, [&](std::shared_ptr<const Telegram> t) { process_RC300WWtemp(t); });
|
||||||
register_telegram_type(0x31D, F("RC300WWmode2"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300WWmode2(t); });
|
register_telegram_type(0x31D, F("RC300WWmode2"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300WWmode2(t); });
|
||||||
register_telegram_type(0x31E, F("RC300WWmode2"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300WWmode2(t); });
|
register_telegram_type(0x31E, F("RC300WWmode2"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300WWmode2(t); });
|
||||||
|
register_telegram_type(0x23A, F("RC300OutdoorTemp"), true, [&](std::shared_ptr<const Telegram> t) { process_RC300OutdoorTemp(t); });
|
||||||
|
register_telegram_type(0x267, F("RC300Floordry"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300Floordry(t); });
|
||||||
|
register_telegram_type(0x240, F("RC300Settings"), true, [&](std::shared_ptr<const Telegram> t) { process_RC300Settings(t); });
|
||||||
|
register_telegram_type(0xBF, F("RC300Error"), false, [&](std::shared_ptr<const Telegram> t) { process_RC300Error(t); });
|
||||||
|
|
||||||
// JUNKERS/HT3
|
// JUNKERS/HT3
|
||||||
} else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) {
|
} else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) {
|
||||||
@@ -186,6 +190,8 @@ void Thermostat::device_info_web(JsonArray & root) {
|
|||||||
print_value_json(root, F("intoffset"), nullptr, F_(intoffset), nullptr, json_main);
|
print_value_json(root, F("intoffset"), nullptr, F_(intoffset), nullptr, json_main);
|
||||||
print_value_json(root, F("minexttemp"), nullptr, F_(minexttemp), F_(degrees), json_main);
|
print_value_json(root, F("minexttemp"), nullptr, F_(minexttemp), F_(degrees), json_main);
|
||||||
print_value_json(root, F("building"), nullptr, F_(building), nullptr, json_main);
|
print_value_json(root, F("building"), nullptr, F_(building), nullptr, json_main);
|
||||||
|
print_value_json(root, F("floordry"), nullptr, F_(floordry), nullptr, json_main);
|
||||||
|
print_value_json(root, F("floordrytemp"), nullptr, F_(floordrytemp), F_(degrees), json_main);
|
||||||
print_value_json(root, F("wwmode"), nullptr, F_(wwmode), nullptr, json_main);
|
print_value_json(root, F("wwmode"), nullptr, F_(wwmode), nullptr, json_main);
|
||||||
print_value_json(root, F("wwtemp"), nullptr, F_(wwtemp), nullptr, json_main);
|
print_value_json(root, F("wwtemp"), nullptr, F_(wwtemp), nullptr, json_main);
|
||||||
print_value_json(root, F("wwtemplow"), nullptr, F_(wwtemplow), nullptr, json_main);
|
print_value_json(root, F("wwtemplow"), nullptr, F_(wwtemplow), nullptr, json_main);
|
||||||
@@ -268,6 +274,8 @@ void Thermostat::show_values(uuid::console::Shell & shell) {
|
|||||||
print_value_json(shell, F("intoffset"), nullptr, F_(intoffset), nullptr, json_main);
|
print_value_json(shell, F("intoffset"), nullptr, F_(intoffset), nullptr, json_main);
|
||||||
print_value_json(shell, F("minexttemp"), nullptr, F_(minexttemp), F_(degrees), json_main);
|
print_value_json(shell, F("minexttemp"), nullptr, F_(minexttemp), F_(degrees), json_main);
|
||||||
print_value_json(shell, F("building"), nullptr, F_(building), nullptr, json_main);
|
print_value_json(shell, F("building"), nullptr, F_(building), nullptr, json_main);
|
||||||
|
print_value_json(shell, F("floordry"), nullptr, F_(floordry), nullptr, json_main);
|
||||||
|
print_value_json(shell, F("floordrytemp"), nullptr, F_(floordrytemp), F_(degrees), json_main);
|
||||||
print_value_json(shell, F("wwmode"), nullptr, F_(wwmode), nullptr, json_main);
|
print_value_json(shell, F("wwmode"), nullptr, F_(wwmode), nullptr, json_main);
|
||||||
print_value_json(shell, F("wwtemp"), nullptr, F_(wwtemp), nullptr, json_main);
|
print_value_json(shell, F("wwtemp"), nullptr, F_(wwtemp), nullptr, json_main);
|
||||||
print_value_json(shell, F("wwtemplow"), nullptr, F_(wwtemplow), nullptr, json_main);
|
print_value_json(shell, F("wwtemplow"), nullptr, F_(wwtemplow), nullptr, json_main);
|
||||||
@@ -399,11 +407,23 @@ bool Thermostat::export_values_main(JsonObject & rootThermostat) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Damped outdoor temperature
|
// Damped outdoor temperature (RC35)
|
||||||
if (Helpers::hasValue(dampedoutdoortemp_)) {
|
if (Helpers::hasValue(dampedoutdoortemp_)) {
|
||||||
rootThermostat["dampedtemp"] = dampedoutdoortemp_;
|
rootThermostat["dampedtemp"] = dampedoutdoortemp_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Damped outdoor temperature (RC300)
|
||||||
|
if (Helpers::hasValue(dampedoutdoortemp2_)) {
|
||||||
|
rootThermostat["dampedtemp"] = (float)dampedoutdoortemp2_ / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Floordry
|
||||||
|
if (Helpers::hasValue(floordrystatus_) && Helpers::hasValue(floordrytemp_) && (floordrytemp_ > 0)) {
|
||||||
|
char s[10];
|
||||||
|
rootThermostat["floordry"] = Helpers::render_enum(s, {"off", "start", "heat", "hold", "cool", "end"}, floordrystatus_);
|
||||||
|
rootThermostat["floordrytemp"] = floordrytemp_;
|
||||||
|
}
|
||||||
|
|
||||||
// Temp sensor 1
|
// Temp sensor 1
|
||||||
if (Helpers::hasValue(tempsensor1_)) {
|
if (Helpers::hasValue(tempsensor1_)) {
|
||||||
rootThermostat["inttemp1"] = (float)tempsensor1_ / 10;
|
rootThermostat["inttemp1"] = (float)tempsensor1_ / 10;
|
||||||
@@ -427,8 +447,12 @@ bool Thermostat::export_values_main(JsonObject & rootThermostat) {
|
|||||||
// Building
|
// Building
|
||||||
if (Helpers::hasValue(ibaBuildingType_)) {
|
if (Helpers::hasValue(ibaBuildingType_)) {
|
||||||
char s[10];
|
char s[10];
|
||||||
|
if (model == EMS_DEVICE_FLAG_RC300 || model == EMS_DEVICE_FLAG_RC100) {
|
||||||
|
rootThermostat["building"] = Helpers::render_enum(s, {"light", "medium", "heavy"}, ibaBuildingType_ - 1);
|
||||||
|
} else {
|
||||||
rootThermostat["building"] = Helpers::render_enum(s, {"light", "medium", "heavy"}, ibaBuildingType_);
|
rootThermostat["building"] = Helpers::render_enum(s, {"light", "medium", "heavy"}, ibaBuildingType_);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Warm water mode
|
// Warm water mode
|
||||||
if (Helpers::hasValue(wwMode_)) {
|
if (Helpers::hasValue(wwMode_)) {
|
||||||
@@ -773,7 +797,7 @@ void Thermostat::register_mqtt_ha_config() {
|
|||||||
Mqtt::publish_retain(F("homeassistant/sensor/ems-esp/thermostat/config"), doc.as<JsonObject>(), true); // publish the config payload with retain flag
|
Mqtt::publish_retain(F("homeassistant/sensor/ems-esp/thermostat/config"), doc.as<JsonObject>(), true); // publish the config payload with retain flag
|
||||||
|
|
||||||
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(time), this->device_type(), "time", nullptr, nullptr);
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(time), this->device_type(), "time", nullptr, nullptr);
|
||||||
// Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(error), this->device_type(), "errorcode", nullptr, nullptr);
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(error), this->device_type(), "errorcode", nullptr, nullptr);
|
||||||
|
|
||||||
uint8_t model = this->model();
|
uint8_t model = this->model();
|
||||||
|
|
||||||
@@ -782,7 +806,16 @@ void Thermostat::register_mqtt_ha_config() {
|
|||||||
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(language), this->device_type(), "language", nullptr, nullptr);
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(language), this->device_type(), "language", nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model == EMS_DEVICE_FLAG_RC35 || model == EMS_DEVICE_FLAG_RC35) {
|
if (model == EMS_DEVICE_FLAG_RC300 || model == EMS_DEVICE_FLAG_RC100) {
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(dampedtemp), this->device_type(), "dampedtemp", F_(degrees), F_(icontemperature));
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(building), this->device_type(), "building", nullptr, nullptr);
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(floordry), this->device_type(), "floordry", nullptr, nullptr);
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(floordrytemp), this->device_type(), "floordrytemp", F_(degrees), F_(icontemperature));
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(wwmode), this->device_type(), "wwmode", nullptr, nullptr);
|
||||||
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(wwtemp), this->device_type(), "wwtemp", F_(degrees), F_(icontemperature));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model == EMS_DEVICE_FLAG_RC35 || model == EMS_DEVICE_FLAG_RC30_1) {
|
||||||
// excluding inttemp1, inttemp2, intoffset, minexttemp
|
// excluding inttemp1, inttemp2, intoffset, minexttemp
|
||||||
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(dampedtemp), this->device_type(), "dampedtemp", F_(degrees), F_(icontemperature));
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(dampedtemp), this->device_type(), "dampedtemp", F_(degrees), F_(icontemperature));
|
||||||
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(building), this->device_type(), "building", nullptr, nullptr);
|
Mqtt::register_mqtt_ha_sensor(nullptr, nullptr, F_(building), this->device_type(), "building", nullptr, nullptr);
|
||||||
@@ -1266,6 +1299,37 @@ void Thermostat::process_RC300WWmode2(std::shared_ptr<const Telegram> telegram)
|
|||||||
// pos 3 = current status of DHW circulation pump
|
// pos 3 = current status of DHW circulation pump
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 0x23A damped outdoor temp
|
||||||
|
void Thermostat::process_RC300OutdoorTemp(std::shared_ptr<const Telegram> telegram) {
|
||||||
|
changed_ |= telegram->read_value(dampedoutdoortemp2_, 0); // is *10
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0x240 RC300 parameter
|
||||||
|
void Thermostat::process_RC300Settings(std::shared_ptr<const Telegram> telegram) {
|
||||||
|
changed_ |= telegram->read_value(ibaBuildingType_ , 9); // 1=light, 2=medium, 3=heavy
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0x267 RC300 floordrying
|
||||||
|
void Thermostat::process_RC300Floordry(std::shared_ptr<const Telegram> telegram) {
|
||||||
|
changed_ |= telegram->read_value(floordrystatus_ , 0);
|
||||||
|
changed_ |= telegram->read_value(floordrytemp_ , 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0xBF RC300 Errormessage
|
||||||
|
void Thermostat::process_RC300Error(std::shared_ptr<const Telegram> telegram) {
|
||||||
|
if (errorCode_.empty()) {
|
||||||
|
errorCode_.resize(10, '\0');
|
||||||
|
}
|
||||||
|
char buf[4];
|
||||||
|
buf[0] = telegram->message_data[5];
|
||||||
|
buf[1] = telegram->message_data[6];
|
||||||
|
buf[2] = telegram->message_data[7];
|
||||||
|
buf[3] = 0;
|
||||||
|
changed_ |= telegram->read_value(errorNumber_, 8);
|
||||||
|
|
||||||
|
snprintf_P(&errorCode_[0], errorCode_.capacity() + 1, PSTR("%s(%d)"), buf, errorNumber_);
|
||||||
|
|
||||||
|
}
|
||||||
// type 0x41 - data from the RC30 thermostat(0x10) - 14 bytes long
|
// type 0x41 - data from the RC30 thermostat(0x10) - 14 bytes long
|
||||||
void Thermostat::process_RC30Monitor(std::shared_ptr<const Telegram> telegram) {
|
void Thermostat::process_RC30Monitor(std::shared_ptr<const Telegram> telegram) {
|
||||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(telegram);
|
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(telegram);
|
||||||
@@ -1472,7 +1536,12 @@ bool Thermostat::set_building(const char * value, const int8_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG_INFO(F("Setting building to %s"), value);
|
LOG_INFO(F("Setting building to %s"), value);
|
||||||
|
|
||||||
|
if ((this->model() == EMS_DEVICE_FLAG_RC300) || (this->model() == EMS_DEVICE_FLAG_RC100)) {
|
||||||
|
write_command(0x240, 9, bd + 1, 0x240);
|
||||||
|
} else {
|
||||||
write_command(EMS_TYPE_IBASettings, 6, bd, EMS_TYPE_IBASettings);
|
write_command(EMS_TYPE_IBASettings, 6, bd, EMS_TYPE_IBASettings);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -2197,6 +2266,7 @@ void Thermostat::add_commands() {
|
|||||||
register_mqtt_cmd(F("wwmode"), [&](const char * value, const int8_t id) { return set_wwmode(value, id); });
|
register_mqtt_cmd(F("wwmode"), [&](const char * value, const int8_t id) { return set_wwmode(value, id); });
|
||||||
register_mqtt_cmd(F("wwtemp"), [&](const char * value, const int8_t id) { return set_wwtemp(value, id); });
|
register_mqtt_cmd(F("wwtemp"), [&](const char * value, const int8_t id) { return set_wwtemp(value, id); });
|
||||||
register_mqtt_cmd(F("wwtemplow"), [&](const char * value, const int8_t id) { return set_wwtemplow(value, id); });
|
register_mqtt_cmd(F("wwtemplow"), [&](const char * value, const int8_t id) { return set_wwtemplow(value, id); });
|
||||||
|
register_mqtt_cmd(F("building"), [&](const char * value, const int8_t id) { return set_building(value, id); });
|
||||||
break;
|
break;
|
||||||
case EMS_DEVICE_FLAG_RC20_2:
|
case EMS_DEVICE_FLAG_RC20_2:
|
||||||
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { return set_nighttemp(value, id); });
|
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { return set_nighttemp(value, id); });
|
||||||
|
|||||||
@@ -151,6 +151,9 @@ class Thermostat : public EMSdevice {
|
|||||||
int8_t dampedoutdoortemp_ = EMS_VALUE_INT_NOTSET;
|
int8_t dampedoutdoortemp_ = EMS_VALUE_INT_NOTSET;
|
||||||
uint16_t tempsensor1_ = EMS_VALUE_USHORT_NOTSET;
|
uint16_t tempsensor1_ = EMS_VALUE_USHORT_NOTSET;
|
||||||
uint16_t tempsensor2_ = EMS_VALUE_USHORT_NOTSET;
|
uint16_t tempsensor2_ = EMS_VALUE_USHORT_NOTSET;
|
||||||
|
int16_t dampedoutdoortemp2_ = EMS_VALUE_SHORT_NOTSET;
|
||||||
|
uint8_t floordrystatus_ = EMS_VALUE_UINT_NOTSET;
|
||||||
|
uint8_t floordrytemp_ = EMS_VALUE_UINT_NOTSET;
|
||||||
|
|
||||||
uint8_t wwExtra1_ = EMS_VALUE_UINT_NOTSET; // wwExtra active for wwSystem 1
|
uint8_t wwExtra1_ = EMS_VALUE_UINT_NOTSET; // wwExtra active for wwSystem 1
|
||||||
uint8_t wwExtra2_ = EMS_VALUE_UINT_NOTSET;
|
uint8_t wwExtra2_ = EMS_VALUE_UINT_NOTSET;
|
||||||
@@ -267,6 +270,10 @@ class Thermostat : public EMSdevice {
|
|||||||
void process_RC300WWmode(std::shared_ptr<const Telegram> telegram);
|
void process_RC300WWmode(std::shared_ptr<const Telegram> telegram);
|
||||||
void process_RC300WWmode2(std::shared_ptr<const Telegram> telegram);
|
void process_RC300WWmode2(std::shared_ptr<const Telegram> telegram);
|
||||||
void process_RC300WWtemp(std::shared_ptr<const Telegram> telegram);
|
void process_RC300WWtemp(std::shared_ptr<const Telegram> telegram);
|
||||||
|
void process_RC300OutdoorTemp(std::shared_ptr<const Telegram> telegram);
|
||||||
|
void process_RC300Settings(std::shared_ptr<const Telegram> telegram);
|
||||||
|
void process_RC300Error(std::shared_ptr<const Telegram> telegram);
|
||||||
|
void process_RC300Floordry(std::shared_ptr<const Telegram> telegram);
|
||||||
void process_JunkersMonitor(std::shared_ptr<const Telegram> telegram);
|
void process_JunkersMonitor(std::shared_ptr<const Telegram> telegram);
|
||||||
void process_JunkersSet(std::shared_ptr<const Telegram> telegram);
|
void process_JunkersSet(std::shared_ptr<const Telegram> telegram);
|
||||||
void process_JunkersSet2(std::shared_ptr<const Telegram> telegram);
|
void process_JunkersSet2(std::shared_ptr<const Telegram> telegram);
|
||||||
|
|||||||
@@ -239,6 +239,9 @@ MAKE_PSTR(inttemp2, "Temperature sensor 2")
|
|||||||
MAKE_PSTR(intoffset, "Offset int. temperature")
|
MAKE_PSTR(intoffset, "Offset int. temperature")
|
||||||
MAKE_PSTR(minexttemp, "Min ext. temperature")
|
MAKE_PSTR(minexttemp, "Min ext. temperature")
|
||||||
MAKE_PSTR(building, "Building")
|
MAKE_PSTR(building, "Building")
|
||||||
|
MAKE_PSTR(floordry, "Floordrying")
|
||||||
|
MAKE_PSTR(floordrytemp, "Floordrying temperature")
|
||||||
|
|
||||||
MAKE_PSTR(wwmode, "Warm water mode")
|
MAKE_PSTR(wwmode, "Warm water mode")
|
||||||
MAKE_PSTR(wwtemp, "Warm water high temperature")
|
MAKE_PSTR(wwtemp, "Warm water high temperature")
|
||||||
MAKE_PSTR(wwtemplow, "Warm water low temperature")
|
MAKE_PSTR(wwtemplow, "Warm water low temperature")
|
||||||
|
|||||||
Reference in New Issue
Block a user