@pmouli/isy-matter-server
Version:
Service to expose an ISY device as a Matter Border router
269 lines (260 loc) • 11.7 kB
JavaScript
import { isDynamic, ISY } from '../ISY.js';
import { ISYDevice } from '../ISYDevice.js';
import { ISYNode } from '../ISYNode.js';
export var CompositeDevice;
(function (CompositeDevice) {
function of(nodes, keyFunction) {
if (keyFunction === undefined) {
keyFunction = (node) => [node.name, true];
}
if (typeof keyFunction === 'function') {
return CompositeOf(nodes, keyFunction);
}
else if (typeof keyFunction === 'object') {
const keyIndex = keyFunction;
return CompositeOf(nodes, (node) => {
for (const key in keyIndex) {
if (node instanceof ISYNode) {
}
else if (isDynamic(node) && node.nodeTypeId == `${keyIndex[key]}`) {
return [key, node.pnode == node.address];
}
if (node.address.endsWith(keyIndex[key].toString())) {
return [key, keyIndex[key] == 1 || keyIndex[key] == '1'];
}
}
});
}
}
CompositeDevice.of = of;
function isComposite(device) {
return 'addNode' in device;
}
CompositeDevice.isComposite = isComposite;
//@ts-ignore
})(CompositeDevice || (CompositeDevice = {}));
export function CompositeOf(nodes, keyFunction) {
return class {
isy;
/*public static async create(...args: any[]): Promise<CompositeDevice<F, N>> {
const d = new class(args) as any as CompositeDevice<F, N>;
let isy = d.isy;
for (const n in d.nodes) {
const node = d.nodes[n] as ISYNode;
if ('getNodeDef' in node && typeof node.getNodeDef == 'function' && 'applyNodeDef' in node && typeof node.applyNodeDef == 'function') {
}
}
return d;
}*/
constructor(...args) {
if (args[0] instanceof ISY) {
this.isy = args.shift();
for (const nodeInfo of args) {
this.addNode(nodeInfo, this.isy);
}
}
}
category;
deviceClass;
enabled;
family;
hidden;
isDimmable;
label;
model;
modelNumber;
name;
parentAddress;
productName;
scenes;
subCategory;
type;
typeCode;
version;
manufacturer;
productId;
modelName;
location;
features;
async query() {
for (const n in this.nodes) {
let node = this.nodes[n];
if (ISYDevice.isQueryable(node)) {
await node.query();
}
}
}
async refreshState() {
for (const n in this.nodes) {
let node = this.nodes[n];
await node.refreshState();
}
}
async applyNodeDefs() {
for (const n in this.nodes) {
let node = this.nodes[n];
if (ISYDevice.isDynamic(node)) {
await node.applyNodeDef();
}
}
}
_initialized = false;
get initialized() {
if (!this._initialized)
for (const key in this.nodes) {
if (!this.nodes[key]?.initialized) {
return false;
}
}
this._initialized = true;
return true;
}
address;
events = {};
drivers = {};
commands = {};
nodes = {};
async refreshNotes() {
for (const key in this.nodes) {
await this.nodes[key].refreshNotes();
}
return Promise.resolve();
}
root = null;
async addNode(node, isy = this.isy) {
let n = null;
if (node instanceof ISYNode) {
n = node;
}
else {
n = await nodes[keyFunction(node)[0]].create(isy, node);
}
const keyL = keyFunction(node);
const key = keyL[0];
const isRoot = keyL[1];
this.nodes[key] = n;
//@ts-ignore
this[key] = n;
Object.defineProperty(this.events, key, {
get() {
return this[key].events;
}
});
Object.defineProperty(this.drivers, key, {
get() {
return this[key].drivers;
}
});
Object.defineProperty(this.commands, key, {
get() {
return this[key].commands;
}
});
if (isRoot) {
this.address = node.address;
this.family = n.family;
this.category = n.category;
this.deviceClass = n.deviceClass;
this.enabled = n.enabled;
this.hidden = n.hidden;
this.isDimmable = n.isDimmable;
this.label = n.label;
this.model = n.model;
this.modelNumber = n.modelNumber;
this.name = n.name;
this.parentAddress = n.parentAddress;
this.productName = n.productName;
this.scenes = n.scenes;
this.subCategory = n.subCategory;
this.type = n.type;
this.typeCode = n.typeCode;
this.version = n.version;
this.manufacturer = n.manufacturer;
this.productId = n.productId;
this.modelName = n.modelName;
this.manufacturer = n.manufacturer;
this.location = n.location;
this.root = n;
}
}
};
}
/*
export class ISYMultiNodeDevice<T extends Family, N extends NodeList>
implements ISYDevice<T, ISYNode.DriverMap<N>, ISYNode.CommandMap<N>, string> {
commands: UnionToIntersection<{ [x in keyof N]: ISYNode.CommandsOf<N[x]>; } extends Record<string, unknown> ? keyof N extends string ? { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N] extends Record<string, unknown> ? keyof { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N] extends string ? { [x in `${string & keyof N}.${string & keyof { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N]}`]: { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N][x extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? any : B : B : B : B : B : B : B : B : B : B : x]; } : never : never : never : never>;
readProperty(propertyName: keyof UnionToIntersection<{ [x in keyof N]: ISYNode.DriversOf<N[x]>; } extends Record<string, unknown> ? keyof N extends string ? { [x in keyof N]: ISYNode.DriversOf<N[x]>; }[string & keyof N] extends Record<string, unknown> ? keyof { [x in keyof N]: ISYNode.DriversOf<N[x]>; }[string & keyof N] extends string ? { [x in `${string & keyof N}.${string & keyof { [x in keyof N]: ISYNode.DriversOf<N[x]>; }[string & keyof N]}`]: { [x in keyof N]: ISYNode.DriversOf<N[x]>; }[string & keyof N][x extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? any : B : B : B : B : B : B : B : B : B : B : x]; } : never : never : never : never>): Promise<DriverState> {
throw new Error('Method not implemented.');
}
sendCommand(command: Extract<keyof UnionToIntersection<{ [x in keyof N]: ISYNode.CommandsOf<N[x]>; } extends Record<string, unknown> ? keyof N extends string ? { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N] extends Record<string, unknown> ? keyof { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N] extends string ? { [x in `${string & keyof N}.${string & keyof { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N]}`]: { [x in keyof N]: ISYNode.CommandsOf<N[x]>; }[string & keyof N][x extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? B extends `${infer A}.${infer B}` ? any : B : B : B : B : B : B : B : B : B : B : x]; } : never : never : never : never>, string>, parameters?: Record<string | symbol, string | number> | string | number): Promise<any> {
throw new Error('Method not implemented.');
}
updateProperty(propertyName: keyof ISYNode.DriverMap<N>, value: string): Promise<any> {
throw new Error('Method not implemented.');
}
handleControlTrigger(controlName: string): boolean {
throw new Error('Method not implemented.');
}
_parentDevice: ISYDevice<T, any, any, any>;
children: ISYNode<any, any, any, any>[];
convertTo(value: any, uom: number);
convertTo(value: any, uom: number, propertyName: keyof DriverMap<N>);
convertTo(value: unknown, uom: unknown, propertyName?: unknown): any {
throw new Error('Method not implemented.');
}
convertFrom(value: any, uom: number);
convertFrom(value: any, uom: number, propertyName: keyof DriverMap<N>);
convertFrom(value: unknown, uom: unknown, propertyName?: unknown): any {
throw new Error('Method not implemented.');
}
addLink(isyScene: ISYScene): void {
throw new Error('Method not implemented.');
}
addChild(childDevice: ISYNode<any, any, any, any>): void {
throw new Error('Method not implemented.');
}
readProperties(): Promise<DriverState[]> {
throw new Error('Method not implemented.');
}
refresh(): Promise<any> {
throw new Error('Method not implemented.');
}
refreshNotes(): Promise<void> {
throw new Error('Method not implemented.');
}
parseResult(node: { property: DriverState | DriverState[]; }): void {
throw new Error('Method not implemented.');
}
handlePropertyChange(propertyName: keyof ISYNode.DriverMap<N> & string, value: any, uom: UnitOfMeasure, prec: number, formattedValue: string): boolean {
throw new Error('Method not implemented.');
}
logger(arg0: string): unknown {
throw new Error('Method not implemented.');
}
handleEvent(evt: any): unknown {
throw new Error('Method not implemented.');
}
on(arg0: string, arg1: any): unknown {
throw new Error('Method not implemented.');
}
name: any;
drivers: Driver.ForAll<ISYNode.DriverMap<N>>;
address: string;
family: T;
typeCode: string;
deviceClass: any;
parentAddress: any;
category: number;
subCategory: number;
type: any;
scenes: ISYScene[];
hidden: boolean;
enabled: boolean;
productName: string;
model: string;
modelNumber: string;
version: string;
isDimmable: boolean;
label: string;
} */
//# sourceMappingURL=CompositeDevice.js.map