diff --git a/docs/Changelog.md b/docs/Changelog.md index 1699d93..ba18d55 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. This project uses [semantic versioning](https://semver.org/). +## 7.1.0 (2024-06-15) + * Behavior change: transcoding is now enabled by default even for local/low-latency streaming. The reason for this change is that HomeKit really doesn't provide a good distinction between local versus remote streaming, merely hinting at whether a HomeKit client is in a low-latency or high-latency environment. If you're on WiFi in a remote location and accessing your Protect cameras in the Home app, they would appear to HomeKit and HBUP as a low-latency connection rather. I believe these defaults are more sane and consistent as we move into the next generation of HBUP and Protect. You can, as always, adjust the defaults. + * Improvement: hardware-accelerated decoding has been reenabled for HKSV. I disabled this quite some time ago as it seemed to be finicky at times and lead to unnecessary recording errors, but things seem to have improvement somewhat on the Protect end of things and I've also added some safety checks to alleviate the issues. The benefits outweigh the potential downsides, particularly given how often HKSV events can be triggered in most environments. + * Improvement: further optimizations to snapshots to ensure we're even more responsive to HomeKit. HBUP now goes to more lengths to guarantee a short response time to snapshot requests by the Home app. + * Improvement: further optimizations and refinements of API-based livestreaming. I'm hoping to evolve this to be the default in future releases, but there's a little more testing and work I'd like to do first. Using API livestreaming has numerous advantages including substantially lower resource utilization on the Protect controller itself if you're already using HKSV and have timeshifting enabled (which it is by default). In addition, livestreams are now essentially instantaneous across the board, and more is coming. TL;DR: things are faster, better, and more streamlined...and still experimental. + * Improvement: HEVC (aka enhanced encoding in Protect-speak) based recording events are much better supported with far fewer grey/blank event snapshots in the HKSV timeline than in prior releases. + ## 7.0.7 (2024-06-10) * Housekeeping. diff --git a/docs/FeatureOptions.md b/docs/FeatureOptions.md index 46b5548..0d8139b 100644 --- a/docs/FeatureOptions.md +++ b/docs/FeatureOptions.md @@ -138,7 +138,7 @@ These option(s) apply to: Protect cameras. |--------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | `Video.Transcode.Hardware` | Use hardware-accelerated transcoding when available (Apple Macs, Intel Quick Sync Video-enabled CPUs, Raspberry Pi 4). **(default: disabled)**. | `Video.Stream.UseApi` | Use the native Protect livestream API to view livestreams (Experimental). **(default: disabled)**. -| `Video.Transcode` | When streaming to local clients (e.g. at home), always transcode livestreams, instead of transmuxing them. **(default: disabled)**. +| `Video.Transcode` | When streaming to local clients (e.g. at home), transcode livestreams, instead of transmuxing them. **(default: enabled)**. | `Video.Transcode.Bitrate.Value` | Bitrate, in kilobits per second, to use when transcoding to local clients, ignoring the bitrate HomeKit requests. HomeKit typically requests lower video quality than you may desire in your environment. **(default: 2000)**. | `Video.Transcode.HighLatency` | When streaming to high-latency clients (e.g. cellular connections), transcode livestreams instead of transmuxing them. **(default: enabled)**. | `Video.Transcode.HighLatency.Bitrate.Value` | Bitrate, in kilobits per second, to use when transcoding to high-latency (e.g. cellular) clients, ignoring the bitrate HomeKit requests. HomeKit typically requests lower video quality than you may desire in your environment. **(default: 1000)**. @@ -164,3 +164,4 @@ These option(s) apply to: Protect cameras. | `Video.HKSV.Record.Only.High` | When recording HomeKit Secure Video events, force the use of the high quality video stream from the Protect controller. **(default: disabled)**. | `Video.HKSV.Record.Only.Medium` | When recording HomeKit Secure Video events, force the use of the medium quality video stream from the Protect controller. **(default: disabled)**. | `Video.HKSV.Record.Only.Low` | When recording HomeKit Secure Video events, force the use of the low quality video stream from the Protect controller. **(default: disabled)**. + diff --git a/package-lock.json b/package-lock.json index fe32867..9b813d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "homebridge-unifi-protect", - "version": "7.0.7", + "version": "7.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "homebridge-unifi-protect", - "version": "7.0.7", + "version": "7.1.0", "license": "ISC", "dependencies": { "@homebridge/plugin-ui-utils": "1.0.3", "ffmpeg-for-homebridge": "2.1.1", - "homebridge-plugin-utils": "^1.4.0", + "homebridge-plugin-utils": "^1.5.0", "unifi-protect": "^4.11.1", "ws": "8.17.0" }, "devDependencies": { - "@stylistic/eslint-plugin": "2.1.0", + "@stylistic/eslint-plugin": "2.2.0", "@types/node": "20.14.2", "@types/readable-stream": "4.0.14", "@types/ws": "8.5.10", @@ -344,15 +344,15 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.1.0.tgz", - "integrity": "sha512-cBBowKP2u/+uE5CzgH5w8pE9VKqcM7BXdIDPIbGt2rmLJGnA6MJPr9vYGaqgMoJFs7R/FzsMQerMvvEP40g2uw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.2.0.tgz", + "integrity": "sha512-qJfzH3M83vpFssPkeS559uj6PbAn8Z54C1zTrKOaH1ooSH54bmPvJ2v3Zh+PRWJ0YscLz43TxQhgmlPD53ZJ9w==", "dev": true, "dependencies": { - "@stylistic/eslint-plugin-js": "2.1.0", - "@stylistic/eslint-plugin-jsx": "2.1.0", - "@stylistic/eslint-plugin-plus": "2.1.0", - "@stylistic/eslint-plugin-ts": "2.1.0", + "@stylistic/eslint-plugin-js": "2.2.0", + "@stylistic/eslint-plugin-jsx": "2.2.0", + "@stylistic/eslint-plugin-plus": "2.2.0", + "@stylistic/eslint-plugin-ts": "2.2.0", "@types/eslint": "^8.56.10" }, "engines": { @@ -363,9 +363,9 @@ } }, "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.1.0.tgz", - "integrity": "sha512-gdXUjGNSsnY6nPyqxu6lmDTtVrwCOjun4x8PUn0x04d5ucLI74N3MT1Q0UhdcOR9No3bo5PGDyBgXK+KmD787A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.2.0.tgz", + "integrity": "sha512-pdkNeVORubs+k7jmhHivYXggoFvw1ykAyGBQomodOYO8MhO8/IM798XVyjadC6EeTeBiXlEWYRy/4QV34hDz+A==", "dev": true, "dependencies": { "@types/eslint": "^8.56.10", @@ -410,12 +410,12 @@ } }, "node_modules/@stylistic/eslint-plugin-jsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.1.0.tgz", - "integrity": "sha512-mMD7S+IndZo2vxmwpHVTCwx2O1VdtE5tmpeNwgaEcXODzWV1WTWpnsc/PECQKIr/mkLPFWiSIqcuYNhQ/3l6AQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.2.0.tgz", + "integrity": "sha512-1aHeR68inrbEFGJZ80rOMHK8gIzTboF4DgmF0eR5KJ+wgxkhlEasZKhsuDrrgXn4xaUIgbMzCeHg9Rw0AtqR9w==", "dev": true, "dependencies": { - "@stylistic/eslint-plugin-js": "^2.1.0", + "@stylistic/eslint-plugin-js": "^2.2.0", "@types/eslint": "^8.56.10", "estraverse": "^5.3.0", "picomatch": "^4.0.2" @@ -428,27 +428,27 @@ } }, "node_modules/@stylistic/eslint-plugin-plus": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.1.0.tgz", - "integrity": "sha512-S5QAlgYXESJaSBFhBSBLZy9o36gXrXQwWSt6QkO+F0SrT9vpV5JF/VKoh+ojO7tHzd8Ckmyouq02TT9Sv2B0zQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.2.0.tgz", + "integrity": "sha512-BVgtMc+oepdEuDkhsCX8ZLD32AIWC2cyhxmz/ku9WJjrfB4eF2qNb/chr7x2SyN+nlJIz/Vl5aSIa3aKAWylBA==", "dev": true, "dependencies": { "@types/eslint": "^8.56.10", - "@typescript-eslint/utils": "^7.8.0" + "@typescript-eslint/utils": "^7.12.0" }, "peerDependencies": { "eslint": "*" } }, "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.1.0.tgz", - "integrity": "sha512-2ioFibufHYBALx2TBrU4KXovCkN8qCqcb9yIHc0fyOfTaO5jw4d56WW7YRcF3Zgde6qFyXwAN6z/+w4pnmos1g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.2.0.tgz", + "integrity": "sha512-34KDq7G1+PpFH9BT3DQyRjy82K1A1Fb/ywr1v4xjs77r/kRIMduadkwHoyj4fCMFTqkW3ML7qZ0jNV2OjdoR8g==", "dev": true, "dependencies": { - "@stylistic/eslint-plugin-js": "2.1.0", + "@stylistic/eslint-plugin-js": "2.2.0", "@types/eslint": "^8.56.10", - "@typescript-eslint/utils": "^7.8.0" + "@typescript-eslint/utils": "^7.12.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1970,9 +1970,9 @@ } }, "node_modules/homebridge-plugin-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/homebridge-plugin-utils/-/homebridge-plugin-utils-1.4.0.tgz", - "integrity": "sha512-LVCah3j0Sjhc9BmabGHUbMfwZr9BtAi48O2zSxoMf7Gm17eFsrcByubKiz8i2rHb5RtLaFIZNROq9nhVyYaEzg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/homebridge-plugin-utils/-/homebridge-plugin-utils-1.5.0.tgz", + "integrity": "sha512-HzlKi5LL8txcgxcpEEVRaqiEKYq4GvCpXv6vv2XVmBw7KO8gjsv6u8Z0w/P966rfI+eDNLuQEYe2J+NUSQwrqA==", "dependencies": { "mqtt": "^5.7.0" }, diff --git a/package.json b/package.json index 728be4f..57949e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "homebridge-unifi-protect", - "version": "7.0.7", + "version": "7.1.0", "displayName": "Homebridge UniFi Protect", "description": "Homebridge UniFi Protect plugin providing complete HomeKit integration for the UniFi Protect ecosystem with full support for most features including autoconfiguration, motion detection, multiple controllers, and realtime updates.", "author": { @@ -77,12 +77,12 @@ "dependencies": { "@homebridge/plugin-ui-utils": "1.0.3", "ffmpeg-for-homebridge": "2.1.1", - "homebridge-plugin-utils": "^1.4.0", + "homebridge-plugin-utils": "^1.5.0", "unifi-protect": "^4.11.1", "ws": "8.17.0" }, "devDependencies": { - "@stylistic/eslint-plugin": "2.1.0", + "@stylistic/eslint-plugin": "2.2.0", "@types/node": "20.14.2", "@types/readable-stream": "4.0.14", "@types/ws": "8.5.10",