supla-device
Loading...
Searching...
No Matches
roller_shutter_interface.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_ROLLER_SHUTTER_INTERFACE_H_
5#define SRC_SUPLA_CONTROL_ROLLER_SHUTTER_INTERFACE_H_
6
7#include "../action_handler.h"
8#include "../channel_element.h"
9
10#define UNKNOWN_POSITION -1
11#define STOP_POSITION -2
12#define MOVE_UP_POSITION -3
13#define MOVE_DOWN_POSITION -4
14#define STOP_REQUEST -5
15#define RS_DEFAULT_OPERATION_TIMEOUT_MS 60000
16#define RS_MAX_OPERATION_TIME_MS 600000 // Max opening/closing/tilting time
17
18namespace Supla {
19
20namespace Control {
21
22bool isValidTiltControlType(uint32_t type);
23constexpr uint32_t MAX_TILT_ANGLE_DEGREES = 180;
24bool isValidTiltAngle(uint32_t angle);
25bool requiresSeparateTiltPhase(uint8_t type);
26bool isValidFacadeBlindTiming(uint8_t type,
27 uint32_t openingTimeMs,
28 uint32_t closingTimeMs,
29 uint32_t tiltingTimeMs);
30
31class Button;
32
33enum class Directions : uint8_t { STOP_DIR = 0, DOWN_DIR = 1, UP_DIR = 2 };
34
35#pragma pack(push, 1)
37 uint8_t motorUpsideDown = 1; // 0 - not set/not used, 1 - false, 2 - true
38 uint8_t buttonsUpsideDown = 1; // 0 - not set/not used, 1 - false, 2 - true
39 int8_t timeMargin = -1; // -1 default (device specific), 0 - not set/not used
40 // 1 - no margin,
41 // > 1 - 51% of opening/closing time added on extreme
42 // positions - value should be decremented by 1.
43 uint8_t visualizationType = 0; // 0 - default, other values depends on
44 // Cloud and App support
45};
46
47struct TiltConfig {
48 uint32_t tiltingTime = 0;
49 uint16_t tilt0Angle = 0; // 0 - 180 - degree corresponding to tilt 0
50 uint16_t tilt100Angle = 0; // 0 - 180 - degree corresponding to tilt 100
51 uint8_t tiltControlType =
52 SUPLA_TILT_CONTROL_TYPE_UNKNOWN; // SUPLA_TILT_CONTROL_TYPE_
53
54 void clear();
55};
56#pragma pack(pop)
57
59 public:
70 explicit RollerShutterInterface(bool tiltFunctionsEnabled = false);
71
76
78 RollerShutterInterface &operator=(const RollerShutterInterface &) = delete;
79
89 void addTiltFunctions();
90
96 bool isTiltFunctionsSupported() const;
97
103 bool isTiltFunctionEnabled() const;
104
111 bool isTiltConfigured() const;
112
114 bool canExecuteTiltOnlyCommand(int tilt) const;
115
121 bool isTopReached() const;
122
128 bool isBottomReached() const;
129
130 int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override;
131 void handleAction(int event, int action) override;
132 int handleCalcfgFromServer(TSD_DeviceCalCfgRequest *request) override;
133 Supla::ApplyConfigResult applyChannelConfig(TSD_ChannelConfig *result,
134 bool local = false) override;
135 void fillChannelConfig(void *channelConfig,
136 int *size,
137 uint8_t configType) override;
138
139 // Method is used by external integrations to prepare TSD_SuplaChannelNewValue
140 // value for specific channel type (i.e. to prefill durationMS field when
141 // required)
143
144 virtual void close(); // Sets target position to 100%
145 virtual void open(); // Sets target position to 0%
146 virtual void stop(); // Stop motor
147 virtual void moveUp(); // start opening roller shutter regardless of its
148 // position (keep motor going up)
149 virtual void moveDown(); // starts closing roller shutter regardless of its
150 // position (keep motor going down)
151
152 virtual void setTargetPosition(int newPosition,
153 int newTilt = UNKNOWN_POSITION);
161 void setCurrentPosition(int newPosition, int newTilt = UNKNOWN_POSITION);
162 void setNotCalibrated();
163 // Sets calibration ongoing flag, by setting calibration timeout.
164 // calibrationTime = 1 is used to indicate ongoing calibration for
165 // devices without explicit calibration time setting
166 void setCalibrationOngoing(int calibrationTime = 1);
167 void setCalibrationFinished();
168
174 int getCurrentPosition() const;
175
182 int getCurrentTilt() const;
183
190 int getTargetPosition() const;
191
198 int getTargetTilt() const;
199
205 int getCurrentDirection() const;
206
207 void configComfortUpValue(uint8_t position);
208 void configComfortDownValue(uint8_t position);
209 void configComfortUpTiltValue(uint8_t position);
210 void configComfortDownTiltValue(uint8_t position);
211
212 void onInit() override;
213 void onLoadConfig(SuplaDeviceClass *sdc) override;
214 void saveConfig();
215 void onLoadState() override;
216 void onSaveState() override;
217 void purgeConfig() override;
218 void iterateAlways() override;
219
220 uint32_t getClosingTimeMs() const;
221 uint32_t getOpeningTimeMs() const;
222 uint32_t getTiltingTimeMs() const;
223 uint32_t getTiltControlType() const;
224
225 void attach(Supla::Control::Button *up, Supla::Control::Button *down);
226 void attach(Supla::Control::Button *button, bool upButton, bool asInternal);
227
228 virtual void triggerCalibration();
229 void setCalibrationNeeded();
230 bool isCalibrationRequested() const;
231 bool isCalibrated() const;
232
240 void setRsConfigMotorUpsideDownEnabled(bool enable);
241
249 void setRsConfigButtonsUpsideDownEnabled(bool enable);
250
258 void setRsConfigTimeMarginEnabled(bool enable);
259
266 void setRsConfigMotorUpsideDownValue(uint8_t value);
267
274 void setRsConfigButtonsUpsideDownValue(uint8_t value);
275
284 void setRsConfigTimeMarginValue(int8_t value);
285
286 uint8_t getMotorUpsideDown() const;
287 uint8_t getButtonsUpsideDown() const;
288 int8_t getTimeMargin() const;
289
290 static void setRsStorageSaveDelay(int delayMs);
291
292 virtual bool inMove();
293 virtual bool isCalibrationInProgress() const;
294 void startCalibration(uint32_t timeMs);
295 void stopCalibration();
296 bool isCalibrationFailed() const;
297 bool isCalibrationLost() const;
298 bool isMotorProblem() const;
299
300 bool isFunctionSupported(int32_t channelFunction) const;
301 bool isAutoCalibrationSupported() const;
302
303 void setOpenCloseTime(uint32_t newClosingTimeMs, uint32_t newOpeningTimeMs);
304 void setTiltingTime(uint32_t newTiltingTimeMs, bool local = true);
305 void setTiltControlType(uint8_t newTiltControlType, bool local = true);
306 bool applyFacadeBlindTimingConfig(uint32_t openingTimeMs,
307 uint32_t closingTimeMs,
308 uint32_t tiltingTimeMs,
309 uint32_t tiltControlType,
310 bool local = true);
311
312 void setCalibrationFailed(bool value);
313 void setCalibrationLost(bool value);
314 void setMotorProblem(bool value);
315
316 private:
317 void clearTiltConfig();
318
319 protected:
320 RollerShutterInterface(bool tiltFunctionsEnabled,
321 Supla::Channel &externalChannel,
322 ElementMode mode);
323 void loadRollerShutterConfigOnly();
324 void validateTiltConfigAfterLoad();
325 void purgeRollerShutterConfigOnly();
326
328 Supla::Control::Button *button = nullptr;
329 bool asInternal = true;
330 bool upButton = true;
331 ButtonListElement *next = nullptr;
332 };
333
343 bool upButton, bool asInternal);
344
345
346 bool lastDirectionWasOpen() const;
347 bool lastDirectionWasClose() const;
348
349 // returns true, when opening/closing time is setable from config
350 bool isTimeSettingAvailable() const;
351 bool getCalibrate() const;
352 void setCalibrate(bool value);
353
354 void printConfig() const;
355 uint32_t getTimeMarginValue(uint32_t fullTime) const;
356 void logIgnoredTiltOnlyCommand(int tilt);
357
358 uint8_t flags = 0;
359
360 uint8_t comfortDownValue = 20;
361 uint8_t comfortUpValue = 80;
362 uint8_t comfortUpTiltValue = 0;
363 uint8_t comfortDownTiltValue = 100;
364
365 Directions currentDirection = Directions::STOP_DIR; // stop, up, down
366 Directions lastDirection = Directions::STOP_DIR;
367
368 int16_t currentPosition =
369 UNKNOWN_POSITION; // 0 - open; 10000 - closed, in 0.01 units
370 int16_t currentTilt =
371 UNKNOWN_POSITION; // 0 - opening position
372 // 10000 - closing position, in 0.01 units
373 int8_t targetPosition = STOP_POSITION; // 0-100
374 int8_t targetTilt = UNKNOWN_POSITION; // 0-100
375 int16_t lastPositionBeforeMovement = UNKNOWN_POSITION; // 0-100
376 int16_t lastTiltBeforeMovement = UNKNOWN_POSITION; // 0-100
377 bool newTargetPositionAvailable = false;
378 bool invalidTiltOnlyCommandWarningLogged = false;
379
380 RollerShutterConfig rsConfig;
381 TiltConfig tiltConfig;
382
383 ButtonListElement *buttonList = nullptr;
384
385 uint32_t closingTimeMs = 0;
386 uint32_t openingTimeMs = 0;
387 // Calibration time may be used also as indication of ongoing calibration,
388 // but without information about calibration lenght. In general:
389 // calibrationTime > 0 means that there is ongoing calibration
390 uint32_t calibrationTime = 0;
391 uint32_t lastUpdateTime = 0;
392 bool rollerShutterStateLoaded = false;
393
394 static int16_t rsStorageSaveDelay;
395};
396
397} // namespace Control
398} // namespace Supla
399
400
401#endif // SRC_SUPLA_CONTROL_ROLLER_SHUTTER_INTERFACE_H_
Definition SuplaDevice.h:167
Definition action_handler.h:8
Definition channel_element.h:15
Definition channel.h:20
Definition button.h:21
Definition roller_shutter_interface.h:58
bool isTiltFunctionsSupported() const
Check if tilt functions are supported.
Definition roller_shutter_interface.cpp:1551
void onLoadState() override
Second method called on element in SuplaDevice.begin().
Definition roller_shutter_interface.cpp:758
int getTargetTilt() const
Get target tilt position.
Definition roller_shutter_interface.cpp:869
int getCurrentPosition() const
Get current roller shutter position.
Definition roller_shutter_interface.cpp:851
void setRsConfigTimeMarginEnabled(bool enable)
Enable/disable time margin configuration option.
Definition roller_shutter_interface.cpp:1348
void setRsConfigButtonsUpsideDownValue(uint8_t value)
Set buttons upside down value.
Definition roller_shutter_interface.cpp:1410
void setupButtonActions(Supla::Control::Button *button, bool upButton, bool asInternal)
Configure additional buttons for roller shutter.
Definition roller_shutter_interface.cpp:1481
int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override
Handles "new value" request from server.
Definition roller_shutter_interface.cpp:193
void purgeConfig() override
Removes all configration data related to the element from Storage::Config.
Definition roller_shutter_interface.cpp:1424
int getCurrentDirection() const
Get current roller shutter movement direction.
Definition roller_shutter_interface.cpp:876
void setRsConfigTimeMarginValue(int8_t value)
Set time margin value.
Definition roller_shutter_interface.cpp:1417
bool isTiltFunctionEnabled() const
Check if tilt function is currently enabled.
Definition roller_shutter_interface.cpp:1556
void onInit() override
Third method called on element in SuplaDevice.begin()
Definition roller_shutter_interface.cpp:173
RollerShutterInterface(bool tiltFunctionsEnabled=false)
Constructor.
Definition roller_shutter_interface.cpp:94
bool canExecuteTiltOnlyCommand(int tilt) const
Check whether a tilt-only target can be executed safely.
Definition roller_shutter_interface.cpp:1579
bool isBottomReached() const
Check if bottom position (and tilt if applicable) is reached.
Definition roller_shutter_interface.cpp:1601
bool isTopReached() const
Check if top position (and tilt if applicable) is reached.
Definition roller_shutter_interface.cpp:1595
void onSaveState() override
Method called periodically during SuplaDevice iteration.
Definition roller_shutter_interface.cpp:833
void setCurrentPosition(int newPosition, int newTilt=UNKNOWN_POSITION)
Set current roller shutter/facade blind position (and tilt) (0 = open; 100 = closed)
Definition roller_shutter_interface.cpp:552
void setRsConfigMotorUpsideDownValue(uint8_t value)
Set motor upside down value.
Definition roller_shutter_interface.cpp:1403
void fillSuplaChannelNewValue(TSD_SuplaChannelNewValue *value) override
Fills TSD_SuplaChannelNewValue based on current state.
Definition roller_shutter_interface.cpp:1376
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition roller_shutter_interface.cpp:702
void onLoadConfig(SuplaDeviceClass *sdc) override
First method called on element in SuplaDevice.begin().
Definition roller_shutter_interface.cpp:1136
int getCurrentTilt() const
Get current tilt position.
Definition roller_shutter_interface.cpp:858
void setRsConfigButtonsUpsideDownEnabled(bool enable)
Enable/disable buttons upside down configuration option.
Definition roller_shutter_interface.cpp:1338
void setRsConfigMotorUpsideDownEnabled(bool enable)
Enable/disable motor upside down configuration option.
Definition roller_shutter_interface.cpp:1328
int getTargetPosition() const
Get target roller shutter position.
Definition roller_shutter_interface.cpp:865
void addTiltFunctions()
Add tilt functions (facade blinds, vertical blinds) Changing of tilt functions will breake state stor...
Definition roller_shutter_interface.cpp:1545
virtual ~RollerShutterInterface()
Destructor.
Definition roller_shutter_interface.cpp:128
int handleCalcfgFromServer(TSD_DeviceCalCfgRequest *request) override
Handles CALCFG requests from server.
Definition roller_shutter_interface.cpp:935
bool isTiltConfigured() const
Check if tilting is configured (time and control modes are set and isTiltFunctionEnabled is true)
Definition roller_shutter_interface.cpp:1569
Definition roller_shutter_interface.h:36
Definition roller_shutter_interface.h:327
Definition roller_shutter_interface.h:47
Definition proto.h:3159
Definition proto.h:2315
Definition proto.h:1228