@pmouli/isy-matter-server
Version:
Service to expose an ISY device as a Matter Border router
110 lines • 4.77 kB
JavaScript
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