8 #ifndef _SINRICSPEAKER_H_
9 #define _SINRICSPEAKER_H_
11 #include "SinricProDevice.h"
35 String getProductType() {
return SinricProDevice::getProductType() + String(
"SPEAKER"); }
171 typedef std::function<bool(
const String&, String&)>
ModeCallback;
198 bool sendVolumeEvent(
int volume, String cause =
"PHYSICAL_INTERACTION");
199 bool sendMuteEvent(
bool mute, String cause =
"PHYSICAL_INTERACTION");
202 bool sendBandsEvent(String bands,
int level, String cause =
"PHYSICAL_INTERACTION");
203 bool sendModeEvent(String mode, String cause =
"PHYSICAL_INTERACTION");
205 bool handleRequest(
const DeviceId &deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value)
override;
219 SinricProSpeaker::SinricProSpeaker(
const DeviceId &deviceId) :
SinricProDevice(deviceId),
220 volumeCallback(nullptr),
221 adjustVolumeCallback(nullptr),
222 muteCallback(nullptr),
223 mediaControlCallback(nullptr),
224 setBandsCallback(nullptr),
225 adjustBandsCallback(nullptr),
226 resetBandsCallback(nullptr),
227 setModeCallback(nullptr) {
230 bool SinricProSpeaker::handleRequest(
const DeviceId &deviceId,
const char* action, JsonObject &request_value, JsonObject &response_value) {
231 if (deviceId != this->deviceId)
return false;
232 if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value))
return true;
234 bool success =
false;
235 String actionString = String(action);
237 if (volumeCallback && actionString ==
"setVolume") {
238 int volume = request_value[
"volume"];
239 success = volumeCallback(deviceId, volume);
240 response_value[
"volume"] = limitValue(volume, 0, 100);
244 if (adjustVolumeCallback && actionString ==
"adjustVolume") {
245 int volume = request_value[
"volume"];
246 bool volumeDefault = request_value[
"volumeDefault"] |
false;
247 success = adjustVolumeCallback(deviceId, volume, volumeDefault);
248 response_value[
"volume"] = limitValue(volume, 0, 100);
252 if (muteCallback && actionString ==
"setMute") {
253 bool mute = request_value[
"mute"];
254 success = muteCallback(deviceId, mute);
255 response_value[
"mute"] = mute;
259 if (setModeCallback && actionString ==
"setMode") {
260 String mode = request_value[
"mode"] |
"";
261 success = setModeCallback(deviceId, mode);
262 response_value[
"mode"] = mode;
266 if (mediaControlCallback && actionString ==
"mediaControl") {
267 String mediaControl = request_value[
"control"];
268 success = mediaControlCallback(deviceId, mediaControl);
269 response_value[
"control"] = mediaControl;
273 if (selectInputCallback && actionString ==
"selectInput") {
274 String input = request_value[
"input"];
275 success = selectInputCallback(deviceId, input);
276 response_value[
"input"] = input;
280 if (setBandsCallback && actionString ==
"setBands") {
281 JsonArray bands_array = request_value[
"bands"];
282 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
284 for (
size_t i=0; i<bands_array.size(); i++) {
285 int level = bands_array[i][
"level"] | 0;
286 String bandsName = bands_array[i][
"name"] |
"";
287 success = setBandsCallback(deviceId, bandsName, level);
288 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
289 response_value_bands_i[
"name"] = bandsName;
290 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
295 if (setBandsCallback && actionString ==
"adjustBands") {
296 JsonArray bands_array = request_value[
"bands"];
297 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
299 for (
size_t i=0; i<bands_array.size(); i++) {
300 int levelDelta = bands_array[i][
"levelDelta"] | 1;
301 String direction = bands_array[i][
"levelDirection"];
302 if (direction==
"DOWN") levelDelta *= -1;
303 String bandsName = bands_array[i][
"name"] |
"";
304 success = adjustBandsCallback(deviceId, bandsName, levelDelta);
305 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
306 response_value_bands_i[
"name"] = bandsName;
307 response_value_bands_i[
"level"] = limitValue(levelDelta, 0, 100);
312 if (resetBandsCallback && actionString ==
"resetBands") {
313 JsonArray bands_array = request_value[
"bands"];
314 JsonArray response_value_bands = response_value.createNestedArray(
"bands");
316 for (
size_t i=0; i<bands_array.size(); i++) {
318 String bandsName = bands_array[i][
"name"] |
"";
319 success = adjustBandsCallback(deviceId, bandsName, level);
320 JsonObject response_value_bands_i = response_value_bands.createNestedObject();
321 response_value_bands_i[
"name"] = bandsName;
322 response_value_bands_i[
"level"] = limitValue(level, 0, 100);
421 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setVolume", cause.c_str());
422 JsonObject event_value = eventMessage[
"payload"][
"value"];
423 event_value[
"volume"] = volume;
424 return sendEvent(eventMessage);
437 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMute", cause.c_str());
438 JsonObject event_value = eventMessage[
"payload"][
"value"];
439 event_value[
"mute"] = mute;
440 return sendEvent(eventMessage);
453 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"mediaControl", cause.c_str());
454 JsonObject event_value = eventMessage[
"payload"][
"value"];
455 event_value[
"control"] = mediaControl;
456 return sendEvent(eventMessage);
469 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"selectInput", cause.c_str());
470 JsonObject event_value = eventMessage[
"payload"][
"value"];
471 event_value[
"input"] = input;
472 return sendEvent(eventMessage);
486 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setMode", cause.c_str());
487 JsonObject event_value = eventMessage[
"payload"][
"value"];
488 event_value[
"mode"] = mode;
489 return sendEvent(eventMessage);
503 DynamicJsonDocument eventMessage = prepareEvent(deviceId,
"setBands", cause.c_str());
504 JsonObject event_value = eventMessage[
"payload"][
"value"];
505 JsonArray event_value_bands = event_value.createNestedArray(
"bands");
506 JsonObject event_bands = event_value_bands.createNestedObject();
507 event_bands[
"name"] = bands;
508 event_bands[
"value"] = level;
509 return sendEvent(eventMessage);