More work on zwave

This commit is contained in:
Michael Zanetti 2022-08-02 22:20:30 +02:00
parent 814e33bc39
commit 10a7de86af
7 changed files with 116 additions and 20 deletions

View File

@ -315,9 +315,12 @@ ZWaveNode *ZWaveManager::unpackNode(const QVariantMap &nodeMap, ZWaveNode *node)
node->setReachable(nodeMap.value("reachable").toBool()); node->setReachable(nodeMap.value("reachable").toBool());
node->setFailed(nodeMap.value("failed").toBool()); node->setFailed(nodeMap.value("failed").toBool());
node->setSleeping(nodeMap.value("sleeping").toBool()); node->setSleeping(nodeMap.value("sleeping").toBool());
node->setLinkQuality(nodeMap.value("linkQuality").toUInt());
QMetaEnum nodeTypeEnum = QMetaEnum::fromType<ZWaveNode::ZWaveNodeType>(); QMetaEnum nodeTypeEnum = QMetaEnum::fromType<ZWaveNode::ZWaveNodeType>();
node->setNodeType(static_cast<ZWaveNode::ZWaveNodeType>(nodeTypeEnum.keyToValue(nodeMap.value("nodeType").toByteArray()))); node->setNodeType(static_cast<ZWaveNode::ZWaveNodeType>(nodeTypeEnum.keyToValue(nodeMap.value("nodeType").toByteArray())));
QMetaEnum roleEnum = QMetaEnum::fromType<ZWaveNode::ZWaveNodeRole>();
node->setRole(static_cast<ZWaveNode::ZWaveNodeRole>(roleEnum.keyToValue(nodeMap.value("role").toByteArray())));
QMetaEnum deviceTypeEnum = QMetaEnum::fromType<ZWaveNode::ZWaveDeviceType>(); QMetaEnum deviceTypeEnum = QMetaEnum::fromType<ZWaveNode::ZWaveDeviceType>();
node->setDeviceType(static_cast<ZWaveNode::ZWaveDeviceType>(deviceTypeEnum.keyToValue(nodeMap.value("deviceType").toByteArray()))); node->setDeviceType(static_cast<ZWaveNode::ZWaveDeviceType>(deviceTypeEnum.keyToValue(nodeMap.value("deviceType").toByteArray())));

View File

