52class HvacBase :
public ChannelElement,
public ActionHandler {
69 bool local =
false)
override;
71 bool altSchedule =
false,
72 bool local =
false)
override;
77 void handleAction(
int event,
int action)
override;
79 void setTargetMode(
int mode,
bool keepSchedule =
false);
80 void clearTemperatureSetpointHeat();
81 void clearTemperatureSetpointCool();
82 void setTemperatureSetpointHeat(
int tHeat);
83 void setTemperatureSetpointCool(
int tCool);
84 int getTemperatureSetpointHeat();
85 int getTemperatureSetpointCool();
87 int getDefaultManualMode();
88 bool isWeeklyScheduleEnabled();
89 bool isCountdownEnabled();
90 bool isThermostatDisabled();
91 bool isManualModeEnabled();
94 void saveWeeklySchedule();
97 void setHeatingAndCoolingSupported(
bool supported);
98 void setHeatCoolSupported(
bool supported);
99 void setFanSupported(
bool supported);
100 void setDrySupported(
bool supported);
102 void addAvailableAlgorithm(
unsigned _supla_int16_t algorithm);
103 void removeAvailableAlgorithm(
unsigned _supla_int16_t algorithm);
104 bool isOutputControlledInternally()
const;
106 bool setUsedAlgorithm(
unsigned _supla_int16_t newAlgorithm);
107 unsigned _supla_int16_t getUsedAlgorithm()
const;
108 void setButtonTemperatureStep(int16_t step);
115 void addLocalUILockCapability(
enum LocalUILock capability);
116 void removeLocalUILockCapability(
enum LocalUILock capability);
118 enum LocalUILock getLocalUILockCapabilityAsEnum(uint8_t capability)
const;
119 void setLocalUILockCapabilities(uint8_t capabilities);
120 uint8_t getLocalUILockCapabilities()
const;
121 bool isLocalUILockCapabilitySupported(
enum LocalUILock capability)
const;
123 bool setLocalUILock(
enum LocalUILock lock);
124 enum LocalUILock getLocalUILock()
const;
126 void setLocalUILockTemperatureMin(int16_t min);
129 int16_t getLocalUILockTemperatureMin()
const;
131 void setLocalUILockTemperatureMax(int16_t max);
134 int16_t getLocalUILockTemperatureMax()
const;
138 void setSubfunction(uint8_t subfunction);
139 void setDefaultSubfunction(uint8_t subfunction);
142 bool setMainThermometerChannelNo(uint8_t channelNo);
143 uint8_t getMainThermometerChannelNo()
const;
146 bool setAuxThermometerChannelNo(uint8_t channelNo);
147 uint8_t getAuxThermometerChannelNo()
const;
149 void setAuxThermometerType(uint8_t type);
150 uint8_t getAuxThermometerType()
const;
152 bool setPumpSwitchChannelNo(uint8_t channelNo);
153 void clearPumpSwitchChannelNo();
154 uint8_t getPumpSwitchChannelNo()
const;
155 bool isPumpSwitchSet()
const;
156 bool setHeatOrColdSourceSwitchChannelNo(uint8_t channelNo);
157 void clearHeatOrColdSourceSwitchChannelNo();
158 uint8_t getHeatOrColdSourceSwitchChannelNo()
const;
159 bool isHeatOrColdSourceSwitchSet()
const;
160 bool setMasterThermostatChannelNo(uint8_t channelNo);
161 void clearMasterThermostatChannelNo();
162 uint8_t getMasterThermostatChannelNo()
const;
163 bool isMasterThermostatSet()
const;
166 void setAntiFreezeAndHeatProtectionEnabled(
bool enebled);
167 bool isAntiFreezeAndHeatProtectionEnabled()
const;
168 void setAuxMinMaxSetpointEnabled(
bool enabled);
169 bool isAuxMinMaxSetpointEnabled()
const;
171 void setTemperatureSetpointChangeSwitchesToManualMode(
bool enabled);
172 bool isTemperatureSetpointChangeSwitchesToManualMode()
const;
175 void setUseSeparateHeatCoolOutputs(
bool enabled);
176 bool isUseSeparateHeatCoolOutputs()
const;
179 bool setMinOnTimeS(uint16_t seconds);
180 uint16_t getMinOnTimeS()
const;
181 bool isMinOnOffTimeValid(uint16_t seconds)
const;
184 bool setMinOffTimeS(uint16_t seconds);
185 uint16_t getMinOffTimeS()
const;
188 bool setOutputValueOnError(
signed char value);
189 signed char getOutputValueOnError()
const;
191 void setDefaultTemperatureRoomMin(int32_t channelFunction,
192 _supla_int16_t temperature);
193 void setDefaultTemperatureRoomMax(int32_t channelFunction,
194 _supla_int16_t temperature);
195 _supla_int16_t getDefaultTemperatureRoomMin()
const;
196 _supla_int16_t getDefaultTemperatureRoomMax()
const;
198 void initDefaultConfig();
199 void initDefaultWeeklySchedule();
200 void initDefaultAlgorithm();
204 void setTemperatureRoomMin(_supla_int16_t temperature);
205 void setTemperatureRoomMax(_supla_int16_t temperature);
206 void setTemperatureAuxMin(_supla_int16_t temperature);
207 void setTemperatureAuxMax(_supla_int16_t temperature);
208 void setTemperatureHisteresisMin(_supla_int16_t temperature);
209 void setTemperatureHisteresisMax(_supla_int16_t temperature);
210 void setTemperatureHeatCoolOffsetMin(_supla_int16_t temperature);
211 void setTemperatureHeatCoolOffsetMax(_supla_int16_t temperature);
212 _supla_int16_t getTemperatureRoomMin(
214 _supla_int16_t getTemperatureRoomMax(
216 _supla_int16_t getTemperatureAuxMin(
218 _supla_int16_t getTemperatureAuxMax(
220 _supla_int16_t getTemperatureHisteresisMin(
222 _supla_int16_t getTemperatureHisteresisMax(
224 _supla_int16_t getTemperatureHeatCoolOffsetMin(
226 _supla_int16_t getTemperatureHeatCoolOffsetMax(
228 _supla_int16_t getTemperatureRoomMin()
const;
229 _supla_int16_t getTemperatureRoomMax()
const;
230 _supla_int16_t getTemperatureAuxMin()
const;
231 _supla_int16_t getTemperatureAuxMax()
const;
232 _supla_int16_t getTemperatureHisteresisMin()
const;
233 _supla_int16_t getTemperatureHisteresisMax()
const;
234 _supla_int16_t getTemperatureHeatCoolOffsetMin()
const;
235 _supla_int16_t getTemperatureHeatCoolOffsetMax()
const;
241 bool setTemperatureFreezeProtection(_supla_int16_t temperature);
242 bool setTemperatureHeatProtection(_supla_int16_t temperature);
243 bool setTemperatureEco(_supla_int16_t temperature);
244 bool setTemperatureComfort(_supla_int16_t temperature);
245 bool setTemperatureBoost(_supla_int16_t temperature);
246 bool setTemperatureHisteresis(_supla_int16_t temperature);
247 bool setTemperatureBelowAlarm(_supla_int16_t temperature);
248 bool setTemperatureAboveAlarm(_supla_int16_t temperature);
249 bool setTemperatureAuxMinSetpoint(_supla_int16_t temperature);
250 bool setTemperatureAuxMaxSetpoint(_supla_int16_t temperature);
251 _supla_int16_t getTemperatureFreezeProtection(
253 _supla_int16_t getTemperatureHeatProtection(
255 _supla_int16_t getTemperatureEco(
257 _supla_int16_t getTemperatureComfort(
259 _supla_int16_t getTemperatureBoost(
261 _supla_int16_t getTemperatureHisteresis(
263 _supla_int16_t getTemperatureBelowAlarm(
265 _supla_int16_t getTemperatureAboveAlarm(
267 _supla_int16_t getTemperatureAuxMinSetpoint(
269 _supla_int16_t getTemperatureAuxMaxSetpoint(
271 _supla_int16_t getTemperatureFreezeProtection()
const;
272 _supla_int16_t getTemperatureHeatProtection()
const;
273 _supla_int16_t getTemperatureEco()
const;
274 _supla_int16_t getTemperatureComfort()
const;
275 _supla_int16_t getTemperatureBoost()
const;
276 _supla_int16_t getTemperatureHisteresis()
const;
277 _supla_int16_t getTemperatureBelowAlarm()
const;
278 _supla_int16_t getTemperatureAboveAlarm()
const;
279 _supla_int16_t getTemperatureAuxMinSetpoint()
const;
280 _supla_int16_t getTemperatureAuxMaxSetpoint()
const;
285 bool isHeatingAndCoolingSupported()
const;
286 bool isHeatCoolSupported()
const;
287 bool isFanSupported()
const;
288 bool isDrySupported()
const;
290 bool isHeatingSubfunction()
const;
291 bool isCoolingSubfunction()
const;
293 bool isFunctionSupported(_supla_int_t channelFunction)
const;
295 bool isWeeklyScheduleValid(
297 bool isAltWeeklySchedule =
false)
const;
298 bool isChannelThermometer(uint8_t channelNo)
const;
299 bool isChannelBinarySensor(uint8_t channelNo)
const;
300 bool isAlgorithmValid(
unsigned _supla_int16_t algorithm)
const;
302 void fixTempearturesConfig();
305 bool isModeSupported(
int mode)
const;
308 unsigned _supla_int_t index);
309 static _supla_int16_t getTemperatureFromStruct(
312 unsigned _supla_int_t index,
313 _supla_int16_t temperature);
315 unsigned _supla_int_t index);
317 static int32_t getArrayIndex(int32_t bitIndex);
319 bool isTemperatureInRoomConstrain(_supla_int16_t temperature)
const;
320 bool isTemperatureInAuxConstrain(_supla_int16_t temperature)
const;
321 bool isTemperatureFreezeProtectionValid(_supla_int16_t temperature)
const;
322 bool isTemperatureHeatProtectionValid(_supla_int16_t temperature)
const;
323 bool isTemperatureEcoValid(_supla_int16_t temperature)
const;
324 bool isTemperatureComfortValid(_supla_int16_t temperature)
const;
325 bool isTemperatureBoostValid(_supla_int16_t temperature)
const;
326 bool isTemperatureHisteresisValid(_supla_int16_t temperature)
const;
327 bool isTemperatureBelowAlarmValid(_supla_int16_t temperature)
const;
328 bool isTemperatureAboveAlarmValid(_supla_int16_t temperature)
const;
330 bool isTemperatureAuxMinSetpointValid(
331 _supla_int16_t temperature)
const;
333 bool isTemperatureAuxMaxSetpointValid(
334 _supla_int16_t temperature)
const;
335 bool isTemperatureInHeatCoolConstrain(_supla_int16_t tHeat,
336 _supla_int16_t tCool)
const;
338 bool isTemperatureFreezeProtectionValid(
340 bool isTemperatureHeatProtectionValid(
345 bool isTemperatureHisteresisValid(
347 bool isTemperatureBelowAlarmValid(
349 bool isTemperatureAboveAlarmValid(
352 bool isTemperatureAuxMinSetpointValid(
355 bool isTemperatureAuxMaxSetpointValid(
358 void clearChannelConfigChangedFlag();
359 void clearWeeklyScheduleChangedFlag();
361 int getWeeklyScheduleProgramId(
364 bool isAltWeeklySchedule)
const;
366 bool setProgram(
int programId,
368 _supla_int16_t tHeat,
369 _supla_int16_t tCool,
370 bool isAltWeeklySchedule =
false);
372 bool setWeeklySchedule(
int index,
374 bool isAltWeeklySchedule =
false);
376 bool setWeeklySchedule(
enum DayOfWeek dayOfWeek,
380 bool isAltWeeklySchedule =
false);
381 int calculateIndex(
enum DayOfWeek dayOfWeek,
384 int getCurrentQuarter()
const;
386 int getCurrentProgramId()
const;
389 bool isAltWeeklySchedule =
false)
const;
391 void copyFixedChannelConfigTo(HvacBase *hvac)
const;
394 bool turnOnWeeklySchedlue();
395 void changeFunction(int32_t newFunction,
bool changedLocally);
396 _supla_int_t getChannelFunction();
401 void enableDifferentialFunctionSupport();
402 bool isDifferentialFunctionSupported()
const;
403 void enableDomesticHotWaterFunctionSupport();
404 bool isDomesticHotWaterFunctionSupported()
const;
406 bool applyNewRuntimeSettings(
int mode,
409 int32_t durationSec = 0);
412 bool applyNewRuntimeSettings(
int mode,
413 int32_t durationSec = 0);
415 _supla_int16_t getLastTemperature();
417 bool setBinarySensorChannelNo(uint8_t channelNo);
418 uint8_t getBinarySensorChannelNo()
const;
424 static const char* temperatureName(int32_t index);
427 _supla_int16_t getPrimaryTemp();
428 _supla_int16_t getSecondaryTemp();
430 bool isWeelkySchedulManualOverrideMode()
const;
431 void clearWaitingFlags();
433 void allowWrapAroundTemperatureSetpoints();
435 void enableInitialConfig();
439 time_t getCountDownTimerEnds()
const;
440 int32_t getRemainingCountDownTimeSec()
const;
441 void stopCountDownTimer();
443 bool ignoreAggregatorForRelay(int32_t relayChannelNumber)
const;
444 void setIgnoreDefaultPumpForAggregator(
bool);
445 void setIgnoreDefaultHeatOrColdSourceForAggregator(
bool);
447 bool isAltWeeklySchedulePossible()
const;
453 void setOutput(
int value,
bool force =
false);
454 void updateChannelState();
461 _supla_int16_t getTemperature(
int channelNo);
463 bool getForcedOffSensorState();
464 bool isSensorTempValid(_supla_int16_t temperature)
const;
465 bool checkOverheatProtection(_supla_int16_t t);
466 bool checkAntifreezeProtection(_supla_int16_t t);
467 bool checkAuxProtection(_supla_int16_t t);
468 bool isAuxProtectionEnabled()
const;
469 bool processWeeklySchedule();
470 void setSetpointTemperaturesForCurrentMode(int16_t tHeat, int16_t tCool);
471 bool checkThermometersStatusForCurrentMode(_supla_int16_t t1,
472 _supla_int16_t t2)
const;
473 int evaluateHeatOutputValue(_supla_int16_t tMeasured,
474 _supla_int16_t tTarget);
475 int evaluateCoolOutputValue(_supla_int16_t tMeasured,
476 _supla_int16_t tTarget);
477 void fixTemperatureSetpoints();
478 void clearLastOutputValue();
479 void storeLastWorkingMode();
481 int32_t channelFunctionToIndex(int32_t channelFunction)
const;
482 void changeTemperatureSetpointsBy(int16_t tHeat, int16_t tCool);
483 void updateTimerValue();
485 bool fixReadonlyTemperature(int32_t temperatureIndex,
488 bool registerInAggregator(int16_t channelNo);
489 void unregisterInAggregator(int16_t channelNo);
505 bool isWeeklyScheduleConfigured =
false;
506 bool configFinishedReceived =
true;
507 bool defaultConfigReceived =
false;
508 bool weeklyScheduleReceived =
false;
509 bool altWeeklyScheduleReceived =
false;
510 bool initDone =
false;
511 bool serverChannelFunctionValid =
true;
512 bool wrapAroundTemperatureSetpoints =
false;
513 bool registeredInRelayHvacAggregator =
false;
514 bool startupDelay =
true;
516 uint8_t channelConfigChangedOffline = 0;
517 uint8_t weeklyScheduleChangedOffline = 0;
518 uint8_t lastManualMode = 0;
519 uint8_t previousSubfunction = 0;
520 uint8_t defaultSubfunction = 0;
521 uint8_t defaultMainThermometer = 0;
522 uint8_t defaultAuxThermometer = 0;
523 uint8_t defaultBinarySensor = 0;
524 int16_t defaultPumpSwitch = -1;
525 int16_t defaultHeatOrColdSourceSwitch = -1;
526 int16_t defaultMasterThermostat = -1;
527 int16_t defaultChannelsFlags = 0;
529 int8_t lastProgramManualOverride = -1;
530 int8_t lastValue = -111;
531 uint8_t configFixAttempt = 0;
533 int16_t lastManualSetpointHeat = INT16_MIN;
534 int16_t lastManualSetpointCool = INT16_MIN;
535 int16_t lastTemperature = 0;
536 int16_t buttonTemperatureStep = 50;
538 uint32_t lastConfigChangeTimestampMs = 0;
539 uint32_t lastIterateTimestampMs = 0;
540 uint32_t lastOutputStateChangeTimestampMs = 0;
541 uint32_t timerUpdateTimestamp = 0;
543 time_t countdownTimerEnds = 1;
545 int16_t defaultTemperatureRoomMin[6] = {
553 int16_t defaultTemperatureRoomMax[6] = {