SinricPro Library
Loading...
Searching...
No Matches
SinricProModuleCommandHandler.h
1/*
2 * Copyright (c) 2019 Sinric. All rights reserved.
3 * Licensed under Creative Commons Attribution-Share Alike (CC BY-SA)
4 *
5 * This file is part of the Sinric Pro (https://github.com/sinricpro/)
6 */
7
8#pragma once
9
10#include "SinricProRequest.h"
11#include "SinricProStrings.h"
12#include "SinricProNamespace.h"
13#include "SinricProDebug.h"
14#include "Capabilities/SettingController.h"
15
16namespace SINRICPRO_NAMESPACE {
17
18FSTR(OTA, otaUpdateAvailable); // "otaUpdateAvailable"
19FSTR(OTA, url); // "url"
20FSTR(OTA, version); // "version"
21FSTR(OTA, major); // "major"
22FSTR(OTA, minor); // "minor"
23FSTR(OTA, patch); // "patch"
24FSTR(OTA, forceUpdate); // "forceUpdate"
25FSTR(SETTINGS, setSetting); // "setSetting"
26FSTR(SETTINGS, id); // "id"
27FSTR(SETTINGS, value); // "value"
28FSTR(INSIGHTS, health); // "health"
29FSTR(INSIGHTS, report); // "report"
30
31using OTAUpdateCallbackHandler = std::function<bool(const String& url, int major, int minor, int patch, bool forceUpdate)>;
32using SetSettingCallbackHandler = std::function<bool(const String& id, SettingValue& value)>;
33using ReportHealthCallbackHandler = std::function<bool(String& healthReport)>;
34
35class SinricProModuleCommandHandler {
36 public:
37 SinricProModuleCommandHandler();
38 ~SinricProModuleCommandHandler();
39
40 bool handleRequest(SinricProRequest &request);
41 void onOTAUpdate(OTAUpdateCallbackHandler callback);
42 void onSetSetting(SetSettingCallbackHandler callback);
43 void onReportHealth(ReportHealthCallbackHandler callback);
44
45 private:
46 OTAUpdateCallbackHandler _otaUpdateCallbackHandler;
47 SetSettingCallbackHandler _setSettingCallbackHandler;
48 ReportHealthCallbackHandler _reportHealthCallbackHandler;
49};
50
51SinricProModuleCommandHandler::SinricProModuleCommandHandler()
52 : _otaUpdateCallbackHandler(nullptr),
53 _setSettingCallbackHandler(nullptr),
54 _reportHealthCallbackHandler(nullptr) {}
55
56SinricProModuleCommandHandler::~SinricProModuleCommandHandler() {}
57
58void SinricProModuleCommandHandler::onOTAUpdate(OTAUpdateCallbackHandler callback) {
59 _otaUpdateCallbackHandler = callback;
60}
61
62void SinricProModuleCommandHandler::onSetSetting(SetSettingCallbackHandler callback) {
63 _setSettingCallbackHandler = callback;
64}
65
66void SinricProModuleCommandHandler::onReportHealth(ReportHealthCallbackHandler callback) {
67 _reportHealthCallbackHandler = callback;
68}
69
70bool SinricProModuleCommandHandler::handleRequest(SinricProRequest &request) {
71 if (strcmp(FSTR_OTA_otaUpdateAvailable, request.action.c_str()) == 0 && _otaUpdateCallbackHandler) {
72 String url = request.request_value[FSTR_OTA_url];
73 int major = request.request_value[FSTR_OTA_version][FSTR_OTA_major];
74 int minor = request.request_value[FSTR_OTA_version][FSTR_OTA_minor];
75 int patch = request.request_value[FSTR_OTA_version][FSTR_OTA_patch];
76 bool forceUpdate = request.request_value[FSTR_OTA_forceUpdate] | false;
77 return _otaUpdateCallbackHandler(url, major, minor, patch, forceUpdate);
78 }
79 else if (strcmp(FSTR_SETTINGS_setSetting, request.action.c_str()) == 0 && _setSettingCallbackHandler) {
80 String id = request.request_value[FSTR_SETTINGS_id];
81 JsonVariant valueVariant = request.request_value[FSTR_SETTINGS_value];
82
83 SettingValue settingValue;
84
85 if (valueVariant.is<bool>()) {
86 settingValue = valueVariant.as<bool>();
87 } else if (valueVariant.is<float>()) {
88 settingValue = valueVariant.as<float>();
89 } else if (valueVariant.is<int>()) {
90 settingValue = valueVariant.as<int>();
91 } else if (valueVariant.is<JsonObject>()) {
92 String jsonString;
93 serializeJson(valueVariant, jsonString);
94 settingValue = jsonString;
95 } else if (valueVariant.is<const char*>()) {
96 settingValue = String(valueVariant.as<const char*>());
97 }
98
99 bool success = _setSettingCallbackHandler(id, settingValue);
100
101 request.response_value[FSTR_SETTINGS_id] = id;
102
103 if (valueVariant.is<JsonObject>()) {
104 request.response_value[FSTR_SETTINGS_value] = valueVariant;
105 } else if (std::holds_alternative<int>(settingValue)) {
106 request.response_value[FSTR_SETTINGS_value] = std::get<int>(settingValue);
107 } else if (std::holds_alternative<float>(settingValue)) {
108 request.response_value[FSTR_SETTINGS_value] = std::get<float>(settingValue);
109 } else if (std::holds_alternative<bool>(settingValue)) {
110 request.response_value[FSTR_SETTINGS_value] = std::get<bool>(settingValue);
111 } else if (std::holds_alternative<String>(settingValue)) {
112 request.response_value[FSTR_SETTINGS_value] = std::get<String>(settingValue);
113 }
114
115 return success;
116 }
117 else if (strcmp(FSTR_INSIGHTS_health, request.action.c_str()) == 0 && _reportHealthCallbackHandler) {
118 String healthReport = "";
119 bool success = _reportHealthCallbackHandler(healthReport);
120 if (success) {
121 request.response_value[FSTR_INSIGHTS_report] = healthReport;
122 }
123 return success;
124 }
125 else {
126 DEBUG_SINRIC("[SinricProModuleCommandHandler:handleRequest]: action: %s not supported!\r\n", request.action.c_str());
127 }
128 return false;
129}
130
131} // SINRICPRO_NAMESPACE
std::function< bool(const String &url, int major, int minor, int patch, bool enforce)> OTAUpdateCallbackHandler
Function signature for OTA update callback.
Definition SinricPro.h:54
std::function< bool(String &healthReport)> ReportHealthCallbackHandler
Defines a function type for reporting device health status.
Definition SinricPro.h:80
std::function< bool(const String &id, SettingValue &value)> SetSettingCallbackHandler
Function signature for setting a module setting.
Definition SinricPro.h:65