Commit 3939aedac38a20b546b761fa223850e6bf1c93f1
Committed by
Moritz Wirger
1 parent
2638bcb8
Add implementation for DaylightSensor.
Showing
3 changed files
with
106 additions
and
12 deletions
include/hueplusplus/Sensor.h
| @@ -49,6 +49,8 @@ public: | @@ -49,6 +49,8 @@ public: | ||
| 49 | //! \brief std dtor | 49 | //! \brief std dtor |
| 50 | ~Sensor() = default; | 50 | ~Sensor() = default; |
| 51 | 51 | ||
| 52 | + bool hasSwupdate() const; | ||
| 53 | + | ||
| 52 | bool hasOn() const; | 54 | bool hasOn() const; |
| 53 | // Check whether sensor is on. Does not update when off | 55 | // Check whether sensor is on. Does not update when off |
| 54 | bool isOn() const; | 56 | bool isOn() const; |
| @@ -84,11 +86,14 @@ public: | @@ -84,11 +86,14 @@ public: | ||
| 84 | nlohmann::json getState() const; | 86 | nlohmann::json getState() const; |
| 85 | void setStateAttribute(const std::string& key, const nlohmann::json& value); | 87 | void setStateAttribute(const std::string& key, const nlohmann::json& value); |
| 86 | 88 | ||
| 89 | + nlohmann::json getConfig() const; | ||
| 90 | + void setConfigAttribute(const std::string& key, const nlohmann::json& value); | ||
| 91 | + | ||
| 87 | bool isCertified() const; | 92 | bool isCertified() const; |
| 88 | bool isPrimary() const; | 93 | bool isPrimary() const; |
| 89 | 94 | ||
| 90 | template <typename T> | 95 | template <typename T> |
| 91 | - T asSensorType() const | 96 | + T asSensorType() const & |
| 92 | { | 97 | { |
| 93 | if (getType() != T::type_str) | 98 | if (getType() != T::type_str) |
| 94 | { | 99 | { |
| @@ -125,17 +130,18 @@ public: | @@ -125,17 +130,18 @@ public: | ||
| 125 | bool isOn() const; | 130 | bool isOn() const; |
| 126 | void setOn(bool on); | 131 | void setOn(bool on); |
| 127 | 132 | ||
| 128 | - bool hasBattery() const; | 133 | + bool hasBatteryState() const; |
| 129 | int getBatteryState() const; | 134 | int getBatteryState() const; |
| 130 | void setBatteryState(int percent); | 135 | void setBatteryState(int percent); |
| 131 | 136 | ||
| 132 | - void setCoordinates(std::string latitude, std::string longitude); | 137 | + void setCoordinates(const std::string& latitude, const std::string& longitude); |
| 138 | + bool isConfigured() const; | ||
| 133 | 139 | ||
| 134 | int getSunriseOffset() const; | 140 | int getSunriseOffset() const; |
| 135 | void setSunriseOffset(int minutes); | 141 | void setSunriseOffset(int minutes); |
| 136 | 142 | ||
| 137 | - int getSunsetOffeset() const; | ||
| 138 | - void setSunsetOffest(int minutes); | 143 | + int getSunsetOffset() const; |
| 144 | + void setSunsetOffset(int minutes); | ||
| 139 | 145 | ||
| 140 | bool isDaylight() const; | 146 | bool isDaylight() const; |
| 141 | 147 |
src/Bridge.cpp
| @@ -55,13 +55,18 @@ std::vector<BridgeFinder::BridgeIdentification> BridgeFinder::FindBridges() cons | @@ -55,13 +55,18 @@ std::vector<BridgeFinder::BridgeIdentification> BridgeFinder::FindBridges() cons | ||
| 55 | size_t start = p.first.find("//") + 2; | 55 | size_t start = p.first.find("//") + 2; |
| 56 | size_t length = p.first.find(":", start) - start; | 56 | size_t length = p.first.find(":", start) - start; |
| 57 | bridge.ip = p.first.substr(start, length); | 57 | bridge.ip = p.first.substr(start, length); |
| 58 | - std::string desc | ||
| 59 | - = http_handler->GETString("/description.xml", "application/xml", "", bridge.ip, bridge.port); | ||
| 60 | - std::string mac = ParseDescription(desc); | ||
| 61 | - if (!mac.empty()) | ||
| 62 | - { | ||
| 63 | - bridge.mac = NormalizeMac(mac); | ||
| 64 | - foundBridges.push_back(std::move(bridge)); | 58 | + try { |
| 59 | + std::string desc | ||
| 60 | + = http_handler->GETString("/description.xml", "application/xml", "", bridge.ip, bridge.port); | ||
| 61 | + std::string mac = ParseDescription(desc); | ||
| 62 | + if (!mac.empty()) | ||
| 63 | + { | ||
| 64 | + bridge.mac = NormalizeMac(mac); | ||
| 65 | + foundBridges.push_back(std::move(bridge)); | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + catch (const HueException&) { | ||
| 69 | + // No body found in response, skip this device | ||
| 65 | } | 70 | } |
| 66 | } | 71 | } |
| 67 | } | 72 | } |
src/Sensor.cpp
| @@ -27,6 +27,11 @@ | @@ -27,6 +27,11 @@ | ||
| 27 | 27 | ||
| 28 | namespace hueplusplus | 28 | namespace hueplusplus |
| 29 | { | 29 | { |
| 30 | +bool Sensor::hasSwupdate() const | ||
| 31 | +{ | ||
| 32 | + return state.getValue().at("config").count("swupdate") != 0; | ||
| 33 | +} | ||
| 34 | + | ||
| 30 | bool Sensor::hasOn() const | 35 | bool Sensor::hasOn() const |
| 31 | { | 36 | { |
| 32 | return state.getValue().at("config").count("on") != 0; | 37 | return state.getValue().at("config").count("on") != 0; |
| @@ -173,6 +178,16 @@ void Sensor::setStateAttribute(const std::string& key, const nlohmann::json& val | @@ -173,6 +178,16 @@ void Sensor::setStateAttribute(const std::string& key, const nlohmann::json& val | ||
| 173 | sendPutRequest("/state", nlohmann::json {{"key", value}}, CURRENT_FILE_INFO); | 178 | sendPutRequest("/state", nlohmann::json {{"key", value}}, CURRENT_FILE_INFO); |
| 174 | } | 179 | } |
| 175 | 180 | ||
| 181 | +nlohmann::json Sensor::getConfig() const | ||
| 182 | +{ | ||
| 183 | + return state.getValue().at("config"); | ||
| 184 | +} | ||
| 185 | + | ||
| 186 | +void Sensor::setConfigAttribute(const std::string& key, const nlohmann::json& value) | ||
| 187 | +{ | ||
| 188 | + sendPutRequest("/config", nlohmann::json {{"key", value}}, CURRENT_FILE_INFO); | ||
| 189 | +} | ||
| 190 | + | ||
| 176 | bool Sensor::isCertified() const | 191 | bool Sensor::isCertified() const |
| 177 | { | 192 | { |
| 178 | nlohmann::json certified = utils::safeGetMember(state.getValue(), "capabilities", "certified"); | 193 | nlohmann::json certified = utils::safeGetMember(state.getValue(), "capabilities", "certified"); |
| @@ -188,4 +203,72 @@ bool Sensor::isPrimary() const | @@ -188,4 +203,72 @@ bool Sensor::isPrimary() const | ||
| 188 | Sensor::Sensor(int id, const HueCommandAPI& commands, std::chrono::steady_clock::duration refreshDuration) | 203 | Sensor::Sensor(int id, const HueCommandAPI& commands, std::chrono::steady_clock::duration refreshDuration) |
| 189 | : BaseDevice(id, commands, "/sensors/", refreshDuration) | 204 | : BaseDevice(id, commands, "/sensors/", refreshDuration) |
| 190 | { } | 205 | { } |
| 206 | + | ||
| 207 | +namespace sensors | ||
| 208 | +{ | ||
| 209 | + | ||
| 210 | +bool DaylightSensor::isOn() const | ||
| 211 | +{ | ||
| 212 | + return state.getValue().at("config").at("on").get<bool>(); | ||
| 213 | +} | ||
| 214 | + | ||
| 215 | +void DaylightSensor::setOn(bool on) | ||
| 216 | +{ | ||
| 217 | + sendPutRequest("/config", {"on", on}, CURRENT_FILE_INFO); | ||
| 218 | +} | ||
| 219 | + | ||
| 220 | +bool DaylightSensor::hasBatteryState() const | ||
| 221 | +{ | ||
| 222 | + return state.getValue().at("config").count("battery") != 0; | ||
| 223 | +} | ||
| 224 | +int DaylightSensor::getBatteryState() const | ||
| 225 | +{ | ||
| 226 | + return state.getValue().at("config").at("battery").get<int>(); | ||
| 227 | +} | ||
| 228 | +void DaylightSensor::setBatteryState(int percent) | ||
| 229 | +{ | ||
| 230 | + sendPutRequest("/config", nlohmann::json {{"battery", percent}}, CURRENT_FILE_INFO); | ||
| 231 | +} | ||
| 232 | +void DaylightSensor::setCoordinates(const std::string& latitude, const std::string& longitude) | ||
| 233 | +{ | ||
| 234 | + nlohmann::json request {{"lat", latitude}, {"long", longitude}}; | ||
| 235 | + // Currently, "none" is supposed to be used for reset; may change to null in the future, | ||
| 236 | + // so the functionality is implemented already | ||
| 237 | + if (latitude.empty()) | ||
| 238 | + { | ||
| 239 | + request["lat"] = nullptr; | ||
| 240 | + } | ||
| 241 | + if (longitude.empty()) | ||
| 242 | + { | ||
| 243 | + request["long"] = nullptr; | ||
| 244 | + } | ||
| 245 | + sendPutRequest("/config", request, CURRENT_FILE_INFO); | ||
| 246 | +} | ||
| 247 | +bool DaylightSensor::isConfigured() const | ||
| 248 | +{ | ||
| 249 | + return state.getValue().at("config").at("configured").get<bool>(); | ||
| 250 | +} | ||
| 251 | +int DaylightSensor::getSunriseOffset() const | ||
| 252 | +{ | ||
| 253 | + return state.getValue().at("config").at("sunriseoffset").get<int>(); | ||
| 254 | +} | ||
| 255 | +void DaylightSensor::setSunriseOffset(int minutes) | ||
| 256 | +{ | ||
| 257 | + sendPutRequest("/config", nlohmann::json {{"sunriseoffset", minutes}}, CURRENT_FILE_INFO); | ||
| 258 | +} | ||
| 259 | + | ||
| 260 | +int DaylightSensor::getSunsetOffset() const | ||
| 261 | +{ | ||
| 262 | + return state.getValue().at("config").at("sunsetoffset").get<int>(); | ||
| 263 | +} | ||
| 264 | +void DaylightSensor::setSunsetOffset(int minutes) | ||
| 265 | +{ | ||
| 266 | + sendPutRequest("/config", nlohmann::json {{"sunsetoffset", minutes}}, CURRENT_FILE_INFO); | ||
| 267 | +} | ||
| 268 | + | ||
| 269 | +bool DaylightSensor::isDaylight() const | ||
| 270 | +{ | ||
| 271 | + return state.getValue().at("config").at("daylight").get<bool>(); | ||
| 272 | +} | ||
| 273 | +} // namespace sensors | ||
| 191 | } // namespace hueplusplus | 274 | } // namespace hueplusplus |