@homebridge-plugins/homebridge-eufy-security 4.7.1 → 5.0.0-beta.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.
Files changed (469) hide show
  1. package/AUTHORS +4 -0
  2. package/CODE_OF_CONDUCT.md +30 -0
  3. package/CONTRIBUTING.md +77 -0
  4. package/README.md +152 -49
  5. package/SECURITY.md +30 -0
  6. package/config.schema.json +92 -3
  7. package/dist/account/ownership.js +290 -0
  8. package/dist/account/ownership.js.map +1 -0
  9. package/dist/account/persistence.js +274 -0
  10. package/dist/account/persistence.js.map +1 -0
  11. package/dist/account/temporary-authentication.js +348 -0
  12. package/dist/account/temporary-authentication.js.map +1 -0
  13. package/dist/configuration.js +167 -0
  14. package/dist/configuration.js.map +1 -0
  15. package/dist/device/member-evidence.js +66 -0
  16. package/dist/device/member-evidence.js.map +1 -0
  17. package/dist/device/member-trust.js +114 -0
  18. package/dist/device/member-trust.js.map +1 -0
  19. package/dist/device/snapshot.js +190 -0
  20. package/dist/device/snapshot.js.map +1 -0
  21. package/dist/diagnostics.js +2218 -0
  22. package/dist/diagnostics.js.map +1 -0
  23. package/dist/homekit/adapter.js +2 -0
  24. package/dist/homekit/adapter.js.map +1 -0
  25. package/dist/homekit/adapters/battery.js +208 -0
  26. package/dist/homekit/adapters/battery.js.map +1 -0
  27. package/dist/homekit/adapters/camera-controls.js +527 -0
  28. package/dist/homekit/adapters/camera-controls.js.map +1 -0
  29. package/dist/homekit/adapters/camera-streaming.js +1515 -0
  30. package/dist/homekit/adapters/camera-streaming.js.map +1 -0
  31. package/dist/homekit/adapters/contact.js +138 -0
  32. package/dist/homekit/adapters/contact.js.map +1 -0
  33. package/dist/homekit/adapters/doorbell.js +57 -0
  34. package/dist/homekit/adapters/doorbell.js.map +1 -0
  35. package/dist/homekit/adapters/information.js +55 -0
  36. package/dist/homekit/adapters/information.js.map +1 -0
  37. package/dist/homekit/adapters/lock.js +489 -0
  38. package/dist/homekit/adapters/lock.js.map +1 -0
  39. package/dist/homekit/adapters/motion.js +100 -0
  40. package/dist/homekit/adapters/motion.js.map +1 -0
  41. package/dist/homekit/adapters/registry.js +26 -0
  42. package/dist/homekit/adapters/registry.js.map +1 -0
  43. package/dist/homekit/adapters/security-system.js +425 -0
  44. package/dist/homekit/adapters/security-system.js.map +1 -0
  45. package/dist/homekit/adapters/siren.js +136 -0
  46. package/dist/homekit/adapters/siren.js.map +1 -0
  47. package/dist/homekit/adapters/smart-light.js +662 -0
  48. package/dist/homekit/adapters/smart-light.js.map +1 -0
  49. package/dist/homekit/coverage-matrix.js +119 -0
  50. package/dist/homekit/coverage-matrix.js.map +1 -0
  51. package/dist/homekit/device-control.js +175 -0
  52. package/dist/homekit/device-control.js.map +1 -0
  53. package/dist/homekit/reconciler.js +319 -0
  54. package/dist/homekit/reconciler.js.map +1 -0
  55. package/dist/homekit/representation.js +23 -0
  56. package/dist/homekit/representation.js.map +1 -0
  57. package/dist/index.js +4 -9
  58. package/dist/index.js.map +1 -1
  59. package/dist/media/contracts.js +2 -0
  60. package/dist/media/contracts.js.map +1 -0
  61. package/dist/media/last-successful-image.js +208 -0
  62. package/dist/media/last-successful-image.js.map +1 -0
  63. package/dist/media/live-stream.js +1003 -0
  64. package/dist/media/live-stream.js.map +1 -0
  65. package/dist/media/recording.js +560 -0
  66. package/dist/media/recording.js.map +1 -0
  67. package/dist/media/session-budget.js +39 -0
  68. package/dist/media/session-budget.js.map +1 -0
  69. package/dist/media/snapshot.js +406 -0
  70. package/dist/media/snapshot.js.map +1 -0
  71. package/dist/media/station-live-sessions.js +101 -0
  72. package/dist/media/station-live-sessions.js.map +1 -0
  73. package/dist/platform.js +97 -769
  74. package/dist/platform.js.map +1 -1
  75. package/dist/runtime/channel.js +375 -0
  76. package/dist/runtime/channel.js.map +1 -0
  77. package/dist/runtime/owner.js +682 -0
  78. package/dist/runtime/owner.js.map +1 -0
  79. package/dist/runtime/sdk-client.js +211 -0
  80. package/dist/runtime/sdk-client.js.map +1 -0
  81. package/dist/runtime/tracker.js +211 -0
  82. package/dist/runtime/tracker.js.map +1 -0
  83. package/dist/settings.js +1 -43
  84. package/dist/settings.js.map +1 -1
  85. package/dist/storage.js +59 -0
  86. package/dist/storage.js.map +1 -0
  87. package/dist/ui/dashboard.js +181 -0
  88. package/dist/ui/dashboard.js.map +1 -0
  89. package/dist/ui/device-image.js +22 -0
  90. package/dist/ui/device-image.js.map +1 -0
  91. package/dist/ui/runtime-channel-client.js +305 -0
  92. package/dist/ui/runtime-channel-client.js.map +1 -0
  93. package/dist/ui/server.js +259 -0
  94. package/dist/ui/server.js.map +1 -0
  95. package/homebridge-ui/public/app.css +1902 -0
  96. package/homebridge-ui/public/assets/devices/clean/clean-T1250.webp +0 -0
  97. package/homebridge-ui/public/assets/devices/clean/clean-T2070.webp +0 -0
  98. package/homebridge-ui/public/assets/devices/clean/clean-T2080.webp +0 -0
  99. package/homebridge-ui/public/assets/devices/clean/clean-T2081.webp +0 -0
  100. package/homebridge-ui/public/assets/devices/clean/clean-T2103.webp +0 -0
  101. package/homebridge-ui/public/assets/devices/clean/clean-T2117.webp +0 -0
  102. package/homebridge-ui/public/assets/devices/clean/clean-T2118.webp +0 -0
  103. package/homebridge-ui/public/assets/devices/clean/clean-T2119.webp +0 -0
  104. package/homebridge-ui/public/assets/devices/clean/clean-T211A.webp +0 -0
  105. package/homebridge-ui/public/assets/devices/clean/clean-T2120.webp +0 -0
  106. package/homebridge-ui/public/assets/devices/clean/clean-T2123.webp +0 -0
  107. package/homebridge-ui/public/assets/devices/clean/clean-T2128.webp +0 -0
  108. package/homebridge-ui/public/assets/devices/clean/clean-T2130.webp +0 -0
  109. package/homebridge-ui/public/assets/devices/clean/clean-T2132.webp +0 -0
  110. package/homebridge-ui/public/assets/devices/clean/clean-T2150.webp +0 -0
  111. package/homebridge-ui/public/assets/devices/clean/clean-T2181.webp +0 -0
  112. package/homebridge-ui/public/assets/devices/clean/clean-T2182.webp +0 -0
  113. package/homebridge-ui/public/assets/devices/clean/clean-T2190.webp +0 -0
  114. package/homebridge-ui/public/assets/devices/clean/clean-T2192.webp +0 -0
  115. package/homebridge-ui/public/assets/devices/clean/clean-T2193.webp +0 -0
  116. package/homebridge-ui/public/assets/devices/clean/clean-T2194.webp +0 -0
  117. package/homebridge-ui/public/assets/devices/clean/clean-T2210.webp +0 -0
  118. package/homebridge-ui/public/assets/devices/clean/clean-T2250.webp +0 -0
  119. package/homebridge-ui/public/assets/devices/clean/clean-T2251.webp +0 -0
  120. package/homebridge-ui/public/assets/devices/clean/clean-T2252.webp +0 -0
  121. package/homebridge-ui/public/assets/devices/clean/clean-T2253.webp +0 -0
  122. package/homebridge-ui/public/assets/devices/clean/clean-T2254.webp +0 -0
  123. package/homebridge-ui/public/assets/devices/clean/clean-T2255.webp +0 -0
  124. package/homebridge-ui/public/assets/devices/clean/clean-T2256.webp +0 -0
  125. package/homebridge-ui/public/assets/devices/clean/clean-T2257.webp +0 -0
  126. package/homebridge-ui/public/assets/devices/clean/clean-T2258.webp +0 -0
  127. package/homebridge-ui/public/assets/devices/clean/clean-T2259.webp +0 -0
  128. package/homebridge-ui/public/assets/devices/clean/clean-T2261.webp +0 -0
  129. package/homebridge-ui/public/assets/devices/clean/clean-T2262.webp +0 -0
  130. package/homebridge-ui/public/assets/devices/clean/clean-T2266.webp +0 -0
  131. package/homebridge-ui/public/assets/devices/clean/clean-T2267.webp +0 -0
  132. package/homebridge-ui/public/assets/devices/clean/clean-T2268.webp +0 -0
  133. package/homebridge-ui/public/assets/devices/clean/clean-T2270.webp +0 -0
  134. package/homebridge-ui/public/assets/devices/clean/clean-T2272.webp +0 -0
  135. package/homebridge-ui/public/assets/devices/clean/clean-T2273.webp +0 -0
  136. package/homebridge-ui/public/assets/devices/clean/clean-T2276.webp +0 -0
  137. package/homebridge-ui/public/assets/devices/clean/clean-T2277.webp +0 -0
  138. package/homebridge-ui/public/assets/devices/clean/clean-T2278.webp +0 -0
  139. package/homebridge-ui/public/assets/devices/clean/clean-T2280.webp +0 -0
  140. package/homebridge-ui/public/assets/devices/clean/clean-T2292.webp +0 -0
  141. package/homebridge-ui/public/assets/devices/clean/clean-T2320.webp +0 -0
  142. package/homebridge-ui/public/assets/devices/clean/clean-T2351.webp +0 -0
  143. package/homebridge-ui/public/assets/devices/clean/clean-T2352.webp +0 -0
  144. package/homebridge-ui/public/assets/devices/clean/clean-T2353.webp +0 -0
  145. package/homebridge-ui/public/assets/devices/life/life-T8L00.webp +0 -0
  146. package/homebridge-ui/public/assets/devices/life/life-T8L01.webp +0 -0
  147. package/homebridge-ui/public/assets/devices/life/life-T8L02.webp +0 -0
  148. package/homebridge-ui/public/assets/devices/life/life-T8L04.webp +0 -0
  149. package/homebridge-ui/public/assets/devices/life/life-T8L10.webp +0 -0
  150. package/homebridge-ui/public/assets/devices/life/life-T8L20.webp +0 -0
  151. package/homebridge-ui/public/assets/devices/life/life-T8L30.webp +0 -0
  152. package/homebridge-ui/public/assets/devices/life/life-T8L40.webp +0 -0
  153. package/homebridge-ui/public/assets/devices/mower/mower-T2801.webp +0 -0
  154. package/homebridge-ui/public/assets/devices/mower/mower-T280B.webp +0 -0
  155. package/homebridge-ui/public/assets/devices/mower/mower-T2880.webp +0 -0
  156. package/homebridge-ui/public/assets/devices/security/security-T7400.webp +0 -0
  157. package/homebridge-ui/public/assets/devices/security/security-T7401.webp +0 -0
  158. package/homebridge-ui/public/assets/devices/security/security-T8001.webp +0 -0
  159. package/homebridge-ui/public/assets/devices/security/security-T8002.webp +0 -0
  160. package/homebridge-ui/public/assets/devices/security/security-T8010.webp +0 -0
  161. package/homebridge-ui/public/assets/devices/security/security-T8021.webp +0 -0
  162. package/homebridge-ui/public/assets/devices/security/security-T8023.webp +0 -0
  163. package/homebridge-ui/public/assets/devices/security/security-T8025.webp +0 -0
  164. package/homebridge-ui/public/assets/devices/security/security-T8030.webp +0 -0
  165. package/homebridge-ui/public/assets/devices/security/security-T8110.webp +0 -0
  166. package/homebridge-ui/public/assets/devices/security/security-T8111.webp +0 -0
  167. package/homebridge-ui/public/assets/devices/security/security-T8112.webp +0 -0
  168. package/homebridge-ui/public/assets/devices/security/security-T8113.webp +0 -0
  169. package/homebridge-ui/public/assets/devices/security/security-T8114.webp +0 -0
  170. package/homebridge-ui/public/assets/devices/security/security-T8122.webp +0 -0
  171. package/homebridge-ui/public/assets/devices/security/security-T8123.webp +0 -0
  172. package/homebridge-ui/public/assets/devices/security/security-T8124.webp +0 -0
  173. package/homebridge-ui/public/assets/devices/security/security-T8130.webp +0 -0
  174. package/homebridge-ui/public/assets/devices/security/security-T8131.webp +0 -0
  175. package/homebridge-ui/public/assets/devices/security/security-T8134.webp +0 -0
  176. package/homebridge-ui/public/assets/devices/security/security-T8140.webp +0 -0
  177. package/homebridge-ui/public/assets/devices/security/security-T8141.webp +0 -0
  178. package/homebridge-ui/public/assets/devices/security/security-T8150.webp +0 -0
  179. package/homebridge-ui/public/assets/devices/security/security-T8151.webp +0 -0
  180. package/homebridge-ui/public/assets/devices/security/security-T8152.webp +0 -0
  181. package/homebridge-ui/public/assets/devices/security/security-T8153.webp +0 -0
  182. package/homebridge-ui/public/assets/devices/security/security-T8160.webp +0 -0
  183. package/homebridge-ui/public/assets/devices/security/security-T8161.webp +0 -0
  184. package/homebridge-ui/public/assets/devices/security/security-T8162.webp +0 -0
  185. package/homebridge-ui/public/assets/devices/security/security-T8170.webp +0 -0
  186. package/homebridge-ui/public/assets/devices/security/security-T8171.webp +0 -0
  187. package/homebridge-ui/public/assets/devices/security/security-T8172.webp +0 -0
  188. package/homebridge-ui/public/assets/devices/security/security-T8173.webp +0 -0
  189. package/homebridge-ui/public/assets/devices/security/security-T8200.webp +0 -0
  190. package/homebridge-ui/public/assets/devices/security/security-T8200X.webp +0 -0
  191. package/homebridge-ui/public/assets/devices/security/security-T8201.webp +0 -0
  192. package/homebridge-ui/public/assets/devices/security/security-T8203.webp +0 -0
  193. package/homebridge-ui/public/assets/devices/security/security-T8210.webp +0 -0
  194. package/homebridge-ui/public/assets/devices/security/security-T8213.webp +0 -0
  195. package/homebridge-ui/public/assets/devices/security/security-T8214.webp +0 -0
  196. package/homebridge-ui/public/assets/devices/security/security-T8222.webp +0 -0
  197. package/homebridge-ui/public/assets/devices/security/security-T8400.webp +0 -0
  198. package/homebridge-ui/public/assets/devices/security/security-T8401.webp +0 -0
  199. package/homebridge-ui/public/assets/devices/security/security-T8410.webp +0 -0
  200. package/homebridge-ui/public/assets/devices/security/security-T8411.webp +0 -0
  201. package/homebridge-ui/public/assets/devices/security/security-T8414.webp +0 -0
  202. package/homebridge-ui/public/assets/devices/security/security-T8416.webp +0 -0
  203. package/homebridge-ui/public/assets/devices/security/security-T8417.webp +0 -0
  204. package/homebridge-ui/public/assets/devices/security/security-T8419.webp +0 -0
  205. package/homebridge-ui/public/assets/devices/security/security-T8419N.webp +0 -0
  206. package/homebridge-ui/public/assets/devices/security/security-T8420.webp +0 -0
  207. package/homebridge-ui/public/assets/devices/security/security-T8420X.webp +0 -0
  208. package/homebridge-ui/public/assets/devices/security/security-T8422.webp +0 -0
  209. package/homebridge-ui/public/assets/devices/security/security-T8423.webp +0 -0
  210. package/homebridge-ui/public/assets/devices/security/security-T8424.webp +0 -0
  211. package/homebridge-ui/public/assets/devices/security/security-T8425.webp +0 -0
  212. package/homebridge-ui/public/assets/devices/security/security-T8441.webp +0 -0
  213. package/homebridge-ui/public/assets/devices/security/security-T8442.webp +0 -0
  214. package/homebridge-ui/public/assets/devices/security/security-T8452.webp +0 -0
  215. package/homebridge-ui/public/assets/devices/security/security-T84A0.webp +0 -0
  216. package/homebridge-ui/public/assets/devices/security/security-T84A1.webp +0 -0
  217. package/homebridge-ui/public/assets/devices/security/security-T8500.webp +0 -0
  218. package/homebridge-ui/public/assets/devices/security/security-T8502.webp +0 -0
  219. package/homebridge-ui/public/assets/devices/security/security-T8503.webp +0 -0
  220. package/homebridge-ui/public/assets/devices/security/security-T8504.webp +0 -0
  221. package/homebridge-ui/public/assets/devices/security/security-T8506.webp +0 -0
  222. package/homebridge-ui/public/assets/devices/security/security-T8510.webp +0 -0
  223. package/homebridge-ui/public/assets/devices/security/security-T8510P.webp +0 -0
  224. package/homebridge-ui/public/assets/devices/security/security-T8520.webp +0 -0
  225. package/homebridge-ui/public/assets/devices/security/security-T8520P.webp +0 -0
  226. package/homebridge-ui/public/assets/devices/security/security-T8530.webp +0 -0
  227. package/homebridge-ui/public/assets/devices/security/security-T8531.webp +0 -0
  228. package/homebridge-ui/public/assets/devices/security/security-T85D0.webp +0 -0
  229. package/homebridge-ui/public/assets/devices/security/security-T85L0.webp +0 -0
  230. package/homebridge-ui/public/assets/devices/security/security-T85P0.webp +0 -0
  231. package/homebridge-ui/public/assets/devices/security/security-T85V0.webp +0 -0
  232. package/homebridge-ui/public/assets/devices/security/security-T8600.webp +0 -0
  233. package/homebridge-ui/public/assets/devices/security/security-T86P2.webp +0 -0
  234. package/homebridge-ui/public/assets/devices/security/security-T8790.webp +0 -0
  235. package/homebridge-ui/public/assets/devices/security/security-T87B0.webp +0 -0
  236. package/homebridge-ui/public/assets/devices/security/security-T87B2.webp +0 -0
  237. package/homebridge-ui/public/assets/devices/security/security-T8900.webp +0 -0
  238. package/homebridge-ui/public/assets/devices/security/security-T8910.webp +0 -0
  239. package/homebridge-ui/public/assets/devices/security/security-T8920.webp +0 -0
  240. package/homebridge-ui/public/assets/devices/security/security-T8960.webp +0 -0
  241. package/homebridge-ui/public/assets/devices/security/security-T8B0.webp +0 -0
  242. package/homebridge-ui/public/assets/devices/security/security-T8E00.webp +0 -0
  243. package/homebridge-ui/public/assets/devices/security/security-T8N00.webp +0 -0
  244. package/homebridge-ui/public/assets/devices/security/security-T8W11C.webp +0 -0
  245. package/homebridge-ui/public/assets/devices/security/security-T90F0.webp +0 -0
  246. package/homebridge-ui/public/assets/devices/security/security-T90M0.webp +0 -0
  247. package/homebridge-ui/public/assets/devices/security/security-T90R0.webp +0 -0
  248. package/homebridge-ui/public/assets/devices/security/security-T90S0.webp +0 -0
  249. package/homebridge-ui/public/assets/icons/inventory.svg +1 -1
  250. package/homebridge-ui/public/assets/icons/troubleshoot.svg +1 -0
  251. package/homebridge-ui/public/assets/icons/warning.svg +1 -1
  252. package/homebridge-ui/public/assets/logo-dark.svg +10 -0
  253. package/homebridge-ui/public/assets/logo.svg +10 -0
  254. package/homebridge-ui/public/i18n/en.json +218 -0
  255. package/homebridge-ui/public/i18n/fr.json +218 -0
  256. package/homebridge-ui/public/index.html +377 -28
  257. package/homebridge-ui/public/js/app.js +1065 -0
  258. package/homebridge-ui/public/js/dashboard.js +385 -0
  259. package/homebridge-ui/public/js/legacy-settings.js +37 -0
  260. package/homebridge-ui/public/js/profile-wizard.js +68 -0
  261. package/homebridge-ui/server.js +2 -1393
  262. package/i18n/runtime/en.json +100 -0
  263. package/media/Snapshot-Unavailable.jpg +0 -0
  264. package/media/Snapshot-black.jpg +0 -0
  265. package/media/camera-disabled.jpg +0 -0
  266. package/media/camera-offline.jpg +0 -0
  267. package/package.json +29 -24
  268. package/.claude/CLAUDE.md +0 -175
  269. package/.claude/PRD.md +0 -241
  270. package/.claude/docs/debug-recording-lessons.md +0 -91
  271. package/.claude/docs/hksv-recording-fix.md +0 -160
  272. package/.claude/skills/architect/SKILL.md +0 -76
  273. package/.claude/skills/developer/SKILL.md +0 -59
  274. package/.claude/skills/new-device-support/SKILL.md +0 -212
  275. package/.claude/skills/new-device-support/check-device.mjs +0 -363
  276. package/.claude/skills/new-device-support/map-properties.mjs +0 -450
  277. package/.claude/skills/new-device-support/verify-device.mjs +0 -272
  278. package/.claude/skills/planner/SKILL.md +0 -100
  279. package/.claude/skills/qa/SKILL.md +0 -79
  280. package/.claude/skills/support/SKILL.md +0 -175
  281. package/.prettierignore +0 -7
  282. package/.prettierrc.json +0 -7
  283. package/FUNDING.yml +0 -1
  284. package/dist/accessories/AutoSyncStationAccessory.js +0 -157
  285. package/dist/accessories/AutoSyncStationAccessory.js.map +0 -1
  286. package/dist/accessories/BaseAccessory.js +0 -261
  287. package/dist/accessories/BaseAccessory.js.map +0 -1
  288. package/dist/accessories/CameraAccessory.js +0 -431
  289. package/dist/accessories/CameraAccessory.js.map +0 -1
  290. package/dist/accessories/Device.js +0 -65
  291. package/dist/accessories/Device.js.map +0 -1
  292. package/dist/accessories/EntrySensorAccessory.js +0 -48
  293. package/dist/accessories/EntrySensorAccessory.js.map +0 -1
  294. package/dist/accessories/LockAccessory.js +0 -142
  295. package/dist/accessories/LockAccessory.js.map +0 -1
  296. package/dist/accessories/MotionSensorAccessory.js +0 -48
  297. package/dist/accessories/MotionSensorAccessory.js.map +0 -1
  298. package/dist/accessories/SmartDropAccessory.js +0 -141
  299. package/dist/accessories/SmartDropAccessory.js.map +0 -1
  300. package/dist/accessories/StationAccessory.js +0 -373
  301. package/dist/accessories/StationAccessory.js.map +0 -1
  302. package/dist/config.js +0 -26
  303. package/dist/config.js.map +0 -1
  304. package/dist/controller/DebugRecordingManager.js +0 -402
  305. package/dist/controller/DebugRecordingManager.js.map +0 -1
  306. package/dist/controller/LocalLivestreamManager.js +0 -371
  307. package/dist/controller/LocalLivestreamManager.js.map +0 -1
  308. package/dist/controller/recordingDelegate.js +0 -252
  309. package/dist/controller/recordingDelegate.js.map +0 -1
  310. package/dist/controller/snapshotDelegate.js +0 -348
  311. package/dist/controller/snapshotDelegate.js.map +0 -1
  312. package/dist/controller/streamingDelegate.js +0 -389
  313. package/dist/controller/streamingDelegate.js.map +0 -1
  314. package/dist/interfaces.js +0 -2
  315. package/dist/interfaces.js.map +0 -1
  316. package/dist/media/Snapshot-Unavailable.png +0 -0
  317. package/dist/media/Snapshot-Unavailable.xcf +0 -0
  318. package/dist/media/Snapshot-black.png +0 -0
  319. package/dist/media/camera-disabled.png +0 -0
  320. package/dist/media/camera-offline.png +0 -0
  321. package/dist/media/media/Snapshot-Unavailable.png +0 -0
  322. package/dist/media/media/Snapshot-Unavailable.xcf +0 -0
  323. package/dist/media/media/Snapshot-black.png +0 -0
  324. package/dist/media/media/camera-disabled.png +0 -0
  325. package/dist/media/media/camera-offline.png +0 -0
  326. package/dist/utils/Talkback.js +0 -162
  327. package/dist/utils/Talkback.js.map +0 -1
  328. package/dist/utils/accessoriesStore.js +0 -207
  329. package/dist/utils/accessoriesStore.js.map +0 -1
  330. package/dist/utils/configTypes.js +0 -36
  331. package/dist/utils/configTypes.js.map +0 -1
  332. package/dist/utils/ffmpeg.js +0 -1111
  333. package/dist/utils/ffmpeg.js.map +0 -1
  334. package/dist/utils/interfaces.js +0 -8
  335. package/dist/utils/interfaces.js.map +0 -1
  336. package/dist/utils/utils.js +0 -224
  337. package/dist/utils/utils.js.map +0 -1
  338. package/dist/version.js +0 -2
  339. package/dist/version.js.map +0 -1
  340. package/homebridge-eufy-security.png +0 -0
  341. package/homebridge-ui/diagnosticsCrypto.js +0 -112
  342. package/homebridge-ui/public/app.js +0 -237
  343. package/homebridge-ui/public/assets/devices/4g_lte_cam_s330_large.png +0 -0
  344. package/homebridge-ui/public/assets/devices/4g_lte_starlight_large.jpg +0 -0
  345. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C30.png +0 -0
  346. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C31.png +0 -0
  347. package/homebridge-ui/public/assets/devices/batterydoorbell1080p_large.jpg +0 -0
  348. package/homebridge-ui/public/assets/devices/batterydoorbell2k_large.png +0 -0
  349. package/homebridge-ui/public/assets/devices/batterydoorbell2kdual_large.jpg +0 -0
  350. package/homebridge-ui/public/assets/devices/batterydoorbell_e340_large.png +0 -0
  351. package/homebridge-ui/public/assets/devices/eufy-security-client.png +0 -0
  352. package/homebridge-ui/public/assets/devices/eufyCamS4_large.png +0 -0
  353. package/homebridge-ui/public/assets/devices/eufycam2_large.png +0 -0
  354. package/homebridge-ui/public/assets/devices/eufycam2c_large.jpg +0 -0
  355. package/homebridge-ui/public/assets/devices/eufycam2cpro_large.jpg +0 -0
  356. package/homebridge-ui/public/assets/devices/eufycam2pro_large.jpg +0 -0
  357. package/homebridge-ui/public/assets/devices/eufycam3_large.jpg +0 -0
  358. package/homebridge-ui/public/assets/devices/eufycam3c_large.jpg +0 -0
  359. package/homebridge-ui/public/assets/devices/eufycam3pro_large.png +0 -0
  360. package/homebridge-ui/public/assets/devices/eufycam_large.jpg +0 -0
  361. package/homebridge-ui/public/assets/devices/eufycame330_large.jpg +0 -0
  362. package/homebridge-ui/public/assets/devices/flood_freeze_sensor_e20_t90F0_large.png +0 -0
  363. package/homebridge-ui/public/assets/devices/floodlight2_large.jpg +0 -0
  364. package/homebridge-ui/public/assets/devices/floodlight2pro_large.jpg +0 -0
  365. package/homebridge-ui/public/assets/devices/floodlight_large.jpg +0 -0
  366. package/homebridge-ui/public/assets/devices/floodlightcame340_large.jpg +0 -0
  367. package/homebridge-ui/public/assets/devices/garage_camera_t8452_large.png +0 -0
  368. package/homebridge-ui/public/assets/devices/homebase2_large.png +0 -0
  369. package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
  370. package/homebridge-ui/public/assets/devices/homebase_large.jpg +0 -0
  371. package/homebridge-ui/public/assets/devices/homebasemini_large.png +0 -0
  372. package/homebridge-ui/public/assets/devices/indoorcamC210_large.png +0 -0
  373. package/homebridge-ui/public/assets/devices/indoorcamC220_large.png +0 -0
  374. package/homebridge-ui/public/assets/devices/indoorcamC220_t8419N_large.png +0 -0
  375. package/homebridge-ui/public/assets/devices/indoorcamE30_large.png +0 -0
  376. package/homebridge-ui/public/assets/devices/indoorcamc120_large.png +0 -0
  377. package/homebridge-ui/public/assets/devices/indoorcammini_large.jpg +0 -0
  378. package/homebridge-ui/public/assets/devices/indoorcamp24_large.png +0 -0
  379. package/homebridge-ui/public/assets/devices/indoorcams350_large.png +0 -0
  380. package/homebridge-ui/public/assets/devices/keypad_large.png +0 -0
  381. package/homebridge-ui/public/assets/devices/minibase_chime_T8023_large.jpg +0 -0
  382. package/homebridge-ui/public/assets/devices/motionsensor_large.png +0 -0
  383. package/homebridge-ui/public/assets/devices/nvr_s4_max_T8N00_large.png +0 -0
  384. package/homebridge-ui/public/assets/devices/pir_sensor_e20_large.png +0 -0
  385. package/homebridge-ui/public/assets/devices/poe_bullet_ptz_cam_s4_T8E00_large.png +0 -0
  386. package/homebridge-ui/public/assets/devices/sensor_large.png +0 -0
  387. package/homebridge-ui/public/assets/devices/siren_sensor_e20_large.png +0 -0
  388. package/homebridge-ui/public/assets/devices/smartdrop_t8790_large.png +0 -0
  389. package/homebridge-ui/public/assets/devices/smartlock_t8500_large.png +0 -0
  390. package/homebridge-ui/public/assets/devices/smartlock_t8500_wifibridge_large.jpg +0 -0
  391. package/homebridge-ui/public/assets/devices/smartlock_t8503_large.png +0 -0
  392. package/homebridge-ui/public/assets/devices/smartlock_t8504_large.jpg +0 -0
  393. package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_large.png +0 -0
  394. package/homebridge-ui/public/assets/devices/smartlock_t85D0_large.png +0 -0
  395. package/homebridge-ui/public/assets/devices/smartlock_t85L0_large.png +0 -0
  396. package/homebridge-ui/public/assets/devices/smartlock_t85P0_large.png +0 -0
  397. package/homebridge-ui/public/assets/devices/smartlock_t85V0_large.png +0 -0
  398. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8502_large.png +0 -0
  399. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8506_large.png +0 -0
  400. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8520_large.png +0 -0
  401. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_large.png +0 -0
  402. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_wifibridge_large.jpg +0 -0
  403. package/homebridge-ui/public/assets/devices/smartlock_video_t8530_large.png +0 -0
  404. package/homebridge-ui/public/assets/devices/smartlock_video_t8531_large.png +0 -0
  405. package/homebridge-ui/public/assets/devices/smartlockwifibridge_t8021_large.jpg +0 -0
  406. package/homebridge-ui/public/assets/devices/smartsafe_s10_t7400_large.png +0 -0
  407. package/homebridge-ui/public/assets/devices/smartsafe_s12_t7401_large.png +0 -0
  408. package/homebridge-ui/public/assets/devices/smarttrack_card_t87B2_large.png +0 -0
  409. package/homebridge-ui/public/assets/devices/smarttrack_link_t87B0_large.png +0 -0
  410. package/homebridge-ui/public/assets/devices/smoke_alarm_e10_t90S0_large.png +0 -0
  411. package/homebridge-ui/public/assets/devices/solocamc210_large.jpg +0 -0
  412. package/homebridge-ui/public/assets/devices/solocamc35_large.png +0 -0
  413. package/homebridge-ui/public/assets/devices/solocame20_large.jpg +0 -0
  414. package/homebridge-ui/public/assets/devices/solocame30_large.png +0 -0
  415. package/homebridge-ui/public/assets/devices/solocame40_large.jpg +0 -0
  416. package/homebridge-ui/public/assets/devices/solocame42_large.png +0 -0
  417. package/homebridge-ui/public/assets/devices/solocaml20_large.jpg +0 -0
  418. package/homebridge-ui/public/assets/devices/solocams220_large.jpg +0 -0
  419. package/homebridge-ui/public/assets/devices/solocams340_large.png +0 -0
  420. package/homebridge-ui/public/assets/devices/solocams40_large.jpg +0 -0
  421. package/homebridge-ui/public/assets/devices/soloindoorcamc24_large.jpg +0 -0
  422. package/homebridge-ui/public/assets/devices/solooutdoorcamc22_large.png +0 -0
  423. package/homebridge-ui/public/assets/devices/solooutdoorcamc24_large.jpg +0 -0
  424. package/homebridge-ui/public/assets/devices/unknown.png +0 -0
  425. package/homebridge-ui/public/assets/devices/walllight_s100_large.png +0 -0
  426. package/homebridge-ui/public/assets/devices/walllight_s120_large.png +0 -0
  427. package/homebridge-ui/public/assets/devices/water_freeze_sensor_t8920_large.png +0 -0
  428. package/homebridge-ui/public/assets/devices/wireddoorbell1080p_large.jpg +0 -0
  429. package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.png +0 -0
  430. package/homebridge-ui/public/assets/devices/wireddoorbelldual_large.jpg +0 -0
  431. package/homebridge-ui/public/assets/icons/attach.svg +0 -1
  432. package/homebridge-ui/public/assets/icons/battery_0.svg +0 -1
  433. package/homebridge-ui/public/assets/icons/battery_1.svg +0 -1
  434. package/homebridge-ui/public/assets/icons/battery_2.svg +0 -1
  435. package/homebridge-ui/public/assets/icons/battery_3.svg +0 -1
  436. package/homebridge-ui/public/assets/icons/battery_4.svg +0 -1
  437. package/homebridge-ui/public/assets/icons/battery_5.svg +0 -1
  438. package/homebridge-ui/public/assets/icons/battery_6.svg +0 -1
  439. package/homebridge-ui/public/assets/icons/copy.svg +0 -1
  440. package/homebridge-ui/public/assets/icons/delete.svg +0 -1
  441. package/homebridge-ui/public/assets/icons/download.svg +0 -1
  442. package/homebridge-ui/public/assets/icons/info.svg +0 -1
  443. package/homebridge-ui/public/assets/icons/refresh.svg +0 -1
  444. package/homebridge-ui/public/assets/icons/satellite_alt.svg +0 -1
  445. package/homebridge-ui/public/assets/icons/solar_power.svg +0 -1
  446. package/homebridge-ui/public/components/device-card.js +0 -174
  447. package/homebridge-ui/public/components/guard-modes.js +0 -88
  448. package/homebridge-ui/public/components/number-input.js +0 -121
  449. package/homebridge-ui/public/components/select.js +0 -73
  450. package/homebridge-ui/public/components/toggle.js +0 -68
  451. package/homebridge-ui/public/services/api.js +0 -250
  452. package/homebridge-ui/public/services/config.js +0 -144
  453. package/homebridge-ui/public/style.css +0 -818
  454. package/homebridge-ui/public/utils/countries.js +0 -73
  455. package/homebridge-ui/public/utils/device-images.js +0 -102
  456. package/homebridge-ui/public/utils/helpers.js +0 -115
  457. package/homebridge-ui/public/views/dashboard.js +0 -226
  458. package/homebridge-ui/public/views/device-detail.js +0 -626
  459. package/homebridge-ui/public/views/diagnostics.js +0 -402
  460. package/homebridge-ui/public/views/login.js +0 -650
  461. package/homebridge-ui/public/views/recordings.js +0 -319
  462. package/homebridge-ui/public/views/settings.js +0 -197
  463. package/homebridge-ui/public/views/unsupported-detail.js +0 -296
  464. package/media/Snapshot-Unavailable.png +0 -0
  465. package/media/Snapshot-Unavailable.xcf +0 -0
  466. package/media/Snapshot-black.png +0 -0
  467. package/media/camera-disabled.png +0 -0
  468. package/media/camera-offline.png +0 -0
  469. package/scripts/decrypt-diagnostics.mjs +0 -257