@ -32,6 +32,31 @@ void ZWaveNode::setNodeType(ZWaveNodeType nodeType)
} }
} }
QString ZWaveNode::nodeTypeString() const
{
QMetaEnum metaEnum = QMetaEnum::fromType<ZWaveNode::ZWaveNodeType>();
return QString(metaEnum.valueToKey(m_nodeType)).remove(QRegExp("^ZWaveNodeType"));
}
ZWaveNode::ZWaveNodeRole ZWaveNode::role() const
{
return m_role;
}
void ZWaveNode::setRole(ZWaveNodeRole role)
{
if (m_role != role) {
m_role = role;
emit roleChanged();
}
}
QString ZWaveNode::roleString() const
{
QMetaEnum metaEnum = QMetaEnum::fromType<ZWaveNode::ZWaveNodeRole>();
return QString(metaEnum.valueToKey(m_role)).remove(QRegExp("^ZWaveNodeRole"));
}
ZWaveNode::ZWaveDeviceType ZWaveNode::deviceType() const ZWaveNode::ZWaveDeviceType ZWaveNode::deviceType() const
{ {
return m_deviceType; return m_deviceType;
@ -45,7 +70,7 @@ void ZWaveNode::setDeviceType(ZWaveDeviceType deviceType)
QString ZWaveNode::deviceTypeString() const QString ZWaveNode::deviceTypeString() const
{ {
QMetaEnum metaEnum = QMetaEnum::fromType<ZWaveNode::ZWaveDeviceType>(); QMetaEnum metaEnum = QMetaEnum::fromType<ZWaveNode::ZWaveDeviceType>();
return metaEnum.valueToKey(m_deviceType); return QString(metaEnum.valueToKey(m_deviceType)).remove(QRegExp("^ZWaveDeviceType"));
} }
quint16 ZWaveNode::manufacturerId() const quint16 ZWaveNode::manufacturerId() const
@ -191,6 +216,19 @@ void ZWaveNode::setSleeping(bool sleeping)
} }
} }
quint8 ZWaveNode::linkQuality() const
{
return m_linkQuality;
}
void ZWaveNode::setLinkQuality(quint8 linkQuality)
{
if (m_linkQuality != linkQuality) {
m_linkQuality = linkQuality;
emit linkQualityChanged();
}
}
bool ZWaveNode::initialized() const bool ZWaveNode::initialized() const
{ {
return m_initialized; return m_initialized;

View File

@ -15,7 +15,11 @@ class ZWaveNode : public QObject
Q_PROPERTY(bool reachable READ reachable NOTIFY reachableChanged) Q_PROPERTY(bool reachable READ reachable NOTIFY reachableChanged)
Q_PROPERTY(bool failed READ failed NOTIFY failedChanged) Q_PROPERTY(bool failed READ failed NOTIFY failedChanged)
Q_PROPERTY(bool sleeping READ sleeping NOTIFY sleepingChanged) Q_PROPERTY(bool sleeping READ sleeping NOTIFY sleepingChanged)
Q_PROPERTY(quint8 linkQuality READ linkQuality NOTIFY linkQualityChanged)
Q_PROPERTY(ZWaveNodeType nodeType READ nodeType NOTIFY nodeTypeChanged) Q_PROPERTY(ZWaveNodeType nodeType READ nodeType NOTIFY nodeTypeChanged)
Q_PROPERTY(QString nodeTypeString READ nodeTypeString NOTIFY nodeTypeChanged)
Q_PROPERTY(ZWaveNodeRole role READ role NOTIFY roleChanged)
Q_PROPERTY(QString roleString READ roleString NOTIFY roleChanged)
Q_PROPERTY(ZWaveDeviceType deviceType READ deviceType NOTIFY deviceTypeChanged) Q_PROPERTY(ZWaveDeviceType deviceType READ deviceType NOTIFY deviceTypeChanged)
Q_PROPERTY(QString deviceTypeString READ deviceTypeString NOTIFY deviceTypeChanged) Q_PROPERTY(QString deviceTypeString READ deviceTypeString NOTIFY deviceTypeChanged)
Q_PROPERTY(quint16 manufacturerId READ manufacturerId NOTIFY manufacturerIdChanged) Q_PROPERTY(quint16 manufacturerId READ manufacturerId NOTIFY manufacturerIdChanged)
@ -37,6 +41,19 @@ public:
}; };
Q_ENUM(ZWaveNodeType) Q_ENUM(ZWaveNodeType)
enum ZWaveNodeRole {
ZWaveNodeRoleUnknown = -0x01,
ZWaveNodeRoleCentralController = 0x00,
ZWaveNodeRoleSubController = 0x01,
ZWaveNodeRolePortableController = 0x02,
ZWaveNodeRolePortableReportingController = 0x03,
ZWaveNodeRolePortableSlave = 0x04,
ZWaveNodeRoleAlwaysOnSlabe = 0x05,
ZWaveNodeRoleReportingSleepingSlave = 0x06,
ZWaveNodeRoleListeningSleepingSlave = 0x07
};
Q_ENUM(ZWaveNodeRole)
enum ZWaveDeviceType { enum ZWaveDeviceType {
ZWaveDeviceTypeUnknown = 0x0000, ZWaveDeviceTypeUnknown = 0x0000,
ZWaveDeviceTypeCentralController = 0x0100, ZWaveDeviceTypeCentralController = 0x0100,
@ -133,12 +150,19 @@ public:
bool sleeping() const; bool sleeping() const;
void setSleeping(bool sleeping); void setSleeping(bool sleeping);
quint8 linkQuality() const;
void setLinkQuality(quint8 linkQuality);
ZWaveNodeType nodeType() const; ZWaveNodeType nodeType() const;
void setNodeType(ZWaveNodeType nodeType); void setNodeType(ZWaveNodeType nodeType);
QString nodeTypeString() const;
ZWaveNodeRole role() const;
void setRole(ZWaveNodeRole role);
QString roleString() const;
ZWaveDeviceType deviceType() const; ZWaveDeviceType deviceType() const;
void setDeviceType(ZWaveDeviceType deviceType); void setDeviceType(ZWaveDeviceType deviceType);
QString deviceTypeString() const; QString deviceTypeString() const;
// PlusDeviceType plusDeviceType() const; // PlusDeviceType plusDeviceType() const;
@ -172,8 +196,10 @@ signals:
void reachableChanged(); void reachableChanged();
void failedChanged(); void failedChanged();
void sleepingChanged(); void sleepingChanged();
void linkQualityChanged();
void nodeTypeChanged(); void nodeTypeChanged();
void deviceTypeChanged(); void deviceTypeChanged();
void roleChanged();
void plusDeviceTypeChanged(); void plusDeviceTypeChanged();
void manufacturerIdChanged(); void manufacturerIdChanged();
@ -193,8 +219,10 @@ private:
bool m_reachable = false; bool m_reachable = false;
bool m_failed = false; bool m_failed = false;
bool m_sleeping = false; bool m_sleeping = false;
quint8 m_linkQuality = 0;
ZWaveNodeType m_nodeType = ZWaveNodeTypeUnknown; ZWaveNodeType m_nodeType = ZWaveNodeTypeUnknown;
ZWaveNodeRole m_role = ZWaveNodeRoleUnknown;
ZWaveDeviceType m_deviceType = ZWaveDeviceTypeUnknown; ZWaveDeviceType m_deviceType = ZWaveDeviceTypeUnknown;
quint16 m_manufacturerId = 0; quint16 m_manufacturerId = 0;
QString m_manufacturerName; QString m_manufacturerName;

View File

@ -14,6 +14,7 @@ ConfigurationBase {
mqttSettingsEnabled: true mqttSettingsEnabled: true
webServerSettingsEnabled: true webServerSettingsEnabled: true
zigbeeSettingsEnabled: true zigbeeSettingsEnabled: true
zwaveSettingsEnabled: true
modbusSettingsEnabled: true modbusSettingsEnabled: true
pluginSettingsEnabled: true pluginSettingsEnabled: true

View File

@ -14,6 +14,7 @@ Item {
property bool mqttSettingsEnabled: false property bool mqttSettingsEnabled: false
property bool webServerSettingsEnabled: false property bool webServerSettingsEnabled: false
property bool zigbeeSettingsEnabled: false property bool zigbeeSettingsEnabled: false
property bool zwaveSettingsEnabled: false
property bool modbusSettingsEnabled: false property bool modbusSettingsEnabled: false
property bool pluginSettingsEnabled: false property bool pluginSettingsEnabled: false

View File

@ -126,7 +126,7 @@ Page {
iconSource: "../images/z-wave.svg" iconSource: "../images/z-wave.svg"
text: qsTr("Z-Wave") text: qsTr("Z-Wave")
subText: qsTr("Configure Z-Wave networks") subText: qsTr("Configure Z-Wave networks")
visible: engine.jsonRpcClient.ensureServerVersion("6.1") && NymeaUtils.hasPermissionScope(engine.jsonRpcClient.permissions, UserInfo.PermissionScopeAdmin) && Configuration.zigbeeSettingsEnabled visible: engine.jsonRpcClient.ensureServerVersion("6.1") && NymeaUtils.hasPermissionScope(engine.jsonRpcClient.permissions, UserInfo.PermissionScopeAdmin) && Configuration.zwaveSettingsEnabled
onClicked: pageStack.push(Qt.resolvedUrl("system/zwave/ZWaveSettingsPage.qml")) onClicked: pageStack.push(Qt.resolvedUrl("system/zwave/ZWaveSettingsPage.qml"))
} }

View File

@ -277,19 +277,25 @@ SettingsPageBase {
paramsFilter: {"networkUuid": nodeDelegate.node.networkUuid, "nodeId": nodeDelegate.node.nodeId} paramsFilter: {"networkUuid": nodeDelegate.node.networkUuid, "nodeId": nodeDelegate.node.nodeId}
} }
readonly property Thing nodeThing: nodeThings.count >= 1 ? nodeThings.get(0) : null readonly property Thing nodeThing: nodeThings.count >= 1 ? nodeThings.get(0) : null
property int signalStrength: node ? Math.round(node.lqi * 100.0 / 255.0) : 0
Layout.fillWidth: true Layout.fillWidth: true
text: node.productName + " - " + node.manufacturerName// nodeThing ? nodeThing.name : node.model text: node.productName + " - " + node.manufacturerName// nodeThing ? nodeThing.name : node.model
subText: node.state == ZigbeeNode.ZigbeeNodeStateInitializing ? subText: node.state == ZigbeeNode.ZigbeeNodeStateInitializing ?
qsTr("Initializing...") qsTr("Initializing...")
: nodeThings.count == 1 ? nodeThing.name : : nodeThings.count == 1 ? nodeThing.name :
nodeThings.count > 1 ? qsTr("%1 things").arg(nodeThings.count) : qsTr("Unrecognized device") nodeThings.count > 1 ? qsTr("%1 things").arg(nodeThings.count)
: node.nodeType == ZWaveNode.ZWaveNodeTypeStaticController || node.nodeType == ZWaveNode.ZWaveNodeTypeController
? qsTr("Network controller") : qsTr("Unrecognized device")
iconName: nodeThing ? app.interfacesToIcon(nodeThing.thingClass.interfaces) : "/ui/images/z-wave.svg" iconName: nodeThing ? app.interfacesToIcon(nodeThing.thingClass.interfaces) : "/ui/images/z-wave.svg"
iconColor: busy ? Style.tileOverlayColor iconColor: busy
: node.failed ? Style.red ? Style.tileOverlayColor
: nodeThing != null ? Style.accentColor : node.nodeType == ZWaveNode.ZWaveNodeTypeController || node.nodeType == ZWaveNode.ZWaveNodeTypeStaticController
: Style.iconColor ? Style.green
: node.failed
? Style.red
: nodeThing != null
? Style.accentColor
: Style.iconColor
progressive: false progressive: false
busy: !node.initialized busy: !node.initialized
@ -300,22 +306,22 @@ SettingsPageBase {
dialog.open() dialog.open()
} }
secondaryIconName: node && !node.sleeping ? "/ui/images/system-suspend.svg" : "" secondaryIconName: node && node.sleeping ? "/ui/images/system-suspend.svg" : ""
tertiaryIconName: { tertiaryIconName: {
if (!node || !node.reachable) if (!node || !node.reachable)
return "/ui/images/connections/nm-signal-00.svg" return "/ui/images/connections/nm-signal-00.svg"
if (signalStrength <= 25) if (node.linkQuality <= 25)
return "/ui/images/connections/nm-signal-25.svg" return "/ui/images/connections/nm-signal-25.svg"
if (signalStrength <= 50) if (node.linkQuality <= 50)
return "/ui/images/connections/nm-signal-50.svg" return "/ui/images/connections/nm-signal-50.svg"
if (signalStrength <= 75) if (node.linkQuality <= 75)
return "/ui/images/connections/nm-signal-75.svg" return "/ui/images/connections/nm-signal-75.svg"
if (signalStrength <= 100) if (node.linkQuality <= 100)
return "/ui/images/connections/nm-signal-100.svg" return "/ui/images/connections/nm-signal-100.svg"
} }
@ -412,10 +418,31 @@ SettingsPageBase {
} }
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: nodeInfoDialog.node.deviceTypeString.replace(/ZWaveDeviceType/, "") text: nodeInfoDialog.node.deviceTypeString
font: Style.smallFont font: Style.smallFont
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
} }
Label {
text: qsTr("Node type:")
font: Style.smallFont
}
Label {
Layout.fillWidth: true
text: nodeInfoDialog.node.nodeTypeString
font: Style.smallFont
horizontalAlignment: Text.AlignRight
}
Label {
text: qsTr("Role:")
font: Style.smallFont
}
Label {
Layout.fillWidth: true
text: nodeInfoDialog.node.roleString
font: Style.smallFont
horizontalAlignment: Text.AlignRight
}
Label { Label {
text: qsTr("Z-Wave plus:") text: qsTr("Z-Wave plus:")
font: Style.smallFont font: Style.smallFont
@ -432,7 +459,7 @@ SettingsPageBase {
} }
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: (nodeInfoDialog.node.lqi * 100 / 255).toFixed(0) + " %" text: nodeInfoDialog.node.linkQuality + " %"
font: Style.smallFont font: Style.smallFont
horizontalAlignment: Text.AlignRight horizontalAlignment: Text.AlignRight
} }
@ -477,13 +504,11 @@ SettingsPageBase {
Layout.fillWidth: true Layout.fillWidth: true
Button { Button {
// size: Style.iconSize visible: node && node.nodeType !== ZWaveNode.ZWaveNodeTypeController && node.failed
visible: node && node.type !== ZigbeeNode.ZigbeeNodeTypeCoordinator
// imageSource: "/ui/images/delete.svg"
text: qsTr("Remove") text: qsTr("Remove")
Layout.alignment: Qt.AlignLeft Layout.alignment: Qt.AlignLeft
onClicked: { onClicked: {
var dialog = removeZigbeeNodeDialogComponent.createObject(app, {zigbeeNode: node}) var dialog = removeZWaveNodeDialogComponent.createObject(app, {zwaveNode: node})
dialog.open() dialog.open()
nodeInfoDialog.close() nodeInfoDialog.close()
} }