From a8c5b1b9e6d39041f66b1fb884b18a1f76e6db50 Mon Sep 17 00:00:00 2001 From: Serge Wagener Date: Wed, 9 Feb 2022 20:21:42 +0100 Subject: [PATCH] Added ContactSensor --- src/Accessories/ContactSensor.ts | 66 ++++++++++++++++++++++++++++++++ src/platform.ts | 6 +++ 2 files changed, 72 insertions(+) create mode 100644 src/Accessories/ContactSensor.ts diff --git a/src/Accessories/ContactSensor.ts b/src/Accessories/ContactSensor.ts new file mode 100644 index 0000000..71ab1c8 --- /dev/null +++ b/src/Accessories/ContactSensor.ts @@ -0,0 +1,66 @@ +import { + AccessoryPlugin, + CharacteristicValue, + Service, + Nullable, +} from 'homebridge'; + +import { SmartHomeNGPlatform } from '../platform'; + +export class ContactSensor implements AccessoryPlugin { + private readonly deviceService: Service; + private readonly informationService: Service; + + public name: string; + private contactState = this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; + + constructor(private readonly platform: SmartHomeNGPlatform, private readonly accessory) { + this.name = accessory.name; + this.deviceService = new this.platform.Service.ContactSensor(accessory.name); + + // create handlers for required characteristics + this.deviceService.getCharacteristic(this.platform.Characteristic.MotionDetected) + .onGet(this.handleContactSensorStateGet.bind(this)); + + this.informationService = + new this.platform.Service.AccessoryInformation() + .setCharacteristic(this.platform.Characteristic.Manufacturer, accessory.manufacturer) + .setCharacteristic(this.platform.Characteristic.Model, accessory.model) + .setCharacteristic(this.platform.Characteristic.SerialNumber, accessory.contactstate); + + this.platform.shng.addMonitor(accessory.contactstate, this.shngCallback.bind(this)); + this.platform.log.info('ContactSensor', accessory.name, 'created!'); + } + + identify(): void { + this.platform.log.info('Identify!'); + } + + getServices(): Service[] { + return [this.informationService, this.deviceService]; + } + + handleContactSensorStateGet(): Nullable { + this.platform.log.debug( + 'handleContactSensorStateGet:', + this.accessory.name, '=', + this.contactState === this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED ? 'True' : 'False', + ); + return this.contactState; + } + + shngCallback(value: unknown): void { + this.platform.log.debug('shngCallback:', this.accessory.name, '=', value, '(' + typeof value + ')'); + if (typeof value === 'boolean') { + if (value) { + this.contactState = this.platform.Characteristic.ContactSensorState.CONTACT_DETECTED; + } else { + this.contactState = this.platform.Characteristic.ContactSensorState.CONTACT_NOT_DETECTED; + } + } else { + this.platform.log.warn('Unknown type', typeof value, 'received for', this.accessory.name + ':', value); + } + this.deviceService.updateCharacteristic(this.platform.Characteristic.ContactSensorState, this.contactState); + } +} + diff --git a/src/platform.ts b/src/platform.ts index 7f0c48e..ce8721a 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -18,6 +18,7 @@ import { Lightbulb } from './Accessories/Lightbulb'; import { TemperatureSensor } from './Accessories/TemperatureSensor'; import { Thermostat } from './Accessories/Thermostat'; import { WindowCovering } from './Accessories/WindowCovering'; +import { ContactSensor } from './Accessories/ContactSensor'; function uncapitalizeKeys(obj): Record { function isObject(o: unknown): boolean { @@ -89,6 +90,11 @@ export class SmartHomeNGPlatform implements StaticPlatformPlugin { devices.push(new MotionSensor(this, accessory)); break; + // Contact sensor + case 'contactsensor': + devices.push(new ContactSensor(this, accessory)); + break; + // Switch case 'switch': devices.push(new Switch(this, accessory));