5#include "../SinricProRequest.h"
6#include "../SinricProStrings.h"
7#include "../EventLimiter.h"
9#include "../SinricProNamespace.h"
10namespace SINRICPRO_NAMESPACE {
12FSTR(SETTING, setSetting);
21using SetSettingCallback = std::function<bool(
const String&,
const String&,
SettingValue&)>;
24class SettingController {
27 void onSetSetting(SetSettingCallback
cb);
31 bool handleSettingController(SinricProRequest &
request);
34 EventLimiter event_limiter;
35 SetSettingCallback setSettingCallback;
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));
46void SettingController<T>::onSetSetting(SetSettingCallback cb) {
47 setSettingCallback = cb;
61bool SettingController<T>::sendSettingEvent(String settingId, SettingValue settingValue, String cause) {
62 if (event_limiter)
return false;
63 T* device =
static_cast<T*
>(
this);
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;
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);
80 return device->sendEvent(eventMessage);
84bool SettingController<T>::handleSettingController(SinricProRequest &request) {
85 T* device =
static_cast<T*
>(
this);
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];
93 SettingValue settingValue;
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>()) {
103 serializeJson(valueVariant, jsonString);
104 settingValue = jsonString;
105 }
else if (valueVariant.is<
const char*>()) {
106 settingValue = String(valueVariant.as<
const char*>());
109 success = setSettingCallback(device->deviceId, settingId, settingValue);
111 request.response_value[FSTR_SETTING_id] = settingId;
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);
133using SettingValue = SINRICPRO_NAMESPACE::SettingValue;
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