SinricPro Library
SinricProThermostat.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 _SINRICTHERMOSTAT_H_
9 #define _SINRICTHERMOSTAT_H_
10 
11 #include "SinricProDevice.h"
12 
24  public:
25  SinricProThermostat(const DeviceId &deviceId);
26  String getProductType() { return SinricProDevice::getProductType() + String("THERMOSTAT"); }
27  // callback
28 
43  typedef std::function<bool(const String&, float&)> SetTargetTemperatureCallback;
44 
59  typedef std::function<bool(const String&, float&)> AdjustTargetTemperatureCallback;
60 
75  typedef std::function<bool(const String&, String&)> ThermostatModeCallback;
76 
80 
81  // event
82  bool sendTemperatureEvent(float temperature, float humidity = -1, String cause = "PERIODIC_POLL");
83  bool sendTargetTemperatureEvent(float temperature, String cause = "PHYSICAL_INTERACTION");
84  bool sendThermostatModeEvent(String thermostatMode, String cause = "PHYSICAL_INTERACTION");
85  // handle
86  bool handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) override;
87  private:
88  SetTargetTemperatureCallback targetTemperatureCallback;
89  AdjustTargetTemperatureCallback adjustTargetTemperatureCallback;
90  ThermostatModeCallback thermostatModeCallback;
91 };
92 
93 SinricProThermostat::SinricProThermostat(const DeviceId &deviceId) : SinricProDevice(deviceId),
94  targetTemperatureCallback(nullptr),
95  adjustTargetTemperatureCallback(nullptr),
96  thermostatModeCallback(nullptr) {}
97 
98 bool SinricProThermostat::handleRequest(const DeviceId &deviceId, const char* action, JsonObject &request_value, JsonObject &response_value) {
99  if (deviceId != this->deviceId) return false;
100  if (SinricProDevice::handleRequest(deviceId, action, request_value, response_value)) return true;
101 
102  bool success = false;
103  String actionString = String(action);
104 
105  if (actionString == "targetTemperature" && targetTemperatureCallback) {
106  float temperature;
107  if (request_value.containsKey("temperature")) {
108  temperature = request_value["temperature"];
109  } else {
110  temperature = 1;
111  }
112  success = targetTemperatureCallback(deviceId, temperature);
113  response_value["temperature"] = temperature;
114  return success;
115  }
116 
117  if (actionString == "adjustTargetTemperature" && adjustTargetTemperatureCallback) {
118  float temperatureDelta = request_value["temperature"];
119  success = adjustTargetTemperatureCallback(deviceId, temperatureDelta);
120  response_value["temperature"] = temperatureDelta;
121  return success;
122  }
123 
124  if (actionString == "setThermostatMode" && thermostatModeCallback) {
125  String thermostatMode = request_value["thermostatMode"] | "";
126  success = thermostatModeCallback(deviceId, thermostatMode);
127  response_value["thermostatMode"] = thermostatMode;
128  return success;
129  }
130 
131  return success;
132 }
133 
142  targetTemperatureCallback = cb;
143 }
144 
153  adjustTargetTemperatureCallback = cb;
154 }
155 
164  thermostatModeCallback = cb;
165 }
166 
177 bool SinricProThermostat::sendTemperatureEvent(float temperature, float humidity, String cause) {
178  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "currentTemperature", cause.c_str());
179  JsonObject event_value = eventMessage["payload"]["value"];
180  event_value["humidity"] = humidity;
181  event_value["temperature"] = roundf(temperature *10) / 10;
182  return sendEvent(eventMessage);
183 }
184 
194 bool SinricProThermostat::sendTargetTemperatureEvent(float temperature, String cause) {
195  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "targetTemperature", cause.c_str());
196  JsonObject event_value = eventMessage["payload"]["value"];
197  event_value["temperature"] = roundf(temperature * 10) / 10.0;
198  return sendEvent(eventMessage);
199 }
200 
210 bool SinricProThermostat::sendThermostatModeEvent(String thermostatMode, String cause) {
211  DynamicJsonDocument eventMessage = prepareEvent(deviceId, "setThermostatMode", cause.c_str());
212  JsonObject event_value = eventMessage["payload"]["value"];
213  event_value["thermostatMode"] = thermostatMode;
214  return sendEvent(eventMessage);
215 }
216 
217 
218 #endif
219 
SinricProThermostat::onAdjustTargetTemperature
void onAdjustTargetTemperature(AdjustTargetTemperatureCallback cb)
Set callback function for adjustTargetTemperature request.
Definition: SinricProThermostat.h:152
SinricProThermostat::sendThermostatModeEvent
bool sendThermostatModeEvent(String thermostatMode, String cause="PHYSICAL_INTERACTION")
Send thermostatMode event to report a the new mode the device has been set to.
Definition: SinricProThermostat.h:210
SinricProThermostat::onThermostatMode
void onThermostatMode(ThermostatModeCallback cb)
Set callback function for setThermostatMode request.
Definition: SinricProThermostat.h:163
SinricProThermostat::onTargetTemperature
void onTargetTemperature(SetTargetTemperatureCallback cb)
Set callback function for targetTemperature request.
Definition: SinricProThermostat.h:141
SinricProThermostat::ThermostatModeCallback
std::function< bool(const String &, String &)> ThermostatModeCallback
Callback definition for onThermostatMode function.
Definition: SinricProThermostat.h:75
SinricProThermostat::AdjustTargetTemperatureCallback
std::function< bool(const String &, float &)> AdjustTargetTemperatureCallback
Callback definition for onAdjustTargetTemperature function.
Definition: SinricProThermostat.h:59
SinricProThermostat::SetTargetTemperatureCallback
std::function< bool(const String &, float &)> SetTargetTemperatureCallback
Callback definition for onTargetTemperature function.
Definition: SinricProThermostat.h:43
SinricProThermostat
Device to control Thermostat.
Definition: SinricProThermostat.h:23
SinricProThermostat::sendTargetTemperatureEvent
bool sendTargetTemperatureEvent(float temperature, String cause="PHYSICAL_INTERACTION")
Send targetTemperature event to report target temperature change.
Definition: SinricProThermostat.h:194
SinricProDevice
Base class for all device types.
Definition: SinricProDevice.h:24
SinricProThermostat::sendTemperatureEvent
bool sendTemperatureEvent(float temperature, float humidity=-1, String cause="PERIODIC_POLL")
Send currentTemperature event to report actual temperature (measured by a sensor)
Definition: SinricProThermostat.h:177