Nanoleaf: auto rediscovery

master
bernhard.trinnes 2020-07-01 12:40:40 +02:00
parent e26d38e155
commit 314fa560b8
4 changed files with 51 additions and 21 deletions

View File

@ -52,7 +52,8 @@ void IntegrationPluginNanoleaf::discoverThings(ThingDiscoveryInfo *info)
QStringList serialNumbers;
foreach (const ZeroConfServiceEntry &entry, m_zeroconfBrowser->serviceEntries()) {
ThingDescriptor descriptor(lightPanelsThingClassId, entry.name(), entry.hostAddress().toString());
QHostAddress address = QHostAddress(entry.hostAddress().toString());
ThingDescriptor descriptor(lightPanelsThingClassId, entry.name(), address.toString());
ParamList params;
QString serialNo;
@ -80,8 +81,6 @@ void IntegrationPluginNanoleaf::discoverThings(ThingDiscoveryInfo *info)
serialNumbers.append(serialNo);
qCDebug(dcNanoleaf()) << "Have device" << entry.name() << serialNo << model << firmwareVersion;
params << Param(lightPanelsThingAddressParamTypeId, entry.hostAddress().toString());
params << Param(lightPanelsThingPortParamTypeId, entry.port());
params << Param(lightPanelsThingModelParamTypeId, model);
params << Param(lightPanelsThingSerialNoParamTypeId, serialNo);
params << Param(lightPanelsThingFirmwareVersionParamTypeId, firmwareVersion);
@ -101,7 +100,9 @@ void IntegrationPluginNanoleaf::confirmPairing(ThingPairingInfo *info, const QSt
{
Q_UNUSED(username)
Q_UNUSED(secret)
Nanoleaf *nanoleaf = createNanoleafConnection(QHostAddress(info->params().paramValue(lightPanelsThingAddressParamTypeId).toString()), info->params().paramValue(lightPanelsThingPortParamTypeId).toInt());
QHostAddress address = getHostAddress(info->params().paramValue(lightPanelsThingSerialNoParamTypeId).toString());
uint port = getPort(info->params().paramValue(lightPanelsThingSerialNoParamTypeId).toString());
Nanoleaf *nanoleaf = createNanoleafConnection(address, port);
nanoleaf->addUser(); //push button pairing
m_unfinishedNanoleafConnections.insert(info->thingId(), nanoleaf);
m_unfinishedPairing.insert(nanoleaf, info);
@ -116,6 +117,10 @@ void IntegrationPluginNanoleaf::setupThing(ThingSetupInfo *info)
{
Thing *thing = info->thing();
if(thing->thingClassId() == lightPanelsThingClassId) {
QString thingSerialNo = thing->paramValue(lightPanelsThingSerialNoParamTypeId).toString();
qCDebug(dcNanoleaf()) << "Setting up Nanoleaf light panel with serial number:" << thingSerialNo;
pluginStorage()->beginGroup(thing->id().toString());
QString token = pluginStorage()->value("authToken").toString();
pluginStorage()->endGroup();
@ -128,8 +133,8 @@ void IntegrationPluginNanoleaf::setupThing(ThingSetupInfo *info)
return info->finish(Thing::ThingErrorNoError);
} else {
// This setupDevice is called after a (re)start, with an already added thing
QHostAddress address(thing->paramValue(lightPanelsThingAddressParamTypeId).toString());
int port = thing->paramValue(lightPanelsThingPortParamTypeId).toInt();
QHostAddress address = getHostAddress(thing->paramValue(lightPanelsThingSerialNoParamTypeId).toString());
int port = getPort(thing->paramValue(lightPanelsThingSerialNoParamTypeId).toString());
nanoleaf = createNanoleafConnection(address, port);
nanoleaf->setAuthToken(token);
nanoleaf->getControllerInfo(); //This is just to check if the thing is available
@ -263,6 +268,44 @@ Nanoleaf *IntegrationPluginNanoleaf::createNanoleafConnection(const QHostAddress
return nanoleaf;
}
QHostAddress IntegrationPluginNanoleaf::getHostAddress(const QString &serialNumber)
{
ZeroConfServiceEntry entry;
foreach (const ZeroConfServiceEntry &e, m_zeroconfBrowser->serviceEntries()) {
QString entrySerialNo;
foreach (QString value, entry.txt()) {
if (value.contains("id=")) {
entrySerialNo = value.split("=").last();
break;
}
}
if (serialNumber == entrySerialNo) {
entry = e;
break;
}
}
return QHostAddress(entry.hostAddress());
}
uint IntegrationPluginNanoleaf::getPort(const QString &serialNumber)
{
ZeroConfServiceEntry entry;
foreach (const ZeroConfServiceEntry &e, m_zeroconfBrowser->serviceEntries()) {
QString entrySerialNo;
foreach (QString value, entry.txt()) {
if (value.contains("id=")) {
entrySerialNo = value.split("=").last();
break;
}
}
if (serialNumber == entrySerialNo) {
entry = e;
break;
}
}
return entry.port();
}
void IntegrationPluginNanoleaf::onAuthTokenReceived(const QString &token)
{
Nanoleaf *nanoleaf = static_cast<Nanoleaf *>(sender());

View File

@ -76,6 +76,8 @@ private:
QHash<QUuid, BrowserActionInfo *> m_asyncBrowserItem;
Nanoleaf *createNanoleafConnection(const QHostAddress &address, int port);
QHostAddress getHostAddress(const QString &serialNumber);
uint getPort(const QString &serialNumber);
public slots:
void onAuthTokenReceived(const QString &token);

View File

@ -17,19 +17,6 @@
"setupMethod": "pushButton",
"browsable": true,
"paramTypes": [
{
"id": "ff57079f-d5ab-4511-8a5c-0726e7b82af6",
"name": "address",
"displayName": "Address",
"type" : "QString"
},
{
"id": "ba4fd45b-990d-480a-859d-fff7ffba3ba4",
"name": "port",
"displayName": "Port",
"type" : "int",
"readOnly": true
},
{
"id": "353d3c71-0ad2-40d5-99f6-cc305e2073f1",
"name": "model",

View File

@ -1,7 +1,5 @@
include(../plugins.pri)
TARGET = $$qtLibraryTarget(nymea_integrationpluginnanoleaf)
QT += network
SOURCES += \