From 3939aedac38a20b546b761fa223850e6bf1c93f1 Mon Sep 17 00:00:00 2001 From: Jojo-1000 <33495614+Jojo-1000@users.noreply.github.com> Date: Mon, 29 Jun 2020 21:00:23 +0200 Subject: [PATCH] Add implementation for DaylightSensor. --- include/hueplusplus/Sensor.h | 16 +++++++++++----- src/Bridge.cpp | 19 ++++++++++++------- src/Sensor.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 12 deletions(-) diff --git a/include/hueplusplus/Sensor.h b/include/hueplusplus/Sensor.h index 7b62e9b..8b11b29 100644 --- a/include/hueplusplus/Sensor.h +++ b/include/hueplusplus/Sensor.h @@ -49,6 +49,8 @@ public: //! \brief std dtor ~Sensor() = default; + bool hasSwupdate() const; + bool hasOn() const; // Check whether sensor is on. Does not update when off bool isOn() const; @@ -84,11 +86,14 @@ public: nlohmann::json getState() const; void setStateAttribute(const std::string& key, const nlohmann::json& value); + nlohmann::json getConfig() const; + void setConfigAttribute(const std::string& key, const nlohmann::json& value); + bool isCertified() const; bool isPrimary() const; template - T asSensorType() const + T asSensorType() const & { if (getType() != T::type_str) { @@ -125,17 +130,18 @@ public: bool isOn() const; void setOn(bool on); - bool hasBattery() const; + bool hasBatteryState() const; int getBatteryState() const; void setBatteryState(int percent); - void setCoordinates(std::string latitude, std::string longitude); + void setCoordinates(const std::string& latitude, const std::string& longitude); + bool isConfigured() const; int getSunriseOffset() const; void setSunriseOffset(int minutes); - int getSunsetOffeset() const; - void setSunsetOffest(int minutes); + int getSunsetOffset() const; + void setSunsetOffset(int minutes); bool isDaylight() const; diff --git a/src/Bridge.cpp b/src/Bridge.cpp index d47ec8d..03a67c6 100644 --- a/src/Bridge.cpp +++ b/src/Bridge.cpp @@ -55,13 +55,18 @@ std::vector BridgeFinder::FindBridges() cons size_t start = p.first.find("//") + 2; size_t length = p.first.find(":", start) - start; bridge.ip = p.first.substr(start, length); - std::string desc - = http_handler->GETString("/description.xml", "application/xml", "", bridge.ip, bridge.port); - std::string mac = ParseDescription(desc); - if (!mac.empty()) - { - bridge.mac = NormalizeMac(mac); - foundBridges.push_back(std::move(bridge)); + try { + std::string desc + = http_handler->GETString("/description.xml", "application/xml", "", bridge.ip, bridge.port); + std::string mac = ParseDescription(desc); + if (!mac.empty()) + { + bridge.mac = NormalizeMac(mac); + foundBridges.push_back(std::move(bridge)); + } + } + catch (const HueException&) { + // No body found in response, skip this device } } } diff --git a/src/Sensor.cpp b/src/Sensor.cpp index ecf224e..28456a2 100644 --- a/src/Sensor.cpp +++ b/src/Sensor.cpp @@ -27,6 +27,11 @@ namespace hueplusplus { +bool Sensor::hasSwupdate() const +{ + return state.getValue().at("config").count("swupdate") != 0; +} + bool Sensor::hasOn() const { return state.getValue().at("config").count("on") != 0; @@ -173,6 +178,16 @@ void Sensor::setStateAttribute(const std::string& key, const nlohmann::json& val sendPutRequest("/state", nlohmann::json {{"key", value}}, CURRENT_FILE_INFO); } +nlohmann::json Sensor::getConfig() const +{ + return state.getValue().at("config"); +} + +void Sensor::setConfigAttribute(const std::string& key, const nlohmann::json& value) +{ + sendPutRequest("/config", nlohmann::json {{"key", value}}, CURRENT_FILE_INFO); +} + bool Sensor::isCertified() const { nlohmann::json certified = utils::safeGetMember(state.getValue(), "capabilities", "certified"); @@ -188,4 +203,72 @@ bool Sensor::isPrimary() const Sensor::Sensor(int id, const HueCommandAPI& commands, std::chrono::steady_clock::duration refreshDuration) : BaseDevice(id, commands, "/sensors/", refreshDuration) { } + +namespace sensors +{ + +bool DaylightSensor::isOn() const +{ + return state.getValue().at("config").at("on").get(); +} + +void DaylightSensor::setOn(bool on) +{ + sendPutRequest("/config", {"on", on}, CURRENT_FILE_INFO); +} + +bool DaylightSensor::hasBatteryState() const +{ + return state.getValue().at("config").count("battery") != 0; +} +int DaylightSensor::getBatteryState() const +{ + return state.getValue().at("config").at("battery").get(); +} +void DaylightSensor::setBatteryState(int percent) +{ + sendPutRequest("/config", nlohmann::json {{"battery", percent}}, CURRENT_FILE_INFO); +} +void DaylightSensor::setCoordinates(const std::string& latitude, const std::string& longitude) +{ + nlohmann::json request {{"lat", latitude}, {"long", longitude}}; + // Currently, "none" is supposed to be used for reset; may change to null in the future, + // so the functionality is implemented already + if (latitude.empty()) + { + request["lat"] = nullptr; + } + if (longitude.empty()) + { + request["long"] = nullptr; + } + sendPutRequest("/config", request, CURRENT_FILE_INFO); +} +bool DaylightSensor::isConfigured() const +{ + return state.getValue().at("config").at("configured").get(); +} +int DaylightSensor::getSunriseOffset() const +{ + return state.getValue().at("config").at("sunriseoffset").get(); +} +void DaylightSensor::setSunriseOffset(int minutes) +{ + sendPutRequest("/config", nlohmann::json {{"sunriseoffset", minutes}}, CURRENT_FILE_INFO); +} + +int DaylightSensor::getSunsetOffset() const +{ + return state.getValue().at("config").at("sunsetoffset").get(); +} +void DaylightSensor::setSunsetOffset(int minutes) +{ + sendPutRequest("/config", nlohmann::json {{"sunsetoffset", minutes}}, CURRENT_FILE_INFO); +} + +bool DaylightSensor::isDaylight() const +{ + return state.getValue().at("config").at("daylight").get(); +} +} // namespace sensors } // namespace hueplusplus -- libgit2 0.21.4