/** \file HueLight.cpp Copyright Notice\n Copyright (C) 2017 Jan Rogall - developer\n Copyright (C) 2017 Moritz Wirger - developer\n This file is part of hueplusplus. hueplusplus is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. hueplusplus is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with hueplusplus. If not, see . **/ #include "hueplusplus/HueLight.h" #include #include #include #include "hueplusplus/HueExceptionMacro.h" #include "hueplusplus/Utils.h" #include "json/json.hpp" namespace hueplusplus { bool HueLight::On(uint8_t transition) { return transaction().setOn(true).setTransition(transition).commit(); } bool HueLight::Off(uint8_t transition) { return transaction().setOn(false).setTransition(transition).commit(); } bool HueLight::isOn() { return state.getValue().at("state").at("on").get(); } bool HueLight::isOn() const { return state.getValue().at("state").at("on").get(); } int HueLight::getId() const { return id; } std::string HueLight::getType() const { return state.getValue()["type"].get(); } std::string HueLight::getName() { return state.getValue()["name"].get(); } std::string HueLight::getName() const { return state.getValue()["name"].get(); } std::string HueLight::getModelId() const { return state.getValue()["modelid"].get(); } std::string HueLight::getUId() const { return state.getValue().value("uniqueid", std::string()); } std::string HueLight::getManufacturername() const { return state.getValue().value("manufacturername", std::string()); } std::string HueLight::getProductname() const { return state.getValue().value("productname", std::string()); } std::string HueLight::getLuminaireUId() const { return state.getValue().value("luminaireuniqueid", std::string()); } std::string HueLight::getSwVersion() { return state.getValue()["swversion"].get(); } std::string HueLight::getSwVersion() const { return state.getValue()["swversion"].get(); } bool HueLight::setName(const std::string& name) { nlohmann::json request = nlohmann::json::object(); request["name"] = name; nlohmann::json reply = sendPutRequest(request, "/name", CURRENT_FILE_INFO); state.refresh(); // Check whether request was successful (returned name is not necessarily the actually set name) // If it already exists, a number is added, if it is too long to be returned, "Updated" is returned return utils::safeGetMember(reply, 0, "success", "/lights/" + std::to_string(id) + "/name").is_string(); } ColorType HueLight::getColorType() const { return colorType; } unsigned int HueLight::KelvinToMired(unsigned int kelvin) const { return int(0.5f + (1000000 / kelvin)); } unsigned int HueLight::MiredToKelvin(unsigned int mired) const { return int(0.5f + (1000000 / mired)); } bool HueLight::alert() { return transaction().alert().commit(); } StateTransaction HueLight::transaction() { return StateTransaction(commands, "/lights/" + std::to_string(id) + "/state", state.getValue().at("state")); } void HueLight::refresh() { state.refresh(); } HueLight::HueLight(int id, const HueCommandAPI& commands) : HueLight(id, commands, nullptr, nullptr, nullptr) {} HueLight::HueLight(int id, const HueCommandAPI& commands, std::shared_ptr brightnessStrategy, std::shared_ptr colorTempStrategy, std::shared_ptr colorHueStrategy, std::chrono::steady_clock::duration refreshDuration) : id(id), state("/lights/" + std::to_string(id), commands, refreshDuration), colorType(ColorType::NONE), brightnessStrategy(std::move(brightnessStrategy)), colorTemperatureStrategy(std::move(colorTempStrategy)), colorHueStrategy(std::move(colorHueStrategy)), commands(commands) { state.refresh(); } nlohmann::json HueLight::sendPutRequest(const nlohmann::json& request, const std::string& subPath, FileInfo fileInfo) { return commands.PUTRequest("/lights/" + std::to_string(id) + subPath, request, std::move(fileInfo)); } } // namespace hueplusplus