@homebridge-plugins/homebridge-eufy-security 4.7.2 → 5.0.0-beta.1
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/AUTHORS +4 -0
- package/CODE_OF_CONDUCT.md +30 -0
- package/CONTRIBUTING.md +77 -0
- package/README.md +152 -49
- package/SECURITY.md +30 -0
- package/config.schema.json +92 -3
- package/dist/account/ownership.js +290 -0
- package/dist/account/ownership.js.map +1 -0
- package/dist/account/persistence.js +274 -0
- package/dist/account/persistence.js.map +1 -0
- package/dist/account/temporary-authentication.js +348 -0
- package/dist/account/temporary-authentication.js.map +1 -0
- package/dist/configuration.js +167 -0
- package/dist/configuration.js.map +1 -0
- package/dist/device/member-evidence.js +66 -0
- package/dist/device/member-evidence.js.map +1 -0
- package/dist/device/member-trust.js +114 -0
- package/dist/device/member-trust.js.map +1 -0
- package/dist/device/snapshot.js +190 -0
- package/dist/device/snapshot.js.map +1 -0
- package/dist/diagnostics.js +2218 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/homekit/adapter.js +2 -0
- package/dist/homekit/adapter.js.map +1 -0
- package/dist/homekit/adapters/battery.js +208 -0
- package/dist/homekit/adapters/battery.js.map +1 -0
- package/dist/homekit/adapters/camera-controls.js +527 -0
- package/dist/homekit/adapters/camera-controls.js.map +1 -0
- package/dist/homekit/adapters/camera-streaming.js +1515 -0
- package/dist/homekit/adapters/camera-streaming.js.map +1 -0
- package/dist/homekit/adapters/contact.js +138 -0
- package/dist/homekit/adapters/contact.js.map +1 -0
- package/dist/homekit/adapters/doorbell.js +57 -0
- package/dist/homekit/adapters/doorbell.js.map +1 -0
- package/dist/homekit/adapters/information.js +55 -0
- package/dist/homekit/adapters/information.js.map +1 -0
- package/dist/homekit/adapters/lock.js +489 -0
- package/dist/homekit/adapters/lock.js.map +1 -0
- package/dist/homekit/adapters/motion.js +100 -0
- package/dist/homekit/adapters/motion.js.map +1 -0
- package/dist/homekit/adapters/registry.js +26 -0
- package/dist/homekit/adapters/registry.js.map +1 -0
- package/dist/homekit/adapters/security-system.js +425 -0
- package/dist/homekit/adapters/security-system.js.map +1 -0
- package/dist/homekit/adapters/siren.js +136 -0
- package/dist/homekit/adapters/siren.js.map +1 -0
- package/dist/homekit/adapters/smart-light.js +662 -0
- package/dist/homekit/adapters/smart-light.js.map +1 -0
- package/dist/homekit/coverage-matrix.js +119 -0
- package/dist/homekit/coverage-matrix.js.map +1 -0
- package/dist/homekit/device-control.js +175 -0
- package/dist/homekit/device-control.js.map +1 -0
- package/dist/homekit/reconciler.js +319 -0
- package/dist/homekit/reconciler.js.map +1 -0
- package/dist/homekit/representation.js +23 -0
- package/dist/homekit/representation.js.map +1 -0
- package/dist/index.js +4 -9
- package/dist/index.js.map +1 -1
- package/dist/media/contracts.js +2 -0
- package/dist/media/contracts.js.map +1 -0
- package/dist/media/last-successful-image.js +208 -0
- package/dist/media/last-successful-image.js.map +1 -0
- package/dist/media/live-stream.js +1003 -0
- package/dist/media/live-stream.js.map +1 -0
- package/dist/media/recording.js +560 -0
- package/dist/media/recording.js.map +1 -0
- package/dist/media/session-budget.js +39 -0
- package/dist/media/session-budget.js.map +1 -0
- package/dist/media/snapshot.js +406 -0
- package/dist/media/snapshot.js.map +1 -0
- package/dist/media/station-live-sessions.js +101 -0
- package/dist/media/station-live-sessions.js.map +1 -0
- package/dist/platform.js +97 -809
- package/dist/platform.js.map +1 -1
- package/dist/runtime/channel.js +375 -0
- package/dist/runtime/channel.js.map +1 -0
- package/dist/runtime/owner.js +682 -0
- package/dist/runtime/owner.js.map +1 -0
- package/dist/runtime/sdk-client.js +211 -0
- package/dist/runtime/sdk-client.js.map +1 -0
- package/dist/runtime/tracker.js +211 -0
- package/dist/runtime/tracker.js.map +1 -0
- package/dist/settings.js +1 -43
- package/dist/settings.js.map +1 -1
- package/dist/storage.js +59 -0
- package/dist/storage.js.map +1 -0
- package/dist/ui/dashboard.js +181 -0
- package/dist/ui/dashboard.js.map +1 -0
- package/dist/ui/device-image.js +22 -0
- package/dist/ui/device-image.js.map +1 -0
- package/dist/ui/runtime-channel-client.js +305 -0
- package/dist/ui/runtime-channel-client.js.map +1 -0
- package/dist/ui/server.js +259 -0
- package/dist/ui/server.js.map +1 -0
- package/homebridge-ui/public/app.css +1902 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T1250.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2070.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2080.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2081.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2103.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2117.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2118.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2119.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T211A.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2120.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2123.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2128.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2130.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2132.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2150.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2181.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2182.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2190.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2192.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2193.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2194.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2210.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2250.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2251.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2252.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2253.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2254.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2255.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2256.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2257.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2258.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2259.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2261.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2262.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2266.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2267.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2268.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2270.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2272.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2273.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2276.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2277.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2278.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2280.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2292.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2320.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2351.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2352.webp +0 -0
- package/homebridge-ui/public/assets/devices/clean/clean-T2353.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L00.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L01.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L02.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L04.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L10.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L20.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L30.webp +0 -0
- package/homebridge-ui/public/assets/devices/life/life-T8L40.webp +0 -0
- package/homebridge-ui/public/assets/devices/mower/mower-T2801.webp +0 -0
- package/homebridge-ui/public/assets/devices/mower/mower-T280B.webp +0 -0
- package/homebridge-ui/public/assets/devices/mower/mower-T2880.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T7400.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T7401.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8001.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8002.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8010.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8021.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8023.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8025.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8030.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8110.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8111.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8112.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8113.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8114.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8122.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8123.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8124.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8130.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8131.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8134.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8140.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8141.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8150.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8151.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8152.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8153.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8160.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8161.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8162.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8170.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8171.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8172.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8173.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8200.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8200X.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8201.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8203.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8210.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8213.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8214.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8222.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8400.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8401.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8410.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8411.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8414.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8416.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8417.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8419.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8419N.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8420.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8420X.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8422.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8423.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8424.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8425.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8441.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8442.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8452.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T84A0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T84A1.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8500.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8502.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8503.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8504.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8506.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8510.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8510P.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8520.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8520P.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8530.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8531.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T85D0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T85L0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T85P0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T85V0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8600.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T86P2.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8790.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T87B0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T87B2.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8900.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8910.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8920.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8960.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8B0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8E00.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8N00.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T8W11C.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T90F0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T90M0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T90R0.webp +0 -0
- package/homebridge-ui/public/assets/devices/security/security-T90S0.webp +0 -0
- package/homebridge-ui/public/assets/icons/inventory.svg +1 -1
- package/homebridge-ui/public/assets/icons/troubleshoot.svg +1 -0
- package/homebridge-ui/public/assets/icons/warning.svg +1 -1
- package/homebridge-ui/public/assets/logo-dark.svg +10 -0
- package/homebridge-ui/public/assets/logo.svg +10 -0
- package/homebridge-ui/public/i18n/en.json +218 -0
- package/homebridge-ui/public/i18n/fr.json +218 -0
- package/homebridge-ui/public/index.html +377 -28
- package/homebridge-ui/public/js/app.js +1065 -0
- package/homebridge-ui/public/js/dashboard.js +385 -0
- package/homebridge-ui/public/js/legacy-settings.js +37 -0
- package/homebridge-ui/public/js/profile-wizard.js +68 -0
- package/homebridge-ui/server.js +2 -1393
- package/i18n/runtime/en.json +100 -0
- package/media/Snapshot-Unavailable.jpg +0 -0
- package/media/Snapshot-black.jpg +0 -0
- package/media/camera-disabled.jpg +0 -0
- package/media/camera-offline.jpg +0 -0
- package/package.json +29 -24
- package/.claude/CLAUDE.md +0 -175
- package/.claude/PRD.md +0 -241
- package/.claude/docs/debug-recording-lessons.md +0 -91
- package/.claude/docs/hksv-recording-fix.md +0 -160
- package/.claude/skills/architect/SKILL.md +0 -76
- package/.claude/skills/developer/SKILL.md +0 -59
- package/.claude/skills/new-device-support/SKILL.md +0 -212
- package/.claude/skills/new-device-support/check-device.mjs +0 -363
- package/.claude/skills/new-device-support/map-properties.mjs +0 -450
- package/.claude/skills/new-device-support/verify-device.mjs +0 -272
- package/.claude/skills/planner/SKILL.md +0 -100
- package/.claude/skills/qa/SKILL.md +0 -79
- package/.claude/skills/support/SKILL.md +0 -175
- package/.prettierignore +0 -7
- package/.prettierrc.json +0 -7
- package/FUNDING.yml +0 -1
- package/dist/accessories/AutoSyncStationAccessory.js +0 -157
- package/dist/accessories/AutoSyncStationAccessory.js.map +0 -1
- package/dist/accessories/BaseAccessory.js +0 -261
- package/dist/accessories/BaseAccessory.js.map +0 -1
- package/dist/accessories/CameraAccessory.js +0 -459
- package/dist/accessories/CameraAccessory.js.map +0 -1
- package/dist/accessories/Device.js +0 -65
- package/dist/accessories/Device.js.map +0 -1
- package/dist/accessories/EntrySensorAccessory.js +0 -48
- package/dist/accessories/EntrySensorAccessory.js.map +0 -1
- package/dist/accessories/GarageDoorAccessory.js +0 -160
- package/dist/accessories/GarageDoorAccessory.js.map +0 -1
- package/dist/accessories/LockAccessory.js +0 -142
- package/dist/accessories/LockAccessory.js.map +0 -1
- package/dist/accessories/MotionSensorAccessory.js +0 -48
- package/dist/accessories/MotionSensorAccessory.js.map +0 -1
- package/dist/accessories/SmartDropAccessory.js +0 -141
- package/dist/accessories/SmartDropAccessory.js.map +0 -1
- package/dist/accessories/StationAccessory.js +0 -373
- package/dist/accessories/StationAccessory.js.map +0 -1
- package/dist/config.js +0 -26
- package/dist/config.js.map +0 -1
- package/dist/controller/DebugRecordingManager.js +0 -402
- package/dist/controller/DebugRecordingManager.js.map +0 -1
- package/dist/controller/LocalLivestreamManager.js +0 -371
- package/dist/controller/LocalLivestreamManager.js.map +0 -1
- package/dist/controller/recordingDelegate.js +0 -252
- package/dist/controller/recordingDelegate.js.map +0 -1
- package/dist/controller/snapshotDelegate.js +0 -348
- package/dist/controller/snapshotDelegate.js.map +0 -1
- package/dist/controller/streamingDelegate.js +0 -389
- package/dist/controller/streamingDelegate.js.map +0 -1
- package/dist/interfaces.js +0 -2
- package/dist/interfaces.js.map +0 -1
- package/dist/media/Snapshot-Unavailable.png +0 -0
- package/dist/media/Snapshot-Unavailable.xcf +0 -0
- package/dist/media/Snapshot-black.png +0 -0
- package/dist/media/camera-disabled.png +0 -0
- package/dist/media/camera-offline.png +0 -0
- package/dist/media/media/Snapshot-Unavailable.png +0 -0
- package/dist/media/media/Snapshot-Unavailable.xcf +0 -0
- package/dist/media/media/Snapshot-black.png +0 -0
- package/dist/media/media/camera-disabled.png +0 -0
- package/dist/media/media/camera-offline.png +0 -0
- package/dist/utils/Talkback.js +0 -162
- package/dist/utils/Talkback.js.map +0 -1
- package/dist/utils/accessoriesStore.js +0 -210
- package/dist/utils/accessoriesStore.js.map +0 -1
- package/dist/utils/configTypes.js +0 -38
- package/dist/utils/configTypes.js.map +0 -1
- package/dist/utils/ffmpeg.js +0 -1111
- package/dist/utils/ffmpeg.js.map +0 -1
- package/dist/utils/interfaces.js +0 -8
- package/dist/utils/interfaces.js.map +0 -1
- package/dist/utils/utils.js +0 -224
- package/dist/utils/utils.js.map +0 -1
- package/dist/version.js +0 -2
- package/dist/version.js.map +0 -1
- package/homebridge-eufy-security.png +0 -0
- package/homebridge-ui/diagnosticsCrypto.js +0 -112
- package/homebridge-ui/public/app.js +0 -237
- package/homebridge-ui/public/assets/devices/4g_lte_cam_s330_large.png +0 -0
- package/homebridge-ui/public/assets/devices/4g_lte_starlight_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C30.png +0 -0
- package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C31.png +0 -0
- package/homebridge-ui/public/assets/devices/batterydoorbell1080p_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/batterydoorbell2k_large.png +0 -0
- package/homebridge-ui/public/assets/devices/batterydoorbell2kdual_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/batterydoorbell_e340_large.png +0 -0
- package/homebridge-ui/public/assets/devices/eufy-security-client.png +0 -0
- package/homebridge-ui/public/assets/devices/eufyCamS4_large.png +0 -0
- package/homebridge-ui/public/assets/devices/eufycam2_large.png +0 -0
- package/homebridge-ui/public/assets/devices/eufycam2c_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycam2cpro_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycam2pro_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycam3_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycam3c_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycam3pro_large.png +0 -0
- package/homebridge-ui/public/assets/devices/eufycam_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/eufycame330_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/flood_freeze_sensor_e20_t90F0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/floodlight2_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/floodlight2pro_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/floodlight_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/floodlightcame340_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/garage_camera_t8452_large.png +0 -0
- package/homebridge-ui/public/assets/devices/homebase2_large.png +0 -0
- package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
- package/homebridge-ui/public/assets/devices/homebase_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/homebasemini_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamC210_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamC220_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamC220_t8419N_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamE30_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamc120_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcammini_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/indoorcamp24_large.png +0 -0
- package/homebridge-ui/public/assets/devices/indoorcams350_large.png +0 -0
- package/homebridge-ui/public/assets/devices/keypad_large.png +0 -0
- package/homebridge-ui/public/assets/devices/minibase_chime_T8023_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/motionsensor_large.png +0 -0
- package/homebridge-ui/public/assets/devices/nvr_s4_max_T8N00_large.png +0 -0
- package/homebridge-ui/public/assets/devices/pir_sensor_e20_large.png +0 -0
- package/homebridge-ui/public/assets/devices/poe_bullet_ptz_cam_s4_T8E00_large.png +0 -0
- package/homebridge-ui/public/assets/devices/sensor_large.png +0 -0
- package/homebridge-ui/public/assets/devices/siren_sensor_e20_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartdrop_t8790_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8500_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8500_wifibridge_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8503_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8504_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t85D0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t85L0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t85P0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t85V0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8502_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8506_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8520_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_wifibridge_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_video_t8530_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_video_t8531_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlockwifibridge_t8021_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartsafe_s10_t7400_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartsafe_s12_t7401_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smarttrack_card_t87B2_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smarttrack_link_t87B0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smoke_alarm_e10_t90S0_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocamc210_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solocamc35_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocame20_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solocame30_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocame40_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solocame42_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocaml20_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solocams220_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solocams340_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocams40_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/soloindoorcamc24_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/solooutdoorcamc22_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solooutdoorcamc24_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/unknown.png +0 -0
- package/homebridge-ui/public/assets/devices/walllight_s100_large.png +0 -0
- package/homebridge-ui/public/assets/devices/walllight_s120_large.png +0 -0
- package/homebridge-ui/public/assets/devices/water_freeze_sensor_t8920_large.png +0 -0
- package/homebridge-ui/public/assets/devices/wireddoorbell1080p_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.png +0 -0
- package/homebridge-ui/public/assets/devices/wireddoorbelldual_large.jpg +0 -0
- package/homebridge-ui/public/assets/icons/attach.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_0.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_1.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_2.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_3.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_4.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_5.svg +0 -1
- package/homebridge-ui/public/assets/icons/battery_6.svg +0 -1
- package/homebridge-ui/public/assets/icons/copy.svg +0 -1
- package/homebridge-ui/public/assets/icons/delete.svg +0 -1
- package/homebridge-ui/public/assets/icons/download.svg +0 -1
- package/homebridge-ui/public/assets/icons/info.svg +0 -1
- package/homebridge-ui/public/assets/icons/refresh.svg +0 -1
- package/homebridge-ui/public/assets/icons/satellite_alt.svg +0 -1
- package/homebridge-ui/public/assets/icons/solar_power.svg +0 -1
- package/homebridge-ui/public/components/device-card.js +0 -174
- package/homebridge-ui/public/components/guard-modes.js +0 -88
- package/homebridge-ui/public/components/number-input.js +0 -121
- package/homebridge-ui/public/components/select.js +0 -73
- package/homebridge-ui/public/components/toggle.js +0 -68
- package/homebridge-ui/public/services/api.js +0 -250
- package/homebridge-ui/public/services/config.js +0 -144
- package/homebridge-ui/public/style.css +0 -818
- package/homebridge-ui/public/utils/countries.js +0 -73
- package/homebridge-ui/public/utils/device-images.js +0 -102
- package/homebridge-ui/public/utils/helpers.js +0 -115
- package/homebridge-ui/public/views/dashboard.js +0 -226
- package/homebridge-ui/public/views/device-detail.js +0 -654
- package/homebridge-ui/public/views/diagnostics.js +0 -402
- package/homebridge-ui/public/views/login.js +0 -650
- package/homebridge-ui/public/views/recordings.js +0 -319
- package/homebridge-ui/public/views/settings.js +0 -197
- package/homebridge-ui/public/views/unsupported-detail.js +0 -296
- package/media/Snapshot-Unavailable.png +0 -0
- package/media/Snapshot-Unavailable.xcf +0 -0
- package/media/Snapshot-black.png +0 -0
- package/media/camera-disabled.png +0 -0
- package/media/camera-offline.png +0 -0
- package/scripts/decrypt-diagnostics.mjs +0 -257
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"log.action.allowBatteryCooling": "Allow the device battery to return to a safe temperature",
|
|
3
|
+
"log.action.checkNetwork": "Check network access and Eufy service availability",
|
|
4
|
+
"log.action.checkPhysicalArmingMode": "Check the physical security-system mode before retrying",
|
|
5
|
+
"log.action.checkPhysicalLight": "Check the physical smart-light state before retrying",
|
|
6
|
+
"log.action.checkPhysicalLock": "Check the physical lock state before retrying",
|
|
7
|
+
"log.action.checkCameraSnapshot": "Check that the camera is reachable and can produce an image, then open the camera again",
|
|
8
|
+
"log.action.waitCameraControl": "No action is needed; the control returns when the camera reports it again",
|
|
9
|
+
"log.action.checkCameraControl": "Check the camera in the Eufy app; this control is unavailable until it reports its state",
|
|
10
|
+
"log.action.retryCameraControl": "Try the control again; the camera did not confirm the change",
|
|
11
|
+
"log.action.enableCamera": "Turn the camera on in the Eufy app, then open live view again",
|
|
12
|
+
"log.action.openDashboard": "Review device representation in the Homebridge Eufy dashboard",
|
|
13
|
+
"log.action.reduceConcurrentMedia": "Open live view again; if it keeps happening, close a camera already open or raise the concurrent camera media limit in the plugin settings",
|
|
14
|
+
"log.action.reauthenticate": "Authenticate again in the Homebridge Eufy dashboard, then restart Homebridge",
|
|
15
|
+
"log.action.retryArming": "Retry the security-system control manually",
|
|
16
|
+
"log.action.retryLight": "Retry the smart-light control manually",
|
|
17
|
+
"log.action.retryLiveView": "Open live view again, and check network access between Homebridge and the camera",
|
|
18
|
+
"log.action.retryLock": "Retry the lock control manually",
|
|
19
|
+
"log.action.retryTalkback": "Close and reopen the camera, then try speaking again",
|
|
20
|
+
"log.action.reviewRuntime": "Review Homebridge Eufy health in the dashboard and restart Homebridge",
|
|
21
|
+
"log.action.stopOtherOwner": "Stop the other Homebridge Eufy owner before restarting Homebridge",
|
|
22
|
+
"log.action.selectSupportedArmingMode": "Select Stay, Away, or Disarm to leave the unsupported mode",
|
|
23
|
+
"log.action.waitBattery": "Wait for complete battery capability evidence",
|
|
24
|
+
"log.action.waitArming": "Wait for complete arming capability evidence",
|
|
25
|
+
"log.action.waitBatteryObservation": "Wait for a valid battery observation",
|
|
26
|
+
"log.action.waitCameraLive": "Wait for complete camera live media capability evidence",
|
|
27
|
+
"log.action.waitCameraSnapshot": "Wait for complete camera snapshot capability evidence",
|
|
28
|
+
"log.action.waitContact": "Wait for complete contact capability evidence",
|
|
29
|
+
"log.action.waitContactObservation": "Wait for a valid contact observation",
|
|
30
|
+
"log.action.waitLight": "Wait for complete smart-light capability evidence",
|
|
31
|
+
"log.action.waitLightObservation": "Wait for a valid smart-light observation",
|
|
32
|
+
"log.action.waitLock": "Wait for complete lock capability evidence",
|
|
33
|
+
"log.action.waitSiren": "Wait for complete siren capability evidence",
|
|
34
|
+
"log.action.waitSirenObservation": "Wait for a valid siren observation",
|
|
35
|
+
"log.action.waitTalkback": "Wait for complete camera talkback capability evidence",
|
|
36
|
+
"log.condition.active": "{summary}. {affected} {action}.",
|
|
37
|
+
"log.condition.affectedMany": "{count} accessories are affected.",
|
|
38
|
+
"log.condition.affectedNamed": "Affected: {names}.",
|
|
39
|
+
"log.condition.affectedOne": "1 accessory is affected.",
|
|
40
|
+
"log.condition.recovered": "Recovered: {summary}.",
|
|
41
|
+
"log.diagnosticFileFailed": "Diagnostic file logging failed; check storage permissions.",
|
|
42
|
+
"log.discardedSettings": "Some legacy settings were discarded. Review and acknowledge them in the Homebridge Eufy dashboard.",
|
|
43
|
+
"log.snapshotCacheInvalid": "An invalid retained camera image was removed",
|
|
44
|
+
"log.homekit.batteryCapabilityUnavailable": "Battery information is unavailable",
|
|
45
|
+
"log.homekit.armingCapabilityUnavailable": "Security-system information is unavailable",
|
|
46
|
+
"log.homekit.armingOperationFailed": "A security-system control failed",
|
|
47
|
+
"log.homekit.armingReconciliationExpired": "A security system did not confirm the requested mode",
|
|
48
|
+
"log.homekit.batteryTemperatureAlert": "A device reported a battery temperature alert",
|
|
49
|
+
"log.homekit.cameraLiveSessionFailed": "A live camera session ended without video",
|
|
50
|
+
"log.homekit.cameraSnapshotCapabilityUnavailable": "Camera snapshot acquisition is unavailable",
|
|
51
|
+
"log.homekit.cameraSnapshotUnavailable": "A camera image is unavailable, so a placeholder is shown",
|
|
52
|
+
"log.homekit.cameraStreamingCapabilityUnavailable": "Camera live media is unavailable",
|
|
53
|
+
"log.homekit.cameraTalkbackFailed": "Camera talkback stopped unexpectedly",
|
|
54
|
+
"log.homekit.cameraTalkbackUnavailable": "Camera talkback is unavailable",
|
|
55
|
+
"log.homekit.cameraControlsCapabilityUnavailable": "A camera control is unavailable",
|
|
56
|
+
"log.homekit.cameraControlOperationFailed": "A camera control did not take effect",
|
|
57
|
+
"log.homekit.invalidCameraControlObservation": "A camera control state could not be read",
|
|
58
|
+
"log.homekit.cameraRecordingRefused": "Recording is unavailable because the camera is turned off",
|
|
59
|
+
"log.homekit.cameraLiveSessionRefused": "Live view is unavailable because the camera is turned off",
|
|
60
|
+
"log.homekit.cameraMediaAtCapacity": "Live view was refused because this host had reached its configured limit of cameras streaming at once",
|
|
61
|
+
"log.homekit.contactCapabilityUnavailable": "Contact sensor information is unavailable",
|
|
62
|
+
"log.homekit.invalidBatteryObservation": "A battery observation is invalid",
|
|
63
|
+
"log.homekit.invalidContactObservation": "A contact sensor observation is invalid",
|
|
64
|
+
"log.homekit.invalidLightObservation": "A smart-light observation is invalid",
|
|
65
|
+
"log.homekit.invalidSirenObservation": "A siren observation is invalid",
|
|
66
|
+
"log.homekit.lightCapabilityUnavailable": "Smart-light information is unavailable",
|
|
67
|
+
"log.homekit.lightOperationFailed": "A smart-light control failed",
|
|
68
|
+
"log.homekit.lightReconciliationExpired": "A smart-light did not confirm the requested state",
|
|
69
|
+
"log.homekit.lockCapabilityUnavailable": "Lock control is unavailable",
|
|
70
|
+
"log.homekit.lockOperationFailed": "A lock control failed",
|
|
71
|
+
"log.homekit.lockReconciliationExpired": "A lock did not confirm the requested target",
|
|
72
|
+
"log.homekit.recognizedNotRepresented": "Some recognized devices cannot be represented in HomeKit",
|
|
73
|
+
"log.homekit.sirenCapabilityUnavailable": "Siren information is unavailable",
|
|
74
|
+
"log.homekit.unsupportedArmingMode": "A security system reported a mode Apple Home cannot represent",
|
|
75
|
+
"log.homekit.unusableLockAnnouncement": "A lock reported something this plugin cannot read, so its state is shown as unknown",
|
|
76
|
+
"log.notice.eventSubscriberFailed": "A device event consumer failed; review Homebridge Eufy health in the dashboard.",
|
|
77
|
+
"log.notice.ownershipAcquisitionFailed": "Account ownership could not be acquired; restart Homebridge before retrying.",
|
|
78
|
+
"log.notice.ownershipReleaseFailed": "Account ownership release failed; restart Homebridge before retrying.",
|
|
79
|
+
"log.notice.ownershipReleaseIncomplete": "Account ownership release remains incomplete; restart Homebridge before retrying.",
|
|
80
|
+
"log.notice.ownershipReleaseNotFinalized": "Account ownership release did not finish; restart Homebridge before retrying.",
|
|
81
|
+
"log.notice.registrySubscriberFailed": "A device registry consumer failed; review Homebridge Eufy health in the dashboard.",
|
|
82
|
+
"log.notice.shutdownFailed": "The Eufy runtime did not shut down cleanly; restart Homebridge before retrying.",
|
|
83
|
+
"log.notice.shutdownTimeout": "The Eufy runtime exceeded its shutdown deadline; Homebridge shutdown will continue.",
|
|
84
|
+
"log.notice.shutdownTimeoutWithDuration": "The Eufy runtime exceeded its shutdown deadline; Homebridge shutdown will continue. ({durationMs} ms)",
|
|
85
|
+
"log.notice.stateSubscriberFailed": "A runtime state consumer failed; review Homebridge Eufy health in the dashboard.",
|
|
86
|
+
"log.notice.statusPublicationFailed": "Runtime status could not be published; dashboard status may be stale.",
|
|
87
|
+
"log.notice.channelServeFailed": "Live runtime status could not be served to the plugin settings page; it will show the last published status instead.",
|
|
88
|
+
"log.notice.diagnosticsAuthorizationArmed": "Diagnostic evidence collection is now active in the plugin runtime.",
|
|
89
|
+
"log.notice.standDownNotRearmed": "Homebridge Eufy stood down for an authentication and could not take the account session back; restart Homebridge to bring it back.",
|
|
90
|
+
"log.notice.standDownAccountReplaced": "Homebridge Eufy stood down for an authentication that replaced the account; restart Homebridge to use the new account.",
|
|
91
|
+
"log.runtime.authenticationRequired": "Eufy authentication is required",
|
|
92
|
+
"log.runtime.failed": "The Eufy runtime failed",
|
|
93
|
+
"log.runtime.ownerConflict": "Another process owns the Eufy account session",
|
|
94
|
+
"log.runtime.state": "Homebridge Eufy runtime is {state}.",
|
|
95
|
+
"log.runtime.transportDegraded": "The Eufy connection is degraded",
|
|
96
|
+
"log.action.checkCameraRecording": "Check that HomeKit Secure Video is set up for this camera and that it reports motion",
|
|
97
|
+
"log.action.retryRecording": "No action is needed; recording is attempted again on the next trigger",
|
|
98
|
+
"log.homekit.cameraRecordingUnavailable": "HomeKit Secure Video recording is unavailable for this camera",
|
|
99
|
+
"log.homekit.cameraRecordingFailed": "A HomeKit Secure Video recording did not complete"
|
|
100
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"displayName": "Homebridge Eufy
|
|
2
|
+
"displayName": "Homebridge Eufy",
|
|
3
3
|
"name": "@homebridge-plugins/homebridge-eufy-security",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0-beta.1",
|
|
5
5
|
"description": "Control Eufy Security from homebridge.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git://github.com/homebridge-plugins/homebridge-eufy
|
|
10
|
+
"url": "git+https://github.com/homebridge-plugins/homebridge-eufy.git"
|
|
11
11
|
},
|
|
12
12
|
"funding": [
|
|
13
13
|
{
|
|
@@ -16,21 +16,25 @@
|
|
|
16
16
|
}
|
|
17
17
|
],
|
|
18
18
|
"bugs": {
|
|
19
|
-
"url": "https://github.com/homebridge-plugins/homebridge-eufy
|
|
19
|
+
"url": "https://github.com/homebridge-plugins/homebridge-eufy/issues"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=24.5.0",
|
|
23
|
-
"homebridge": "^2.
|
|
23
|
+
"homebridge": "^2.4.0"
|
|
24
24
|
},
|
|
25
25
|
"main": "dist/index.js",
|
|
26
26
|
"scripts": {
|
|
27
|
-
"lint": "prettier --check 'src/**/*.ts'",
|
|
28
|
-
"lint-fix": "prettier --write 'src/**/*.ts'",
|
|
29
|
-
"build": "npm run build-plugin
|
|
27
|
+
"lint": "prettier --check 'src/**/*.ts' 'test/**/*.ts'",
|
|
28
|
+
"lint-fix": "prettier --write 'src/**/*.ts' 'test/**/*.ts'",
|
|
29
|
+
"build": "npm run build-plugin",
|
|
30
30
|
"build-plugin": "rimraf ./dist && tsc",
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
31
|
+
"guard:no-ecs": "bash scripts/guard-no-ecs.sh",
|
|
32
|
+
"qualify:release": "node scripts/qualify-release.mjs",
|
|
33
|
+
"docs:dev": "npm -C docs run dev",
|
|
34
|
+
"docs:build": "npm -C docs run build",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"verify": "npm run lint && npm run guard:no-ecs && npm run build && npm test",
|
|
37
|
+
"prepublishOnly": "npm run build && npm run qualify:release && npm run verify"
|
|
34
38
|
},
|
|
35
39
|
"keywords": [
|
|
36
40
|
"homebridge-plugin",
|
|
@@ -42,21 +46,22 @@
|
|
|
42
46
|
"camera"
|
|
43
47
|
],
|
|
44
48
|
"dependencies": {
|
|
45
|
-
"@homebridge/plugin-ui-utils": "^2.2.
|
|
46
|
-
"eufy-
|
|
47
|
-
"ffmpeg-for-homebridge": "2.2.2"
|
|
48
|
-
"pick-port": "^2.2.1",
|
|
49
|
-
"rotating-file-stream": "^3.2.9",
|
|
50
|
-
"tar": "^7.5.20",
|
|
51
|
-
"tslog": "^4.10.2"
|
|
49
|
+
"@homebridge/plugin-ui-utils": "^2.2.6",
|
|
50
|
+
"@mega-yfue/eufy-sdk": "0.1.0",
|
|
51
|
+
"ffmpeg-for-homebridge": "2.2.2"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@
|
|
55
|
-
"
|
|
56
|
-
"
|
|
54
|
+
"@homebridge/hap-nodejs": "2.2.2",
|
|
55
|
+
"@types/node": "^26.4.1",
|
|
56
|
+
"homebridge": "^2.4.0",
|
|
57
|
+
"prettier": "^3.9.6",
|
|
57
58
|
"rimraf": "^6.1.3",
|
|
58
|
-
"typescript": "^7.0.2"
|
|
59
|
+
"typescript": "^7.0.2",
|
|
60
|
+
"vitest": "^5.0.0"
|
|
59
61
|
},
|
|
60
|
-
"homepage": "https://
|
|
61
|
-
"author": "homebridge-eufy
|
|
62
|
+
"homepage": "https://homebridge-plugins.github.io/homebridge-eufy/",
|
|
63
|
+
"author": "homebridge-eufy",
|
|
64
|
+
"allowScripts": {
|
|
65
|
+
"ffmpeg-for-homebridge@2.2.2": true
|
|
66
|
+
}
|
|
62
67
|
}
|
package/.claude/CLAUDE.md
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with the homebridge-eufy-security plugin.
|
|
4
|
-
|
|
5
|
-
## Project Overview
|
|
6
|
-
|
|
7
|
-
Homebridge plugin that exposes Eufy Security devices to Apple HomeKit. Published as `@homebridge-plugins/homebridge-eufy-security` under the `homebridge-plugins` GitHub organization.
|
|
8
|
-
|
|
9
|
-
Depends on `eufy-security-client` (upstream: bropat/eufy-security-client) for cloud API, P2P, push notifications, and MQTT communication.
|
|
10
|
-
|
|
11
|
-
For detailed functional requirements, device coverage, configuration options, and architecture boundaries, see `.claude/PRD.md`.
|
|
12
|
-
|
|
13
|
-
## Build & Dev Commands
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
npm run build # rimraf dist -> tsc -> copy media/ to dist/
|
|
17
|
-
npm run build-plugin # rimraf dist -> tsc (no media copy)
|
|
18
|
-
npm run lint # prettier --check 'src/**/*.ts'
|
|
19
|
-
npm run lint-fix # prettier --write 'src/**/*.ts'
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
- No test suite -- there are no unit or integration tests
|
|
23
|
-
- Output: `dist/`
|
|
24
|
-
- Formatting is enforced by Prettier (`.prettierrc.json`); `npm run lint` fails on any unformatted file -- run `npm run lint-fix` to auto-format
|
|
25
|
-
- ESLint has been removed (typescript-eslint has no TypeScript 7 compatible release); Prettier is the only style gate
|
|
26
|
-
- Run `npm run lint` and `npm run build` before pushing
|
|
27
|
-
|
|
28
|
-
## Architecture
|
|
29
|
-
|
|
30
|
-
Entry point `src/index.ts` registers `EufySecurityPlatform` with Homebridge. The platform class (`src/platform.ts`) is the core -- it initializes the `EufySecurity` client, discovers devices, and creates HomeKit accessories.
|
|
31
|
-
|
|
32
|
-
**Accessory classes** in `src/accessories/` map Eufy device types to HomeKit services:
|
|
33
|
-
- `BaseAccessory.ts` -- root base class (characteristic registration, service pruning)
|
|
34
|
-
- `Device.ts` (`DeviceAccessory`) -- extends `BaseAccessory`; adds sensor/battery services, property helpers
|
|
35
|
-
- `CameraAccessory` -- cameras, doorbells, floodlights (handles streaming delegates); extends `DeviceAccessory`
|
|
36
|
-
- `StationAccessory` -- base stations (security system service for arm/disarm); extends `BaseAccessory` directly
|
|
37
|
-
- `LockAccessory`, `EntrySensorAccessory`, `MotionSensorAccessory`, `SmartDropAccessory` -- extend `DeviceAccessory`
|
|
38
|
-
- `AutoSyncStationAccessory` -- virtual accessory that syncs station guard mode with HomeKit
|
|
39
|
-
|
|
40
|
-
**Streaming pipeline** in `src/controller/`:
|
|
41
|
-
- `streamingDelegate.ts` -- HomeKit camera streaming (FFmpeg-based)
|
|
42
|
-
- `recordingDelegate.ts` -- HomeKit Secure Video recording
|
|
43
|
-
- `snapshotDelegate.ts` -- snapshot handling
|
|
44
|
-
- `LocalLivestreamManager.ts` -- manages P2P livestream sessions
|
|
45
|
-
|
|
46
|
-
**Utilities** in `src/utils/`: logging (`utils.ts`), FFmpeg wrapper (`ffmpeg.ts`), two-way audio (`Talkback.ts`), config schema (`configTypes.ts`), internal interfaces (`interfaces.ts`).
|
|
47
|
-
|
|
48
|
-
**Constants** in `src/settings.ts`: HKSV segment lengths, snapshot cache ages, streaming bitrate headroom, IDR intervals -- reference this when tuning streaming or recording behaviour.
|
|
49
|
-
|
|
50
|
-
**Plugin UI** in `homebridge-ui/`: `server.js` (plain JS, prettier-ignored) handles UI server logic and diagnostics generation. The UI and the plugin runtime (`src/`) are **separate processes** that share state through `accessories.json` on disk (written by `src/utils/accessoriesStore.ts`, read by `homebridge-ui/server.js`). Both independently import `eufy-security-client` types (`DeviceType`, `PropertyName`, `Device`, etc.) -- changes to the device/station record shape must be kept in sync between `accessoriesStore.ts` and `server.js`.
|
|
51
|
-
|
|
52
|
-
### Key source files for device registration and triage
|
|
53
|
-
|
|
54
|
-
- `src/platform.ts` (`register_device`) -- device registration logic; devices can stack multiple capabilities (independent `if` blocks, not `else if`)
|
|
55
|
-
|
|
56
|
-
## Key Technical Details
|
|
57
|
-
|
|
58
|
-
- ESM project (`"type": "module"`, `"module": "NodeNext"`) -- imports must use `.js` extensions (NodeNext resolution requires explicit extensions)
|
|
59
|
-
- TypeScript strict mode, ES2022 target (`noImplicitAny: false` relaxes implicit-any checks)
|
|
60
|
-
- Node.js >=24.5.0 required
|
|
61
|
-
- Homebridge ^2.0.0 (1.x no longer supported)
|
|
62
|
-
- Uses `ffmpeg-for-homebridge` for video transcoding
|
|
63
|
-
- `src/version.ts` is auto-generated at prebuild time -- do not edit manually
|
|
64
|
-
- `prepublishOnly` runs lint + build automatically before `npm publish`
|
|
65
|
-
- For local development, `eufy-security-client` can be pointed to a local path (e.g. `"../eufy-security-client"`)
|
|
66
|
-
|
|
67
|
-
## Git Workflow
|
|
68
|
-
|
|
69
|
-
**IMPORTANT: Create the branch BEFORE editing any files.**
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
# Create dedicated branch from beta before making any changes
|
|
73
|
-
git checkout beta-*.*.* && git pull origin beta-*.*.*
|
|
74
|
-
git checkout -b [fix/feat/chore]/<short-description>
|
|
75
|
-
|
|
76
|
-
# Stage and commit each change individually
|
|
77
|
-
git add <file>
|
|
78
|
-
git commit -m "fix: <concise description of what changed and why>"
|
|
79
|
-
|
|
80
|
-
# Push and create PR
|
|
81
|
-
git push -u origin fix/<short-description>
|
|
82
|
-
gh pr create --base beta-*.*.* --title "<concise title>" --body-file /tmp/pr-body.md
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
- Branch from `beta-*.*.*`, not `master`
|
|
86
|
-
- PR target: `beta-*.*.*`
|
|
87
|
-
- Branch naming: `fix/`, `feat/`, `chore/` prefix
|
|
88
|
-
|
|
89
|
-
### Commit message rules
|
|
90
|
-
|
|
91
|
-
- Single line, no line breaks mid-sentence
|
|
92
|
-
- Describe the **spirit** of the change, not the code diff
|
|
93
|
-
- No Co-Authored-By
|
|
94
|
-
|
|
95
|
-
### PR body
|
|
96
|
-
|
|
97
|
-
- Write to `/tmp/pr-body-<branch>.md` using file creation -- **never** use heredoc (`cat << EOF`) in the terminal (quotes and special characters break it)
|
|
98
|
-
- Describe the **spirit** of the change, not the code diff
|
|
99
|
-
- Concise description of the problem and fix
|
|
100
|
-
- PR body is **not** the release note -- keep it focused on the code change for reviewers
|
|
101
|
-
- No Co-Authored-By
|
|
102
|
-
|
|
103
|
-
### Release notes
|
|
104
|
-
|
|
105
|
-
- Write to `/tmp/release-notes-<version>.md` using file creation
|
|
106
|
-
- **Audience is end users** -- focus on what matters to them: new devices, behaviour changes, removed settings, required actions
|
|
107
|
-
- **Concise, bullet-driven** -- no markdown tables, no verbose paragraphs. Short section intros (1-2 sentences max) followed by bullet lists
|
|
108
|
-
- **No internal milestones** -- don't mention "first GA since X" or beta iteration counts
|
|
109
|
-
- **Structure for a branch** (e.g., `4.4.x`), not a single version:
|
|
110
|
-
- Individual `## v4.4.x` entries at the top with version-specific changes
|
|
111
|
-
- A shared `## What's in 4.4.x` section below covering the full branch
|
|
112
|
-
- **Required actions front and center** -- if users need to change config or upgrade Node.js, say so early and clearly
|
|
113
|
-
- **Tone**: direct, no filler, no emojis
|
|
114
|
-
|
|
115
|
-
### Issue comments
|
|
116
|
-
|
|
117
|
-
- Use `gh issue comment <number> --repo homebridge-plugins/homebridge-eufy-security --body "<message>"`
|
|
118
|
-
- Use first person ("I")
|
|
119
|
-
- Thank the user by @mention
|
|
120
|
-
- Be formal and concise
|
|
121
|
-
- **Audience is end users** -- keep language simple, no internal jargon
|
|
122
|
-
- Don't scope a fix to a specific device when it applies broadly
|
|
123
|
-
- When a fix is merged, check the published beta version (`npm view @homebridge-plugins/homebridge-eufy-security dist-tags`) and mention it in the comment
|
|
124
|
-
|
|
125
|
-
## Dependency Policy -- `eufy-security-client`
|
|
126
|
-
|
|
127
|
-
**CRITICAL:**
|
|
128
|
-
- **`beta-*.*.*` branches** -- use the `dev` dist-tag (`"eufy-security-client": "dev"`)
|
|
129
|
-
- **`master` branch** -- **NEVER** use the `dev` dist-tag. Always use a pinned stable version (e.g. `"^3.7.2"`). Before merging to master, replace `"dev"` with the corresponding stable release version.
|
|
130
|
-
|
|
131
|
-
When updating the `eufy-security-client` version in `package.json`:
|
|
132
|
-
1. Check the upstream changelog and README at https://github.com/bropat/eufy-security-client/blob/master/README.md
|
|
133
|
-
2. Identify breaking changes, new features, or device support changes
|
|
134
|
-
3. Summarize the impact in the PR body
|
|
135
|
-
4. If there are breaking changes, note any required code adjustments
|
|
136
|
-
|
|
137
|
-
## Skills
|
|
138
|
-
|
|
139
|
-
Skills in `.claude/skills/` provide structured workflows for common tasks:
|
|
140
|
-
|
|
141
|
-
| Skill | Purpose |
|
|
142
|
-
|---|---|
|
|
143
|
-
| `planner` | Build a step-by-step action plan with guardrails before coding |
|
|
144
|
-
| `developer` | Execute code changes following an approved plan or direct instructions |
|
|
145
|
-
| `qa` | Verify build, lint, imports, architecture, and git hygiene before pushing |
|
|
146
|
-
| `architect` | Quick codebase questions, mini-bug debugging, workflow improvement |
|
|
147
|
-
| `support` | Triage GitHub issues using diagnostics archives and logs |
|
|
148
|
-
| `new-device-support` | Full workflow to add a new Eufy device type across both repos |
|
|
149
|
-
|
|
150
|
-
Typical flow: **planner** -> **developer** -> **qa**. Use **architect** for exploration and **support** for issue triage.
|
|
151
|
-
|
|
152
|
-
## Diagnostic Triage
|
|
153
|
-
|
|
154
|
-
For issue triage, use the `support` skill with an issue number (e.g. `/support 423`). For the full triage reference, see `.github/prompts/diag-triage.prompt.md`. For adding new device types, use the `new-device-support` skill. Key points:
|
|
155
|
-
|
|
156
|
-
- Diagnostics archives are encrypted (RSA-4096 + AES-256-GCM); decrypt with `node scripts/decrypt-diagnostics.mjs <file>.tar.gz`
|
|
157
|
-
- Always check archive completeness before analysis -- missing runtime logs means the plugin wasn't running
|
|
158
|
-
- When diagnostics are incomplete or debug is disabled, ask the user to upgrade to the latest [beta](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Special-Version-(BETA---RC---HKSV)) and follow the [Basic Troubleshooting](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Basic-Troubleshooting) steps to enable Detailed Logging, reproduce the issue, and re-export diagnostics
|
|
159
|
-
- Narrow down whether the issue is in `homebridge-eufy-security` (accessory registration, HomeKit mapping, config handling) or in `eufy-security-client` (device discovery, property events, P2P, push notifications)
|
|
160
|
-
- If the environment indicates HOOBS: label `hoobs` + `wontfix` and close -- HOOBS is not supported
|
|
161
|
-
|
|
162
|
-
### Label recommendations
|
|
163
|
-
|
|
164
|
-
| Label | When to use |
|
|
165
|
-
|---|---|
|
|
166
|
-
| `depends on eufy-security-client` | Issue originates in bropat's eufy-security-client library |
|
|
167
|
-
| `device-support` | New device type support request |
|
|
168
|
-
| `debug log missing` | Diagnostics lack logs or debug mode was disabled |
|
|
169
|
-
| `configuration issue` | Problem caused by user config |
|
|
170
|
-
| `livestream` | Camera livestream, video feed, P2P, RTSP, streaming failures |
|
|
171
|
-
| `question` | Further information is requested |
|
|
172
|
-
| `resolved in beta` | Fix already in current beta |
|
|
173
|
-
| `needs triage` | New issue awaiting initial analysis |
|
|
174
|
-
| `duplicate` | Issue or PR already exists |
|
|
175
|
-
| `hoobs` | HOOBS-specific -- label as `hoobs` + `wontfix` and close |
|
package/.claude/PRD.md
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
# PRD -- homebridge-eufy-security
|
|
2
|
-
|
|
3
|
-
Product Requirements Document for `@homebridge-plugins/homebridge-eufy-security`.
|
|
4
|
-
|
|
5
|
-
## Purpose
|
|
6
|
-
|
|
7
|
-
Expose Eufy Security devices to Apple HomeKit via Homebridge. Users control cameras, doorbells, locks, sensors, base stations, and delivery boxes from the Home app -- including live video, HomeKit Secure Video recording, arm/disarm, and two-way audio.
|
|
8
|
-
|
|
9
|
-
## Target Users
|
|
10
|
-
|
|
11
|
-
Homebridge users with Eufy Security hardware who want native HomeKit integration without Eufy's official HomeKit firmware (limited or unavailable for most devices).
|
|
12
|
-
|
|
13
|
-
## System Requirements
|
|
14
|
-
|
|
15
|
-
| Requirement | Value |
|
|
16
|
-
|---|---|
|
|
17
|
-
| Node.js | >=24.5.0 |
|
|
18
|
-
| Homebridge | ^2.0.0 |
|
|
19
|
-
| Eufy Account | Dedicated guest account (admin accounts blocked) |
|
|
20
|
-
| FFmpeg | Bundled via `ffmpeg-for-homebridge` |
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Functional Requirements
|
|
25
|
-
|
|
26
|
-
### FR-1: Device Discovery & Registration
|
|
27
|
-
|
|
28
|
-
- Connect to Eufy cloud via `eufy-security-client` (cloud API, P2P, push notifications, MQTT)
|
|
29
|
-
- Discover stations and devices automatically on plugin startup
|
|
30
|
-
- Batch device processing with 10-second debounce to avoid thrashing during sync
|
|
31
|
-
- Hot-add/remove devices after initial discovery completes
|
|
32
|
-
- Restore cached accessories across Homebridge restarts
|
|
33
|
-
- Prune stale cached accessories when `cleanCache: true`
|
|
34
|
-
- Devices can stack multiple capabilities (camera + motion sensor + doorbell) via independent registration blocks
|
|
35
|
-
|
|
36
|
-
### FR-2: Camera Streaming
|
|
37
|
-
|
|
38
|
-
#### FR-2.1: Live Streaming
|
|
39
|
-
- P2P direct stream (default, low latency)
|
|
40
|
-
- RTSP stream (opt-in per camera)
|
|
41
|
-
- FFmpeg transcoding to H.264 + AAC-ELD with SRTP encryption
|
|
42
|
-
- Hardware encoder detection: VideoToolbox (macOS), V4L2 (Raspberry Pi), VAAPI/QSV (Linux)
|
|
43
|
-
- Fallback to libx264 software encoding
|
|
44
|
-
- Configurable max resolution, bitrate, frame rate
|
|
45
|
-
- Max concurrent streams per camera (default 2)
|
|
46
|
-
- Configurable livestream duration (default 30s, max 86400s)
|
|
47
|
-
- RTCP keep-alive monitoring with inactivity timeout
|
|
48
|
-
|
|
49
|
-
#### FR-2.2: HomeKit Secure Video (HKSV)
|
|
50
|
-
- Record motion/doorbell events as fMP4 fragments
|
|
51
|
-
- 4-second segment length (HomeKit requirement)
|
|
52
|
-
- 8-second timeshift buffer for pre-motion capture
|
|
53
|
-
- Audio recording (AAC-ELD or AAC-LC per HomeKit config)
|
|
54
|
-
- Snapshot capture during active recording
|
|
55
|
-
- Max 3 segment errors before connection reset
|
|
56
|
-
|
|
57
|
-
#### FR-2.3: Snapshots
|
|
58
|
-
- Four handling modes: AlwaysFresh, Balanced, CloudOnly (default), Auto
|
|
59
|
-
- Intelligent caching with configurable thresholds (fresh: 15s, balanced: 30s)
|
|
60
|
-
- Placeholder images for offline/disabled/unavailable states
|
|
61
|
-
- Cloud snapshot skip within 30s of livestream capture (prevents quality degradation)
|
|
62
|
-
|
|
63
|
-
#### FR-2.4: Two-Way Audio (Talkback)
|
|
64
|
-
- Bidirectional audio via duplex stream
|
|
65
|
-
- Caches audio data until device is ready
|
|
66
|
-
- 2-second silence auto-stop
|
|
67
|
-
- Configurable channel count (mono default)
|
|
68
|
-
|
|
69
|
-
### FR-3: Security System (Stations)
|
|
70
|
-
|
|
71
|
-
- Map Eufy guard modes to HomeKit security states (Stay, Away, Night, Off)
|
|
72
|
-
- Per-station guard mode mapping (configurable numeric mode values)
|
|
73
|
-
- Manual alarm trigger with configurable duration and HomeKit mode filter
|
|
74
|
-
- Alarm arm delay and alarm event handling via push notifications
|
|
75
|
-
- Multi-station sync via virtual AutoSyncStationAccessory (opt-in)
|
|
76
|
-
|
|
77
|
-
### FR-4: Locks
|
|
78
|
-
|
|
79
|
-
- Lock/unlock control via HomeKit LockMechanism service
|
|
80
|
-
- Lock jammed state detection via push notifications
|
|
81
|
-
- Lock management service (auto-security timeout, admin-only access)
|
|
82
|
-
|
|
83
|
-
### FR-5: Sensors
|
|
84
|
-
|
|
85
|
-
#### FR-5.1: Motion Sensors
|
|
86
|
-
- Standalone motion detection service
|
|
87
|
-
- Camera-integrated motion with configurable timeout
|
|
88
|
-
- Multi-event support: person, pet, vehicle, sound, crying, dog, stranger
|
|
89
|
-
|
|
90
|
-
#### FR-5.2: Entry Sensors (Contact Sensors)
|
|
91
|
-
- Door/window open/closed state
|
|
92
|
-
|
|
93
|
-
### FR-6: Doorbells
|
|
94
|
-
|
|
95
|
-
- ProgrammableSwitchEvent on ring
|
|
96
|
-
- Optional motion-triggers-doorbell mode
|
|
97
|
-
- Optional indoor chime control switch
|
|
98
|
-
- Snapshot delay on doorbell ring (configurable)
|
|
99
|
-
|
|
100
|
-
### FR-7: Floodlights
|
|
101
|
-
|
|
102
|
-
- Lightbulb service for floodlight control
|
|
103
|
-
- Combined camera + light capabilities
|
|
104
|
-
|
|
105
|
-
### FR-8: Smart Drop (Package Boxes)
|
|
106
|
-
|
|
107
|
-
- One-way open via LockMechanism
|
|
108
|
-
- Package delivery detection via ContactSensor
|
|
109
|
-
|
|
110
|
-
### FR-9: Per-Device Switches
|
|
111
|
-
|
|
112
|
-
- Enable/disable device switch
|
|
113
|
-
- Motion detection toggle switch
|
|
114
|
-
- Light control switch (floodlights)
|
|
115
|
-
- Indoor chime toggle switch
|
|
116
|
-
- All switches individually configurable per camera
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## Configuration Requirements
|
|
121
|
-
|
|
122
|
-
### CR-1: Global Configuration
|
|
123
|
-
- Eufy credentials (username, password, device name)
|
|
124
|
-
- Country code (ISO 3166-1 alpha-2)
|
|
125
|
-
- Polling interval (default 10 minutes)
|
|
126
|
-
- Global guard mode mapping (hkHome, hkAway, hkNight, hkOff)
|
|
127
|
-
- Device/station ignore lists by serial number
|
|
128
|
-
- Debug logging toggle (`enableDetailedLogging`)
|
|
129
|
-
- Log file opt-out (`omitLogFiles`)
|
|
130
|
-
- Cache cleanup toggle (`cleanCache`, default true)
|
|
131
|
-
- Auto-sync station mode toggle
|
|
132
|
-
- Embedded PKCS1 support toggle (Node.js <24.5 workaround)
|
|
133
|
-
|
|
134
|
-
### CR-2: Per-Camera Configuration
|
|
135
|
-
- Stream source: P2P or RTSP
|
|
136
|
-
- Enable/disable camera streaming entirely
|
|
137
|
-
- Snapshot handling method (AlwaysFresh, Balanced, CloudOnly, Auto)
|
|
138
|
-
- Audio enable/disable
|
|
139
|
-
- Talkback enable/disable with channel count
|
|
140
|
-
- HKSV recording duration
|
|
141
|
-
- Motion timeout
|
|
142
|
-
- Per-switch visibility (enable, motion, light, indoor chime)
|
|
143
|
-
- Full FFmpeg video config override (codec, resolution, bitrate, filters, encoder options, custom binary path)
|
|
144
|
-
|
|
145
|
-
### CR-3: Per-Station Configuration
|
|
146
|
-
- Guard mode mapping overrides (hkHome, hkAway, hkNight, hkOff)
|
|
147
|
-
- Manual alarm trigger modes and duration
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
## Plugin UI Requirements
|
|
152
|
-
|
|
153
|
-
### UI-1: Device Discovery
|
|
154
|
-
- Login flow with TFA and captcha support
|
|
155
|
-
- Discovery progress reporting (authenticating, queuing, processing, done)
|
|
156
|
-
- Skip button for unsupported device intel wait
|
|
157
|
-
- Admin account detection and blocking
|
|
158
|
-
|
|
159
|
-
### UI-2: Device Management
|
|
160
|
-
- Display discovered stations and devices with type, capabilities, power status
|
|
161
|
-
- Show unsupported devices separately
|
|
162
|
-
- Detect running plugin via heartbeat (accessories.json `storedAt` < 90s old)
|
|
163
|
-
- Load stored accessories from cache when plugin is not running
|
|
164
|
-
|
|
165
|
-
### UI-3: Diagnostics
|
|
166
|
-
- Generate encrypted diagnostics archive (RSA-4096 + AES-256-GCM)
|
|
167
|
-
- Rate-limited to 60-second minimum between downloads
|
|
168
|
-
- Archive includes: config (sanitized), all log files, accessories.json, system info
|
|
169
|
-
- Decryptable via `node scripts/decrypt-diagnostics.mjs`
|
|
170
|
-
|
|
171
|
-
### UI-4: Storage Management
|
|
172
|
-
- Reset plugin storage (persistent.json, accessories.json)
|
|
173
|
-
- Clean all storage option
|
|
174
|
-
- System info endpoint (plugin version, Node.js version, host OS)
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
## Non-Functional Requirements
|
|
179
|
-
|
|
180
|
-
### NFR-1: Logging
|
|
181
|
-
- Rotating file streams (daily rotation, max 3 archives, 200MB limit)
|
|
182
|
-
- Styled console output (color-coded by level)
|
|
183
|
-
- Debug mode adds file:line references and library-level logging
|
|
184
|
-
- Separate log streams: plugin, library, UI server, UI library, FFmpeg (global + per-camera + snapshots)
|
|
185
|
-
|
|
186
|
-
### NFR-2: Reliability
|
|
187
|
-
- Connection retry (3 attempts, 30s backoff) on Eufy cloud failure
|
|
188
|
-
- P2P stream retry with exponential backoff (2-10s, max 3 attempts, 15s timeout per attempt)
|
|
189
|
-
- Multi-consumer stream sharing via reference counting (streaming, recording, snapshots share one P2P connection)
|
|
190
|
-
- 5-second grace period before stopping shared P2P stream
|
|
191
|
-
- Node.js MaxListeners raised to 30 for multi-camera setups
|
|
192
|
-
- fMP4 box validation (max 50MB per box) during HKSV recording
|
|
193
|
-
|
|
194
|
-
### NFR-3: Compatibility
|
|
195
|
-
- ESM module (`"type": "module"`, `"module": "NodeNext"`)
|
|
196
|
-
- TypeScript strict mode, ES2022 target
|
|
197
|
-
- PKCS1 padding workaround for Node.js 20/22 (restored natively in Node.js 24.5+)
|
|
198
|
-
- Hardware codec probing at startup with graceful software fallback
|
|
199
|
-
|
|
200
|
-
### NFR-4: Security
|
|
201
|
-
- Encrypted credential persistence (never logged)
|
|
202
|
-
- Guest account enforcement (admin account usage blocked)
|
|
203
|
-
- TFA/captcha graceful handling with shutdown and re-auth prompt
|
|
204
|
-
- Diagnostics archives encrypted before export
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## Architecture Boundaries
|
|
209
|
-
|
|
210
|
-
### homebridge-eufy-security (this plugin)
|
|
211
|
-
- Accessory registration and HomeKit service mapping
|
|
212
|
-
- FFmpeg transcoding pipeline
|
|
213
|
-
- Configuration handling and validation
|
|
214
|
-
- Plugin UI (device discovery, diagnostics, storage management)
|
|
215
|
-
- accessories.json persistence for UI communication
|
|
216
|
-
|
|
217
|
-
### eufy-security-client (upstream dependency)
|
|
218
|
-
- Eufy cloud API authentication and communication
|
|
219
|
-
- P2P connection establishment and stream management
|
|
220
|
-
- Push notification and MQTT event handling
|
|
221
|
-
- Device type classification and property management
|
|
222
|
-
- Command execution (arm/disarm, lock/unlock, etc.)
|
|
223
|
-
|
|
224
|
-
Issues must be triaged to the correct layer. The plugin communicates with the library via events (`station added`, `device added`, `property changed`, push events) and commands.
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
## Device Type Coverage
|
|
229
|
-
|
|
230
|
-
| Category | HomeKit Services |
|
|
231
|
-
|---|---|
|
|
232
|
-
| Cameras | CameraRTPStreamManagement, MotionSensor, optional Switches |
|
|
233
|
-
| Doorbells | Doorbell + Camera services, ProgrammableSwitchEvent |
|
|
234
|
-
| Floodlights | Camera + Lightbulb services |
|
|
235
|
-
| Base Stations | SecuritySystem (arm/disarm), optional manual alarm Switch |
|
|
236
|
-
| Smart Locks | LockMechanism, LockManagement |
|
|
237
|
-
| Entry Sensors | ContactSensor |
|
|
238
|
-
| Motion Sensors | MotionSensor |
|
|
239
|
-
| Smart Drop | LockMechanism (open-only), ContactSensor (package detect) |
|
|
240
|
-
| Video Locks | Camera + Lock services (LockWifiVideo) |
|
|
241
|
-
| Auto-Sync Station | Virtual SecuritySystem syncing multiple stations |
|