add new association topic for nodes and export association memberships

This commit is contained in:
Justin Hammond 2019-12-27 17:28:35 +08:00
parent 9826d80f73
commit a18fc443bf
10 changed files with 88 additions and 0 deletions

View file

@ -1063,6 +1063,7 @@ See Also:
This allows a MQTT Client to set a value on a Device. As OZW supports many different types of Values, you must ensure that the payload that you send matches the type of Value you are attempting to change (String, Integer etc)
**Params**:
"ValueIDKey" - the ValueID Key Number of the Value You want ot change
"Value" - The new Value to Set - Encoded as below:

View file

@ -164,6 +164,7 @@ Q_SIGNALS:
void nodeProtocolInfo(quint8 node);
void nodeEssentialNodeQueriesComplete(quint8 node);
void nodeQueriesComplete(quint8 node);
void nodeGroupChanged(quint8 node, quint8 group);
void driverReady(quint32 homeID);
void driverFailed(quint32 homeID);
void driverReset(quint32 homeID);

View file

@ -75,6 +75,7 @@ class QTOZWManager {
SIGNAL(nodeProtocolInfo(quint8 node))
SIGNAL(nodeEssentialNodeQueriesComplete(quint8 node))
SIGNAL(nodeQueriesComplete(quint8 node))
SIGNAL(nodeGroupChanged(quint8 node, quint8 group))
SIGNAL(driverReady(quint32 homeID))
SIGNAL(driverFailed(quint32 homeID))
SIGNAL(driverReset(quint32 homeID))

View file

@ -249,6 +249,7 @@ void QTOZWManager::connectSignals() {
CONNECT_DPTR(nodeProtocolInfo);
CONNECT_DPTR(nodeEssentialNodeQueriesComplete);
CONNECT_DPTR(nodeQueriesComplete);
CONNECT_DPTR(nodeGroupChanged);
CONNECT_DPTR(driverReady);
CONNECT_DPTR(driverFailed);
CONNECT_DPTR(driverReset);

View file

@ -1166,6 +1166,8 @@ void QTOZWManager_Internal::pvt_nodeGroupChanged(quint8 node, quint8 group)
if (ia != nullptr)
delete [] ia;
emit this->nodeGroupChanged(node, group);
}
void QTOZWManager_Internal::pvt_nodeNew(quint8 node)
{

View file

@ -0,0 +1,32 @@
#include "qt-openzwave/qtozwmanager.h"
#include "mqttAssociations.h"
#include "qtrj.h"
Q_LOGGING_CATEGORY(ozwmpassociation, "ozw.mqtt.publisher.association");
mqttAssociationModel::mqttAssociationModel(QObject *parent)
{
}
bool mqttAssociationModel::populateJsonObject(rapidjson::Document &jsonobject, quint8 node, quint8 group, QTOZWManager *mgr) {
Q_UNUSED(mgr);
if (jsonobject.IsNull())
jsonobject.SetObject();
QT2JS::SetString(jsonobject, "Name", getassocationData(node, group, QTOZW_Associations::associationColumns::GroupName).toString());
QT2JS::SetString(jsonobject, "Help", getassocationData(node, group, QTOZW_Associations::associationColumns::GroupHelp).toString());
QT2JS::SetUint(jsonobject, "MaxAssociations", getassocationData(node, group, QTOZW_Associations::associationColumns::MaxAssocations).toInt());
QStringList members = getassocationData(node, group, QTOZW_Associations::associationColumns::Members).toStringList();
rapidjson::Value N(rapidjson::kArrayType);
for (int i = 0; i < members.size(); i++) {
rapidjson::Value strVal;
strVal.SetString(members.at(i).toStdString().c_str(), jsonobject.GetAllocator());
N.PushBack(strVal, jsonobject.GetAllocator());
}
jsonobject.AddMember(rapidjson::Value("Members").Move(), N, jsonobject.GetAllocator());
return true;
}

View file

@ -0,0 +1,17 @@
#ifndef MQTTASSOC_H
#define MQTTASSOC_H
#include <QObject>
#include <QVariant>
#include <rapidjson/document.h>
#include "qt-openzwave/qtozwassociationmodel.h"
class mqttAssociationModel : public QTOZW_Associations {
Q_OBJECT
public:
explicit mqttAssociationModel(QObject *parent = nullptr);
bool populateJsonObject(rapidjson::Document &, quint8, quint8, QTOZWManager *);
};
#endif

View file

@ -202,6 +202,13 @@ QString mqttpublisher::getValueTopic(QString topic, quint8 node, quint8 instance
return t;
}
QString mqttpublisher::getAssociationTopic(quint8 node, quint8 group) {
QString t(MQTT_OZW_TOP_TOPIC);
t = t.arg(settings->value("Instance", 1).toInt());
t.append(QString(MQTT_OZW_ASSOCIATION_TOPIC).arg(static_cast<quint8>(node)).arg(static_cast<quint8>(group)));
return t;
}
QString mqttpublisher::getCommandTopic() {
QString t(MQTT_OZW_TOP_TOPIC);
t = t.arg(settings->value("Instance", 1).toInt());
@ -225,6 +232,7 @@ void mqttpublisher::setOZWDaemon(qtozwdaemon *ozwdaemon) {
this->m_nodeModel = static_cast<mqttNodeModel *>(manager->getNodeModel());
this->m_valueModel = static_cast<mqttValueIDModel *>(manager->getValueModel());
this->m_assocModel = static_cast<mqttAssociationModel *>(manager->getAssociationModel());
connect(manager, &QTOZWManager::ready, this, &mqttpublisher::ready);
connect(manager, &QTOZWManager::valueAdded, this, &mqttpublisher::valueAdded);
@ -240,6 +248,7 @@ void mqttpublisher::setOZWDaemon(qtozwdaemon *ozwdaemon) {
connect(manager, &QTOZWManager::nodeProtocolInfo, this, &mqttpublisher::nodeProtocolInfo);
connect(manager, &QTOZWManager::nodeEssentialNodeQueriesComplete, this, &mqttpublisher::nodeEssentialNodeQueriesComplete);
connect(manager, &QTOZWManager::nodeQueriesComplete, this, &mqttpublisher::nodeQueriesComplete);
connect(manager, &QTOZWManager::nodeGroupChanged, this, &mqttpublisher::nodeGroupChanged);
connect(manager, &QTOZWManager::driverReady, this, &mqttpublisher::driverReady);
connect(manager, &QTOZWManager::driverReset, this, &mqttpublisher::driverReset);
connect(manager, &QTOZWManager::driverFailed, this, &mqttpublisher::driverFailed);
@ -359,6 +368,12 @@ void mqttpublisher::sendCommandUpdate(QString command, rapidjson::Document &js)
return;
}
void mqttpublisher::sendAssociationUpdate(quint8 node, quint8 group, rapidjson::Document &js) {
QT2JS::SetUInt64(js, "TimeStamp", QDateTime::currentSecsSinceEpoch());
this->m_client->publish(QMqttTopicName(getAssociationTopic(node, group)), QT2JS::getJSON(js), 0, false);
return;
}
bool mqttpublisher::delNodeTopic(quint8 node) {
this->m_client->publish(QMqttTopicName(getNodeTopic(MQTT_OZW_NODE_TOPIC, node)), NULL, 0, true);
return true;
@ -565,6 +580,15 @@ void mqttpublisher::nodeQueriesComplete(quint8 node) {
QT2JS::SetString(*this->m_nodes[node], "Event", "nodeQueriesComplete");
this->sendNodeUpdate(node);
}
void mqttpublisher::nodeGroupChanged(quint8 node, quint8 group) {
qCDebug(ozwmp) << "Publishing Event nodeGroupChanged: " << node << " Group: " << group;
rapidjson::Document *jsinstance = new rapidjson::Document(rapidjson::kObjectType);
this->m_assocModel->populateJsonObject(*jsinstance, node, group, this->m_qtozwdeamon->getManager());
this->sendAssociationUpdate(node, group, *jsinstance);
delete jsinstance;
}
void mqttpublisher::driverReady(quint32 homeID) {
qCDebug(ozwmp) << "Publishing Event driverReady:" << homeID;
QT2JS::SetString(this->m_ozwstatus, "Status", "driverReady");

View file

@ -10,6 +10,7 @@
#include "qtozwdaemon.h"
#include "mqttNodes.h"
#include "mqttValues.h"
#include "mqttAssociations.h"
#include "mqttcommands/mqttcommands.h"
class MqttCommands;
@ -22,6 +23,7 @@ class MqttCommands;
#define MQTT_OZW_INSTANCE_TOPIC "node/%1/instance/%2/"
#define MQTT_OZW_VID_TOPIC "node/%1/instance/%2/commandclass/%3/value/%4/"
#define MQTT_OZW_COMMANDCLASS_TOPIC "node/%1/instance/%2/commandclass/%3/"
#define MQTT_OZW_ASSOCIATION_TOPIC "node/%1/association/%2/"
#define MQTT_OZW_COMMAND_TOPIC "command/%1/"
#define MQTT_OZW_RESPONSE_TOPIC "event/%1/"
@ -34,6 +36,7 @@ public:
void setOZWDaemon(qtozwdaemon *ozwdaemon);
QTOZWManager *getQTOZWManager();
void sendCommandUpdate(QString, rapidjson::Document &);
void sendAssociationUpdate(quint8 node, quint8 group, rapidjson::Document &js);
bool isValidNode(quint8 node);
bool isValidValueID(quint64 vidKey);
QVariant getValueData(quint64, mqttValueIDModel::ValueIdColumns);
@ -55,6 +58,7 @@ public slots:
void nodeProtocolInfo(quint8 node);
void nodeEssentialNodeQueriesComplete(quint8 node);
void nodeQueriesComplete(quint8 node);
void nodeGroupChanged(quint8 node, quint8 group);
void driverReady(quint32 homeID);
void driverFailed(quint32 homeID);
void driverReset(quint32 homeID);
@ -86,6 +90,7 @@ private:
QString getInstanceTopic(QString, quint8, quint8);
QString getCommandClassTopic(QString, quint8, quint8, quint8);
QString getValueTopic(QString, quint8, quint8, quint8, quint64);
QString getAssociationTopic(quint8, quint8);
QString getCommandTopic();
QString getCommandResponseTopic(QString);
bool sendStatusUpdate();
@ -94,6 +99,7 @@ private:
bool sendValueUpdate(quint64);
bool sendInstanceUpdate(quint8, quint8);
bool sendCommandClassUpdate(quint8, quint8, quint8);
bool delNodeTopic(quint8);
bool delValueTopic(quint64);
bool delInstanceTopic(quint8, quint8);
@ -108,6 +114,7 @@ private:
mqttNodeModel *m_nodeModel;
QMap<quint64, rapidjson::Document *> m_values;
mqttValueIDModel *m_valueModel;
mqttAssociationModel *m_assocModel;
QMqttClient *m_client;
qtozwdaemon *m_qtozwdeamon;

View file

@ -27,6 +27,7 @@ qtHaveModule(mqtt) {
SOURCES += mqttpublisher.cpp \
mqttNodes.cpp \
mqttValues.cpp \
mqttAssociations.cpp \
qtrj.cpp \
mqttcommands/mqttcommands.cpp \
mqttcommands/ping.cpp \
@ -69,6 +70,7 @@ qtHaveModule(mqtt) {
qtrj.h \
mqttNodes.h \
mqttValues.h \
mqttAssociations.h \
mqttcommands/mqttcommands.h \
mqttcommands/ping.h \
mqttcommands/open.h \