Commit 69254c49db051dca7f1ac71c08c9f2966346cd27
Committed by
Moritz Wirger
1 parent
51785aeb
Add sensor support
Showing
9 changed files
with
554 additions
and
88 deletions
include/hueplusplus/Hue.h
include/hueplusplus/HueLight.h
| ... | ... | @@ -30,6 +30,7 @@ |
| 30 | 30 | #include "ColorHueStrategy.h" |
| 31 | 31 | #include "ColorTemperatureStrategy.h" |
| 32 | 32 | #include "HueCommandAPI.h" |
| 33 | +#include "HueThing.h" | |
| 33 | 34 | #include "StateTransaction.h" |
| 34 | 35 | |
| 35 | 36 | #include "json/json.hpp" |
| ... | ... | @@ -95,7 +96,7 @@ enum class ColorType |
| 95 | 96 | //! \brief Class for Hue Light fixtures |
| 96 | 97 | //! |
| 97 | 98 | //! Provides methods to query and control lights. |
| 98 | -class HueLight | |
| 99 | +class HueLight : public HueThing | |
| 99 | 100 | { |
| 100 | 101 | friend class HueLightFactory; |
| 101 | 102 | friend class SimpleBrightnessStrategy; |
| ... | ... | @@ -111,6 +112,31 @@ public: |
| 111 | 112 | //! \name General information |
| 112 | 113 | ///@{ |
| 113 | 114 | |
| 115 | + //! \brief Function that turns the light off. | |
| 116 | + //! | |
| 117 | + //! \param transition Optional parameter to set the transition from current state to new, standard is 4 = 400ms | |
| 118 | + //! \return Bool that is true on success | |
| 119 | + //! \throws std::system_error when system or socket operations fail | |
| 120 | + //! \throws HueException when response contained no body | |
| 121 | + //! \throws HueAPIResponseException when response contains an error | |
| 122 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 123 | + virtual bool Off(uint8_t transition = 4); | |
| 124 | + | |
| 125 | + //! \brief Function to check whether a light is on or off | |
| 126 | + //! | |
| 127 | + //! \return Bool that is true, when the light is on and false, when off | |
| 128 | + //! \throws std::system_error when system or socket operations fail | |
| 129 | + //! \throws HueException when response contained no body | |
| 130 | + //! \throws HueAPIResponseException when response contains an error | |
| 131 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 132 | + virtual bool isOn(); | |
| 133 | + | |
| 134 | + //! \brief Const function to check whether a light is on or off | |
| 135 | + //! | |
| 136 | + //! \note This will not refresh the light state | |
| 137 | + //! \return Bool that is true, when the light is on and false, when off | |
| 138 | + virtual bool isOn() const; | |
| 139 | + | |
| 114 | 140 | //! \brief Const function that returns the id of this light |
| 115 | 141 | //! |
| 116 | 142 | //! \return integer representing the light id |
| ... | ... | @@ -118,13 +144,7 @@ public: |
| 118 | 144 | |
| 119 | 145 | //! \brief Const function that returns the light type |
| 120 | 146 | //! |
| 121 | - //! The type determines which functions the light has. | |
| 122 | 147 | //! \return String containing the type |
| 123 | - //! - "On/Off light": on/off | |
| 124 | - //! - "Dimmable light": on/off, brightness | |
| 125 | - //! - "Color light": on/off, brightness, color hue/sat/xy | |
| 126 | - //! - "Color temperature light": on/off, brightness, color temperature | |
| 127 | - //! - "Extended color light": on/off, brightness, color temperature, color hue/sat/xy | |
| 128 | 148 | virtual std::string getType() const; |
| 129 | 149 | |
| 130 | 150 | //! \brief Function that returns the name of the light. |
| ... | ... | @@ -142,15 +162,6 @@ public: |
| 142 | 162 | //! \return String containig the name of the light |
| 143 | 163 | virtual std::string getName() const; |
| 144 | 164 | |
| 145 | - //! \brief Function that sets the name of the light | |
| 146 | - //! | |
| 147 | - //! \return Bool that is true on success | |
| 148 | - //! \throws std::system_error when system or socket operations fail | |
| 149 | - //! \throws HueException when response contained no body | |
| 150 | - //! \throws HueAPIResponseException when response contains an error | |
| 151 | - //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 152 | - virtual bool setName(const std::string& name); | |
| 153 | - | |
| 154 | 165 | //! \brief Const function that returns the modelid of the light |
| 155 | 166 | //! |
| 156 | 167 | //! \return String conatining the modelid |
| ... | ... | @@ -180,22 +191,6 @@ public: |
| 180 | 191 | //! \return String containing the luminaireuniqueid or an empty string when the function is not supported |
| 181 | 192 | virtual std::string getLuminaireUId() const; |
| 182 | 193 | |
| 183 | - //! \brief Function that returns the software version of the light | |
| 184 | - //! | |
| 185 | - //! \return String containing the software version | |
| 186 | - //! \throws std::system_error when system or socket operations fail | |
| 187 | - //! \throws HueException when response contained no body | |
| 188 | - //! \throws HueAPIResponseException when response contains an error | |
| 189 | - //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 190 | - virtual std::string getSwVersion(); | |
| 191 | - | |
| 192 | - //! \brief Const function that returns the software version of the light | |
| 193 | - //! | |
| 194 | - //! \note This will not refresh the light state | |
| 195 | - //! \return String containing the software version | |
| 196 | - virtual std::string getSwVersion() const; | |
| 197 | - | |
| 198 | - | |
| 199 | 194 | //! \brief Const function that returns the color type of the light. |
| 200 | 195 | //! |
| 201 | 196 | //! \return ColorType containig the color type of the light | ... | ... |
include/hueplusplus/HueSensor.h
0 โ 100644
| 1 | +/** | |
| 2 | + \file HueSensor.h | |
| 3 | + Copyright Notice\n | |
| 4 | + Copyright (C) 2020 Stefan Herbrechtsmeier - developer\n | |
| 5 | + | |
| 6 | + This file is part of hueplusplus. | |
| 7 | + | |
| 8 | + hueplusplus is free software: you can redistribute it and/or modify | |
| 9 | + it under the terms of the GNU Lesser General Public License as published by | |
| 10 | + the Free Software Foundation, either version 3 of the License, or | |
| 11 | + (at your option) any later version. | |
| 12 | + | |
| 13 | + hueplusplus is distributed in the hope that it will be useful, | |
| 14 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | + GNU Lesser General Public License for more details. | |
| 17 | + | |
| 18 | + You should have received a copy of the GNU Lesser General Public License | |
| 19 | + along with hueplusplus. If not, see <http://www.gnu.org/licenses/>. | |
| 20 | +**/ | |
| 21 | + | |
| 22 | +#ifndef INCLUDE_HUEPLUSPLUS_HUE_SENSOR_H | |
| 23 | +#define INCLUDE_HUEPLUSPLUS_HUE_SENSOR_H | |
| 24 | + | |
| 25 | +#include <memory> | |
| 26 | + | |
| 27 | +#include "HueCommandAPI.h" | |
| 28 | +#include "HueThing.h" | |
| 29 | + | |
| 30 | +#include "json/json.hpp" | |
| 31 | + | |
| 32 | +namespace hueplusplus | |
| 33 | +{ | |
| 34 | +//! | |
| 35 | +//! Class for Hue Sensor fixtures | |
| 36 | +//! | |
| 37 | +class HueSensor : public HueThing | |
| 38 | +{ | |
| 39 | + friend class Hue; | |
| 40 | + | |
| 41 | +public: | |
| 42 | + //! \brief std dtor | |
| 43 | + ~HueSensor() = default; | |
| 44 | + | |
| 45 | + //! \brief Function to get button event | |
| 46 | + //! | |
| 47 | + //! \return integer representing the button event | |
| 48 | + //! \throws std::system_error when system or socket operations fail | |
| 49 | + //! \throws HueException when response contained no body | |
| 50 | + //! \throws HueAPIResponseException when response contains an error | |
| 51 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 52 | + virtual int getButtonEvent(); | |
| 53 | + | |
| 54 | + //! \brief Const function to get button event | |
| 55 | + //! | |
| 56 | + //! \note This will not refresh the sensor state | |
| 57 | + //! \return integer representing the button event | |
| 58 | + virtual int getButtonEvent() const; | |
| 59 | + | |
| 60 | + //! \brief Function to get sensor status | |
| 61 | + //! | |
| 62 | + //! \return integer representing the status | |
| 63 | + //! \throws std::system_error when system or socket operations fail | |
| 64 | + //! \throws HueException when response contained no body | |
| 65 | + //! \throws HueAPIResponseException when response contains an error | |
| 66 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 67 | + virtual int getStatus(); | |
| 68 | + | |
| 69 | + //! \brief Const function to get sensor status | |
| 70 | + //! | |
| 71 | + //! \note This will not refresh the sensor state | |
| 72 | + //! \return integer representing the button event | |
| 73 | + virtual int getStatus() const; | |
| 74 | + | |
| 75 | + //! \brief Const function to check whether this sensor has a button event | |
| 76 | + //! | |
| 77 | + //! \return Bool that is true when the sensor has specified abilities and false | |
| 78 | + //! when not | |
| 79 | + virtual bool hasButtonEvent() const; | |
| 80 | + | |
| 81 | + //! \brief Const function to check whether this sensor has a status | |
| 82 | + //! | |
| 83 | + //! \return Bool that is true when the sensor has specified abilities and false | |
| 84 | + //! when not | |
| 85 | + virtual bool hasStatus() const; | |
| 86 | + | |
| 87 | +protected: | |
| 88 | + //! \brief Protected ctor that is used by \ref Hue class. | |
| 89 | + //! | |
| 90 | + //! \param id Integer that specifies the id of this sensor | |
| 91 | + //! \param commands HueCommandAPI for communication with the bridge | |
| 92 | + //! | |
| 93 | + //! leaves strategies unset | |
| 94 | + HueSensor(int id, const HueCommandAPI& commands); | |
| 95 | +}; | |
| 96 | +} // namespace hueplusplus | |
| 97 | + | |
| 98 | +#endif | ... | ... |
include/hueplusplus/HueThing.h
0 โ 100644
| 1 | +/** | |
| 2 | + \file HueThing.h | |
| 3 | + Copyright Notice\n | |
| 4 | + Copyright (C) 2017 Jan Rogall - developer\n | |
| 5 | + Copyright (C) 2017 Moritz Wirger - developer\n | |
| 6 | + | |
| 7 | + This file is part of hueplusplus. | |
| 8 | + | |
| 9 | + hueplusplus is free software: you can redistribute it and/or modify | |
| 10 | + it under the terms of the GNU Lesser General Public License as published by | |
| 11 | + the Free Software Foundation, either version 3 of the License, or | |
| 12 | + (at your option) any later version. | |
| 13 | + | |
| 14 | + hueplusplus is distributed in the hope that it will be useful, | |
| 15 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 | + GNU Lesser General Public License for more details. | |
| 18 | + | |
| 19 | + You should have received a copy of the GNU Lesser General Public License | |
| 20 | + along with hueplusplus. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +**/ | |
| 22 | + | |
| 23 | +#ifndef INCLUDE_HUEPLUSPLUS_HUE_THING_H | |
| 24 | +#define INCLUDE_HUEPLUSPLUS_HUE_THING_H | |
| 25 | + | |
| 26 | +#include <memory> | |
| 27 | + | |
| 28 | +#include "HueCommandAPI.h" | |
| 29 | + | |
| 30 | +#include "json/json.hpp" | |
| 31 | + | |
| 32 | +namespace hueplusplus | |
| 33 | +{ | |
| 34 | +//! | |
| 35 | +//! Class for Hue Thing fixtures | |
| 36 | +//! | |
| 37 | +class HueThing | |
| 38 | +{ | |
| 39 | +public: | |
| 40 | + //! \brief std dtor | |
| 41 | + ~HueThing() = default; | |
| 42 | + | |
| 43 | + //! \brief Const function that returns the id of this thing | |
| 44 | + //! | |
| 45 | + //! \return integer representing the thing id | |
| 46 | + virtual int getId() const; | |
| 47 | + | |
| 48 | + //! \brief Const function that returns the thing type | |
| 49 | + //! | |
| 50 | + //! \return String containing the type | |
| 51 | + virtual std::string getType() const; | |
| 52 | + | |
| 53 | + //! \brief Function that returns the name of the thing. | |
| 54 | + //! | |
| 55 | + //! \return String containig the name of the thing | |
| 56 | + //! \throws std::system_error when system or socket operations fail | |
| 57 | + //! \throws HueException when response contained no body | |
| 58 | + //! \throws HueAPIResponseException when response contains an error | |
| 59 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 60 | + virtual std::string getName(); | |
| 61 | + | |
| 62 | + //! \brief Const function that returns the name of the thing. | |
| 63 | + //! | |
| 64 | + //! \note This will not refresh the thing state | |
| 65 | + //! \return String containig the name of the thing | |
| 66 | + virtual std::string getName() const; | |
| 67 | + | |
| 68 | + //! \brief Const function that returns the modelid of the thing | |
| 69 | + //! | |
| 70 | + //! \return String conatining the modelid | |
| 71 | + virtual std::string getModelId() const; | |
| 72 | + | |
| 73 | + //! \brief Const function that returns the uniqueid of the thing | |
| 74 | + //! | |
| 75 | + //! \note Only working on bridges with versions starting at 1.4 | |
| 76 | + //! \return String containing the uniqueid or an empty string when the function is not supported | |
| 77 | + virtual std::string getUId() const; | |
| 78 | + | |
| 79 | + //! \brief Const function that returns the manufacturername of the thing | |
| 80 | + //! | |
| 81 | + //! \note Only working on bridges with versions starting at 1.7 | |
| 82 | + //! \return String containing the manufacturername or an empty string when the function is not supported | |
| 83 | + virtual std::string getManufacturername() const; | |
| 84 | + | |
| 85 | + //! \brief Const function that returns the productname of the thing | |
| 86 | + //! | |
| 87 | + //! \note Only working on bridges with versions starting at 1.24 | |
| 88 | + //! \return String containing the productname or an empty string when the function is not supported | |
| 89 | + virtual std::string getProductname() const; | |
| 90 | + | |
| 91 | + //! \brief Function that returns the software version of the thing | |
| 92 | + //! | |
| 93 | + //! \return String containing the software version | |
| 94 | + //! \throws std::system_error when system or socket operations fail | |
| 95 | + //! \throws HueException when response contained no body | |
| 96 | + //! \throws HueAPIResponseException when response contains an error | |
| 97 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 98 | + virtual std::string getSwVersion(); | |
| 99 | + | |
| 100 | + //! \brief Const function that returns the software version of the thing | |
| 101 | + //! | |
| 102 | + //! \note This will not refresh the thing state | |
| 103 | + //! \return String containing the software version | |
| 104 | + virtual std::string getSwVersion() const; | |
| 105 | + | |
| 106 | + //! \brief Function that sets the name of the thing | |
| 107 | + //! | |
| 108 | + //! \return Bool that is true on success | |
| 109 | + //! \throws std::system_error when system or socket operations fail | |
| 110 | + //! \throws HueException when response contained no body | |
| 111 | + //! \throws HueAPIResponseException when response contains an error | |
| 112 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 113 | + virtual bool setName(const std::string& name); | |
| 114 | + | |
| 115 | +protected: | |
| 116 | + //! \brief Protected ctor that is used by \ref Hue class. | |
| 117 | + //! | |
| 118 | + //! \param id Integer that specifies the id of this thing | |
| 119 | + //! \param commands HueCommandAPI for communication with the bridge | |
| 120 | + //! | |
| 121 | + //! leaves strategies unset | |
| 122 | + HueThing(int id, const HueCommandAPI& commands, const std::string& path); | |
| 123 | + | |
| 124 | + //! \brief Protected function that sets the HueCommandAPI. | |
| 125 | + //! | |
| 126 | + //! The HueCommandAPI is used for bridge communication | |
| 127 | + //! \param commandAPI the new HueCommandAPI | |
| 128 | + virtual void setCommandAPI(const HueCommandAPI& commandAPI) { commands = commandAPI; }; | |
| 129 | + | |
| 130 | + //! \brief Utility function to send a put request to the thing. | |
| 131 | + //! | |
| 132 | + //! \throws nlohmann::json::parse_error if the reply could not be parsed | |
| 133 | + //! \param request A nlohmann::json aka the request to send | |
| 134 | + //! \param subPath A path that is appended to the uri, note it should always start with a slash ("/") | |
| 135 | + //! \param fileInfo FileInfo from calling function for exception details. | |
| 136 | + //! \return The parsed reply | |
| 137 | + //! \throws std::system_error when system or socket operations fail | |
| 138 | + //! \throws HueException when response contained no body | |
| 139 | + //! \throws HueAPIResponseException when response contains an error | |
| 140 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 141 | + virtual nlohmann::json SendPutRequest(const nlohmann::json& request, const std::string& subPath, FileInfo fileInfo); | |
| 142 | + | |
| 143 | + //! \brief Virtual function that refreshes the \ref state of the thing. | |
| 144 | + //! \throws std::system_error when system or socket operations fail | |
| 145 | + //! \throws HueException when response contained no body | |
| 146 | + //! \throws HueAPIResponseException when response contains an error | |
| 147 | + //! \throws nlohmann::json::parse_error when response could not be parsed | |
| 148 | + virtual void refreshState(); | |
| 149 | + | |
| 150 | +protected: | |
| 151 | + int id; //!< holds the id of the thing | |
| 152 | + std::string path; //!< holds the path of the thing | |
| 153 | + nlohmann::json state; //!< holds the current state of the thing updated by \ref refreshState | |
| 154 | + | |
| 155 | + HueCommandAPI commands; //!< A IHttpHandler that is used to communicate with the bridge | |
| 156 | +}; | |
| 157 | +} // namespace hueplusplus | |
| 158 | + | |
| 159 | +#endif | ... | ... |
src/CMakeLists.txt
src/Hue.cpp
| ... | ... | @@ -231,6 +231,35 @@ const BridgeConfig& Hue::config() const |
| 231 | 231 | return bridgeConfig; |
| 232 | 232 | } |
| 233 | 233 | |
| 234 | +HueSensor& Hue::getSensor(int id) | |
| 235 | +{ | |
| 236 | + auto pos = sensors.find(id); | |
| 237 | + if (pos != sensors.end()) | |
| 238 | + { | |
| 239 | + pos->second.refreshState(); | |
| 240 | + return pos->second; | |
| 241 | + } | |
| 242 | + refreshState(); | |
| 243 | + if (!state["sensors"].count(std::to_string(id))) | |
| 244 | + { | |
| 245 | + std::cerr << "Error in Hue getSensor(): sensor with id " << id << " is not valid\n"; | |
| 246 | + throw HueException(CURRENT_FILE_INFO, "Sensor id is not valid"); | |
| 247 | + } | |
| 248 | + // std::cout << state["sensors"][std::to_string(id)] << std::endl; | |
| 249 | + std::string type = state["sensors"][std::to_string(id)]["modelid"]; | |
| 250 | + // std::cout << type << std::endl; | |
| 251 | + if (type == "RWL021" || type == "PHDL00" || type == "PHWA01") | |
| 252 | + { | |
| 253 | + // Hue dimmer switch | |
| 254 | + HueSensor sensor = HueSensor(id, commands); | |
| 255 | + sensors.emplace(id, sensor); | |
| 256 | + return sensors.find(id)->second; | |
| 257 | + } | |
| 258 | + std::cerr << "Could not determine HueSensor type:" << type << "!\n"; | |
| 259 | + throw HueException(CURRENT_FILE_INFO, "Could not determine HueSensor type!"); | |
| 260 | +} | |
| 261 | + | |
| 262 | + | |
| 234 | 263 | Hue::LightList& Hue::lights() |
| 235 | 264 | { |
| 236 | 265 | return lightList; |
| ... | ... | @@ -246,7 +275,23 @@ Hue::GroupList& Hue::groups() |
| 246 | 275 | return groupList; |
| 247 | 276 | } |
| 248 | 277 | |
| 249 | -const Hue::GroupList& Hue::groups() const | |
| 278 | +std::vector<std::reference_wrapper<HueSensor>> Hue::getAllSensors() | |
| 279 | +{ | |
| 280 | + refreshState(); | |
| 281 | + nlohmann::json sensorsState = state["sensors"]; | |
| 282 | + for (nlohmann::json::iterator it = sensorsState.begin(); it != sensorsState.end(); ++it) | |
| 283 | + { | |
| 284 | + getSensor(std::stoi(it.key())); | |
| 285 | + } | |
| 286 | + std::vector<std::reference_wrapper<HueSensor>> result; | |
| 287 | + for (auto& entry : sensors) | |
| 288 | + { | |
| 289 | + result.emplace_back(entry.second); | |
| 290 | + } | |
| 291 | + return result; | |
| 292 | +} | |
| 293 | + | |
| 294 | +bool Hue::lightExists(int id) | |
| 250 | 295 | { |
| 251 | 296 | return groupList; |
| 252 | 297 | } | ... | ... |
src/HueLight.cpp
| ... | ... | @@ -27,6 +27,7 @@ |
| 27 | 27 | #include <thread> |
| 28 | 28 | |
| 29 | 29 | #include "hueplusplus/HueExceptionMacro.h" |
| 30 | +#include "hueplusplus/HueThing.h" | |
| 30 | 31 | #include "hueplusplus/Utils.h" |
| 31 | 32 | #include "json/json.hpp" |
| 32 | 33 | |
| ... | ... | @@ -52,46 +53,6 @@ bool HueLight::isOn() const |
| 52 | 53 | return state.getValue().at("state").at("on").get<bool>(); |
| 53 | 54 | } |
| 54 | 55 | |
| 55 | -int HueLight::getId() const | |
| 56 | -{ | |
| 57 | - return id; | |
| 58 | -} | |
| 59 | - | |
| 60 | -std::string HueLight::getType() const | |
| 61 | -{ | |
| 62 | - return state.getValue()["type"].get<std::string>(); | |
| 63 | -} | |
| 64 | - | |
| 65 | -std::string HueLight::getName() | |
| 66 | -{ | |
| 67 | - return state.getValue()["name"].get<std::string>(); | |
| 68 | -} | |
| 69 | - | |
| 70 | -std::string HueLight::getName() const | |
| 71 | -{ | |
| 72 | - return state.getValue()["name"].get<std::string>(); | |
| 73 | -} | |
| 74 | - | |
| 75 | -std::string HueLight::getModelId() const | |
| 76 | -{ | |
| 77 | - return state.getValue()["modelid"].get<std::string>(); | |
| 78 | -} | |
| 79 | - | |
| 80 | -std::string HueLight::getUId() const | |
| 81 | -{ | |
| 82 | - return state.getValue().value("uniqueid", std::string()); | |
| 83 | -} | |
| 84 | - | |
| 85 | -std::string HueLight::getManufacturername() const | |
| 86 | -{ | |
| 87 | - return state.getValue().value("manufacturername", std::string()); | |
| 88 | -} | |
| 89 | - | |
| 90 | -std::string HueLight::getProductname() const | |
| 91 | -{ | |
| 92 | - return state.getValue().value("productname", std::string()); | |
| 93 | -} | |
| 94 | - | |
| 95 | 56 | std::string HueLight::getLuminaireUId() const |
| 96 | 57 | { |
| 97 | 58 | return state.getValue().value("luminaireuniqueid", std::string()); |
| ... | ... | @@ -107,18 +68,6 @@ std::string HueLight::getSwVersion() const |
| 107 | 68 | return state.getValue()["swversion"].get<std::string>(); |
| 108 | 69 | } |
| 109 | 70 | |
| 110 | -bool HueLight::setName(const std::string& name) | |
| 111 | -{ | |
| 112 | - nlohmann::json request = nlohmann::json::object(); | |
| 113 | - request["name"] = name; | |
| 114 | - nlohmann::json reply = sendPutRequest(request, "/name", CURRENT_FILE_INFO); | |
| 115 | - state.refresh(); | |
| 116 | - | |
| 117 | - // Check whether request was successful (returned name is not necessarily the actually set name) | |
| 118 | - // If it already exists, a number is added, if it is too long to be returned, "Updated" is returned | |
| 119 | - return utils::safeGetMember(reply, 0, "success", "/lights/" + std::to_string(id) + "/name").is_string(); | |
| 120 | -} | |
| 121 | - | |
| 122 | 71 | ColorType HueLight::getColorType() const |
| 123 | 72 | { |
| 124 | 73 | return colorType; |
| ... | ... | @@ -183,9 +132,8 @@ HueLight::HueLight(int id, const HueCommandAPI& commands) : HueLight(id, command |
| 183 | 132 | |
| 184 | 133 | HueLight::HueLight(int id, const HueCommandAPI& commands, std::shared_ptr<const BrightnessStrategy> brightnessStrategy, |
| 185 | 134 | std::shared_ptr<const ColorTemperatureStrategy> colorTempStrategy, |
| 186 | - std::shared_ptr<const ColorHueStrategy> colorHueStrategy, std::chrono::steady_clock::duration refreshDuration) | |
| 187 | - : id(id), | |
| 188 | - state("/lights/" + std::to_string(id), commands, refreshDuration), | |
| 135 | + std::shared_ptr<const ColorHueStrategy> colorHueStrategy, chrono::steady_clock::duration refreshDuration) | |
| 136 | + : HueThing(id, commands, "/lights/"), | |
| 189 | 137 | colorType(ColorType::NONE), |
| 190 | 138 | brightnessStrategy(std::move(brightnessStrategy)), |
| 191 | 139 | colorTemperatureStrategy(std::move(colorTempStrategy)), | ... | ... |
src/HueSensor.cpp
0 โ 100644
| 1 | +/** | |
| 2 | + \file HueSensor.cpp | |
| 3 | + Copyright Notice\n | |
| 4 | + Copyright (C) 2020 Stefan Herbrechtsmeier - developer\n | |
| 5 | + | |
| 6 | + This file is part of hueplusplus. | |
| 7 | + | |
| 8 | + hueplusplus is free software: you can redistribute it and/or modify | |
| 9 | + it under the terms of the GNU Lesser General Public License as published by | |
| 10 | + the Free Software Foundation, either version 3 of the License, or | |
| 11 | + (at your option) any later version. | |
| 12 | + | |
| 13 | + hueplusplus is distributed in the hope that it will be useful, | |
| 14 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | + GNU Lesser General Public License for more details. | |
| 17 | + | |
| 18 | + You should have received a copy of the GNU Lesser General Public License | |
| 19 | + along with hueplusplus. If not, see <http://www.gnu.org/licenses/>. | |
| 20 | +**/ | |
| 21 | + | |
| 22 | +#include "hueplusplus/HueSensor.h" | |
| 23 | + | |
| 24 | +#include "hueplusplus/HueThing.h" | |
| 25 | +#include "json/json.hpp" | |
| 26 | + | |
| 27 | +namespace hueplusplus | |
| 28 | +{ | |
| 29 | +int HueSensor::getButtonEvent() | |
| 30 | +{ | |
| 31 | + refreshState(); | |
| 32 | + if (hasButtonEvent()) | |
| 33 | + { | |
| 34 | + return state["state"]["buttonevent"]; | |
| 35 | + } | |
| 36 | + return 0; | |
| 37 | +} | |
| 38 | + | |
| 39 | +int HueSensor::getButtonEvent() const | |
| 40 | +{ | |
| 41 | + if (hasButtonEvent()) | |
| 42 | + { | |
| 43 | + return state["state"]["buttonevent"]; | |
| 44 | + } | |
| 45 | + return 0; | |
| 46 | +} | |
| 47 | + | |
| 48 | +int HueSensor::getStatus() | |
| 49 | +{ | |
| 50 | + refreshState(); | |
| 51 | + if (hasStatus()) | |
| 52 | + { | |
| 53 | + return state["state"]["status"]; | |
| 54 | + } | |
| 55 | + return 0; | |
| 56 | +} | |
| 57 | + | |
| 58 | +int HueSensor::getStatus() const | |
| 59 | +{ | |
| 60 | + if (hasStatus()) | |
| 61 | + { | |
| 62 | + return state["state"]["status"]; | |
| 63 | + } | |
| 64 | + return 0; | |
| 65 | +} | |
| 66 | + | |
| 67 | +bool HueSensor::hasButtonEvent() const | |
| 68 | +{ | |
| 69 | + return state["state"].count("buttonevent") > 0; | |
| 70 | +} | |
| 71 | + | |
| 72 | +bool HueSensor::hasStatus() const | |
| 73 | +{ | |
| 74 | + return state["state"].count("status") > 0; | |
| 75 | +} | |
| 76 | + | |
| 77 | +HueSensor::HueSensor(int id, const HueCommandAPI& commands) | |
| 78 | + : HueThing(id, commands, "/sensors/") | |
| 79 | +{ | |
| 80 | + refreshState(); | |
| 81 | +} | |
| 82 | +} // namespace hueplusplus | ... | ... |
src/HueThing.cpp
0 โ 100644
| 1 | +/** | |
| 2 | + \file HueThing.cpp | |
| 3 | + Copyright Notice\n | |
| 4 | + Copyright (C) 2020 Stefan Herbrechtsmeier - developer\n | |
| 5 | + | |
| 6 | + This file is part of hueplusplus. | |
| 7 | + | |
| 8 | + hueplusplus is free software: you can redistribute it and/or modify | |
| 9 | + it under the terms of the GNU Lesser General Public License as published by | |
| 10 | + the Free Software Foundation, either version 3 of the License, or | |
| 11 | + (at your option) any later version. | |
| 12 | + | |
| 13 | + hueplusplus is distributed in the hope that it will be useful, | |
| 14 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 16 | + GNU Lesser General Public License for more details. | |
| 17 | + | |
| 18 | + You should have received a copy of the GNU Lesser General Public License | |
| 19 | + along with hueplusplus. If not, see <http://www.gnu.org/licenses/>. | |
| 20 | +**/ | |
| 21 | + | |
| 22 | +#include "hueplusplus/HueThing.h" | |
| 23 | + | |
| 24 | +#include <cmath> | |
| 25 | +#include <iostream> | |
| 26 | +#include <thread> | |
| 27 | + | |
| 28 | +#include "hueplusplus/HueExceptionMacro.h" | |
| 29 | +#include "hueplusplus/Utils.h" | |
| 30 | +#include "json/json.hpp" | |
| 31 | + | |
| 32 | +namespace hueplusplus | |
| 33 | +{ | |
| 34 | +int HueThing::getId() const | |
| 35 | +{ | |
| 36 | + return id; | |
| 37 | +} | |
| 38 | + | |
| 39 | +std::string HueThing::getType() const | |
| 40 | +{ | |
| 41 | + return state["type"]; | |
| 42 | +} | |
| 43 | + | |
| 44 | +std::string HueThing::getName() | |
| 45 | +{ | |
| 46 | + refreshState(); | |
| 47 | + return state["name"]; | |
| 48 | +} | |
| 49 | + | |
| 50 | +std::string HueThing::getName() const | |
| 51 | +{ | |
| 52 | + return state["name"]; | |
| 53 | +} | |
| 54 | + | |
| 55 | +std::string HueThing::getModelId() const | |
| 56 | +{ | |
| 57 | + return state["modelid"]; | |
| 58 | +} | |
| 59 | + | |
| 60 | +std::string HueThing::getUId() const | |
| 61 | +{ | |
| 62 | + if (state.count("uniqueid")) | |
| 63 | + { | |
| 64 | + return state["uniqueid"]; | |
| 65 | + } | |
| 66 | + return std::string(); | |
| 67 | +} | |
| 68 | + | |
| 69 | +std::string HueThing::getManufacturername() const | |
| 70 | +{ | |
| 71 | + if (state.count("manufacturername")) | |
| 72 | + { | |
| 73 | + return state["manufacturername"]; | |
| 74 | + } | |
| 75 | + return std::string(); | |
| 76 | +} | |
| 77 | + | |
| 78 | +std::string HueThing::getProductname() const | |
| 79 | +{ | |
| 80 | + if (state.count("productname")) | |
| 81 | + { | |
| 82 | + return state["productname"]; | |
| 83 | + } | |
| 84 | + return std::string(); | |
| 85 | +} | |
| 86 | + | |
| 87 | +std::string HueThing::getSwVersion() | |
| 88 | +{ | |
| 89 | + refreshState(); | |
| 90 | + return state["swversion"]; | |
| 91 | +} | |
| 92 | + | |
| 93 | +std::string HueThing::getSwVersion() const | |
| 94 | +{ | |
| 95 | + return state["swversion"]; | |
| 96 | +} | |
| 97 | + | |
| 98 | +bool HueThing::setName(const std::string& name) | |
| 99 | +{ | |
| 100 | + nlohmann::json request = nlohmann::json::object(); | |
| 101 | + request["name"] = name; | |
| 102 | + nlohmann::json reply = SendPutRequest(request, "/name", CURRENT_FILE_INFO); | |
| 103 | + | |
| 104 | + // Check whether request was successful | |
| 105 | + return utils::safeGetMember(reply, 0, "success", path + std::to_string(id) + "/name") == name; | |
| 106 | +} | |
| 107 | + | |
| 108 | +HueThing::HueThing(int id, const HueCommandAPI& commands, const std::string& path) | |
| 109 | + : id(id), | |
| 110 | + commands(commands), | |
| 111 | + path(path) | |
| 112 | +{ | |
| 113 | + refreshState(); | |
| 114 | +} | |
| 115 | + | |
| 116 | +nlohmann::json HueThing::SendPutRequest(const nlohmann::json& request, const std::string& subPath, FileInfo fileInfo) | |
| 117 | +{ | |
| 118 | + return commands.PUTRequest(path + std::to_string(id) + subPath, request, std::move(fileInfo)); | |
| 119 | +} | |
| 120 | + | |
| 121 | +void HueThing::refreshState() | |
| 122 | +{ | |
| 123 | + nlohmann::json answer | |
| 124 | + = commands.GETRequest(path + std::to_string(id), nlohmann::json::object(), CURRENT_FILE_INFO); | |
| 125 | + if (answer.count("state")) | |
| 126 | + { | |
| 127 | + state = answer; | |
| 128 | + } | |
| 129 | + else | |
| 130 | + { | |
| 131 | + std::cout << "Answer in HueThing::refreshState of " | |
| 132 | + "http_handler->GETJson(...) is not expected!\nAnswer:\n\t" | |
| 133 | + << answer.dump() << std::endl; | |
| 134 | + } | |
| 135 | +} | |
| 136 | +} // namespace hueplusplus | ... | ... |