homebridge-eufy-security 4.4.2-beta.4 → 4.4.2-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/FUNDING.yml +1 -0
- package/README.md +46 -53
- package/dist/accessories/AutoSyncStationAccessory.js +26 -30
- package/dist/accessories/AutoSyncStationAccessory.js.map +1 -1
- package/dist/accessories/BaseAccessory.js +88 -50
- package/dist/accessories/BaseAccessory.js.map +1 -1
- package/dist/accessories/CameraAccessory.js +92 -167
- package/dist/accessories/CameraAccessory.js.map +1 -1
- package/dist/accessories/Device.js +11 -15
- package/dist/accessories/Device.js.map +1 -1
- package/dist/accessories/EntrySensorAccessory.js +7 -12
- package/dist/accessories/EntrySensorAccessory.js.map +1 -1
- package/dist/accessories/LockAccessory.js +20 -24
- package/dist/accessories/LockAccessory.js.map +1 -1
- package/dist/accessories/MotionSensorAccessory.js +7 -12
- package/dist/accessories/MotionSensorAccessory.js.map +1 -1
- package/dist/accessories/SmartDropAccessory.js +145 -0
- package/dist/accessories/SmartDropAccessory.js.map +1 -0
- package/dist/accessories/StationAccessory.js +40 -45
- package/dist/accessories/StationAccessory.js.map +1 -1
- package/dist/config.js +1 -4
- package/dist/config.js.map +1 -1
- package/dist/controller/LocalLivestreamManager.js +85 -89
- package/dist/controller/LocalLivestreamManager.js.map +1 -1
- package/dist/controller/recordingDelegate.js +116 -108
- package/dist/controller/recordingDelegate.js.map +1 -1
- package/dist/controller/snapshotDelegate.js +379 -0
- package/dist/controller/snapshotDelegate.js.map +1 -0
- package/dist/controller/streamingDelegate.js +202 -207
- package/dist/controller/streamingDelegate.js.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/interfaces.js +1 -2
- package/dist/interfaces.js.map +1 -1
- package/dist/platform.js +169 -135
- package/dist/platform.js.map +1 -1
- package/dist/settings.js +26 -17
- package/dist/settings.js.map +1 -1
- package/dist/utils/Talkback.js +9 -13
- package/dist/utils/Talkback.js.map +1 -1
- package/dist/utils/configTypes.js +12 -8
- package/dist/utils/configTypes.js.map +1 -1
- package/dist/utils/ffmpeg.js +374 -395
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/interfaces.js +1 -5
- package/dist/utils/interfaces.js.map +1 -1
- package/dist/utils/utils.js +32 -134
- package/dist/utils/utils.js.map +1 -1
- package/dist/version.js +1 -4
- package/dist/version.js.map +1 -1
- package/eslint.config.mjs +25 -47
- package/homebridge-eufy-security.png +0 -0
- package/homebridge-ui/public/app.js +225 -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/batterydoorbell_e340_large.png +0 -0
- package/homebridge-ui/public/assets/devices/eufycam3pro_large.png +0 -0
- package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
- package/homebridge-ui/public/assets/devices/homebasemini_large.jpg +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/indoorcamE30_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_t8503_large.png +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_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_video_t8530_large.png +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/solocamc35_large.png +0 -0
- package/homebridge-ui/public/assets/devices/solocame30_large.png +0 -0
- package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.png +0 -0
- package/homebridge-ui/public/assets/icons/attach.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_0.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_1.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_2.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_3.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_4.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_5.svg +1 -0
- package/homebridge-ui/public/assets/icons/battery_6.svg +1 -0
- package/homebridge-ui/public/assets/icons/bolt.svg +1 -0
- package/homebridge-ui/public/assets/icons/bug-report.svg +1 -0
- package/homebridge-ui/public/assets/icons/copy.svg +1 -0
- package/homebridge-ui/public/assets/icons/delete.svg +1 -0
- package/homebridge-ui/public/assets/icons/download.svg +1 -0
- package/homebridge-ui/public/assets/icons/info.svg +1 -0
- package/homebridge-ui/public/assets/icons/inventory.svg +1 -0
- package/homebridge-ui/public/assets/icons/refresh.svg +1 -0
- package/homebridge-ui/public/assets/icons/satellite_alt.svg +1 -0
- package/homebridge-ui/public/assets/icons/settings.svg +1 -0
- package/homebridge-ui/public/assets/icons/settings_backup_restore.svg +1 -0
- package/homebridge-ui/public/assets/icons/solar_power.svg +1 -0
- package/homebridge-ui/public/assets/icons/warning.svg +1 -0
- package/homebridge-ui/public/components/device-card.js +156 -0
- package/homebridge-ui/public/components/guard-modes.js +88 -0
- package/homebridge-ui/public/components/number-input.js +121 -0
- package/homebridge-ui/public/components/select.js +73 -0
- package/homebridge-ui/public/components/toggle.js +68 -0
- package/homebridge-ui/public/index.html +25 -14
- package/homebridge-ui/public/services/api.js +198 -0
- package/homebridge-ui/public/services/config.js +144 -0
- package/homebridge-ui/public/style.css +779 -0
- package/homebridge-ui/public/utils/countries.js +73 -0
- package/homebridge-ui/public/utils/device-images.js +89 -0
- package/homebridge-ui/public/utils/helpers.js +87 -0
- package/homebridge-ui/public/views/dashboard.js +219 -0
- package/homebridge-ui/public/views/device-detail.js +631 -0
- package/homebridge-ui/public/views/diagnostics.js +266 -0
- package/homebridge-ui/public/views/login.js +634 -0
- package/homebridge-ui/public/views/settings.js +192 -0
- package/homebridge-ui/public/views/unsupported-detail.js +282 -0
- package/homebridge-ui/server.js +897 -497
- package/package.json +19 -59
- package/.gitmodules +0 -0
- package/dist/accessories/AutoSyncStationAccessory.d.ts +0 -42
- package/dist/accessories/AutoSyncStationAccessory.d.ts.map +0 -1
- package/dist/accessories/BaseAccessory.d.ts +0 -56
- package/dist/accessories/BaseAccessory.d.ts.map +0 -1
- package/dist/accessories/CameraAccessory.d.ts +0 -84
- package/dist/accessories/CameraAccessory.d.ts.map +0 -1
- package/dist/accessories/Device.d.ts +0 -19
- package/dist/accessories/Device.d.ts.map +0 -1
- package/dist/accessories/EntrySensorAccessory.d.ts +0 -25
- package/dist/accessories/EntrySensorAccessory.d.ts.map +0 -1
- package/dist/accessories/LockAccessory.d.ts +0 -45
- package/dist/accessories/LockAccessory.d.ts.map +0 -1
- package/dist/accessories/MotionSensorAccessory.d.ts +0 -25
- package/dist/accessories/MotionSensorAccessory.d.ts.map +0 -1
- package/dist/accessories/StationAccessory.d.ts +0 -86
- package/dist/accessories/StationAccessory.d.ts.map +0 -1
- package/dist/config.d.ts +0 -31
- package/dist/config.d.ts.map +0 -1
- package/dist/controller/LocalLivestreamManager.d.ts +0 -31
- package/dist/controller/LocalLivestreamManager.d.ts.map +0 -1
- package/dist/controller/SnapshotManager.d.ts +0 -64
- package/dist/controller/SnapshotManager.d.ts.map +0 -1
- package/dist/controller/SnapshotManager.js +0 -434
- package/dist/controller/SnapshotManager.js.map +0 -1
- package/dist/controller/recordingDelegate.d.ts +0 -27
- package/dist/controller/recordingDelegate.d.ts.map +0 -1
- package/dist/controller/streamingDelegate.d.ts +0 -52
- package/dist/controller/streamingDelegate.d.ts.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/interfaces.d.ts +0 -15
- package/dist/interfaces.d.ts.map +0 -1
- package/dist/platform.d.ts +0 -82
- package/dist/platform.d.ts.map +0 -1
- package/dist/settings.d.ts +0 -21
- package/dist/settings.d.ts.map +0 -1
- package/dist/utils/Talkback.d.ts +0 -21
- package/dist/utils/Talkback.d.ts.map +0 -1
- package/dist/utils/configTypes.d.ts +0 -68
- package/dist/utils/configTypes.d.ts.map +0 -1
- package/dist/utils/ffmpeg.d.ts +0 -111
- package/dist/utils/ffmpeg.d.ts.map +0 -1
- package/dist/utils/interfaces.d.ts +0 -8
- package/dist/utils/interfaces.d.ts.map +0 -1
- package/dist/utils/utils.d.ts +0 -35
- package/dist/utils/utils.d.ts.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/homebridge-ui/configui/app/util/types.d.ts +0 -66
- package/homebridge-ui/configui/app/util/types.d.ts.map +0 -1
- package/homebridge-ui/configui/app/util/types.js +0 -18
- package/homebridge-ui/configui/app/util/types.js.map +0 -1
- package/homebridge-ui/public/3rdpartylicenses.txt +0 -561
- package/homebridge-ui/public/assets/devices/batterydoorbell2k_large.png +0 -0
- package/homebridge-ui/public/assets/devices/batterydoorbell_e340_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/homebase2_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/homebase3_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartdrop_t8790_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8500_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8503_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8502_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8506_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8520_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartlock_video_t8530_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartsafe_s10_t7400_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smartsafe_s12_t7401_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smarttrack_card_t87B2_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/smarttrack_link_t87B0_large.jpg +0 -0
- package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.jpg +0 -0
- package/homebridge-ui/public/assets/images/homebridge-eufy-security.png +0 -0
- package/homebridge-ui/public/favicon.ico +0 -0
- package/homebridge-ui/public/main.13895ebc61bdaf90.js +0 -1
- package/homebridge-ui/public/polyfills.efa2f09ba3e49167.js +0 -1
- package/homebridge-ui/public/runtime.ccde331d62c423b3.js +0 -1
- package/homebridge-ui/public/styles.13e635bf7a488639.css +0 -5
- package/homebridge-ui/server.d.ts +0 -2
- package/homebridge-ui/server.d.ts.map +0 -1
- package/homebridge-ui/server.js.map +0 -1
- package/homebridge-ui/version.d.ts +0 -2
- package/homebridge-ui/version.d.ts.map +0 -1
- package/homebridge-ui/version.js +0 -5
- package/homebridge-ui/version.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
-
You can find the complete detailled changelog for every release [here](https://github.com/homebridge-eufy-security/
|
|
3
|
+
You can find the complete detailled changelog for every release [here](https://github.com/homebridge-plugins/homebridge-eufy-security/releases).
|
|
4
4
|
|
|
5
5
|
Before transitioning to a major version, it's strongly advised to back up your configuration and begin anew. Major updates have the potential to disrupt automation setups and bridge/unbridge accessory functionalities.
|
package/FUNDING.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: [lenoxys]
|
package/README.md
CHANGED
|
@@ -1,74 +1,67 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<a href="https://github.com/homebridge-eufy-security
|
|
2
|
+
<a href="https://github.com/homebridge-plugins/homebridge-eufy-security"><img src="https://raw.githubusercontent.com/wiki/homebridge-eufy-security/plugin/img/homebridge-eufy-security.png" width="456px"></a>
|
|
3
3
|
</p>
|
|
4
|
-
<span align="center">
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
[](https://www.npmjs.com/package/homebridge-eufy-security)
|
|
11
|
-
[](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
|
|
12
|
-
[](https://www.npmjs.com/package/homebridge-eufy-security)
|
|
13
|
-
|
|
14
|
-
[](https://github.com/homebridge-eufy-security/plugin/wiki/Special-Version-(BETA---RC---HKSV))
|
|
15
|
-
[](https://github.com/homebridge-eufy-security/plugin/wiki/Special-Version-(BETA---RC---HKSV))
|
|
16
|
-
[](https://github.com/homebridge-eufy-security/plugin/wiki/Special-Version-(BETA---RC---HKSV))
|
|
17
|
-
[](https://discord.com/channels/432663330281226270/876907345962229791)
|
|
18
|
-
|
|
19
|
-
</span>
|
|
20
|
-
|
|
21
|
-
### Plugin Information
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>Control your Eufy Security devices from Apple HomeKit</strong>
|
|
7
|
+
</p>
|
|
22
8
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/homebridge-eufy-security"><img src="https://img.shields.io/npm/v/homebridge-eufy-security?color=green&label=stable" alt="stable"></a>
|
|
11
|
+
<a href="https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Special-Version-(BETA---RC---HKSV)"><img src="https://img.shields.io/npm/v/homebridge-eufy-security/beta?label=beta" alt="beta"></a>
|
|
12
|
+
<a href="https://github.com/homebridge/homebridge/wiki/Verified-Plugins"><img src="https://badgen.net/badge/homebridge/verified/purple" alt="verified"></a>
|
|
13
|
+
<a href="https://www.npmjs.com/package/homebridge-eufy-security"><img src="https://img.shields.io/npm/dt/homebridge-eufy-security" alt="downloads"></a>
|
|
14
|
+
<a href="https://discord.com/channels/432663330281226270/876907345962229791"><img src="https://img.shields.io/discord/432663330281226270?color=728ED5&logo=discord&label=discord" alt="discord"></a>
|
|
15
|
+
</p>
|
|
26
16
|
|
|
27
|
-
|
|
17
|
+
---
|
|
28
18
|
|
|
29
|
-
|
|
30
|
-
- For configuration Homebridge UI is recommenend. If you have 2FA enabled it is mandatory.
|
|
19
|
+
## ✨ Features
|
|
31
20
|
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
| | |
|
|
22
|
+
|---|---|
|
|
23
|
+
| 🎥 **Live Streaming** | P2P & RTSP livestream in the Home app |
|
|
24
|
+
| 📹 **HomeKit Secure Video** | Record and review clips natively in HomeKit |
|
|
25
|
+
| 🔔 **Doorbell & Sensors** | Ring notifications, motion & entry sensors |
|
|
26
|
+
| 🔐 **Locks & Guard Modes** | Smart lock control, arm/disarm your station |
|
|
27
|
+
| 🏠 **Bridged & Unbridged** | Run cameras as separate accessories for performance |
|
|
34
28
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
* [Configuration](https://github.com/homebridge-eufy-security/plugin/wiki/Installation-and-Configuration#configuration)
|
|
38
|
-
* [Bridged and Unbridged Mode](https://github.com/homebridge-eufy-security/plugin/wiki/Bridged-and-Unbridged-Mode-and-Problems)
|
|
39
|
-
* [Beta Version](https://github.com/homebridge-eufy-security/plugin/wiki/Special-Version-(BETA---RC---HKSV))
|
|
40
|
-
* [Uninstallation](https://github.com/homebridge-eufy-security/plugin/wiki/Uninstallation)
|
|
29
|
+
> **Supported devices** — Cameras, doorbells, floodlights, indoor cams, locks, sensors, stations & more.
|
|
30
|
+
> See the full [Supported Devices](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Supported-Devices) list.
|
|
41
31
|
|
|
42
|
-
|
|
43
|
-
* [Streaming](https://github.com/homebridge-eufy-security/plugin/wiki/Streaming-Settings)
|
|
44
|
-
* [HomeKit Secure Video](https://github.com/homebridge-eufy-security/plugin/wiki/HomeKit-Secure-Video)
|
|
32
|
+
---
|
|
45
33
|
|
|
46
|
-
|
|
47
|
-
* [Basic Troubleshooting](https://github.com/homebridge-eufy-security/plugin/wiki/Basic-Troubleshooting)
|
|
48
|
-
* [Common Issues](https://github.com/homebridge-eufy-security/plugin/wiki/Common-Issues)
|
|
49
|
-
* [Support Request](https://github.com/homebridge-eufy-security/plugin/issues/new/choose)
|
|
50
|
-
* [Changelog](https://github.com/homebridge-eufy-security/plugin/blob/master/CHANGELOG.md)
|
|
34
|
+
## 🚀 Getting Started
|
|
51
35
|
|
|
52
|
-
|
|
36
|
+
| Requirement | |
|
|
37
|
+
|---|---|
|
|
38
|
+
| [Homebridge](https://homebridge.io) | `>=1.9.0` |
|
|
39
|
+
| Node.js | `20`, `22` or `24` |
|
|
40
|
+
| Eufy Account | A [dedicated guest account](https://support.eufylife.com/s/article/Share-Your-eufySecurity-Devices-With-Your-Family) is **mandatory** |
|
|
53
41
|
|
|
54
|
-
|
|
42
|
+
> **💡 Node.js & RSA_PKCS1_PADDING** — Node.js `18.19.1+`, `20.11.1+` and `21.6.2+` removed `RSA_PKCS1_PADDING` which affects P2P livestream on some devices. The plugin includes a built-in **Embedded PKCS1 Support** setting that works around this on Node.js 20 and 22. Node.js `24.5.0+` restores native support. See the [compatibility guide](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Node.js-Compatibility-with-Eufy-Security-Plugin) for details.
|
|
55
43
|
|
|
56
|
-
|
|
44
|
+
---
|
|
57
45
|
|
|
58
|
-
|
|
59
|
-
- **[schliemann](https://github.com/schliemann)**
|
|
60
|
-
- **[thieren](https://ko-fi.com/thieren)**
|
|
46
|
+
## 📖 Documentation
|
|
61
47
|
|
|
62
|
-
|
|
48
|
+
| Setup | Features | Help |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| [Installation](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Installation-and-Configuration#installation) | [Streaming](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Streaming-Settings) | [Troubleshooting](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Basic-Troubleshooting) |
|
|
51
|
+
| [Configuration](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Installation-and-Configuration#configuration) | [HomeKit Secure Video](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/HomeKit-Secure-Video) | [Common Issues](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Common-Issues) |
|
|
52
|
+
| [Bridged & Unbridged](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Bridged-and-Unbridged-Mode-and-Problems) | [Supported Devices](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Supported-Devices) | [Report a Bug](https://github.com/homebridge-plugins/homebridge-eufy-security/issues/new/choose) |
|
|
53
|
+
| [Beta Versions](https://github.com/homebridge-plugins/homebridge-eufy-security/wiki/Special-Version-(BETA---RC---HKSV)) | | [Changelog](https://github.com/homebridge-plugins/homebridge-eufy-security/blob/master/CHANGELOG.md) |
|
|
63
54
|
|
|
64
|
-
|
|
55
|
+
---
|
|
65
56
|
|
|
57
|
+
## 💛 Supporting
|
|
66
58
|
|
|
67
|
-
|
|
59
|
+
| Active Contributors |
|
|
60
|
+
|---|
|
|
61
|
+
| [Lenoxys](https://github.com/sponsors/lenoxys) |
|
|
68
62
|
|
|
69
|
-
|
|
63
|
+
**Founded by** [samemory](https://ko-fi.com/S6S24XCVJ) · **Powered by** [bropat](https://ko-fi.com/bropat)'s [eufy-security-client](https://github.com/bropat/eufy-security-client)
|
|
70
64
|
|
|
71
|
-
|
|
65
|
+
---
|
|
72
66
|
|
|
73
|
-
|
|
74
|
-
- Use this plugin entirely at your own risk - please see licence for more information.
|
|
67
|
+
<sub>This project is not affiliated with Anker or Eufy Security. Use entirely at your own risk — see [LICENSE](LICENSE) for details.</sub>
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const eufy_security_client_1 = require("eufy-security-client");
|
|
5
|
-
const StationAccessory_1 = require("./StationAccessory");
|
|
6
|
-
const utils_1 = require("../utils/utils");
|
|
1
|
+
import { AlarmEvent, GuardMode } from 'eufy-security-client';
|
|
2
|
+
import { StationAccessory } from './StationAccessory.js';
|
|
3
|
+
import { CHAR, SERV, log } from '../utils/utils.js';
|
|
7
4
|
/**
|
|
8
5
|
* Platform Auto Accessory
|
|
9
6
|
* An instance of this class is created for each accessory your platform registers
|
|
10
7
|
* Each accessory may expose multiple services of different service types.
|
|
11
8
|
*/
|
|
12
|
-
class AutoSyncStationAccessory {
|
|
9
|
+
export class AutoSyncStationAccessory {
|
|
13
10
|
accessory;
|
|
14
11
|
device;
|
|
15
12
|
static first = true;
|
|
@@ -32,14 +29,14 @@ class AutoSyncStationAccessory {
|
|
|
32
29
|
// if it's the first we do create a full station accessory and then store it
|
|
33
30
|
// if not we need to fire event from Eufy to push to HK and vice versa
|
|
34
31
|
if (first) {
|
|
35
|
-
|
|
32
|
+
log.debug(`${this.accessory.displayName} Constructed First Station`);
|
|
36
33
|
// Create the Station accessory
|
|
37
|
-
AutoSyncStationAccessory.first_station = new
|
|
34
|
+
AutoSyncStationAccessory.first_station = new StationAccessory(platform, accessory, device);
|
|
38
35
|
this.device.on('guard mode', this.changeModeToAllChilds.bind(this));
|
|
39
36
|
this.device.on('alarm event', this.fireAlarmToAllChilds.bind(this));
|
|
40
37
|
}
|
|
41
38
|
else {
|
|
42
|
-
|
|
39
|
+
log.debug(`${this.accessory.displayName} Constructed Child Station`);
|
|
43
40
|
// Register to Eufy event of all childs
|
|
44
41
|
this.initChildEventRegister();
|
|
45
42
|
}
|
|
@@ -49,18 +46,18 @@ class AutoSyncStationAccessory {
|
|
|
49
46
|
initChildEventRegister() {
|
|
50
47
|
const first_station = AutoSyncStationAccessory.first_station;
|
|
51
48
|
this.device.on('current mode', (station, currentMode) => {
|
|
52
|
-
|
|
49
|
+
log.debug(`FWD ${this.name} 'current mode' TO clearTimeout (${currentMode})`);
|
|
53
50
|
if (this.guardModeChangeTimeout.timeout) {
|
|
54
51
|
// If there's an existing timeout, clear it
|
|
55
52
|
clearTimeout(this.guardModeChangeTimeout.timeout);
|
|
56
53
|
}
|
|
57
54
|
});
|
|
58
55
|
this.device.on('alarm arm delay event', (station, armDelay) => {
|
|
59
|
-
|
|
56
|
+
log.debug(`FWD ${this.name} 'alarm arm delay event' TO ${first_station.name}`);
|
|
60
57
|
first_station.onStationAlarmDelayedEvent(station, armDelay);
|
|
61
58
|
});
|
|
62
59
|
this.device.on('alarm armed event', () => {
|
|
63
|
-
|
|
60
|
+
log.debug(`FWD ${this.name} 'alarm armed event' TO ${first_station.name}`);
|
|
64
61
|
first_station.onStationAlarmArmedEvent();
|
|
65
62
|
});
|
|
66
63
|
this.device.on('alarm event', this.fireAlarmToAllChilds.bind(this));
|
|
@@ -69,7 +66,7 @@ class AutoSyncStationAccessory {
|
|
|
69
66
|
* Handle requests to set the 'Security System Target State' to all childs
|
|
70
67
|
*/
|
|
71
68
|
changeModeToAllChilds(station, guardMode) {
|
|
72
|
-
|
|
69
|
+
log.info(`FWD ${this.name} 'guard mode (${GuardMode[guardMode]})' TO all the childs`);
|
|
73
70
|
AutoSyncStationAccessory.childs.forEach((child, index) => {
|
|
74
71
|
if (index === 0) {
|
|
75
72
|
return;
|
|
@@ -86,7 +83,7 @@ class AutoSyncStationAccessory {
|
|
|
86
83
|
const first_station = AutoSyncStationAccessory.first_station;
|
|
87
84
|
const manualAlarmSeconds = first_station.stationConfig.manualAlarmSeconds;
|
|
88
85
|
// Log the received alarm event
|
|
89
|
-
|
|
86
|
+
log.debug(`RECEIVED ${this.name} 'alarm event' REASON ${AlarmEvent[alarmEvent]}`);
|
|
90
87
|
// Prevent looping with multiple received events
|
|
91
88
|
// Reinit after manualAlarmSeconds * 4 / 5
|
|
92
89
|
if (AutoSyncStationAccessory.alarmFired) {
|
|
@@ -94,26 +91,26 @@ class AutoSyncStationAccessory {
|
|
|
94
91
|
}
|
|
95
92
|
else {
|
|
96
93
|
AutoSyncStationAccessory.alarmFired = true;
|
|
97
|
-
|
|
94
|
+
log.debug(`SET TIMEOUT ${this.name} 'alarm event' REASON ${AlarmEvent[alarmEvent]} FOR ${manualAlarmSeconds * 4 / 5}sec`);
|
|
98
95
|
AutoSyncStationAccessory.alarmFiredTimeout.timeout = setTimeout(() => {
|
|
99
96
|
AutoSyncStationAccessory.alarmFired = false;
|
|
100
|
-
|
|
97
|
+
log.debug(`TIMEOUT ${this.name} 'alarm event' REASON ${AlarmEvent[alarmEvent]}`);
|
|
101
98
|
}, manualAlarmSeconds * 4 / 5 * 1000);
|
|
102
99
|
}
|
|
103
100
|
// List of alarm events fired to stop alarm
|
|
104
101
|
const pluginFiredAlarmStopEvents = [
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
102
|
+
AlarmEvent.HUB_STOP,
|
|
103
|
+
AlarmEvent.HUB_STOP_BY_APP,
|
|
104
|
+
AlarmEvent.HUB_STOP_BY_HAND,
|
|
105
|
+
AlarmEvent.HUB_STOP_BY_KEYPAD,
|
|
106
|
+
AlarmEvent.DEV_STOP
|
|
110
107
|
];
|
|
111
108
|
// Check if the alarm event is a plugin-fired alarm stop event
|
|
112
109
|
if (pluginFiredAlarmStopEvents.includes(alarmEvent)) {
|
|
113
110
|
return;
|
|
114
111
|
}
|
|
115
|
-
const characteristic = first_station.getService(
|
|
116
|
-
.getCharacteristic(
|
|
112
|
+
const characteristic = first_station.getService(SERV.SecuritySystem)
|
|
113
|
+
.getCharacteristic(CHAR.SecuritySystemCurrentState);
|
|
117
114
|
first_station.onStationAlarmEventPushNotification(characteristic, alarmEvent);
|
|
118
115
|
// Iterate over child stations to synchronize the alarm event
|
|
119
116
|
AutoSyncStationAccessory.childs.forEach(child => {
|
|
@@ -122,7 +119,7 @@ class AutoSyncStationAccessory {
|
|
|
122
119
|
return; // Already fired by itself so do nothing for him
|
|
123
120
|
}
|
|
124
121
|
// Log the forwarded alarm event along with the reason and duration
|
|
125
|
-
|
|
122
|
+
log.debug(`FWD ${this.name} 'alarm event' TO ${child.name} REASON ${AlarmEvent[alarmEvent]} FOR ${manualAlarmSeconds}sec`);
|
|
126
123
|
// Trigger the alarm sound on the child station with the specified duration
|
|
127
124
|
child.device.triggerStationAlarmSound(manualAlarmSeconds);
|
|
128
125
|
});
|
|
@@ -132,29 +129,28 @@ class AutoSyncStationAccessory {
|
|
|
132
129
|
*/
|
|
133
130
|
handleSecuritySystemTargetStateSet(mode) {
|
|
134
131
|
try {
|
|
135
|
-
|
|
132
|
+
log.debug(`${this.name} SET StationGuardMode Eufy: ${GuardMode[mode]}(${mode})`);
|
|
136
133
|
// Call the device's setGuardMode method to initiate the action
|
|
137
134
|
this.device.setGuardMode(mode);
|
|
138
135
|
// Set a new timeout
|
|
139
136
|
this.guardModeChangeTimeout.timeout = setTimeout(() => {
|
|
140
137
|
// This code is executed when the timeout elapses, indicating that the action may not have completed yet.
|
|
141
138
|
// You can include a message indicating that the action is being retried.
|
|
142
|
-
|
|
139
|
+
log.warn(`${this.accessory.displayName} Changing guard mode to ${GuardMode[mode]} did not complete. Retry...'`);
|
|
143
140
|
// Call the device's setGuardMode method to initiate the action
|
|
144
141
|
this.device.setGuardMode(mode);
|
|
145
142
|
// Set a secondary timeout for retry, if needed
|
|
146
143
|
const retryTimeout = setTimeout(() => {
|
|
147
144
|
// This code is executed if the retry also times out, indicating a failure.
|
|
148
|
-
|
|
145
|
+
log.error(`${this.accessory.displayName} Changing guard mode to ${GuardMode[mode]} timed out!`);
|
|
149
146
|
}, this.guardModeChangeTimeout.delay);
|
|
150
147
|
// Store the retry timeout as part of guardModeChangeTimeout
|
|
151
148
|
this.guardModeChangeTimeout.timeout = retryTimeout;
|
|
152
149
|
}, this.guardModeChangeTimeout.delay);
|
|
153
150
|
}
|
|
154
151
|
catch (error) {
|
|
155
|
-
|
|
152
|
+
log.error(`${this.name} Error Setting security mode! ${error}`);
|
|
156
153
|
}
|
|
157
154
|
}
|
|
158
155
|
}
|
|
159
|
-
exports.AutoSyncStationAccessory = AutoSyncStationAccessory;
|
|
160
156
|
//# sourceMappingURL=AutoSyncStationAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoSyncStationAccessory.js","sourceRoot":"","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"AutoSyncStationAccessory.js","sourceRoot":"","sources":["../../src/accessories/AutoSyncStationAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const utils_1 = require("../utils/utils");
|
|
1
|
+
// Servicing and caching strategy inspired
|
|
2
|
+
// by homebridge-ring — https://github.com/dgreif/ring
|
|
3
|
+
import { DeviceType } from 'eufy-security-client';
|
|
4
|
+
import { EventEmitter } from 'events';
|
|
5
|
+
import { CHAR, SERV, log } from '../utils/utils.js';
|
|
7
6
|
/**
|
|
8
7
|
* Determine if the serviceType is an instance of Service.
|
|
9
8
|
*
|
|
@@ -11,10 +10,9 @@ const utils_1 = require("../utils/utils");
|
|
|
11
10
|
* @returns {boolean} Returns true if the serviceType is an instance of Service, otherwise false.
|
|
12
11
|
*/
|
|
13
12
|
function isServiceInstance(serviceType) {
|
|
14
|
-
// eslint-disable-next-line
|
|
15
13
|
return typeof serviceType === 'object';
|
|
16
14
|
}
|
|
17
|
-
class BaseAccessory extends
|
|
15
|
+
export class BaseAccessory extends EventEmitter {
|
|
18
16
|
platform;
|
|
19
17
|
accessory;
|
|
20
18
|
device;
|
|
@@ -22,9 +20,13 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
22
20
|
SN;
|
|
23
21
|
name;
|
|
24
22
|
log;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Tracks characteristics with getValue for cache-based updates.
|
|
25
|
+
* Values are seeded once at registration and refreshed via
|
|
26
|
+
* the device's 'property changed' event (push-based).
|
|
27
|
+
*/
|
|
28
|
+
registeredGetters = [];
|
|
29
|
+
constructor(platform, accessory, device) {
|
|
28
30
|
super();
|
|
29
31
|
this.platform = platform;
|
|
30
32
|
this.accessory = accessory;
|
|
@@ -32,55 +34,82 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
32
34
|
this.device = device;
|
|
33
35
|
this.SN = this.device.getSerial();
|
|
34
36
|
this.name = this.device.getName();
|
|
35
|
-
this.log =
|
|
37
|
+
this.log = log.getSubLogger({
|
|
36
38
|
name: '',
|
|
37
39
|
prefix: [this.name],
|
|
38
40
|
});
|
|
39
41
|
this.registerCharacteristic({
|
|
40
|
-
serviceType:
|
|
41
|
-
characteristicType:
|
|
42
|
+
serviceType: SERV.AccessoryInformation,
|
|
43
|
+
characteristicType: CHAR.Manufacturer,
|
|
42
44
|
getValue: () => 'Eufy',
|
|
43
45
|
});
|
|
44
46
|
this.registerCharacteristic({
|
|
45
|
-
serviceType:
|
|
46
|
-
characteristicType:
|
|
47
|
+
serviceType: SERV.AccessoryInformation,
|
|
48
|
+
characteristicType: CHAR.Name,
|
|
47
49
|
getValue: () => this.name || 'Unknowm',
|
|
48
50
|
});
|
|
49
51
|
this.registerCharacteristic({
|
|
50
|
-
serviceType:
|
|
51
|
-
characteristicType:
|
|
52
|
-
getValue: () =>
|
|
52
|
+
serviceType: SERV.AccessoryInformation,
|
|
53
|
+
characteristicType: CHAR.Model,
|
|
54
|
+
getValue: () => DeviceType[this.device.getDeviceType()] || 'Unknowm',
|
|
53
55
|
});
|
|
54
56
|
this.registerCharacteristic({
|
|
55
|
-
serviceType:
|
|
56
|
-
characteristicType:
|
|
57
|
+
serviceType: SERV.AccessoryInformation,
|
|
58
|
+
characteristicType: CHAR.SerialNumber,
|
|
57
59
|
getValue: () => this.SN || 'Unknowm',
|
|
58
60
|
});
|
|
59
61
|
this.registerCharacteristic({
|
|
60
|
-
serviceType:
|
|
61
|
-
characteristicType:
|
|
62
|
+
serviceType: SERV.AccessoryInformation,
|
|
63
|
+
characteristicType: CHAR.FirmwareRevision,
|
|
62
64
|
getValue: () => this.device.getSoftwareVersion() || 'Unknowm',
|
|
63
65
|
});
|
|
64
66
|
this.registerCharacteristic({
|
|
65
|
-
serviceType:
|
|
66
|
-
characteristicType:
|
|
67
|
+
serviceType: SERV.AccessoryInformation,
|
|
68
|
+
characteristicType: CHAR.HardwareRevision,
|
|
67
69
|
getValue: () => this.device.getHardwareVersion() || 'Unknowm',
|
|
68
70
|
});
|
|
71
|
+
// Cameras accumulate many listeners (property changes, events, snapshots, streaming).
|
|
72
|
+
// Raise limit to prevent MaxListenersExceededWarning in Node 22+.
|
|
73
|
+
if (typeof this.device.setMaxListeners === 'function') {
|
|
74
|
+
this.device.setMaxListeners(30);
|
|
75
|
+
}
|
|
69
76
|
if (this.platform.config.enableDetailedLogging) {
|
|
70
77
|
this.device.on('raw property changed', this.handleRawPropertyChange.bind(this));
|
|
71
78
|
this.device.on('property changed', this.handlePropertyChange.bind(this));
|
|
72
79
|
}
|
|
80
|
+
// Refresh cached characteristic values on any device property change.
|
|
81
|
+
// This keeps all getValue-based characteristics up-to-date via push
|
|
82
|
+
// without requiring HomeKit to poll through onGet.
|
|
83
|
+
this.device.on('property changed', this.refreshCachedValues.bind(this));
|
|
73
84
|
this.logPropertyKeys();
|
|
74
85
|
}
|
|
75
86
|
// Function to extract and log keys
|
|
76
87
|
logPropertyKeys() {
|
|
77
88
|
this.log.debug(`Property Keys:`, this.device.getProperties());
|
|
78
89
|
}
|
|
79
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Re-evaluate every registered getValue and push updates to HomeKit
|
|
92
|
+
* only when the returned value has actually changed.
|
|
93
|
+
* Triggered by the device's 'property changed' event.
|
|
94
|
+
*/
|
|
95
|
+
refreshCachedValues() {
|
|
96
|
+
for (const reg of this.registeredGetters) {
|
|
97
|
+
try {
|
|
98
|
+
const newValue = reg.getValue(undefined, reg.characteristic, reg.service);
|
|
99
|
+
if (newValue !== reg.lastValue) {
|
|
100
|
+
reg.lastValue = newValue;
|
|
101
|
+
reg.characteristic.updateValue(newValue);
|
|
102
|
+
this.log.debug(`CACHE '${reg.serviceTypeName} / ${reg.characteristicTypeName}':`, newValue);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// silently ignore errors during cache refresh
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
80
110
|
handleRawPropertyChange(device, type, value) {
|
|
81
111
|
this.log.debug(`Raw Property Changes:`, type, value);
|
|
82
112
|
}
|
|
83
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
113
|
handlePropertyChange(device, name, value) {
|
|
85
114
|
this.log.debug(`Property Changes:`, name, value);
|
|
86
115
|
}
|
|
@@ -98,11 +127,30 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
98
127
|
const characteristic = service.getCharacteristic(characteristicType);
|
|
99
128
|
this.log.debug(`REGISTER CHARACTERISTIC (${service.UUID}) / (${characteristic.UUID})`);
|
|
100
129
|
if (getValue) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
130
|
+
// Seed initial value and track for property-change refresh.
|
|
131
|
+
// No onGet handler is registered — HomeKit uses the value set by
|
|
132
|
+
// updateValue(), making polls (every ~10s) zero-cost.
|
|
133
|
+
// Fresh values are pushed via 'property changed', onSimpleValue,
|
|
134
|
+
// onValue, and onMultipleValue events.
|
|
135
|
+
let initialValue;
|
|
136
|
+
try {
|
|
137
|
+
initialValue = getValue(undefined, characteristic, service);
|
|
138
|
+
this.log.debug(`SEED '${serviceType.name} / ${characteristicType.name}':`, initialValue);
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
this.log.debug(`SEED FAIL '${serviceType.name} / ${characteristicType.name}':`, e);
|
|
142
|
+
}
|
|
143
|
+
this.registeredGetters.push({
|
|
144
|
+
getValue,
|
|
145
|
+
characteristic,
|
|
146
|
+
service,
|
|
147
|
+
serviceTypeName: serviceType.name || 'unknown',
|
|
148
|
+
characteristicTypeName: characteristicType.name || 'unknown',
|
|
149
|
+
lastValue: initialValue,
|
|
105
150
|
});
|
|
151
|
+
if (initialValue !== undefined && initialValue !== null) {
|
|
152
|
+
characteristic.updateValue(initialValue);
|
|
153
|
+
}
|
|
106
154
|
}
|
|
107
155
|
if (setValue && setValueDebounceTime) {
|
|
108
156
|
let timeoutId = null;
|
|
@@ -122,7 +170,6 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
122
170
|
});
|
|
123
171
|
}
|
|
124
172
|
if (onSimpleValue) {
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
126
173
|
this.device.on(onSimpleValue, (device, value) => {
|
|
127
174
|
this.log.info(`ON '${serviceType.name} / ${characteristicType.name} / ${onSimpleValue}':`, value);
|
|
128
175
|
characteristic.updateValue(value);
|
|
@@ -135,7 +182,6 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
135
182
|
if (onMultipleValue) {
|
|
136
183
|
// Attach the common event handler to each event type
|
|
137
184
|
onMultipleValue.forEach(eventType => {
|
|
138
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
185
|
this.device.on(eventType, (device, value) => {
|
|
140
186
|
this.log.info(`ON '${serviceType.name} / ${characteristicType.name} / ${eventType}':`, value);
|
|
141
187
|
characteristic.updateValue(value);
|
|
@@ -170,8 +216,16 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
170
216
|
return service;
|
|
171
217
|
}
|
|
172
218
|
pruneUnusedServices() {
|
|
219
|
+
// Services managed by CameraController must never be pruned.
|
|
220
|
+
// CameraController creates these automatically during configureController()
|
|
221
|
+
// and they are not tracked in servicesInUse.
|
|
173
222
|
const safeServiceUUIDs = [
|
|
174
|
-
|
|
223
|
+
SERV.CameraRTPStreamManagement.UUID, // 00000110
|
|
224
|
+
'0000021A-0000-1000-8000-0026BB765291', // CameraOperatingMode (HKSV)
|
|
225
|
+
'00000204-0000-1000-8000-0026BB765291', // CameraRecordingManagement (HKSV)
|
|
226
|
+
'00000129-0000-1000-8000-0026BB765291', // DataStreamTransportManagement (HKSV)
|
|
227
|
+
SERV.Microphone.UUID, // 00000112 (created by CameraController)
|
|
228
|
+
SERV.Speaker.UUID, // 00000113 (created by CameraController)
|
|
175
229
|
];
|
|
176
230
|
this.accessory.services.forEach((service) => {
|
|
177
231
|
if (!this.servicesInUse.includes(service) &&
|
|
@@ -181,21 +235,5 @@ class BaseAccessory extends events_1.EventEmitter {
|
|
|
181
235
|
}
|
|
182
236
|
});
|
|
183
237
|
}
|
|
184
|
-
handleDummyEventGet(serviceName) {
|
|
185
|
-
const characteristicValues = {
|
|
186
|
-
'EventSnapshotsActive': utils_1.CHAR.EventSnapshotsActive.DISABLE,
|
|
187
|
-
'HomeKitCameraActive': utils_1.CHAR.HomeKitCameraActive.OFF,
|
|
188
|
-
};
|
|
189
|
-
const currentValue = characteristicValues[serviceName];
|
|
190
|
-
if (currentValue === undefined) {
|
|
191
|
-
throw new Error(`Invalid serviceName: ${serviceName}`);
|
|
192
|
-
}
|
|
193
|
-
this.log.debug(`IGNORE GET ${serviceName}: ${currentValue}`);
|
|
194
|
-
return Promise.resolve(currentValue);
|
|
195
|
-
}
|
|
196
|
-
handleDummyEventSet(serviceName, value) {
|
|
197
|
-
this.log.debug(`IGNORE SET ${serviceName}: ${value}`);
|
|
198
|
-
}
|
|
199
238
|
}
|
|
200
|
-
exports.BaseAccessory = BaseAccessory;
|
|
201
239
|
//# sourceMappingURL=BaseAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseAccessory.js","sourceRoot":"","sources":["../../src/
|
|
1
|
+
{"version":3,"file":"BaseAccessory.js","sourceRoot":"","sources":["../../src/accessories/BaseAccessory.ts"],"names":[],"mappings":"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"}
|