UNPKG

@pmouli/isy-matter-server

Version:

Service to expose an ISY device as a Matter Border router

110 lines 4.77 kB
import { Family } from '../Definitions/index.js'; import { ISY, writeDebugFile } from '../ISY.js'; import { ISYNode } from '../ISYNode.js'; import { isDynamic, isZWave } from '../Model/NodeInfo.js'; export var NodeFactory; (function (NodeFactory) { NodeFactory.registry = {}; NodeFactory.implementsRegistry = {}; function register(nodeClass, id = nodeClass.nodeDefId) { //let s; //FamilyNodeClassRegistry<(typeof Family)[F]>; let f = Family[nodeClass.family]; let s = (NodeFactory.registry[f] ?? (NodeFactory.registry[f] = {})); s[id] = nodeClass; if (!NodeFactory.implementsRegistry[f]) { NodeFactory.implementsRegistry[f] = {}; } NodeFactory.implementsRegistry[f][id] = nodeClass.implements; } NodeFactory.register = register; function compare(a, b) { if (a.nodeDefId === b.nodeDefId) { return 0; } if (a.implements.includes(b.nodeDefId)) return 1; if (b.implements.includes(a.nodeDefId)) return -1; return b.nodeDefId.localeCompare(a.nodeDefId); } function sortImplementsRegistry() { for (let f in NodeFactory.implementsRegistry) { let reg = NodeFactory.implementsRegistry[f]; for (let e in reg) { reg[e] = reg[e].sort((a, b) => compare(getForNodeDefId(f, a), getForNodeDefId(f, b))); } } } NodeFactory.sortImplementsRegistry = sortImplementsRegistry; function getImplements(node) { if (node instanceof ISYNode) return NodeFactory.implementsRegistry[Family[node.family]][node.nodeDefId] ?? []; else if (typeof node === 'function') return NodeFactory.implementsRegistry[Family[node.family]][node.nodeDefId] ?? []; else return NodeFactory.implementsRegistry[Family[node.Class.family]][node.Class.nodeDefId] ?? []; } NodeFactory.getImplements = getImplements; function getForNode(family, node) { if (isZWave(node)) { return getForNodeDefId(family, node.sgid ?? node.nodeDefId); } else if (isDynamic(node)) { return getForNodeDefId(family, node.nodeTypeId); } return getForNodeDefId(family, node.nodeDefId); } NodeFactory.getForNode = getForNode; function getForNodeDefId(family, nodeDefId) { if (typeof family === 'string') { return NodeFactory.registry[family]?.[nodeDefId]; } else if (typeof family === 'number') { return NodeFactory.registry[Family[family]]?.[nodeDefId]; } } NodeFactory.getForNodeDefId = getForNodeDefId; async function get(node, isy = ISY.instance) { let nodeN = null; let family = Family.Insteon; if (typeof node.family === 'object') family = node.family._; else if (node.family !== undefined && node.family !== null) family = node.family; nodeN = getForNodeDefId(Family[family], node.nodeDefId); if (nodeN) return Promise.resolve(nodeN); let cls = (await import('../Devices/GenericNode.js')).GenericNode; NodeFactory.register(cls, isDynamic(node) || isZWave(node) ? node.nodeTypeId : node.nodeDefId); return cls; } NodeFactory.get = get; async function create(nodeInfo, isy = ISY.instance) { const nodeClass = (await get(nodeInfo)); let nodeInstance = null; if (nodeClass?.name !== 'ISYNode' && nodeClass !== undefined) { nodeInstance = new nodeClass(isy, nodeInfo); } if (isDynamic(nodeInfo) || isZWave(nodeInfo)) { let n = (await isy.sendRequest(`zmatter/${nodeInfo.family == Family.ZWave ? 'zwave' : 'zigbee'}/node/${nodeInfo.address}/def/get?full=true`, { trailingSlash: false })); if (n) { isy.logger.info(`NodeDef for ${nodeInfo.name} with nodeDef ${nodeInfo.nodeDefId} is dynamic. Saving nodeDef for debug purposes.`); if (isy.isDebugEnabled) await writeDebugFile(JSON.stringify(n), `${nodeInfo.address}_NodeDef.json`, isy.logger, isy.storagePath); if (nodeInstance) { try { nodeInstance.applyNodeDef(n); } catch { } } } else { /*ISY.instance.logger.warn(`No built-in class found for ${Family[nodeInfo.family ?? 1]}.${nodeInfo.nodeDefId}`); return new GenericNode(isy, nodeInfo);*/ } } return nodeInstance; } NodeFactory.create = create; })(NodeFactory || (NodeFactory = {})); //# sourceMappingURL=NodeFactory.js.map