@homebridge-plugins/homebridge-eufy-security 4.6.0-beta.3 → 4.6.0-beta.30

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 (37) hide show
  1. package/.claude/CLAUDE.md +175 -0
  2. package/.claude/PRD.md +241 -0
  3. package/.claude/skills/architect/SKILL.md +76 -0
  4. package/.claude/skills/developer/SKILL.md +59 -0
  5. package/.claude/skills/new-device-support/SKILL.md +102 -51
  6. package/.claude/skills/new-device-support/check-device.mjs +363 -0
  7. package/.claude/skills/new-device-support/map-properties.mjs +144 -10
  8. package/.claude/skills/new-device-support/verify-device.mjs +272 -0
  9. package/.claude/skills/planner/SKILL.md +100 -0
  10. package/.claude/skills/qa/SKILL.md +79 -0
  11. package/.claude/skills/support/SKILL.md +175 -0
  12. package/dist/accessories/CameraAccessory.js +7 -0
  13. package/dist/accessories/CameraAccessory.js.map +1 -1
  14. package/dist/controller/LocalLivestreamManager.js +79 -8
  15. package/dist/controller/LocalLivestreamManager.js.map +1 -1
  16. package/dist/controller/recordingDelegate.js +19 -6
  17. package/dist/controller/recordingDelegate.js.map +1 -1
  18. package/dist/controller/streamingDelegate.js +6 -3
  19. package/dist/controller/streamingDelegate.js.map +1 -1
  20. package/dist/platform.js +3 -25
  21. package/dist/platform.js.map +1 -1
  22. package/dist/utils/configTypes.js +1 -0
  23. package/dist/utils/configTypes.js.map +1 -1
  24. package/dist/utils/ffmpeg.js +123 -15
  25. package/dist/utils/ffmpeg.js.map +1 -1
  26. package/dist/utils/utils.js +27 -2
  27. package/dist/utils/utils.js.map +1 -1
  28. package/dist/version.js +1 -1
  29. package/dist/version.js.map +1 -1
  30. package/homebridge-ui/public/assets/devices/eufyCamS4_large.png +0 -0
  31. package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
  32. package/homebridge-ui/public/assets/devices/nvr_s4_max_T8N00_large.png +0 -0
  33. package/homebridge-ui/public/utils/device-images.js +1 -0
  34. package/homebridge-ui/public/views/device-detail.js +10 -0
  35. package/homebridge-ui/server.js +1 -25
  36. package/package.json +7 -7
  37. package/scripts/decrypt-diagnostics.mjs +6 -7
@@ -82,6 +82,7 @@ const DeviceImages = {
82
82
  case 201: return 'smartlock_t85L0_large.png';
83
83
  case 202: return 'smartlock_t85D0_large.png';
84
84
  case 203: return 'smartlock_t85V0_large.png';
85
+ case 300: return 'nvr_s4_max_T8N00_large.png';
85
86
  case 10005: return 'walllight_s120_large.png';
86
87
  case 10008: return 'indoorcamC220_large.png';
87
88
  case 10009: return 'indoorcamC210_large.png';
@@ -196,6 +196,16 @@ const DeviceDetailView = {
196
196
  });
197
197
  }
198
198
 
