diff --git a/libnymea-core/jsonrpc/zigbeehandler.cpp b/libnymea-core/jsonrpc/zigbeehandler.cpp index c6ed506a..15453b96 100644 --- a/libnymea-core/jsonrpc/zigbeehandler.cpp +++ b/libnymea-core/jsonrpc/zigbeehandler.cpp @@ -252,6 +252,7 @@ ZigbeeHandler::ZigbeeHandler(ZigbeeManager *zigbeeManager, QObject *parent) : connect(m_zigbeeManager, &ZigbeeManager::nodeJoined, this, &ZigbeeHandler::onNodeJoined); connect(m_zigbeeManager, &ZigbeeManager::nodeAdded, this, &ZigbeeHandler::onNodeAdded); + connect(m_zigbeeManager, &ZigbeeManager::nodeChanged, this, &ZigbeeHandler::onNodeChanged); connect(m_zigbeeManager, &ZigbeeManager::nodeRemoved, this, &ZigbeeHandler::onNodeRemoved); } @@ -497,6 +498,11 @@ void ZigbeeHandler::onNodeJoined(const QUuid &networkUuid, ZigbeeNode *node) void ZigbeeHandler::onNodeAdded(const QUuid &networkUuid, ZigbeeNode *node) { // Note: we emit the node changed signal here, since the node has been added internally after initialization. + onNodeChanged(networkUuid, node); +} + +void ZigbeeHandler::onNodeChanged(const QUuid &networkUuid, ZigbeeNode *node) +{ QVariantMap params; params.insert("networkUuid", networkUuid); params.insert("zigbeeNode", packNode(node)); diff --git a/libnymea-core/jsonrpc/zigbeehandler.h b/libnymea-core/jsonrpc/zigbeehandler.h index 987fa49d..b9e5c24b 100644 --- a/libnymea-core/jsonrpc/zigbeehandler.h +++ b/libnymea-core/jsonrpc/zigbeehandler.h @@ -70,6 +70,7 @@ private: private slots: void onNodeJoined(const QUuid &networkUuid, ZigbeeNode *node); void onNodeAdded(const QUuid &networkUuid, ZigbeeNode *node); + void onNodeChanged(const QUuid &networkUuid, ZigbeeNode *node); void onNodeRemoved(const QUuid &networkUuid, ZigbeeNode *node); signals: diff --git a/libnymea-core/zigbee/zigbeemanager.cpp b/libnymea-core/zigbee/zigbeemanager.cpp index a0f71179..beea7a1e 100644 --- a/libnymea-core/zigbee/zigbeemanager.cpp +++ b/libnymea-core/zigbee/zigbeemanager.cpp @@ -205,8 +205,8 @@ ZigbeeManager::ZigbeeError ZigbeeManager::removeZigbeeNetwork(const QUuid &netwo settings.beginGroup("ZigbeeNetworks"); settings.beginGroup(network->networkUuid().toString()); settings.remove(""); - settings.endGroup(); - settings.endGroup(); + settings.endGroup(); // networkUuid + settings.endGroup(); // ZigbeeNetworks qCDebug(dcZigbee()) << "Network removed successfully"; return ZigbeeManager::ZigbeeErrorNoError; @@ -547,7 +547,9 @@ void ZigbeeManager::addNetwork(ZigbeeNetwork *network) connect(network, &ZigbeeNetwork::nodeJoined, this, [this, network](ZigbeeNode *node){ // The node has joined but is still initializing. Once the node has been initialized by the stack, the node added signal will be emitted. qCDebug(dcZigbee()) << "Node joined the network" << network->networkUuid().toString() << node; + emit nodeJoined(network->networkUuid(), node); + setupNodeSignals(node); }); connect(network, &ZigbeeNetwork::firmwareVersionChanged, this, [this, network](const QString &firmwareVersion){ @@ -589,6 +591,10 @@ void ZigbeeManager::addNetwork(ZigbeeNetwork *network) } } } + + foreach (ZigbeeNode *node, network->nodes()) { + setupNodeSignals(node); + } } ZigbeeAdapter ZigbeeManager::convertUartAdapterToAdapter(const ZigbeeUartAdapter &uartAdapter) @@ -634,5 +640,42 @@ void ZigbeeManager::evaluateZigbeeAvailable() emit availableChanged(m_available); } +void ZigbeeManager::setupNodeSignals(ZigbeeNode *node) +{ + // Connect signals while joining for initializing + + connect(node, &ZigbeeNode::shortAddressChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::stateChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::manufacturerNameChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::modelNameChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::versionChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::lqiChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::lastSeenChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); + + connect(node, &ZigbeeNode::reachableChanged, this, [=](){ + emit nodeChanged(node->networkUuid(), node); + }); +} + } diff --git a/libnymea-core/zigbee/zigbeemanager.h b/libnymea-core/zigbee/zigbeemanager.h index 13bd66a1..ce59aeef 100644 --- a/libnymea-core/zigbee/zigbeemanager.h +++ b/libnymea-core/zigbee/zigbeemanager.h @@ -114,6 +114,7 @@ private: ZigbeeAdapter convertUartAdapterToAdapter(const ZigbeeUartAdapter &uartAdapter); void evaluateZigbeeAvailable(); + void setupNodeSignals(ZigbeeNode *node); signals: void availableChanged(bool available); @@ -127,6 +128,7 @@ signals: void nodeJoined(const QUuid &networkUuid, ZigbeeNode *node); void nodeAdded(const QUuid &networkUuid, ZigbeeNode *node); + void nodeChanged(const QUuid &networkUuid, ZigbeeNode *node); void nodeRemoved(const QUuid &networkUuid, ZigbeeNode *node); };