node-red-contrib-zwave-js
Version:
The most powerful, high performing and highly polished Z-Wave node for Node-RED based on Z-Wave JS. If you want a fully featured Z-Wave framework in your Node-RED instance, you have found it.
112 lines (99 loc) • 3.05 kB
JavaScript
const { NodeStatus, InterviewStage, InclusionState, ProtocolVersion, num2hex } = require('zwave-js');
const { CommandClasses } = require('@zwave-js/core');
const getNodes = (DriverInstance) => {
const Collection = [];
DriverInstance.controller.nodes.forEach((N) => {
const _N = {
nodeId: N.id,
nodeName: N.name,
nodeLocation: N.location,
lastSeen: N.lastSeen?.getTime(),
status: NodeStatus[N.status],
ready: N.ready,
interviewStage: InterviewStage[N.interviewStage],
zwavePlusVersion: N.zwavePlusVersion,
zwavePlusNodeType: N.zwavePlusNodeType,
zwavePlusRoleType: N.zwavePlusRoleType,
isListening: N.isListening,
isFrequentListening: N.isFrequentListening,
canSleep: N.canSleep,
isRouting: N.isRouting,
supportedDataRates: N.supportedDataRates,
maxDataRate: N.maxDataRate,
supportsSecurity: N.supportsSecurity,
isSecure: N.isSecure,
highestSecurityClass: N.getHighestSecurityClass(),
protocolVersion: N.protocolVersion ? ProtocolVersion[N.protocolVersion] : undefined,
manufacturerId: N.manufacturerId,
productId: N.productId,
productType: N.productType,
firmwareVersion: N.firmwareVersion,
sdkVersion: N.sdkVersion,
deviceConfig: N.deviceConfig,
isControllerNode: N.isControllerNode,
supportsBeaming: N.supportsBeaming,
keepAwake: N.keepAwake,
homeId: N.isControllerNode ? num2hex(DriverInstance.controller.homeId, true) : undefined,
inclusionState: N.isControllerNode ? InclusionState[DriverInstance.controller.inclusionState] : undefined,
supportsLongRange: N.isControllerNode ? DriverInstance.controller.supportsLongRange : undefined,
powerSource: {
type: N.supportsCC(CommandClasses.Battery) ? 'battery' : 'mains',
level: N.getValue({
commandClass: 128,
endpoint: 0,
property: 'level'
}),
rechargeOrReplace: N.getValue({
commandClass: 128,
endpoint: 0,
property: 'rechargeOrReplace'
})
},
statistics: N.isControllerNode ? { ...DriverInstance.controller.statistics } : { ...N.statistics }
};
if (_N.statistics?.lastSeen) {
_N.statistics.lastSeen = _N.statistics.lastSeen.getTime();
}
Collection.push(_N);
});
return Collection;
};
const getValueDB = (DriverInstance, Nodes) => {
const DB = [];
const TargetNodes = Nodes || [];
if (!Nodes) {
DriverInstance.controller.nodes.forEach((N) => {
if (!N.isControllerNode) {
TargetNodes.push(N.id);
}
});
}
TargetNodes.forEach((N) => {
const ZWN = DriverInstance.controller.nodes.get(N);
if (ZWN) {
const NodeData = {
nodeId: ZWN.id,
values: []
};
const VIDs = ZWN.getDefinedValueIDs();
VIDs.forEach((VID) => {
const Meta = ZWN.getValueMetadata(VID);
const Value = ZWN.getValue(VID);
const TS = ZWN.getValueTimestamp(VID);
const VI = {
currentValue: Value,
valueTimestamp: TS,
valueId: VID,
metadata: Meta
};
NodeData.values.push(VI);
});
DB.push(NodeData);
}
});
return DB;
};
module.exports = {
getNodes,
getValueDB
};