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(
bool forAux =
false)
const;
108 void setButtonTemperatureStep(int16_t step);
109 int16_t getCurrentHysteresis(
bool forAux)
const;
116 void addLocalUILockCapability(
enum LocalUILock capability);
117 void removeLocalUILockCapability(
enum LocalUILock capability);
119 enum LocalUILock getLocalUILockCapabilityAsEnum(uint8_t capability)
const;
120 void setLocalUILockCapabilities(uint8_t capabilities);
121 uint8_t getLocalUILockCapabilities()
const;
122 bool isLocalUILockCapabilitySupported(
enum LocalUILock capability)
const;
124 bool setLocalUILock(
enum LocalUILock lock);
125 enum LocalUILock getLocalUILock()
const;
127 void setLocalUILockTemperatureMin(int16_t min);
130 int16_t getLocalUILockTemperatureMin()
const;
132 void setLocalUILockTemperatureMax(int16_t max);
135 int16_t getLocalUILockTemperatureMax()
const;
139 void setSubfunction(uint8_t subfunction);
140 void setDefaultSubfunction(uint8_t subfunction);
143 bool setMainThermometerChannelNo(uint8_t channelNo);
144 uint8_t getMainThermometerChannelNo()
const;
147 bool setAuxThermometerChannelNo(uint8_t channelNo);
148 uint8_t getAuxThermometerChannelNo()
const;
150 void setAuxThermometerType(uint8_t type);
151 uint8_t getAuxThermometerType()
const;
153 bool setPumpSwitchChannelNo(uint8_t channelNo);
154 void clearPumpSwitchChannelNo();
155 uint8_t getPumpSwitchChannelNo()
const;
156 bool isPumpSwitchSet()
const;
157 bool setHeatOrColdSourceSwitchChannelNo(uint8_t channelNo);
158 void clearHeatOrColdSourceSwitchChannelNo();
159 uint8_t getHeatOrColdSourceSwitchChannelNo()
const;
160 bool isHeatOrColdSourceSwitchSet()
const;
161 bool setMasterThermostatChannelNo(uint8_t channelNo);
162 void clearMasterThermostatChannelNo();
163 uint8_t getMasterThermostatChannelNo()
const;
164 bool isMasterThermostatSet()
const;
167 void setAntiFreezeAndHeatProtectionEnabled(
bool enebled);
168 bool isAntiFreezeAndHeatProtectionEnabled()
const;
169 void setAuxMinMaxSetpointEnabled(
bool enabled);
170 bool isAuxMinMaxSetpointEnabled()
const;
172 void setTemperatureSetpointChangeSwitchesToManualMode(
bool enabled);
173 bool isTemperatureSetpointChangeSwitchesToManualMode()
const;
176 void setUseSeparateHeatCoolOutputs(
bool enabled);
177 bool isUseSeparateHeatCoolOutputs()
const;
179 void setTemperatureControlType(uint8_t);
181 uint8_t getTemperatureControlType()
const;
182 bool isTemperatureControlTypeMain()
const;
183 bool isTemperatureControlTypeAux()
const;
186 bool setMinOnTimeS(uint16_t seconds);
187 uint16_t getMinOnTimeS()
const;
188 bool isMinOnOffTimeValid(uint16_t seconds)
const;
191 bool setMinOffTimeS(uint16_t seconds);
192 uint16_t getMinOffTimeS()
const;
195 bool setOutputValueOnError(
signed char value);
196 signed char getOutputValueOnError()
const;
198 void setDefaultTemperatureRoomMin(int32_t channelFunction,
199 _supla_int16_t temperature);
200 void setDefaultTemperatureRoomMax(int32_t channelFunction,
201 _supla_int16_t temperature);
202 _supla_int16_t getDefaultTemperatureRoomMin()
const;
203 _supla_int16_t getDefaultTemperatureRoomMax()
const;
205 void initDefaultConfig();
206 void initDefaultWeeklySchedule();
207 void initDefaultAlgorithm();
208 void suspendIterateAlways();
212 void setTemperatureRoomMin(_supla_int16_t temperature);
213 void setTemperatureRoomMax(_supla_int16_t temperature);
214 void setTemperatureAuxMin(_supla_int16_t temperature);
215 void setTemperatureAuxMax(_supla_int16_t temperature);
216 void setTemperatureHisteresisMin(_supla_int16_t temperature);
217 void setTemperatureHisteresisMax(_supla_int16_t temperature);
218 void setTemperatureHeatCoolOffsetMin(_supla_int16_t temperature);
219 void setTemperatureHeatCoolOffsetMax(_supla_int16_t temperature);
220 _supla_int16_t getTemperatureRoomMin(
222 _supla_int16_t getTemperatureRoomMax(
224 _supla_int16_t getTemperatureAuxMin(
226 _supla_int16_t getTemperatureAuxMax(
228 _supla_int16_t getTemperatureHisteresisMin(
230 _supla_int16_t getTemperatureHisteresisMax(
232 _supla_int16_t getTemperatureHeatCoolOffsetMin(
234 _supla_int16_t getTemperatureHeatCoolOffsetMax(
236 _supla_int16_t getTemperatureRoomMin()
const;
237 _supla_int16_t getTemperatureRoomMax()
const;
238 _supla_int16_t getTemperatureMainMin()
const;
239 _supla_int16_t getTemperatureMainMax()
const;
240 _supla_int16_t getTemperatureAuxMin()
const;
241 _supla_int16_t getTemperatureAuxMax()
const;
242 _supla_int16_t getTemperatureHisteresisMin()
const;
243 _supla_int16_t getTemperatureHisteresisMax()
const;
244 _supla_int16_t getTemperatureHeatCoolOffsetMin()
const;
245 _supla_int16_t getTemperatureHeatCoolOffsetMax()
const;
251 bool setTemperatureFreezeProtection(_supla_int16_t temperature);
252 bool setTemperatureHeatProtection(_supla_int16_t temperature);
253 bool setTemperatureEco(_supla_int16_t temperature);
254 bool setTemperatureComfort(_supla_int16_t temperature);
255 bool setTemperatureBoost(_supla_int16_t temperature);
256 bool setTemperatureHisteresis(_supla_int16_t temperature);
257 bool setTemperatureAuxHisteresis(_supla_int16_t temperature);
258 bool setTemperatureBelowAlarm(_supla_int16_t temperature);
259 bool setTemperatureAboveAlarm(_supla_int16_t temperature);
260 bool setTemperatureAuxMinSetpoint(_supla_int16_t temperature);
261 bool setTemperatureAuxMaxSetpoint(_supla_int16_t temperature);
262 _supla_int16_t getTemperatureFreezeProtection(
264 _supla_int16_t getTemperatureHeatProtection(
266 _supla_int16_t getTemperatureEco(
268 _supla_int16_t getTemperatureComfort(
270 _supla_int16_t getTemperatureBoost(
272 _supla_int16_t getTemperatureHisteresis(
274 _supla_int16_t getTemperatureAuxHisteresis(
276 _supla_int16_t getTemperatureBelowAlarm(
278 _supla_int16_t getTemperatureAboveAlarm(
280 _supla_int16_t getTemperatureAuxMinSetpoint(
282 _supla_int16_t getTemperatureAuxMaxSetpoint(
284 _supla_int16_t getTemperatureFreezeProtection()
const;
285 _supla_int16_t getTemperatureHeatProtection()
const;
286 _supla_int16_t getTemperatureEco()
const;
287 _supla_int16_t getTemperatureComfort()
const;
288 _supla_int16_t getTemperatureBoost()
const;
289 _supla_int16_t getTemperatureHisteresis()
const;
290 _supla_int16_t getTemperatureAuxHisteresis()
const;
291 _supla_int16_t getTemperatureBelowAlarm()
const;
292 _supla_int16_t getTemperatureAboveAlarm()
const;
293 _supla_int16_t getTemperatureAuxMinSetpoint()
const;
294 _supla_int16_t getTemperatureAuxMaxSetpoint()
const;
299 bool isHeatingAndCoolingSupported()
const;
300 bool isHeatCoolSupported()
const;
301 bool isFanSupported()
const;
302 bool isDrySupported()
const;
304 bool isHeatingSubfunction()
const;
305 bool isCoolingSubfunction()
const;
307 bool isFunctionSupported(_supla_int_t channelFunction)
const;
309 bool isWeeklyScheduleValid(
311 bool isAltWeeklySchedule =
false)
const;
312 bool isChannelThermometer(uint8_t channelNo)
const;
313 bool isChannelBinarySensor(uint8_t channelNo)
const;
314 bool isAlgorithmValid(
unsigned _supla_int16_t algorithm)
const;
316 bool fixTempearturesConfig();
319 bool isModeSupported(
int mode)
const;
322 unsigned _supla_int_t index);
323 static _supla_int16_t getTemperatureFromStruct(
326 unsigned _supla_int_t index,
327 _supla_int16_t temperature);
329 unsigned _supla_int_t index);
331 static int32_t getArrayIndex(int32_t bitIndex);
333 bool isTemperatureInMainConstrain(_supla_int16_t temperature)
const;
334 bool isTemperatureInAuxConstrain(_supla_int16_t temperature)
const;
335 bool isTemperatureFreezeProtectionValid(_supla_int16_t temperature)
const;
336 bool isTemperatureHeatProtectionValid(_supla_int16_t temperature)
const;
337 bool isTemperatureEcoValid(_supla_int16_t temperature)
const;
338 bool isTemperatureComfortValid(_supla_int16_t temperature)
const;
339 bool isTemperatureBoostValid(_supla_int16_t temperature)
const;
340 bool isTemperatureHisteresisValid(_supla_int16_t temperature)
const;
341 bool isTemperatureBelowAlarmValid(_supla_int16_t temperature)
const;
342 bool isTemperatureAboveAlarmValid(_supla_int16_t temperature)
const;
344 bool isTemperatureAuxMinSetpointValid(
345 _supla_int16_t temperature)
const;
347 bool isTemperatureAuxMaxSetpointValid(
348 _supla_int16_t temperature)
const;
349 bool isTemperatureInHeatCoolConstrain(_supla_int16_t tHeat,
350 _supla_int16_t tCool)
const;
352 bool isTemperatureFreezeProtectionValid(
354 bool isTemperatureHeatProtectionValid(
359 bool isTemperatureHisteresisValid(
361 bool isTemperatureAuxHisteresisValid(
363 bool isTemperatureBelowAlarmValid(
365 bool isTemperatureAboveAlarmValid(
368 bool isTemperatureAuxMinSetpointValid(
371 bool isTemperatureAuxMaxSetpointValid(
374 void clearChannelConfigChangedFlag();
375 void clearWeeklyScheduleChangedFlag();
377 int getWeeklyScheduleProgramId(
380 bool isAltWeeklySchedule)
const;
382 bool setProgram(
int programId,
384 _supla_int16_t tHeat,
385 _supla_int16_t tCool,
386 bool isAltWeeklySchedule =
false);
388 bool setWeeklySchedule(
int index,
390 bool isAltWeeklySchedule =
false);
392 bool setWeeklySchedule(
enum DayOfWeek dayOfWeek,
396 bool isAltWeeklySchedule =
false);
397 int calculateIndex(
enum DayOfWeek dayOfWeek,
400 int getCurrentQuarter()
const;
402 int getCurrentProgramId()
const;
405 bool isAltWeeklySchedule =
false)
const;
407 void copyFixedChannelConfigTo(HvacBase *hvac)
const;
410 bool turnOnWeeklySchedlue();
411 void changeFunction(int32_t newFunction,
bool changedLocally);
412 _supla_int_t getChannelFunction();
417 void enableDifferentialFunctionSupport();
418 bool isDifferentialFunctionSupported()
const;
419 void enableDomesticHotWaterFunctionSupport();
420 bool isDomesticHotWaterFunctionSupported()
const;
422 bool applyNewRuntimeSettings(
int mode,
425 int32_t durationSec = 0);
428 bool applyNewRuntimeSettings(
int mode,
429 int32_t durationSec = 0);
431 _supla_int16_t getLastTemperature();
433 bool setBinarySensorChannelNo(uint8_t channelNo);
434 uint8_t getBinarySensorChannelNo()
const;
440 static const char* temperatureName(int32_t index);
443 _supla_int16_t getPrimaryTemp();
444 _supla_int16_t getSecondaryTemp();
446 bool isWeelkySchedulManualOverrideMode()
const;
447 void clearWaitingFlags();
449 void allowWrapAroundTemperatureSetpoints();
451 void enableInitialConfig();
455 time_t getCountDownTimerEnds()
const;
456 int32_t getRemainingCountDownTimeSec()
const;
457 void stopCountDownTimer();
459 bool ignoreAggregatorForRelay(int32_t relayChannelNumber)
const;
460 void setIgnoreDefaultPumpForAggregator(
bool);
461 void setIgnoreDefaultHeatOrColdSourceForAggregator(
bool);
463 bool isAltWeeklySchedulePossible()
const;
469 void setOutput(
int value,
bool force =
false);
470 void updateChannelState();
475 void clearLastOutputValue();
478 _supla_int16_t getTemperature(
int channelNo);
480 bool getForcedOffSensorState();
481 bool isSensorTempValid(_supla_int16_t temperature)
const;
482 bool checkOverheatProtection(_supla_int16_t t);
483 bool checkAntifreezeProtection(_supla_int16_t t);
484 bool checkAuxProtection(_supla_int16_t t);
485 bool isAuxProtectionEnabled()
const;
486 bool processWeeklySchedule();
487 void setSetpointTemperaturesForCurrentMode(int16_t tHeat, int16_t tCool);
488 bool checkThermometersStatusForCurrentMode(_supla_int16_t t1,
489 _supla_int16_t t2)
const;
490 int evaluateHeatOutputValue(_supla_int16_t tMeasured,
491 _supla_int16_t tTarget,
bool forAux =
false);
492 int evaluateCoolOutputValue(_supla_int16_t tMeasured,
493 _supla_int16_t tTarget,
bool forAux =
false);
494 void fixTemperatureSetpoints();
495 void storeLastWorkingMode();
497 int32_t channelFunctionToIndex(int32_t channelFunction)
const;
498 void changeTemperatureSetpointsBy(int16_t tHeat, int16_t tCool);
499 void updateTimerValue();
501 bool fixReadonlyTemperature(int32_t temperatureIndex,
504 bool registerInAggregator(int16_t channelNo);
505 void unregisterInAggregator(int16_t channelNo);
507 int16_t getClosestValidTemperature(int16_t temperature)
const;
523 bool isWeeklyScheduleConfigured =
false;
524 bool configFinishedReceived =
true;
525 bool defaultConfigReceived =
false;
526 bool weeklyScheduleReceived =
false;
527 bool altWeeklyScheduleReceived =
false;
528 bool initDone =
false;
529 bool serverChannelFunctionValid =
true;
530 bool wrapAroundTemperatureSetpoints =
false;
531 bool registeredInRelayHvacAggregator =
false;
532 bool startupDelay =
true;
533 bool forcedByAux =
false;
535 uint8_t channelConfigChangedOffline = 0;
536 uint8_t weeklyScheduleChangedOffline = 0;
537 uint8_t lastManualMode = 0;
538 uint8_t previousSubfunction = 0;
539 uint8_t defaultSubfunction = 0;
540 uint8_t defaultMainThermometer = 0;
541 uint8_t defaultAuxThermometer = 0;
542 uint8_t defaultBinarySensor = 0;
543 int16_t defaultPumpSwitch = -1;
544 int16_t defaultHeatOrColdSourceSwitch = -1;
545 int16_t defaultMasterThermostat = -1;
546 int16_t defaultChannelsFlags = 0;
548 int8_t lastProgramManualOverride = -1;
549 int8_t lastValue = -111;
550 uint8_t configFixAttempt = 0;
552 int16_t lastManualSetpointHeat = INT16_MIN;
553 int16_t lastManualSetpointCool = INT16_MIN;
554 int16_t lastTemperature = 0;
555 int16_t buttonTemperatureStep = 50;
557 uint32_t lastConfigChangeTimestampMs = 0;
558 uint32_t lastIterateTimestampMs = 0;
559 uint32_t lastOutputStateChangeTimestampMs = 0;
560 uint32_t timerUpdateTimestamp = 0;
562 time_t countdownTimerEnds = 1;
564 int16_t defaultTemperatureRoomMin[6] = {
572 int16_t defaultTemperatureRoomMax[6] = {