SinricPro Library
Loading...
Searching...
No Matches
SettingController.h
1#pragma once
2
3#include <variant>
4
5#include "../SinricProRequest.h"
6#include "../SinricProStrings.h"
7#include "../EventLimiter.h"
8
9#include "../SinricProNamespace.h"
10namespace SINRICPRO_NAMESPACE {
11
12FSTR(SETTING, setSetting); // "setSetting"
13FSTR(SETTING, id); // "id"
14FSTR(SETTING, value); // "value"
15
19using SettingValue = std::variant<int, float, bool, String>;
20
21using SetSettingCallback = std::function<bool(const String&, const String&, SettingValue&)>;
22
23template <typename T>
24class SettingController {
25 public:
26 SettingController();
27 void onSetSetting(SetSettingCallback cb);
28 bool sendSettingEvent(String settingId, SettingValue settingValue, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
29
30 protected:
31 bool handleSettingController(SinricProRequest &request);
32
33 private:
34 EventLimiter event_limiter;
35 SetSettingCallback setSettingCallback;
36};
37
38template <typename T>
39SettingController<T>::SettingController()
40: event_limiter(EVENT_LIMIT_STATE) {
41 T* device = static_cast<T*>(this);
42 device->registerRequestHandler(std::bind(&SettingController<T>::handleSettingController, this, std::placeholders::_1));
43}
44
45template <typename T>
46void SettingController<T>::onSetSetting(SetSettingCallback cb) {
47 setSettingCallback = cb;
48}
49
60template <typename T>
61bool SettingController<T>::sendSettingEvent(String settingId, SettingValue settingValue, String cause) {
62 if (event_limiter) return false;
63 T* device = static_cast<T*>(this);
64
65 JsonDocument eventMessage = device->prepareEvent(FSTR_SETTING_setSetting, cause.c_str());
66 JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
67 eventMessage[FSTR_SINRICPRO_scope] = FSTR_SINRICPRO_device;
68 event_value[FSTR_SETTING_id] = settingId;
69
70 if (std::holds_alternative<int>(settingValue)) {
71 event_value[FSTR_SETTING_value] = std::get<int>(settingValue);
72 } else if (std::holds_alternative<float>(settingValue)) {
73 event_value[FSTR_SETTING_value] = std::get<float>(settingValue);
74 } else if (std::holds_alternative<bool>(settingValue)) {
75 event_value[FSTR_SETTING_value] = std::get<bool>(settingValue);
76 } else if (std::holds_alternative<String>(settingValue)) {
77 event_value[FSTR_SETTING_value] = std::get<String>(settingValue);
78 }
79
80 return device->sendEvent(eventMessage);
81}
82
83template <typename T>
84bool SettingController<T>::handleSettingController(SinricProRequest &request) {
85 T* device = static_cast<T*>(this);
86
87 bool success = false;
88
89 if (setSettingCallback && request.action == FSTR_SETTING_setSetting) {
90 String settingId = request.request_value[FSTR_SETTING_id] | "";
91 JsonVariant valueVariant = request.request_value[FSTR_SETTING_value];
92
93 SettingValue settingValue;
94
95 if (valueVariant.is<bool>()) {
96 settingValue = valueVariant.as<bool>();
97 } else if (valueVariant.is<float>()) {
98 settingValue = valueVariant.as<float>();
99 } else if (valueVariant.is<int>()) {
100 settingValue = valueVariant.as<int>();
101 } else if (valueVariant.is<JsonObject>()) {
102 String jsonString;
103 serializeJson(valueVariant, jsonString);
104 settingValue = jsonString;
105 } else if (valueVariant.is<const char*>()) {
106 settingValue = String(valueVariant.as<const char*>());
107 }
108
109 success = setSettingCallback(device->deviceId, settingId, settingValue);
110
111 request.response_value[FSTR_SETTING_id] = settingId;
112
113 if (valueVariant.is<JsonObject>()) {
114 request.response_value[FSTR_SETTING_value] = valueVariant;
115 } else if (std::holds_alternative<int>(settingValue)) {
116 request.response_value[FSTR_SETTING_value] = std::get<int>(settingValue);
117 } else if (std::holds_alternative<float>(settingValue)) {
118 request.response_value[FSTR_SETTING_value] = std::get<float>(settingValue);
119 } else if (std::holds_alternative<bool>(settingValue)) {
120 request.response_value[FSTR_SETTING_value] = std::get<bool>(settingValue);
121 } else if (std::holds_alternative<String>(settingValue)) {
122 request.response_value[FSTR_SETTING_value] = std::get<String>(settingValue);
123 }
124
125 return success;
126 }
127
128 return success;
129}
130
131} // SINRICPRO_NAMESPACE
132
133using SettingValue = SINRICPRO_NAMESPACE::SettingValue;
134
135template <typename T>
136using SettingController = SINRICPRO_NAMESPACE::SettingController<T>;
AirQuality.
Definition AirQualitySensor.h:19
std::variant< int, float, bool, String > SettingValue
Variant type for setting values that can hold int, float, bool, or String.
Definition SettingController.h:19