8 #ifndef _SINRICDEVICE_H_
9 #define _SINRICDEVICE_H_
11 #include "SinricProDeviceInterface.h"
12 #include "LeakyBucket.h"
25 SinricProDevice(
const char* newDeviceId,
unsigned long eventWaitTime=100);
27 virtual const char* getDeviceId();
28 virtual String getProductType();
29 virtual void begin(SinricProInterface* eventSender);
30 virtual void setEventWaitTime(
unsigned long eventWaitTime) {
if (eventWaitTime<100) {this->eventWaitTime=100;}
else { this->eventWaitTime=eventWaitTime;} }
50 virtual bool handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value);
59 virtual bool sendEvent(JsonDocument& event);
60 virtual DynamicJsonDocument prepareEvent(
const char* deviceId,
const char* action,
const char* cause);
61 unsigned long getTimestamp();
65 T limitValue(T value, T minValue, T maxValue);
67 SinricProInterface* eventSender;
68 unsigned long eventWaitTime;
69 std::map<String, LeakyBucket_t> eventFilter;
72 SinricProDevice::SinricProDevice(
const char* newDeviceId,
unsigned long eventWaitTime) :
73 powerStateCallback(nullptr),
75 eventWaitTime(eventWaitTime) {
76 deviceId = strdup(newDeviceId);
77 if (this->eventWaitTime < 100) this->eventWaitTime = 100;
80 SinricProDevice::~SinricProDevice() {
81 if (deviceId) free(deviceId);
84 void SinricProDevice::begin(SinricProInterface* eventSender) {
85 this->eventSender = eventSender;
88 const char* SinricProDevice::getDeviceId() {
92 bool SinricProDevice::handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value) {
93 if (strcmp(deviceId, this->deviceId) != 0)
return false;
94 DEBUG_SINRIC(
"SinricProDevice::handleRequest()\r\n");
96 String actionString = String(action);
98 if (actionString ==
"setPowerState" && powerStateCallback) {
99 bool powerState = request_value[
"state"]==
"On"?
true:
false;
100 success = powerStateCallback(String(deviceId), powerState);
101 response_value[
"state"] = powerState?
"On":
"Off";
107 DynamicJsonDocument SinricProDevice::prepareEvent(
const char* deviceId,
const char* action,
const char* cause) {
108 if (eventSender)
return eventSender->prepareEvent(deviceId, action, cause);
109 DEBUG_SINRIC(
"[SinricProDevice:prepareEvent()]: Device \"%s\" isn't configured correctly! The \'%s\' event will be ignored.\r\n", deviceId, action);
110 return DynamicJsonDocument(1024);
114 bool SinricProDevice::sendEvent(JsonDocument& event) {
115 String eventName =
event[
"payload"][
"action"] |
"";
117 LeakyBucket_t bucket;
120 if (eventFilter.find(eventName) == eventFilter.end()) {
121 eventFilter[eventName] = bucket;
123 bucket = eventFilter[eventName];
126 if (bucket.addDrop()) {
127 if (eventSender) eventSender->sendMessage(event);
128 eventFilter[eventName] = bucket;
132 eventFilter[eventName] = bucket;
136 unsigned long SinricProDevice::getTimestamp() {
137 if (eventSender)
return eventSender->getTimestamp();
141 template <
typename T>
142 T SinricProDevice::limitValue(T value, T minValue, T maxValue) {
144 if (value > maxValue) newValue = maxValue;
145 if (value < minValue) newValue = minValue;
157 powerStateCallback = cb;
170 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setPowerState", cause.c_str());
171 JsonObject event_value = eventMessage[
"payload"][
"value"];
172 event_value[
"state"] = state?
"On":
"Off";
173 return sendEvent(eventMessage);
176 String SinricProDevice::getProductType() {
177 return String(
"sinric.device.type.");