mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-01-29 01:59:08 +03:00
refactor commands to its own class, implement rest API #506
This commit is contained in:
@@ -52,22 +52,22 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const
|
||||
register_telegram_type(0xE9, F("UBADHWStatus"), false, [&](std::shared_ptr<const Telegram> t) { process_UBADHWStatus(t); });
|
||||
register_telegram_type(0xEA, F("UBAParameterWWPlus"), true, [&](std::shared_ptr<const Telegram> t) { process_UBAParameterWWPlus(t); });
|
||||
|
||||
// MQTT commands for boiler_cmd topic
|
||||
register_mqtt_cmd(F("comfort"), [&](const char * value, const int8_t id) { set_warmwater_mode(value, id); });
|
||||
register_mqtt_cmd(F("wwactivated"), [&](const char * value, const int8_t id) { set_warmwater_activated(value, id); });
|
||||
register_mqtt_cmd(F("wwtapactivated"), [&](const char * value, const int8_t id) { set_tapwarmwater_activated(value, id); });
|
||||
register_mqtt_cmd(F("wwonetime"), [&](const char * value, const int8_t id) { set_warmwater_onetime(value, id); });
|
||||
register_mqtt_cmd(F("wwcirculation"), [&](const char * value, const int8_t id) { set_warmwater_circulation(value, id); });
|
||||
register_mqtt_cmd(F("flowtemp"), [&](const char * value, const int8_t id) { set_flow_temp(value, id); });
|
||||
register_mqtt_cmd(F("wwtemp"), [&](const char * value, const int8_t id) { set_warmwater_temp(value, id); });
|
||||
register_mqtt_cmd(F("heatingactivated"), [&](const char * value, const int8_t id) { set_heating_activated(value, id); });
|
||||
register_mqtt_cmd(F("heatingtemp"), [&](const char * value, const int8_t id) { set_heating_temp(value, id); });
|
||||
register_mqtt_cmd(F("burnmaxpower"), [&](const char * value, const int8_t id) { set_max_power(value, id); });
|
||||
register_mqtt_cmd(F("burnminpower"), [&](const char * value, const int8_t id) { set_min_power(value, id); });
|
||||
register_mqtt_cmd(F("boilhyston"), [&](const char * value, const int8_t id) { set_hyst_on(value, id); });
|
||||
register_mqtt_cmd(F("boilhystoff"), [&](const char * value, const int8_t id) { set_hyst_off(value, id); });
|
||||
register_mqtt_cmd(F("burnperiod"), [&](const char * value, const int8_t id) { set_burn_period(value, id); });
|
||||
register_mqtt_cmd(F("pumpdelay"), [&](const char * value, const int8_t id) { set_pump_delay(value, id); });
|
||||
// MQTT commands for boiler topic
|
||||
register_mqtt_cmd(F("comfort"), [&](const char * value, const int8_t id) { return set_warmwater_mode(value, id); });
|
||||
register_mqtt_cmd(F("wwactivated"), [&](const char * value, const int8_t id) { return set_warmwater_activated(value, id); });
|
||||
register_mqtt_cmd(F("wwtapactivated"), [&](const char * value, const int8_t id) { return set_tapwarmwater_activated(value, id); });
|
||||
register_mqtt_cmd(F("wwonetime"), [&](const char * value, const int8_t id) { return set_warmwater_onetime(value, id); });
|
||||
register_mqtt_cmd(F("wwcirculation"), [&](const char * value, const int8_t id) { return set_warmwater_circulation(value, id); });
|
||||
register_mqtt_cmd(F("flowtemp"), [&](const char * value, const int8_t id) { return set_flow_temp(value, id); });
|
||||
register_mqtt_cmd(F("wwtemp"), [&](const char * value, const int8_t id) { return set_warmwater_temp(value, id); });
|
||||
register_mqtt_cmd(F("heatingactivated"), [&](const char * value, const int8_t id) { return set_heating_activated(value, id); });
|
||||
register_mqtt_cmd(F("heatingtemp"), [&](const char * value, const int8_t id) { return set_heating_temp(value, id); });
|
||||
register_mqtt_cmd(F("burnmaxpower"), [&](const char * value, const int8_t id) { return set_max_power(value, id); });
|
||||
register_mqtt_cmd(F("burnminpower"), [&](const char * value, const int8_t id) { return set_min_power(value, id); });
|
||||
register_mqtt_cmd(F("boilhyston"), [&](const char * value, const int8_t id) { return set_hyst_on(value, id); });
|
||||
register_mqtt_cmd(F("boilhystoff"), [&](const char * value, const int8_t id) { return set_hyst_off(value, id); });
|
||||
register_mqtt_cmd(F("burnperiod"), [&](const char * value, const int8_t id) { return set_burn_period(value, id); });
|
||||
register_mqtt_cmd(F("pumpdelay"), [&](const char * value, const int8_t id) { return set_pump_delay(value, id); });
|
||||
|
||||
EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & settings) {
|
||||
mqtt_format_ = settings.mqtt_format; // single, nested or ha
|
||||
@@ -85,7 +85,6 @@ void Boiler::add_context_menu() {
|
||||
flash_string_vector{F_(boiler)},
|
||||
[&](Shell & shell, const std::vector<std::string> & arguments __attribute__((unused))) {
|
||||
Boiler::console_commands(shell, ShellContext::BOILER);
|
||||
add_context_commands(ShellContext::BOILER);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -765,16 +764,11 @@ void Boiler::process_UBAMaintenanceData(std::shared_ptr<const Telegram> telegram
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Commands
|
||||
*/
|
||||
|
||||
|
||||
// Set the warm water temperature 0x33
|
||||
void Boiler::set_warmwater_temp(const char * value, const int8_t id) {
|
||||
bool Boiler::set_warmwater_temp(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler warm water temperature to %d C"), v);
|
||||
@@ -784,24 +778,28 @@ void Boiler::set_warmwater_temp(const char * value, const int8_t id) {
|
||||
write_command(EMS_TYPE_UBAParameterWW, 2, v, EMS_TYPE_UBAParameterWW);
|
||||
write_command(EMS_TYPE_UBAFlags, 3, v, EMS_TYPE_UBAParameterWW); // for i9000, see #397
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// flow temp
|
||||
void Boiler::set_flow_temp(const char * value, const int8_t id) {
|
||||
bool Boiler::set_flow_temp(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler flow temperature to %d C"), v);
|
||||
write_command(EMS_TYPE_UBASetPoints, 0, v, EMS_TYPE_UBASetPoints);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set min boiler output
|
||||
void Boiler::set_heating_activated(const char * value, const int8_t id) {
|
||||
bool Boiler::set_heating_activated(const char * value, const int8_t id) {
|
||||
bool v = false;
|
||||
if (!Helpers::value2bool(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
LOG_INFO(F("Setting boiler heating "), v ? "on" : "off");
|
||||
if (get_toggle_fetch(EMS_TYPE_UBAParametersPlus)) {
|
||||
@@ -809,41 +807,49 @@ void Boiler::set_heating_activated(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 0, v ? 0xFF : 0, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set heating maximum temperature
|
||||
void Boiler::set_heating_temp(const char * value, const int8_t id) {
|
||||
bool Boiler::set_heating_temp(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler heating temperature to "), v);
|
||||
if (get_toggle_fetch(EMS_TYPE_UBAParametersPlus)) {
|
||||
write_command(EMS_TYPE_UBAParametersPlus, 1, v, EMS_TYPE_UBAParametersPlus);
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 1, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set min boiler output
|
||||
void Boiler::set_min_power(const char * value, const int8_t id) {
|
||||
bool Boiler::set_min_power(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler min power to "), v);
|
||||
if (get_toggle_fetch(EMS_TYPE_UBAParametersPlus)) {
|
||||
write_command(EMS_TYPE_UBAParametersPlus, 7, v, EMS_TYPE_UBAParametersPlus);
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 3, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set max temp
|
||||
void Boiler::set_max_power(const char * value, const int8_t id) {
|
||||
bool Boiler::set_max_power(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler max power to %d C"), v);
|
||||
@@ -852,13 +858,15 @@ void Boiler::set_max_power(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 2, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set boiler on hysteresis
|
||||
void Boiler::set_hyst_on(const char * value, const int8_t id) {
|
||||
bool Boiler::set_hyst_on(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler hysteresis on to %d C"), v);
|
||||
@@ -867,13 +875,15 @@ void Boiler::set_hyst_on(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 5, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set boiler off hysteresis
|
||||
void Boiler::set_hyst_off(const char * value, const int8_t id) {
|
||||
bool Boiler::set_hyst_off(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler hysteresis off to %d C"), v);
|
||||
@@ -882,13 +892,15 @@ void Boiler::set_hyst_off(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 4, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set min burner period
|
||||
void Boiler::set_burn_period(const char * value, const int8_t id) {
|
||||
bool Boiler::set_burn_period(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting burner min. period to %d min"), v);
|
||||
@@ -897,30 +909,36 @@ void Boiler::set_burn_period(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameters, 6, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set pump delay
|
||||
void Boiler::set_pump_delay(const char * value, const int8_t id) {
|
||||
bool Boiler::set_pump_delay(const char * value, const int8_t id) {
|
||||
int v = 0;
|
||||
if (!Helpers::value2number(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (get_toggle_fetch(EMS_TYPE_UBAParameters)) {
|
||||
LOG_INFO(F("Setting boiler pump delay to %d min"), v);
|
||||
write_command(EMS_TYPE_UBAParameters, 8, v, EMS_TYPE_UBAParameters);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// note some boilers do not have this setting, than it's done by thermostat
|
||||
// on a RC35 it's by EMSESP::send_write_request(0x37, 0x10, 2, &set, 1, 0); (set is 1,2,3) 1=hot, 2=eco, 3=intelligent
|
||||
void Boiler::set_warmwater_mode(const char * value, const int8_t id) {
|
||||
bool Boiler::set_warmwater_mode(const char * value, const int8_t id) {
|
||||
if (value == nullptr) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!get_toggle_fetch(EMS_TYPE_UBAParameterWW)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t set;
|
||||
if (strcmp(value, "hot") == 0) {
|
||||
LOG_INFO(F("Setting boiler warm water to Hot"));
|
||||
@@ -932,16 +950,18 @@ void Boiler::set_warmwater_mode(const char * value, const int8_t id) {
|
||||
LOG_INFO(F("Setting boiler warm water to Intelligent"));
|
||||
set = 0xEC;
|
||||
} else {
|
||||
return; // do nothing
|
||||
return false; // do nothing
|
||||
}
|
||||
|
||||
write_command(EMS_TYPE_UBAParameterWW, 9, set, EMS_TYPE_UBAParameterWW);
|
||||
return true;
|
||||
}
|
||||
|
||||
// turn on/off warm water
|
||||
void Boiler::set_warmwater_activated(const char * value, const int8_t id) {
|
||||
bool Boiler::set_warmwater_activated(const char * value, const int8_t id) {
|
||||
bool v = false;
|
||||
if (!Helpers::value2bool(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler warm water %s"), v ? "on" : "off");
|
||||
@@ -953,19 +973,22 @@ void Boiler::set_warmwater_activated(const char * value, const int8_t id) {
|
||||
} else {
|
||||
n = (v ? 0xFF : 0x00); // 0xFF is on, 0x00 is off
|
||||
}
|
||||
|
||||
if (get_toggle_fetch(EMS_TYPE_UBAParameterWWPlus)) {
|
||||
write_command(EMS_TYPE_UBAParameterWWPlus, 1, v ? 1 : 0, EMS_TYPE_UBAParameterWWPlus);
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAParameterWW, 1, n, EMS_TYPE_UBAParameterWW);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Activate / De-activate the Warm Tap Water
|
||||
// Note: Using the type 0x1D to put the boiler into Test mode. This may be shown on the boiler with a flashing 'T'
|
||||
void Boiler::set_tapwarmwater_activated(const char * value, const int8_t id) {
|
||||
bool Boiler::set_tapwarmwater_activated(const char * value, const int8_t id) {
|
||||
bool v = false;
|
||||
if (!Helpers::value2bool(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting tap warm tap water %s"), v ? "on" : "off");
|
||||
@@ -990,15 +1013,17 @@ void Boiler::set_tapwarmwater_activated(const char * value, const int8_t id) {
|
||||
}
|
||||
|
||||
write_command(EMS_TYPE_UBAFunctionTest, 0, message_data, sizeof(message_data), 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Activate / De-activate One Time warm water 0x35
|
||||
// true = on, false = off
|
||||
// See also https://github.com/proddy/EMS-ESP/issues/341#issuecomment-596245458 for Junkers
|
||||
void Boiler::set_warmwater_onetime(const char * value, const int8_t id) {
|
||||
bool Boiler::set_warmwater_onetime(const char * value, const int8_t id) {
|
||||
bool v = false;
|
||||
if (!Helpers::value2bool(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler warm water OneTime loading %s"), v ? "on" : "off");
|
||||
@@ -1007,14 +1032,16 @@ void Boiler::set_warmwater_onetime(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAFlags, 0, (v ? 0x22 : 0x02), 0x34);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Activate / De-activate circulation of warm water 0x35
|
||||
// true = on, false = off
|
||||
void Boiler::set_warmwater_circulation(const char * value, const int8_t id) {
|
||||
bool Boiler::set_warmwater_circulation(const char * value, const int8_t id) {
|
||||
bool v = false;
|
||||
if (!Helpers::value2bool(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting boiler warm water circulation %s"), v ? "on" : "off");
|
||||
@@ -1023,6 +1050,8 @@ void Boiler::set_warmwater_circulation(const char * value, const int8_t id) {
|
||||
} else {
|
||||
write_command(EMS_TYPE_UBAFlags, 1, (v ? 0x22 : 0x02), 0x34);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// add console commands
|
||||
@@ -1034,7 +1063,7 @@ void Boiler::console_commands(Shell & shell, unsigned int context) {
|
||||
[=](Shell & shell __attribute__((unused)), const std::vector<std::string> & arguments) {
|
||||
uint16_t type_id = Helpers::hextoint(arguments.front().c_str());
|
||||
EMSESP::set_read_id(type_id);
|
||||
EMSESP::send_read_request(type_id, get_device_id());
|
||||
EMSESP::send_read_request(type_id, device_id());
|
||||
});
|
||||
|
||||
EMSESPShell::commands->add_command(ShellContext::BOILER,
|
||||
|
||||
@@ -167,21 +167,21 @@ class Boiler : public EMSdevice {
|
||||
void process_UBADHWStatus(std::shared_ptr<const Telegram> telegram);
|
||||
|
||||
// commands - none of these use the additional id parameter
|
||||
void set_warmwater_mode(const char * value, const int8_t id);
|
||||
void set_warmwater_activated(const char * value, const int8_t id);
|
||||
void set_tapwarmwater_activated(const char * value, const int8_t id);
|
||||
void set_warmwater_onetime(const char * value, const int8_t id);
|
||||
void set_warmwater_circulation(const char * value, const int8_t id);
|
||||
void set_warmwater_temp(const char * value, const int8_t id);
|
||||
void set_flow_temp(const char * value, const int8_t id);
|
||||
void set_heating_activated(const char * value, const int8_t id);
|
||||
void set_heating_temp(const char * value, const int8_t id);
|
||||
void set_min_power(const char * value, const int8_t id);
|
||||
void set_max_power(const char * value, const int8_t id);
|
||||
void set_hyst_on(const char * value, const int8_t id);
|
||||
void set_hyst_off(const char * value, const int8_t id);
|
||||
void set_burn_period(const char * value, const int8_t id);
|
||||
void set_pump_delay(const char * value, const int8_t id);
|
||||
bool set_warmwater_mode(const char * value, const int8_t id);
|
||||
bool set_warmwater_activated(const char * value, const int8_t id);
|
||||
bool set_tapwarmwater_activated(const char * value, const int8_t id);
|
||||
bool set_warmwater_onetime(const char * value, const int8_t id);
|
||||
bool set_warmwater_circulation(const char * value, const int8_t id);
|
||||
bool set_warmwater_temp(const char * value, const int8_t id);
|
||||
bool set_flow_temp(const char * value, const int8_t id);
|
||||
bool set_heating_activated(const char * value, const int8_t id);
|
||||
bool set_heating_temp(const char * value, const int8_t id);
|
||||
bool set_min_power(const char * value, const int8_t id);
|
||||
bool set_max_power(const char * value, const int8_t id);
|
||||
bool set_hyst_on(const char * value, const int8_t id);
|
||||
bool set_hyst_off(const char * value, const int8_t id);
|
||||
bool set_burn_period(const char * value, const int8_t id);
|
||||
bool set_pump_delay(const char * value, const int8_t id);
|
||||
};
|
||||
|
||||
} // namespace emsesp
|
||||
|
||||
@@ -158,7 +158,7 @@ void Mixing::publish_values() {
|
||||
|
||||
char topic[30];
|
||||
strlcpy(topic, "mixing_data", 30);
|
||||
strlcat(topic, Helpers::itoa(s, get_device_id() - 0x20 + 1), 30); // append hc to topic
|
||||
strlcat(topic, Helpers::itoa(s, device_id() - 0x20 + 1), 30); // append hc to topic
|
||||
Mqtt::publish(topic, doc);
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ void Mixing::process_MMPLUSStatusMessage_WWC(std::shared_ptr<const Telegram> tel
|
||||
// A1 00 FF 00 00 0C 02 04 00 01 1D 00 82
|
||||
void Mixing::process_IPMStatusMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
type_ = Type::HC;
|
||||
hc_ = get_device_id() - 0x20 + 1;
|
||||
hc_ = device_id() - 0x20 + 1;
|
||||
uint8_t ismixed = 0;
|
||||
changed_ |= telegram->read_value(ismixed, 0); // check if circuit is active, 0-off, 1-unmixed, 2-mixed
|
||||
if (ismixed == 0) {
|
||||
@@ -213,7 +213,7 @@ void Mixing::process_MMStatusMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
// the heating circuit is determine by which device_id it is, 0x20 - 0x23
|
||||
// 0x21 is position 2. 0x20 is typically reserved for the WM10 switch module
|
||||
// see https://github.com/proddy/EMS-ESP/issues/270 and https://github.com/proddy/EMS-ESP/issues/386#issuecomment-629610918
|
||||
hc_ = get_device_id() - 0x20 + 1;
|
||||
hc_ = device_id() - 0x20 + 1;
|
||||
changed_ |= telegram->read_value(flowTemp_, 1); // is * 10
|
||||
changed_ |= telegram->read_value(pump_, 3);
|
||||
changed_ |= telegram->read_value(flowSetTemp_, 0);
|
||||
@@ -226,7 +226,7 @@ void Mixing::process_MMStatusMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
// Mixing on a MM10 - 0xAA
|
||||
// e.g. Thermostat -> Mixing Module, type 0xAA, telegram: 10 21 AA 00 FF 0C 0A 11 0A 32 xx
|
||||
void Mixing::process_MMConfigMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
hc_ = get_device_id() - 0x20 + 1;
|
||||
hc_ = device_id() - 0x20 + 1;
|
||||
// pos 0: active FF = on
|
||||
// pos 1: valve runtime 0C = 120 sec in units of 10 sec
|
||||
}
|
||||
@@ -234,7 +234,7 @@ void Mixing::process_MMConfigMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
// Mixing on a MM10 - 0xAC
|
||||
// e.g. Thermostat -> Mixing Module, type 0xAC, telegram: 10 21 AC 00 1E 64 01 AB
|
||||
void Mixing::process_MMSetMessage(std::shared_ptr<const Telegram> telegram) {
|
||||
hc_ = get_device_id() - 0x20 + 1;
|
||||
hc_ = device_id() - 0x20 + 1;
|
||||
// pos 0: flowtemp setpoint 1E = 30°C
|
||||
// pos 1: position in %
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ void Thermostat::device_info_web(JsonArray & root) {
|
||||
// context menu "thermostat"
|
||||
void Thermostat::add_context_menu() {
|
||||
// only add it once, to prevent conflicts when there are multiple thermostats
|
||||
if (this->get_device_id() != EMSESP::actual_master_thermostat()) {
|
||||
if (this->device_id() != EMSESP::actual_master_thermostat()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -231,7 +231,6 @@ void Thermostat::add_context_menu() {
|
||||
flash_string_vector{F_(thermostat)},
|
||||
[&](Shell & shell, const std::vector<std::string> & arguments __attribute__((unused))) {
|
||||
Thermostat::console_commands(shell, ShellContext::THERMOSTAT);
|
||||
add_context_commands(ShellContext::THERMOSTAT);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -239,7 +238,7 @@ void Thermostat::add_context_menu() {
|
||||
// we check if any of the thermostat values have changed and then republish if necessary
|
||||
bool Thermostat::updated_values() {
|
||||
// only publish on the master thermostat
|
||||
if (EMSESP::actual_master_thermostat() != this->get_device_id()) {
|
||||
if (EMSESP::actual_master_thermostat() != this->device_id()) {
|
||||
return false;
|
||||
}
|
||||
if (changed_) {
|
||||
@@ -252,7 +251,7 @@ bool Thermostat::updated_values() {
|
||||
// publish values via MQTT
|
||||
void Thermostat::publish_values() {
|
||||
// only publish on the master thermostat
|
||||
if (EMSESP::actual_master_thermostat() != this->get_device_id()) {
|
||||
if (EMSESP::actual_master_thermostat() != this->device_id()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1191,7 +1190,7 @@ void Thermostat::console_commands(Shell & shell, unsigned int context) {
|
||||
[=](Shell & shell __attribute__((unused)), const std::vector<std::string> & arguments) {
|
||||
uint16_t type_id = Helpers::hextoint(arguments.front().c_str());
|
||||
EMSESP::set_read_id(type_id);
|
||||
EMSESP::send_read_request(type_id, this->get_device_id());
|
||||
EMSESP::send_read_request(type_id, this->device_id());
|
||||
});
|
||||
|
||||
EMSESPShell::commands->add_command(ShellContext::THERMOSTAT,
|
||||
@@ -1217,50 +1216,61 @@ void Thermostat::console_commands(Shell & shell, unsigned int context) {
|
||||
}
|
||||
|
||||
// 0xA5 - Set minimum external temperature
|
||||
void Thermostat::set_minexttemp(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_minexttemp(const char * value, const int8_t id) {
|
||||
int mt = 0;
|
||||
if (!Helpers::value2number(value, mt)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting min external temperature to %d"), mt);
|
||||
write_command(EMS_TYPE_IBASettings, 5, mt, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 0xA5 - Clock offset
|
||||
void Thermostat::set_clockoffset(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_clockoffset(const char * value, const int8_t id) {
|
||||
int co = 0;
|
||||
if (!Helpers::value2number(value, co)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting clock offset to %d"), co);
|
||||
write_command(EMS_TYPE_IBASettings, 12, co, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 0xA5 - Calibrate internal temperature
|
||||
void Thermostat::set_calinttemp(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_calinttemp(const char * value, const int8_t id) {
|
||||
int ct = 0;
|
||||
if (!Helpers::value2number(value, ct)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
// does this value need to be multiple by 10?
|
||||
|
||||
LOG_INFO(F("Calibrating internal temperature to %d.%d"), ct / 10, ct < 0 ? -ct % 10 : ct % 10);
|
||||
write_command(EMS_TYPE_IBASettings, 2, ct, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 0xA5 - Set the display settings
|
||||
void Thermostat::set_display(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_display(const char * value, const int8_t id) {
|
||||
int ds = 0;
|
||||
if (!Helpers::value2number(value, ds)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting display to %d"), ds);
|
||||
write_command(EMS_TYPE_IBASettings, 0, ds, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Thermostat::set_remotetemp(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_remotetemp(const char * value, const int8_t id) {
|
||||
float f = 0;
|
||||
if (!Helpers::value2float(value, f)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
@@ -1270,13 +1280,15 @@ void Thermostat::set_remotetemp(const char * value, const int8_t id) {
|
||||
} else {
|
||||
Roomctrl::set_remotetemp(hc_num - 1, (int16_t)(f * 10));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 0xA5 - Set the building settings
|
||||
void Thermostat::set_building(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_building(const char * value, const int8_t id) {
|
||||
std::string bd(20, '\0');
|
||||
if (!Helpers::value2string(value, bd)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t bg = 0;
|
||||
@@ -1287,28 +1299,33 @@ void Thermostat::set_building(const char * value, const int8_t id) {
|
||||
} else if (bd == "heavy") {
|
||||
bg = 2;
|
||||
} else {
|
||||
return; // invalid
|
||||
return false; // invalid
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting building to %d"), bg);
|
||||
write_command(EMS_TYPE_IBASettings, 6, bg, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// 0xA5 Set the language settings
|
||||
void Thermostat::set_language(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_language(const char * value, const int8_t id) {
|
||||
int lg = 0;
|
||||
if (!Helpers::value2number(value, lg)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting language to %d"), lg);
|
||||
write_command(EMS_TYPE_IBASettings, 1, lg, EMS_TYPE_IBASettings);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Set the control-mode for hc 0-off, 1-RC20, 2-RC3x
|
||||
void Thermostat::set_control(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_control(const char * value, const int8_t id) {
|
||||
int ctrl = 0;
|
||||
if (!Helpers::value2number(value, ctrl)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
@@ -1316,23 +1333,25 @@ void Thermostat::set_control(const char * value, const int8_t id) {
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("Set control: Heating Circuit %d not found or activated"), hc_num);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ctrl > 2) {
|
||||
LOG_WARNING(F("Set control: Invalid control mode: %d"), ctrl);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting circuit-control for hc%d to %d"), hc_num, ctrl);
|
||||
write_command(set_typeids[hc->hc_num() - 1], 26, ctrl);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// sets the thermostat ww working mode, where mode is a string
|
||||
void Thermostat::set_wwmode(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_wwmode(const char * value, const int8_t id) {
|
||||
std::string v(10, '\0');
|
||||
if (!Helpers::value2string(value, v)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t set = 0xFF; // some dummy value
|
||||
@@ -1350,21 +1369,24 @@ void Thermostat::set_wwmode(const char * value, const int8_t id) {
|
||||
} else {
|
||||
LOG_WARNING(F("Set thermostat warm water mode: Invalid mode: %s"), v.c_str());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set the holiday as string dd.mm.yyyy-dd.mm.yyyy
|
||||
void Thermostat::set_holiday(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_holiday(const char * value, const int8_t id) {
|
||||
std::string hd(30, '\0');
|
||||
if (!Helpers::value2string(value, hd)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("Set holiday: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->get_device_id());
|
||||
return;
|
||||
LOG_WARNING(F("Set holiday: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->device_id());
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t data[6];
|
||||
data[0] = (hd[0] - '0') * 10 + (hd[1] - '0');
|
||||
data[1] = (hd[3] - '0') * 10 + (hd[4] - '0');
|
||||
@@ -1375,49 +1397,56 @@ void Thermostat::set_holiday(const char * value, const int8_t id) {
|
||||
|
||||
LOG_INFO(F("Setting holiday for hc %d"), hc->hc_num());
|
||||
write_command(timer_typeids[hc->hc_num() - 1], 87, data, 6, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set pause in hours
|
||||
void Thermostat::set_pause(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_pause(const char * value, const int8_t id) {
|
||||
int hrs = 0;
|
||||
if (!Helpers::value2number(value, hrs)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("Set pause: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->get_device_id());
|
||||
return;
|
||||
LOG_WARNING(F("Set pause: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->device_id());
|
||||
return false;
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting pause: %d hours, hc: %d"), hrs, hc->hc_num());
|
||||
write_command(timer_typeids[hc->hc_num() - 1], 85, hrs);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set partymode in hours
|
||||
void Thermostat::set_party(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_party(const char * value, const int8_t id) {
|
||||
int hrs = 0;
|
||||
if (!Helpers::value2number(value, hrs)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("Set party: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->get_device_id());
|
||||
return;
|
||||
LOG_WARNING(F("Set party: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->device_id());
|
||||
return false;
|
||||
}
|
||||
LOG_INFO(F("Setting party: %d hours, hc: %d"), hrs, hc->hc_num());
|
||||
write_command(timer_typeids[hc->hc_num() - 1], 86, hrs);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// set date&time as string hh:mm:ss-dd.mm.yyyy-dw-dst or "NTP" for setting to internet-time
|
||||
// dw - day of week (0..6), dst- summertime (0/1)
|
||||
// id is ignored
|
||||
void Thermostat::set_datetime(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_datetime(const char * value, const int8_t id) {
|
||||
std::string dt(30, '\0');
|
||||
if (!Helpers::value2string(value, dt)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t data[9];
|
||||
@@ -1426,8 +1455,9 @@ void Thermostat::set_datetime(const char * value, const int8_t id) {
|
||||
tm * tm_ = localtime(&now);
|
||||
if (tm_->tm_year < 110) { // no NTP time
|
||||
LOG_WARNING(F("No NTP time. Cannot set RCtime"));
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
data[0] = tm_->tm_year - 100; // Bosch counts from 2000
|
||||
data[1] = tm_->tm_mon;
|
||||
data[2] = tm_->tm_hour;
|
||||
@@ -1449,53 +1479,65 @@ void Thermostat::set_datetime(const char * value, const int8_t id) {
|
||||
data[6] = (dt[20] - '0'); // day of week
|
||||
data[7] = (dt[22] - '0') + 2; // DST and flag
|
||||
}
|
||||
|
||||
LOG_INFO(F("Setting date and time"));
|
||||
write_command(EMS_TYPE_time, 0, data, 8, EMS_TYPE_time);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// sets the thermostat working mode, where mode is a string
|
||||
// converts string mode to HeatingCircuit::Mode
|
||||
void Thermostat::set_mode(const char * value, const int8_t id) {
|
||||
bool Thermostat::set_mode(const char * value, const int8_t id) {
|
||||
std::string mode(10, '\0');
|
||||
if (!Helpers::value2string(value, mode)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
|
||||
if (mode_tostring(HeatingCircuit::Mode::OFF) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::OFF, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::MANUAL) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::MANUAL, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::AUTO) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::AUTO, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::DAY) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::DAY, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::NIGHT) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::NIGHT, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::HEAT) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::HEAT, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::NOFROST) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::NOFROST, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::ECO) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::ECO, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::HOLIDAY) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::HOLIDAY, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::COMFORT) == mode) {
|
||||
set_mode_n(HeatingCircuit::Mode::COMFORT, hc_num);
|
||||
} else {
|
||||
LOG_WARNING(F("Invalid mode %s. Cannot set"), mode.c_str());
|
||||
return set_mode_n(HeatingCircuit::Mode::OFF, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::MANUAL) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::MANUAL, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::AUTO) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::AUTO, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::DAY) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::DAY, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::NIGHT) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::NIGHT, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::HEAT) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::HEAT, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::NOFROST) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::NOFROST, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::ECO) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::ECO, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::HOLIDAY) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::HOLIDAY, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::COMFORT) == mode) {
|
||||
return set_mode_n(HeatingCircuit::Mode::COMFORT, hc_num);
|
||||
}
|
||||
|
||||
LOG_WARNING(F("Invalid mode %s. Cannot set"), mode.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set the thermostat working mode
|
||||
// mode is HeatingCircuit::Mode
|
||||
void Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) {
|
||||
bool Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) {
|
||||
// get hc based on number
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("set mode: Heating Circuit %d not found or activated"), hc_num);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t set_mode_value, offset;
|
||||
@@ -1578,47 +1620,61 @@ void Thermostat::set_mode_n(const uint8_t mode, const uint8_t hc_num) {
|
||||
// add the write command to the Tx queue
|
||||
// post validate is the corresponding monitor or set type IDs as they can differ per model
|
||||
write_command(set_typeids[hc->hc_num() - 1], offset, set_mode_value, validate_typeid);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// sets the thermostat temp, where mode is a string
|
||||
void Thermostat::set_temperature(const float temperature, const std::string & mode, const uint8_t hc_num) {
|
||||
bool Thermostat::set_temperature(const float temperature, const std::string & mode, const uint8_t hc_num) {
|
||||
if (mode_tostring(HeatingCircuit::Mode::MANUAL) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::MANUAL, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::AUTO) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::AUTO, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::DAY) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::DAY, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::NIGHT) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::NIGHT, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::COMFORT) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::COMFORT, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::HEAT) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::HEAT, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::ECO) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::ECO, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::NOFROST) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::NOFROST, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::SUMMER) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::SUMMER, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::HOLIDAY) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::HOLIDAY, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::OFFSET) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::OFFSET, hc_num);
|
||||
} else if (mode_tostring(HeatingCircuit::Mode::DESIGN) == mode) {
|
||||
set_temperature(temperature, HeatingCircuit::Mode::DESIGN, hc_num);
|
||||
} else {
|
||||
LOG_WARNING(F("Invalid mode %s."), mode.c_str());
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::MANUAL, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::AUTO) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::AUTO, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::DAY) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::DAY, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::NIGHT) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::NIGHT, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::COMFORT) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::COMFORT, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::HEAT) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::HEAT, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::ECO) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::ECO, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::NOFROST) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::NOFROST, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::SUMMER) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::SUMMER, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::HOLIDAY) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::HOLIDAY, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::OFFSET) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::OFFSET, hc_num);
|
||||
}
|
||||
if (mode_tostring(HeatingCircuit::Mode::DESIGN) == mode) {
|
||||
return set_temperature(temperature, HeatingCircuit::Mode::DESIGN, hc_num);
|
||||
}
|
||||
|
||||
LOG_WARNING(F("Invalid mode %s."), mode.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set the temperature of the thermostat
|
||||
// the id passed into this function is the heating circuit number
|
||||
void Thermostat::set_temperature(const float temperature, const uint8_t mode, const uint8_t hc_num) {
|
||||
bool Thermostat::set_temperature(const float temperature, const uint8_t mode, const uint8_t hc_num) {
|
||||
// get hc based on number
|
||||
std::shared_ptr<Thermostat::HeatingCircuit> hc = heating_circuit(hc_num);
|
||||
if (hc == nullptr) {
|
||||
LOG_WARNING(F("Set temperature: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->get_device_id());
|
||||
return;
|
||||
LOG_WARNING(F("Set temperature: Heating Circuit %d not found or activated for device ID 0x%02X"), hc_num, this->device_id());
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t model = this->model();
|
||||
@@ -1790,75 +1846,80 @@ void Thermostat::set_temperature(const float temperature, const uint8_t mode, co
|
||||
// add the write command to the Tx queue. value is *2
|
||||
// post validate is the corresponding monitor or set type IDs as they can differ per model
|
||||
write_command(set_typeids[hc->hc_num() - 1], offset, (uint8_t)((float)temperature * (float)factor), validate_typeid);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// for HA specifically when receiving over MQTT
|
||||
void Thermostat::thermostat_cmd_temp(const char * message) {
|
||||
bool Thermostat::thermostat_cmd_temp(const char * message) {
|
||||
float f = strtof((char *)message, 0);
|
||||
set_temperature(f, HeatingCircuit::Mode::AUTO, AUTO_HEATING_CIRCUIT);
|
||||
return set_temperature(f, HeatingCircuit::Mode::AUTO, AUTO_HEATING_CIRCUIT);
|
||||
}
|
||||
|
||||
// for HA specifically when receiving over MQTT
|
||||
// message payload holds the text name of the mode e.g. "auto"
|
||||
void Thermostat::thermostat_cmd_mode(const char * message) {
|
||||
set_mode(message, AUTO_HEATING_CIRCUIT);
|
||||
bool Thermostat::thermostat_cmd_mode(const char * message) {
|
||||
return set_mode(message, AUTO_HEATING_CIRCUIT);
|
||||
}
|
||||
|
||||
void Thermostat::set_temperature_value(const char * value, const int8_t id, const uint8_t mode) {
|
||||
bool Thermostat::set_temperature_value(const char * value, const int8_t id, const uint8_t mode) {
|
||||
float f = 0;
|
||||
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
|
||||
if (Helpers::value2float(value, f)) {
|
||||
set_temperature(f, mode, hc_num);
|
||||
return set_temperature(f, mode, hc_num);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void Thermostat::set_temp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::AUTO);
|
||||
bool Thermostat::set_temp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::AUTO);
|
||||
}
|
||||
|
||||
void Thermostat::set_nighttemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::NIGHT);
|
||||
bool Thermostat::set_nighttemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::NIGHT);
|
||||
}
|
||||
|
||||
void Thermostat::set_daytemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::DAY);
|
||||
bool Thermostat::set_daytemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::DAY);
|
||||
}
|
||||
|
||||
void Thermostat::set_comforttemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::COMFORT);
|
||||
bool Thermostat::set_comforttemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::COMFORT);
|
||||
}
|
||||
|
||||
void Thermostat::set_nofrosttemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::NOFROST);
|
||||
bool Thermostat::set_nofrosttemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::NOFROST);
|
||||
}
|
||||
|
||||
void Thermostat::set_ecotemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::ECO);
|
||||
bool Thermostat::set_ecotemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::ECO);
|
||||
}
|
||||
|
||||
void Thermostat::set_heattemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::HEAT);
|
||||
bool Thermostat::set_heattemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::HEAT);
|
||||
}
|
||||
|
||||
void Thermostat::set_summertemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::SUMMER);
|
||||
bool Thermostat::set_summertemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::SUMMER);
|
||||
}
|
||||
|
||||
void Thermostat::set_designtemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::DESIGN);
|
||||
bool Thermostat::set_designtemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::DESIGN);
|
||||
}
|
||||
|
||||
void Thermostat::set_offsettemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::OFFSET);
|
||||
bool Thermostat::set_offsettemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::OFFSET);
|
||||
}
|
||||
|
||||
void Thermostat::set_holidaytemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::HOLIDAY);
|
||||
bool Thermostat::set_holidaytemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::HOLIDAY);
|
||||
}
|
||||
|
||||
void Thermostat::set_manualtemp(const char * value, const int8_t id) {
|
||||
set_temperature_value(value, id, HeatingCircuit::Mode::MANUAL);
|
||||
bool Thermostat::set_manualtemp(const char * value, const int8_t id) {
|
||||
return set_temperature_value(value, id, HeatingCircuit::Mode::MANUAL);
|
||||
}
|
||||
|
||||
// commands for MQTT and Console
|
||||
@@ -1869,48 +1930,48 @@ void Thermostat::add_commands() {
|
||||
}
|
||||
|
||||
// common to all thermostats
|
||||
register_mqtt_cmd(F("wwmode"), [&](const char * value, const int8_t id) { set_wwmode(value, id); });
|
||||
register_mqtt_cmd(F("temp"), [&](const char * value, const int8_t id) { set_temp(value, id); });
|
||||
register_mqtt_cmd(F("mode"), [&](const char * value, const int8_t id) { set_mode(value, id); });
|
||||
register_mqtt_cmd(F("wwmode"), [&](const char * value, const int8_t id) { return set_wwmode(value, id); });
|
||||
register_mqtt_cmd(F("temp"), [&](const char * value, const int8_t id) { return set_temp(value, id); });
|
||||
register_mqtt_cmd(F("mode"), [&](const char * value, const int8_t id) { return set_mode(value, id); });
|
||||
|
||||
uint8_t model = this->model();
|
||||
switch (model) {
|
||||
case EMS_DEVICE_FLAG_RC100:
|
||||
case EMS_DEVICE_FLAG_RC300:
|
||||
register_mqtt_cmd(F("manualtemp"), [&](const char * value, const int8_t id) { set_manualtemp(value, id); });
|
||||
register_mqtt_cmd(F("ecotemp"), [&](const char * value, const int8_t id) { set_ecotemp(value, id); });
|
||||
register_mqtt_cmd(F("comforttemp"), [&](const char * value, const int8_t id) { set_comforttemp(value, id); });
|
||||
register_mqtt_cmd(F("manualtemp"), [&](const char * value, const int8_t id) { return set_manualtemp(value, id); });
|
||||
register_mqtt_cmd(F("ecotemp"), [&](const char * value, const int8_t id) { return set_ecotemp(value, id); });
|
||||
register_mqtt_cmd(F("comforttemp"), [&](const char * value, const int8_t id) { return set_comforttemp(value, id); });
|
||||
break;
|
||||
case EMS_DEVICE_FLAG_RC20_2:
|
||||
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { set_nighttemp(value, id); });
|
||||
register_mqtt_cmd(F("daytemp"), [&](const char * value, const int8_t id) { set_daytemp(value, id); });
|
||||
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { return set_nighttemp(value, id); });
|
||||
register_mqtt_cmd(F("daytemp"), [&](const char * value, const int8_t id) { return set_daytemp(value, id); });
|
||||
break;
|
||||
case EMS_DEVICE_FLAG_RC30_1: // only RC30_1
|
||||
register_mqtt_cmd(F("clockoffset"), [&](const char * value, const int8_t id) { set_clockoffset(value, id); });
|
||||
register_mqtt_cmd(F("language"), [&](const char * value, const int8_t id) { set_language(value, id); });
|
||||
register_mqtt_cmd(F("display"), [&](const char * value, const int8_t id) { set_display(value, id); });
|
||||
register_mqtt_cmd(F("clockoffset"), [&](const char * value, const int8_t id) { return set_clockoffset(value, id); });
|
||||
register_mqtt_cmd(F("language"), [&](const char * value, const int8_t id) { return set_language(value, id); });
|
||||
register_mqtt_cmd(F("display"), [&](const char * value, const int8_t id) { return set_display(value, id); });
|
||||
case EMS_DEVICE_FLAG_RC35: // RC30 and RC35
|
||||
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { set_nighttemp(value, id); });
|
||||
register_mqtt_cmd(F("daytemp"), [&](const char * value, const int8_t id) { set_daytemp(value, id); });
|
||||
register_mqtt_cmd(F("nofrosttemp"), [&](const char * value, const int8_t id) { set_nofrosttemp(value, id); });
|
||||
register_mqtt_cmd(F("remotetemp"), [&](const char * value, const int8_t id) { set_remotetemp(value, id); });
|
||||
register_mqtt_cmd(F("datetime"), [&](const char * value, const int8_t id) { set_datetime(value, id); });
|
||||
register_mqtt_cmd(F("minexttemp"), [&](const char * value, const int8_t id) { set_minexttemp(value, id); });
|
||||
register_mqtt_cmd(F("calinttemp"), [&](const char * value, const int8_t id) { set_calinttemp(value, id); });
|
||||
register_mqtt_cmd(F("building"), [&](const char * value, const int8_t id) { set_building(value, id); });
|
||||
register_mqtt_cmd(F("control"), [&](const char * value, const int8_t id) { set_control(value, id); });
|
||||
register_mqtt_cmd(F("pause"), [&](const char * value, const int8_t id) { set_pause(value, id); });
|
||||
register_mqtt_cmd(F("party"), [&](const char * value, const int8_t id) { set_party(value, id); });
|
||||
register_mqtt_cmd(F("holiday"), [&](const char * value, const int8_t id) { set_holiday(value, id); });
|
||||
register_mqtt_cmd(F("summertemp"), [&](const char * value, const int8_t id) { set_summertemp(value, id); });
|
||||
register_mqtt_cmd(F("designtemp"), [&](const char * value, const int8_t id) { set_designtemp(value, id); });
|
||||
register_mqtt_cmd(F("offsettemp"), [&](const char * value, const int8_t id) { set_offsettemp(value, id); });
|
||||
register_mqtt_cmd(F("holidaytemp"), [&](const char * value, const int8_t id) { set_holidaytemp(value, id); });
|
||||
register_mqtt_cmd(F("nighttemp"), [&](const char * value, const int8_t id) { return set_nighttemp(value, id); });
|
||||
register_mqtt_cmd(F("daytemp"), [&](const char * value, const int8_t id) { return set_daytemp(value, id); });
|
||||
register_mqtt_cmd(F("nofrosttemp"), [&](const char * value, const int8_t id) { return set_nofrosttemp(value, id); });
|
||||
register_mqtt_cmd(F("remotetemp"), [&](const char * value, const int8_t id) { return set_remotetemp(value, id); });
|
||||
register_mqtt_cmd(F("datetime"), [&](const char * value, const int8_t id) { return set_datetime(value, id); });
|
||||
register_mqtt_cmd(F("minexttemp"), [&](const char * value, const int8_t id) { return set_minexttemp(value, id); });
|
||||
register_mqtt_cmd(F("calinttemp"), [&](const char * value, const int8_t id) { return set_calinttemp(value, id); });
|
||||
register_mqtt_cmd(F("building"), [&](const char * value, const int8_t id) { return set_building(value, id); });
|
||||
register_mqtt_cmd(F("control"), [&](const char * value, const int8_t id) { return set_control(value, id); });
|
||||
register_mqtt_cmd(F("pause"), [&](const char * value, const int8_t id) { return set_pause(value, id); });
|
||||
register_mqtt_cmd(F("party"), [&](const char * value, const int8_t id) { return set_party(value, id); });
|
||||
register_mqtt_cmd(F("holiday"), [&](const char * value, const int8_t id) { return set_holiday(value, id); });
|
||||
register_mqtt_cmd(F("summertemp"), [&](const char * value, const int8_t id) { return set_summertemp(value, id); });
|
||||
register_mqtt_cmd(F("designtemp"), [&](const char * value, const int8_t id) { return set_designtemp(value, id); });
|
||||
register_mqtt_cmd(F("offsettemp"), [&](const char * value, const int8_t id) { return set_offsettemp(value, id); });
|
||||
register_mqtt_cmd(F("holidaytemp"), [&](const char * value, const int8_t id) { return set_holidaytemp(value, id); });
|
||||
break;
|
||||
case EMS_DEVICE_FLAG_JUNKERS:
|
||||
register_mqtt_cmd(F("nofrosttemp"), [&](const char * value, const int8_t id) { set_nofrosttemp(value, id); });
|
||||
register_mqtt_cmd(F("ecotemp"), [&](const char * value, const int8_t id) { set_ecotemp(value, id); });
|
||||
register_mqtt_cmd(F("heattemp"), [&](const char * value, const int8_t id) { set_heattemp(value, id); });
|
||||
register_mqtt_cmd(F("nofrosttemp"), [&](const char * value, const int8_t id) { return set_nofrosttemp(value, id); });
|
||||
register_mqtt_cmd(F("ecotemp"), [&](const char * value, const int8_t id) { return set_ecotemp(value, id); });
|
||||
register_mqtt_cmd(F("heattemp"), [&](const char * value, const int8_t id) { return set_heattemp(value, id); });
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -246,48 +246,47 @@ class Thermostat : public EMSdevice {
|
||||
void process_RC300WWmode(std::shared_ptr<const Telegram> telegram);
|
||||
|
||||
// internal helper functions
|
||||
void set_mode_n(const uint8_t mode, const uint8_t hc_num);
|
||||
bool set_mode_n(const uint8_t mode, const uint8_t hc_num);
|
||||
|
||||
void set_temperature_value(const char * value, const int8_t id, const uint8_t mode);
|
||||
void set_temperature(const float temperature, const std::string & mode, const uint8_t hc_num);
|
||||
void set_temperature(const float temperature, const uint8_t mode, const uint8_t hc_num);
|
||||
bool set_temperature_value(const char * value, const int8_t id, const uint8_t mode);
|
||||
bool set_temperature(const float temperature, const std::string & mode, const uint8_t hc_num);
|
||||
bool set_temperature(const float temperature, const uint8_t mode, const uint8_t hc_num);
|
||||
|
||||
// for HA specifically. MQTT functions.
|
||||
void thermostat_cmd_temp(const char * message);
|
||||
void thermostat_cmd_mode(const char * message);
|
||||
bool thermostat_cmd_temp(const char * message);
|
||||
bool thermostat_cmd_mode(const char * message);
|
||||
|
||||
// set functions - these use the id/hc
|
||||
void set_mode(const char * value, const int8_t id);
|
||||
void set_control(const char * value, const int8_t id);
|
||||
void set_holiday(const char * value, const int8_t id);
|
||||
void set_pause(const char * value, const int8_t id);
|
||||
void set_party(const char * value, const int8_t id);
|
||||
bool set_mode(const char * value, const int8_t id);
|
||||
bool set_control(const char * value, const int8_t id);
|
||||
bool set_holiday(const char * value, const int8_t id);
|
||||
bool set_pause(const char * value, const int8_t id);
|
||||
bool set_party(const char * value, const int8_t id);
|
||||
|
||||
void set_temp(const char * value, const int8_t id);
|
||||
void set_nighttemp(const char * value, const int8_t id);
|
||||
void set_daytemp(const char * value, const int8_t id);
|
||||
void set_comforttemp(const char * value, const int8_t id);
|
||||
void set_nofrosttemp(const char * value, const int8_t id);
|
||||
void set_ecotemp(const char * value, const int8_t id);
|
||||
void set_heattemp(const char * value, const int8_t id);
|
||||
void set_summertemp(const char * value, const int8_t id);
|
||||
void set_designtemp(const char * value, const int8_t id);
|
||||
void set_offsettemp(const char * value, const int8_t id);
|
||||
void set_holidaytemp(const char * value, const int8_t id);
|
||||
void set_manualtemp(const char * value, const int8_t id);
|
||||
|
||||
void set_remotetemp(const char * value, const int8_t id);
|
||||
bool set_temp(const char * value, const int8_t id);
|
||||
bool set_nighttemp(const char * value, const int8_t id);
|
||||
bool set_daytemp(const char * value, const int8_t id);
|
||||
bool set_comforttemp(const char * value, const int8_t id);
|
||||
bool set_nofrosttemp(const char * value, const int8_t id);
|
||||
bool set_ecotemp(const char * value, const int8_t id);
|
||||
bool set_heattemp(const char * value, const int8_t id);
|
||||
bool set_summertemp(const char * value, const int8_t id);
|
||||
bool set_designtemp(const char * value, const int8_t id);
|
||||
bool set_offsettemp(const char * value, const int8_t id);
|
||||
bool set_holidaytemp(const char * value, const int8_t id);
|
||||
bool set_manualtemp(const char * value, const int8_t id);
|
||||
bool set_remotetemp(const char * value, const int8_t id);
|
||||
|
||||
// set functions - these don't use the id/hc, the parameters are ignored
|
||||
void set_wwmode(const char * value, const int8_t id);
|
||||
void set_datetime(const char * value, const int8_t id);
|
||||
void set_minexttemp(const char * value, const int8_t id);
|
||||
void set_clockoffset(const char * value, const int8_t id);
|
||||
void set_calinttemp(const char * value, const int8_t id);
|
||||
void set_display(const char * value, const int8_t id);
|
||||
void set_building(const char * value, const int8_t id);
|
||||
void set_language(const char * value, const int8_t id);
|
||||
}; // namespace emsesp
|
||||
bool set_wwmode(const char * value, const int8_t id);
|
||||
bool set_datetime(const char * value, const int8_t id);
|
||||
bool set_minexttemp(const char * value, const int8_t id);
|
||||
bool set_clockoffset(const char * value, const int8_t id);
|
||||
bool set_calinttemp(const char * value, const int8_t id);
|
||||
bool set_display(const char * value, const int8_t id);
|
||||
bool set_building(const char * value, const int8_t id);
|
||||
bool set_language(const char * value, const int8_t id);
|
||||
};
|
||||
|
||||
} // namespace emsesp
|
||||
|
||||
|
||||
Reference in New Issue
Block a user