mirror of https://github.com/nymea/nymea.git
308 lines
11 KiB
C++
308 lines
11 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* *
|
|
* Copyright (C) 2014 Michael Zanetti <michael_zanetti@gmx.net> *
|
|
* Copyright (C) 2015 Simon Stürz <simon.stuerz@guh.io> *
|
|
* *
|
|
* This file is part of guh. *
|
|
* *
|
|
* This library 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 2.1 of the License, or (at your option) any later version. *
|
|
* *
|
|
* This library 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 this library; If not, see *
|
|
* <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
#include "huelight.h"
|
|
#include "extern-plugininfo.h"
|
|
|
|
HueLight::HueLight(QObject *parent) :
|
|
HueDevice(parent)
|
|
{
|
|
}
|
|
|
|
bool HueLight::power() const
|
|
{
|
|
return m_power;
|
|
}
|
|
|
|
void HueLight::setPower(const bool &power)
|
|
{
|
|
m_power = power;
|
|
}
|
|
|
|
quint8 HueLight::brightness() const
|
|
{
|
|
return m_brightness;
|
|
}
|
|
|
|
void HueLight::setBrigtness(const quint8 brightness)
|
|
{
|
|
m_brightness = brightness;
|
|
}
|
|
|
|
quint16 HueLight::hue() const
|
|
{
|
|
return m_hue;
|
|
}
|
|
|
|
void HueLight::setHue(const quint16 hue)
|
|
{
|
|
m_hue = hue;
|
|
}
|
|
|
|
quint8 HueLight::sat() const
|
|
{
|
|
return m_sat;
|
|
}
|
|
|
|
void HueLight::setSat(const quint8 sat)
|
|
{
|
|
m_sat = sat;
|
|
}
|
|
|
|
QColor HueLight::color() const
|
|
{
|
|
return QColor::fromHsv(m_hue * 360 / 65535, m_sat, 255);
|
|
}
|
|
|
|
QPointF HueLight::xy() const
|
|
{
|
|
return m_xy;
|
|
}
|
|
|
|
void HueLight::setXy(const QPointF &xy)
|
|
{
|
|
m_xy = xy;
|
|
}
|
|
|
|
quint16 HueLight::ct() const
|
|
{
|
|
return m_ct;
|
|
}
|
|
|
|
void HueLight::setCt(const quint16 &ct)
|
|
{
|
|
m_ct = ct;
|
|
}
|
|
|
|
QString HueLight::alert() const
|
|
{
|
|
return m_alert;
|
|
}
|
|
|
|
void HueLight::setAlert(const QString &alert)
|
|
{
|
|
m_alert = alert;
|
|
}
|
|
|
|
QString HueLight::effect() const
|
|
{
|
|
return m_effect;
|
|
}
|
|
|
|
void HueLight::setEffect(const QString &effect)
|
|
{
|
|
m_effect = effect;
|
|
}
|
|
|
|
HueLight::ColorMode HueLight::colorMode() const
|
|
{
|
|
return m_colorMode;
|
|
}
|
|
|
|
void HueLight::setColorMode(const HueLight::ColorMode &colorMode)
|
|
{
|
|
m_colorMode = colorMode;
|
|
}
|
|
|
|
void HueLight::updateStates(const QVariantMap &statesMap)
|
|
{
|
|
// color mode
|
|
if (statesMap.value("colormode").toString() == "hs") {
|
|
setColorMode(ColorModeHS);
|
|
} else if (statesMap.value("colormode").toString() == "ct") {
|
|
setColorMode(ColorModeCT);
|
|
} else if (statesMap.value("colormode").toString() == "xy") {
|
|
setColorMode(ColorModeXY);
|
|
}
|
|
|
|
// effect (none, colorloop)
|
|
if (statesMap.value("effect").toString() == "none") {
|
|
setEffect("none");
|
|
} else if (statesMap.value("effect").toString() == "colorloop") {
|
|
setEffect("color loop");
|
|
}
|
|
|
|
setReachable(statesMap.value("reachable").toBool());
|
|
|
|
// alert (none, select, lselect)
|
|
setAlert(statesMap.value("alert").toString());
|
|
setBrigtness(statesMap.value("bri").toInt());
|
|
setCt(statesMap.value("ct").toInt());
|
|
setPower(statesMap.value("on").toBool());
|
|
setSat(statesMap.value("sat").toInt());
|
|
setHue(statesMap.value("hue").toInt());
|
|
//setXy(QPointF(statesMap.value("xy").toList().first().toFloat(),statesMap.value("xy").toList().last().toFloat()));
|
|
|
|
emit stateChanged();
|
|
}
|
|
|
|
void HueLight::processActionResponse(const QVariantList &responseList)
|
|
{
|
|
foreach (const QVariant &resultVariant, responseList) {
|
|
QVariantMap result = resultVariant.toMap();
|
|
if (result.contains("success")) {
|
|
QVariantMap successMap = result.value("success").toMap();
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/on")) {
|
|
m_power = successMap.value("/lights/" + QString::number(id()) + "/state/on").toBool();
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/hue")) {
|
|
m_hue = successMap.value("/lights/" + QString::number(id()) + "/state/hue").toInt();
|
|
m_colorMode = ColorModeHS;
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/bri")) {
|
|
m_brightness = successMap.value("/lights/" + QString::number(id()) + "/state/bri").toInt();
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/sat")) {
|
|
m_sat = successMap.value("/lights/" + QString::number(id()) + "/state/sat").toInt();
|
|
m_colorMode = ColorModeHS;
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/xy")) {
|
|
m_xy = successMap.value("/lights/" + QString::number(id()) + "/state/xy").toPoint();
|
|
m_colorMode = ColorModeXY;
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/ct")) {
|
|
m_ct = successMap.value("/lights/" + QString::number(id()) + "/state/ct").toInt();
|
|
m_colorMode = ColorModeCT;
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/effect")) {
|
|
QString effect = successMap.value("/lights/" + QString::number(id()) + "/state/effect").toString();
|
|
if (effect == "none") {
|
|
setEffect("none");
|
|
} else if (effect == "colorloop") {
|
|
setEffect("color loop");
|
|
}
|
|
}
|
|
if (successMap.contains("/lights/" + QString::number(id()) + "/state/alert")) {
|
|
m_alert = successMap.value("/lights/" + QString::number(id()) + "/state/alert").toString();
|
|
}
|
|
|
|
}
|
|
}
|
|
emit stateChanged();
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createSetPowerRequest(const bool &power)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create power request" << power;
|
|
|
|
QVariantMap requestMap;
|
|
requestMap.insert("on", power);
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createSetColorRequest(const QColor &color)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create color request" << color.toRgb();
|
|
|
|
QVariantMap requestMap;
|
|
requestMap.insert("hue", color.hue() * 65535 / 360);
|
|
requestMap.insert("sat", color.saturation());
|
|
requestMap.insert("on", true);
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createSetBrightnessRequest(const int &brightness)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create brightness request" << brightness;
|
|
|
|
QVariantMap requestMap;
|
|
requestMap.insert("bri", brightness);
|
|
if (brightness == 0) {
|
|
requestMap.insert("on", false);
|
|
} else {
|
|
requestMap.insert("on", true);
|
|
}
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createSetEffectRequest(const QString &effect)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create effect request" << effect;
|
|
|
|
QVariantMap requestMap;
|
|
if (effect == "none") {
|
|
requestMap.insert("effect", "none");
|
|
} else if (effect == "color loop") {
|
|
requestMap.insert("effect", "colorloop");
|
|
requestMap.insert("on", true);
|
|
}
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createSetTemperatureRequest(const int &colorTemp)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create color temperature request" << colorTemp;
|
|
|
|
QVariantMap requestMap;
|
|
requestMap.insert("ct", colorTemp);
|
|
requestMap.insert("on", true);
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|
|
|
|
QPair<QNetworkRequest, QByteArray> HueLight::createFlashRequest(const QString &alert)
|
|
{
|
|
qCDebug(dcPhilipsHue()) << "Create flash request" << alert;
|
|
|
|
QVariantMap requestMap;
|
|
if (alert == "flash") {
|
|
requestMap.insert("alert", "select");
|
|
} else if (alert == "flash 15 [s]") {
|
|
requestMap.insert("alert", "lselect");
|
|
}
|
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(requestMap);
|
|
|
|
QNetworkRequest request(QUrl("http://" + hostAddress().toString() + "/api/" + apiKey() +
|
|
"/lights/" + QString::number(id()) + "/state"));
|
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
|
return QPair<QNetworkRequest, QByteArray>(request, jsonDoc.toJson());
|
|
}
|