UNPKG

@pmouli/isy-matter-server

Version:

Service to expose an ISY device as a Matter Border router

203 lines (174 loc) 5.87 kB
import { timingSafeEqual } from 'crypto'; import { Family } from '../../Definitions/Global/Families.js'; import { ISY } from '../../ISY.js'; import { ISYDeviceNode } from '../ISYDeviceNode.js'; import { ElkAlarmSensorDevice } from './ElkAlarmSensorDevice.js'; ///////////////////////////// // ELKAlarmPanelDevice // export class ELKAlarmPanelDevice extends ISYDeviceNode<Family.Global,any,any> { [x: string]: any; setFromAreaUpdate(nodes: any) { throw new Error('Method not implemented.'); } public alarmTripState: AlarmTripState; public alarmState: AlarmState; public alarmMode: AlarmMode; public area: number; public deviceFriendlyName: string; public deviceType: any; public connectionType: string; public batteryOperated: boolean; public voltage: number; constructor(isy: ISY, area: number) { super(isy, { family: Family.Global, type: '0.0.0.0', enabled: true, address: `ElkAlarmPanel_${area}`, name: `Elk Alarm Panel ${area}`, pnode: undefined, startDelay: 0, hint: '', endDelay: 0, wattage: 0, dcPeriod: 0 }); this.area = area; this.alarmTripState = AlarmTripState.DISARMED; this.alarmState = AlarmState.NOT_READY_TO_ARM; this.alarmMode = AlarmMode.DISARMED; this.deviceFriendlyName = 'Elk Alarm Panel ' + area; this.connectionType = 'Elk Network Module'; this.batteryOperated = false; this.voltage = 71; this .lastChanged = new Date(); } public override async sendCommand(command: string): Promise<any> { return this.isy.sendISYCommand(`elk/area/${this.area}/cmd/${command}`); } public async sendSetAlarmModeCommand(alarmMode: string) { if (alarmMode === 'disarm') { return this.sendCommand('disarm'); } else { return this.sendCommand(`arm?armType=${alarmMode}`); } } public async clearAllBypasses() { return this.sendCommand('unbypass'); } public getAlarmStatusAsText() { return `AM [${this.alarmMode}] AS [${this.alarmState}] ATS [${this.alarmTripState}]`; } public getAlarmTripState() { return this.alarmTripState; } public getAlarmState() { return this.alarmState; } public getAlarmMode() { return this.alarmMode; } public override handleEvent(event: { control?: string; data?: any; node?: any; eventInfo?: any; }) { const areaUpdate = event.eventInfo.ae; const areaId = areaUpdate.attr.area; const updateType = areaUpdate.attr.type; const valueToSet = Number(areaUpdate.attr.val); let valueChanged = false; if (areaId === this.area) { if (updateType === AlarmPanelProperty.AlarmTripState) { if (this.alarmTripState !== valueToSet) { const oldVal = this.alarmTripState; this.alarmTripState = valueToSet; this.emit('propertyChanged', 'alarmTripState', this.alarmTripState, oldVal, AlarmTripState[this.alarmTripState]); valueChanged = true; } } else if (updateType === AlarmPanelProperty.AlarmState) { if (this.alarmState !== valueToSet) { const oldVal = this.alarmState; this.alarmState = valueToSet; this.emit('propertyChanged', 'alarmState', this.alarmState, oldVal, AlarmState[this.alarmState]); valueChanged = true; } } else if (updateType === AlarmPanelProperty.AlarmMode) { if (this.alarmMode !== valueToSet) { const oldVal = this.alarmMode; this.alarmMode = valueToSet; this.emit('propertyChanged', 'alarmMode', this.alarmState, oldVal, AlarmMode[this.alarmMode]); valueChanged = true; } } } if (valueChanged) { this.lastChanged = new Date(); } return valueChanged; } } export enum AlarmPanelProperty { AlarmMode = 3, AlarmState = 2, AlarmTripState = 1 } export enum AlarmMode { DISARMED = 0, AWAY = 1, STAY = 2, STAY_INSTANT = 3, NIGHT = 4, NIGHT_INSTANT = 5, VACATION = 6 } export enum AlarmTripState { DISARMED = 0, EXIT_DELAY = 1, TRIPPED = 2 } export enum AlarmState { NOT_READY_TO_ARM = 0, READY_TO_ARM = 1, READY_TO_ARM_VIOLATION = 2, ARMED_WITH_TIMER = 3, ARMED_FULLY = 4, FORCE_ARMED_VIOLATION = 5, ARMED_WITH_BYPASS = 6 } // Alarm mode constanrs ELKAlarmPanelDevice.prototype.ALARM_MODE_DISARMED = 0; ELKAlarmPanelDevice.prototype.ALARM_MODE_AWAY = 1; ELKAlarmPanelDevice.prototype.ALARM_MODE_STAY = 2; ELKAlarmPanelDevice.prototype.ALARM_MODE_STAY_INSTANT = 3; ELKAlarmPanelDevice.prototype.ALARM_MODE_NIGHT = 4; ELKAlarmPanelDevice.prototype.ALARM_MODE_NIGHT_INSTANT = 5; ELKAlarmPanelDevice.prototype.ALARM_MODE_VACATION = 6; // Alarm trip state ELKAlarmPanelDevice.prototype.ALARM_TRIP_STATE_DISARMED = 0; ELKAlarmPanelDevice.prototype.ALARM_TRIP_STATE_EXIT_DELAY = 1; ELKAlarmPanelDevice.prototype.ALARM_TRIP_STATE_TRIPPED = 2; // Alarm state ELKAlarmPanelDevice.prototype.ALARM_STATE_NOT_READY_TO_ARM = 0; ELKAlarmPanelDevice.prototype.ALARM_STATE_READY_TO_ARM = 1; ELKAlarmPanelDevice.prototype.ALARM_STATE_READY_TO_ARM_VIOLATION = 2; ELKAlarmPanelDevice.prototype.ALARM_STATE_ARMED_WITH_TIMER = 3; ELKAlarmPanelDevice.prototype.ALARM_STATE_ARMED_FULLY = 4; ELKAlarmPanelDevice.prototype.ALARM_STATE_FORCE_ARMED_VIOLATION = 5; ELKAlarmPanelDevice.prototype.ALARM_STATE_ARMED_WITH_BYPASS = 6; // Logical Status for sensors export enum AlarmSensorPhysicalState { NOT_CONFIGURED = 0, OPEN = 1, EOL = 2, SHORT = 3 } ElkAlarmSensorDevice.prototype.SENSOR_STATE_PHYSICAL_NOT_CONFIGURED = 0; ElkAlarmSensorDevice.prototype.SENSOR_STATE_PHYSICAL_OPEN = 1; ElkAlarmSensorDevice.prototype.SENSOR_STATE_PHYSICAL_EOL = 2; ElkAlarmSensorDevice.prototype.SENSOR_STATE_PHYSICAL_SHORT = 3; export enum AlarmSensorLogicalState { NORMAL = 0, TROUBLE = 1, VIOLATED = 2, BYPASSED = 3 } // Physical status for sensors ElkAlarmSensorDevice.prototype.SENSOR_STATE_LOGICAL_NORMAL = 0; ElkAlarmSensorDevice.prototype.SENSOR_STATE_LOGICAL_TROUBLE = 1; ElkAlarmSensorDevice.prototype.SENSOR_STATE_LOGICAL_VIOLATED = 2; ElkAlarmSensorDevice.prototype.SENSOR_STATE_LOGICAL_BYPASSED = 3;