SinricPro Library
SinricProSpeaker.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 #ifndef _SINRICSPEAKER_H_
9 #define _SINRICSPEAKER_H_
10 
11 #include "SinricProDevice.h"
12 
33  public:
34  SinricProSpeaker(const char* deviceId, unsigned long eventWaitTime=100);
35  String getProductType() { return SinricProDevice::getProductType() + String("SPEAKER"); }
36  // callbacks
37 
52  typedef std::function<bool(const String&, int&)> SetVolumeCallback;
53 
68  typedef std::function<bool(const String&, int&)> AdjustVolumeCallback;
69 
84  typedef std::function<bool(const String&, bool&)> MuteCallback;
85 
100  typedef std::function<bool(const String&, String&)> MediaControlCallback;
101 
116  typedef std::function<bool(const String&, String&)> SelectInputCallback;
117 
134  typedef std::function<bool(const String&, const String&, int&)> SetBandsCallback;
135 
152  typedef std::function<bool(const String&, const String&, int&)> AdjustBandsCallback;
153 
169  typedef std::function<bool(const String&, const String&, int&)> ResetBandsCallback;
170  typedef std::function<bool(const String&, String&)> ModeCallback;
185 
188  void onMute(MuteCallback cb);
190  void onSetBands(SetBandsCallback cb);
193  void onSetMode(ModeCallback cb);
194 
195  // event
196  bool sendVolumeEvent(int volume, String cause = "PHYSICAL_INTERACTION");
197  bool sendMuteEvent(bool mute, String cause = "PHYSICAL_INTERACTION");
198  bool sendMediaControlEvent(String mediaControl, String cause = "PHYSICAL_INTERACTION");
199  bool sendSelectInputEvent(String intput, String cause = "PHYSICAL_INTERACTION");
200  bool sendBandsEvent(String bands, int level, String cause = "PHYSICAL_INTERACTION");
201  bool sendModeEvent(String mode, String cause = "PHYSICAL_INTERACTION");
202  // handle
203  bool handleRequest(const char* deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
204  private:
205  SetVolumeCallback volumeCallback;
206  AdjustVolumeCallback adjustVolumeCallback;
207  MuteCallback muteCallback;
208  MediaControlCallback mediaControlCallback;
209  SelectInputCallback selectInputCallback;
210  SetBandsCallback setBandsCallback;
211  AdjustBandsCallback adjustBandsCallback;
212  ResetBandsCallback resetBandsCallback;
213  ModeCallback setModeCallback;
214 };
215 
216 
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) {
226 }
227 
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;
231 
232  bool success = false;
233  String actionString = String(action);
234 
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);
239  return success;
240  }
241 
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);
246  return success;
247  }
248 
249  if (muteCallback && actionString == "setMute") {
250  bool mute = request_value["mute"];
251  success = muteCallback(String(deviceId), mute);
252  response_value["mute"] = mute;
253  return success;
254  }
255 
256  if (setModeCallback && actionString == "setMode") {
257  String mode = request_value["mode"] | "";
258  success = setModeCallback(String(deviceId), mode);
259  response_value["mode"] = mode;
260  return success;
261  }
262 
263  if (mediaControlCallback && actionString == "mediaControl") {
264  String mediaControl = request_value["control"];
265  success = mediaControlCallback(String(deviceId), mediaControl);
266  response_value["control"] = mediaControl;
267  return success;
268  }
269 
270  if (selectInputCallback && actionString == "selectInput") {
271  String input = request_value["input"];
272  success = selectInputCallback(String(deviceId), input);
273  response_value["input"] = input;
274  return success;
275  }
276 
277  if (setBandsCallback && actionString == "setBands") {
278  JsonArray bands_array = request_value["bands"];
279  JsonArray response_value_bands = response_value.createNestedArray("bands");
280 
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);
288  }
289  return success;
290  }
291 
292  if (setBandsCallback && actionString == "adjustBands") {
293  JsonArray bands_array = request_value["bands"];
294  JsonArray response_value_bands = response_value.createNestedArray("bands");
295 
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);
305  }
306  return success;
307  }
308 
309  if (resetBandsCallback && actionString == "resetBands") {
310  JsonArray bands_array = request_value["bands"];
311  JsonArray response_value_bands = response_value.createNestedArray("bands");
312 
313  for (size_t i=0; i<bands_array.size(); i++) {
314  int level = 0;
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);
320  }
321  return success;
322  }
323 
324  return success;
325 }
326 
334 void SinricProSpeaker::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
335 
343 void SinricProSpeaker::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
344 
352 void SinricProSpeaker::onMute(MuteCallback cb) { muteCallback = cb; }
353 
361 void SinricProSpeaker::onMediaControl(MediaControlCallback cb) { mediaControlCallback = cb; }
362 
370 void SinricProSpeaker::onSelectInput(SelectInputCallback cb) { selectInputCallback = cb; }
371 
379 void SinricProSpeaker::onSetBands(SetBandsCallback cb) { setBandsCallback = cb; }
380 
388 void SinricProSpeaker::onAdjustBands(AdjustBandsCallback cb) { adjustBandsCallback = cb; }
389 
397 void SinricProSpeaker::onResetBands(ResetBandsCallback cb) { resetBandsCallback = cb; }
398 
406 void SinricProSpeaker::onSetMode(ModeCallback cb) { setModeCallback = cb; }
407 
417 bool SinricProSpeaker::sendVolumeEvent(int volume, String cause) {
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);
422 }
423 
433 bool SinricProSpeaker::sendMuteEvent(bool mute, String cause) {
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);
438 }
439 
449 bool SinricProSpeaker::sendMediaControlEvent(String mediaControl, String cause) {
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);
454 }
455 
465 bool SinricProSpeaker::sendSelectInputEvent(String input, String cause) {
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);
470 }
471 
472 
482 bool SinricProSpeaker::sendModeEvent(String mode, String cause) {
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);
487 }
488 
499 bool SinricProSpeaker::sendBandsEvent(String bands, int level, String cause) {
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);
507 }
508 
509 
510 #endif
511 
SinricProSpeaker::SetVolumeCallback
std::function< bool(const String &, int &)> SetVolumeCallback
Callback definition for onSetVolume function.
Definition: SinricProSpeaker.h:52
SinricProSpeaker::AdjustVolumeCallback
std::function< bool(const String &, int &)> AdjustVolumeCallback
Callback definition for onAdjustVolume function.
Definition: SinricProSpeaker.h:68
SinricProSpeaker::SetBandsCallback
std::function< bool(const String &, const String &, int &)> SetBandsCallback
Callback definition for onSetBands function.
Definition: SinricProSpeaker.h:134
SinricProSpeaker::MuteCallback
std::function< bool(const String &, bool &)> MuteCallback
Callback definition for onMute function.
Definition: SinricProSpeaker.h:84
SinricProSpeaker::sendModeEvent
bool sendModeEvent(String mode, String cause="PHYSICAL_INTERACTION")
Send setMode event to SinricPro Server indicating the mode has changed.
Definition: SinricProSpeaker.h:482
SinricProSpeaker::sendMuteEvent
bool sendMuteEvent(bool mute, String cause="PHYSICAL_INTERACTION")
Send setMute event to SinricPro Server indicating actual mute state.
Definition: SinricProSpeaker.h:433
SinricProSpeaker::ResetBandsCallback
std::function< bool(const String &, const String &, int &)> ResetBandsCallback
Callback definition for onResetBands function.
Definition: SinricProSpeaker.h:169
SinricProSpeaker::ModeCallback
std::function< bool(const String &, String &)> ModeCallback
Callback definition for onSetMode function.
Definition: SinricProSpeaker.h:184
SinricProSpeaker::onSetBands
void onSetBands(SetBandsCallback cb)
Set callback function for setBands request.
Definition: SinricProSpeaker.h:379
SinricProSpeaker::onAdjustBands
void onAdjustBands(AdjustBandsCallback cb)
Set callback function for adjustBands request.
Definition: SinricProSpeaker.h:388
SinricProSpeaker::onAdjustVolume
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: SinricProSpeaker.h:343
SinricProSpeaker::sendSelectInputEvent
bool sendSelectInputEvent(String intput, String cause="PHYSICAL_INTERACTION")
Send selectInput event to SinricPro Server to report selected input.
Definition: SinricProSpeaker.h:465
SinricProSpeaker::onSetMode
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition: SinricProSpeaker.h:406
SinricProSpeaker::sendVolumeEvent
bool sendVolumeEvent(int volume, String cause="PHYSICAL_INTERACTION")
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: SinricProSpeaker.h:417
SinricProSpeaker::SelectInputCallback
std::function< bool(const String &, String &)> SelectInputCallback
Callback definition for onSelectInput function.
Definition: SinricProSpeaker.h:116
SinricProSpeaker::MediaControlCallback
std::function< bool(const String &, String &)> MediaControlCallback
Callback definition for onMediaControl function.
Definition: SinricProSpeaker.h:100
SinricProSpeaker::sendBandsEvent
bool sendBandsEvent(String bands, int level, String cause="PHYSICAL_INTERACTION")
Send setBands event to SinricPro Server indicating bands level has changed.
Definition: SinricProSpeaker.h:499
SinricProSpeaker::onSetVolume
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: SinricProSpeaker.h:334
SinricProSpeaker
Device to control a smart speaker.
Definition: SinricProSpeaker.h:32
SinricProSpeaker::sendMediaControlEvent
bool sendMediaControlEvent(String mediaControl, String cause="PHYSICAL_INTERACTION")
Send mediaControl event to SinricPro Server indicating devices media control state.
Definition: SinricProSpeaker.h:449
SinricProSpeaker::onResetBands
void onResetBands(ResetBandsCallback cb)
Set callback function for resetBands request.
Definition: SinricProSpeaker.h:397
SinricProSpeaker::AdjustBandsCallback
std::function< bool(const String &, const String &, int &)> AdjustBandsCallback
Callback definition for onAdjustBands function.
Definition: SinricProSpeaker.h:152
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:23
SinricProSpeaker::onMute
void onMute(MuteCallback cb)
Set callback function for setMute request.
Definition: SinricProSpeaker.h:352
SinricProSpeaker::onMediaControl
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: SinricProSpeaker.h:361