ring-client-api
This is an unofficial TypeScript api for Ring Doorbells,
Ring Cameras,
the Ring Alarm System,
Ring Smart Lighting,
and third party devices that connect to the Ring Alarm System.
Built to support the homebridge-ring Plugin
Installation
npm i ring-client-api
Setup and Config
First, generate a refreshToken
using the instructions in the Refresh Tokens Wiki
import { RingApi } from 'ring-client-api'
const ringApi = new RingApi({
refreshToken:
'token generated with ring-auth-cli. See https://github.com/dgreif/ring/wiki/Refresh-Tokens',
cameraStatusPollingSeconds: 20,
locationIds: [
'488e4800-fcde-4493-969b-d1a06f683102',
'4bbed7a7-06df-4f18-b3af-291c89854d60',
],
})
Optional Parameters
Option | Default | Explanation |
---|
cameraStatusPollingSeconds | undefined (No Polling) | How frequently to poll for updates to your cameras and chimes (in seconds). Information like light/siren/volume/snooze status do not update in real time and need to be requested periodically. |
locationModePollingSeconds | undefined (No Polling) | How frequently to poll for location mode updates (in seconds). This is only useful if you are using location modes to control camera settings and want to keep an up-to-date reference of the current mode for each location. Polling is automatically disabled for locations equipped with a Ring Alarm. |
locationIds | All Locations | Allows you to limit the results to a specific set of locations. This is mainly useful for the homebridge-ring Plugin, 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. |
debug | false | Turns on additional logging. In particular, ffmpeg logging. |
ffmpegPath | undefined | A custom path to the ffmpeg executable. By default, ffmpeg will be installed using ffmpeg-for-homebridge , and then fall back to using the PATH environment variable. |
ffmpegPath | Uses ffmpeg-for-homebridge | A custom path to the ffmpeg executable. By default, the static binaries built in ffmpeg-for-homebridge will be used. If you prefer to use your own version of ffmpeg, you can pass a complete path, or simply "ffmpeg" to use ffmpeg from your PATH . |
controlCenterDisplayName | 'ring-client-api' | This allows you to change the displayed name for the Authorized Device within Control Center in the Ring app |
avoidSnapshotBatteryDrain | false | Causes snapshots for battery cameras to be fetched at a minimum 10 minute interval to avoid draining the battery. |
Locations
const locations = await ringApi.getLocations()
const location = locations[0]
location.hasHubs
location.disarm()
location.armHome([
])
location.armAway([
])
location.getAlarmMode()
location.soundSiren()
location.silenceSiren()
location.cameras
location.getHistory()
location.getCameraEvents()
locations
is an array of your Ring locations. Each location can be armed or disarmed,
and used to interact with all devices in that location.
Devices
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
import { RingDeviceType } from 'ring-client-api'
const devices = await location.getDevices()
const baseStation = devices.find(
(device) => device.data.deviceType === RingDeviceType.BaseStation
)
baseStation.setVolume(0.75)
console.log(baseStation.data)
baseStation.onData.subscribe((data) => {
})
Cameras
You can get all cameras using await ringApi.getCameras()
or cameras for a particular
location with location.cameras
const camera = location.cameras[0]
camera.data
camera.onData.subscribe((data) => {
})
camera.setLight(true)
camera.setSiren(true)
camera.getHealth()
camera.startVideoOnDemand()
camera.createSipSession()
camera.getEvents()
camera.getRecordingUrl(dingIdStr, { transcoded: true })
camera.getSnapshot()
Camera also includes the following observables:
onNewNotification
: this is triggered any time a new push notification is receivedonActiveNotifications
: notifications received within the last minuteonDoorbellPressed
: this will include the sip info and ding information every time a new ding is createdonActiveDings
: dings created within the last 65 secondsonDoorbellPressed
: emits a ding every time the doorbell is pressedonMotionDetected
: true
or false
based on onActiveDings
containing a motion ding
Some other useful properties
id
name
: same as description
from data
hasLight
: does this camera have a lighthasSiren
: does this camera have a sirenisDoorbot
: is this camera a doorbell
Refresh Token
Ring has restricted refresh tokens so that they expire shortly after use. See https://github.com/dgreif/ring/wiki/Refresh-Tokens#refresh-token-expiration for details on how to properly handle refresh tokens in your library.