mirror of
https://github.com/nymea/nymea-plugins.git
synced 2026-10-25 14:02:37 +01:00
added yeelight
This commit is contained in:
parent
6e781113e5
commit
e335524421
@ -65,6 +65,7 @@ PLUGIN_DIRS = \
|
|||||||
wakeonlan \
|
wakeonlan \
|
||||||
wemo \
|
wemo \
|
||||||
ws2812fx \
|
ws2812fx \
|
||||||
|
yeelight \
|
||||||
|
|
||||||
|
|
||||||
message(============================================)
|
message(============================================)
|
||||||
|
|||||||
1
yeelight/README.md
Normal file
1
yeelight/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Yeelight
|
||||||
113
yeelight/devicepluginyeelight.cpp
Normal file
113
yeelight/devicepluginyeelight.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* Copyright (C) 2020 Bernhard Trinnes <bernhard.trinnes@nymea.io> *
|
||||||
|
* *
|
||||||
|
* This file is part of nymea. *
|
||||||
|
* *
|
||||||
|
* 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 "devicepluginyeelight.h"
|
||||||
|
|
||||||
|
#include "devices/device.h"
|
||||||
|
#include "types/param.h"
|
||||||
|
#include "plugininfo.h"
|
||||||
|
#include "network/upnp/upnpdiscovery.h"
|
||||||
|
#include "network/upnp/upnpdiscoveryreply.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QColor>
|
||||||
|
|
||||||
|
DevicePluginYeelight::DevicePluginYeelight()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DevicePluginYeelight::discoverDevices(DeviceDiscoveryInfo *info)
|
||||||
|
{
|
||||||
|
if (info->deviceClassId() == colorBulbDeviceClassId) {
|
||||||
|
|
||||||
|
DiscoveryJob *discovery = new DiscoveryJob();
|
||||||
|
m_discoveries.insert(info, discovery);
|
||||||
|
|
||||||
|
qCDebug(dcYeelight()) << "Starting UPnP discovery...";
|
||||||
|
UpnpDiscoveryReply *upnpReply = hardwareManager()->upnpDiscovery()->discoverDevices("wifi_bulb");
|
||||||
|
discovery->upnpReply = upnpReply;
|
||||||
|
// Always clean up the upnp discovery
|
||||||
|
connect(upnpReply, &UpnpDiscoveryReply::finished, upnpReply, &UpnpDiscoveryReply::deleteLater);
|
||||||
|
|
||||||
|
// Process results if info is still around
|
||||||
|
connect(upnpReply, &UpnpDiscoveryReply::finished, info, [this, upnpReply, discovery](){
|
||||||
|
|
||||||
|
// Indicate we're done...
|
||||||
|
discovery->upnpReply = nullptr;
|
||||||
|
|
||||||
|
if (upnpReply->error() != UpnpDiscoveryReply::UpnpDiscoveryReplyErrorNoError) {
|
||||||
|
qCWarning(dcYeelight()) << "Upnp discovery error" << upnpReply->error();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (const UpnpDeviceDescriptor &upnpDevice, upnpReply->deviceDescriptors()) {
|
||||||
|
if (upnpDevice.modelDescription().contains("color")) {
|
||||||
|
DeviceDescriptor descriptor(bridgeDeviceClassId, "Yeelight Color Bulb", upnpDevice.hostAddress().toString());
|
||||||
|
ParamList params;
|
||||||
|
QString bridgeId = upnpDevice.serialNumber().toLower();
|
||||||
|
foreach (Device *existingDevice, myDevices()) {
|
||||||
|
if (existingDevice->paramValue(bridgeDeviceIdParamTypeId).toString() == bridgeId) {
|
||||||
|
descriptor.setDeviceId(existingDevice->id());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
params.append(Param(bridgeDeviceHostParamTypeId, upnpDevice.hostAddress().toString()));
|
||||||
|
params.append(Param(bridgeDeviceIdParamTypeId, bridgeId));
|
||||||
|
descriptor.setParams(params);
|
||||||
|
qCDebug(dcYeelight()) << "UPnP: Found Hue bridge:" << bridgeId;
|
||||||
|
discovery->results.append(descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//finishDiscovery(discovery);
|
||||||
|
});
|
||||||
|
|
||||||
|
info->finish(Device::DeviceErrorNoError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DevicePluginYeelight::setupDevice(DeviceSetupInfo *info)
|
||||||
|
{
|
||||||
|
Device *device = info->device();
|
||||||
|
if (device->deviceClassId() == colorBulbDeviceClassId) {
|
||||||
|
QHostAddress *address = device->paramValue(colorBulbDeviceAddressParamTypeId).toString();
|
||||||
|
int port;
|
||||||
|
Yeelight *yeelight = new Yeelight(hardwareManager(), address, port, this);
|
||||||
|
info->finish(Device::DeviceErrorNoError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DevicePluginYeelight::executeAction(DeviceActionInfo *info)
|
||||||
|
{
|
||||||
|
Device *device = info->device();
|
||||||
|
Action action = info->action();
|
||||||
|
|
||||||
|
if (device->deviceClassId() == colorBulbDeviceClassId) {
|
||||||
|
|
||||||
|
// if (action.actionTypeId() == ) {
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DevicePluginYeelight::deviceRemoved(Device *device)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
69
yeelight/devicepluginyeelight.h
Normal file
69
yeelight/devicepluginyeelight.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* Copyright (C) 2020 Bernhard Trinnes <bernhard.trinnes@nymea.io> *
|
||||||
|
* *
|
||||||
|
* This file is part of nymea. *
|
||||||
|
* *
|
||||||
|
* 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/>. *
|
||||||
|
* *
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#ifndef DEVICEPLUGINYEELIGHT_H
|
||||||
|
#define DEVICEPLUGINYEELIGHT_H
|
||||||
|
|
||||||
|
#include "devices/deviceplugin.h"
|
||||||
|
#include "plugintimer.h"
|
||||||
|
#include "network/networkaccessmanager.h"
|
||||||
|
#include "network/upnp/upnpdiscovery.h"
|
||||||
|
#include "yeelight.h"
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
class DevicePluginYeelight : public DevicePlugin
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "devicepluginyeelight.json")
|
||||||
|
Q_INTERFACES(DevicePlugin)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit DevicePluginYeelight();
|
||||||
|
|
||||||
|
void discoverDevices(DeviceDiscoveryInfo *info) override;
|
||||||
|
void setupDevice(DeviceSetupInfo *info) override;
|
||||||
|
void executeAction(DeviceActionInfo *info) override;
|
||||||
|
void deviceRemoved(Device *device) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class DiscoveryJob {
|
||||||
|
public:
|
||||||
|
UpnpDiscoveryReply* upnpReply;
|
||||||
|
QNetworkReply* nUpnpReply;
|
||||||
|
DeviceDescriptors results;
|
||||||
|
};
|
||||||
|
QHash<DeviceDiscoveryInfo*, DiscoveryJob*> m_discoveries;
|
||||||
|
QList<QString> m_usedInterfaces;
|
||||||
|
QTimer *m_reconnectTimer = nullptr;
|
||||||
|
QHash<int, DeviceActionInfo *> m_asyncActions;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onReadyRead();
|
||||||
|
void onReconnectTimer();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DEVICEPLUGINYEELIGHT_H
|
||||||
102
yeelight/devicepluginyeelight.json
Normal file
102
yeelight/devicepluginyeelight.json
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"displayName": "Yeelight",
|
||||||
|
"name": "yeelight",
|
||||||
|
"id": "40012951-be9f-4de6-b6e1-0a7455fdd416",
|
||||||
|
"vendors": [
|
||||||
|
{
|
||||||
|
"name": "Yeelight",
|
||||||
|
"displayName": "Yeelight",
|
||||||
|
"id": "74011456-0a0f-4e43-bd94-bf4bb69593a4",
|
||||||
|
"deviceClasses": [
|
||||||
|
{
|
||||||
|
"id": "7d801b71-0aee-4b5d-ae62-a950473b20f5",
|
||||||
|
"name": "colorBulb",
|
||||||
|
"displayName": "Color bulb",
|
||||||
|
"createMethods": ["user", "discovery"],
|
||||||
|
"interfaces": ["colorlight", "connectable"],
|
||||||
|
"paramTypes": [
|
||||||
|
{
|
||||||
|
"id": "a603ff66-0da8-42e8-942b-1632a22adefb",
|
||||||
|
"name": "host",
|
||||||
|
"displayName": "Host address",
|
||||||
|
"type" : "QString",
|
||||||
|
"inputType": "IPv4Address",
|
||||||
|
"readOnly": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bfe184d2-6e62-4979-8ff2-3fd190903c82",
|
||||||
|
"name": "id",
|
||||||
|
"displayName": "Id",
|
||||||
|
"type" : "QString",
|
||||||
|
"readOnly": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"actionTypes": [
|
||||||
|
{
|
||||||
|
"id": "e80aea31-7ac0-4f71-9650-efb70ea1e768",
|
||||||
|
"name": "default",
|
||||||
|
"displayName": "Set default",
|
||||||
|
"type": "bool"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"stateTypes": [
|
||||||
|
{
|
||||||
|
"id": "7cb7d7ae-f281-46c9-83ea-52b1d7e8e2c8",
|
||||||
|
"name": "connected",
|
||||||
|
"displayName": "Reachable",
|
||||||
|
"displayNameEvent": "Reachable changed",
|
||||||
|
"defaultValue": false,
|
||||||
|
"type": "bool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "759b661e-8726-41c8-9c29-c5885eb19018",
|
||||||
|
"name": "power",
|
||||||
|
"displayName": "Power",
|
||||||
|
"displayNameEvent": "Power changed",
|
||||||
|
"displayNameAction": "Set power",
|
||||||
|
"type": "bool",
|
||||||
|
"defaultValue": false,
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "01f058cc-4bfb-439c-8344-f7ffdd2b2ed0",
|
||||||
|
"name": "colorTemperature",
|
||||||
|
"displayName": "Color temperature",
|
||||||
|
"displayNameEvent": "Color temperature changed",
|
||||||
|
"displayNameAction": "Set color temperature",
|
||||||
|
"type": "int",
|
||||||
|
"unit": "Mired",
|
||||||
|
"defaultValue": 170,
|
||||||
|
"minValue": 153,
|
||||||
|
"maxValue": 500,
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d74cfe47-b6e6-47ae-a8e9-bb99b8ae63fe",
|
||||||
|
"name": "color",
|
||||||
|
"displayName": "Color",
|
||||||
|
"displayNameEvent": "Color changed",
|
||||||
|
"displayNameAction": "Set color",
|
||||||
|
"type": "QColor",
|
||||||
|
"defaultValue": "#000000",
|
||||||
|
"writable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "a7a16fb8-0e8b-4aa3-977d-3ff7cd65c708",
|
||||||
|
"name": "brightness",
|
||||||
|
"displayName": "Brightness",
|
||||||
|
"displayNameEvent": "Brightness changed",
|
||||||
|
"displayNameAction": "Set brigtness",
|
||||||
|
"type": "int",
|
||||||
|
"unit": "Percentage",
|
||||||
|
"defaultValue": 0,
|
||||||
|
"minValue": 0,
|
||||||
|
"maxValue": 100,
|
||||||
|
"writable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
239
yeelight/yeelight.cpp
Normal file
239
yeelight/yeelight.cpp
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* Copyright (C) 2020 Bernhard Trinnes <bernhard.trinnes@nymea.io> *
|
||||||
|
* *
|
||||||
|
* This file is part of nymea. *
|
||||||
|
* *
|
||||||
|
* 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 "yeelight.h"
|
||||||
|
#include "extern-plugininfo.h"
|
||||||
|
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
|
||||||
|
Yeelight::Yeelight(NetworkAccessManager *networkManager, const QHostAddress &address, quint16 port, QObject *parent) :
|
||||||
|
QObject(parent),
|
||||||
|
m_address(address),
|
||||||
|
m_port(port),
|
||||||
|
m_networkManager(networkManager)
|
||||||
|
{
|
||||||
|
m_socket = new QTcpSocket(this);
|
||||||
|
connect(m_socket, &QTcpSocket::stateChanged, this, &Yeelight::onStateChanged);
|
||||||
|
m_socket->connectToHost(address, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Yeelight::connected()
|
||||||
|
{
|
||||||
|
return m_socket->isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Yeelight::getParam(QList<Yeelight::Property> properties)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "get_prop";
|
||||||
|
QJsonArray params;
|
||||||
|
|
||||||
|
foreach (Property property, properties) {
|
||||||
|
switch (property) {
|
||||||
|
case Property::Ct:
|
||||||
|
params.append("ct");
|
||||||
|
break;
|
||||||
|
case Property::Power:
|
||||||
|
params.append("powr");
|
||||||
|
break;
|
||||||
|
case Property::Bright:
|
||||||
|
params.append("bright");
|
||||||
|
break;
|
||||||
|
case Property::Hue:
|
||||||
|
params.append("hue");
|
||||||
|
break;
|
||||||
|
case Property::Rgb:
|
||||||
|
params.append("rgb");
|
||||||
|
break;
|
||||||
|
case Property::Sat:
|
||||||
|
params.append("sat");
|
||||||
|
break;
|
||||||
|
case Property::Name:
|
||||||
|
params.append("name");
|
||||||
|
break;
|
||||||
|
case Property::BgCt:
|
||||||
|
params.append("bg_ct");
|
||||||
|
break;
|
||||||
|
case Property::NlBr:
|
||||||
|
params.append("nl_br");
|
||||||
|
break;
|
||||||
|
case Property::BgHue:
|
||||||
|
params.append("bg_hue");
|
||||||
|
break;
|
||||||
|
case Property::BgRgb:
|
||||||
|
params.append("bg_rgb");
|
||||||
|
break;
|
||||||
|
case Property::BgSat:
|
||||||
|
params.append("bg_sat");
|
||||||
|
break;
|
||||||
|
case Property::BgLmode:
|
||||||
|
params.append("bg_lmode");
|
||||||
|
break;
|
||||||
|
case Property::BgPower:
|
||||||
|
params.append("bg_power");
|
||||||
|
break;
|
||||||
|
case Property::Flowing:
|
||||||
|
params.append("flowing");
|
||||||
|
break;
|
||||||
|
case Property::MusicOn:
|
||||||
|
params.append("music_on");
|
||||||
|
break;
|
||||||
|
case Property::BgBright:
|
||||||
|
params.append("bg_bright");
|
||||||
|
break;
|
||||||
|
case Property::DelayOff:
|
||||||
|
params.append("delay_off");
|
||||||
|
break;
|
||||||
|
case Property::BgFlowing:
|
||||||
|
params.append("bg_flowing");
|
||||||
|
break;
|
||||||
|
case Property::ColorMode:
|
||||||
|
params.append("color_mode");
|
||||||
|
break;
|
||||||
|
case Property::ActiveMode:
|
||||||
|
params.append("active_mode");
|
||||||
|
break;
|
||||||
|
case Property::FlowParams:
|
||||||
|
params.append("flow_params");
|
||||||
|
break;
|
||||||
|
case Property::BgFlowParams:
|
||||||
|
params.append("bg_flow_params");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj["params"] = params;
|
||||||
|
doc.setObject(obj);
|
||||||
|
m_socket->write(doc.toJson());
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setName(const QString &name)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_name";
|
||||||
|
QJsonArray params;
|
||||||
|
params.append(name);
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setColorTemperature(int mirad, int msFadeTime)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_ct_abx";
|
||||||
|
QJsonArray params;
|
||||||
|
params.append(mirad);
|
||||||
|
params.append("smooth");
|
||||||
|
params.append(msFadeTime);
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setRgb(QRgb color, int msFadeTime)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_rgb";
|
||||||
|
QJsonArray params;
|
||||||
|
params.append(QVariant(color).toInt());
|
||||||
|
params.append("smooth");
|
||||||
|
params.append(msFadeTime);
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setBrightness(int percentage, int msFadeTime)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_bright";
|
||||||
|
QJsonArray params;
|
||||||
|
params.append(percentage);
|
||||||
|
params.append("smooth");
|
||||||
|
params.append(msFadeTime);
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setPower(bool power, int msFadeTime)
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_power";
|
||||||
|
QJsonArray params;
|
||||||
|
if(power) {
|
||||||
|
params.append("on");
|
||||||
|
} else {
|
||||||
|
params.append("off");
|
||||||
|
}
|
||||||
|
params.append("smooth");
|
||||||
|
params.append(msFadeTime);
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Yeelight::setDefault()
|
||||||
|
{
|
||||||
|
int requestId = static_cast<int>(QRandomGenerator::global()->generate());
|
||||||
|
QJsonDocument doc;
|
||||||
|
QJsonObject obj;
|
||||||
|
obj["id"] = requestId;
|
||||||
|
obj["method"] = "set_default";
|
||||||
|
QJsonArray params;
|
||||||
|
obj["params"] = params;
|
||||||
|
return requestId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Yeelight::onStateChanged(QAbstractSocket::SocketState state)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case QAbstractSocket::SocketState::ConnectedState:
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
95
yeelight/yeelight.h
Normal file
95
yeelight/yeelight.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||||
|
* *
|
||||||
|
* Copyright (C) 2020 Bernhard Trinnes <bernhard.trinnes@nymea.io> *
|
||||||
|
* *
|
||||||
|
* This file is part of nymea. *
|
||||||
|
* *
|
||||||
|
* 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/>. *
|
||||||
|
* *
|
||||||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
#ifndef YEELIGHT_H
|
||||||
|
#define YEELIGHT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QHostAddress>
|
||||||
|
#include <QTcpSocket>
|
||||||
|
|
||||||
|
#include "network/networkaccessmanager.h"
|
||||||
|
#include "devices/device.h"
|
||||||
|
|
||||||
|
#include <QRgb>
|
||||||
|
|
||||||
|
class Yeelight : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
enum Property {
|
||||||
|
Power, //on: smart LED is turned on / off: smart LED is turned off
|
||||||
|
Bright, //Brightness percentage. Range 1 ~ 100
|
||||||
|
Ct, //Color temperature. Range 1700 ~ 6500(k)
|
||||||
|
Rgb, //Color. Range 1 ~ 16777215
|
||||||
|
Hue, //Hue. Range 0 ~ 359
|
||||||
|
Sat, //Saturation. Range 0 ~ 100
|
||||||
|
ColorMode, //1: rgb mode / 2: color temperature mode / 3: hsv mode
|
||||||
|
Flowing, //0: no flow is running / 1:color flow is running
|
||||||
|
DelayOff, //The remaining time of a sleep timer. Range 1 ~ 60 (minutes)
|
||||||
|
FlowParams, //Current flow parameters (only meaningful when 'flowing' is 1)
|
||||||
|
MusicOn, //1: Music mode is on / 0: Music mode is off
|
||||||
|
Name, //The name of the device set by “set_name” command
|
||||||
|
BgPower, //Background light power status
|
||||||
|
BgFlowing, //Background light is flowing
|
||||||
|
BgFlowParams, //Current flow parameters of background light
|
||||||
|
BgCt, //Color temperature of background light
|
||||||
|
BgLmode, //1: rgb mode / 2: color temperature mode / 3: hsv mode
|
||||||
|
BgBright, //Brightness percentage of background light
|
||||||
|
BgRgb, //Color of background light
|
||||||
|
BgHue, //Hue of background light
|
||||||
|
BgSat, //Saturation of background light
|
||||||
|
NlBr, //Brightness of night mode light
|
||||||
|
ActiveMode //0: daylight mode / 1: moonlight mode (ceiling light only)
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit Yeelight(NetworkAccessManager *networkManager, const QHostAddress &address, quint16 port = 55443, QObject *parent = nullptr);
|
||||||
|
bool connected();
|
||||||
|
|
||||||
|
int getParam(QList<Property> properties);
|
||||||
|
int setName(const QString &name);
|
||||||
|
int setColorTemperature(int mirad, int msFadeTime=500);
|
||||||
|
int setRgb(QRgb color, int msFadeTime = 500);
|
||||||
|
int setBrightness(int percentage, int msFadeTime = 500);
|
||||||
|
int setPower(bool power, int msFadeTime = 500);
|
||||||
|
int setDefault();
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
QTcpSocket *m_socket = nullptr;
|
||||||
|
QHostAddress m_address;
|
||||||
|
qint16 m_port;
|
||||||
|
NetworkAccessManager *m_networkManager = nullptr;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onRefreshTimeout();
|
||||||
|
void onStateChanged(QAbstractSocket::SocketState state);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void connectionChanged(bool connected);
|
||||||
|
void authenticationStatusChanged(bool authenticated);
|
||||||
|
void requestExecuted(int requestId, bool success);
|
||||||
|
void propertyReceived(Property property, QVariant value);
|
||||||
|
};
|
||||||
|
#endif // YEELIGHT_H
|
||||||
13
yeelight/yeelight.pro
Normal file
13
yeelight/yeelight.pro
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
include(../plugins.pri)
|
||||||
|
|
||||||
|
QT += network
|
||||||
|
|
||||||
|
TARGET = $$qtLibraryTarget(nymea_devicepluginyeelight)
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
devicepluginyeelight.cpp \
|
||||||
|
yeelight.cpp \
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
devicepluginyeelight.h \
|
||||||
|
yeelight.h \
|
||||||
Loading…
x
Reference in New Issue
Block a user