homebridge-ring-secure-video 1.0.0-beta.6 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,104 @@
1
1
  # homebridge-ring-secure-video
2
2
 
3
+ ## 1.0.0 (2026-11-14)
4
+
5
+ First stable release. Compared with homebridge-ring 14.3.0, it adds HomeKit Secure Video
6
+ recording with media profiles (`media`), a separate motion sensor per camera for instant
7
+ notifications, motion from Ring's event history when push notifications fail, automatic Ring
8
+ session refresh with an optional sensor, an optional recording on doorbell press, Ring Intercom
9
+ Video as a camera, and the fixes listed in the betas below. Every homebridge-ring setting is
10
+ available with the same name. Tested on a Raspberry Pi 4 (Node 22, Homebridge 2.5) with a Ring
11
+ Video Doorbell 3 Plus, Ring Alarm and 21 sensors.
12
+
13
+ Changes since 1.0.0-beta.7:
14
+
15
+ **Fixes:**
16
+
17
+ - A packet on a live view's audio port that isn't valid RTP no longer stops Homebridge (any
18
+ device on the network could send one). Any other error that would have reached rxjs's
19
+ unhandled-error handler (which stops Homebridge) is logged instead; if it ended a stream, such
20
+ as a live view's audio, only that stream stops.
21
+ - Ring Intercom Video: a pre-warmed live call that fails no longer stops Homebridge, and the
22
+ recording starts its own call; an unclaimed pre-warmed call is stopped after 20 s without
23
+ stopping a call a recording took meanwhile. Pre-warming happens only with HKSV recording on.
24
+ The check for an active ding runs only for Intercom Video (audio intercoms get dings by push),
25
+ every 5 s instead of 3 s, and a slow check no longer has its answer dropped when the next is
26
+ due.
27
+ - A renewed Ring token is saved only into this plugin's platform block. Before, if no block of
28
+ this plugin had the old token (it was changed in the settings meanwhile, or only another
29
+ plugin's block had it, such as homebridge-ring set up with the same token), it was written by
30
+ text replace, possibly into the other plugin's block; now config.json is left as it is, and
31
+ "Could not save a new Ring token" is logged once.
32
+ - When Homebridge shuts down, live views, talk-back, recordings and Ring calls are ended and the
33
+ plugin disconnects from Ring, instead of leaving them running until the process exits.
34
+ - With `codec` set to `auto` (the default outside `lowPower`), recordings on a PC, Docker, a NAS
35
+ or a Raspberry Pi 5 no longer fail by picking the Raspberry Pi 4 hardware encoder
36
+ (`h264_v4l2m2m`) just because FFmpeg lists it: it is picked only on Linux with a video encoder
37
+ device Homebridge can open, and `h264_videotoolbox` only on a Mac; otherwise `auto` picks
38
+ `libx264`. The check now asks the FFmpeg that records (the one bundled with the plugin, or the
39
+ one set with `ffmpegPath`) instead of a system `ffmpeg`, and gives up after 10 s instead of
40
+ holding recordings if FFmpeg hangs; a check that fails is logged and tried again 5 minutes
41
+ later. FFmpeg is only asked when `auto` has to choose (not with `lowPower` or a set codec).
42
+
43
+ **Settings form and docs:**
44
+
45
+ - "Custom FFmpeg Path" is in the settings form again (it was only in the JSON editor), and CI
46
+ now fails if a setting is left out of the form. Settings are grouped by topic, the hide-camera
47
+ settings have descriptions (hiding the camera motion sensor also stops HKSV recordings), and
48
+ the prebuffer setting no longer suggests it adds video from before the motion.
49
+ - The README shows the plugin's own icon instead of the "Homebridge x Ring" logo; Ring's logo
50
+ and unused upstream images are removed and no longer in the npm package. The README says which
51
+ setups are tested and which aren't.
52
+
53
+ **Other:** unused code removed; the encoder check runs FFmpeg once instead of twice.
54
+
55
+ **Known:** `npm audit --omit=dev` reports one high-severity advisory for `ip`
56
+ (GHSA-2p57-rm9w-gvfp), listed against `ip`, `werift` and ring-client-api 14.3.0. It concerns
57
+ `ip.isPublic`, which werift doesn't call, so the plugin isn't affected; it goes away with
58
+ ring-client-api 15 and the werift 0.26 it uses.
59
+
60
+ ## 1.0.0-beta.7 (2026-11-14)
61
+
62
+ **Changes in behaviour to check after updating:**
63
+
64
+ - The flat recording settings are removed: `hksvPerformanceMode`, `cameraVideoCodec`,
65
+ `hksvVideoBitrateKbps`, `hksvVideoMaxBitrateKbps`, `hksvVideoBufferSizeKbps`, `hksvVideoCrf`,
66
+ `hksvVideoPreset`, `hksvVideoKeyframeInterval`, `hksvPrebufferLengthMs`,
67
+ `hksvFragmentLengthMs`, `hksvMaxRecordingSeconds`, `hksvMaxQueuedBytes` and
68
+ `hksvMaxConcurrentRecordings`. Recording is set up only in `media` ("Recording Settings" in
69
+ the plugin settings), which has each of them with the same allowed values
70
+ (`hksvPerformanceMode`'s `balanced`/`rpi`/`quality` become `media.profile`'s
71
+ `adaptive`/`lowPower`/`quality`); the README has a table of what replaces what. A removed
72
+ setting left in a config is ignored, with a warning at start naming it and its replacement:
73
+ move its value if needed, then delete it in the JSON editor. Configs last saved from the
74
+ settings form in beta.6 or earlier usually contain `hksvPerformanceMode` and
75
+ `hksvVideoKeyframeInterval` (the form filled them in), so expect those two warnings. Without `media.profile` the profile is `adaptive`, so a config that only had
76
+ `"hksvPerformanceMode": "rpi"` needs `"media": { "profile": "lowPower" }`.
77
+ - The recording log line says `profile=lowPower`, `adaptive` or `quality` instead of
78
+ `mode=rpi`, `balanced` or `quality`.
79
+
80
+ **Fixes** (from homebridge-ring 15.0.0-beta.0):
81
+
82
+ - A volume, brightness, dimmer or fan-speed change that Ring rejects no longer crashes
83
+ Homebridge (and with it the plugin's bridge); it is logged, and the value goes back to the last
84
+ level Ring reported, unless a newer change was sent meanwhile (dgreif/ring#1892).
85
+ - A Ring mode change (Home, Away, Disarmed) from HomeKit that Ring rejects no longer crashes
86
+ Homebridge; it is logged, and the target goes back to the mode Ring reports. A pending Home (Stay) target is no
87
+ longer overwritten by another mode report before Ring confirms it, and an older request
88
+ failing late no longer undoes a newer one (dgreif/ring#1871).
89
+ - A Ring token without its refresh token (from a sign-in response that couldn't be read, seen
90
+ with unsupported Node.js versions) is no longer saved over a working one (which made every
91
+ later start fail until signing in again) or used for reconnecting; the working token is kept,
92
+ and the error is logged once per run (the plugin's side of dgreif/ring#1886).
93
+
94
+ **Docs:**
95
+
96
+ - The settings form calls `media` "Recording Settings", "Enable HKSV" is no longer marked
97
+ experimental, and the settings' descriptions carry the Raspberry Pi advice, bitrate ranges,
98
+ verified codecs and each profile's defaults.
99
+ - README: a fuller disclaimer, and in "Origin and Attribution" the versions this started from
100
+ and where to report problems.
101
+
3
102
  ## 1.0.0-beta.6 (2026-11-13)
4
103
 
5
104
  **Changes in behaviour to check after updating:**
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img alt="Homebridge x Ring" src="branding/Homebridge_x_Ring.svg" width="500px">
2
+ <img alt="Ring Secure Video" src="https://raw.githubusercontent.com/zmanuel1234/homebridge-ring-secure-video/main/branding/homebridge-ring-secure-video.svg" width="150">
3
3
  </p>
4
4
 
5
5
  # homebridge-ring-secure-video
@@ -13,11 +13,10 @@ It is meant to replace `homebridge-ring` on its own: one plugin, one Ring sign-i
13
13
 
14
14
  ## What it adds to homebridge-ring
15
15
 
16
- Everything `homebridge-ring` exposes is here too (it is not a drop-in swap, though: the plugin and
17
- platform names differ, so its accessories are new to HomeKit and are set up again), plus:
16
+ Everything `homebridge-ring` exposes is here too, with the same settings, plus:
18
17
 
19
18
  - **HomeKit Secure Video recording** for Ring cameras and doorbells, with media profiles for small
20
- machines such as a Raspberry Pi (`media`, `hksvPerformanceMode`).
19
+ machines such as a Raspberry Pi (`media`).
21
20
  - **Instant motion notifications** with HKSV on: an optional separate motion sensor per camera
22
21
  (`cameraMotionNotificationSensor`), so the Home app notifies without waiting for clip analysis.
23
22
  - **Motion when Ring's push notifications fail**: motion from Ring's event history
@@ -37,34 +36,33 @@ platform names differ, so its accessories are new to HomeKit and are set up agai
37
36
 
38
37
  ## Origin and Attribution
39
38
 
40
- This project is based on Dusty Greif's original Ring Homebridge ecosystem:
39
+ This is an independent project, not a GitHub fork and not maintained by the authors it builds on:
41
40
 
42
- - Upstream plugin and API library: [dgreif/ring](https://github.com/dgreif/ring)
43
- (`homebridge-ring` and `ring-client-api`)
41
+ - [`homebridge-ring`](https://github.com/dgreif/ring) by Dusty Greif: this plugin's accessory code
42
+ started from homebridge-ring 14.3.0, and it uses
43
+ [`ring-client-api`](https://www.npmjs.com/package/ring-client-api) 14.3.0 from npm as a
44
+ dependency.
45
+ - [`homebridge-ring-hksv`](https://github.com/trinityhades/homebridge-ring-hksv) by trinityhades:
46
+ this plugin continues from its version 15.0.2 (HKSV recording pipeline, Ring Intercom Video).
44
47
 
45
- - HKSV fork: [trinityhades/homebridge-ring-hksv](https://github.com/trinityhades/homebridge-ring-hksv), whose history this repository continues
48
+ Changes since then are listed in [CHANGELOG.md](CHANGELOG.md). Thanks to Dusty Greif, trinityhades
49
+ and all upstream contributors.
46
50
 
47
- Big thanks to Dusty, trinityhades and all upstream contributors. This plugin reuses and extends that foundation.
51
+ **Please report problems with this plugin
52
+ [here](https://github.com/zmanuel1234/homebridge-ring-secure-video/issues), not to dgreif/ring or
53
+ trinityhades.**
48
54
 
49
55
  ## Important Plugin Options
50
56
 
51
57
  | Option | Purpose |
52
58
  | --- | --- |
53
- | `enableHksv` | Enables experimental HKSV support for eligible cameras; on by default, set `false` to turn it off |
59
+ | `enableHksv` | Enables HKSV recording for eligible cameras; on by default, set `false` to turn it off |
60
+ | `media` | Recording profile (`media.profile`: `adaptive`, `lowPower` or `quality`) and optional recording settings (`media.recording`); see [Media configuration](#media-configuration) and [Recording codecs](#recording-codecs) |
54
61
  | `enableCameraMotionHistory` | Allows camera motion to fall back to recent Ring event history if push notifications don't arrive. The history is checked every `cameraStatusPollingSeconds` until motion events turn out to come by push too, then every 5 minutes as a safety net (and frequently again once a push is missed, so motion can go unreported for up to 5 minutes after push stops working); disable to only trust push-triggered motion |
55
62
  | `automaticSessionRefresh` | When Ring's event history shows motion that Ring sent no push notification for (3 events over at least 30 minutes, none pushed), refreshes the Ring API session by itself, as **Force Ring API Session Refresh** does (see Troubleshooting): a child bridge restarts for it, the main bridge does it at the next Homebridge restart. Events while motion is snoozed are not counted, nor, when the camera alerts for people only, events without a person. At most once a day, and no more after 2 refreshes that brought no motion push notification. Needs `enableCameraMotionHistory`. On by default; set `false` to turn it off, for example if Ring is set to send no motion alerts in some Modes or on a schedule |
56
63
  | `sessionRefreshSensor` | Adds a "Ring Session Refreshed" contact sensor that opens after an automatic session refresh (10 s after the Home app is connected to it, within 3 minutes) and stays open for a day, also across restarts (which don't notify again). Turn on its notifications in the Home app (needs a home hub) to be told when to remove the older `homebridge-ring-secure-video` entry from Authorized Client Devices. Needs `automaticSessionRefresh`. Off by default |
57
64
  | `disableHksvOnBattery` | Disables HKSV on cameras running on battery to reduce battery/network usage; wired battery models keep it. On by default |
58
- | `hksvPrebufferLengthMs` | HKSV prebuffer duration (minimum 4000ms) |
59
- | `hksvFragmentLengthMs` | HKSV fragment duration target |
60
- | `hksvMaxRecordingSeconds` | Optional safety cap for a recording session (default 180 s; 0 disables) |
61
- | `hksvPerformanceMode` | HKSV tuning profile (`balanced`, `rpi`, or `quality`) |
62
- | `hksvMaxConcurrentRecordings` / `hksvMaxQueuedBytes` | HKSV safeguards for small systems under load |
63
- | `hksvVideoBitrateKbps` / `hksvVideoMaxBitrateKbps` / `hksvVideoBufferSizeKbps` | HKSV recording bitrate controls for improving fast-motion quality |
64
- | `hksvVideoCrf` / `hksvVideoPreset` | Optional libx264 quality and CPU tuning controls |
65
- | `hksvVideoKeyframeInterval` | HKSV recording keyframe interval |
66
65
  | `homeKitAccessoryTag` | Appends a tag to accessory names and HomeKit IDs so the same Ring device can be exposed as a distinct HomeKit accessory for debugging/testing |
67
- | `cameraVideoCodec` | Preferred H.264 handling (`auto`, `copy`, `h264_v4l2m2m`, `h264_videotoolbox`, or `libx264`) |
68
66
  | `hideDoorbellSwitch` / `hideCameraMotionSensor` / `hideCameraSirenSwitch` | Hides specific HomeKit-exposed services |
69
67
  | `cameraMotionNotificationSensor` | Adds a separate "<camera> Motion" sensor per camera for instant motion notifications (see below) |
70
68
  | `doorbellPressMotion` | For Ring doorbells with HKSV recording on: a press also turns on the camera's motion for 30 seconds, so HKSV records the visitor even when Ring reported no motion (during a live view, or a quick press-and-leave). One recording per visit, not two. Notifications and automations on the camera's motion sensor also see it; the separate notification sensor does not. No effect with `hideCameraMotionSensor`. Off by default |
@@ -73,20 +71,41 @@ Big thanks to Dusty, trinityhades and all upstream contributors. This plugin reu
73
71
  | `debug` | Enables additional logging |
74
72
  | `disableLogs` | Disables plugin logging |
75
73
 
76
- ## v15 media configuration
74
+ ## Media configuration
77
75
 
78
- v15 uses an adaptive media engine that keeps Ring call ownership separate from
79
- each live-view and recording FFmpeg process. Configure `media.profile` as
80
- `adaptive` (default), `lowPower`, or `quality`. Advanced overrides live in
81
- `media.recording`; they are strictly validated and take precedence over legacy
82
- `hksv*` fields, which remain compatibility aliases during migration. Set
76
+ Recording is set up in `media` ("Recording Settings" in the plugin settings). The media engine
77
+ keeps the Ring call separate from each live-view and recording FFmpeg process. Set
78
+ `media.profile` to `adaptive` (default), `lowPower` or `quality`. Advanced settings live in
79
+ `media.recording`; each is validated, and an unusable value is ignored with a warning. Set
83
80
  `media.recording.maxDurationSeconds` to change its safety cap (default 180 seconds; HomeKit
84
81
  normally ends a recording itself when motion stops), or to `0` to disable it.
85
82
 
83
+ ### Settings removed in 1.0.0
84
+
85
+ The flat recording settings from earlier versions were removed in 1.0.0; `media` replaces each
86
+ of them, with the same allowed values (except `hksvPerformanceMode`, whose values are renamed as
87
+ shown). A removed setting left in a config is ignored, and the log says which one and what
88
+ replaces it: move its value there if it isn't set there yet, then delete it in the JSON editor.
89
+ Without `media.profile`, the profile is `adaptive`, so a config that only had
90
+ `"hksvPerformanceMode": "rpi"` needs `"media": { "profile": "lowPower" }`.
91
+
92
+ | Removed setting | Use instead |
93
+ | --- | --- |
94
+ | `hksvPerformanceMode` (`balanced`, `rpi`, `quality`) | `media.profile` (`adaptive`, `lowPower`, `quality`) |
95
+ | `cameraVideoCodec` | `media.recording.codec` |
96
+ | `hksvVideoBitrateKbps` / `hksvVideoMaxBitrateKbps` / `hksvVideoBufferSizeKbps` | `media.recording.bitrateKbps` / `maxBitrateKbps` / `bufferSizeKbps` |
97
+ | `hksvVideoCrf` / `hksvVideoPreset` | `media.recording.crf` / `preset` |
98
+ | `hksvVideoKeyframeInterval` | `media.recording.keyframeInterval` |
99
+ | `hksvPrebufferLengthMs` / `hksvFragmentLengthMs` | `media.recording.prebufferLengthMs` / `fragmentLengthMs` |
100
+ | `hksvMaxRecordingSeconds` | `media.recording.maxDurationSeconds` |
101
+ | `hksvMaxQueuedBytes` / `hksvMaxConcurrentRecordings` | `media.recording.maxQueuedBytes` / `maxConcurrentRecordings` |
102
+
103
+ `media.recording.rateControl` (`vbr` or `cbr`) had no flat setting.
104
+
86
105
  ## Installation
87
106
 
88
- Requires Node.js 22 or 24 and Homebridge 1.8 or later (2.x recommended). If Homebridge is installed
89
- globally:
107
+ Requires Node.js 22 or 24 and Homebridge 1.8 or later (tested with 2.5; 1.8 is supported but not
108
+ tested). If Homebridge is installed globally:
90
109
 
91
110
  ```bash
92
111
  npm i -g homebridge-ring-secure-video
@@ -141,11 +160,15 @@ Changing `homeKitAccessoryTag` updates both the exposed accessory name and the g
141
160
 
142
161
  ## HKSV Status
143
162
 
144
- HKSV support is experimental and actively evolving. Behavior may vary by camera model, wired vs battery power, Ring API changes, and FFmpeg environment.
163
+ Behavior may vary by camera model, wired vs battery power, Ring API changes, and FFmpeg
164
+ environment.
145
165
 
146
- Verified so far: complete HomeKit clips from a Ring Video Doorbell 3 Plus on a Raspberry Pi 4
147
- (Node 22, Homebridge 2) with each of `copy`, `h264_v4l2m2m` and `libx264` (see below). The HKSV fork this continues reported 3 cameras on an M4 Mac mini.
148
- Please report your experience and setup details to help improve support.
166
+ Tested: complete HomeKit clips from a Ring Video Doorbell 3 Plus on a Raspberry Pi 4 (Node 22,
167
+ Homebridge 2.5) with each of `copy`, `h264_v4l2m2m` and `libx264` (see below). The HKSV fork this
168
+ continues reported 3 cameras on an M4 Mac mini. Not tested here: other Ring cameras, battery
169
+ cameras, Ring Intercom Video, `h264_videotoolbox` and Homebridge 1.8. Please
170
+ [report](https://github.com/zmanuel1234/homebridge-ring-secure-video/issues) how it works with
171
+ your setup.
149
172
 
150
173
  Recordings follow the frame rate and audio format HomeKit asks for, and include audio only when
151
174
  **Record Audio** is on in the camera's settings in the Home app.
@@ -174,7 +197,7 @@ fork).
174
197
  ### Recording codecs
175
198
 
176
199
  Only HKSV recordings are encoded; live view passes Ring's video through. `media.recording.codec`
177
- (or the older `cameraVideoCodec`) chooses how:
200
+ chooses how:
178
201
 
179
202
  | Codec | What it does | CPU |
180
203
  | --- | --- | --- |
@@ -197,14 +220,16 @@ ignores all of them. The Pi's hardware encoder uses `bitrateKbps` and `keyframeI
197
220
 
198
221
  | Profile (`media.profile`) | `auto` picks |
199
222
  | --- | --- |
200
- | `lowPower` (also `"hksvPerformanceMode": "rpi"`) | `copy` |
201
- | `adaptive` (default) or `quality` | `h264_v4l2m2m` if FFmpeg has it (Raspberry Pi 4), else `h264_videotoolbox` if FFmpeg has it (Mac), else `libx264` |
223
+ | `lowPower` | `copy` |
224
+ | `adaptive` (default) or `quality` | `h264_v4l2m2m` on Linux with a usable video encoder device (Raspberry Pi 4), else `h264_videotoolbox` on a Mac, else `libx264` |
202
225
 
203
- "FFmpeg has it" means the encoder is built into FFmpeg, not that the hardware is there: on a
204
- Raspberry Pi 5 (no hardware encoder), set `codec` to `copy` or `libx264` rather than relying on
205
- `auto` in the `adaptive` and `quality` profiles. A valid legacy `cameraVideoCodec` in the config
206
- counts as the codec when `media.recording.codec` isn't set. The log shows the choice for each recording: `Starting HKSV recording pipeline ...
207
- video=<codec>`.
226
+ A hardware encoder is picked only if the FFmpeg that records has it and the computer has the
227
+ hardware: `h264_v4l2m2m` needs a Linux video encoder device that Homebridge can open (the Pi 4's
228
+ `bcm2835-codec-encode`), so a Raspberry Pi 5, a PC or a NAS gets `libx264`, as does Docker unless
229
+ the device is passed through. The log shows the choice for each recording:
230
+ `Starting HKSV recording pipeline ... video=<codec>`. If FFmpeg doesn't answer when asked which
231
+ encoders it has, an error is logged (the first time) and `auto` records with `libx264` until FFmpeg
232
+ is asked again, at the first recording after 5 minutes.
208
233
 
209
234
  #### Settings verified on a Raspberry Pi 4
210
235
 
@@ -229,9 +254,6 @@ For a Raspberry Pi, start with:
229
254
  }
230
255
  ```
231
256
 
232
- ### Minimum specifications for HKSV:
233
- [TBD - will be added as more users test and report their setups]
234
-
235
257
  ## Troubleshooting
236
258
 
237
259
  For support and debugging:
@@ -284,10 +306,25 @@ use the next time they sign in from scratch, since they share `.ring.json`.
284
306
 
285
307
  ## Disclaimer
286
308
 
287
- This plugin is not affiliated with Ring or Amazon.
288
-
289
- Use emergency/panic-related automations at your own risk.
309
+ - **Unofficial.** This plugin is not affiliated with, endorsed by or supported by Ring LLC, Amazon,
310
+ Apple or the Homebridge project. Ring, HomeKit and other names and logos are trademarks of their
311
+ owners and are used only to describe what the plugin works with.
312
+ - **Unsupported Ring API.** It talks to Ring through the same private, undocumented API the Ring app
313
+ uses. Ring can change or block it at any time, and features can stop working without warning.
314
+ - **Not a safety device.** Don't rely on it for security, alarm monitoring or emergencies. Motion,
315
+ doorbell presses and recordings can be late or missed (for example while a live view is open, when
316
+ Ring stops sending push notifications, or when the Homebridge host is offline). Use the Ring app
317
+ for anything that matters, and use panic or emergency automations at your own risk.
318
+ - **Your Ring sign-in.** The Ring refresh token is stored in Homebridge's `config.json` in plain
319
+ text and gives access to your Ring account. Protect that file and its backups, and remove the
320
+ token from logs or config before sharing them. Each Ring API session refresh (automatic or
321
+ forced) adds an entry under Control Center > Authorized Client Devices in the Ring app; remove
322
+ the older one there. Removing the plugin's current entry signs it out of Ring.
323
+ - **Recordings and privacy.** HKSV recordings are processed on your Homebridge host and stored in
324
+ iCloud under Apple's terms. You are responsible for following local laws on recording video and
325
+ audio.
326
+ - Provided as is, without warranty. See [LICENSE](LICENSE).
290
327
 
291
328
  ## License
292
329
 
293
- MIT
330
+ MIT. Copyright Dusty Greif, trinityhades and contributors, and zmanuel1234; see [LICENSE](LICENSE).