@boozilla/homebridge-shome 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accessories/doorbellAccessory.js +1 -4
- package/dist/accessories/doorbellAccessory.js.map +1 -1
- package/dist/controller/cameraController.d.ts +1 -0
- package/dist/controller/cameraController.js +7 -0
- package/dist/controller/cameraController.js.map +1 -1
- package/package.json +1 -1
- package/src/accessories/doorbellAccessory.ts +1 -4
- package/src/controller/cameraController.ts +8 -0
|
@@ -12,16 +12,13 @@ export class DoorbellAccessory {
|
|
|
12
12
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'sHome')
|
|
13
13
|
.setCharacteristic(this.platform.Characteristic.Model, 'Doorbell')
|
|
14
14
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, 'shome-doorbell');
|
|
15
|
-
// 1. 초인종 서비스 설정
|
|
16
15
|
this.doorbellService = this.accessory.getService(this.platform.Service.Doorbell)
|
|
17
16
|
|| this.accessory.addService(this.platform.Service.Doorbell);
|
|
18
17
|
this.doorbellService.getCharacteristic(this.platform.Characteristic.ProgrammableSwitchEvent);
|
|
19
|
-
// 2. 카메라 컨트롤러 초기화
|
|
20
18
|
this.cameraController = new ShomeCameraController(this.platform, this.accessory);
|
|
21
|
-
|
|
19
|
+
this.accessory.configureController(this.cameraController.controller);
|
|
22
20
|
this.motionService = this.accessory.getService(this.platform.Service.MotionSensor)
|
|
23
21
|
|| this.accessory.addService(this.platform.Service.MotionSensor, 'Doorbell Motion');
|
|
24
|
-
// 4. ✨ 핵심 수정: 초인종 서비스에 모션 센서 서비스를 연결합니다.
|
|
25
22
|
this.doorbellService.addLinkedService(this.motionService);
|
|
26
23
|
}
|
|
27
24
|
newVisitor(visitor) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doorbellAccessory.js","sourceRoot":"","sources":["../../src/accessories/doorbellAccessory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,OAAO,iBAAiB;IAML;IACA;IANf,eAAe,CAAU;IACzB,aAAa,CAAU;IACvB,gBAAgB,CAAwB;IAEhD,YACuB,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAE7C,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,UAAU,CAAC;aACjE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAElF,
|
|
1
|
+
{"version":3,"file":"doorbellAccessory.js","sourceRoot":"","sources":["../../src/accessories/doorbellAccessory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,OAAO,iBAAiB;IAML;IACA;IANf,eAAe,CAAU;IACzB,aAAa,CAAU;IACvB,gBAAgB,CAAwB;IAEhD,YACuB,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAE7C,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,UAAU,CAAC;aACjE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAElF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;eACzE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QAE7F,IAAI,CAAC,gBAAgB,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAErE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;eAC3E,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAExF,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAEM,UAAU,CAAC,OAAgB;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,WAAW,iDAAiD,CAAC,CAAC;QAEtH,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAE7C,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC;aACzF,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAElF,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpG,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvG,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;CACF"}
|
|
@@ -8,6 +8,7 @@ export declare class ShomeCameraController implements CameraStreamingDelegate {
|
|
|
8
8
|
private readonly log;
|
|
9
9
|
private latestVisitor;
|
|
10
10
|
readonly controller: CameraController;
|
|
11
|
+
private cachedSnapshot;
|
|
11
12
|
constructor(platform: ShomePlatform, accessory: PlatformAccessory);
|
|
12
13
|
handleSnapshotRequest(request: SnapshotRequest, callback: SnapshotRequestCallback): Promise<void>;
|
|
13
14
|
updateVisitor(visitor: Visitor): void;
|
|
@@ -5,6 +5,7 @@ export class ShomeCameraController {
|
|
|
5
5
|
log;
|
|
6
6
|
latestVisitor = null;
|
|
7
7
|
controller;
|
|
8
|
+
cachedSnapshot = null;
|
|
8
9
|
constructor(platform, accessory) {
|
|
9
10
|
this.platform = platform;
|
|
10
11
|
this.accessory = accessory;
|
|
@@ -38,6 +39,10 @@ export class ShomeCameraController {
|
|
|
38
39
|
}
|
|
39
40
|
async handleSnapshotRequest(request, callback) {
|
|
40
41
|
this.log.info('Handling snapshot request...');
|
|
42
|
+
if (this.cachedSnapshot) {
|
|
43
|
+
this.log.info('Returning cached snapshot.');
|
|
44
|
+
return callback(undefined, this.cachedSnapshot);
|
|
45
|
+
}
|
|
41
46
|
if (!this.latestVisitor) {
|
|
42
47
|
this.log.warn('No visitor data available for snapshot. This will result in a "No Response" error until the first doorbell event.');
|
|
43
48
|
return callback(new Error('No snapshot available'));
|
|
@@ -46,6 +51,7 @@ export class ShomeCameraController {
|
|
|
46
51
|
const imageBuffer = await this.platform.shomeClient.getThumbnailImage(this.latestVisitor);
|
|
47
52
|
if (imageBuffer) {
|
|
48
53
|
this.log.info('Snapshot fetched successfully via shomeClient.');
|
|
54
|
+
this.cachedSnapshot = imageBuffer;
|
|
49
55
|
callback(undefined, imageBuffer);
|
|
50
56
|
}
|
|
51
57
|
else {
|
|
@@ -60,6 +66,7 @@ export class ShomeCameraController {
|
|
|
60
66
|
updateVisitor(visitor) {
|
|
61
67
|
this.log.debug(`Updating latest visitor data for sttId: ${visitor.sttId}`);
|
|
62
68
|
this.latestVisitor = visitor;
|
|
69
|
+
this.cachedSnapshot = null;
|
|
63
70
|
}
|
|
64
71
|
prepareStream() {
|
|
65
72
|
return Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cameraController.js","sourceRoot":"","sources":["../../src/controller/cameraController.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"cameraController.js","sourceRoot":"","sources":["../../src/controller/cameraController.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -17,19 +17,16 @@ export class DoorbellAccessory {
|
|
|
17
17
|
.setCharacteristic(this.platform.Characteristic.Model, 'Doorbell')
|
|
18
18
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, 'shome-doorbell');
|
|
19
19
|
|
|
20
|
-
// 1. 초인종 서비스 설정
|
|
21
20
|
this.doorbellService = this.accessory.getService(this.platform.Service.Doorbell)
|
|
22
21
|
|| this.accessory.addService(this.platform.Service.Doorbell);
|
|
23
22
|
this.doorbellService.getCharacteristic(this.platform.Characteristic.ProgrammableSwitchEvent);
|
|
24
23
|
|
|
25
|
-
// 2. 카메라 컨트롤러 초기화
|
|
26
24
|
this.cameraController = new ShomeCameraController(this.platform, this.accessory);
|
|
25
|
+
this.accessory.configureController(this.cameraController.controller);
|
|
27
26
|
|
|
28
|
-
// 3. 움직임 감지 서비스 추가
|
|
29
27
|
this.motionService = this.accessory.getService(this.platform.Service.MotionSensor)
|
|
30
28
|
|| this.accessory.addService(this.platform.Service.MotionSensor, 'Doorbell Motion');
|
|
31
29
|
|
|
32
|
-
// 4. ✨ 핵심 수정: 초인종 서비스에 모션 센서 서비스를 연결합니다.
|
|
33
30
|
this.doorbellService.addLinkedService(this.motionService);
|
|
34
31
|
}
|
|
35
32
|
|
|
@@ -17,6 +17,7 @@ export class ShomeCameraController implements CameraStreamingDelegate {
|
|
|
17
17
|
private readonly log: Logger;
|
|
18
18
|
private latestVisitor: Visitor | null = null;
|
|
19
19
|
public readonly controller: CameraController;
|
|
20
|
+
private cachedSnapshot: Buffer | null = null;
|
|
20
21
|
|
|
21
22
|
constructor(
|
|
22
23
|
private readonly platform: ShomePlatform,
|
|
@@ -57,6 +58,11 @@ export class ShomeCameraController implements CameraStreamingDelegate {
|
|
|
57
58
|
public async handleSnapshotRequest(request: SnapshotRequest, callback: SnapshotRequestCallback): Promise<void> {
|
|
58
59
|
this.log.info('Handling snapshot request...');
|
|
59
60
|
|
|
61
|
+
if (this.cachedSnapshot) {
|
|
62
|
+
this.log.info('Returning cached snapshot.');
|
|
63
|
+
return callback(undefined, this.cachedSnapshot);
|
|
64
|
+
}
|
|
65
|
+
|
|
60
66
|
if (!this.latestVisitor) {
|
|
61
67
|
this.log.warn('No visitor data available for snapshot. This will result in a "No Response" error until the first doorbell event.');
|
|
62
68
|
return callback(new Error('No snapshot available'));
|
|
@@ -67,6 +73,7 @@ export class ShomeCameraController implements CameraStreamingDelegate {
|
|
|
67
73
|
|
|
68
74
|
if (imageBuffer) {
|
|
69
75
|
this.log.info('Snapshot fetched successfully via shomeClient.');
|
|
76
|
+
this.cachedSnapshot = imageBuffer;
|
|
70
77
|
callback(undefined, imageBuffer);
|
|
71
78
|
} else {
|
|
72
79
|
throw new Error('Failed to retrieve image buffer from shomeClient.');
|
|
@@ -80,6 +87,7 @@ export class ShomeCameraController implements CameraStreamingDelegate {
|
|
|
80
87
|
public updateVisitor(visitor: Visitor) {
|
|
81
88
|
this.log.debug(`Updating latest visitor data for sttId: ${visitor.sttId}`);
|
|
82
89
|
this.latestVisitor = visitor;
|
|
90
|
+
this.cachedSnapshot = null;
|
|
83
91
|
}
|
|
84
92
|
|
|
85
93
|
prepareStream(): Promise<void> {
|