5#include "../SinricProRequest.h"
6#include "../SinricProStrings.h"
8#include "../SinricProNamespace.h"
9namespace SINRICPRO_NAMESPACE {
11FSTR(SETTING, setSetting);
20using SetSettingCallback = std::function<bool(
const String&,
const String&,
SettingValue&)>;
23class SettingController {
26 void onSetSetting(SetSettingCallback
cb);
29 bool handleSettingController(SinricProRequest &
request);
32 SetSettingCallback setSettingCallback;
36SettingController<T>::SettingController() {
37 T* device =
static_cast<T*
>(
this);
38 device->registerRequestHandler(std::bind(&SettingController<T>::handleSettingController,
this, std::placeholders::_1));
42void SettingController<T>::onSetSetting(SetSettingCallback cb) {
43 setSettingCallback = cb;
47bool SettingController<T>::handleSettingController(SinricProRequest &request) {
48 T* device =
static_cast<T*
>(
this);
52 if (setSettingCallback && request.action == FSTR_SETTING_setSetting) {
53 String settingId = request.request_value[FSTR_SETTING_id] |
"";
54 JsonVariant valueVariant = request.request_value[FSTR_SETTING_value];
56 SettingValue settingValue;
58 if (valueVariant.is<
bool>()) {
59 settingValue = valueVariant.as<
bool>();
60 }
else if (valueVariant.is<
float>()) {
61 settingValue = valueVariant.as<
float>();
62 }
else if (valueVariant.is<
int>()) {
63 settingValue = valueVariant.as<
int>();
64 }
else if (valueVariant.is<JsonObject>()) {
66 serializeJson(valueVariant, jsonString);
67 settingValue = jsonString;
68 }
else if (valueVariant.is<
const char*>()) {
69 settingValue = String(valueVariant.as<
const char*>());
72 success = setSettingCallback(device->deviceId, settingId, settingValue);
74 request.response_value[FSTR_SETTING_id] = settingId;
76 if (valueVariant.is<JsonObject>()) {
77 request.response_value[FSTR_SETTING_value] = valueVariant;
78 }
else if (std::holds_alternative<int>(settingValue)) {
79 request.response_value[FSTR_SETTING_value] = std::get<int>(settingValue);
80 }
else if (std::holds_alternative<float>(settingValue)) {
81 request.response_value[FSTR_SETTING_value] = std::get<float>(settingValue);
82 }
else if (std::holds_alternative<bool>(settingValue)) {
83 request.response_value[FSTR_SETTING_value] = std::get<bool>(settingValue);
84 }
else if (std::holds_alternative<String>(settingValue)) {
85 request.response_value[FSTR_SETTING_value] = std::get<String>(settingValue);
96using SettingValue = SINRICPRO_NAMESPACE::SettingValue;
99using 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:18