add mqtt subscribe settings, thermostat switchtime, boiler heatingsources

This commit is contained in:
MichaelDvP
2021-03-22 17:12:09 +01:00
parent 71dfc0e1eb
commit 03e43ba839
14 changed files with 249 additions and 83 deletions

View File

@@ -1394,6 +1394,7 @@ bool Thermostat::set_datetime(const char * value, const int8_t id) {
data[5] = (dt[6] - '0') * 10 + (dt[7] - '0'); // sec
data[6] = (dt[20] - '0'); // day of week
data[7] = (dt[22] - '0') + 2; // DST and flag
LOG_INFO(F("Date and time: %02d.%02d.2%03d-%02d:%02d:%02d"),data[3], data[1], data[0], data[2], data[4], data[5]);
}
LOG_INFO(F("Setting date and time"));
@@ -1608,6 +1609,49 @@ bool Thermostat::set_controlmode(const char * value, const int8_t id) {
return false;
}
// sets a single switchtime in the thermostat program for RC35
// format "01:0,1,15:30" Number, day, on, time
bool Thermostat::set_switchtime(const char * value, const int8_t id) {
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("Setting switchtime: Heating Circuit %d not found or activated"), hc_num);
return false;
}
if (strlen(value) != 12) {
LOG_WARNING(F("Setting switchtime: Invalid data"));
return false;
}
uint8_t no = (value[0] - '0') * 10 + (value[1] - '0');
uint8_t day = value[3] - '0';
uint8_t on = value[5] - '0';
uint8_t time = 6 * ((value[7] - '0') * 10 + (value[8] - '0')) + (value[10] - '0');
uint8_t data[2] = {0xE7, 0x90}; // unset switchtime
if (day != 7 && on != 7) {
data[0] = (day << 5) + on;
data[1] = time;
}
if (no > 41 || day > 7 || (on > 1 && on != 7) || time > 0x90) {
LOG_WARNING(F("Setting switchtime: Invalid data"));
return false;
}
if ((model() == EMS_DEVICE_FLAG_RC35 || model() == EMS_DEVICE_FLAG_RC30_1)) {
write_command(timer_typeids[hc->hc_num() - 1], no * 2, (uint8_t *)&data, 2, timer_typeids[hc->hc_num() - 1]);
} else {
LOG_WARNING(F("Setting switchtime: thermostat not supported"));
return false;
}
if (data[0] == 0xE7) {
LOG_INFO(F("Setting switchtime no %d for heating circuit %d undefined"), no, hc->hc_num());
} else {
LOG_INFO(F("Setting switchtime no %d for heating circuit %d to day %d, %s, %02d:%d0"), no, hc->hc_num(), day, (on == 1) ? "on" : "off", time / 6, time % 6);
}
return true;
}
// sets the thermostat program for RC35 and RC20
bool Thermostat::set_program(const char * value, const int8_t id) {
uint8_t hc_num = (id == -1) ? AUTO_HEATING_CIRCUIT : id;
@@ -1986,33 +2030,33 @@ void Thermostat::add_commands() {
}
// common to all thermostats
register_mqtt_cmd(F("temp"), MAKE_CF_CB(set_temp));
register_mqtt_cmd(F("mode"), MAKE_CF_CB(set_mode));
register_mqtt_cmd(F("temp"), MAKE_CF_CB(set_temp), FLAG_HC);
register_mqtt_cmd(F("mode"), MAKE_CF_CB(set_mode), FLAG_HC);
register_mqtt_cmd(F("datetime"), MAKE_CF_CB(set_datetime));
switch (model()) {
case EMS_DEVICE_FLAG_RC100:
case EMS_DEVICE_FLAG_RC300:
register_mqtt_cmd(F("manualtemp"), MAKE_CF_CB(set_manualtemp));
register_mqtt_cmd(F("ecotemp"), MAKE_CF_CB(set_ecotemp));
register_mqtt_cmd(F("comforttemp"), MAKE_CF_CB(set_comforttemp));
register_mqtt_cmd(F("summermode"), MAKE_CF_CB(set_summermode));
register_mqtt_cmd(F("summertemp"), MAKE_CF_CB(set_summertemp));
register_mqtt_cmd(F("manualtemp"), MAKE_CF_CB(set_manualtemp), FLAG_HC);
register_mqtt_cmd(F("ecotemp"), MAKE_CF_CB(set_ecotemp), FLAG_HC);
register_mqtt_cmd(F("comforttemp"), MAKE_CF_CB(set_comforttemp), FLAG_HC);
register_mqtt_cmd(F("summermode"), MAKE_CF_CB(set_summermode), FLAG_HC);
register_mqtt_cmd(F("summertemp"), MAKE_CF_CB(set_summertemp), FLAG_HC);
register_mqtt_cmd(F("wwmode"), MAKE_CF_CB(set_wwmode));
register_mqtt_cmd(F("wwsettemp"), MAKE_CF_CB(set_wwtemp));
register_mqtt_cmd(F("wwsettemplow"), MAKE_CF_CB(set_wwtemplow));
register_mqtt_cmd(F("wwonetime"), MAKE_CF_CB(set_wwonetime));
register_mqtt_cmd(F("wwcircmode"), MAKE_CF_CB(set_wwcircmode));
register_mqtt_cmd(F("building"), MAKE_CF_CB(set_building));
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp));
register_mqtt_cmd(F("designtemp"), MAKE_CF_CB(set_designtemp));
register_mqtt_cmd(F("offsettemp"), MAKE_CF_CB(set_offsettemp));
register_mqtt_cmd(F("minflowtemp"), MAKE_CF_CB(set_minflowtemp));
register_mqtt_cmd(F("maxflowtemp"), MAKE_CF_CB(set_maxflowtemp));
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp), FLAG_HC);
register_mqtt_cmd(F("designtemp"), MAKE_CF_CB(set_designtemp), FLAG_HC);
register_mqtt_cmd(F("offsettemp"), MAKE_CF_CB(set_offsettemp), FLAG_HC);
register_mqtt_cmd(F("minflowtemp"), MAKE_CF_CB(set_minflowtemp), FLAG_HC);
register_mqtt_cmd(F("maxflowtemp"), MAKE_CF_CB(set_maxflowtemp), FLAG_HC);
register_mqtt_cmd(F("minexttemp"), MAKE_CF_CB(set_minexttemp));
register_mqtt_cmd(F("roominfluence"), MAKE_CF_CB(set_roominfluence));
register_mqtt_cmd(F("program"), MAKE_CF_CB(set_program));
register_mqtt_cmd(F("controlmode"), MAKE_CF_CB(set_controlmode));
register_mqtt_cmd(F("roominfluence"), MAKE_CF_CB(set_roominfluence), FLAG_HC);
register_mqtt_cmd(F("program"), MAKE_CF_CB(set_program), FLAG_HC);
register_mqtt_cmd(F("controlmode"), MAKE_CF_CB(set_controlmode), FLAG_HC);
break;
case EMS_DEVICE_FLAG_RC20_2:
register_mqtt_cmd(F("nighttemp"), MAKE_CF_CB(set_nighttemp));
@@ -2025,35 +2069,36 @@ void Thermostat::add_commands() {
register_mqtt_cmd(F("display"), MAKE_CF_CB(set_display));
break;
case EMS_DEVICE_FLAG_RC35: // RC30 and RC35
register_mqtt_cmd(F("nighttemp"), MAKE_CF_CB(set_nighttemp));
register_mqtt_cmd(F("daytemp"), MAKE_CF_CB(set_daytemp));
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp));
register_mqtt_cmd(F("remotetemp"), MAKE_CF_CB(set_remotetemp));
register_mqtt_cmd(F("nighttemp"), MAKE_CF_CB(set_nighttemp), FLAG_HC);
register_mqtt_cmd(F("daytemp"), MAKE_CF_CB(set_daytemp), FLAG_HC);
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp), FLAG_HC);
register_mqtt_cmd(F("remotetemp"), MAKE_CF_CB(set_remotetemp), FLAG_HC);
register_mqtt_cmd(F("minexttemp"), MAKE_CF_CB(set_minexttemp));
register_mqtt_cmd(F("calinttemp"), MAKE_CF_CB(set_calinttemp));
register_mqtt_cmd(F("building"), MAKE_CF_CB(set_building));
register_mqtt_cmd(F("control"), MAKE_CF_CB(set_control));
register_mqtt_cmd(F("pause"), MAKE_CF_CB(set_pause));
register_mqtt_cmd(F("party"), MAKE_CF_CB(set_party));
register_mqtt_cmd(F("holiday"), MAKE_CF_CB(set_holiday));
register_mqtt_cmd(F("summertemp"), MAKE_CF_CB(set_summertemp));
register_mqtt_cmd(F("designtemp"), MAKE_CF_CB(set_designtemp));
register_mqtt_cmd(F("offsettemp"), MAKE_CF_CB(set_offsettemp));
register_mqtt_cmd(F("holidaytemp"), MAKE_CF_CB(set_holidaytemp));
register_mqtt_cmd(F("control"), MAKE_CF_CB(set_control), FLAG_HC);
register_mqtt_cmd(F("pause"), MAKE_CF_CB(set_pause), FLAG_HC);
register_mqtt_cmd(F("party"), MAKE_CF_CB(set_party), FLAG_HC);
register_mqtt_cmd(F("holiday"), MAKE_CF_CB(set_holiday), FLAG_HC);
register_mqtt_cmd(F("summertemp"), MAKE_CF_CB(set_summertemp), FLAG_HC);
register_mqtt_cmd(F("designtemp"), MAKE_CF_CB(set_designtemp), FLAG_HC);
register_mqtt_cmd(F("offsettemp"), MAKE_CF_CB(set_offsettemp), FLAG_HC);
register_mqtt_cmd(F("holidaytemp"), MAKE_CF_CB(set_holidaytemp), FLAG_HC);
register_mqtt_cmd(F("wwmode"), MAKE_CF_CB(set_wwmode));
register_mqtt_cmd(F("wwcircmode"), MAKE_CF_CB(set_wwcircmode));
register_mqtt_cmd(F("roominfluence"), MAKE_CF_CB(set_roominfluence));
register_mqtt_cmd(F("flowtempoffset"), MAKE_CF_CB(set_flowtempoffset));
register_mqtt_cmd(F("minflowtemp"), MAKE_CF_CB(set_minflowtemp));
register_mqtt_cmd(F("maxflowtemp"), MAKE_CF_CB(set_maxflowtemp));
register_mqtt_cmd(F("reducemode"), MAKE_CF_CB(set_reducemode));
register_mqtt_cmd(F("program"), MAKE_CF_CB(set_program));
register_mqtt_cmd(F("controlmode"), MAKE_CF_CB(set_controlmode));
register_mqtt_cmd(F("roominfluence"), MAKE_CF_CB(set_roominfluence), FLAG_HC);
register_mqtt_cmd(F("flowtempoffset"), MAKE_CF_CB(set_flowtempoffset), FLAG_HC);
register_mqtt_cmd(F("minflowtemp"), MAKE_CF_CB(set_minflowtemp), FLAG_HC);
register_mqtt_cmd(F("maxflowtemp"), MAKE_CF_CB(set_maxflowtemp), FLAG_HC);
register_mqtt_cmd(F("reducemode"), MAKE_CF_CB(set_reducemode), FLAG_HC);
register_mqtt_cmd(F("program"), MAKE_CF_CB(set_program), FLAG_HC);
register_mqtt_cmd(F("switchtime"), MAKE_CF_CB(set_switchtime), FLAG_HC);
register_mqtt_cmd(F("controlmode"), MAKE_CF_CB(set_controlmode), FLAG_HC);
break;
case EMS_DEVICE_FLAG_JUNKERS:
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp));
register_mqtt_cmd(F("ecotemp"), MAKE_CF_CB(set_ecotemp));
register_mqtt_cmd(F("heattemp"), MAKE_CF_CB(set_heattemp));
register_mqtt_cmd(F("nofrosttemp"), MAKE_CF_CB(set_nofrosttemp), FLAG_HC);
register_mqtt_cmd(F("ecotemp"), MAKE_CF_CB(set_ecotemp), FLAG_HC);
register_mqtt_cmd(F("heattemp"), MAKE_CF_CB(set_heattemp), FLAG_HC);
break;
default:
break;