From 3efb13eea15fa6127271b0bb525c8f8559edae8b Mon Sep 17 00:00:00 2001 From: AlCalzone Date: Tue, 14 May 2024 13:46:17 +0200 Subject: [PATCH] fix: include LR node information in NVM conversion (#6846) --- packages/core/src/capabilities/NodeInfo.ts | 10 +- packages/core/src/consts/index.ts | 3 + packages/nvmedit/src/convert.test.ts.md | 16 +- packages/nvmedit/src/convert.test.ts.snap | Bin 41737 -> 41727 bytes packages/nvmedit/src/convert.ts | 123 +++++++++++ packages/nvmedit/src/files/NodeInfoFiles.ts | 196 +++++++++++++++++- .../zwave-js/src/lib/controller/Controller.ts | 2 - 7 files changed, 332 insertions(+), 18 deletions(-) diff --git a/packages/core/src/capabilities/NodeInfo.ts b/packages/core/src/capabilities/NodeInfo.ts index eee547cf239a..afd5dd328b70 100644 --- a/packages/core/src/capabilities/NodeInfo.ts +++ b/packages/core/src/capabilities/NodeInfo.ts @@ -266,13 +266,15 @@ export function parseNodeProtocolInfo( let nodeType: NodeType; switch (capability & 0b1010) { - case 0b1000: - nodeType = NodeType["End Node"]; - break; case 0b0010: - default: nodeType = NodeType.Controller; break; + case 0b1000: + // Routing end node + default: + // Non-routing end node + nodeType = NodeType["End Node"]; + break; } const hasSpecificDeviceClass = !!(capability & 0b100); diff --git a/packages/core/src/consts/index.ts b/packages/core/src/consts/index.ts index ac9d11985779..851b37ef51ff 100644 --- a/packages/core/src/consts/index.ts +++ b/packages/core/src/consts/index.ts @@ -1,6 +1,9 @@ /** Max number of nodes in a ZWave network */ export const MAX_NODES = 232; +/** Max number of nodes in a Z-Wave LR network */ +export const MAX_NODES_LR = 4000; // FIXME: This seems too even, figure out the exact number + /** The broadcast target node id */ export const NODE_ID_BROADCAST = 0xff; diff --git a/packages/nvmedit/src/convert.test.ts.md b/packages/nvmedit/src/convert.test.ts.md index edb42938b836..a4c27259f56a 100644 --- a/packages/nvmedit/src/convert.test.ts.md +++ b/packages/nvmedit/src/convert.test.ts.md @@ -220,7 +220,7 @@ Generated by [AVA](https://avajs.dev). 6, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -247,7 +247,7 @@ Generated by [AVA](https://avajs.dev). 6, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -274,7 +274,7 @@ Generated by [AVA](https://avajs.dev). 6, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -301,7 +301,7 @@ Generated by [AVA](https://avajs.dev). 6, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -900,7 +900,7 @@ Generated by [AVA](https://avajs.dev). 12, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -932,7 +932,7 @@ Generated by [AVA](https://avajs.dev). 12, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -964,7 +964,7 @@ Generated by [AVA](https://avajs.dev). 12, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, @@ -992,7 +992,7 @@ Generated by [AVA](https://avajs.dev). 8, ], nlwr: null, - nodeType: 0, + nodeType: 1, optionalFunctionality: true, pendingDiscovery: false, protocolVersion: 3, diff --git a/packages/nvmedit/src/convert.test.ts.snap b/packages/nvmedit/src/convert.test.ts.snap index b4d5570f19a7f5bac8486da76f093b0f6e7fed5b..4a6b6a846e103eacb0189cf3228831bdb1f936b2 100644 GIT binary patch literal 41727 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 literal 41737 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 #ib5hXzaOpV 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 + lrNodes?: Record; } export interface NVMJSONController { @@ -166,6 +172,13 @@ export interface NVMJSONVirtualNode { isVirtual: true; } +export interface NVMJSONLRNode + extends Omit +{ + genericDeviceClass: number; + specificDeviceClass?: number | null; +} + export type NVMJSONNode = NVMJSONNodeWithInfo | NVMJSONVirtualNode; type ParsedNVM = @@ -210,6 +223,22 @@ function createEmptyPhysicalNode(): NVMJSONNodeWithInfo { }; } +function createEmptyLRNode(): NVMJSONLRNode { + return { + isListening: false, + isFrequentListening: false, + isRouting: false, + supportedDataRates: [], + protocolVersion: 3, + optionalFunctionality: false, + nodeType: NodeType["End Node"], + supportsSecurity: true, + supportsBeaming: false, + genericDeviceClass: 0, + specificDeviceClass: null, + }; +} + /** Converts a compressed set of NVM objects to a JSON representation */ export function nvmObjectsToJSON( objects: ReadonlyMap, @@ -220,6 +249,12 @@ export function nvmObjectsToJSON( return nodes.get(id)!; }; + const lrNodes = new Map(); + const getLRNode = (id: number): NVMJSONLRNode => { + if (!lrNodes.has(id)) lrNodes.set(id, createEmptyLRNode()); + return lrNodes.get(id)!; + }; + const getObject = ( id: number | ((id: number) => boolean), ): NVM3Object | undefined => { @@ -391,6 +426,29 @@ export function nvmObjectsToJSON( delete node.nodeId; } + // If they exist, read info about LR nodes + const lrNodeIds = getFile( + ProtocolLRNodeListFileID, + protocolVersion, + )?.nodeIds; + if (lrNodeIds) { + for (const id of lrNodeIds) { + const node = getLRNode(id); + + // Find node info + const fileId = nodeIdToLRNodeInfoFileIDV5(id); + const file = getFileOrThrow( + fileId, + protocolVersion, + ); + const { nodeId, ...nodeInfo } = file.nodeInfos.find((i) => + i.nodeId === id + )!; + + Object.assign(node, nodeInfo); + } + } + // Now read info about the controller const controllerInfoFile = getFileOrThrow( ControllerInfoFileID, @@ -538,6 +596,9 @@ export function nvmObjectsToJSON( controller, nodes: mapToObject(nodes), }; + if (lrNodes.size > 0) { + ret.lrNodes = mapToObject(lrNodes); + } return ret; } @@ -566,6 +627,28 @@ function nvmJSONNodeToNodeInfo( }; } +function nvmJSONLRNodeToLRNodeInfo( + nodeId: number, + node: NVMJSONLRNode, +): LRNodeInfo { + return { + nodeId, + ...pick(node, [ + "isListening", + "isFrequentListening", + "isRouting", + "supportedDataRates", + "protocolVersion", + "optionalFunctionality", + "nodeType", + "supportsSecurity", + "supportsBeaming", + "genericDeviceClass", + "specificDeviceClass", + ]), + }; +} + function nvmJSONControllerToFileOptions( ctrlr: NVMJSONController, ): ControllerInfoFileOptions { @@ -989,8 +1072,10 @@ export function jsonToNVMObjects_v7_11_0( addProtocolObjects(protocolVersionFile.serialize()); const nodeInfoFiles = new Map(); + const lrNodeInfoFiles = new Map(); const routeCacheFiles = new Map(); const nodeInfoExists = new Set(); + const lrNodeInfoExists = new Set(); const routeCacheExists = new Set(); for (const [id, node] of Object.entries(target.nodes)) { @@ -1036,6 +1121,31 @@ export function jsonToNVMObjects_v7_11_0( } } + if (target.lrNodes) { + for (const [id, node] of Object.entries(target.lrNodes)) { + const nodeId = parseInt(id); + + lrNodeInfoExists.add(nodeId); + + // Create/update node info file + const nodeInfoFileIndex = nodeIdToLRNodeInfoFileIDV5(nodeId); + if (!lrNodeInfoFiles.has(nodeInfoFileIndex)) { + lrNodeInfoFiles.set( + nodeInfoFileIndex, + new LRNodeInfoFileV5({ + nodeInfos: [], + fileVersion: target.controller.protocolVersion, + }), + ); + } + const nodeInfoFile = lrNodeInfoFiles.get(nodeInfoFileIndex)!; + + nodeInfoFile.nodeInfos.push( + nvmJSONLRNodeToLRNodeInfo(nodeId, node), + ); + } + } + // For v3+ targets, the ControllerInfoFile must contain the LongRange properties // or the controller will ignore the file and not have a home ID if (targetProtocolFormat >= 3) { @@ -1072,6 +1182,18 @@ export function jsonToNVMObjects_v7_11_0( ); } + if (lrNodeInfoFiles.size > 0) { + addProtocolObjects( + new ProtocolLRNodeListFile({ + nodeIds: [...lrNodeInfoExists], + fileVersion: target.controller.protocolVersion, + }).serialize(), + ); + addProtocolObjects( + ...[...lrNodeInfoFiles.values()].map((f) => f.serialize()), + ); + } + return { applicationObjects, protocolObjects, @@ -1526,6 +1648,7 @@ export function migrateNVM(sourceNVM: Buffer, targetNVM: Buffer): Buffer { } else if (source.type === 500 && target.type === 700) { // We need to upgrade the source to 700 series const json: Required = { + lrNodes: {}, ...json500To700(source.json, true), meta: target.json.meta, }; diff --git a/packages/nvmedit/src/files/NodeInfoFiles.ts b/packages/nvmedit/src/files/NodeInfoFiles.ts index 5d33755878f6..7d79b8da5f94 100644 --- a/packages/nvmedit/src/files/NodeInfoFiles.ts +++ b/packages/nvmedit/src/files/NodeInfoFiles.ts @@ -1,7 +1,11 @@ import { + type DataRate, + type FLiRS, MAX_NODES, + MAX_NODES_LR, NUM_NODEMASK_BYTES, type NodeProtocolInfo, + NodeType, encodeBitMask, encodeNodeProtocolInfo, parseBitMask, @@ -18,7 +22,9 @@ import { } from "./NVMFile"; export const NODEINFOS_PER_FILE_V1 = 4; +export const LR_NODEINFOS_PER_FILE_V5 = 50; const NODEINFO_SIZE = 1 + 5 + NUM_NODEMASK_BYTES; +const LR_NODEINFO_SIZE = 3; const EMPTY_NODEINFO_FILL = 0xff; const emptyNodeInfo = Buffer.alloc(NODEINFO_SIZE, EMPTY_NODEINFO_FILL); @@ -60,7 +66,7 @@ function parseNodeInfo( } function encodeNodeInfo(nodeInfo: NodeInfo): Buffer { - const ret = Buffer.alloc(1 + 5 + NUM_NODEMASK_BYTES); + const ret = Buffer.alloc(NODEINFO_SIZE); const hasSpecificDeviceClass = nodeInfo.specificDeviceClass != null; const protocolInfo: NodeProtocolInfo = { @@ -87,6 +93,96 @@ function encodeNodeInfo(nodeInfo: NodeInfo): Buffer { return ret; } +export interface LRNodeInfo + extends Omit +{ + nodeId: number; + genericDeviceClass: number; + specificDeviceClass?: number | null; +} + +function parseLRNodeInfo( + nodeId: number, + buffer: Buffer, + offset: number, +): LRNodeInfo { + // The node info in LR NVM files is packed: + // Byte 0 CAPABILITY: + // Bit 0: Routing (?) + // Bit 1: Listening + // Bit 2: has specific device class (?) + // Bit 3: Beam capability + // Bit 4: Optional functionality + // Bits 5-6: FLiRS + // Bit 7: Unused (?) + // Byte 1: Generic device class + // Byte 2: Specific device class + + // Protocol version is always 3 + // Security is always true + // Supported speed is always 100kbps (speed = 0, speed ext = 2) + // Never: routing end node, controller + + const capability = buffer[offset]; + const isRouting = !!(capability & 0b0000_0001); // ZWLR Mesh?? + const isListening = !!(capability & 0b0000_0010); + const hasSpecificDeviceClass = !!(capability & 0b0000_0100); + const supportsBeaming = !!(capability & 0b0000_1000); + const optionalFunctionality = !!(capability & 0b0001_0000); + let isFrequentListening: FLiRS; + switch (capability & 0b0110_0000) { + case 0b0100_0000: + isFrequentListening = "1000ms"; + break; + case 0b0010_0000: + isFrequentListening = "250ms"; + break; + default: + isFrequentListening = false; + } + const nodeType = NodeType["End Node"]; + const supportsSecurity = true; + const protocolVersion = 3; + const supportedDataRates: DataRate[] = [100000]; + + return { + nodeId, + isRouting, + isListening, + supportsBeaming, + isFrequentListening, + optionalFunctionality, + nodeType, + supportsSecurity, + protocolVersion, + supportedDataRates, + genericDeviceClass: buffer[offset + 1], + specificDeviceClass: hasSpecificDeviceClass ? buffer[offset + 2] : null, + }; +} + +function encodeLRNodeInfo(nodeInfo: LRNodeInfo): Buffer { + const ret = Buffer.alloc(LR_NODEINFO_SIZE); + + let capability = 0; + if (nodeInfo.isRouting) capability |= 0b0000_0001; + if (nodeInfo.isListening) capability |= 0b0000_0010; + if (nodeInfo.specificDeviceClass != null) capability |= 0b0000_0100; + if (nodeInfo.supportsBeaming) capability |= 0b0000_1000; + if (nodeInfo.optionalFunctionality) capability |= 0b0001_0000; + if (nodeInfo.isFrequentListening === "1000ms") { + capability |= 0b0100_0000; + } else if (nodeInfo.isFrequentListening === "250ms") { + capability |= 0b0010_0000; + } + + ret[0] = capability; + ret[1] = nodeInfo.genericDeviceClass; + ret[2] = nodeInfo.specificDeviceClass ?? 0; + + return ret; +} + export interface NodeInfoFileV0Options extends NVMFileCreationOptions { nodeInfo: NodeInfo; } @@ -160,11 +256,18 @@ export class NodeInfoFileV1 extends NVMFile { * NODEINFOS_PER_FILE_V1 + 1 + i; - const offset = i * 35; - const entry = this.payload.subarray(offset, offset + 35); + const offset = i * NODEINFO_SIZE; + const entry = this.payload.subarray( + offset, + offset + NODEINFO_SIZE, + ); if (entry.equals(emptyNodeInfo)) continue; - const nodeInfo = parseNodeInfo(nodeId, this.payload, i * 35); + const nodeInfo = parseNodeInfo( + nodeId, + entry, + 0, + ); this.nodeInfos.push(nodeInfo); } } else { @@ -206,3 +309,88 @@ export class NodeInfoFileV1 extends NVMFile { }; } } + +export interface LRNodeInfoFileV5Options extends NVMFileCreationOptions { + nodeInfos: LRNodeInfo[]; +} + +export const LRNodeInfoFileV5IDBase = 0x50800; +export function nodeIdToLRNodeInfoFileIDV5(nodeId: number): number { + return ( + LRNodeInfoFileV5IDBase + + Math.floor((nodeId - 256) / LR_NODEINFOS_PER_FILE_V5) + ); +} + +// Counting starts with 5, because we only implemented this after reaching protocol file format 5 +@nvmFileID( + (id) => + id >= LRNodeInfoFileV5IDBase + && id + < LRNodeInfoFileV5IDBase + MAX_NODES_LR / LR_NODEINFOS_PER_FILE_V5, +) +export class LRNodeInfoFileV5 extends NVMFile { + public constructor( + options: NVMFileDeserializationOptions | LRNodeInfoFileV5Options, + ) { + super(options); + if (gotDeserializationOptions(options)) { + this.nodeInfos = []; + for (let i = 0; i < LR_NODEINFOS_PER_FILE_V5; i++) { + const nodeId = (this.fileId - LRNodeInfoFileV5IDBase) + * LR_NODEINFOS_PER_FILE_V5 + + 256 + + i; + const offset = i * LR_NODEINFO_SIZE; + const entry = this.payload.subarray( + offset, + offset + LR_NODEINFO_SIZE, + ); + if (entry.equals(emptyNodeInfo)) continue; + + const nodeInfo = parseLRNodeInfo( + nodeId, + entry, + 0, + ); + this.nodeInfos.push(nodeInfo); + } + } else { + this.nodeInfos = options.nodeInfos; + } + } + + public nodeInfos: LRNodeInfo[]; + + public serialize(): NVM3Object { + // The infos must be sorted by node ID + this.nodeInfos.sort((a, b) => a.nodeId - b.nodeId); + const minNodeId = this.nodeInfos[0].nodeId; + this.fileId = nodeIdToLRNodeInfoFileIDV5(minNodeId); + + this.payload = Buffer.alloc( + LR_NODEINFO_SIZE * LR_NODEINFOS_PER_FILE_V5, + EMPTY_NODEINFO_FILL, + ); + + const minFileNodeId = + Math.floor((minNodeId - 256) / LR_NODEINFOS_PER_FILE_V5) + * LR_NODEINFOS_PER_FILE_V5 + + 256; + + for (const nodeInfo of this.nodeInfos) { + const offset = (nodeInfo.nodeId - minFileNodeId) * LR_NODEINFO_SIZE; + encodeLRNodeInfo(nodeInfo).copy(this.payload, offset); + } + + return super.serialize(); + } + + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + public toJSON() { + return { + ...super.toJSON(), + "node infos": this.nodeInfos, + }; + } +} diff --git a/packages/zwave-js/src/lib/controller/Controller.ts b/packages/zwave-js/src/lib/controller/Controller.ts index 54151c3e69ce..f7d10071425c 100644 --- a/packages/zwave-js/src/lib/controller/Controller.ts +++ b/packages/zwave-js/src/lib/controller/Controller.ts @@ -1734,8 +1734,6 @@ export class ZWaveController /** * Gets the list of long range nodes from the controller. - * Warning: This only works when followed up by a hard-reset, so don't call this directly - * @internal */ public async getLongRangeNodes(): Promise { const nodeIds: number[] = [];