UNPKG

@pmouli/isy-matter-server

Version:

Service to expose an ISY device as a Matter Border router

90 lines 4.08 kB
import { camelize, EventEmitter, Observable } from '@matter/main'; import { Behavior } from '@matter/node'; import { ISY } from 'isy-nodejs/ISY'; import { ISYDevice } from 'isy-nodejs/ISYDevice'; import winston from 'winston'; import { MappingRegistry } from '../Mappings/MappingRegistry.js'; export class ISYBridgedDeviceBehavior extends Behavior { static id = 'isyNode'; static early = true; listeners = []; async initialize(_options) { await super.initialize(_options); var address = this.state.address; const cd = ISY.instance.getDevice(this.state.address); this.internal.device = cd; //@ts-ignore this.internal.map = MappingRegistry.getMapping(this.internal.device); this.logger.debug(`Initializing ${this.constructor.name} for ${this.internal.device.constructor.name} ${this.internal.device.name} with address ${address}`); if (ISYDevice.isComposite(cd)) { for (const m in cd.nodes) { const d = cd.nodes[m]; for (const f in d.drivers) { let evt = `${d.drivers[f].name}Changed`; const obs = Observable(); const listener = (driver, newValue, oldValue, formattedValue) => obs.emit({ node: m, driver: driver, newValue, oldValue, formattedValue }); d.events.on(evt, listener); this.events[`${m}.${evt}`] = obs; //@ts-ignore //d.events.on(evt, (driver: string, newValue: any, oldValue: any, formattedValue: string) => this.events.emit(evt, { driver, newValue, oldValue, formattedValue } as unknown as any)); } } } else if (ISYDevice.isNode(cd)) { const d = cd; for (const f in d.drivers) { let evt = `${d.drivers[f].name}Changed`; const obs = Observable(); d.events.on(evt, (driver, newValue, oldValue, formattedValue) => obs.emit({ driver, newValue, oldValue, formattedValue })); this.events[evt] = obs; //@ts-ignore //d.events.on(evt, (driver: string, newValue: any, oldValue: any, formattedValue: string) => this.events.emit(evt, { driver, newValue, oldValue, formattedValue } as unknown as any)); } } this.logger.debug(`Initialized ${this.constructor.name} for ${this.internal.device.constructor.name} ${this.internal.device.name} with address ${address}`); } get logger() { if (!this.internal.logger) { let l = winston.loggers.get('matter').child({ address: this.device.address, name: this.device.label }); const label = `${this.device.label} (${this.device.address})`; l.format = winston.format.label({ label: label }); this.internal.logger = l; } return this.internal.logger; } get device() { return this.internal.device; } get map() { return (this.internal.map ??= MappingRegistry.getMapping(this.device)); } mapForBehavior(behavior) { // @ts-ignore return this.map.mapping[camelize(behavior.cluster.name, false)]; } handlePropertyChange(driver, newValue, oldValue, formattedValue) { this.events.propertyChanged.emit({ driver, newValue, oldValue, formattedValue }); } [Symbol.asyncDispose]() { this.internal.device = null; //(this.internal.device.events as EventEmitter).removeAllListeners return super[Symbol.asyncDispose](); } } (function (ISYBridgedDeviceBehavior) { class Internal { device; map; logger; } ISYBridgedDeviceBehavior.Internal = Internal; class Events extends EventEmitter { propertyChanged = Observable(); } ISYBridgedDeviceBehavior.Events = Events; class State { address = ''; } ISYBridgedDeviceBehavior.State = State; })(ISYBridgedDeviceBehavior || (ISYBridgedDeviceBehavior = {})); //# sourceMappingURL=ISYBridgedDeviceBehavior.js.map