From 1a1ee4b7fe44ead78577ff22d2d13b9133c9737b Mon Sep 17 00:00:00 2001 From: dgreif Date: Fri, 9 Aug 2024 09:17:37 -0400 Subject: [PATCH] Added water valve support (#1451) Closes #1450 Squashed commit of the following: commit 81cfb8a52c1d0ad106ebbcc47d52998f0c9e35c4 Author: dgreif Date: Fri Aug 9 09:15:03 2024 -0400 Update readme commit cd14182ba037988b47963c874959f841bc16bfd3 Author: dgreif Date: Fri Aug 9 09:09:16 2024 -0400 Fix lint commit 49aba72627253519ab01c5da7ddd1e87ecac7ca4 Author: dgreif Date: Fri Aug 9 09:09:00 2024 -0400 Release notes commit 5029d2cb436f955918753b878b773be9f1c57edd Author: Vyacheslav Andreykiv Date: Fri Aug 9 06:02:35 2024 -0700 Added water valve support (#1451) Co-authored-by: Vyacheslav Andreykiv --- .changeset/cold-ducks-act.md | 6 ++++ packages/homebridge-ring/README.md | 2 ++ packages/homebridge-ring/ring-platform.ts | 3 ++ packages/homebridge-ring/valve.ts | 40 +++++++++++++++++++++++ packages/ring-client-api/ring-types.ts | 3 ++ 5 files changed, 54 insertions(+) create mode 100644 .changeset/cold-ducks-act.md create mode 100644 packages/homebridge-ring/valve.ts diff --git a/.changeset/cold-ducks-act.md b/.changeset/cold-ducks-act.md new file mode 100644 index 00000000..79caed1d --- /dev/null +++ b/.changeset/cold-ducks-act.md @@ -0,0 +1,6 @@ +--- +'homebridge-ring': minor +'ring-client-api': minor +--- + +Add support for water valves. Note, these have not been tested extensively so please let us know if you run into issues. diff --git a/packages/homebridge-ring/README.md b/packages/homebridge-ring/README.md index 6a833c02..29f3481f 100644 --- a/packages/homebridge-ring/README.md +++ b/packages/homebridge-ring/README.md @@ -209,6 +209,8 @@ Note: Although homebridge has support for HomeKit Secure Video (HKSV), I will no - Set Thermostat mode to heat/cool/off - Set target temperature - View current temperature and heating/cooling status +- Water Valves (**untested**) + - Open/Close the valve ### Chimes diff --git a/packages/homebridge-ring/ring-platform.ts b/packages/homebridge-ring/ring-platform.ts index d40c24e4..14d8d198 100644 --- a/packages/homebridge-ring/ring-platform.ts +++ b/packages/homebridge-ring/ring-platform.ts @@ -50,6 +50,7 @@ import { Thermostat } from './thermostat' import { UnknownZWaveSwitchSwitch } from './unknown-zwave-switch' import { generateMacAddress } from './util' import { Intercom } from './intercom' +import { Valve } from './valve' const ignoreHiddenDeviceTypes: string[] = [ RingDeviceType.RingNetAdapter, @@ -122,6 +123,8 @@ function getAccessoryClass( return WaterSensor case RingDeviceType.Thermostat: return Thermostat + case RingDeviceType.WaterValve: + return Valve case RingDeviceType.UnknownZWave: return UnknownZWaveSwitchSwitch } diff --git a/packages/homebridge-ring/valve.ts b/packages/homebridge-ring/valve.ts new file mode 100644 index 00000000..5f150687 --- /dev/null +++ b/packages/homebridge-ring/valve.ts @@ -0,0 +1,40 @@ +import { BaseDeviceAccessory } from './base-device-accessory' +import type { RingDevice } from 'ring-client-api' +import { hap } from './hap' +import { RingPlatformConfig } from './config' +import { PlatformAccessory } from 'homebridge' +import { logInfo } from 'ring-client-api/util' + +export class Valve extends BaseDeviceAccessory { + constructor( + public readonly device: RingDevice, + public readonly accessory: PlatformAccessory, + public readonly config: RingPlatformConfig, + ) { + super() + + const { Characteristic, Service } = hap + + this.registerCharacteristic({ + characteristicType: Characteristic.On, + serviceType: Service.Switch, + getValue: (data) => this.isOpen(data.valveState), + setValue: (value) => this.setOnState(value), + }) + } + + isOpen(status: RingDevice['data']['valveState']): boolean { + if (status === 'open') { + return true + } + return false + } + + setOnState(on: boolean) { + logInfo(`Turning ${this.device.name} ${on ? 'On' : 'Off'}`) + if (on) { + return this.device.sendCommand('valve.open') + } + return this.device.sendCommand('valve.close') + } +} diff --git a/packages/ring-client-api/ring-types.ts b/packages/ring-client-api/ring-types.ts index 9762b2e5..66bb882a 100644 --- a/packages/ring-client-api/ring-types.ts +++ b/packages/ring-client-api/ring-types.ts @@ -49,6 +49,7 @@ export enum RingDeviceType { OnvifCamera = 'onvif_camera', ThirdPartyGarageDoorOpener = 'third_party_gdo', IntercomHandsetAudio = 'intercom_handset_audio', + WaterValve = 'valve.water', } // eslint-disable-next-line no-shadow @@ -70,6 +71,7 @@ export enum RingDeviceCategory { Keypads = 33, Sirens = 34, PanicButtons = 35, + WaterValves = 37, } // eslint-disable-next-line no-shadow @@ -267,6 +269,7 @@ export interface RingDeviceData { motionSensorEnabled?: boolean // security-keypad brightness?: number // 0 - 1 + valveState?: 'open' | 'closed' } export const deviceTypesWithVolume = [