Commit a90a97795ecf77b2bc314d63ad72b8800bb3fb8c
Committed by
Moritz Wirger
1 parent
a90248d3
Add documentation for Sensor and SensorList.
Add definitions for constexpr strings.
Showing
4 changed files
with
238 additions
and
25 deletions
include/hueplusplus/Sensor.h
| @@ -33,17 +33,28 @@ | @@ -33,17 +33,28 @@ | ||
| 33 | 33 | ||
| 34 | namespace hueplusplus | 34 | namespace hueplusplus |
| 35 | { | 35 | { |
| 36 | +//! \brief Specifies light alert modes | ||
| 36 | enum class Alert | 37 | enum class Alert |
| 37 | { | 38 | { |
| 38 | - none, | ||
| 39 | - select, | ||
| 40 | - lselect | 39 | + none, //!< No alert |
| 40 | + select, //!< Select alert (breathe cycle) | ||
| 41 | + lselect //!< Long select alert (15s breathe) | ||
| 41 | }; | 42 | }; |
| 43 | + | ||
| 44 | +//! \brief Convert alert to string form | ||
| 45 | +//! \param alert Enum value | ||
| 46 | +//! \returns "none", "select" or "lselect" | ||
| 42 | std::string alertToString(Alert alert); | 47 | std::string alertToString(Alert alert); |
| 48 | + | ||
| 49 | +//! \brief Convert string to Alert enum | ||
| 50 | +//! \param s String representation | ||
| 51 | +//! \returns Alert::select or Alert::lselect when \c s matches, otherwise Alert::none | ||
| 43 | Alert alertFromString(const std::string& s); | 52 | Alert alertFromString(const std::string& s); |
| 53 | + | ||
| 54 | +//! \brief Class for generic or unknown sensor types | ||
| 44 | //! | 55 | //! |
| 45 | -//! Generic class for Hue sensors | ||
| 46 | -//! | 56 | +//! It is recommended to instead use the classes for specific types in \ref sensors. |
| 57 | +//! This class should only be used if the type cannot be known or is not supported. | ||
| 47 | class Sensor : public BaseDevice | 58 | class Sensor : public BaseDevice |
| 48 | { | 59 | { |
| 49 | public: | 60 | public: |
| @@ -56,51 +67,134 @@ public: | @@ -56,51 +67,134 @@ public: | ||
| 56 | //!\name Config attributes | 67 | //!\name Config attributes |
| 57 | ///@{ | 68 | ///@{ |
| 58 | 69 | ||
| 70 | + //! \brief Get whether sensor has an on attribute | ||
| 59 | bool hasOn() const; | 71 | bool hasOn() const; |
| 60 | - // Check whether sensor is on. Does not update when off | 72 | + //! \brief Get whether sensor is turned on |
| 73 | + //! | ||
| 74 | + //! Sensors which are off do not change their status | ||
| 75 | + //! \throws nlohmann::json::out_of_range when on attribute does not exist. | ||
| 61 | bool isOn() const; | 76 | bool isOn() const; |
| 77 | + //! \brief Turn sensor on or off | ||
| 78 | + //! \throws std::system_error when system or socket operations fail | ||
| 79 | + //! \throws HueException when response contained no body | ||
| 80 | + //! \throws HueAPIResponseException when response contains an error | ||
| 81 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 62 | void setOn(bool on); | 82 | void setOn(bool on); |
| 63 | 83 | ||
| 84 | + //! \brief Get whether sensor has a battery state | ||
| 64 | bool hasBatteryState() const; | 85 | bool hasBatteryState() const; |
| 65 | - // Battery state in percent | 86 | + //! \brief Get battery state |
| 87 | + //! \returns Battery state in percent | ||
| 88 | + //! \throws nlohmann::json::out_of_range when sensor has no battery status. | ||
| 66 | int getBatteryState() const; | 89 | int getBatteryState() const; |
| 90 | + //! \brief Set battery state | ||
| 91 | + //! \throws std::system_error when system or socket operations fail | ||
| 92 | + //! \throws HueException when response contained no body | ||
| 93 | + //! \throws HueAPIResponseException when response contains an error | ||
| 94 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 67 | void setBatteryState(int percent); | 95 | void setBatteryState(int percent); |
| 68 | 96 | ||
| 97 | + //! \brief Get whether sensor has alerts | ||
| 69 | bool hasAlert() const; | 98 | bool hasAlert() const; |
| 99 | + //! \brief Get last sent alert | ||
| 100 | + //! \throws nlohmann::json::out_of_range when sensor has no alert. | ||
| 70 | Alert getLastAlert() const; | 101 | Alert getLastAlert() const; |
| 102 | + //! \brief Send alert | ||
| 103 | + //! \throws std::system_error when system or socket operations fail | ||
| 104 | + //! \throws HueException when response contained no body | ||
| 105 | + //! \throws HueAPIResponseException when response contains an error | ||
| 106 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 71 | void sendAlert(Alert type); | 107 | void sendAlert(Alert type); |
| 72 | 108 | ||
| 109 | + //! \brief Get whether sensor has reachable validation | ||
| 73 | bool hasReachable() const; | 110 | bool hasReachable() const; |
| 111 | + //! \brief Get whether sensor is reachable | ||
| 112 | + //! \throws nlohmann::json::out_of_range when sensor has no reachable validation | ||
| 74 | bool isReachable() const; | 113 | bool isReachable() const; |
| 75 | 114 | ||
| 115 | + //! \brief Get whether sensor has user test mode | ||
| 76 | bool hasUserTest() const; | 116 | bool hasUserTest() const; |
| 117 | + //! \brief Enable or disable user test mode | ||
| 118 | + //! | ||
| 119 | + //! In user test mode, changes are reported more frequently.# | ||
| 120 | + //! It remains on for 120 seconds or until turned off. | ||
| 121 | + //! \throws std::system_error when system or socket operations fail | ||
| 122 | + //! \throws HueException when response contained no body | ||
| 123 | + //! \throws HueAPIResponseException when response contains an error | ||
| 124 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 77 | void setUserTest(bool enabled); | 125 | void setUserTest(bool enabled); |
| 78 | 126 | ||
| 127 | + //! \brief Get whether sensor has a URL | ||
| 79 | bool hasURL() const; | 128 | bool hasURL() const; |
| 129 | + //! \brief Get sensor URL | ||
| 130 | + //! | ||
| 131 | + //! Only CLIP sensors can have a URL. | ||
| 80 | std::string getURL() const; | 132 | std::string getURL() const; |
| 133 | + //! \brief Set sensor URL | ||
| 134 | + //! \throws std::system_error when system or socket operations fail | ||
| 135 | + //! \throws HueException when response contained no body | ||
| 136 | + //! \throws HueAPIResponseException when response contains an error | ||
| 137 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 81 | void setURL(const std::string& url); | 138 | void setURL(const std::string& url); |
| 82 | - | 139 | + |
| 140 | + //! \brief Get pending config entries, if they exist | ||
| 141 | + //! \returns The keys of config entries which have been modified, | ||
| 142 | + //! but were not committed to the device. | ||
| 143 | + //! | ||
| 144 | + //! Attempts to set pending config entries may cause errors. | ||
| 83 | std::vector<std::string> getPendingConfig() const; | 145 | std::vector<std::string> getPendingConfig() const; |
| 84 | - | 146 | + |
| 147 | + //! \brief Get whether the sensor has a LED indicator | ||
| 85 | bool hasLEDIndication() const; | 148 | bool hasLEDIndication() const; |
| 149 | + //! \brief Get whether the indicator LED is on | ||
| 150 | + //! \throws nlohmann::json::out_of_range when sensor has no LED | ||
| 86 | bool getLEDIndication() const; | 151 | bool getLEDIndication() const; |
| 152 | + //! \brief Turn LED indicator on or off | ||
| 153 | + //! \throws std::system_error when system or socket operations fail | ||
| 154 | + //! \throws HueException when response contained no body | ||
| 155 | + //! \throws HueAPIResponseException when response contains an error | ||
| 156 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 87 | void setLEDIndication(bool on); | 157 | void setLEDIndication(bool on); |
| 88 | 158 | ||
| 159 | + //! \brief Get entire config object | ||
| 160 | + //! \returns A json object with the sensor configuration. | ||
| 89 | nlohmann::json getConfig() const; | 161 | nlohmann::json getConfig() const; |
| 162 | + //! \brief Set attribute in the sensor config | ||
| 163 | + //! \param key Key of the config attribute | ||
| 164 | + //! \param value Any value to set the attribute to | ||
| 165 | + //! | ||
| 166 | + //! Can be used to configure sensors with additional config entries. | ||
| 90 | void setConfigAttribute(const std::string& key, const nlohmann::json& value); | 167 | void setConfigAttribute(const std::string& key, const nlohmann::json& value); |
| 91 | 168 | ||
| 92 | ///@} | 169 | ///@} |
| 93 | - | 170 | + |
| 171 | + //! \brief Get time of last status update | ||
| 172 | + //! \returns The last update time, or a time with a zero duration from epoch | ||
| 173 | + //! if the last update time is not set. | ||
| 94 | time::AbsoluteTime getLastUpdated() const; | 174 | time::AbsoluteTime getLastUpdated() const; |
| 95 | - | 175 | + |
| 176 | + //! \brief Get state object | ||
| 96 | nlohmann::json getState() const; | 177 | nlohmann::json getState() const; |
| 178 | + //! \brief Set part of the sensor state | ||
| 179 | + //! \param key Key in the state object | ||
| 180 | + //! \param value New value | ||
| 181 | + //! | ||
| 182 | + //! The state can usually only be set on CLIP sensors, not on physical devices. | ||
| 97 | void setStateAttribute(const std::string& key, const nlohmann::json& value); | 183 | void setStateAttribute(const std::string& key, const nlohmann::json& value); |
| 98 | 184 | ||
| 185 | + //! \brief Check if sensor is Hue certified | ||
| 99 | bool isCertified() const; | 186 | bool isCertified() const; |
| 187 | + //! \brief Check if sensor is primary sensor of the device | ||
| 188 | + //! | ||
| 189 | + //! When there are multiple sensors on one physical device (same MAC address), | ||
| 190 | + //! the primary device is used for the device information. | ||
| 100 | bool isPrimary() const; | 191 | bool isPrimary() const; |
| 101 | 192 | ||
| 193 | + //! \brief Convert sensor to a specific type | ||
| 194 | + //! \tparam T Sensor type to convert to (from \ref sensors) | ||
| 195 | + //! \throws HueException when sensor type does not match requested type | ||
| 102 | template <typename T> | 196 | template <typename T> |
| 103 | - T asSensorType() const & | 197 | + T asSensorType() const& |
| 104 | { | 198 | { |
| 105 | if (getType() != T::typeStr) | 199 | if (getType() != T::typeStr) |
| 106 | { | 200 | { |
| @@ -108,6 +202,11 @@ public: | @@ -108,6 +202,11 @@ public: | ||
| 108 | } | 202 | } |
| 109 | return T(*this); | 203 | return T(*this); |
| 110 | } | 204 | } |
| 205 | + //! \brief Convert sensor to a specific type | ||
| 206 | + //! \tparam T Sensor type to convert to (from \ref sensors) | ||
| 207 | + //! \throws HueException when sensor type does not match requested type | ||
| 208 | + //! | ||
| 209 | + //! Move construct \c T to be more efficient when the type is wanted directly. | ||
| 111 | template <typename T> | 210 | template <typename T> |
| 112 | T asSensorType() && | 211 | T asSensorType() && |
| 113 | { | 212 | { |
| @@ -119,46 +218,124 @@ public: | @@ -119,46 +218,124 @@ public: | ||
| 119 | } | 218 | } |
| 120 | }; | 219 | }; |
| 121 | 220 | ||
| 221 | +//! \brief Parameters for creating a new Sensor | ||
| 222 | +//! | ||
| 223 | +//! Can be used like a builder object with chained calls. | ||
| 122 | class CreateSensor | 224 | class CreateSensor |
| 123 | { | 225 | { |
| 124 | public: | 226 | public: |
| 227 | + //! \brief Construct with necessary parameters | ||
| 228 | + //! \param name Human readable name | ||
| 229 | + //! \param modelid Model id of the sensor | ||
| 230 | + //! \param swversion Software version, may be empty | ||
| 231 | + //! \param type Sensor type name (see types in \ref sensors) | ||
| 232 | + //! \param uniqueid Globally unique ID | ||
| 233 | + //! (MAC address of the device, extended with a unique endpoint id) | ||
| 234 | + //! \param manufacturername Name of the device manufacturer | ||
| 125 | CreateSensor(const std::string& name, const std::string& modelid, const std::string& swversion, | 235 | CreateSensor(const std::string& name, const std::string& modelid, const std::string& swversion, |
| 126 | const std::string& type, const std::string& uniqueid, const std::string& manufacturername); | 236 | const std::string& type, const std::string& uniqueid, const std::string& manufacturername); |
| 127 | 237 | ||
| 238 | + //! \brief Set state object | ||
| 239 | + //! \param state Sensor state, contents depend on the type. | ||
| 240 | + //! \returns this object for chaining calls | ||
| 128 | CreateSensor& setState(const nlohmann::json& state); | 241 | CreateSensor& setState(const nlohmann::json& state); |
| 242 | + //! \brief Set config object | ||
| 243 | + //! \param config Sensor config, configs depend on the type. See getters in Sensor for examples. | ||
| 244 | + //! \returns this object for chaining calls | ||
| 129 | CreateSensor& setConfig(const nlohmann::json& config); | 245 | CreateSensor& setConfig(const nlohmann::json& config); |
| 246 | + //! \brief Enable recycling, delete automatically when not referenced | ||
| 247 | + //! \returns this object for chaining calls | ||
| 130 | CreateSensor& setRecycle(bool recycle); | 248 | CreateSensor& setRecycle(bool recycle); |
| 131 | 249 | ||
| 250 | + //! \brief Get request to create the sensor | ||
| 251 | + //! \returns JSON request for a POST to create the new sensor | ||
| 132 | nlohmann::json getRequest() const; | 252 | nlohmann::json getRequest() const; |
| 253 | + | ||
| 133 | protected: | 254 | protected: |
| 134 | nlohmann::json request; | 255 | nlohmann::json request; |
| 135 | }; | 256 | }; |
| 136 | 257 | ||
| 258 | +//! \brief Classes for specific sensor types | ||
| 259 | +//! | ||
| 260 | +//! Classes should have a typeStr member with the type name. | ||
| 137 | namespace sensors | 261 | namespace sensors |
| 138 | { | 262 | { |
| 263 | +//! \brief Daylight sensor to detect sunrise and sunset | ||
| 264 | +//! | ||
| 265 | +//! Every bridge has a daylight sensor always available. | ||
| 139 | class DaylightSensor : public BaseDevice | 266 | class DaylightSensor : public BaseDevice |
| 140 | { | 267 | { |
| 141 | public: | 268 | public: |
| 269 | + //! \brief Construct from generic sensor | ||
| 142 | explicit DaylightSensor(Sensor sensor) : BaseDevice(std::move(sensor)) { } | 270 | explicit DaylightSensor(Sensor sensor) : BaseDevice(std::move(sensor)) { } |
| 143 | 271 | ||
| 272 | + //! \brief Check if sensor is on | ||
| 273 | + //! | ||
| 274 | + //! Sensors which are off do not change their status | ||
| 144 | bool isOn() const; | 275 | bool isOn() const; |
| 276 | + | ||
| 277 | + //! \brief Enable or disable sensor | ||
| 278 | + //! \throws std::system_error when system or socket operations fail | ||
| 279 | + //! \throws HueException when response contained no body | ||
| 280 | + //! \throws HueAPIResponseException when response contains an error | ||
| 281 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 145 | void setOn(bool on); | 282 | void setOn(bool on); |
| 146 | 283 | ||
| 284 | + //! \brief Get whether sensor has a battery state | ||
| 147 | bool hasBatteryState() const; | 285 | bool hasBatteryState() const; |
| 286 | + //! \brief Get battery state | ||
| 287 | + //! \returns Battery state in percent | ||
| 288 | + //! \throws nlohmann::json::out_of_range when sensor has no battery status. | ||
| 148 | int getBatteryState() const; | 289 | int getBatteryState() const; |
| 290 | + //! \brief Set battery state | ||
| 291 | + //! \throws std::system_error when system or socket operations fail | ||
| 292 | + //! \throws HueException when response contained no body | ||
| 293 | + //! \throws HueAPIResponseException when response contains an error | ||
| 294 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 149 | void setBatteryState(int percent); | 295 | void setBatteryState(int percent); |
| 150 | 296 | ||
| 297 | + //! \brief Set GPS coordinates for the calculation | ||
| 298 | + //! \param latitude Decimal latitude coordinate "DDD.DDDD{N|S}" with leading zeros ending with N or S. | ||
| 299 | + //! "none" to reset. (Empty string is null, which may be used instead of none in the future) | ||
| 300 | + //! \param longitude Longitude coordinate (same format as latitude), ending with W or E | ||
| 301 | + //! \throws std::system_error when system or socket operations fail | ||
| 302 | + //! \throws HueException when response contained no body | ||
| 303 | + //! \throws HueAPIResponseException when response contains an error | ||
| 304 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 151 | void setCoordinates(const std::string& latitude, const std::string& longitude); | 305 | void setCoordinates(const std::string& latitude, const std::string& longitude); |
| 306 | + //! \brief Check whether coordinates are configured | ||
| 307 | + //! | ||
| 308 | + //! There is no way to retrieve the configured coordinates. | ||
| 152 | bool isConfigured() const; | 309 | bool isConfigured() const; |
| 153 | 310 | ||
| 311 | + //! \brief Get time offset in minutes to sunrise | ||
| 312 | + //! | ||
| 313 | + //! The daylight is true if it is \c offset minutes after sunrise. | ||
| 154 | int getSunriseOffset() const; | 314 | int getSunriseOffset() const; |
| 315 | + //! \brief Set sunrise offset time | ||
| 316 | + //! \param minutes Minutes from -120 to 120 | ||
| 317 | + //! \throws std::system_error when system or socket operations fail | ||
| 318 | + //! \throws HueException when response contained no body | ||
| 319 | + //! \throws HueAPIResponseException when response contains an error | ||
| 320 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 155 | void setSunriseOffset(int minutes); | 321 | void setSunriseOffset(int minutes); |
| 156 | 322 | ||
| 323 | + //! \brief Get time offset in minutes to sunset | ||
| 324 | + //! | ||
| 325 | + //! The daylight is false if it is \c offset minutes after sunset. | ||
| 157 | int getSunsetOffset() const; | 326 | int getSunsetOffset() const; |
| 327 | + //! \brief Set sunset offset time | ||
| 328 | + //! \param minutes Minutes from -120 to 120 | ||
| 329 | + //! \throws std::system_error when system or socket operations fail | ||
| 330 | + //! \throws HueException when response contained no body | ||
| 331 | + //! \throws HueAPIResponseException when response contains an error | ||
| 332 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 158 | void setSunsetOffset(int minutes); | 333 | void setSunsetOffset(int minutes); |
| 159 | 334 | ||
| 335 | + //! \brief Get reported daylight status | ||
| 160 | bool isDaylight() const; | 336 | bool isDaylight() const; |
| 161 | 337 | ||
| 338 | + //! \brief Daylight sensor type name | ||
| 162 | static constexpr const char* typeStr = "Daylight"; | 339 | static constexpr const char* typeStr = "Daylight"; |
| 163 | }; | 340 | }; |
| 164 | 341 |
include/hueplusplus/SensorList.h
| @@ -27,16 +27,34 @@ | @@ -27,16 +27,34 @@ | ||
| 27 | 27 | ||
| 28 | namespace hueplusplus | 28 | namespace hueplusplus |
| 29 | { | 29 | { |
| 30 | +//! \brief Handles a list of Sensor%s with type specific getters | ||
| 31 | +//! | ||
| 32 | +//! Allows to directly get the requested sensor type or all sensors of a given type. | ||
| 30 | class SensorList : public CreateableResourceList<Sensor, int, CreateSensor> | 33 | class SensorList : public CreateableResourceList<Sensor, int, CreateSensor> |
| 31 | { | 34 | { |
| 32 | public: | 35 | public: |
| 33 | using CreateableResourceList::CreateableResourceList; | 36 | using CreateableResourceList::CreateableResourceList; |
| 34 | 37 | ||
| 38 | + //! \brief Get sensor specified by id, convert to \c T | ||
| 39 | + //! \param id Sensor id | ||
| 40 | + //! \tparam T Sensor type to convert to (from \ref sensors) | ||
| 41 | + //! \returns The sensor matching the id and type | ||
| 42 | + //! \throws HueException when id does not exist or type does not match | ||
| 43 | + //! \throws std::system_error when system or socket operations fail | ||
| 44 | + //! \throws HueAPIResponseException when response contains an error | ||
| 45 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 35 | template <typename T> | 46 | template <typename T> |
| 36 | T getAsType(int id) | 47 | T getAsType(int id) |
| 37 | { | 48 | { |
| 38 | return get(id).asSensorType<T>(); | 49 | return get(id).asSensorType<T>(); |
| 39 | } | 50 | } |
| 51 | + //! \brief Get all sensors of type \c T | ||
| 52 | + //! \tparam T Sensor type to get (from \ref sensors) | ||
| 53 | + //! \returns All sensors matching the type | ||
| 54 | + //! \throws HueException when response contains no body | ||
| 55 | + //! \throws std::system_error when system or socket operations fail | ||
| 56 | + //! \throws HueAPIResponseException when response contains an error | ||
| 57 | + //! \throws nlohmann::json::parse_error when response could not be parsed | ||
| 40 | template <typename T> | 58 | template <typename T> |
| 41 | std::vector<T> getAllByType() | 59 | std::vector<T> getAllByType() |
| 42 | { | 60 | { |
| @@ -54,7 +72,9 @@ public: | @@ -54,7 +72,9 @@ public: | ||
| 54 | } | 72 | } |
| 55 | 73 | ||
| 56 | protected: | 74 | protected: |
| 75 | + //! \brief Protected defaulted move constructor | ||
| 57 | SensorList(SensorList&&) = default; | 76 | SensorList(SensorList&&) = default; |
| 77 | + //! \brief Protected defaulted move assignment | ||
| 58 | SensorList& operator=(SensorList&&) = default; | 78 | SensorList& operator=(SensorList&&) = default; |
| 59 | }; | 79 | }; |
| 60 | } // namespace hueplusplus | 80 | } // namespace hueplusplus |
src/CLIPSensors.cpp
| @@ -63,57 +63,65 @@ std::string BaseCLIP::getURL() const | @@ -63,57 +63,65 @@ std::string BaseCLIP::getURL() const | ||
| 63 | } | 63 | } |
| 64 | void BaseCLIP::setURL(const std::string& url) | 64 | void BaseCLIP::setURL(const std::string& url) |
| 65 | { | 65 | { |
| 66 | - sendPutRequest("/config", nlohmann::json{ {"url", url} }, CURRENT_FILE_INFO); | 66 | + sendPutRequest("/config", nlohmann::json {{"url", url}}, CURRENT_FILE_INFO); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | - | ||
| 70 | time::AbsoluteTime BaseCLIP::getLastUpdated() const | 69 | time::AbsoluteTime BaseCLIP::getLastUpdated() const |
| 71 | { | 70 | { |
| 72 | const nlohmann::json& stateJson = state.getValue().at("state"); | 71 | const nlohmann::json& stateJson = state.getValue().at("state"); |
| 73 | auto it = stateJson.find("lastupdated"); | 72 | auto it = stateJson.find("lastupdated"); |
| 74 | if (it == stateJson.end() || !it->is_string() || *it == "none") | 73 | if (it == stateJson.end() || !it->is_string() || *it == "none") |
| 75 | { | 74 | { |
| 76 | - return time::AbsoluteTime(std::chrono::system_clock::time_point(std::chrono::seconds{ 0 })); | 75 | + return time::AbsoluteTime(std::chrono::system_clock::time_point(std::chrono::seconds {0})); |
| 77 | } | 76 | } |
| 78 | return time::AbsoluteTime::parseUTC(it->get<std::string>()); | 77 | return time::AbsoluteTime::parseUTC(it->get<std::string>()); |
| 79 | } | 78 | } |
| 80 | 79 | ||
| 80 | +constexpr const char* CLIPSwitch::typeStr; | ||
| 81 | + | ||
| 81 | int CLIPSwitch::getButtonEvent() const | 82 | int CLIPSwitch::getButtonEvent() const |
| 82 | { | 83 | { |
| 83 | return state.getValue().at("state").at("buttonevent").get<int>(); | 84 | return state.getValue().at("state").at("buttonevent").get<int>(); |
| 84 | } | 85 | } |
| 85 | void CLIPSwitch::setButtonEvent(int code) | 86 | void CLIPSwitch::setButtonEvent(int code) |
| 86 | { | 87 | { |
| 87 | - sendPutRequest("/state", nlohmann::json{ {"buttonevent", code} }, CURRENT_FILE_INFO); | 88 | + sendPutRequest("/state", nlohmann::json {{"buttonevent", code}}, CURRENT_FILE_INFO); |
| 88 | } | 89 | } |
| 89 | 90 | ||
| 91 | +constexpr const char* CLIPOpenClose::typeStr; | ||
| 92 | + | ||
| 90 | bool CLIPOpenClose::isOpen() const | 93 | bool CLIPOpenClose::isOpen() const |
| 91 | { | 94 | { |
| 92 | return state.getValue().at("state").at("open").get<bool>(); | 95 | return state.getValue().at("state").at("open").get<bool>(); |
| 93 | } | 96 | } |
| 94 | void CLIPOpenClose::setOpen(bool open) | 97 | void CLIPOpenClose::setOpen(bool open) |
| 95 | { | 98 | { |
| 96 | - sendPutRequest("/state", nlohmann::json{ {"open", open} }, CURRENT_FILE_INFO); | 99 | + sendPutRequest("/state", nlohmann::json {{"open", open}}, CURRENT_FILE_INFO); |
| 97 | } | 100 | } |
| 98 | 101 | ||
| 102 | +constexpr const char* CLIPPresence::typeStr; | ||
| 103 | + | ||
| 99 | bool CLIPPresence::getPresence() const | 104 | bool CLIPPresence::getPresence() const |
| 100 | { | 105 | { |
| 101 | return state.getValue().at("state").at("presence").get<bool>(); | 106 | return state.getValue().at("state").at("presence").get<bool>(); |
| 102 | } | 107 | } |
| 103 | void CLIPPresence::setPresence(bool presence) | 108 | void CLIPPresence::setPresence(bool presence) |
| 104 | { | 109 | { |
| 105 | - sendPutRequest("/state", nlohmann::json{ {"presence", presence} }, CURRENT_FILE_INFO); | 110 | + sendPutRequest("/state", nlohmann::json {{"presence", presence}}, CURRENT_FILE_INFO); |
| 106 | } | 111 | } |
| 107 | 112 | ||
| 113 | +constexpr const char* CLIPTemperature::typeStr; | ||
| 114 | + | ||
| 108 | int CLIPTemperature::getTemperature() const | 115 | int CLIPTemperature::getTemperature() const |
| 109 | { | 116 | { |
| 110 | return state.getValue().at("state").at("temperature").get<int>(); | 117 | return state.getValue().at("state").at("temperature").get<int>(); |
| 111 | } | 118 | } |
| 112 | void CLIPTemperature::setTemperature(int temperature) | 119 | void CLIPTemperature::setTemperature(int temperature) |
| 113 | { | 120 | { |
| 114 | - sendPutRequest("/state", nlohmann::json{ {"temperature", temperature} }, CURRENT_FILE_INFO); | 121 | + sendPutRequest("/state", nlohmann::json {{"temperature", temperature}}, CURRENT_FILE_INFO); |
| 115 | } | 122 | } |
| 116 | 123 | ||
| 124 | +constexpr const char* CLIPHumidity::typeStr; | ||
| 117 | 125 | ||
| 118 | int CLIPHumidity::getHumidity() const | 126 | int CLIPHumidity::getHumidity() const |
| 119 | { | 127 | { |
| @@ -121,9 +129,11 @@ int CLIPHumidity::getHumidity() const | @@ -121,9 +129,11 @@ int CLIPHumidity::getHumidity() const | ||
| 121 | } | 129 | } |
| 122 | void CLIPHumidity::setHumidity(int humidity) | 130 | void CLIPHumidity::setHumidity(int humidity) |
| 123 | { | 131 | { |
| 124 | - sendPutRequest("/state", nlohmann::json{ {"humidity", humidity} }, CURRENT_FILE_INFO); | 132 | + sendPutRequest("/state", nlohmann::json {{"humidity", humidity}}, CURRENT_FILE_INFO); |
| 125 | } | 133 | } |
| 126 | 134 | ||
| 135 | +constexpr const char* CLIPLightLevel::typeStr; | ||
| 136 | + | ||
| 127 | int CLIPLightLevel::getDarkThreshold() const | 137 | int CLIPLightLevel::getDarkThreshold() const |
| 128 | { | 138 | { |
| 129 | return state.getValue().at("config").at("tholddark").get<int>(); | 139 | return state.getValue().at("config").at("tholddark").get<int>(); |
| @@ -131,7 +141,7 @@ int CLIPLightLevel::getDarkThreshold() const | @@ -131,7 +141,7 @@ int CLIPLightLevel::getDarkThreshold() const | ||
| 131 | 141 | ||
| 132 | void CLIPLightLevel::setDarkThreshold(int threshold) | 142 | void CLIPLightLevel::setDarkThreshold(int threshold) |
| 133 | { | 143 | { |
| 134 | - sendPutRequest("/config", nlohmann::json{ { "tholddark", threshold} }, CURRENT_FILE_INFO); | 144 | + sendPutRequest("/config", nlohmann::json {{"tholddark", threshold}}, CURRENT_FILE_INFO); |
| 135 | } | 145 | } |
| 136 | int CLIPLightLevel::getThresholdOffset() const | 146 | int CLIPLightLevel::getThresholdOffset() const |
| 137 | { | 147 | { |
| @@ -140,7 +150,7 @@ int CLIPLightLevel::getThresholdOffset() const | @@ -140,7 +150,7 @@ int CLIPLightLevel::getThresholdOffset() const | ||
| 140 | 150 | ||
| 141 | void CLIPLightLevel::setThresholdOffset(int offset) | 151 | void CLIPLightLevel::setThresholdOffset(int offset) |
| 142 | { | 152 | { |
| 143 | - sendPutRequest("/config", nlohmann::json{ { "tholdoffset", offset} }, CURRENT_FILE_INFO); | 153 | + sendPutRequest("/config", nlohmann::json {{"tholdoffset", offset}}, CURRENT_FILE_INFO); |
| 144 | } | 154 | } |
| 145 | 155 | ||
| 146 | int CLIPLightLevel::getLightLevel() const | 156 | int CLIPLightLevel::getLightLevel() const |
| @@ -150,7 +160,7 @@ int CLIPLightLevel::getLightLevel() const | @@ -150,7 +160,7 @@ int CLIPLightLevel::getLightLevel() const | ||
| 150 | 160 | ||
| 151 | void CLIPLightLevel::setLightLevel(int level) | 161 | void CLIPLightLevel::setLightLevel(int level) |
| 152 | { | 162 | { |
| 153 | - sendPutRequest("/state", nlohmann::json{ {"lightlevel", level} }, CURRENT_FILE_INFO); | 163 | + sendPutRequest("/state", nlohmann::json {{"lightlevel", level}}, CURRENT_FILE_INFO); |
| 154 | } | 164 | } |
| 155 | 165 | ||
| 156 | bool CLIPLightLevel::isDark() const | 166 | bool CLIPLightLevel::isDark() const |
| @@ -163,15 +173,19 @@ bool CLIPLightLevel::isDaylight() const | @@ -163,15 +173,19 @@ bool CLIPLightLevel::isDaylight() const | ||
| 163 | return state.getValue().at("state").at("daylight").get<bool>(); | 173 | return state.getValue().at("state").at("daylight").get<bool>(); |
| 164 | } | 174 | } |
| 165 | 175 | ||
| 176 | +constexpr const char* CLIPGenericFlag::typeStr; | ||
| 177 | + | ||
| 166 | bool CLIPGenericFlag::getFlag() const | 178 | bool CLIPGenericFlag::getFlag() const |
| 167 | { | 179 | { |
| 168 | return state.getValue().at("state").at("flag").get<bool>(); | 180 | return state.getValue().at("state").at("flag").get<bool>(); |
| 169 | } | 181 | } |
| 170 | void CLIPGenericFlag::setFlag(bool flag) | 182 | void CLIPGenericFlag::setFlag(bool flag) |
| 171 | { | 183 | { |
| 172 | - sendPutRequest("/state", nlohmann::json{ {"flag", flag} }, CURRENT_FILE_INFO); | 184 | + sendPutRequest("/state", nlohmann::json {{"flag", flag}}, CURRENT_FILE_INFO); |
| 173 | } | 185 | } |
| 174 | 186 | ||
| 187 | +constexpr const char* CLIPGenericStatus::typeStr; | ||
| 188 | + | ||
| 175 | int CLIPGenericStatus::getStatus() const | 189 | int CLIPGenericStatus::getStatus() const |
| 176 | { | 190 | { |
| 177 | return state.getValue().at("config").at("status").get<int>(); | 191 | return state.getValue().at("config").at("status").get<int>(); |
| @@ -179,7 +193,7 @@ int CLIPGenericStatus::getStatus() const | @@ -179,7 +193,7 @@ int CLIPGenericStatus::getStatus() const | ||
| 179 | 193 | ||
| 180 | void CLIPGenericStatus::setStatus(int status) | 194 | void CLIPGenericStatus::setStatus(int status) |
| 181 | { | 195 | { |
| 182 | - sendPutRequest("/config", nlohmann::json{ { "status", status} }, CURRENT_FILE_INFO); | 196 | + sendPutRequest("/config", nlohmann::json {{"status", status}}, CURRENT_FILE_INFO); |
| 183 | } | 197 | } |
| 184 | } // namespace sensors | 198 | } // namespace sensors |
| 185 | } // namespace hueplusplus | 199 | } // namespace hueplusplus |
| 186 | \ No newline at end of file | 200 | \ No newline at end of file |
src/Sensor.cpp
| @@ -261,6 +261,8 @@ nlohmann::json CreateSensor::getRequest() const | @@ -261,6 +261,8 @@ nlohmann::json CreateSensor::getRequest() const | ||
| 261 | namespace sensors | 261 | namespace sensors |
| 262 | { | 262 | { |
| 263 | 263 | ||
| 264 | +constexpr const char* DaylightSensor::typeStr; | ||
| 265 | + | ||
| 264 | bool DaylightSensor::isOn() const | 266 | bool DaylightSensor::isOn() const |
| 265 | { | 267 | { |
| 266 | return state.getValue().at("config").at("on").get<bool>(); | 268 | return state.getValue().at("config").at("on").get<bool>(); |