diff --git a/README.md b/README.md index d0ff1cab..9b64d200 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ring-alarm +# ring-client-api [![CircleCI](https://circleci.com/gh/dgreif/ring.svg?style=svg)](https://circleci.com/gh/dgreif/ring) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=HD9ZPB34FY428¤cy_code=USD&source=url) @@ -8,16 +8,16 @@ This is an unofficial TypeScript api for [Ring Doorbells](https://shop.ring.com/ the [Ring Alarm System](https://shop.ring.com/pages/security-system), [Ring Smart Lighting](https://shop.ring.com/pages/smart-lighting), and third party devices that connect to the Ring Alarm System. -Built to support the [homebridge-ring-alarm Plugin](./homebridge) +Built to support the [homebridge-ring Plugin](./homebridge) ## Installation -`npm i @dgreif/ring-alarm` +`npm i ring-client-api` ## Setup and Config ```js -import { RingApi } from '@dgreif/ring-alarm' +import { RingApi } from 'ring-client-api' const ringApi = new RingApi({ email: 'some.one@website.com', @@ -32,7 +32,7 @@ const ringApi = new RingApi({ ### Optional Parameters `locationIds`: Allows you to limit the results to a specific set of locations. -This is mainly useful for the [homebridge-ring-alarm Plugin](./homebridge), but can also be used if you only care about +This is mainly useful for the [homebridge-ring Plugin](./homebridge), but can also be used if you only care about listening for events at a subset of your locations and don't want to create websocket connections to _all_ of your locations. This will also limit the results for `ringApi.getCameras()` to the configured locations. If this option is not included, all locations will be returned. @@ -65,7 +65,7 @@ Once you have acquired the desired location, you can start to interact with associated devices. These devices include ring alarm, ring lighting, and third party devices connected to ring alarm ```js -import { RingDeviceType } from '@dgreif/ring-alarm' +import { RingDeviceType } from 'ring-client-api' const devices = await location.getDevices() const baseStation = devices.find(device => device.data.deviceType === RingDeviceType.BaseStation) @@ -116,11 +116,11 @@ v3 exports a full `RingApi` object instead of a single `getLocations` method. ```typescript // v2 -import { getLocations } from '@dgreif/ring-alarm' +import { getLocations } from 'ring-client-api' const locations = await getLocations(options) // v3 -import { RingApi } from '@dgreif/ring-alarm' +import { RingApi } from 'ring-client-api' const ringApi = new RingApi(options), locations = await ringApi.getLocations(), // same locations object form v2 cameras = await ringApi.getCameras() // new! all cameras from all locations @@ -129,9 +129,9 @@ const ringApi = new RingApi(options), v3 also exposes some other top level methods like `ringApi.getHistory()` and `ringApi.fetchRingDevices()`. Since these are global across all locations, it no longer made sense to export a single `getLocations` method. -## homebridge-ring-alarm +## homebridge-ring -The `homebridge-ring-alarm` is also maintained in this repo. It's readme can be found in [the `homebridge` directory](./homebridge) +The `homebridge-ring` is also maintained in this repo. It's readme can be found in [the `homebridge` directory](./homebridge) ## Credits diff --git a/api/api.ts b/api/api.ts index 3538eb61..81372271 100644 --- a/api/api.ts +++ b/api/api.ts @@ -12,7 +12,7 @@ import { RingCamera } from './ring-camera' import { EMPTY, merge, Subject } from 'rxjs' import { debounceTime, switchMap, throttleTime } from 'rxjs/operators' -export interface RingAlarmOptions { +export interface RingApiOptions { locationIds?: string[] cameraStatusPollingSeconds?: number cameraDingsPollingSeconds?: number @@ -23,7 +23,7 @@ export class RingApi { private locations = this.fetchAndBuildLocations() - constructor(public readonly options: RingAlarmOptions & RingAuth) {} + constructor(public readonly options: RingApiOptions & RingAuth) {} async fetchRingDevices() { const { diff --git a/api/util.ts b/api/util.ts index 31564a83..f660a30d 100644 --- a/api/util.ts +++ b/api/util.ts @@ -3,7 +3,7 @@ import { red } from 'colors' import { randomBytes } from 'crypto' import { createInterface } from 'readline' -const logger = debug('ring-alarm') +const logger = debug('ring') export function delay(milliseconds: number) { return new Promise(resolve => { diff --git a/homebridge/README.md b/homebridge/README.md index ccffe919..9bccf07d 100644 --- a/homebridge/README.md +++ b/homebridge/README.md @@ -1,4 +1,4 @@ -# homebridge-ring-alarm +# homebridge-ring [![CircleCI](https://circleci.com/gh/dgreif/ring.svg?style=svg)](https://circleci.com/gh/dgreif/ring) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=HD9ZPB34FY428¤cy_code=USD&source=url) @@ -14,17 +14,17 @@ and third party devices that connect to the Ring Alarm System. Assuming a global installation of `homebridge`: - `npm i -g homebridge-ring-alarm` + `npm i -g homebridge-ring` ## Homebridge Configuration - Add the `RingAlarm` platform in your homebridge `config.json` file. + Add the `Ring` platform in your homebridge `config.json` file. ```js { "platforms": [ { - "platform": "RingAlarm", + "platform": "Ring", "email": "some.one@website.com", "password": "abc123!#", diff --git a/homebridge/base-accessory.ts b/homebridge/base-accessory.ts index b11d3d90..9d84bc77 100644 --- a/homebridge/base-accessory.ts +++ b/homebridge/base-accessory.ts @@ -3,13 +3,13 @@ import { HAP } from './hap' import Service = HAP.Service import { debounceTime, distinctUntilChanged, map, take } from 'rxjs/operators' import { Observable, Subject } from 'rxjs' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export abstract class BaseAccessory { abstract readonly device: T abstract readonly accessory: HAP.Accessory abstract readonly logger: HAP.Log - abstract readonly config: RingAlarmPlatformConfig + abstract readonly config: RingPlatformConfig getService(serviceType: HAP.Service, name = this.device.name) { if (process.env.RING_DEBUG) { diff --git a/homebridge/base-device-accessory.ts b/homebridge/base-device-accessory.ts index c8bcaa86..cf96d516 100644 --- a/homebridge/base-device-accessory.ts +++ b/homebridge/base-device-accessory.ts @@ -3,7 +3,7 @@ import { HAP, hap } from './hap' import Service = HAP.Service import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators' import { Subject } from 'rxjs' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' import { BaseAccessory } from './base-accessory' function getBatteryLevel({ batteryLevel, batteryStatus }: RingDeviceData) { @@ -51,7 +51,7 @@ export abstract class BaseDeviceAccessory extends BaseAccessory { abstract readonly device: RingDevice abstract readonly accessory: HAP.Accessory abstract readonly logger: HAP.Log - abstract readonly config: RingAlarmPlatformConfig + abstract readonly config: RingPlatformConfig protected constructor() { super() diff --git a/homebridge/base-station.ts b/homebridge/base-station.ts index 2925ff1e..29601fec 100644 --- a/homebridge/base-station.ts +++ b/homebridge/base-station.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class BaseStation extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() } diff --git a/homebridge/beam.ts b/homebridge/beam.ts index fa014e03..3d7102bb 100644 --- a/homebridge/beam.ts +++ b/homebridge/beam.ts @@ -1,6 +1,6 @@ import { RingDevice, RingDeviceType } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' import { BaseDeviceAccessory } from './base-device-accessory' export class Beam extends BaseDeviceAccessory { @@ -12,7 +12,7 @@ export class Beam extends BaseDeviceAccessory { public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/camera.ts b/homebridge/camera.ts index f3e09f29..e33330a4 100644 --- a/homebridge/camera.ts +++ b/homebridge/camera.ts @@ -1,5 +1,5 @@ import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' import { RingCamera } from '../api' import { BaseAccessory } from './base-accessory' import { map, mapTo } from 'rxjs/operators' @@ -10,7 +10,7 @@ export class Camera extends BaseAccessory { public readonly device: RingCamera, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() const { Characteristic, Service } = hap, diff --git a/homebridge/co-alarm.ts b/homebridge/co-alarm.ts index c40b77cf..12a9b460 100644 --- a/homebridge/co-alarm.ts +++ b/homebridge/co-alarm.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class CoAlarm extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/config.ts b/homebridge/config.ts index 3c7c5533..b73b673b 100644 --- a/homebridge/config.ts +++ b/homebridge/config.ts @@ -1,6 +1,6 @@ -import { RingAlarmOptions } from '../api' +import { RingApiOptions } from '../api' -export interface RingAlarmPlatformConfig extends RingAlarmOptions { +export interface RingPlatformConfig extends RingApiOptions { alarmOnEntryDelay?: boolean beamDurationSeconds?: number hideLightGroups?: boolean diff --git a/homebridge/contact-sensor.ts b/homebridge/contact-sensor.ts index 16aa7e88..799d8023 100644 --- a/homebridge/contact-sensor.ts +++ b/homebridge/contact-sensor.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class ContactSensor extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/index.ts b/homebridge/index.ts index 88bb451b..59246850 100644 --- a/homebridge/index.ts +++ b/homebridge/index.ts @@ -1,5 +1,13 @@ -import { RingAlarmPlatform } from './ring-alarm-platform' +import { RingPlatform } from './ring-platform' import { hap } from './hap' +import { readFileSync, writeFileSync } from 'fs' +import { join as joinPath } from 'path' +import { + platformName, + pluginName, + oldPlatformName, + oldPluginName +} from './plugin-info' export default function(homebridge: any) { hap.PlatformAccessory = homebridge.platformAccessory @@ -9,10 +17,43 @@ export default function(homebridge: any) { hap.AccessoryCategories = homebridge.hap.Accessory.Categories hap.StreamController = homebridge.hap.StreamController - homebridge.registerPlatform( - 'homebridge-ring-alarm', - 'RingAlarm', - RingAlarmPlatform, - true - ) + try { + // This plugin was changed from homebridge-ring-alarm to homebridge-ring + // This code cleans up the config/cache files to point to the new plugin + + const cachedAccessoriesPath = joinPath( + homebridge.user.cachedAccessoryPath(), + 'cachedAccessories' + ), + cachedAccessories = readFileSync(cachedAccessoriesPath).toString(), + updatedAccessories = cachedAccessories + .replace(new RegExp(oldPluginName, 'g'), pluginName) + .replace(new RegExp(oldPlatformName, 'g'), platformName), + configPath = homebridge.user.configPath(), + config = readFileSync(configPath).toString(), + updatedConfig = config.replace( + `"${oldPlatformName}"`, + `"${platformName}"` + ) + let filesChanged = false + + if (cachedAccessories !== updatedAccessories) { + writeFileSync(cachedAccessoriesPath, updatedAccessories) + filesChanged = true + } + + if (config !== updatedConfig) { + writeFileSync(configPath, updatedConfig) + filesChanged = true + } + + if (filesChanged) { + console.error( + 'Your Ring Alarm config has been updated to new Ring config. This is a one time thing, and you do not need to do anything. Just restart homebridge and everything should start normally.' + ) + process.exit(1) + } + } catch (_) {} + + homebridge.registerPlatform(pluginName, platformName, RingPlatform, true) } diff --git a/homebridge/keypad.ts b/homebridge/keypad.ts index c8923866..2facddad 100644 --- a/homebridge/keypad.ts +++ b/homebridge/keypad.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class Keypad extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() } diff --git a/homebridge/lock.ts b/homebridge/lock.ts index 8ba3963b..d474c63d 100644 --- a/homebridge/lock.ts +++ b/homebridge/lock.ts @@ -2,7 +2,7 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice, RingDeviceData } from '../api' import { distinctUntilChanged } from 'rxjs/operators' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' function getCurrentState({ locked }: RingDeviceData) { const { @@ -28,7 +28,7 @@ export class Lock extends BaseDeviceAccessory { public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/motion-sensor.ts b/homebridge/motion-sensor.ts index d6ed06d6..b588a796 100644 --- a/homebridge/motion-sensor.ts +++ b/homebridge/motion-sensor.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class MotionSensor extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/multi-level-switch.ts b/homebridge/multi-level-switch.ts index 9615ede9..4f879348 100644 --- a/homebridge/multi-level-switch.ts +++ b/homebridge/multi-level-switch.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class MultiLevelSwitch extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/package.json b/homebridge/package.json index 7f27c39d..ba4aadd1 100644 --- a/homebridge/package.json +++ b/homebridge/package.json @@ -1,5 +1,5 @@ { - "name": "homebridge-ring-alarm", + "name": "homebridge-ring", "description": "Homebridge plugin for Ring doorbells, cameras, security alarm system and smart lighting", "main": "homebridge/index.js", "keywords": [ @@ -12,7 +12,8 @@ "alarm", "smart", "light", - "beam" + "beam", + "security" ], "engines": { "node": ">=8.3.0", diff --git a/homebridge/plugin-info.ts b/homebridge/plugin-info.ts new file mode 100644 index 00000000..d7247b5b --- /dev/null +++ b/homebridge/plugin-info.ts @@ -0,0 +1,4 @@ +export const platformName = 'Ring' +export const pluginName = 'homebridge-ring' +export const oldPlatformName = 'RingAlarm' +export const oldPluginName = 'homebridge-ring-alarm' diff --git a/homebridge/ring-alarm-platform.ts b/homebridge/ring-platform.ts similarity index 94% rename from homebridge/ring-alarm-platform.ts rename to homebridge/ring-platform.ts index a0497c70..735e4138 100644 --- a/homebridge/ring-alarm-platform.ts +++ b/homebridge/ring-platform.ts @@ -9,15 +9,14 @@ import { Lock } from './lock' import { SmokeAlarm } from './smoke-alarm' import { CoAlarm } from './co-alarm' import { SmokeCoListener } from './smoke-co-listener' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' import { Beam } from './beam' import { MultiLevelSwitch } from './multi-level-switch' import { Camera } from './camera' import { RingAuth } from '../api/rest-client' +import { platformName, pluginName } from './plugin-info' -const pluginName = 'homebridge-ring-alarm', - platformName = 'RingAlarm', - debug = __filename.includes('release-homebridge') +const debug = __filename.includes('release-homebridge') process.env.RING_DEBUG = debug ? 'true' : '' @@ -57,16 +56,16 @@ function getAccessoryClass(device: RingDevice | RingCamera) { return null } -export class RingAlarmPlatform { +export class RingPlatform { private readonly homebridgeAccessories: { [uuid: string]: HAP.Accessory } = {} constructor( public log: HAP.Log, - public config: RingAlarmPlatformConfig & RingAuth, + public config: RingPlatformConfig & RingAuth, public api: HAP.Platform ) { if (!config) { - this.log.info('No configuration found for platform RingAlarm') + this.log.info('No configuration found for platform Ring') return } diff --git a/homebridge/security-panel.ts b/homebridge/security-panel.ts index 611533b0..6fa419f1 100644 --- a/homebridge/security-panel.ts +++ b/homebridge/security-panel.ts @@ -2,7 +2,7 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice, RingDeviceData, AlarmState } from '../api' import { distinctUntilChanged } from 'rxjs/operators' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class SecurityPanel extends BaseDeviceAccessory { private targetState: any @@ -14,7 +14,7 @@ export class SecurityPanel extends BaseDeviceAccessory { public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/smoke-alarm.ts b/homebridge/smoke-alarm.ts index 29c72520..3685146b 100644 --- a/homebridge/smoke-alarm.ts +++ b/homebridge/smoke-alarm.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class SmokeAlarm extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/homebridge/smoke-co-listener.ts b/homebridge/smoke-co-listener.ts index d83af40a..6763cadf 100644 --- a/homebridge/smoke-co-listener.ts +++ b/homebridge/smoke-co-listener.ts @@ -1,14 +1,14 @@ import { BaseDeviceAccessory } from './base-device-accessory' import { RingDevice } from '../api' import { HAP, hap } from './hap' -import { RingAlarmPlatformConfig } from './config' +import { RingPlatformConfig } from './config' export class SmokeCoListener extends BaseDeviceAccessory { constructor( public readonly device: RingDevice, public readonly accessory: HAP.Accessory, public readonly logger: HAP.Log, - public readonly config: RingAlarmPlatformConfig + public readonly config: RingPlatformConfig ) { super() diff --git a/package-lock.json b/package-lock.json index cccbc359..63502465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "@dgreif/ring-alarm", + "name": "ring-client-api", "version": "3.9.0", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index ee861934..c8121208 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@dgreif/ring-alarm", + "name": "ring-client-api", "version": "3.9.0", "description": "Unofficial API for Ring doorbells, cameras, security alarm system and smart lighting", "main": "api/index.js", @@ -33,6 +33,8 @@ "smart", "light", "beam", + "security", + "client", "api" ], "author": "dgreif",