@viguza/homebridge-ezviz 1.2.8 → 1.2.10
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/README.md +23 -0
- package/dist/accessories/ip-camera.d.ts +8 -0
- package/dist/accessories/ip-camera.js +22 -3
- package/dist/accessories/ip-camera.js.map +1 -1
- package/dist/accessories/smart-plug.d.ts +16 -0
- package/dist/accessories/smart-plug.js +28 -4
- package/dist/accessories/smart-plug.js.map +1 -1
- package/dist/api/ezviz-api.d.ts +33 -0
- package/dist/api/ezviz-api.js +74 -7
- package/dist/api/ezviz-api.js.map +1 -1
- package/dist/platform.d.ts +38 -0
- package/dist/platform.js +91 -26
- package/dist/platform.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,6 +12,29 @@ This project is based on the original work by [Brandawg93](https://github.com/Br
|
|
|
12
12
|
- I only have a few devices to test, so this won't cover every single EZVIZ device.
|
|
13
13
|
- Use it at your own risk.
|
|
14
14
|
|
|
15
|
+
## Required Device Settings
|
|
16
|
+
|
|
17
|
+
Before using the plugin, you need to configure your EZVIZ devices with the following settings:
|
|
18
|
+
|
|
19
|
+
### 1. Enable Video & Picture Encryption
|
|
20
|
+
- Open the EZVIZ app
|
|
21
|
+
- Go to your device settings
|
|
22
|
+
- Navigate to Privacy settings
|
|
23
|
+
- Enable "Video & Picture Encryption"
|
|
24
|
+
|
|
25
|
+
### 2. Enable RTSP
|
|
26
|
+
RTSP (Real Time Streaming Protocol) is the protocol used by this plugin to connect to your device's livestream. You need to enable this setting for each device you want to use with the plugin.
|
|
27
|
+
|
|
28
|
+
- Open the EZVIZ app
|
|
29
|
+
- Go to Settings
|
|
30
|
+
- Select "LAN Live View"
|
|
31
|
+
- Start scanning and select your device from the list
|
|
32
|
+
- Once connected, tap the settings icon in the top right corner
|
|
33
|
+
- Select "Local Service settings"
|
|
34
|
+
- Enable RTSP
|
|
35
|
+
|
|
36
|
+
These settings are required for the plugin to access your device's livestream. Without them, you won't be able to view the camera feed in HomeKit.
|
|
37
|
+
|
|
15
38
|
## Installation
|
|
16
39
|
|
|
17
40
|
Install the Homebridge EZVIZ plugin using npm:
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { type PlatformAccessory } from 'homebridge';
|
|
2
2
|
import type { EZVIZPlatform } from '../platform.js';
|
|
3
3
|
import { EZVIZAPI } from '../api/ezviz-api.js';
|
|
4
|
+
/**
|
|
5
|
+
* IP Camera accessory for EZVIZ devices
|
|
6
|
+
* Handles video streaming and camera functionality
|
|
7
|
+
*/
|
|
4
8
|
export declare class IPCamera {
|
|
5
9
|
private readonly platform;
|
|
6
10
|
private readonly accessory;
|
|
7
11
|
private api;
|
|
8
12
|
private deviceSerial;
|
|
9
13
|
constructor(api: EZVIZAPI, platform: EZVIZPlatform, accessory: PlatformAccessory);
|
|
14
|
+
/**
|
|
15
|
+
* Gets the accessory instance
|
|
16
|
+
* @returns The platform accessory
|
|
17
|
+
*/
|
|
10
18
|
getAccessory(): PlatformAccessory<import("homebridge").UnknownContext>;
|
|
11
19
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { StreamingDelegate } from '../utils/streaming-delegate.js';
|
|
2
|
+
/**
|
|
3
|
+
* IP Camera accessory for EZVIZ devices
|
|
4
|
+
* Handles video streaming and camera functionality
|
|
5
|
+
*/
|
|
2
6
|
export class IPCamera {
|
|
3
7
|
platform;
|
|
4
8
|
accessory;
|
|
@@ -9,11 +13,14 @@ export class IPCamera {
|
|
|
9
13
|
this.accessory = accessory;
|
|
10
14
|
this.api = api;
|
|
11
15
|
this.deviceSerial = accessory.context.device.DeviceInfo.deviceSerial;
|
|
16
|
+
// Set accessory information
|
|
12
17
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
13
18
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'EZVIZ')
|
|
14
19
|
.setCharacteristic(this.platform.Characteristic.Model, accessory.context.device.DeviceInfo.deviceSubCategory)
|
|
15
20
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.deviceSerial);
|
|
21
|
+
// Create streaming delegate
|
|
16
22
|
const streamingDelegate = new StreamingDelegate(this.platform.api.hap, accessory.context.device, this.platform.log);
|
|
23
|
+
// Configure camera controller options
|
|
17
24
|
const options = {
|
|
18
25
|
cameraStreamCount: 2, // HomeKit requires at least 2 streams, but 1 is also just fine
|
|
19
26
|
delegate: streamingDelegate,
|
|
@@ -49,10 +56,22 @@ export class IPCamera {
|
|
|
49
56
|
},
|
|
50
57
|
},
|
|
51
58
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
try {
|
|
60
|
+
// Create and configure camera controller
|
|
61
|
+
const cameraController = new this.platform.api.hap.CameraController(options);
|
|
62
|
+
streamingDelegate.controller = cameraController;
|
|
63
|
+
accessory.configureController(streamingDelegate.controller);
|
|
64
|
+
this.platform.log.debug(`Successfully configured camera: ${accessory.context.device.Name}`);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.platform.log.error(`Error configuring camera ${accessory.context.device.Name}:`, error);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
55
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Gets the accessory instance
|
|
73
|
+
* @returns The platform accessory
|
|
74
|
+
*/
|
|
56
75
|
getAccessory() {
|
|
57
76
|
return this.accessory;
|
|
58
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-camera.js","sourceRoot":"","sources":["../../src/accessories/ip-camera.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE,MAAM,OAAO,QAAQ;IAMA;IACA;IANX,GAAG,CAAW;IACd,YAAY,CAAS;IAE7B,YACE,GAAa,EACI,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAE7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC;QAErE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC;aAC5G,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAEnF,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ip-camera.js","sourceRoot":"","sources":["../../src/accessories/ip-camera.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
|
|
2
2
|
import type { EZVIZPlatform } from '../platform.js';
|
|
3
3
|
import { EZVIZAPI } from '../api/ezviz-api.js';
|
|
4
|
+
/**
|
|
5
|
+
* Smart Plug accessory for EZVIZ devices
|
|
6
|
+
* Handles on/off functionality for smart plugs
|
|
7
|
+
*/
|
|
4
8
|
export declare class SmartPlug {
|
|
5
9
|
private readonly platform;
|
|
6
10
|
private readonly accessory;
|
|
7
11
|
private api;
|
|
8
12
|
constructor(api: EZVIZAPI, platform: EZVIZPlatform, accessory: PlatformAccessory);
|
|
13
|
+
/**
|
|
14
|
+
* Sets the on/off state of the smart plug
|
|
15
|
+
* @param value - The value to set (true for on, false for off)
|
|
16
|
+
*/
|
|
9
17
|
setOnState(value: CharacteristicValue): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Gets the current on/off state of the smart plug
|
|
20
|
+
* @returns Promise resolving to the current state
|
|
21
|
+
*/
|
|
10
22
|
getOnState(): Promise<CharacteristicValue>;
|
|
23
|
+
/**
|
|
24
|
+
* Gets the accessory instance
|
|
25
|
+
* @returns The platform accessory
|
|
26
|
+
*/
|
|
11
27
|
getAccessory(): PlatformAccessory<import("homebridge").UnknownContext>;
|
|
12
28
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { SwitchTypes } from '../utils/enums.js';
|
|
2
|
+
/**
|
|
3
|
+
* Smart Plug accessory for EZVIZ devices
|
|
4
|
+
* Handles on/off functionality for smart plugs
|
|
5
|
+
*/
|
|
2
6
|
export class SmartPlug {
|
|
3
7
|
platform;
|
|
4
8
|
accessory;
|
|
@@ -7,34 +11,54 @@ export class SmartPlug {
|
|
|
7
11
|
this.platform = platform;
|
|
8
12
|
this.accessory = accessory;
|
|
9
13
|
this.api = api;
|
|
14
|
+
// Set accessory information
|
|
10
15
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
11
16
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'EZVIZ')
|
|
12
17
|
.setCharacteristic(this.platform.Characteristic.Model, accessory.context.device.DeviceInfo.deviceSubCategory)
|
|
13
18
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.accessory.context.device.Serial);
|
|
14
|
-
|
|
19
|
+
// Set up the switch service
|
|
20
|
+
const plugService = this.accessory.getService(this.platform.Service.Switch) ||
|
|
21
|
+
this.accessory.addService(this.platform.Service.Switch);
|
|
15
22
|
plugService.setCharacteristic(this.platform.Characteristic.Name, this.accessory.context.device.Name);
|
|
23
|
+
// Set up event handlers
|
|
16
24
|
plugService.getCharacteristic(this.platform.Characteristic.On)
|
|
17
25
|
.onSet(this.setOnState.bind(this))
|
|
18
26
|
.onGet(this.getOnState.bind(this));
|
|
19
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Sets the on/off state of the smart plug
|
|
30
|
+
* @param value - The value to set (true for on, false for off)
|
|
31
|
+
*/
|
|
20
32
|
async setOnState(value) {
|
|
21
33
|
try {
|
|
22
34
|
const action = value ? true : false;
|
|
23
35
|
await this.api.setSwitchState(this.accessory.context.device.Serial, SwitchTypes.On, action);
|
|
36
|
+
this.platform.log.debug(`Successfully set ${this.accessory.context.device.Name} to ${action ? 'ON' : 'OFF'}`);
|
|
24
37
|
}
|
|
25
38
|
catch (error) {
|
|
26
|
-
this.platform.log.error(
|
|
39
|
+
this.platform.log.error(`Unable to set switch state for ${this.accessory.context.device.Name}:`, error);
|
|
40
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
27
41
|
}
|
|
28
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Gets the current on/off state of the smart plug
|
|
45
|
+
* @returns Promise resolving to the current state
|
|
46
|
+
*/
|
|
29
47
|
async getOnState() {
|
|
30
48
|
try {
|
|
31
|
-
|
|
49
|
+
const state = await this.api.getSwitchState(this.accessory.context.device.Serial, SwitchTypes.On);
|
|
50
|
+
this.platform.log.debug(`${this.accessory.context.device.Name} is currently ${state ? 'ON' : 'OFF'}`);
|
|
51
|
+
return state;
|
|
32
52
|
}
|
|
33
53
|
catch (error) {
|
|
34
|
-
this.platform.log.error(`${this.accessory.context.device.Name} (${this.accessory.context.device.Serial}) seems to be unreachable
|
|
54
|
+
this.platform.log.error(`${this.accessory.context.device.Name} (${this.accessory.context.device.Serial}) seems to be unreachable:`, error);
|
|
35
55
|
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
36
56
|
}
|
|
37
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Gets the accessory instance
|
|
60
|
+
* @returns The platform accessory
|
|
61
|
+
*/
|
|
38
62
|
getAccessory() {
|
|
39
63
|
return this.accessory;
|
|
40
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-plug.js","sourceRoot":"","sources":["../../src/accessories/smart-plug.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,SAAS;IAKD;IACA;IALX,GAAG,CAAW;IAEtB,YACE,GAAa,EACI,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAE7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAE;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC;aAC5G,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEtG,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"smart-plug.js","sourceRoot":"","sources":["../../src/accessories/smart-plug.ts"],"names":[],"mappings":"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"}
|
package/dist/api/ezviz-api.d.ts
CHANGED
|
@@ -2,15 +2,48 @@ import { Logging } from 'homebridge';
|
|
|
2
2
|
import { Credentials } from '../types/login.js';
|
|
3
3
|
import { ListDevicesResponse } from '../types/devices.js';
|
|
4
4
|
import { EZVIZConfig } from '../types/config.js';
|
|
5
|
+
/**
|
|
6
|
+
* EZVIZ API client for interacting with EZVIZ services
|
|
7
|
+
*/
|
|
5
8
|
export declare class EZVIZAPI {
|
|
6
9
|
private config;
|
|
7
10
|
sessionId: string | null;
|
|
8
11
|
private log;
|
|
9
12
|
constructor(config: EZVIZConfig, log?: Logging);
|
|
13
|
+
/**
|
|
14
|
+
* Generates a random string of specified length
|
|
15
|
+
* @param length - The length of the string to generate
|
|
16
|
+
* @returns Random string
|
|
17
|
+
*/
|
|
10
18
|
randomStr(length: number): string;
|
|
19
|
+
/**
|
|
20
|
+
* Authenticates with the EZVIZ API
|
|
21
|
+
* @returns Promise resolving to credentials or undefined if authentication fails
|
|
22
|
+
*/
|
|
11
23
|
authenticate(): Promise<Credentials | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Gets the domain URL for the specified region
|
|
26
|
+
* @param id - The region ID
|
|
27
|
+
* @returns Promise resolving to the domain URL
|
|
28
|
+
*/
|
|
12
29
|
getDomain(id: number): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Lists all devices for the authenticated user
|
|
32
|
+
* @returns Promise resolving to device list or undefined if failed
|
|
33
|
+
*/
|
|
13
34
|
listDevices(): Promise<ListDevicesResponse | undefined>;
|
|
35
|
+
/**
|
|
36
|
+
* Sets the state of a switch/plug
|
|
37
|
+
* @param serialNumber - The device serial number
|
|
38
|
+
* @param type - The switch type
|
|
39
|
+
* @param value - The value to set (true/false)
|
|
40
|
+
*/
|
|
14
41
|
setSwitchState(serialNumber: string, type: number, value: boolean): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Gets the current state of a switch/plug
|
|
44
|
+
* @param serialNumber - The device serial number
|
|
45
|
+
* @param type - The switch type
|
|
46
|
+
* @returns Promise resolving to the switch state
|
|
47
|
+
*/
|
|
15
48
|
getSwitchState(serialNumber: string, type: number): Promise<boolean>;
|
|
16
49
|
}
|
package/dist/api/ezviz-api.js
CHANGED
|
@@ -3,6 +3,9 @@ import querystring from 'querystring';
|
|
|
3
3
|
import crypto, { randomBytes } from 'crypto';
|
|
4
4
|
import { EZVIZ_CLIENT_TYPE, EZVIZ_USER_AGENT, EZVIZ_BASE_API_URL, EZVIZ_DOMAINS_ENDPOINT, EZVIZ_AUTH_ENDPOINT, EZVIZ_DEVICES_ENDPOINT, EZVIZ_SWITCH_STATUS_ENDPOINT, RUSSIA_DOMAIN, RUSSIA_AREA_ID, } from './ezviz-constants.js';
|
|
5
5
|
import { sendRequest } from './ezviz-requests.js';
|
|
6
|
+
/**
|
|
7
|
+
* EZVIZ API client for interacting with EZVIZ services
|
|
8
|
+
*/
|
|
6
9
|
export class EZVIZAPI {
|
|
7
10
|
config;
|
|
8
11
|
sessionId;
|
|
@@ -12,6 +15,11 @@ export class EZVIZAPI {
|
|
|
12
15
|
this.sessionId = null;
|
|
13
16
|
this.log = log;
|
|
14
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Generates a random string of specified length
|
|
20
|
+
* @param length - The length of the string to generate
|
|
21
|
+
* @returns Random string
|
|
22
|
+
*/
|
|
15
23
|
randomStr(length) {
|
|
16
24
|
return randomBytes(length)
|
|
17
25
|
.toString('base64')
|
|
@@ -19,7 +27,15 @@ export class EZVIZAPI {
|
|
|
19
27
|
.replace(/\+/g, '0')
|
|
20
28
|
.replace(/\//g, '0');
|
|
21
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Authenticates with the EZVIZ API
|
|
32
|
+
* @returns Promise resolving to credentials or undefined if authentication fails
|
|
33
|
+
*/
|
|
22
34
|
async authenticate() {
|
|
35
|
+
if (!this.config.email || !this.config.password) {
|
|
36
|
+
this.log?.error('Email and password are required for authentication');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
23
39
|
const emailHash = crypto.createHash('md5').update(this.config.email).digest('hex');
|
|
24
40
|
const passHash = crypto.createHash('md5').update(this.config.password).digest('hex');
|
|
25
41
|
const data = querystring.stringify({
|
|
@@ -70,10 +86,15 @@ export class EZVIZAPI {
|
|
|
70
86
|
}
|
|
71
87
|
}
|
|
72
88
|
catch (error) {
|
|
73
|
-
this.log?.error('Unable to login', error);
|
|
89
|
+
this.log?.error('Unable to login:', error);
|
|
74
90
|
throw error;
|
|
75
91
|
}
|
|
76
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Gets the domain URL for the specified region
|
|
95
|
+
* @param id - The region ID
|
|
96
|
+
* @returns Promise resolving to the domain URL
|
|
97
|
+
*/
|
|
77
98
|
async getDomain(id) {
|
|
78
99
|
if (id === RUSSIA_AREA_ID) {
|
|
79
100
|
return `https://${RUSSIA_DOMAIN}`;
|
|
@@ -94,16 +115,29 @@ export class EZVIZAPI {
|
|
|
94
115
|
try {
|
|
95
116
|
const response = await axios(domainReq);
|
|
96
117
|
const domain = response.data;
|
|
118
|
+
if (!domain.domain) {
|
|
119
|
+
throw new Error('Invalid domain response from API');
|
|
120
|
+
}
|
|
97
121
|
return `https://${domain.domain}`;
|
|
98
122
|
}
|
|
99
123
|
catch (error) {
|
|
100
|
-
this.log?.error('Error fetching domain', error);
|
|
124
|
+
this.log?.error('Error fetching domain:', error);
|
|
101
125
|
throw error;
|
|
102
126
|
}
|
|
103
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Lists all devices for the authenticated user
|
|
130
|
+
* @returns Promise resolving to device list or undefined if failed
|
|
131
|
+
*/
|
|
104
132
|
async listDevices() {
|
|
105
133
|
if (!this.sessionId) {
|
|
106
|
-
|
|
134
|
+
try {
|
|
135
|
+
await this.authenticate();
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
this.log?.error('Failed to authenticate before listing devices:', error);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
107
141
|
}
|
|
108
142
|
try {
|
|
109
143
|
const query = querystring.stringify({
|
|
@@ -116,13 +150,28 @@ export class EZVIZAPI {
|
|
|
116
150
|
return info;
|
|
117
151
|
}
|
|
118
152
|
catch (error) {
|
|
119
|
-
this.log?.error('Error fetching devices', error);
|
|
153
|
+
this.log?.error('Error fetching devices:', error);
|
|
120
154
|
throw error;
|
|
121
155
|
}
|
|
122
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Sets the state of a switch/plug
|
|
159
|
+
* @param serialNumber - The device serial number
|
|
160
|
+
* @param type - The switch type
|
|
161
|
+
* @param value - The value to set (true/false)
|
|
162
|
+
*/
|
|
123
163
|
async setSwitchState(serialNumber, type, value) {
|
|
164
|
+
if (!serialNumber) {
|
|
165
|
+
throw new Error('Serial number is required');
|
|
166
|
+
}
|
|
124
167
|
if (!this.sessionId) {
|
|
125
|
-
|
|
168
|
+
try {
|
|
169
|
+
await this.authenticate();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
this.log?.error('Failed to authenticate before setting switch state:', error);
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
126
175
|
}
|
|
127
176
|
const config = {
|
|
128
177
|
method: 'post',
|
|
@@ -142,16 +191,34 @@ export class EZVIZAPI {
|
|
|
142
191
|
};
|
|
143
192
|
try {
|
|
144
193
|
const response = await axios(config);
|
|
194
|
+
if (response.data?.retcode) {
|
|
195
|
+
throw new Error(`Switch state update failed: ${response.data.retcode}`);
|
|
196
|
+
}
|
|
145
197
|
return response.data;
|
|
146
198
|
}
|
|
147
199
|
catch (error) {
|
|
148
|
-
this.log?.error('Error setting switch state', error);
|
|
200
|
+
this.log?.error('Error setting switch state:', error);
|
|
149
201
|
throw error;
|
|
150
202
|
}
|
|
151
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Gets the current state of a switch/plug
|
|
206
|
+
* @param serialNumber - The device serial number
|
|
207
|
+
* @param type - The switch type
|
|
208
|
+
* @returns Promise resolving to the switch state
|
|
209
|
+
*/
|
|
152
210
|
async getSwitchState(serialNumber, type) {
|
|
211
|
+
if (!serialNumber) {
|
|
212
|
+
throw new Error('Serial number is required');
|
|
213
|
+
}
|
|
153
214
|
if (!this.sessionId) {
|
|
154
|
-
|
|
215
|
+
try {
|
|
216
|
+
await this.authenticate();
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
this.log?.error('Failed to authenticate before getting switch state:', error);
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
155
222
|
}
|
|
156
223
|
const deviceList = await this.listDevices();
|
|
157
224
|
if (!deviceList) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ezviz-api.js","sourceRoot":"","sources":["../../src/api/ezviz-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAClD,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAK7C,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,aAAa,EACb,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,OAAO,QAAQ;IACX,MAAM,CAAc;IACrB,SAAS,CAAgB;IACxB,GAAG,CAAsB;IAEjC,YAAY,MAAmB,EAAE,GAAa;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,OAAO,WAAW,CAAC,MAAM,CAAC;aACvB,QAAQ,CAAC,QAAQ,CAAC;aAClB,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;aAChB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YAC1B,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,MAAM,MAAM,GAAuB;YACjC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,mBAAmB,EAAE;YAClD,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;gBACnD,YAAY,EAAE,iBAAiB;gBAC/B,YAAY,EAAE,gBAAgB;aAC/B;YACD,IAAI;SACL,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ezviz-api.js","sourceRoot":"","sources":["../../src/api/ezviz-api.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts
CHANGED
|
@@ -4,6 +4,10 @@ import { EZVIZConfig, CameraConfig } from './types/config.js';
|
|
|
4
4
|
import { Credentials } from './types/login.js';
|
|
5
5
|
import { ListDevicesResponse } from './types/devices.js';
|
|
6
6
|
import { DeviceData } from './types/data.js';
|
|
7
|
+
/**
|
|
8
|
+
* EZVIZ Platform for Homebridge
|
|
9
|
+
* Handles device discovery, authentication, and accessory management
|
|
10
|
+
*/
|
|
7
11
|
export declare class EZVIZPlatform implements DynamicPlatformPlugin {
|
|
8
12
|
readonly log: Logging;
|
|
9
13
|
readonly config: EZVIZConfig;
|
|
@@ -13,10 +17,44 @@ export declare class EZVIZPlatform implements DynamicPlatformPlugin {
|
|
|
13
17
|
readonly accessories: Map<string, PlatformAccessory>;
|
|
14
18
|
readonly discoveredCacheUUIDs: string[];
|
|
15
19
|
constructor(log: Logging, config: EZVIZConfig, api: API);
|
|
20
|
+
/**
|
|
21
|
+
* Called when Homebridge finishes launching
|
|
22
|
+
* Handles authentication and device discovery
|
|
23
|
+
*/
|
|
16
24
|
didFinishLaunching(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Authenticates with the EZVIZ API
|
|
27
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
28
|
+
* @returns Promise resolving to credentials or undefined if authentication fails
|
|
29
|
+
*/
|
|
17
30
|
authenticate(ezvizAPI: EZVIZAPI): Promise<Credentials | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* Configures an accessory from cache
|
|
33
|
+
* @param accessory - The accessory to configure
|
|
34
|
+
*/
|
|
18
35
|
configureAccessory(accessory: PlatformAccessory): void;
|
|
36
|
+
/**
|
|
37
|
+
* Discovers and manages EZVIZ devices
|
|
38
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
39
|
+
*/
|
|
19
40
|
discoverDevices(ezvizAPI: EZVIZAPI): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Creates the appropriate accessory based on device type
|
|
43
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
44
|
+
* @param accessory - The platform accessory
|
|
45
|
+
* @param deviceType - The type of device
|
|
46
|
+
*/
|
|
47
|
+
private createAccessory;
|
|
48
|
+
/**
|
|
49
|
+
* Extracts device data from the API response
|
|
50
|
+
* @param devicesResponse - The API response containing device information
|
|
51
|
+
* @returns Array of processed device data
|
|
52
|
+
*/
|
|
20
53
|
extractDevicesData(devicesResponse: ListDevicesResponse): DeviceData[];
|
|
54
|
+
/**
|
|
55
|
+
* Validates camera configuration
|
|
56
|
+
* @param camera - The camera configuration to validate
|
|
57
|
+
* @returns Error message if validation fails, empty string if valid
|
|
58
|
+
*/
|
|
21
59
|
cameraConfigErrors(camera: CameraConfig): string;
|
|
22
60
|
}
|
package/dist/platform.js
CHANGED
|
@@ -3,6 +3,10 @@ import { IPCamera } from './accessories/ip-camera.js';
|
|
|
3
3
|
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
4
4
|
import { EZVIZAPI } from './api/ezviz-api.js';
|
|
5
5
|
import { DeviceTypes } from './utils/enums.js';
|
|
6
|
+
/**
|
|
7
|
+
* EZVIZ Platform for Homebridge
|
|
8
|
+
* Handles device discovery, authentication, and accessory management
|
|
9
|
+
*/
|
|
6
10
|
export class EZVIZPlatform {
|
|
7
11
|
log;
|
|
8
12
|
config;
|
|
@@ -21,21 +25,41 @@ export class EZVIZPlatform {
|
|
|
21
25
|
this.api.on('didFinishLaunching', this.didFinishLaunching.bind(this));
|
|
22
26
|
this.log.debug('Finished initializing platform:', this.config.name);
|
|
23
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Called when Homebridge finishes launching
|
|
30
|
+
* Handles authentication and device discovery
|
|
31
|
+
*/
|
|
24
32
|
async didFinishLaunching() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
try {
|
|
34
|
+
const ezvizAPI = new EZVIZAPI(this.config, this.log);
|
|
35
|
+
const credentials = await this.authenticate(ezvizAPI);
|
|
36
|
+
if (credentials) {
|
|
37
|
+
// Set up re-authentication every 12 hours
|
|
38
|
+
setInterval(async () => {
|
|
39
|
+
this.log.debug('Reauthenticating to EZVIZ API');
|
|
40
|
+
try {
|
|
41
|
+
await this.authenticate(ezvizAPI);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.log.error('Re-authentication failed:', error);
|
|
45
|
+
}
|
|
46
|
+
}, 3600000 * 12);
|
|
47
|
+
await this.discoverDevices(ezvizAPI);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.log.error('Could not authenticate with EZVIZ API. Please check your credentials.');
|
|
51
|
+
}
|
|
33
52
|
}
|
|
34
|
-
|
|
35
|
-
this.log.error('
|
|
53
|
+
catch (error) {
|
|
54
|
+
this.log.error('Error during platform initialization:', error);
|
|
36
55
|
}
|
|
37
56
|
this.log.debug('Executed didFinishLaunching callback');
|
|
38
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Authenticates with the EZVIZ API
|
|
60
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
61
|
+
* @returns Promise resolving to credentials or undefined if authentication fails
|
|
62
|
+
*/
|
|
39
63
|
async authenticate(ezvizAPI) {
|
|
40
64
|
const region = this.config.region;
|
|
41
65
|
const email = this.config.email;
|
|
@@ -44,52 +68,61 @@ export class EZVIZPlatform {
|
|
|
44
68
|
this.log.error('You must provide your email and password in config.json.');
|
|
45
69
|
return;
|
|
46
70
|
}
|
|
71
|
+
if (!region) {
|
|
72
|
+
this.log.error('You must provide your region in config.json.');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
47
75
|
try {
|
|
48
76
|
this.config.domain = await ezvizAPI.getDomain(region);
|
|
49
|
-
|
|
77
|
+
const credentials = await ezvizAPI.authenticate();
|
|
78
|
+
if (credentials) {
|
|
79
|
+
this.log.info('Successfully authenticated with EZVIZ API');
|
|
80
|
+
}
|
|
81
|
+
return credentials;
|
|
50
82
|
}
|
|
51
83
|
catch (error) {
|
|
52
|
-
this.log.error('Authentication failed', error);
|
|
84
|
+
this.log.error('Authentication failed:', error);
|
|
85
|
+
return;
|
|
53
86
|
}
|
|
54
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Configures an accessory from cache
|
|
90
|
+
* @param accessory - The accessory to configure
|
|
91
|
+
*/
|
|
55
92
|
configureAccessory(accessory) {
|
|
56
93
|
this.log.info('Loading accessory from cache:', accessory.displayName);
|
|
57
94
|
this.accessories.set(accessory.UUID, accessory);
|
|
58
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Discovers and manages EZVIZ devices
|
|
98
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
99
|
+
*/
|
|
59
100
|
async discoverDevices(ezvizAPI) {
|
|
60
101
|
try {
|
|
61
102
|
const devicesResponse = await ezvizAPI.listDevices();
|
|
62
103
|
if (!devicesResponse) {
|
|
63
|
-
this.log.error('No devices found');
|
|
104
|
+
this.log.error('No devices found or failed to retrieve device list');
|
|
64
105
|
return;
|
|
65
106
|
}
|
|
66
107
|
const devices = this.extractDevicesData(devicesResponse);
|
|
108
|
+
this.log.info(`Found ${devices.length} devices`);
|
|
67
109
|
for (const device of devices) {
|
|
68
110
|
const existingAccessory = this.accessories.get(device.UUID);
|
|
69
111
|
if (existingAccessory) {
|
|
70
112
|
this.log.debug(`Restoring existing ${device.Type} from cache: ${existingAccessory.displayName}`);
|
|
71
113
|
existingAccessory.context.device = device;
|
|
72
|
-
|
|
73
|
-
new SmartPlug(ezvizAPI, this, existingAccessory);
|
|
74
|
-
}
|
|
75
|
-
else if (device.Type === DeviceTypes.IPC || device.Type === DeviceTypes.CatEye) {
|
|
76
|
-
new IPCamera(ezvizAPI, this, existingAccessory);
|
|
77
|
-
}
|
|
114
|
+
this.createAccessory(ezvizAPI, existingAccessory, device.Type);
|
|
78
115
|
}
|
|
79
116
|
else {
|
|
80
117
|
this.log.info(`Adding new ${device.Type}: ${device.Name}`);
|
|
81
118
|
const accessory = new this.api.platformAccessory(device.Name, device.UUID);
|
|
82
119
|
accessory.context.device = device;
|
|
83
120
|
this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
|
|
84
|
-
|
|
85
|
-
new SmartPlug(ezvizAPI, this, accessory);
|
|
86
|
-
}
|
|
87
|
-
else if (device.Type === DeviceTypes.IPC || device.Type === DeviceTypes.CatEye) {
|
|
88
|
-
new IPCamera(ezvizAPI, this, accessory);
|
|
89
|
-
}
|
|
121
|
+
this.createAccessory(ezvizAPI, accessory, device.Type);
|
|
90
122
|
}
|
|
91
123
|
this.discoveredCacheUUIDs.push(device.UUID);
|
|
92
124
|
}
|
|
125
|
+
// Remove accessories that are no longer available
|
|
93
126
|
for (const [uuid, accessory] of this.accessories) {
|
|
94
127
|
if (!this.discoveredCacheUUIDs.includes(uuid)) {
|
|
95
128
|
this.log.info('Removing existing accessory from cache:', accessory.displayName);
|
|
@@ -98,9 +131,36 @@ export class EZVIZPlatform {
|
|
|
98
131
|
}
|
|
99
132
|
}
|
|
100
133
|
catch (error) {
|
|
101
|
-
this.log.error('Error discovering devices', error);
|
|
134
|
+
this.log.error('Error discovering devices:', error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Creates the appropriate accessory based on device type
|
|
139
|
+
* @param ezvizAPI - The EZVIZ API instance
|
|
140
|
+
* @param accessory - The platform accessory
|
|
141
|
+
* @param deviceType - The type of device
|
|
142
|
+
*/
|
|
143
|
+
createAccessory(ezvizAPI, accessory, deviceType) {
|
|
144
|
+
try {
|
|
145
|
+
if (deviceType === DeviceTypes.Socket) {
|
|
146
|
+
new SmartPlug(ezvizAPI, this, accessory);
|
|
147
|
+
}
|
|
148
|
+
else if (deviceType === DeviceTypes.IPC || deviceType === DeviceTypes.CatEye) {
|
|
149
|
+
new IPCamera(ezvizAPI, this, accessory);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.log.warn(`Unsupported device type: ${deviceType}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
this.log.error(`Error creating accessory for ${accessory.displayName}:`, error);
|
|
102
157
|
}
|
|
103
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* Extracts device data from the API response
|
|
161
|
+
* @param devicesResponse - The API response containing device information
|
|
162
|
+
* @returns Array of processed device data
|
|
163
|
+
*/
|
|
104
164
|
extractDevicesData(devicesResponse) {
|
|
105
165
|
const devices = [];
|
|
106
166
|
for (const device of devicesResponse.deviceInfos) {
|
|
@@ -144,6 +204,11 @@ export class EZVIZPlatform {
|
|
|
144
204
|
;
|
|
145
205
|
return devices;
|
|
146
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Validates camera configuration
|
|
209
|
+
* @param camera - The camera configuration to validate
|
|
210
|
+
* @returns Error message if validation fails, empty string if valid
|
|
211
|
+
*/
|
|
147
212
|
cameraConfigErrors(camera) {
|
|
148
213
|
if (!camera.username) {
|
|
149
214
|
return 'No Username';
|
package/dist/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,MAAM,OAAO,aAAa;IASN;IACA;IACA;IAVF,OAAO,CAAiB;IACxB,cAAc,CAAwB;IAEtD,oDAAoD;IACpC,WAAW,GAAmC,IAAI,GAAG,EAAE,CAAC;IACxD,oBAAoB,GAAa,EAAE,CAAC;IAEpD,YACkB,GAAY,EACZ,MAAmB,EACnB,GAAQ;QAFR,QAAG,GAAH,GAAG,CAAS;QACZ,WAAM,GAAN,MAAM,CAAa;QACnB,QAAG,GAAH,GAAG,CAAK;QAExB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED