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);
191  void onSetBands(SetBandsCallback cb);
194  void onSetMode(ModeCallback cb);
195 
196  // event
197  bool sendVolumeEvent(int volume, String cause = "PHYSICAL_INTERACTION");
198  bool sendMuteEvent(bool mute, String cause = "PHYSICAL_INTERACTION");
199  bool sendMediaControlEvent(String mediaControl, String cause = "PHYSICAL_INTERACTION");
200  bool sendSelectInputEvent(String intput, String cause = "PHYSICAL_INTERACTION");
201  bool sendBandsEvent(String bands, int level, String cause = "PHYSICAL_INTERACTION");
202  bool sendModeEvent(String mode, String cause = "PHYSICAL_INTERACTION");
203  // handle
204  bool handleRequest(const char* deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
205  private:
206  SetVolumeCallback volumeCallback;
207  AdjustVolumeCallback adjustVolumeCallback;
208  MuteCallback muteCallback;
209  MediaControlCallback mediaControlCallback;
210  SelectInputCallback selectInputCallback;
211  SetBandsCallback setBandsCallback;
212  AdjustBandsCallback adjustBandsCallback;
213  ResetBandsCallback resetBandsCallback;
214  ModeCallback setModeCallback;
215 };
216 
217 
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) {
227 }
228 
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;
232 
233  bool success = false;
234  String actionString = String(action);
235 
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);
240  return success;
241  }
242 
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);
247  return success;
248  }
249 
250  if (muteCallback && actionString == "setMute") {
251  bool mute = request_value["mute"];
252  success = muteCallback(String(deviceId), mute);
253  response_value["mute"] = mute;
254  return success;
255  }
256 
257  if (setModeCallback && actionString == "setMode") {
258  String mode = request_value["mode"] | "";
259  success = setModeCallback(String(deviceId), mode);
260  response_value["mode"] = mode;
261  return success;
262  }
263 
264  if (mediaControlCallback && actionString == "mediaControl") {
265  String mediaControl = request_value["control"];
266  success = mediaControlCallback(String(deviceId), mediaControl);
267  response_value["control"] = mediaControl;
268  return success;
269  }
270 
271  if (selectInputCallback && actionString == "selectInput") {
272  String input = request_value["input"];
273  success = selectInputCallback(String(deviceId), input);
274  response_value["input"] = input;
275  return success;
276  }
277 
278  if (setBandsCallback && actionString == "setBands") {
279  JsonArray bands_array = request_value["bands"];
280  JsonArray response_value_bands = response_value.createNestedArray("bands");
281 
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);
289  }
290  return success;
291  }
292 
293  if (setBandsCallback && actionString == "adjustBands") {
294  JsonArray bands_array = request_value["bands"];
295  JsonArray response_value_bands = response_value.createNestedArray("bands");
296 
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);
306  }
307  return success;
308  }
309 
310  if (resetBandsCallback && actionString == "resetBands") {
311  JsonArray bands_array = request_value["bands"];
312  JsonArray response_value_bands = response_value.createNestedArray("bands");
313 
314  for (size_t i=0; i<bands_array.size(); i++) {
315  int level = 0;
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);
321  }
322  return success;
323  }
324 
325  return success;
326 }
327 
335 void SinricProSpeaker::onSetVolume(SetVolumeCallback cb) { volumeCallback = cb; }
336 
344 void SinricProSpeaker::onAdjustVolume(AdjustVolumeCallback cb) { adjustVolumeCallback = cb; }
345 
353 void SinricProSpeaker::onMute(MuteCallback cb) { muteCallback = cb; }
354 
362 void SinricProSpeaker::onMediaControl(MediaControlCallback cb) { mediaControlCallback = cb; }
363 
371 void SinricProSpeaker::onSelectInput(SelectInputCallback cb) { selectInputCallback = cb; }
372 
380 void SinricProSpeaker::onSetBands(SetBandsCallback cb) { setBandsCallback = cb; }
381 
389 void SinricProSpeaker::onAdjustBands(AdjustBandsCallback cb) { adjustBandsCallback = cb; }
390 
398 void SinricProSpeaker::onResetBands(ResetBandsCallback cb) { resetBandsCallback = cb; }
399 
407 void SinricProSpeaker::onSetMode(ModeCallback cb) { setModeCallback = cb; }
408 
418 bool SinricProSpeaker::sendVolumeEvent(int volume, String cause) {
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);
423 }
424 
434 bool SinricProSpeaker::sendMuteEvent(bool mute, String cause) {
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);
439 }
440 
450 bool SinricProSpeaker::sendMediaControlEvent(String mediaControl, String cause) {
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);
455 }
456 
466 bool SinricProSpeaker::sendSelectInputEvent(String input, String cause) {
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);
471 }
472 
473 
483 bool SinricProSpeaker::sendModeEvent(String mode, String cause) {
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);
488 }
489 
500 bool SinricProSpeaker::sendBandsEvent(String bands, int level, String cause) {
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);
508 }
509 
510 
511 #endif
512 
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:483
SinricProSpeaker::sendMuteEvent
bool sendMuteEvent(bool mute, String cause="PHYSICAL_INTERACTION")
Send setMute event to SinricPro Server indicating actual mute state.
Definition: SinricProSpeaker.h:434
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:380
SinricProSpeaker::onAdjustBands
void onAdjustBands(AdjustBandsCallback cb)
Set callback function for adjustBands request.
Definition: SinricProSpeaker.h:389
SinricProSpeaker::onAdjustVolume
void onAdjustVolume(AdjustVolumeCallback cb)
Set callback function for adjustVolume request.
Definition: SinricProSpeaker.h:344
SinricProSpeaker::sendSelectInputEvent
bool sendSelectInputEvent(String intput, String cause="PHYSICAL_INTERACTION")
Send selectInput event to SinricPro Server to report selected input.
Definition: SinricProSpeaker.h:466
SinricProSpeaker::onSetMode
void onSetMode(ModeCallback cb)
Set callback function for setMode request.
Definition: SinricProSpeaker.h:407
SinricProSpeaker::sendVolumeEvent
bool sendVolumeEvent(int volume, String cause="PHYSICAL_INTERACTION")
Send setVolume event to SinricPro Server indicating actual volume has changed.
Definition: SinricProSpeaker.h:418
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:500
SinricProSpeaker::onSelectInput
void onSelectInput(SelectInputCallback cb)
Set callback function for selectInput request.
Definition: SinricProSpeaker.h:371
SinricProSpeaker::onSetVolume
void onSetVolume(SetVolumeCallback cb)
Set callback function for setVolume request.
Definition: SinricProSpeaker.h:335
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:450
SinricProSpeaker::onResetBands
void onResetBands(ResetBandsCallback cb)
Set callback function for resetBands request.
Definition: SinricProSpeaker.h:398
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:353
SinricProSpeaker::onMediaControl
void onMediaControl(MediaControlCallback cb)
Set callback function for mediaControl request.
Definition: SinricProSpeaker.h:362