@@ -0,0 +1,489 @@
1
+ import { CapabilityNotSupportedError, LockPushEvent } from '@mega-yfue/eufy-sdk';
2
+ export const LOCK_ADAPTER_KEY = 'lock.mechanism';
3
+ /**
4
+ * The announcement this adapter presents the lock's physical state from.
5
+ *
6
+ * The lock holds no state param worth reading — the SDK's `locked` member sits on a placeholder id with
7
+ * `guessed` provenance and is normally not even installed — so this event is the only evidence of what the
8
+ * bolt did. It is required before any state is presented, so the code cannot claim a state it never receives.
9
+ */
10
+ export const LOCK_STATE_EVENT_ROW = 'lock.lockState.event';
11
+ const LOCK_ACTION = {
12
+ id: 'lock.lock.momentary-action',
13
+ kind: 'momentary-action',
14
+ };
15
+ const UNLOCK_ACTION = {
16
+ id: 'lock.unlock.momentary-action',
17
+ kind: 'momentary-action',
18
+ };
19
+ const OPERATION_DEADLINE_MS = 8_000;
20
+ const RECONCILIATION_WINDOW_MS = 60_000;
21
+ /**
22
+ * The HomeKit meaning of each lock push code the SDK names, and only those.
23
+ *
24
+ * The SDK collapses the whole `LockPushEvent` range into one `lockState` event carrying the raw code, so the
25
+ * code is the only thing the announcement says. Translating a named code into a characteristic value is this
26
+ * plugin's own concern — the SDK states what happened, HomeKit decides how a lock is presented — and the
27
+ * names are the evidence being read, not the numbers: `LockPushEvent` states its provenance as cross-checked
28
+ * against the v6 app, so `MANUAL_LOCK` means the deadbolt was thrown by hand.
29
+ *
30
+ * `MECHANICAL_ANOMALY`, `LOCK_MECHANICAL_ANOMALY` and `DOOR_STATE_ERROR` are the jam: the lock reporting that
31
+ * its own mechanism did not do what it was told, which HomeKit has a state for and which must never be
32
+ * rounded to locked.
33
+ *
34
+ * Not verified against a physical lock: this plugin's maintainers have none. That is why every code is
35
+ * carried by name and an unnamed one presents no state at all rather than a plausible meaning.
36
+ */
37
+ const ANNOUNCED_LOCK_STATES = new Map([
38
+ [LockPushEvent.MANUAL_LOCK, 'secured'],
39
+ [LockPushEvent.KEYPAD_LOCK, 'secured'],
40
+ [LockPushEvent.APP_LOCK, 'secured'],
41
+ [LockPushEvent.AUTO_LOCK, 'secured'],
42
+ [LockPushEvent.PW_LOCK, 'secured'],
43
+ [LockPushEvent.FINGER_LOCK, 'secured'],
44
+ [LockPushEvent.TEMPORARY_PW_LOCK, 'secured'],
45
+ [LockPushEvent.MANUAL_UNLOCK, 'unsecured'],
46
+ [LockPushEvent.AUTO_UNLOCK, 'unsecured'],
47
+ [LockPushEvent.PW_UNLOCK, 'unsecured'],
48
+ [LockPushEvent.FINGERPRINT_UNLOCK, 'unsecured'],
49
+ [LockPushEvent.APP_UNLOCK, 'unsecured'],
50
+ [LockPushEvent.TEMPORARY_PW_UNLOCK, 'unsecured'],
51
+ [LockPushEvent.MECHANICAL_ANOMALY, 'jammed'],
52
+ [LockPushEvent.LOCK_MECHANICAL_ANOMALY, 'jammed'],
53
+ [LockPushEvent.DOOR_STATE_ERROR, 'jammed'],
54
+ ]);
55
+ /**
56
+ * The lock push codes this plugin has read and deliberately presents nothing for.
57
+ *
58
+ * A lock reports its battery, its radio, a tamper and its firmware through the same one event, and a lock that
59
+ * has gone offline or been tampered with has not thereby become unlocked, so these leave the presented state
60
+ * exactly as it was.
61
+ *
62
+ * Listed rather than inferred from the absence of a state mapping, so that the two sets together are exhaustive
63
+ * over `LockPushEvent` and a code a later SDK adds is a code this build has not read. A contract test holds
64
+ * that exhaustiveness, which is what makes an unlisted code a loud failure here instead of a silent decision
65
+ * to keep showing a state nobody checked.
66
+ */
67
+ const NON_STATE_LOCK_CODES = new Set([
68
+ LockPushEvent.LOW_POWER,
69
+ LockPushEvent.VERY_LOW_POWER,
70
+ LockPushEvent.MULTIPLE_ERRORS,
71
+ LockPushEvent.LOCK_OFFLINE,
72
+ LockPushEvent.VIOLENT_DESTRUCTION,
73
+ LockPushEvent.DOOR_OPEN_LEFT,
74
+ LockPushEvent.DOOR_TAMPER,
75
+ LockPushEvent.STATUS_CHANGE,
76
+ LockPushEvent.OTA_STATUS,
77
+ LockPushEvent.LOCK_ONLINE,
78
+ ]);
79
+ /** Every lock push code this build has read, for the contract test that holds the two sets exhaustive. */
80
+ export const CLASSIFIED_LOCK_CODES = new Set([
81
+ ...ANNOUNCED_LOCK_STATES.keys(),
82
+ ...NON_STATE_LOCK_CODES,
83
+ ]);
84
+ /** The identity-free trace one lock announcement records. */
85
+ const LOCK_STATE_TRACE = 'lock-state';
86
+ const LOCK_STATES = new WeakMap();
87
+ /** Serializes physical lock actions while retaining only the newest bounded target projection. */
88
+ class LockTargetWrites {
89
+ issue;
90
+ communicationFailure;
91
+ operationFailure;
92
+ isNonRetryable;
93
+ diagnose;
94
+ active;
95
+ queued;
96
+ reconciliation;
97
+ projection;
98
+ blockedError;
99
+ detached = false;
100
+ constructor(issue, communicationFailure, operationFailure, isNonRetryable, diagnose) {
101
+ this.issue = issue;
102
+ this.communicationFailure = communicationFailure;
103
+ this.operationFailure = operationFailure;
104
+ this.isNonRetryable = isNonRetryable;
105
+ this.diagnose = diagnose;
106
+ }
107
+ read() {
108
+ return this.projection;
109
+ }
110
+ /**
111
+ * Settles the window a write opened, because the device has since said what it actually did.
112
+ *
113
+ * A successful command acknowledges delivery and nothing more, so this projection exists only to answer
114
+ * HomeKit until the lock reports. Once it has, the projection is not merely confirmed but superseded — the
115
+ * announcement is authoritative even when it contradicts what was asked for, which is what happens when
116
+ * someone turns the key the other way — and there is nothing left unreconciled to warn about.
117
+ */
118
+ observed() {
119
+ if (this.reconciliation) {
120
+ clearTimeout(this.reconciliation);
121
+ this.reconciliation = undefined;
122
+ }
123
+ this.projection = undefined;
124
+ }
125
+ request(value) {
126
+ if (this.blockedError) {
127
+ return Promise.reject(this.blockedError);
128
+ }
129
+ this.projection = value;
130
+ return new Promise((resolve, reject) => {
131
+ const request = {
132
+ value,
133
+ settled: false,
134
+ resolve,
135
+ reject,
136
+ };
137
+ if (!this.active) {
138
+ this.start({ value, requests: [request], abandoned: false });
139
+ }
140
+ else if (this.queued) {
141
+ this.queued.value = value;
142
+ this.queued.requests.push(request);
143
+ }
144
+ else {
145
+ this.queued = { value, requests: [request], abandoned: false };
146
+ }
147
+ });
148
+ }
149
+ detach() {
150
+ this.detached = true;
151
+ if (this.reconciliation) {
152
+ clearTimeout(this.reconciliation);
153
+ }
154
+ for (const request of [...(this.active?.requests ?? []), ...(this.queued?.requests ?? [])]) {
155
+ this.settle(request, 'reject', this.communicationFailure());
156
+ }
157
+ this.active = undefined;
158
+ this.queued = undefined;
159
+ this.projection = undefined;
160
+ this.reconciliation = undefined;
161
+ }
162
+ start(batch) {
163
+ if (this.detached) {
164
+ return;
165
+ }
166
+ if (this.reconciliation) {
167
+ clearTimeout(this.reconciliation);
168
+ this.reconciliation = undefined;
169
+ }
170
+ this.active = batch;
171
+ for (const request of batch.requests) {
172
+ request.deadline = setTimeout(() => this.timeout(request), OPERATION_DEADLINE_MS);
173
+ }
174
+ Promise.resolve()
175
+ .then(() => this.issue(batch.value))
176
+ .then(() => this.complete(batch), (error) => this.fail(batch, error));
177
+ }
178
+ complete(batch) {
179
+ if (this.active !== batch) {
180
+ return;
181
+ }
182
+ if (batch.abandoned) {
183
+ this.active = undefined;
184
+ this.startQueued();
185
+ return;
186
+ }
187
+ for (const request of batch.requests) {
188
+ this.settle(request, 'resolve');
189
+ }
190
+ this.diagnose('lock-operation-failed', false, 'recovered');
191
+ if (this.projection !== undefined) {
192
+ this.reconciliation = setTimeout(() => {
193
+ this.reconciliation = undefined;
194
+ this.projection = undefined;
195
+ this.diagnose('lock-reconciliation-expired', true, 'expired');
196
+ }, RECONCILIATION_WINDOW_MS);
197
+ }
198
+ this.active = undefined;
199
+ this.startQueued();
200
+ }
201
+ fail(batch, cause) {
202
+ if (this.active !== batch) {
203
+ return;
204
+ }
205
+ const error = this.operationFailure(cause);
206
+ for (const request of batch.requests) {
207
+ this.settle(request, 'reject', error);
208
+ }
209
+ const nonRetryable = this.isNonRetryable(cause);
210
+ if (nonRetryable) {
211
+ this.blockedError = error;
212
+ for (const request of this.queued?.requests ?? []) {
213
+ this.settle(request, 'reject', error);
214
+ }
215
+ this.queued = undefined;
216
+ }
217
+ this.projection = this.queued?.value;
218
+ if (batch.abandoned && !nonRetryable) {
219
+ this.active = undefined;
220
+ this.startQueued();
221
+ return;
222
+ }
223
+ this.diagnose('lock-operation-failed', true, nonRetryable ? 'capability-not-supported' : 'operation-failure');
224
+ this.active = undefined;
225
+ this.startQueued();
226
+ }
227
+ timeout(request) {
228
+ if (request.settled) {
229
+ return;
230
+ }
231
+ this.settle(request, 'reject', this.communicationFailure());
232
+ this.diagnose('lock-operation-failed', true, 'timeout');
233
+ if (this.active?.requests.every(({ settled }) => settled)) {
234
+ this.active.abandoned = true;
235
+ this.projection = this.queued?.value;
236
+ return;
237
+ }
238
+ if (this.queued) {
239
+ this.queued.requests = this.queued.requests.filter(({ settled }) => !settled);
240
+ if (this.queued.requests.length === 0) {
241
+ this.queued = undefined;
242
+ this.projection = this.active?.value;
243
+ }
244
+ else {
245
+ this.queued.value = this.queued.requests.at(-1).value;
246
+ }
247
+ }
248
+ }
249
+ startQueued() {
250
+ const queued = this.queued;
251
+ this.queued = undefined;
252
+ if (!queued) {
253
+ return;
254
+ }
255
+ queued.requests = queued.requests.filter(({ settled }) => !settled);
256
+ if (queued.requests.length > 0) {
257
+ queued.value = queued.requests.at(-1).value;
258
+ this.projection = queued.value;
259
+ this.start(queued);
260
+ }
261
+ }
262
+ settle(request, result, error) {
263
+ if (request.settled) {
264
+ return;
265
+ }
266
+ request.settled = true;
267
+ if (request.deadline) {
268
+ clearTimeout(request.deadline);
269
+ }
270
+ if (result === 'resolve') {
271
+ request.resolve();
272
+ }
273
+ else {
274
+ request.reject(error);
275
+ }
276
+ }
277
+ }
278
+ const COVERAGE = [LOCK_ACTION.id, UNLOCK_ACTION.id, LOCK_STATE_EVENT_ROW];
279
+ /** Complete HomeKit policy for the exact evidenced T8531 lock-control boundary. */
280
+ export const LOCK_ADAPTER = {
281
+ key: LOCK_ADAPTER_KEY,
282
+ role: 'primary-purpose',
283
+ requiresProduct: { model: 'T8531' },
284
+ requires: [LOCK_ACTION, UNLOCK_ACTION],
285
+ coverage: COVERAGE,
286
+ attach: attachLock,
287
+ };
288
+ /**
289
+ * Attaches the lock's controls, and its physical state where the device announces one.
290
+ *
291
+ * The controls and the state are deliberately gated apart: a lock that reports no state announcement is still
292
+ * worth locking from HomeKit, so the two momentary actions admit the accessory and the announcement only
293
+ * decides whether a state is presented beside them.
294
+ */
295
+ function attachLock(context) {
296
+ const { accessory, hap } = context;
297
+ const device = context.device;
298
+ let actions;
299
+ try {
300
+ actions = device.lock?.();
301
+ }
302
+ catch {
303
+ context.diagnose({
304
+ code: 'lock-capability-unavailable',
305
+ capability: 'lock',
306
+ member: 'target',
307
+ active: true,
308
+ reason: 'sdk-fault',
309
+ });
310
+ return undefined;
311
+ }
312
+ if (!actions || typeof actions.lock !== 'function' || typeof actions.unlock !== 'function') {
313
+ context.diagnose({
314
+ code: 'lock-capability-unavailable',
315
+ capability: 'lock',
316
+ member: 'target',
317
+ active: true,
318
+ reason: 'missing',
319
+ });
320
+ return undefined;
321
+ }
322
+ context.diagnose({
323
+ code: 'lock-capability-unavailable',
324
+ capability: 'lock',
325
+ member: 'target',
326
+ active: false,
327
+ reason: 'recovered',
328
+ });
329
+ context.observed('lock-capability-unavailable');
330
+ const service = accessory.getServiceById(hap.Service.LockMechanism, LOCK_ADAPTER_KEY) ??
331
+ accessory.addService(hap.Service.LockMechanism, accessory.displayName, LOCK_ADAPTER_KEY);
332
+ const previousState = LOCK_STATES.get(service);
333
+ const owner = Symbol('lock-owner');
334
+ const state = previousState ?? {
335
+ owner,
336
+ actions,
337
+ diagnose: () => undefined,
338
+ };
339
+ state.owner = owner;
340
+ state.actions = actions;
341
+ LOCK_STATES.set(service, state);
342
+ const current = service.getCharacteristic(hap.Characteristic.LockCurrentState);
343
+ const target = service.getCharacteristic(hap.Characteristic.LockTargetState);
344
+ const announces = context.evidence.has(LOCK_STATE_EVENT_ROW);
345
+ const diagnoseState = (active, reason) => {
346
+ context.diagnose({ code: 'unusable-lock-announcement', capability: 'lock', member: 'state', active, reason });
347
+ if (!active) {
348
+ context.observed('unusable-lock-announcement');
349
+ }
350
+ };
351
+ if (!announces) {
352
+ state.announced = undefined;
353
+ state.announcedTarget = undefined;
354
+ context.diagnose({
355
+ code: 'lock-capability-unavailable',
356
+ capability: 'lock',
357
+ member: 'state',
358
+ active: true,
359
+ reason: 'missing-evidence',
360
+ });
361
+ }
362
+ const CURRENT_STATE = {
363
+ secured: hap.Characteristic.LockCurrentState.SECURED,
364
+ unsecured: hap.Characteristic.LockCurrentState.UNSECURED,
365
+ jammed: hap.Characteristic.LockCurrentState.JAMMED,
366
+ };
367
+ const currentValue = () => state.announced === undefined ? hap.Characteristic.LockCurrentState.UNKNOWN : CURRENT_STATE[state.announced];
368
+ const targetValue = () => state.announcedTarget === undefined
369
+ ? undefined
370
+ : state.announcedTarget === 'secured'
371
+ ? hap.Characteristic.LockTargetState.SECURED
372
+ : hap.Characteristic.LockTargetState.UNSECURED;
373
+ current.updateValue(currentValue());
374
+ state.diagnose = (code, active, reason) => {
375
+ context.diagnose({ code, capability: 'lock', member: 'target', active, reason });
376
+ if (!active) {
377
+ context.observed(code);
378
+ }
379
+ };
380
+ const communicationFailure = () => new hap.HapStatusError(hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
381
+ state.writes ??= new LockTargetWrites((value) => (value === hap.Characteristic.LockTargetState.SECURED ? state.actions.lock() : state.actions.unlock()), communicationFailure, (error) => new hap.HapStatusError(error instanceof CapabilityNotSupportedError
382
+ ? hap.HAPStatus.NOT_ALLOWED_IN_CURRENT_STATE
383
+ : hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE), (error) => error instanceof CapabilityNotSupportedError, (code, active, reason) => state.diagnose(code, active, reason));
384
+ current.onGet(currentValue);
385
+ /**
386
+ * Answers the target from the newest thing that established one: a write still in flight, else the last
387
+ * settled announcement.
388
+ *
389
+ * Unanswerable until one of those exists, which includes a jam announced before this plugin has seen either
390
+ * — HomeKit's target is what the lock was asked for, and nothing has asked. Left failing closed rather than
391
+ * defaulted, because a target invented here reads in the Home app as a state the user chose.
392
+ */
393
+ target.onGet(() => {
394
+ const requested = state.writes.read() ?? targetValue();
395
+ if (requested === undefined) {
396
+ throw communicationFailure();
397
+ }
398
+ return requested;
399
+ });
400
+ target.onSet((value) => {
401
+ if (value !== hap.Characteristic.LockTargetState.SECURED &&
402
+ value !== hap.Characteristic.LockTargetState.UNSECURED) {
403
+ throw new hap.HapStatusError(hap.HAPStatus.INVALID_VALUE_IN_REQUEST);
404
+ }
405
+ return state.writes.request(value);
406
+ });
407
+ /**
408
+ * Presents what one announcement established, pushing only what moved.
409
+ *
410
+ * Both characteristics are pushed because HomeKit is not told a value changed unless the accessory says so:
411
+ * a lock that answers reads and never notifies leaves the Home app showing what it last believed, which for
412
+ * a lock is a claim about whether the house is locked. The target follows a settled state as well as the
413
+ * current one, or the tile stays on "Locking…" after someone locks the door with a key.
414
+ */
415
+ const present = (announced) => {
416
+ state.announced = announced;
417
+ if (announced !== 'jammed') {
418
+ state.announcedTarget = announced;
419
+ }
420
+ state.writes?.observed();
421
+ const nextCurrent = currentValue();
422
+ if (current.value !== nextCurrent) {
423
+ current.updateValue(nextCurrent);
424
+ }
425
+ const nextTarget = targetValue();
426
+ if (nextTarget !== undefined && target.value !== nextTarget) {
427
+ target.updateValue(nextTarget);
428
+ }
429
+ };
430
+ /**
431
+ * Withdraws a state this plugin can no longer vouch for.
432
+ *
433
+ * Something happened to the lock inside the announced range that this build has not read, so the last state
434
+ * is no longer a claim it can make: HomeKit is told the state is unknown rather than left showing a value
435
+ * that may now be wrong. The target is left alone — an unreadable announcement says nothing about what the
436
+ * lock was asked to do.
437
+ */
438
+ const withdraw = (reason) => {
439
+ state.announced = undefined;
440
+ if (current.value !== hap.Characteristic.LockCurrentState.UNKNOWN) {
441
+ current.updateValue(hap.Characteristic.LockCurrentState.UNKNOWN);
442
+ }
443
+ diagnoseState(true, reason);
444
+ };
445
+ return {
446
+ /**
447
+ * Presents what one `lockState` announcement says about the bolt.
448
+ *
449
+ * `eventType` is read as `unknown` rather than as the number it is declared to be, because the SDK folds
450
+ * the raw push body into this payload: the declared type is what the event promises, not what every
451
+ * announcement will carry, and a lock is the wrong accessory on which to trust a shape.
452
+ *
453
+ * A code this build has read and deliberately presents nothing for — a battery warning, a tamper, a
454
+ * firmware update — is not this member reporting at all, so it records no trace and leaves the state
455
+ * alone. Anything else in the range is unread: the state is withdrawn rather than kept, because the
456
+ * announcement was about this lock and this build cannot say what it meant.
457
+ */
458
+ event(event) {
459
+ if (event.eventName !== 'lockState' || !announces) {
460
+ return undefined;
461
+ }
462
+ const code = event.eventType;
463
+ if (code === undefined) {
464
+ withdraw('missing');
465
+ return { event: LOCK_STATE_TRACE, observation: 'missing' };
466
+ }
467
+ if (typeof code === 'number' && NON_STATE_LOCK_CODES.has(code)) {
468
+ return undefined;
469
+ }
470
+ const announced = typeof code === 'number' ? ANNOUNCED_LOCK_STATES.get(code) : undefined;
471
+ if (announced === undefined) {
472
+ withdraw('malformed');
473
+ return { event: LOCK_STATE_TRACE, observation: 'malformed' };
474
+ }
475
+ present(announced);
476
+ diagnoseState(false, 'recovered');
477
+ return { event: LOCK_STATE_TRACE, observation: 'valid' };
478
+ },
479
+ detach() {
480
+ if (LOCK_STATES.get(service)?.owner !== owner) {
481
+ return;
482
+ }
483
+ state.writes?.detach();
484
+ LOCK_STATES.delete(service);
485
+ accessory.removeService(service);
486
+ },
487
+ };
488
+ }
489
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/homekit/adapters/lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ export const MOTION_ADAPTER_KEY = 'motion.sensor';
2
+ const MOTION_HOLD_MS = 10_000;
3
+ const MOTION_HOLDS = new WeakMap();
4
+ /**
5
+ * The admitted SDK detection events that drive this accessory's one motion service.
6
+ *
7
+ * The camera bundle reads this to decide whether a camera has a recording trigger at all, so the set has
8
+ * one owner rather than a copy beside every consumer.
9
+ */
10
+ export const MOTION_EVENT_REQUIREMENTS = [
11
+ { capability: 'motion', eventName: 'motion' },
12
+ { capability: 'motion', eventName: 'cryingDetected' },
13
+ { capability: 'motion', eventName: 'soundDetected' },
14
+ { capability: 'motion', eventName: 'vehicleDetected' },
15
+ { capability: 'motion', eventName: 'dogDetected' },
16
+ { capability: 'person_detection', eventName: 'personDetected' },
17
+ { capability: 'person_detection', eventName: 'strangerDetected' },
18
+ { capability: 'doorbell', eventName: 'petDetection' },
19
+ ];
20
+ /** Whether a device reports at least one detection event this adapter admits as motion. */
21
+ export function hasAdmittedMotionEvents(evidence) {
22
+ return MOTION_EVENT_REQUIREMENTS.some(({ capability, eventName }) => evidence.has(`${capability}.${eventName}.event`));
23
+ }
24
+ /**
25
+ * This accessory's one motion service, created on first use under the stable key this adapter owns.
26
+ *
27
+ * A camera bundle configuring HomeKit Secure Video has to hand the same service to its controller, because
28
+ * HomeKit links the sensor that triggers a recording to the recording management service. Both callers
29
+ * resolve it here so one accessory can only ever carry one motion service, whichever attaches first.
30
+ */
31
+ export function motionSensorService(context) {
32
+ const { accessory, hap } = context;
33
+ return (accessory.getServiceById(hap.Service.MotionSensor, MOTION_ADAPTER_KEY) ??
34
+ accessory.addService(hap.Service.MotionSensor, accessory.displayName, MOTION_ADAPTER_KEY));
35
+ }
36
+ /** Complete HomeKit policy for admitted detection pulses. */
37
+ export const MOTION_ADAPTER = {
38
+ key: MOTION_ADAPTER_KEY,
39
+ role: 'primary-purpose',
40
+ requires: [],
41
+ requiresAny: MOTION_EVENT_REQUIREMENTS.map(({ capability, eventName }) => ({
42
+ id: `${capability}.${eventName}.event`,
43
+ kind: 'event',
44
+ })),
45
+ coverage: MOTION_EVENT_REQUIREMENTS.map(({ capability, eventName }) => `${capability}.${eventName}.event`),
46
+ attach: attachMotion,
47
+ };
48
+ /** Attaches admitted SDK detection pulses to one official HomeKit Motion Sensor service. */
49
+ function attachMotion(context) {
50
+ const { accessory, hap } = context;
51
+ const service = motionSensorService(context);
52
+ const hold = MOTION_HOLDS.get(service) ?? {};
53
+ MOTION_HOLDS.set(service, hold);
54
+ const owner = Symbol('motion-hold-owner');
55
+ hold.owner = owner;
56
+ const admittedEvents = new Set(MOTION_EVENT_REQUIREMENTS.filter(({ capability, eventName }) => context.evidence.has(`${capability}.${eventName}.event`)).map(({ eventName }) => eventName));
57
+ const clear = () => {
58
+ hold.deadline = undefined;
59
+ hold.timer = undefined;
60
+ service.updateCharacteristic(hap.Characteristic.MotionDetected, false);
61
+ };
62
+ const schedule = () => {
63
+ if (hold.timer) {
64
+ clearTimeout(hold.timer);
65
+ }
66
+ if (hold.deadline === undefined) {
67
+ return;
68
+ }
69
+ const remaining = hold.deadline - Date.now();
70
+ if (remaining <= 0) {
71
+ clear();
72
+ return;
73
+ }
74
+ service.updateCharacteristic(hap.Characteristic.MotionDetected, true);
75
+ hold.timer = setTimeout(clear, remaining);
76
+ };
77
+ schedule();
78
+ return {
79
+ event(event) {
80
+ if (!admittedEvents.has(event.eventName)) {
81
+ return undefined;
82
+ }
83
+ service.updateCharacteristic(hap.Characteristic.MotionDetected, true);
84
+ hold.deadline = Date.now() + MOTION_HOLD_MS;
85
+ schedule();
86
+ return { event: 'motion-detection', observation: 'valid' };
87
+ },
88
+ detach() {
89
+ if (hold.owner === owner) {
90
+ if (hold.timer) {
91
+ clearTimeout(hold.timer);
92
+ }
93
+ clear();
94
+ hold.owner = undefined;
95
+ accessory.removeService(service);
96
+ }
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","sourceRoot":"","sources":["../../../src/homekit/adapters/motion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { BATTERY_ADAPTER, BATTERY_ADAPTER_KEY } from './battery.js';
2
+ import { CAMERA_CONTROLS_ADAPTER, CAMERA_CONTROLS_ADAPTER_KEY } from './camera-controls.js';
3
+ import { CAMERA_STREAMING_ADAPTER, CAMERA_STREAMING_ADAPTER_KEY } from './camera-streaming.js';
4
+ import { CONTACT_ADAPTER, CONTACT_ADAPTER_KEY } from './contact.js';
5
+ import { DOORBELL_ADAPTER, DOORBELL_ADAPTER_KEY } from './doorbell.js';
6
+ import { INFORMATION_ADAPTER, INFORMATION_ADAPTER_KEY } from './information.js';
7
+ import { LOCK_ADAPTER, LOCK_ADAPTER_KEY } from './lock.js';
8
+ import { MOTION_ADAPTER, MOTION_ADAPTER_KEY } from './motion.js';
9
+ import { SECURITY_SYSTEM_ADAPTER, SECURITY_SYSTEM_ADAPTER_KEY } from './security-system.js';
10
+ import { SIREN_ADAPTER, SIREN_ADAPTER_KEY } from './siren.js';
11
+ import { SMART_LIGHT_ADAPTER, SMART_LIGHT_ADAPTER_KEY } from './smart-light.js';
12
+ /** The closed set of adapters permitted to create HomeKit representation. */
13
+ export const ADAPTER_REGISTRY = {
14
+ [BATTERY_ADAPTER_KEY]: BATTERY_ADAPTER,
15
+ [CAMERA_CONTROLS_ADAPTER_KEY]: CAMERA_CONTROLS_ADAPTER,
16
+ [CAMERA_STREAMING_ADAPTER_KEY]: CAMERA_STREAMING_ADAPTER,
17
+ [CONTACT_ADAPTER_KEY]: CONTACT_ADAPTER,
18
+ [DOORBELL_ADAPTER_KEY]: DOORBELL_ADAPTER,
19
+ [INFORMATION_ADAPTER_KEY]: INFORMATION_ADAPTER,
20
+ [LOCK_ADAPTER_KEY]: LOCK_ADAPTER,
21
+ [MOTION_ADAPTER_KEY]: MOTION_ADAPTER,
22
+ [SECURITY_SYSTEM_ADAPTER_KEY]: SECURITY_SYSTEM_ADAPTER,
23
+ [SIREN_ADAPTER_KEY]: SIREN_ADAPTER,
24
+ [SMART_LIGHT_ADAPTER_KEY]: SMART_LIGHT_ADAPTER,
25
+ };
26
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/homekit/adapters/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,CAAC,mBAAmB,CAAC,EAAE,eAAe;IACtC,CAAC,2BAA2B,CAAC,EAAE,uBAAuB;IACtD,CAAC,4BAA4B,CAAC,EAAE,wBAAwB;IACxD,CAAC,mBAAmB,CAAC,EAAE,eAAe;IACtC,CAAC,oBAAoB,CAAC,EAAE,gBAAgB;IACxC,CAAC,uBAAuB,CAAC,EAAE,mBAAmB;IAC9C,CAAC,gBAAgB,CAAC,EAAE,YAAY;IAChC,CAAC,kBAAkB,CAAC,EAAE,cAAc;IACpC,CAAC,2BAA2B,CAAC,EAAE,uBAAuB;IACtD,CAAC,iBAAiB,CAAC,EAAE,aAAa;IAClC,CAAC,uBAAuB,CAAC,EAAE,mBAAmB;CACa,CAAC"}