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;
197 bool sendVolumeEvent(
int volume, String cause =
"PHYSICAL_INTERACTION");
198 bool sendMuteEvent(
bool mute, String cause =
"PHYSICAL_INTERACTION");
201 bool sendBandsEvent(String bands,
int level, String cause =
"PHYSICAL_INTERACTION");
202 bool sendModeEvent(String mode, String cause =
"PHYSICAL_INTERACTION");
204 bool handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value)
override;
218 SinricProSpeaker::SinricProSpeaker(
const char* deviceId,
unsigned long eventWaitTime) :
SinricProDevice(deviceId, eventWaitTime),
219 volumeCallback(nullptr),
220 adjustVolumeCallback(nullptr),
221 muteCallback(nullptr),
222 mediaControlCallback(nullptr),
223 setBandsCallback(nullptr),
224 adjustBandsCallback(nullptr),
225 resetBandsCallback(nullptr),
226 setModeCallback(nullptr) {
229 bool SinricProSpeaker::handleRequest(
const char* deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value) {
230 if (strcmp(deviceId, this->deviceId) != 0)
return false;
231 if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value))
return true;
233 bool success =
false;
234 String actionString = String(action);
236 if (volumeCallback && actionString ==
"setVolume") {
237 int volume = request_value[
"volume"];
238 success = volumeCallback(String(deviceId), volume);
239 response_value[
"volume"] = limitValue(volume, 0, 100);
243 if (adjustVolumeCallback && actionString ==
"adjustVolume") {
244 int volume = request_value[
"volume"];
245 success = adjustVolumeCallback(String(deviceId), volume);
246 response_value[
"volume"] = limitValue(volume, 0, 100);
250 if (muteCallback && actionString ==
"setMute") {
251 bool mute = request_value[
"mute"];
252 success = muteCallback(String(deviceId), mute);
253 response_value[
"mute"] = mute;
257 if (setModeCallback && actionString ==
"setMode") {
258 String mode = request_value[
"mode"] |
"";
259 success = setModeCallback(String(deviceId), mode);
260 response_value[
"mode"] = mode;
264 if (mediaControlCallback && actionString ==
"mediaControl") {
265 String mediaControl = request_value[
"control"];
266 success = mediaControlCallback(String(deviceId), mediaControl);
267 response_value[
"control"] = mediaControl;
271 if (selectInputCallback && actionString ==
"selectInput") {
272 String input = request_value[
"input"];
273 success = selectInputCallback(String(deviceId), input);
274 response_value[
"input"] = input;
278 if (setBandsCallback && actionString ==
"setBands") {
279 JsonArray bands_array = request_value[
"bands"];
280 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
282 for (
size_t i=0; i<bands_array.size(); i++) {
283 int level = bands_array[i][
"level"] | 0;
284 String bandsName = bands_array[i][
"name"] |
"";
285 success = setBandsCallback(deviceId, bandsName, level);
286 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
287 response_value_bands_i[
"name"] = bandsName;
288 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
293 if (setBandsCallback && actionString ==
"adjustBands") {
294 JsonArray bands_array = request_value[
"bands"];
295 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
297 for (
size_t i=0; i<bands_array.size(); i++) {
298 int levelDelta = bands_array[i][
"levelDelta"] | 1;
299 String direction = bands_array[i][
"levelDirection"];
300 if (direction==
"DOWN") levelDelta *= -1;
301 String bandsName = bands_array[i][
"name"] |
"";
302 success = adjustBandsCallback(deviceId, bandsName, levelDelta);
303 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
304 response_value_bands_i[
"name"] = bandsName;
305 response_value_bands_i[
"level"] = limitValue(levelDelta, 0, 100);
310 if (resetBandsCallback && actionString ==
"resetBands") {
311 JsonArray bands_array = request_value[
"bands"];
312 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
314 for (
size_t i=0; i<bands_array.size(); i++) {
316 String bandsName = bands_array[i][
"name"] |
"";
317 success = adjustBandsCallback(deviceId, bandsName, level);
318 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
319 response_value_bands_i[
"name"] = bandsName;
320 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
419 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setVolume", cause.c_str());
420 JsonObject event_value = eventMessage[
"payload"][
"value"];
421 event_value[
"volume"] = volume;
422 return sendEvent(eventMessage);
435 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMute", cause.c_str());
436 JsonObject event_value = eventMessage[
"payload"][
"value"];
437 event_value[
"mute"] = mute;
438 return sendEvent(eventMessage);
451 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"mediaControl", cause.c_str());
452 JsonObject event_value = eventMessage[
"payload"][
"value"];
453 event_value[
"control"] = mediaControl;
454 return sendEvent(eventMessage);
467 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"selectInput", cause.c_str());
468 JsonObject event_value = eventMessage[
"payload"][
"value"];
469 event_value[
"input"] = input;
470 return sendEvent(eventMessage);
484 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMode", cause.c_str());
485 JsonObject event_value = eventMessage[
"payload"][
"value"];
486 event_value[
"mode"] = mode;
487 return sendEvent(eventMessage);
501 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setBands", cause.c_str());
502 JsonObject event_value = eventMessage[
"payload"][
"value"];
503 JsonArray event_value_bands = event_value.createNestedArray(
"bands");
504 JsonObject event_bands = event_value_bands.createNestedObject();
505 event_bands[
"name"] = bands;
506 event_bands[
"value"] = level;
507 return sendEvent(eventMessage);