SinricPro Library
PowerStateController.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(POWERSTATE, state); // "state"
11 FSTR(POWERSTATE, On); // "On"
12 FSTR(POWERSTATE, Off); // "Off"
13 FSTR(POWERSTATE, setPowerState); // "setPowerState"
14 
28 using PowerStateCallback = std::function<bool(const String &, bool &)>;
29 
30 
35 template <typename T>
37  public:
39 
41  bool sendPowerStateEvent(bool state, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
42 
43  protected:
44  bool handlePowerStateController(SinricProRequest &request);
45 
46  private:
47  EventLimiter event_limiter;
48  PowerStateCallback powerStateCallback;
49 };
50 
51 template <typename T>
53 : event_limiter(EVENT_LIMIT_STATE) {
54  T* device = static_cast<T*>(this);
55  device->registerRequestHandler(std::bind(&PowerStateController<T>::handlePowerStateController, this, std::placeholders::_1));
56 }
57 
65 template <typename T>
67  powerStateCallback = cb;
68 }
69 
79 template <typename T>
80 bool PowerStateController<T>::sendPowerStateEvent(bool state, String cause) {
81  if (event_limiter) return false;
82  T* device = static_cast<T*>(this);
83 
84  JsonDocument eventMessage = device->prepareEvent(FSTR_POWERSTATE_setPowerState, cause.c_str());
85  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
86  event_value[FSTR_POWERSTATE_state] = state ? FSTR_POWERSTATE_On : FSTR_POWERSTATE_Off;
87  return device->sendEvent(eventMessage);
88 }
89 
90 template <typename T>
91 bool PowerStateController<T>::handlePowerStateController(SinricProRequest &request) {
92  T* device = static_cast<T*>(this);
93 
94  bool success = false;
95 
96  if (request.action == FSTR_POWERSTATE_setPowerState && powerStateCallback) {
97  bool powerState = request.request_value[FSTR_POWERSTATE_state] == FSTR_POWERSTATE_On ? true : false;
98  success = powerStateCallback(device->deviceId, powerState);
99  request.response_value[FSTR_POWERSTATE_state] = powerState ? FSTR_POWERSTATE_On : FSTR_POWERSTATE_Off;
100  return success;
101  }
102  return success;
103 }
104 
105 } // SINRICPRO_NAMESPACE
106 
107 template <typename T>
108 using PowerStateController = SINRICPRO_NAMESPACE::PowerStateController<T>;
PowerStateController.
Definition: PowerStateController.h:36
void onPowerState(PowerStateCallback cb)
Set callback function for powerState request.
Definition: PowerStateController.h:66
bool sendPowerStateEvent(bool state, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send setPowerState event to SinricPro Server indicating actual power state.
Definition: PowerStateController.h:80
std::function< bool(const String &, bool &)> PowerStateCallback
Callback definition for onPowerState function.
Definition: PowerStateController.h:28