52class HvacBase :
public ChannelElement,
public ActionHandler {
77 bool local =
false)
override;
79 bool altSchedule =
false,
80 bool local =
false)
override;
85 void handleAction(
int event,
int action)
override;
87 void setTargetMode(
int mode,
bool keepSchedule =
false);
88 void clearTemperatureSetpointHeat();
89 void clearTemperatureSetpointCool();
90 void setTemperatureSetpointHeat(
int tHeat);
91 void setTemperatureSetpointCool(
int tCool);
92 int getTemperatureSetpointHeat();
93 int getTemperatureSetpointCool();
95 int getDefaultManualMode();
96 bool isWeeklyScheduleEnabled();
97 bool isCountdownEnabled();
98 bool isThermostatDisabled();
99 bool isManualModeEnabled();
102 void saveWeeklySchedule();
105 void setHeatingAndCoolingSupported(
bool supported);
106 void setHeatCoolSupported(
bool supported);
107 void setFanSupported(
bool supported);
108 void setDrySupported(
bool supported);
110 void addAvailableAlgorithm(
unsigned _supla_int16_t algorithm);
111 void removeAvailableAlgorithm(
unsigned _supla_int16_t algorithm);
112 bool isOutputControlledInternally()
const;
114 bool setUsedAlgorithm(
unsigned _supla_int16_t newAlgorithm);
115 unsigned _supla_int16_t getUsedAlgorithm(
bool forAux =
false)
const;
116 void setButtonTemperatureStep(int16_t step);
117 int16_t getCurrentHysteresis(
bool forAux)
const;
124 void addLocalUILockCapability(
enum LocalUILock capability);
125 void removeLocalUILockCapability(
enum LocalUILock capability);
127 enum LocalUILock getLocalUILockCapabilityAsEnum(uint8_t capability)
const;
128 void setLocalUILockCapabilities(uint8_t capabilities);
129 uint8_t getLocalUILockCapabilities()
const;
130 bool isLocalUILockCapabilitySupported(
enum LocalUILock capability)
const;
132 bool setLocalUILock(
enum LocalUILock lock);
133 enum LocalUILock getLocalUILock()
const;
135 void setLocalUILockTemperatureMin(int16_t min);
138 int16_t getLocalUILockTemperatureMin()
const;
140 void setLocalUILockTemperatureMax(int16_t max);
143 int16_t getLocalUILockTemperatureMax()
const;
147 void setSubfunction(uint8_t subfunction);
148 void setDefaultSubfunction(uint8_t subfunction);
151 bool setMainThermometerChannelNo(int16_t channelNo);
152 int16_t getMainThermometerChannelNo()
const;
155 bool setAuxThermometerChannelNo(int16_t channelNo);
156 int16_t getAuxThermometerChannelNo()
const;
158 void setAuxThermometerType(uint8_t type);
159 uint8_t getAuxThermometerType()
const;
161 bool setPumpSwitchChannelNo(uint8_t channelNo);
162 void clearPumpSwitchChannelNo();
163 int16_t getPumpSwitchChannelNo()
const;
164 bool isPumpSwitchSet()
const;
165 bool setHeatOrColdSourceSwitchChannelNo(uint8_t channelNo);
166 void clearHeatOrColdSourceSwitchChannelNo();
167 int16_t getHeatOrColdSourceSwitchChannelNo()
const;
168 bool isHeatOrColdSourceSwitchSet()
const;
169 bool setMasterThermostatChannelNo(uint8_t channelNo);
170 void clearMasterThermostatChannelNo();
171 int16_t getMasterThermostatChannelNo()
const;
172 bool isMasterThermostatSet()
const;
175 void setAntiFreezeAndHeatProtectionEnabled(
bool enebled);
176 bool isAntiFreezeAndHeatProtectionEnabled()
const;
177 void setAuxMinMaxSetpointEnabled(
bool enabled);
178 bool isAuxMinMaxSetpointEnabled()
const;
180 void setTemperatureSetpointChangeSwitchesToManualMode(
bool enabled);
181 bool isTemperatureSetpointChangeSwitchesToManualMode()
const;
184 void setUseSeparateHeatCoolOutputs(
bool enabled);
185 bool isUseSeparateHeatCoolOutputs()
const;
187 void setTemperatureControlType(uint8_t);
189 uint8_t getTemperatureControlType()
const;
190 bool isTemperatureControlTypeMain()
const;
191 bool isTemperatureControlTypeAux()
const;
194 bool setMinOnTimeS(uint16_t seconds);
195 uint16_t getMinOnTimeS()
const;
196 bool isMinOnOffTimeValid(uint16_t seconds)
const;
199 bool setMinOffTimeS(uint16_t seconds);
200 uint16_t getMinOffTimeS()
const;
203 bool setOutputValueOnError(
signed char value);
204 signed char getOutputValueOnError()
const;
206 void setDefaultTemperatureRoomMin(int32_t channelFunction,
207 _supla_int16_t temperature);
208 void setDefaultTemperatureRoomMax(int32_t channelFunction,
209 _supla_int16_t temperature);
210 _supla_int16_t getDefaultTemperatureRoomMin()
const;
211 _supla_int16_t getDefaultTemperatureRoomMax()
const;
213 void initDefaultConfig();
214 void initDefaultWeeklySchedule();
215 void initDefaultAlgorithm();
216 void suspendIterateAlways();
220 void setTemperatureRoomMin(_supla_int16_t temperature);
221 void setTemperatureRoomMax(_supla_int16_t temperature);
222 void setTemperatureAuxMin(_supla_int16_t temperature);
223 void setTemperatureAuxMax(_supla_int16_t temperature);
224 void setTemperatureHisteresisMin(_supla_int16_t temperature);
225 void setTemperatureHisteresisMax(_supla_int16_t temperature);
226 void setTemperatureHeatCoolOffsetMin(_supla_int16_t temperature);
227 void setTemperatureHeatCoolOffsetMax(_supla_int16_t temperature);
228 _supla_int16_t getTemperatureRoomMin(
230 _supla_int16_t getTemperatureRoomMax(
232 _supla_int16_t getTemperatureAuxMin(
234 _supla_int16_t getTemperatureAuxMax(
236 _supla_int16_t getTemperatureHisteresisMin(
238 _supla_int16_t getTemperatureHisteresisMax(
240 _supla_int16_t getTemperatureHeatCoolOffsetMin(
242 _supla_int16_t getTemperatureHeatCoolOffsetMax(
244 _supla_int16_t getTemperatureRoomMin()
const;
245 _supla_int16_t getTemperatureRoomMax()
const;
246 _supla_int16_t getTemperatureMainMin()
const;
247 _supla_int16_t getTemperatureMainMax()
const;
248 _supla_int16_t getTemperatureAuxMin()
const;
249 _supla_int16_t getTemperatureAuxMax()
const;
250 _supla_int16_t getTemperatureHisteresisMin()
const;
251 _supla_int16_t getTemperatureHisteresisMax()
const;
252 _supla_int16_t getTemperatureHeatCoolOffsetMin()
const;
253 _supla_int16_t getTemperatureHeatCoolOffsetMax()
const;
259 bool setTemperatureFreezeProtection(_supla_int16_t temperature);
260 bool setTemperatureHeatProtection(_supla_int16_t temperature);
261 bool setTemperatureEco(_supla_int16_t temperature);
262 bool setTemperatureComfort(_supla_int16_t temperature);
263 bool setTemperatureBoost(_supla_int16_t temperature);
264 bool setTemperatureHisteresis(_supla_int16_t temperature);
265 bool setTemperatureAuxHisteresis(_supla_int16_t temperature);
266 bool setTemperatureBelowAlarm(_supla_int16_t temperature);
267 bool setTemperatureAboveAlarm(_supla_int16_t temperature);
268 bool setTemperatureAuxMinSetpoint(_supla_int16_t temperature);
269 bool setTemperatureAuxMaxSetpoint(_supla_int16_t temperature);
270 _supla_int16_t getTemperatureFreezeProtection(
272 _supla_int16_t getTemperatureHeatProtection(
274 _supla_int16_t getTemperatureEco(
276 _supla_int16_t getTemperatureComfort(
278 _supla_int16_t getTemperatureBoost(
280 _supla_int16_t getTemperatureHisteresis(
282 _supla_int16_t getTemperatureAuxHisteresis(
284 _supla_int16_t getTemperatureBelowAlarm(
286 _supla_int16_t getTemperatureAboveAlarm(
288 _supla_int16_t getTemperatureAuxMinSetpoint(
290 _supla_int16_t getTemperatureAuxMaxSetpoint(
292 _supla_int16_t getTemperatureFreezeProtection()
const;
293 _supla_int16_t getTemperatureHeatProtection()
const;
294 _supla_int16_t getTemperatureEco()
const;
295 _supla_int16_t getTemperatureComfort()
const;
296 _supla_int16_t getTemperatureBoost()
const;
297 _supla_int16_t getTemperatureHisteresis()
const;
298 _supla_int16_t getTemperatureAuxHisteresis()
const;
299 _supla_int16_t getTemperatureBelowAlarm()
const;
300 _supla_int16_t getTemperatureAboveAlarm()
const;
301 _supla_int16_t getTemperatureAuxMinSetpoint()
const;
302 _supla_int16_t getTemperatureAuxMaxSetpoint()
const;
307 bool isHeatingAndCoolingSupported()
const;
308 bool isHeatCoolSupported()
const;
309 bool isFanSupported()
const;
310 bool isDrySupported()
const;
312 bool isHeatingSubfunction()
const;
313 bool isCoolingSubfunction()
const;
315 bool isFunctionSupported(_supla_int_t channelFunction)
const;
317 bool isWeeklyScheduleValid(
319 bool isAltWeeklySchedule =
false)
const;
320 bool isChannelThermometer(int16_t channelNo)
const;
321 bool isChannelBinarySensor(int16_t channelNo)
const;
322 bool isAlgorithmValid(
unsigned _supla_int16_t algorithm)
const;
324 bool fixTempearturesConfig();
327 bool isModeSupported(
int mode)
const;
330 unsigned _supla_int_t index);
331 static _supla_int16_t getTemperatureFromStruct(
334 unsigned _supla_int_t index,
335 _supla_int16_t temperature);
337 unsigned _supla_int_t index);
339 static int32_t getArrayIndex(int32_t bitIndex);
341 bool isTemperatureInMainConstrain(_supla_int16_t temperature)
const;
342 bool isTemperatureInAuxConstrain(_supla_int16_t temperature)
const;
343 bool isTemperatureFreezeProtectionValid(_supla_int16_t temperature)
const;
344 bool isTemperatureHeatProtectionValid(_supla_int16_t temperature)
const;
345 bool isTemperatureEcoValid(_supla_int16_t temperature)
const;
346 bool isTemperatureComfortValid(_supla_int16_t temperature)
const;
347 bool isTemperatureBoostValid(_supla_int16_t temperature)
const;
348 bool isTemperatureHisteresisValid(_supla_int16_t temperature)
const;
349 bool isTemperatureBelowAlarmValid(_supla_int16_t temperature)
const;
350 bool isTemperatureAboveAlarmValid(_supla_int16_t temperature)
const;
352 bool isTemperatureAuxMinSetpointValid(
353 _supla_int16_t temperature)
const;
355 bool isTemperatureAuxMaxSetpointValid(
356 _supla_int16_t temperature)
const;
357 bool isTemperatureInHeatCoolConstrain(_supla_int16_t tHeat,
358 _supla_int16_t tCool)
const;
360 bool isTemperatureFreezeProtectionValid(
362 bool isTemperatureHeatProtectionValid(
367 bool isTemperatureHisteresisValid(
369 bool isTemperatureAuxHisteresisValid(
371 bool isTemperatureBelowAlarmValid(
373 bool isTemperatureAboveAlarmValid(
376 bool isTemperatureAuxMinSetpointValid(
379 bool isTemperatureAuxMaxSetpointValid(
382 void clearChannelConfigChangedFlag();
383 void clearWeeklyScheduleChangedFlag();
385 int getWeeklyScheduleProgramId(
388 bool isAltWeeklySchedule)
const;
390 bool setProgram(
int programId,
392 _supla_int16_t tHeat,
393 _supla_int16_t tCool,
394 bool isAltWeeklySchedule =
false);
396 bool setWeeklySchedule(
int index,
398 bool isAltWeeklySchedule =
false);
400 bool setWeeklySchedule(
enum DayOfWeek dayOfWeek,
404 bool isAltWeeklySchedule =
false);
405 int calculateIndex(
enum DayOfWeek dayOfWeek,
408 int getCurrentQuarter()
const;
410 int getCurrentProgramId()
const;
413 bool isAltWeeklySchedule =
false)
const;
415 void copyFixedChannelConfigTo(HvacBase *hvac)
const;
418 bool turnOnWeeklySchedlue();
419 void changeFunction(uint32_t newFunction,
bool changedLocally);
420 _supla_int_t getChannelFunction();
425 void enableDifferentialFunctionSupport();
426 bool isDifferentialFunctionSupported()
const;
427 void enableDomesticHotWaterFunctionSupport();
428 bool isDomesticHotWaterFunctionSupported()
const;
430 bool applyNewRuntimeSettings(
int mode,
433 int32_t durationSec = 0);
436 bool applyNewRuntimeSettings(
int mode,
437 int32_t durationSec = 0);
439 _supla_int16_t getLastTemperature();
441 bool setBinarySensorChannelNo(int16_t channelNo);
442 int16_t getBinarySensorChannelNo()
const;
448 static const char* temperatureName(int32_t index);
451 _supla_int16_t getPrimaryTemp();
452 _supla_int16_t getSecondaryTemp();
454 bool isWeelkySchedulManualOverrideMode()
const;
455 void clearWaitingFlags();
457 void allowWrapAroundTemperatureSetpoints();
459 void enableInitialConfig();
463 time_t getCountDownTimerEnds()
const;
464 int32_t getRemainingCountDownTimeSec()
const;
465 void stopCountDownTimer();
467 bool ignoreAggregatorForRelay(int32_t relayChannelNumber)
const;
468 void setIgnoreDefaultPumpForAggregator(
bool);
469 void setIgnoreDefaultHeatOrColdSourceForAggregator(
bool);
471 bool isAltWeeklySchedulePossible()
const;
485 void setOutput(
int value,
bool force =
false);
486 void updateChannelState();
491 void clearLastOutputValue();
494 _supla_int16_t getTemperature(
int channelNo);
496 bool getForcedOffSensorState();
497 bool isSensorTempValid(_supla_int16_t temperature)
const;
498 bool checkOverheatProtection(_supla_int16_t t);
499 bool checkAntifreezeProtection(_supla_int16_t t);
500 bool checkAuxProtection(_supla_int16_t t);
501 bool isAuxProtectionEnabled()
const;
502 bool processWeeklySchedule();
503 void setSetpointTemperaturesForCurrentMode(int16_t tHeat, int16_t tCool);
504 bool checkThermometersStatusForCurrentMode(_supla_int16_t t1,
505 _supla_int16_t t2)
const;
506 int evaluateHeatOutputValue(_supla_int16_t tMeasured,
507 _supla_int16_t tTarget,
bool forAux =
false);
508 int evaluateCoolOutputValue(_supla_int16_t tMeasured,
509 _supla_int16_t tTarget,
bool forAux =
false);
510 void fixTemperatureSetpoints();
511 void storeLastWorkingMode();
513 int32_t channelFunctionToIndex(int32_t channelFunction)
const;
514 void changeTemperatureSetpointsBy(int16_t tHeat, int16_t tCool);
515 void updateTimerValue();
516 void emitCountdownTimerActionIfNeeded();
518 bool fixReadonlyTemperature(int32_t temperatureIndex,
521 bool registerInAggregator(int16_t channelNo);
522 void unregisterInAggregator(int16_t channelNo);
524 int16_t getClosestValidTemperature(int16_t temperature)
const;
540 bool isWeeklyScheduleConfigured =
false;
541 bool configFinishedReceived =
true;
542 bool defaultConfigReceived =
false;
543 bool weeklyScheduleReceived =
false;
544 bool altWeeklyScheduleReceived =
false;
545 bool initDone =
false;
546 bool serverChannelFunctionValid =
true;
547 bool wrapAroundTemperatureSetpoints =
false;
548 bool registeredInRelayHvacAggregator =
false;
549 bool startupDelay =
true;
550 bool forcedByAux =
false;
552 uint8_t channelConfigChangedOffline = 0;
553 uint8_t weeklyScheduleChangedOffline = 0;
554 uint8_t lastManualMode = 0;
555 uint8_t previousSubfunction = 0;
556 uint8_t defaultSubfunction = 0;
557 int16_t defaultMainThermometer = -1;
558 int16_t defaultAuxThermometer = -1;
559 int16_t defaultBinarySensor = -1;
560 int16_t defaultPumpSwitch = -1;
561 int16_t defaultHeatOrColdSourceSwitch = -1;
562 int16_t defaultMasterThermostat = -1;
563 int16_t defaultChannelsFlags = 0;
565 int8_t lastProgramManualOverride = -1;
566 int8_t lastValue = -111;
567 uint8_t configFixAttempt = 0;
569 int16_t lastManualSetpointHeat = INT16_MIN;
570 int16_t lastManualSetpointCool = INT16_MIN;
571 int16_t lastTemperature = 0;
572 int16_t buttonTemperatureStep = 50;
574 uint32_t lastConfigChangeTimestampMs = 0;
575 uint32_t lastIterateTimestampMs = 0;
576 uint32_t lastOutputStateChangeTimestampMs = 0;
577 uint32_t timerUpdateTimestamp = 0;
578 uint32_t lastCountdownTimerRemainingSec = UINT32_MAX;
580 time_t countdownTimerEnds = 1;
582 int16_t defaultTemperatureRoomMin[6] = {
590 int16_t defaultTemperatureRoomMax[6] = {