mirror of
https://github.com/koush/scrypted.git
synced 2026-03-03 01:32:09 +00:00
36 lines
1.8 KiB
TypeScript
36 lines
1.8 KiB
TypeScript
import { EntrySensor } from "@scrypted/sdk";
|
|
import { ValueID } from "@zwave-js/core";
|
|
import { ZWaveNode, ZWaveNodeValueUpdatedArgs } from "zwave-js";
|
|
import { Notification } from "./Notification";
|
|
import { containsAny, ZwaveDeviceBase } from "./ZwaveDeviceBase";
|
|
|
|
const doorStates = ['Door state', 'Door handle state'];
|
|
|
|
export class EntrySensorToAccessControl extends Notification implements EntrySensor {
|
|
static getInterfaces(node: ZWaveNode, valueId: ValueID): string[] {
|
|
if (Notification.checkInterface(node, valueId, 'Window/door is open', 'Window/door is closed') ||
|
|
Notification.checkInterface(node, valueId, 'Window/door handle is open', 'Window/door handle is closed')) {
|
|
return ['EntrySensor'];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static onValueChanged(zwaveDevice: ZwaveDeviceBase, valueId: ZWaveNodeValueUpdatedArgs) {
|
|
// schlage locks send notifications of lock change events, but does not change the actual lock command class value.
|
|
// so force a refresh.
|
|
if (containsAny(valueId.propertyKey as string, 'lock operation', 'unlock operation', 'locked operation', 'Lock jammed', 'invalid user code')) {
|
|
zwaveDevice.log.i('Notifcation of lock state change, refreshing.');
|
|
zwaveDevice.transientState.lockJammed = valueId.propertyKey === 'Lock jammed';
|
|
// we ignore Refresh calls that are non user initiated, so this must be marked as such.
|
|
zwaveDevice.refresh('Lock', true);
|
|
return;
|
|
}
|
|
|
|
if (doorStates.includes(valueId.propertyKey as string)) {
|
|
const notification = Notification.lookupNotification(zwaveDevice, 'Access Control');
|
|
const event = notification.lookupValue(valueId.newValue as number);
|
|
zwaveDevice.entryOpen = containsAny(event?.label, 'is open');
|
|
}
|
|
}
|
|
}
|