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