From c4c7bc9108bb8e68d59cc3280caf5099961a1eb0 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 24 Mar 2020 19:05:50 +0100 Subject: [PATCH] Change group behavior a bit --- libnymea-app/devicemanager.cpp | 7 +++++-- libnymea-app/jsonrpc/jsontypes.cpp | 14 +++++++++++--- libnymea-app/thinggroup.cpp | 10 ++++++++++ libnymea-app/types/device.h | 2 +- libnymea-app/types/interface.cpp | 2 ++ nymea-app/ui/mainviews/DevicesPageDelegate.qml | 5 +++-- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libnymea-app/devicemanager.cpp b/libnymea-app/devicemanager.cpp index bf9816e4..5dff3ed2 100644 --- a/libnymea-app/devicemanager.cpp +++ b/libnymea-app/devicemanager.cpp @@ -161,6 +161,10 @@ void DeviceManager::notificationReceived(const QVariantMap &data) QUuid deviceId = data.value("params").toMap().value("deviceId").toUuid(); qDebug() << "JsonRpc: Notification: Device removed" << deviceId.toString(); Device *device = m_devices->getDevice(deviceId); + if (!device) { + qWarning() << "Received a DeviceRemoved notification for a device we don't know!"; + return; + } m_devices->removeDevice(device); device->deleteLater(); } else if (notification == "Devices.DeviceChanged") { @@ -399,9 +403,8 @@ void DeviceManager::savePluginConfig(const QUuid &pluginId) ThingGroup *DeviceManager::createGroup(Interface *interface, DevicesProxy *things) { - ThingGroup* group = new ThingGroup(this, interface->createDeviceClass(), things, this); - + group->setSetupStatus(Device::DeviceSetupStatusComplete, QString()); return group; } diff --git a/libnymea-app/jsonrpc/jsontypes.cpp b/libnymea-app/jsonrpc/jsontypes.cpp index 04794280..b7021070 100644 --- a/libnymea-app/jsonrpc/jsontypes.cpp +++ b/libnymea-app/jsonrpc/jsontypes.cpp @@ -242,9 +242,17 @@ Device* JsonTypes::unpackDevice(DeviceManager *deviceManager, const QVariantMap device->setId(deviceMap.value("id").toUuid()); // As of JSONRPC 4.2 setupComplete is deprecated and setupStatus is new if (deviceMap.contains("setupStatus")) { - QMetaEnum setupStatusEnum = QMetaEnum::fromType(); - device->setSetupStatus(static_cast(setupStatusEnum.keyToValue(deviceMap.value("setupStatus").toByteArray().data())), - deviceMap.value("setupDisplayMessage").toString()); + QString setupStatus = deviceMap.value("setupStatus").toString(); + QString setupDisplayMessage = deviceMap.value("setupDisplayMessage").toString(); + if (setupStatus == "DeviceSetupStatusNone" || setupStatus == "ThingSetupStatusNone") { + device->setSetupStatus(Device::DeviceSetupStatusNone, setupDisplayMessage); + } else if (setupStatus == "DeviceSetupStatusInProgress" || setupStatus == "ThingSetupStatusInProgress") { + device->setSetupStatus(Device::DeviceSetupStatusInProgress, setupDisplayMessage); + } else if (setupStatus == "DeviceSetupStatusComplete" || setupStatus == "ThingSetupStatusComplete") { + device->setSetupStatus(Device::DeviceSetupStatusComplete, setupDisplayMessage); + } else if (setupStatus == "DeviceSetupStatusFailed" || setupStatus == "ThingSetupStatusFailed") { + device->setSetupStatus(Device::DeviceSetupStatusFailed, setupDisplayMessage); + } } else { device->setSetupStatus(deviceMap.value("setupComplete").toBool() ? Device::DeviceSetupStatusComplete : Device::DeviceSetupStatusNone, QString()); } diff --git a/libnymea-app/thinggroup.cpp b/libnymea-app/thinggroup.cpp index 324af918..e0f2a84e 100644 --- a/libnymea-app/thinggroup.cpp +++ b/libnymea-app/thinggroup.cpp @@ -76,6 +76,7 @@ int ThingGroup::executeAction(const QString &actionName, const QVariantList &par { QList pendingIds; + qDebug() << "Execute action for group:" << this; for (int i = 0; i < m_devices->rowCount(); i++) { Device *device = m_devices->get(i); if (device->setupStatus() != Device::DeviceSetupStatusComplete) { @@ -119,11 +120,20 @@ void ThingGroup::syncStates() int count = 0; for (int j = 0; j < m_devices->rowCount(); j++) { Device *d = m_devices->get(j); + // Skip things that don't have the required state StateType *ds = d->deviceClass()->stateTypes()->findByName(stateType->name()); if (!ds) { continue; } + // Skip disconnected things + StateType *connectedStateType = d->deviceClass()->stateTypes()->findByName("connected"); + if (connectedStateType) { + if (!d->stateValue(connectedStateType->id()).toBool()) { + continue; + } + } + if (stateType->type().toLower() == "bool") { if (d->stateValue(ds->id()).toBool()) { value = true; diff --git a/libnymea-app/types/device.h b/libnymea-app/types/device.h index 27728dfb..cfd6b333 100644 --- a/libnymea-app/types/device.h +++ b/libnymea-app/types/device.h @@ -114,7 +114,7 @@ protected: QString m_name; QUuid m_id; QUuid m_parentDeviceId; - DeviceSetupStatus m_setupStatus; + DeviceSetupStatus m_setupStatus = DeviceSetupStatusNone; QString m_setupDisplayMessage; Params *m_params = nullptr; Params *m_settings = nullptr; diff --git a/libnymea-app/types/interface.cpp b/libnymea-app/types/interface.cpp index cdc42d54..55ecd526 100644 --- a/libnymea-app/types/interface.cpp +++ b/libnymea-app/types/interface.cpp @@ -75,6 +75,8 @@ DeviceClass *Interface::createDeviceClass() { DeviceClass* dc = new DeviceClass(); dc->setName(m_name); + dc->setParamTypes(new ParamTypes(dc)); + dc->setSettingsTypes(new ParamTypes(dc)); dc->setDisplayName(m_displayName); dc->setEventTypes(m_eventTypes); dc->setStateTypes(m_stateTypes); diff --git a/nymea-app/ui/mainviews/DevicesPageDelegate.qml b/nymea-app/ui/mainviews/DevicesPageDelegate.qml index 35b87e77..95764ad3 100644 --- a/nymea-app/ui/mainviews/DevicesPageDelegate.qml +++ b/nymea-app/ui/mainviews/DevicesPageDelegate.qml @@ -161,8 +161,9 @@ MainPageTile { onClicked: { switch (iface.name) { case "light": - - pageStack.push("../devicepages/LightDevicePage.qml", {device: engine.deviceManager.createGroup(Interfaces.findByName("colorlight"), devicesProxy)}) + var group = engine.deviceManager.createGroup(Interfaces.findByName("colorlight"), devicesProxy); + print("opening lights page for group", group) + pageStack.push("../devicepages/LightDevicePage.qml", {device: group}) } }