SinricPro Library
SinricProBlinds.h
1 /*
2  * Copyright (c) 2019 Sinric. All rights reserved.
3  * Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
4  *
5  * This file is part of the Sinric Pro (https://github.com/sinricpro/)
6  */
7 
8 #ifndef _SINRICBLINDS_H_
9 #define _SINRICBLINDS_H_
10 
11 #include "SinricProDevice.h"
12 
23  public:
24  SinricProBlinds(const DeviceId &deviceId);
25  String getProductType() { return SinricProDevice::getProductType() + String("BLIND"); }
26 
40  typedef std::function<bool(const String&, int&)> SetPositionCallback;
41 
56  typedef std::function<bool(const String&, int&)> AdjustPositionCallback;
57 
60 
61  bool sendPositionEvent(int position, String cause = "PHYSICAL_INTERACTION");
62  // handle
63  bool handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
64  private:
65  SetPositionCallback setPositionCallback;
66  AdjustPositionCallback adjustPositionCallback;
67 };
68 
69 SinricProBlinds::SinricProBlinds(const DeviceId &deviceId) : SinricProDevice(deviceId),
70  setPositionCallback(nullptr),
71  adjustPositionCallback(nullptr) {
72 }
73 
74 bool SinricProBlinds::handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) {
75  if (deviceId != this->deviceId) return false;
76  if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value)) return true;
77 
78  bool success = false;
79  String actionString = String(action);
80 
81  if (actionString == "setRangeValue" && setPositionCallback) {
82  int position = request_value["rangeValue"] | 0;
83  success = setPositionCallback(deviceId, position);
84  response_value["rangeValue"] = limitValue(position, 0, 100);
85  return success;
86  }
87 
88  if (actionString == "adjustRangeValue" && adjustPositionCallback) {
89  int positionDelta = request_value["rangeValueDelta"] | 0;
90  success = adjustPositionCallback(deviceId, positionDelta);
91  response_value["rangeValue"] = limitValue(positionDelta, 0, 100);
92  return success;
93  }
94 
95  return success;
96 }
97 
106  setPositionCallback = cb;
107 }
108 
117  adjustPositionCallback = cb;
118 }
119 
128 bool SinricProBlinds::sendPositionEvent(int position, String cause) {
129  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setRangeValue", cause.c_str());
130  JsonObject event_value = eventMessage["payload"]["value"];
131  event_value["rangeValue"] = position;
132  return sendEvent(eventMessage);
133 }
134 
135 #endif
136 
SinricProBlinds::SetPositionCallback
std::function< bool(const String &, int &)> SetPositionCallback
Callback definition for onSetPosition function.
Definition: SinricProBlinds.h:40
SinricProBlinds::AdjustPositionCallback
std::function< bool(const String &, int &)> AdjustPositionCallback
Callback definition for onAdjustPosition function.
Definition: SinricProBlinds.h:56
SinricProBlinds
Device to control interior blinds.
Definition: SinricProBlinds.h:22
SinricProBlinds::sendPositionEvent
bool sendPositionEvent(int position, String cause="PHYSICAL_INTERACTION")
Send setPosition event to update actual position on SinricPro Server.
Definition: SinricProBlinds.h:128
SinricProBlinds::onSetPosition
void onSetPosition(SetPositionCallback cb)
Set callback function for setPosition request.
Definition: SinricProBlinds.h:105
SinricProBlinds::onAdjustPosition
void onAdjustPosition(AdjustPositionCallback cb)
Set callback function for adjustPosition request.
Definition: SinricProBlinds.h:116
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:24