supla-device
Loading...
Searching...
No Matches
hvac_base.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_CONTROL_HVAC_BASE_H_
5#define SRC_SUPLA_CONTROL_HVAC_BASE_H_
6
7#include <supla/action_handler.h>
8#include <supla/channel_element.h>
9#include <time.h>
10
11#include "weekly_schedule_common.h"
12#include "weekly_schedule_component.h"
13
14#define HVAC_BASE_FLAG_IGNORE_DEFAULT_PUMP (1 << 0)
15#define HVAC_BASE_FLAG_IGNORE_DEFAULT_HEAT_OR_COLD (1 << 1)
16
17namespace Supla {
18
19enum class LocalUILock : uint8_t {
20 None = 0,
21 Full = 1,
22 Temperature = 2,
23 NotSupported = 255
24};
25
26namespace Control {
27
28class OutputInterface;
29class HvacWeeklySchedule;
30class HvacWeeklySchedulePolicy;
31class HvacBase;
32
33class HvacBase : public ChannelElement, public ActionHandler {
34 public:
35 explicit HvacBase(Supla::Control::OutputInterface *primaryOutput = nullptr,
36 Supla::Control::OutputInterface *secondaryOutput = nullptr,
37 int channelNumber = -1);
38 virtual ~HvacBase();
39
40 void onLoadConfig(SuplaDeviceClass *) override;
41 void onLoadState() override;
42 void onInit() override;
43 void onSaveState() override;
44 void onRegistered(Supla::Protocol::SuplaSrpc *suplaSrpc) override;
45 void iterateAlways() override;
46 bool iterateConnected() override;
54 bool getRemainingCountdownTimerSec(uint32_t *remainingSec) const override;
55 void purgeConfig() override;
56
57 int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override;
59 bool local = false) override;
61 TSDS_SetChannelConfigResult *result) override;
62 void handleChannelConfigFinished() override;
63 void fillChannelConfig(void *channelConfig,
64 int *size,
65 uint8_t configType) override;
66
67 void handleAction(int event, int action) override;
68
69 void setTargetMode(int mode, bool keepSchedule = false);
70 void clearTemperatureSetpointHeat();
71 void clearTemperatureSetpointCool();
72 void setTemperatureSetpointHeat(int tHeat);
73 void setTemperatureSetpointCool(int tCool);
74 int getTemperatureSetpointHeat();
75 int getTemperatureSetpointCool();
76 int getMode();
77 int getDefaultManualMode();
78 bool isWeeklyScheduleEnabled();
79 bool isCountdownEnabled();
80 bool isThermostatDisabled();
81 bool isManualModeEnabled();
82
83 void saveConfig(bool localChange = false);
84 void saveWeeklySchedule();
85 void syncWeeklyScheduleConfigTypes();
86 bool setWeeklyScheduleController(
87 WeeklyScheduleController *controller,
88 WeeklyScheduleConfigHandler *configHandler = nullptr,
89 WeeklyScheduleProgramSource *programSource = nullptr);
90
91 // Below functions are used to set device capabilities.
92 void setHeatingAndCoolingSupported(bool supported);
93 void setHeatCoolSupported(bool supported);
94 void setFanSupported(bool supported);
95 void setDrySupported(bool supported);
96
97 void addAvailableAlgorithm(unsigned _supla_int16_t algorithm);
98 void removeAvailableAlgorithm(unsigned _supla_int16_t algorithm);
99 bool isOutputControlledInternally() const;
100 // use this function to set value based on local config change
101 bool setUsedAlgorithm(unsigned _supla_int16_t newAlgorithm);
102 unsigned _supla_int16_t getUsedAlgorithm(bool forAux = false) const;
103 void setButtonTemperatureStep(int16_t step);
104 int16_t getCurrentHysteresis(bool forAux) const;
105
106 // Local UI blocking configuration.
107 // Those options doesn't have any functional effect on HvacBase behavior.
108 // HvacBase only provides interface for setting/getting these options.
109 // If you plan to use them, please implement proper local UI logic in
110 // your application.
111 void addLocalUILockCapability(enum LocalUILock capability);
112 void removeLocalUILockCapability(enum LocalUILock capability);
113
114 enum LocalUILock getLocalUILockCapabilityAsEnum(uint8_t capability) const;
115 void setLocalUILockCapabilities(uint8_t capabilities);
116 uint8_t getLocalUILockCapabilities() const;
117 bool isLocalUILockCapabilitySupported(enum LocalUILock capability) const;
118
119 bool setLocalUILock(enum LocalUILock lock);
120 enum LocalUILock getLocalUILock() const;
121
122 void setLocalUILockTemperatureMin(int16_t min);
123 // Returns min allowed temperature setpoint via local UI.
124 // Returns INT16_MIN if configured value is not in room min/max range
125 int16_t getLocalUILockTemperatureMin() const;
126
127 void setLocalUILockTemperatureMax(int16_t max);
128 // Returns max allowed temperature setpoint via local UI.
129 // Returns INT16_MIN if configured value is not in room min/max range
130 int16_t getLocalUILockTemperatureMax() const;
131
132 // Subfunction can be set only for HVAC_THERMOSTAT channel function
133 // SUPLA_HVAC_SUBFUNCTION_*
134 void setSubfunction(uint8_t subfunction);
135 void setDefaultSubfunction(uint8_t subfunction);
136
137 // use this function to set value based on local config change
138 bool setMainThermometerChannelNo(int16_t channelNo);
139 int16_t getMainThermometerChannelNo() const;
140
141 // use this function to set value based on local config change
142 bool setAuxThermometerChannelNo(int16_t channelNo);
143 int16_t getAuxThermometerChannelNo() const;
144 // use this function to set value based on local config change
145 void setAuxThermometerType(uint8_t type);
146 uint8_t getAuxThermometerType() const;
147
148 bool setPumpSwitchChannelNo(int16_t channelNo);
149 void clearPumpSwitchChannelNo();
150 int16_t getPumpSwitchChannelNo() const;
151 bool isPumpSwitchSet() const;
152 bool setHeatOrColdSourceSwitchChannelNo(int16_t channelNo);
153 void clearHeatOrColdSourceSwitchChannelNo();
154 int16_t getHeatOrColdSourceSwitchChannelNo() const;
155 bool isHeatOrColdSourceSwitchSet() const;
156 bool setMasterThermostatChannelNo(int16_t channelNo);
157 void clearMasterThermostatChannelNo();
158 int16_t getMasterThermostatChannelNo() const;
159 bool isMasterThermostatSet() const;
160
161 // use this function to set value based on local config change
162 void setAntiFreezeAndHeatProtectionEnabled(bool enebled);
163 bool isAntiFreezeAndHeatProtectionEnabled() const;
164 void setAuxMinMaxSetpointEnabled(bool enabled);
165 bool isAuxMinMaxSetpointEnabled() const;
166
167 void setTemperatureSetpointChangeSwitchesToManualMode(bool enabled);
168 bool isTemperatureSetpointChangeSwitchesToManualMode() const;
169
170 // only for HEAT_COOL thremostats:
171 void setUseSeparateHeatCoolOutputs(bool enabled);
172 bool isUseSeparateHeatCoolOutputs() const;
173
174 void setTemperatureControlType(uint8_t);
175
176 uint8_t getTemperatureControlType() const;
177 bool isTemperatureControlTypeMain() const;
178 bool isTemperatureControlTypeAux() const;
179
180 // use this function to set value based on local config change
181 bool setMinOnTimeS(uint16_t seconds);
182 uint16_t getMinOnTimeS() const;
183 bool isMinOnOffTimeValid(uint16_t seconds) const;
184
185 // use this function to set value based on local config change
186 bool setMinOffTimeS(uint16_t seconds);
187 uint16_t getMinOffTimeS() const;
188
189 // use this function to set value based on local config change
190 bool setOutputValueOnError(signed char value);
191 signed char getOutputValueOnError() const;
192
193 void setDefaultTemperatureRoomMin(int32_t channelFunction,
194 _supla_int16_t temperature);
195 void setDefaultTemperatureRoomMax(int32_t channelFunction,
196 _supla_int16_t temperature);
197 _supla_int16_t getDefaultTemperatureRoomMin() const;
198 _supla_int16_t getDefaultTemperatureRoomMax() const;
199
200 void initDefaultConfig();
201 void initDefaultWeeklySchedule();
202 void initDefaultAlgorithm();
203 void suspendIterateAlways();
204
205 // Below temperatures defines device capabilities.
206 // Configure those values before calling other setTemperature* functions.
207 void setTemperatureRoomMin(_supla_int16_t temperature);
208 void setTemperatureRoomMax(_supla_int16_t temperature);
209 void setTemperatureAuxMin(_supla_int16_t temperature);
210 void setTemperatureAuxMax(_supla_int16_t temperature);
211 void setTemperatureHisteresisMin(_supla_int16_t temperature);
212 void setTemperatureHisteresisMax(_supla_int16_t temperature);
213 void setTemperatureHeatCoolOffsetMin(_supla_int16_t temperature);
214 void setTemperatureHeatCoolOffsetMax(_supla_int16_t temperature);
215 _supla_int16_t getTemperatureRoomMin(
216 const THVACTemperatureCfg *temperatures) const;
217 _supla_int16_t getTemperatureRoomMax(
218 const THVACTemperatureCfg *temperatures) const;
219 _supla_int16_t getTemperatureAuxMin(
220 const THVACTemperatureCfg *temperatures) const;
221 _supla_int16_t getTemperatureAuxMax(
222 const THVACTemperatureCfg *temperatures) const;
223 _supla_int16_t getTemperatureHisteresisMin(
224 const THVACTemperatureCfg *temperatures) const;
225 _supla_int16_t getTemperatureHisteresisMax(
226 const THVACTemperatureCfg *temperatures) const;
227 _supla_int16_t getTemperatureHeatCoolOffsetMin(
228 const THVACTemperatureCfg *temperatures) const;
229 _supla_int16_t getTemperatureHeatCoolOffsetMax(
230 const THVACTemperatureCfg *temperatures) const;
231 _supla_int16_t getTemperatureRoomMin() const;
232 _supla_int16_t getTemperatureRoomMax() const;
233 _supla_int16_t getTemperatureMainMin() const;
234 _supla_int16_t getTemperatureMainMax() const;
235 _supla_int16_t getTemperatureAuxMin() const;
236 _supla_int16_t getTemperatureAuxMax() const;
237 _supla_int16_t getTemperatureHisteresisMin() const;
238 _supla_int16_t getTemperatureHisteresisMax() const;
239 _supla_int16_t getTemperatureHeatCoolOffsetMin() const;
240 _supla_int16_t getTemperatureHeatCoolOffsetMax() const;
241
242 // Below functions are used to set device configuration - those can
243 // be modified by user within limits defined by set* functions above.
244 // Set may fail if value is out of range defined by set* functions above.
245 // use those set functions to set value based on local input change
246 bool setTemperatureFreezeProtection(_supla_int16_t temperature);
247 bool setTemperatureHeatProtection(_supla_int16_t temperature);
248 bool setTemperatureEco(_supla_int16_t temperature);
249 bool setTemperatureComfort(_supla_int16_t temperature);
250 bool setTemperatureBoost(_supla_int16_t temperature);
251 bool setTemperatureHisteresis(_supla_int16_t temperature);
252 bool setTemperatureAuxHisteresis(_supla_int16_t temperature);
253 bool setTemperatureBelowAlarm(_supla_int16_t temperature);
254 bool setTemperatureAboveAlarm(_supla_int16_t temperature);
255 bool setTemperatureAuxMinSetpoint(_supla_int16_t temperature);
256 bool setTemperatureAuxMaxSetpoint(_supla_int16_t temperature);
257 _supla_int16_t getTemperatureFreezeProtection(
258 const THVACTemperatureCfg *temperatures) const;
259 _supla_int16_t getTemperatureHeatProtection(
260 const THVACTemperatureCfg *temperatures) const;
261 _supla_int16_t getTemperatureEco(
262 const THVACTemperatureCfg *temperatures) const;
263 _supla_int16_t getTemperatureComfort(
264 const THVACTemperatureCfg *temperatures) const;
265 _supla_int16_t getTemperatureBoost(
266 const THVACTemperatureCfg *temperatures) const;
267 _supla_int16_t getTemperatureHisteresis(
268 const THVACTemperatureCfg *temperatures) const;
269 _supla_int16_t getTemperatureAuxHisteresis(
270 const THVACTemperatureCfg *temperatures) const;
271 _supla_int16_t getTemperatureBelowAlarm(
272 const THVACTemperatureCfg *temperatures) const;
273 _supla_int16_t getTemperatureAboveAlarm(
274 const THVACTemperatureCfg *temperatures) const;
275 _supla_int16_t getTemperatureAuxMinSetpoint(
276 const THVACTemperatureCfg *temperatures) const;
277 _supla_int16_t getTemperatureAuxMaxSetpoint(
278 const THVACTemperatureCfg *temperatures) const;
279 _supla_int16_t getTemperatureFreezeProtection() const;
280 _supla_int16_t getTemperatureHeatProtection() const;
281 _supla_int16_t getTemperatureEco() const;
282 _supla_int16_t getTemperatureComfort() const;
283 _supla_int16_t getTemperatureBoost() const;
284 _supla_int16_t getTemperatureHisteresis() const;
285 _supla_int16_t getTemperatureAuxHisteresis() const;
286 _supla_int16_t getTemperatureBelowAlarm() const;
287 _supla_int16_t getTemperatureAboveAlarm() const;
288 _supla_int16_t getTemperatureAuxMinSetpoint() const;
289 _supla_int16_t getTemperatureAuxMaxSetpoint() const;
290
291 // Below methods check if specific function is supported by thermostat.
292 // Even if function is supported, it doesn't mean that new mode setting will
293 // be valid, becuase this depends on configured Function.
294 bool isHeatingAndCoolingSupported() const;
295 bool isHeatCoolSupported() const;
296 bool isFanSupported() const;
297 bool isDrySupported() const;
298
299 bool isHeatingSubfunction() const;
300 bool isCoolingSubfunction() const;
301
302 bool isFunctionSupported(_supla_int_t channelFunction) const;
303 bool isConfigValid(const TChannelConfig_HVAC *config) const;
304 bool isWeeklyScheduleValid(TChannelConfig_WeeklySchedule *newSchedule,
305 bool isAltWeeklySchedule = false) const;
306 bool isChannelThermometer(int16_t channelNo) const;
307 bool isChannelBinarySensor(int16_t channelNo) const;
308 bool isChannelHvac(int16_t channelNo) const;
309 bool isAlgorithmValid(unsigned _supla_int16_t algorithm) const;
310 bool areTemperaturesValid(const THVACTemperatureCfg *temperatures) const;
311 bool fixTempearturesConfig();
312
313 // Check if mode is supported by currently configured Function
314 bool isModeSupported(int mode) const;
315
316 static bool isTemperatureSetInStruct(const THVACTemperatureCfg *temperatures,
317 unsigned _supla_int_t index);
318 static _supla_int16_t getTemperatureFromStruct(
319 const THVACTemperatureCfg *temperatures, unsigned _supla_int_t index);
320 static void setTemperatureInStruct(THVACTemperatureCfg *temperatures,
321 unsigned _supla_int_t index,
322 _supla_int16_t temperature);
323 static void clearTemperatureInStruct(THVACTemperatureCfg *temperatures,
324 unsigned _supla_int_t index);
325
326 static int32_t getArrayIndex(int32_t bitIndex);
327
328 bool isTemperatureInMainConstrain(_supla_int16_t temperature) const;
329 bool isTemperatureInAuxConstrain(_supla_int16_t temperature) const;
330 bool isTemperatureFreezeProtectionValid(_supla_int16_t temperature) const;
331 bool isTemperatureHeatProtectionValid(_supla_int16_t temperature) const;
332 bool isTemperatureEcoValid(_supla_int16_t temperature) const;
333 bool isTemperatureComfortValid(_supla_int16_t temperature) const;
334 bool isTemperatureBoostValid(_supla_int16_t temperature) const;
335 bool isTemperatureHisteresisValid(_supla_int16_t temperature) const;
336 bool isTemperatureBelowAlarmValid(_supla_int16_t temperature) const;
337 bool isTemperatureAboveAlarmValid(_supla_int16_t temperature) const;
338 // validates temperature against current configuration
339 bool isTemperatureAuxMinSetpointValid(_supla_int16_t temperature) const;
340 // validates temperature against current configuration
341 bool isTemperatureAuxMaxSetpointValid(_supla_int16_t temperature) const;
342 bool isTemperatureInHeatCoolConstrain(_supla_int16_t tHeat,
343 _supla_int16_t tCool) const;
344
345 bool isTemperatureFreezeProtectionValid(
346 const THVACTemperatureCfg *temperatures) const;
347 bool isTemperatureHeatProtectionValid(
348 const THVACTemperatureCfg *temperatures) const;
349 bool isTemperatureEcoValid(const THVACTemperatureCfg *temperatures) const;
350 bool isTemperatureComfortValid(const THVACTemperatureCfg *temperatures) const;
351 bool isTemperatureBoostValid(const THVACTemperatureCfg *temperatures) const;
352 bool isTemperatureHisteresisValid(
353 const THVACTemperatureCfg *temperatures) const;
354 bool isTemperatureAuxHisteresisValid(
355 const THVACTemperatureCfg *temperatures) const;
356 bool isTemperatureBelowAlarmValid(
357 const THVACTemperatureCfg *temperatures) const;
358 bool isTemperatureAboveAlarmValid(
359 const THVACTemperatureCfg *temperatures) const;
360 // validates temperature against configuration send in parameter
361 bool isTemperatureAuxMinSetpointValid(
362 const THVACTemperatureCfg *temperatures) const;
363 // validates temperature against configuration send in parameter
364 bool isTemperatureAuxMaxSetpointValid(
365 const THVACTemperatureCfg *temperatures) const;
366
367 void clearChannelConfigChangedFlag();
368 void clearWeeklyScheduleChangedFlag();
369
370 int getWeeklyScheduleProgramId(const TChannelConfig_WeeklySchedule *schedule,
371 int index) const;
372 bool isProgramValid(const TWeeklyScheduleProgram &program,
373 bool isAltWeeklySchedule) const;
374
375 bool setProgram(int programId,
376 unsigned char mode,
377 _supla_int16_t tHeat,
378 _supla_int16_t tCool,
379 bool isAltWeeklySchedule = false);
380 // index is the number of quarter in week
381 bool setWeeklySchedule(int index,
382 int programId,
383 bool isAltWeeklySchedule = false);
384 // schedule internally works on 15 min intervals (quarters)
385 bool setWeeklySchedule(enum DayOfWeek dayOfWeek,
386 int hour,
387 int quarter,
388 int programId,
389 bool isAltWeeklySchedule = false);
390 int calculateIndex(enum DayOfWeek dayOfWeek, int hour, int quarter) const;
391 int getCurrentQuarter() const;
392 TWeeklyScheduleProgram getCurrentProgram() const;
393 int getCurrentProgramId() const;
394 TWeeklyScheduleProgram getProgramAt(int quarterIndex) const;
395 TWeeklyScheduleProgram getProgramById(int programId,
396 bool isAltWeeklySchedule = false) const;
397
398 void copyFixedChannelConfigTo(HvacBase *hvac) const;
399 void copyFullChannelConfigTo(TChannelConfig_HVAC *hvac) const;
400 void turnOn();
401 bool turnOnWeeklySchedlue();
402 void changeFunction(uint32_t newFunction, bool changedLocally);
403 _supla_int_t getChannelFunction();
404
405 void addPrimaryOutput(Supla::Control::OutputInterface *output);
406 void addSecondaryOutput(Supla::Control::OutputInterface *output);
407
408 bool isWeeklyScheduleEnabled() const;
409 void setWeeklyScheduleEnabled(bool enabled);
410 bool isWeeklyScheduleClockError() const;
411 void setWeeklyScheduleClockError(bool enabled);
412 bool isWeeklyScheduleTemporalOverride() const;
413 void setWeeklyScheduleTemporalOverride(bool enabled);
414 bool isWeeklyScheduleStartupDelay() const;
415 void setWeeklyScheduleStartupDelay(bool enabled);
416 int8_t getWeeklyScheduleLastProgramManualOverride() const;
417 void setWeeklyScheduleLastProgramManualOverride(int8_t programId);
418 uint8_t getWeeklyScheduleLastManualMode() const;
419 void setWeeklyScheduleLastManualMode(uint8_t mode);
420 void applyWeeklyScheduleSetpoints(int16_t tHeat, int16_t tCool);
421 bool isInitDone() const;
422 void setInitDone(bool enabled);
423
424 void enableDifferentialFunctionSupport();
425 bool isDifferentialFunctionSupported() const;
426 void enableDomesticHotWaterFunctionSupport();
427 bool isDomesticHotWaterFunctionSupported() const;
428
429 bool applyNewRuntimeSettings(int mode,
430 int16_t tHeat,
431 int16_t tCool,
432 int32_t durationSec = 0);
433
434 // keeps the temperature setpoints
435 bool applyNewRuntimeSettings(int mode, int32_t durationSec = 0);
436
437 _supla_int16_t getLastTemperature();
438
439 bool setBinarySensorChannelNo(int16_t channelNo);
440 int16_t getBinarySensorChannelNo() const;
441
442 static void debugPrintConfigStruct(const TChannelConfig_HVAC *config, int id);
443 static void debugPrintConfigDiff(const TChannelConfig_HVAC *configCurrent,
444 const TChannelConfig_HVAC *configNew,
445 int id);
446 static const char *temperatureName(int32_t index);
447 static void debugPrintProgram(const TWeeklyScheduleProgram *program, int id);
448
449 _supla_int16_t getPrimaryTemp();
450 _supla_int16_t getSecondaryTemp();
451
452 bool isWeelkySchedulManualOverrideMode() const;
453 void clearWaitingFlags();
454
455 void allowWrapAroundTemperatureSetpoints();
456
457 void enableInitialConfig();
458
459 // returns Linux timestamp in seconds when current countdown timer will end.
460 // It return 1 if countdown timer is not set
461 time_t getCountDownTimerEnds() const;
462 int32_t getRemainingCountDownTimeSec() const;
463 void stopCountDownTimer();
464
465 bool ignoreAggregatorForRelay(int32_t relayChannelNumber) const;
466 void setIgnoreDefaultPumpForAggregator(bool);
467 void setIgnoreDefaultHeatOrColdSourceForAggregator(bool);
468
469 bool isAltWeeklySchedulePossible() const;
470 void requestWeeklyScheduleResend(bool isAltWeeklySchedule = false,
471 bool localChange = false);
472
479 bool isHvacFlagForcedOffBySensor() const;
480
481 HvacParameterFlags parameterFlags = {};
482
483 friend class HvacWeeklySchedule;
484 protected:
485 ApplyConfigResult applyChannelConfig(TSD_ChannelConfig *config,
486 bool local) override;
487 // 0 = off, >= 1 enable heating, <= -1 enable cooling
488 void setOutput(int value, bool force = false);
489 void updateChannelState();
490 // Implement this method to apply additional validations and corrections
491 // to HVAC configuration. Return true when correction was done and it will
492 // be shared with server.
493 virtual bool applyAdditionalValidation(TChannelConfig_HVAC *hvacConfig);
494 // Runs after validation, before accepting/saving a server configuration.
495 // Remote regulators may submit device writes and retain confirmed fields
496 // in the snapshot while waiting for readback. The default accepts it.
497 // Set changed to true when modifying the snapshot; retain an existing true.
498 virtual ApplyConfigResult prepareChannelConfig(TChannelConfig_HVAC *config,
499 bool local, bool &changed);
500 // Import an observed remote configuration using native validation/storage.
501 bool importRemoteConfig(const TChannelConfig_HVAC &config, bool persist);
502 // Remote regulators drive expiry themselves, reusing native timer reports.
503 void setExternalCountdownTimer(time_t ends, const THVACValue &restore) {
504 countdownTimerEnds = ends;
505 lastWorkingMode = restore;
506 }
507 THVACValue getCountdownRestoreValue() const { return lastWorkingMode; }
508 void emitCountdownTimerActionIfNeeded();
509 virtual void fillDefaultWeeklySchedule(
510 TChannelConfig_WeeklySchedule *schedule, bool isAltWeeklySchedule);
511 void clearLastOutputValue();
512
513 private:
514 _supla_int16_t getTemperature(int channelNo);
515 // returns true if forced off should be set
516 bool getForcedOffSensorState();
517 bool isSensorTempValid(_supla_int16_t temperature) const;
518 bool isChannelRelay(int16_t channelNo) const;
519 bool checkOverheatProtection(_supla_int16_t t, _supla_int16_t tAux);
520 bool checkAntifreezeProtection(_supla_int16_t t, _supla_int16_t tAux);
521 bool isAuxMinLimitReached(_supla_int16_t tAux) const;
522 bool isAuxMaxLimitReached(_supla_int16_t tAux) const;
523 // This only handles normal auxiliary regulation. Its return value ends the
524 // normal-control phase, not the higher-priority protection/user handling.
525 bool checkAuxProtection(_supla_int16_t t);
526 bool isAuxProtectionEnabled() const;
527 bool processWeeklySchedule();
528 bool applyWeeklyScheduleProgram(const TWeeklyScheduleProgram &program,
529 int currentProgramId);
530 void setSetpointTemperaturesForCurrentMode(int16_t tHeat, int16_t tCool);
531 bool checkThermometersStatusForCurrentMode(_supla_int16_t t1,
532 _supla_int16_t t2) const;
533 int evaluateHeatOutputValue(_supla_int16_t tMeasured,
534 _supla_int16_t tTarget,
535 bool forAux = false);
536 int evaluateCoolOutputValue(_supla_int16_t tMeasured,
537 _supla_int16_t tTarget,
538 bool forAux = false);
539 void fixTemperatureSetpoints();
540 void storeLastWorkingMode();
541 void applyConfigWithoutValidation(const TChannelConfig_HVAC *hvacConfig);
542 int32_t channelFunctionToIndex(int32_t channelFunction) const;
543 void changeTemperatureSetpointsBy(int16_t tHeat, int16_t tCool);
544 void updateTimerValue();
545 void updateWeeklyScheduleConfigTypes();
546 bool isLocalConfigChangePending(int configType) const;
547 void persistChannelConfigChangeState();
548 bool fixReadonlyParameters(TChannelConfig_HVAC *hvacConfig);
549 bool fixReadonlyTemperature(int32_t temperatureIndex,
550 THVACTemperatureCfg *newTemp);
551
552 bool registerInAggregator(int16_t channelNo);
553 void unregisterInAggregator(int16_t channelNo);
554
555 int16_t getClosestValidTemperature(int16_t temperature) const;
556
557 TChannelConfig_HVAC config = {};
558 TChannelConfig_HVAC *initialConfig = nullptr;
559 HvacWeeklySchedule *weeklyScheduleHelper = nullptr;
560 // primaryOutput can be used for heating or cooling (cooling is supported
561 // when secondaryOutput is not used, in such case "AUTO" mode is not
562 // available)
563 Supla::Control::OutputInterface *primaryOutput = nullptr;
564 // secondaryOutput can be used only for cooling
565 Supla::Control::OutputInterface *secondaryOutput = nullptr;
566
567 THVACValue lastWorkingMode = {};
568
569 bool initDone = false;
570 bool serverChannelFunctionValid = true;
571 bool wrapAroundTemperatureSetpoints = false;
572 bool registeredInRelayHvacAggregator = false;
573 bool startupDelay = true;
574 bool forcedByAux = false;
575
576 uint8_t lastManualMode = 0;
577 uint8_t previousSubfunction = 0;
578 uint8_t defaultSubfunction = 0;
579 int16_t defaultMainThermometer = -1;
580 int16_t defaultAuxThermometer = -1;
581 int16_t defaultBinarySensor = -1;
582 int16_t defaultPumpSwitch = -1;
583 int16_t defaultHeatOrColdSourceSwitch = -1;
584 int16_t defaultMasterThermostat = -1;
585 int16_t defaultChannelsFlags = 0;
586
587 int8_t lastProgramManualOverride = -1;
588 int8_t lastValue = -111; // set out of output value range
589 uint8_t configFixAttempt = 0;
590
591 int16_t lastManualSetpointHeat = INT16_MIN;
592 int16_t lastManualSetpointCool = INT16_MIN;
593 int16_t lastTemperature = 0;
594 int16_t buttonTemperatureStep = 50; // 0.5 degrees
595
596 uint32_t lastConfigChangeTimestampMs = 0;
597 uint32_t lastIterateTimestampMs = 0;
598 uint32_t lastOutputStateChangeTimestampMs = 0;
599 uint32_t timerUpdateTimestamp = 0;
600 uint32_t lastCountdownTimerRemainingSec = UINT32_MAX;
601
602 time_t countdownTimerEnds = 1;
603
604 int16_t defaultTemperatureRoomMin[6] = {
605 500, // default min temperature for all other functions or when value is
606 // set to INT16_MIN
607 500, // HVAC_THERMOSTAT (heat or cool)
608 500, // AUTO
609 -5000, // DIFFERENTIAL
610 1000, // DOMESTIC_HOT_WATER
611 };
612 int16_t defaultTemperatureRoomMax[6] = {
613 4000, // default max temperature for all other functions or when value is
614 // set to INT16_MIN
615 4000, // HVAC_THERMOSTAT (heat or cool)
616 4000, // AUTO
617 5000, // DIFFERENTIAL
618 7500, // DOMESTIC_HOT_WATER
619 };
620 WeeklyScheduleComponents weeklyScheduleComponents;
621};
622
623} // namespace Control
624} // namespace Supla
625
626#endif // SRC_SUPLA_CONTROL_HVAC_BASE_H_
Definition SuplaDevice.h:167
Definition action_handler.h:8
Definition channel_element.h:15
Definition hvac_base.h:33
void onSaveState() override
Method called periodically during SuplaDevice iteration.
Definition hvac_base.cpp:371
void onLoadState() override
Second method called on element in SuplaDevice.begin().
Definition hvac_base.cpp:283
bool getRemainingCountdownTimerSec(uint32_t *remainingSec) const override
Returns remaining countdown timer time in seconds for an active HVAC countdown timer.
Definition hvac_base.cpp:4849
void handleSetChannelConfigResult(TSDS_SetChannelConfigResult *result) override
Handles "set channel config" reply from server.
Definition hvac_base.cpp:2612
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition hvac_base.cpp:551
void onLoadConfig(SuplaDeviceClass *) override
First method called on element in SuplaDevice.begin().
Definition hvac_base.cpp:235
bool iterateConnected() override
Method called on each SuplaDevice iteration when device is connected and registered to Supla server o...
Definition hvac_base.cpp:192
void handleChannelConfigFinished() override
Handles "channel config finished" message from server.
Definition hvac_base.cpp:509
int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override
Handles "new value" request from server.
Definition hvac_base.cpp:3305
uint8_t handleChannelConfig(TSD_ChannelConfig *config, bool local=false) override
Handles "set channel config" request from server.
Definition hvac_base.cpp:894
void onRegistered(Supla::Protocol::SuplaSrpc *suplaSrpc) override
Method called each time when device successfully registers to Supla server.
Definition hvac_base.cpp:493
bool isHvacFlagForcedOffBySensor() const
Returns true if thermostat output is disabled by binary sensor state (i.e.
Definition hvac_base.cpp:5980
void onInit() override
Third method called on element in SuplaDevice.begin()
Definition hvac_base.cpp:399
void purgeConfig() override
Removes all configration data related to the element from Storage::Config.
Definition hvac_base.cpp:5756
Definition hvac_weekly_schedule.h:19
Definition output_interface.h:11
Definition weekly_schedule_component.h:130
Definition weekly_schedule_component.h:114
Definition weekly_schedule_component.h:55
Definition weekly_schedule_component.h:34
Definition supla_srpc.h:47
Definition proto.h:3481
Definition proto.h:3540
Definition proto.h:3276
Definition proto.h:2600
Definition proto.h:931
Definition proto.h:3192
Definition proto.h:3176
Definition proto.h:1243
Definition proto.h:3253