8 #ifndef _SINRICDEVICE_H_
9 #define _SINRICDEVICE_H_
11 #include "SinricProDeviceInterface.h"
12 #include "LeakyBucket.h"
13 #include "SinricProId.h"
28 virtual DeviceId getDeviceId();
29 virtual String getProductType();
30 virtual void begin(SinricProInterface* eventSender);
50 virtual bool handleRequest(
const DeviceId &deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value);
59 virtual bool sendEvent(JsonDocument& event);
60 virtual DynamicJsonDocument prepareEvent(
const DeviceId &deviceId,
const char* action,
const char* cause);
61 unsigned long getTimestamp();
65 T limitValue(T value, T minValue, T maxValue);
67 SinricProInterface* eventSender;
68 std::map<String, LeakyBucket_t> eventFilter;
71 SinricProDevice::SinricProDevice(
const DeviceId &deviceId) :
73 powerStateCallback(nullptr),
74 eventSender(nullptr) {
77 SinricProDevice::~SinricProDevice() {
80 void SinricProDevice::begin(SinricProInterface* eventSender) {
81 this->eventSender = eventSender;
84 DeviceId SinricProDevice::getDeviceId() {
88 bool SinricProDevice::handleRequest(
const DeviceId &deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value) {
89 if (deviceId != this->deviceId)
return false;
90 DEBUG_SINRIC(
"SinricProDevice::handleRequest()\r\n");
92 String actionString = String(action);
94 if (actionString ==
"setPowerState" && powerStateCallback) {
95 bool powerState = request_value[
"state"]==
"On"?
true:
false;
96 success = powerStateCallback(deviceId, powerState);
97 response_value[
"state"] = powerState?
"On":
"Off";
103 DynamicJsonDocument SinricProDevice::prepareEvent(
const DeviceId &deviceId,
const char* action,
const char* cause) {
104 if (eventSender)
return eventSender->prepareEvent(deviceId, action, cause);
105 DEBUG_SINRIC(
"[SinricProDevice:prepareEvent()]: Device \"%s\" isn't configured correctly! The \'%s\' event will be ignored.\r\n", deviceId.toString().c_str(), action);
106 return DynamicJsonDocument(1024);
110 bool SinricProDevice::sendEvent(JsonDocument& event) {
111 if (!eventSender)
return false;
112 if (!eventSender->isConnected()) {
113 DEBUG_SINRIC(
"[SinricProDevice::sendEvent]: The event could not be sent. No connection to the SinricPro server.\r\n");
116 String eventName =
event[
"payload"][
"action"] |
"";
118 LeakyBucket_t bucket;
121 if (eventFilter.find(eventName) == eventFilter.end()) {
122 eventFilter[eventName] = bucket;
124 bucket = eventFilter[eventName];
127 if (bucket.addDrop()) {
128 eventSender->sendMessage(event);
129 eventFilter[eventName] = bucket;
133 eventFilter[eventName] = bucket;
137 unsigned long SinricProDevice::getTimestamp() {
138 if (eventSender)
return eventSender->getTimestamp();
142 template <
typename T>
143 T SinricProDevice::limitValue(T value, T minValue, T maxValue) {
145 if (value > maxValue) newValue = maxValue;
146 if (value < minValue) newValue = minValue;
158 powerStateCallback = cb;
171 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setPowerState", cause.c_str());
172 JsonObject event_value = eventMessage[
"payload"][
"value"];
173 event_value[
"state"] = state?
"On":
"Off";
174 return sendEvent(eventMessage);
177 String SinricProDevice::getProductType() {
178 return String(
"sinric.device.type.");