199
+ Toggle.render(advSection, {
200
+ id: 'toggle-audio',
201
+ label: 'Audio',
202
+ help: 'Include audio in camera streams and recordings.',
203
+ checked: deviceConfig.audio !== false,
204
+ onChange: async (checked) => {
205
+ await Config.updateDeviceConfig(device.uniqueId, { audio: checked });
206
+ },
207
+ });
208
+
199
209
  if (device.supportsTalkback) {
200
210
  Toggle.render(advSection, {
201
211
  id: 'toggle-talkback',
@@ -163,29 +163,6 @@ class UiServer extends HomebridgePluginUiServer {
163
163
  errorName: ['bold', 'bgRedBright', 'whiteBright'],
164
164
  fileName: ['yellow'],
165
165
  },
166
- maskValuesOfKeys: [
167
- 'username',
168
- 'password',
169
- 'token',
170
- 'clientPrivateKey',
171
- 'private_key',
172
- 'login_hash',
173
- 'serverPublicKey',
174
- 'cloud_token',
175
- 'refreshToken',
176
- 'p2p_conn',
177
- 'app_conn',
178
- 'address',
179
- 'latitude',
180
- 'longitude',
181
- 'serialnumber',
182
- 'serialNumber',
183
- 'stationSerialNumber',
184
- 'data',
185
- 'ignoreStations',
186
- 'ignoreDevices',
187
- 'pincode',
188
- ],
189
166
  };
190
167
  this.log = new TsLogger(logOptions);
191
168
  this.tsLog = new TsLogger({ ...logOptions, type: 'hidden', minLevel: 2 });
@@ -1236,8 +1213,7 @@ class UiServer extends HomebridgePluginUiServer {
1236
1213
  const encryptedBuffer = encryptDiagnostics(fileBuffer);
1237
1214
 
1238
1215
  this.pushEvent('diagnosticsProgress', { progress: 90, status: 'Returning encrypted archive' });
1239
- const encFilename = archiveName + '.enc';
1240
- return { buffer: encryptedBuffer, filename: encFilename };
1216
+ return { buffer: encryptedBuffer, filename: archiveName };
1241
1217
  } catch (error) {
1242
1218
  this.log.error('Error while generating diagnostics archive: ' + error);
1243
1219
  throw error;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "Homebridge Eufy Security",
3
3
  "name": "@homebridge-plugins/homebridge-eufy-security",
4
- "version": "4.6.0-beta.3",
4
+ "version": "4.6.0-beta.30",
5
5
  "description": "Control Eufy Security from homebridge.",
6
6
  "type": "module",
7
7
  "license": "Apache-2.0",
@@ -43,20 +43,20 @@
43
43
  ],
44
44
  "dependencies": {
45
45
  "eufy-security-client": "dev",
46
- "@homebridge/plugin-ui-utils": "^2.2.0",
46
+ "@homebridge/plugin-ui-utils": "^2.2.1",
47
47
  "ffmpeg-for-homebridge": "2.2.1",
48
48
  "tslog": "^4.10.2",
49
49
  "rotating-file-stream": "^3.2.9",
50
50
  "pick-port": "^2.2.0",
51
- "tar": "^7.5.9"
51
+ "tar": "^7.5.11"
52
52
  },
53
53
  "devDependencies": {
54
54
  "typescript": "^5.9.3",
55
55
  "homebridge": "^1.11.2",
56
- "eslint": "^9.39.3",
57
- "@eslint/js": "^9.39.3",
58
- "typescript-eslint": "^8.56.1",
59
- "@types/node": "^25.3.3",
56
+ "eslint": "^9.39.4",
57
+ "@eslint/js": "^9.39.4",
58
+ "typescript-eslint": "^8.57.0",
59
+ "@types/node": "^25.5.0",
60
60
  "rimraf": "^6.1.3"
61
61
  },
62
62
  "homepage": "https://github.com/homebridge-plugins/homebridge-eufy-security/wiki",
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Decrypt and extract an encrypted diagnostics archive (.enc) produced by the plugin.
4
+ * Decrypt and extract an encrypted diagnostics archive produced by the plugin.
5
5
  *
6
6
  * Usage:
7
- * node decrypt-diagnostics.mjs <encrypted-file.enc> [private-key.pem]
7
+ * node decrypt-diagnostics.mjs <encrypted-file.tar.gz> [private-key.pem]
8
8
  *
9
9
  * If the private key is omitted, the script looks for it in the keys/
10
10
  * directory next to itself (keys/diagnostics_private.pem).
11
11
  *
12
- * The archive is decrypted and extracted into a folder next to the .enc file,
12
+ * The archive is decrypted and extracted into a folder next to the input file,
13
13
  * named after the archive (e.g. diagnostics-2026-03-02-11-25-31/).
14
14
  *
15
- * File format of the .enc file:
15
+ * File format (the .tar.gz is actually encrypted, not a plain gzip):
16
16
  * [4 bytes] – magic: "DIAG"
17
17
  * [1 byte] – format version (currently 0x01)
18
18
  * [8 bytes] – creation timestamp (BigUInt64BE, ms since Unix epoch)
@@ -51,7 +51,7 @@ function main() {
51
51
  const args = process.argv.slice(2);
52
52
 
53
53
  if (args.length < 1) {
54
- console.error('Usage: node decrypt-diagnostics.mjs <encrypted-file.enc> [private-key.pem]');
54
+ console.error('Usage: node decrypt-diagnostics.mjs <encrypted-file.tar.gz> [private-key.pem]');
55
55
  process.exit(1);
56
56
  }
57
57
 
@@ -176,8 +176,7 @@ function main() {
176
176
  // Determine output directory next to the .enc file
177
177
  const encDir = path.dirname(encFile);
178
178
  const baseName = path.basename(encFile)
179
- .replace(/\.tar\.gz\.enc$/, '')
180
- .replace(/\.enc$/, '');
179
+ .replace(/\.tar\.gz(?:\.enc)?$/, '');
181
180
  const outDir = path.join(encDir, baseName);
182
181
 
183
182
  // --- Safety: inspect tar contents before extracting (piped via stdin, no temp file) ---