SinricPro Library
ThermostatController.h
1 #pragma once
2 
3 #include "../SinricProRequest.h"
4 #include "../EventLimiter.h"
5 #include "../SinricProStrings.h"
6 
7 #include "../SinricProNamespace.h"
8 namespace SINRICPRO_NAMESPACE {
9 
10 FSTR(THERMOSTAT, setThermostatMode); // "setThermostatMode"
11 FSTR(THERMOSTAT, thermostatMode); // "thermostatMode"
12 FSTR(THERMOSTAT, targetTemperature); // "targetTemperature"
13 FSTR(THERMOSTAT, temperature); // "temperature"
14 FSTR(THERMOSTAT, adjustTargetTemperature); // "adjustTargetTemperature"
15 
30 using ThermostatModeCallback = std::function<bool(const String &, String &)>;
31 
46 using SetTargetTemperatureCallback = std::function<bool(const String &, float &)>;
47 
62 using AdjustTargetTemperatureCallback = std::function<bool(const String &, float &)>;
63 
64 
69 template <typename T>
71  public:
73 
77 
78  bool sendThermostatModeEvent(String thermostatMode, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
79  bool sendTargetTemperatureEvent(float temperature, String cause = FSTR_SINRICPRO_PHYSICAL_INTERACTION);
80 
81  protected:
82  bool handleThermostatController(SinricProRequest &request);
83 
84  private:
85  EventLimiter event_limiter_thermostatMode;
86  EventLimiter event_limiter_targetTemperature;
87  ThermostatModeCallback thermostatModeCallback;
88  SetTargetTemperatureCallback targetTemperatureCallback;
89  AdjustTargetTemperatureCallback adjustTargetTemperatureCallback;
90 };
91 
92 template <typename T>
94 : event_limiter_thermostatMode(EVENT_LIMIT_STATE)
95 , event_limiter_targetTemperature(EVENT_LIMIT_STATE) {
96  T* device = static_cast<T*>(this);
97  device->registerRequestHandler(std::bind(&ThermostatController<T>::handleThermostatController, this, std::placeholders::_1));
98 }
99 
107 template <typename T>
109  thermostatModeCallback = cb;
110 }
111 
119 template <typename T>
121  targetTemperatureCallback = cb;
122 }
123 
131 template <typename T>
133  adjustTargetTemperatureCallback = cb;
134 }
135 
145 template <typename T>
146 bool ThermostatController<T>::sendThermostatModeEvent(String thermostatMode, String cause) {
147  if (event_limiter_thermostatMode) return false;
148  T* device = static_cast<T*>(this);
149 
150  JsonDocument eventMessage = device->prepareEvent(FSTR_THERMOSTAT_setThermostatMode, cause.c_str());
151  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
152  event_value[FSTR_THERMOSTAT_thermostatMode] = thermostatMode;
153  return device->sendEvent(eventMessage);
154 }
155 
165 template <typename T>
166 bool ThermostatController<T>::sendTargetTemperatureEvent(float temperature, String cause) {
167  if (event_limiter_targetTemperature) return false;
168  T* device = static_cast<T*>(this);
169 
170  JsonDocument eventMessage = device->prepareEvent(FSTR_THERMOSTAT_targetTemperature, cause.c_str());
171  JsonObject event_value = eventMessage[FSTR_SINRICPRO_payload][FSTR_SINRICPRO_value];
172  event_value[FSTR_THERMOSTAT_temperature] = roundf(temperature * 10) / 10.0;
173  return device->sendEvent(eventMessage);
174 }
175 
176 template <typename T>
177 bool ThermostatController<T>::handleThermostatController(SinricProRequest &request) {
178  T* device = static_cast<T*>(this);
179 
180  bool success = false;
181 
182  if (request.action == FSTR_THERMOSTAT_targetTemperature && targetTemperatureCallback) {
183  float temperature;
184  if (request.request_value.containsKey(FSTR_THERMOSTAT_temperature)) {
185  temperature = request.request_value[FSTR_THERMOSTAT_temperature];
186  } else {
187  temperature = 1;
188  }
189  success = targetTemperatureCallback(device->deviceId, temperature);
190  request.response_value[FSTR_THERMOSTAT_temperature] = temperature;
191  return success;
192  }
193 
194  if (request.action == FSTR_THERMOSTAT_adjustTargetTemperature && adjustTargetTemperatureCallback) {
195  float temperatureDelta = request.request_value[FSTR_THERMOSTAT_temperature];
196  success = adjustTargetTemperatureCallback(device->deviceId, temperatureDelta);
197  request.response_value[FSTR_THERMOSTAT_temperature] = temperatureDelta;
198  return success;
199  }
200 
201  if (request.action == FSTR_THERMOSTAT_setThermostatMode && thermostatModeCallback) {
202  String thermostatMode = request.request_value[FSTR_THERMOSTAT_thermostatMode] | "";
203  success = thermostatModeCallback(device->deviceId, thermostatMode);
204  request.response_value[FSTR_THERMOSTAT_thermostatMode] = thermostatMode;
205  return success;
206  }
207 
208  return success;
209 }
210 
211 } // SINRICPRO_NAMESPACE
212 
213 template <typename T>
214 using ThermostatController = SINRICPRO_NAMESPACE::ThermostatController<T>;
ThermostatController.
Definition: ThermostatController.h:70
void onTargetTemperature(SetTargetTemperatureCallback cb)
Set callback function for targetTemperature request.
Definition: ThermostatController.h:120
void onThermostatMode(ThermostatModeCallback cb)
Set callback function for setThermostatMode request.
Definition: ThermostatController.h:108
bool sendTargetTemperatureEvent(float temperature, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send targetTemperature event to report target temperature change.
Definition: ThermostatController.h:166
void onAdjustTargetTemperature(AdjustTargetTemperatureCallback cb)
Set callback function for adjustTargetTemperature request.
Definition: ThermostatController.h:132
bool sendThermostatModeEvent(String thermostatMode, String cause=FSTR_SINRICPRO_PHYSICAL_INTERACTION)
Send thermostatMode event to report a the new mode the device has been set to.
Definition: ThermostatController.h:146
std::function< bool(const String &, float &)> SetTargetTemperatureCallback
Callback definition for onTargetTemperature function.
Definition: ThermostatController.h:46
std::function< bool(const String &, String &)> ThermostatModeCallback
Callback definition for onThermostatMode function.
Definition: ThermostatController.h:30
std::function< bool(const String &, float &)> AdjustTargetTemperatureCallback
Callback definition for onAdjustTargetTemperature function.
Definition: ThermostatController.h:62