SinricPro Library
DoorController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
9 
10 FSTR(DOOR, setMode); // "setMode"
11 FSTR(DOOR, mode); // "mode"
12 FSTR(DOOR, Close); // "Close"
13 FSTR(DOOR, Open); // "Open"
14 
15 
29 using DoorCallback = std::function<bool(const String &, bool &)>;
30 
35 template <typename T>
37  public:
39 
41  bool sendDoorStateEvent(bool state, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
42 
43  protected:
44  bool handleDoorController(SinricProRequest &request);
45 
46  private:
47  EventLimiter event_limiter;
48  DoorCallback doorCallback;
49 };
50 
51 template <typename T>
53 : event_limiter(EVENT_LIMIT_STATE) {
54  T* device = static_cast<T*>(this);
55  device->registerRequestHandler(std::bind(&DoorController<T>::handleDoorController, this, std::placeholders::_1));
56 }
57 
65 template <typename T>
66 void DoorController<T>::onDoorState(DoorCallback cb) { doorCallback = cb; }
67 
77 template <typename T>
78 bool DoorController<T>::sendDoorStateEvent(bool state, String cause) {
79  if (event_limiter) return false;
80  T* device = static_cast<T*>(this);
81 
82  JsonDocument eventMessage = device->prepareEvent(FSTR_DOOR_setMode, cause.c_str());
83  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
84  state ? event_value[FSTR_DOOR_mode] = FSTR_DOOR_Close : event_value[FSTR_DOOR_mode] = FSTR_DOOR_Open;
85  return device->sendEvent(eventMessage);
86 }
87 
88 template <typename T>
89 bool DoorController<T>::handleDoorController(SinricProRequest &request) {
90  T* device = static_cast<T*>(this);
91 
92  bool success = false;
93  if (request.action == FSTR_DOOR_setMode && doorCallback) {
94  String mode = request.request_value[FSTR_DOOR_mode] | "";
95  bool state = mode == FSTR_DOOR_Close;
96  success = doorCallback(device->deviceId, state);
97  request.response_value[FSTR_DOOR_mode] = state ? FSTR_DOOR_Close : FSTR_DOOR_Open;
98  }
99  return success;
100 }
101 
102 } // SINRICPRO_NAMESPACE
103 
104 template <typename T>
105 using DoorController = SINRICPRO_NAMESPACE::DoorController<T>;
DoorController - only used for GarageDoor device and cannot used as capability for a custom device!
Definition: DoorController.h:36
bool sendDoorStateEvent(bool state, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send DoorState event to update actual door state on SinricPro Server.
Definition: DoorController.h:78
void onDoorState(DoorCallback cb)
Set callback function for onDoorState request.
Definition: DoorController.h:66
std::function< bool(const String &, bool &)> DoorCallback
Callback definition for onDoorState function.
Definition: DoorController.h:29