diff --git a/README.md b/README.md index 28a275c..8ba0b15 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,20 @@ You need to adapt your `config.json` ! ## Currently supported accessories This plugin currently supports the following services (and characteristics): -| Type | Description | -|:----------------------------------------|:--------------------------------------------------------| -| ContactSensor | Simple contact sensor, for example for windows | -| [Doorbell](#doorbell) | Doorbell, sends message to devices on ring | -| [Fan](#fan) | Simple on/off fan, may be extended in future | -| [Lightbulb](#lightbulb) | Everything, from simple light to dimmable, RGB and RGBW | -| [MotionSensor](#motionsensor) | Detects and reports motion | -| [OccupancySensor](#occupancysensor) | Detects presence in a room | -| [Outlet](#outlet) | Simple on/off wall outlet | -| [TemperatureSensor](#temperaturesensor) | Temperature sensor | -| [Thermostat](#thermostat) | Thermostat with temperature sensor and heating state | -| [Switch](#switch) | Simple on/off switch | -| [WindowCovering](#windowcovering) | Window covering (shutters, blinds, ...) | +| Type | Description | +|:-----------------------------------------|:--------------------------------------------------------| +| [ContactSensor](#contact-sensor) | Simple contact sensor, for example for windows | +| [Doorbell](#doorbell) | Doorbell, sends message to devices on ring | +| [Fan](#fan) | Simple on/off fan, may be extended in future | +| [Lightbulb](#lightbulb) | Everything, from simple light to dimmable, RGB and RGBW | +| [MotionSensor](#motion-sensor) | Detects and reports motion | +| [OccupancySensor](#occupancy-sensor) | Detects presence in a room | +| [Outlet](#outlet) | Simple on/off wall outlet | +| [SecuritySystem](#security-system) | Intrusion alarm system | +| [Switch](#switch) | Simple on/off switch | +| [TemperatureSensor](#temperature-sensor) | Temperature sensor | +| [Thermostat](#thermostat) | Thermostat with temperature sensor and heating state | +| [WindowCovering](#window-covering) | Window covering (shutters, blinds, ...) | Other accessories are being worked on and will be added as soon as ready. @@ -271,6 +272,39 @@ This accessory can monitor and change the on/off state of a wall outlet. The out } ``` +### Security system +This accessory can pilote your intrusion security system. That system can be a physical one operated via SHNG, or a SHNG native logic. + +#### Characteristics in addition to [common characteristics](#common-accessories-characteristics) +| Parameter | Possible values | Mandatory | Description | +|:-------------|:----------------|:----------|:-------------------------------------------------| +| CurrentState | \ | Yes | SHNG item to monitor for the current alarm state | +| TargetState | \ | Yes | SHNG item to set or get the target state | + +#### Additional comments +Valid values for 'CurrentState': +* STAY_ARM = 0 +* AWAY_ARM = 1 +* NIGHT_ARM = 2 +* DISARMED = 3 +* ALARM_TRIGGERED = 4 + +Valid values for 'TargetState': +* STAY_ARM = 0 +* AWAY_ARM = 1 +* NIGHT_ARM = 2 +* DISARMED = 3 + +#### Example: +```json +{ + "type": "SecuritySystem", + "name": "Intrusion alarm", + "currentState": "Technik.Alarmanlage.Status.Ist", + "targetState": "Technik.Alarmanlage.Status.Soll" +} +``` + ### Temperature sensor This sensor show the actual temperature. @@ -313,7 +347,7 @@ CurrentHeatingCoolingState = 0 for OFF, 1 for HEAT and 2 for COOL } ``` -### WindowCovering +### Window covering This accessory type can be used for shutters or blinds. Because the differnce between HomeKit and the controlling technology, for example KNX, can be significant this accessory has a lot of parameters. Luckily most are optional. #### Characteristics in addition to [common characteristics](#common-accessories-characteristics) diff --git a/package.json b/package.json index 88dc63c..553f270 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "private": false, "displayName": "SmartHomeNG", "name": "homebridge-smarthomeng", - "version": "2.0.1", + "version": "2.0.2", "description": "A short description about what your plugin does.", "license": "Apache-2.0", "repository": { diff --git a/src/Accessories/SecuritySystem.ts b/src/Accessories/SecuritySystem.ts new file mode 100644 index 0000000..e397b83 --- /dev/null +++ b/src/Accessories/SecuritySystem.ts @@ -0,0 +1,94 @@ +import { + AccessoryPlugin, + CharacteristicValue, + Service, + Nullable, +} from 'homebridge'; + +import { SmartHomeNGPlatform } from '../platform'; + +export class SecuritySystem implements AccessoryPlugin { + private readonly deviceService: Service; + private readonly informationService: Service; + + public name: string; + private currentState = this.platform.Characteristic.SecuritySystemCurrentState.DISARMED; + private targetState = this.platform.Characteristic.SecuritySystemTargetState.DISARM; + + constructor(private readonly platform: SmartHomeNGPlatform, private readonly accessory) { + this.name = accessory.name; + this.deviceService = new this.platform.Service.SecuritySystem(accessory.name); + + + // create handlers for required characteristics + this.deviceService.getCharacteristic(this.platform.Characteristic.SecuritySystemCurrentState) + .onGet(this.handleSecuritySystemCurrentStateGet.bind(this)); + + this.deviceService.getCharacteristic(this.platform.Characteristic.SecuritySystemTargetState) + .onGet(this.handleSecuritySystemTargetStateGet.bind(this)) + .onSet(this.handleSecuritySystemTargetStateSet.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.currentstate); + + this.platform.shng.addMonitor(accessory.currentstate, this.shngCurrentStateCallback.bind(this)); + this.platform.shng.addMonitor(accessory.targetState, this.shngTargetStateCallback.bind(this)); + this.platform.log.info('SecuritySystem', accessory.name, 'created!'); + } + + identify(): void { + this.platform.log.info('Identify!'); + } + + getServices(): Service[] { + return [this.informationService, this.deviceService]; + } + + handleSecuritySystemCurrentStateGet(): Nullable { + this.platform.log.info( + 'handleSecuritySystemCurrentStateGet:', + this.accessory.name, '=', + this.currentState, + ); + return this.currentState; + } + + handleSecuritySystemTargetStateGet(): Nullable { + this.platform.log.info( + 'handleSecuritySystemTargetStateGet:', this.accessory.name, + 'is currently', this.targetState, + ); + return this.targetState; + } + + handleSecuritySystemTargetStateSet(value: CharacteristicValue) { + this.targetState = value as number; + this.platform.log.info('handleSecuritySystemTargetStateSet:', this.accessory.name, 'was set to', this.targetState); + this.platform.shng.setItem(this.accessory.targetstate, this.targetState); + } + + shngCurrentStateCallback(value: unknown): void { + this.platform.log.debug('shngCurrentStateCallback:', this.accessory.name, '=', value, '(' + typeof value + ')'); + if (typeof value === 'number') { + this.currentState = value; + this.deviceService.updateCharacteristic(this.platform.Characteristic.SecuritySystemCurrentState, this.currentState); + } else { + this.platform.log.warn('Unknown type ', typeof value, 'received for', this.accessory.name + ':', value); + } + } + + shngTargetStateCallback(value: unknown): void { + this.platform.log.debug('shngTargetStateCallback:', this.accessory.name, '=', value, '(' + typeof value + ')'); + if (typeof value === 'number') { + this.targetState = value; + this.deviceService.updateCharacteristic(this.platform.Characteristic.SecuritySystemTargetState, this.targetState); + } else { + this.platform.log.warn('Unknown type ', typeof value, 'received for', this.accessory.name + ':', value); + } + } + +} + diff --git a/src/platform.ts b/src/platform.ts index 867d87a..a290853 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -9,8 +9,6 @@ import { } from 'homebridge'; import { SmartHomeNG } from './SmartHomeNG'; -import { OccupancySensor } from './Accessories/OccupancySensor'; -import { MotionSensor } from './Accessories/MotionSensor'; import { Switch } from './Accessories/Switch'; import { Outlet } from './Accessories/Outlet'; import { Fan } from './Accessories/Fan'; @@ -20,6 +18,9 @@ import { Thermostat } from './Accessories/Thermostat'; import { WindowCovering } from './Accessories/WindowCovering'; import { ContactSensor } from './Accessories/ContactSensor'; import { Doorbell } from './Accessories/Doorbell'; +import { SecuritySystem } from './Accessories/SecuritySystem'; +import { OccupancySensor } from './Accessories/OccupancySensor'; +import { MotionSensor } from './Accessories/MotionSensor'; function uncapitalizeKeys(obj): Record { function isObject(o: unknown): boolean { @@ -105,6 +106,11 @@ export class SmartHomeNGPlatform implements StaticPlatformPlugin { devices.push(new Doorbell(this, accessory)); break; + // Doorbell + case 'securitysystem': + devices.push(new SecuritySystem(this, accessory)); + break; + // Switch case 'switch': devices.push(new Switch(this, accessory));