8 #ifndef _SINRICSPEAKER_H_
9 #define _SINRICSPEAKER_H_
11 #include "SinricProDevice.h"
35 String getProductType() {
return SinricProDevice::getProductType() + String(
"SPEAKER"); }
170 typedef std::function<bool(
const String&, String&)>
ModeCallback;
196 bool sendVolumeEvent(
int volume, String cause =
"PHYSICAL_INTERACTION");
197 bool sendMuteEvent(
bool mute, String cause =
"PHYSICAL_INTERACTION");
200 bool sendBandsEvent(String bands,
int level, String cause =
"PHYSICAL_INTERACTION");
201 bool sendModeEvent(String mode, String cause =
"PHYSICAL_INTERACTION");
203 bool handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value)
override;
217 SinricProSpeaker::SinricProSpeaker(
const char* deviceId,
unsigned long eventWaitTime) :
SinricProDevice(deviceId, eventWaitTime),
218 volumeCallback(nullptr),
219 adjustVolumeCallback(nullptr),
220 muteCallback(nullptr),
221 mediaControlCallback(nullptr),
222 setBandsCallback(nullptr),
223 adjustBandsCallback(nullptr),
224 resetBandsCallback(nullptr),
225 setModeCallback(nullptr) {
228 bool SinricProSpeaker::handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value) {
229 if (strcmp(deviceId, this->deviceId) != 0)
return false;
230 if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value))
return true;
232 bool success =
false;
233 String actionString = String(action);
235 if (volumeCallback && actionString ==
"setVolume") {
236 int volume = request_value[
"volume"];
237 success = volumeCallback(String(deviceId), volume);
238 response_value[
"volume"] = limitValue(volume, 0, 100);
242 if (adjustVolumeCallback && actionString ==
"adjustVolume") {
243 int volume = request_value[
"volume"];
244 success = adjustVolumeCallback(String(deviceId), volume);
245 response_value[
"volume"] = limitValue(volume, 0, 100);
249 if (muteCallback && actionString ==
"setMute") {
250 bool mute = request_value[
"mute"];
251 success = muteCallback(String(deviceId), mute);
252 response_value[
"mute"] = mute;
256 if (setModeCallback && actionString ==
"setMode") {
257 String mode = request_value[
"mode"] |
"";
258 success = setModeCallback(String(deviceId), mode);
259 response_value[
"mode"] = mode;
263 if (mediaControlCallback && actionString ==
"mediaControl") {
264 String mediaControl = request_value[
"control"];
265 success = mediaControlCallback(String(deviceId), mediaControl);
266 response_value[
"control"] = mediaControl;
270 if (selectInputCallback && actionString ==
"selectInput") {
271 String input = request_value[
"input"];
272 success = selectInputCallback(String(deviceId), input);
273 response_value[
"input"] = input;
277 if (setBandsCallback && actionString ==
"setBands") {
278 JsonArray bands_array = request_value[
"bands"];
279 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
281 for (
size_t i=0; i<bands_array.size(); i++) {
282 int level = bands_array[i][
"level"] | 0;
283 String bandsName = bands_array[i][
"name"] |
"";
284 success = setBandsCallback(deviceId, bandsName, level);
285 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
286 response_value_bands_i[
"name"] = bandsName;
287 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
292 if (setBandsCallback && actionString ==
"adjustBands") {
293 JsonArray bands_array = request_value[
"bands"];
294 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
296 for (
size_t i=0; i<bands_array.size(); i++) {
297 int levelDelta = bands_array[i][
"levelDelta"] | 1;
298 String direction = bands_array[i][
"levelDirection"];
299 if (direction==
"DOWN") levelDelta *= -1;
300 String bandsName = bands_array[i][
"name"] |
"";
301 success = adjustBandsCallback(deviceId, bandsName, levelDelta);
302 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
303 response_value_bands_i[
"name"] = bandsName;
304 response_value_bands_i[
"level"] = limitValue(levelDelta, 0, 100);
309 if (resetBandsCallback && actionString ==
"resetBands") {
310 JsonArray bands_array = request_value[
"bands"];
311 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
313 for (
size_t i=0; i<bands_array.size(); i++) {
315 String bandsName = bands_array[i][
"name"] |
"";
316 success = adjustBandsCallback(deviceId, bandsName, level);
317 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
318 response_value_bands_i[
"name"] = bandsName;
319 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
370 void SinricProSpeaker::onSelectInput(SelectInputCallback cb) { selectInputCallback = cb; }
418 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setVolume", cause.c_str());
419 JsonObject event_value = eventMessage[
"payload"][
"value"];
420 event_value[
"volume"] = volume;
421 return sendEvent(eventMessage);
434 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMute", cause.c_str());
435 JsonObject event_value = eventMessage[
"payload"][
"value"];
436 event_value[
"mute"] = mute;
437 return sendEvent(eventMessage);
450 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"mediaControl", cause.c_str());
451 JsonObject event_value = eventMessage[
"payload"][
"value"];
452 event_value[
"control"] = mediaControl;
453 return sendEvent(eventMessage);
466 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"selectInput", cause.c_str());
467 JsonObject event_value = eventMessage[
"payload"][
"value"];
468 event_value[
"input"] = input;
469 return sendEvent(eventMessage);
483 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMode", cause.c_str());
484 JsonObject event_value = eventMessage[
"payload"][
"value"];
485 event_value[
"mode"] = mode;
486 return sendEvent(eventMessage);
500 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setBands", cause.c_str());
501 JsonObject event_value = eventMessage[
"payload"][
"value"];
502 JsonArray event_value_bands = event_value.createNestedArray(
"bands");
503 JsonObject event_bands = event_value_bands.createNestedObject();
504 event_bands[
"name"] = bands;
505 event_bands[
"value"] = level;
506 return sendEvent(eventMessage);