@boozilla/homebridge-shome 1.0.12 → 1.1.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.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Homebridge sHome
2
2
 
3
+ [![verified-by-homebridge](https://img.shields.io/badge/homebridge-verified-blueviolet?color=%23491F59&style=for-the-badge&logoColor=%23FFFFFF&logo=homebridge)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
4
+
3
5
  `homebridge-shome` is a [Homebridge](https://homebridge.io/) plugin that allows you to integrate devices from the
4
6
  Samsung Smart Home (sHome) platform into Apple HomeKit.
5
7
 
@@ -15,13 +17,14 @@ door locks, using the Home app and Siri on your Apple devices.
15
17
  * **Digital Door Lock**: Check the current state of your door lock (locked/unlocked) and unlock it remotely.
16
18
  * **Individual Accessory Support**: Each sub-device registered in your system, such as 'Living Room Light' or 'Master
17
19
  Bedroom Thermostat', is added as an independent HomeKit accessory for granular control.
20
+ * **Visitor Notifications**: Automatically creates a "Visitor Alert" motion sensor in HomeKit. When a new visitor is detected, this sensor is triggered, sending a notification to your Apple devices (if you have notifications enabled for the sensor in the Home app).
18
21
 
19
22
  ## Installation
20
23
 
21
24
  If you have a running Homebridge setup, install the plugin using the following command:
22
25
 
23
26
  ```sh
24
- npm install -g homebridge-shome
27
+ npm install -g @boozilla/homebridge-shome
25
28
  ```
26
29
 
27
30
  ## Configuration
@@ -0,0 +1,12 @@
1
+ import { PlatformAccessory } from 'homebridge';
2
+ import { ShomePlatform } from '../platform.js';
3
+ import { Visitor } from '../shomeClient.js';
4
+ export declare class DoorbellAccessory {
5
+ private readonly platform;
6
+ private readonly accessory;
7
+ private doorbellService;
8
+ private motionService;
9
+ private cameraController;
10
+ constructor(platform: ShomePlatform, accessory: PlatformAccessory);
11
+ newVisitor(visitor: Visitor): void;
12
+ }
@@ -0,0 +1,38 @@
1
+ import { ShomeCameraController } from '../controller/cameraController.js';
2
+ export class DoorbellAccessory {
3
+ platform;
4
+ accessory;
5
+ doorbellService;
6
+ motionService;
7
+ cameraController;
8
+ constructor(platform, accessory) {
9
+ this.platform = platform;
10
+ this.accessory = accessory;
11
+ this.accessory.getService(this.platform.Service.AccessoryInformation)
12
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'sHome')
13
+ .setCharacteristic(this.platform.Characteristic.Model, 'Doorbell')
14
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, 'shome-doorbell');
15
+ // 1. 초인종 서비스 설정
16
+ this.doorbellService = this.accessory.getService(this.platform.Service.Doorbell)
17
+ || this.accessory.addService(this.platform.Service.Doorbell);
18
+ this.doorbellService.getCharacteristic(this.platform.Characteristic.ProgrammableSwitchEvent);
19
+ // 2. 카메라 컨트롤러 초기화
20
+ this.cameraController = new ShomeCameraController(this.platform, this.accessory);
21
+ // 3. 움직임 감지 서비스 추가
22
+ this.motionService = this.accessory.getService(this.platform.Service.MotionSensor)
23
+ || this.accessory.addService(this.platform.Service.MotionSensor, 'Doorbell Motion');
24
+ // 4. ✨ 핵심 수정: 초인종 서비스에 모션 센서 서비스를 연결합니다.
25
+ this.doorbellService.addLinkedService(this.motionService);
26
+ }
27
+ newVisitor(visitor) {
28
+ this.platform.log.info(`New visitor event at [${visitor.deviceLabel}]. Ringing doorbell and updating snapshot data.`);
29
+ this.cameraController.updateVisitor(visitor);
30
+ this.doorbellService.getCharacteristic(this.platform.Characteristic.ProgrammableSwitchEvent)
31
+ .updateValue(this.platform.Characteristic.ProgrammableSwitchEvent.SINGLE_PRESS);
32
+ this.motionService.getCharacteristic(this.platform.Characteristic.MotionDetected).updateValue(true);
33
+ setTimeout(() => {
34
+ this.motionService.getCharacteristic(this.platform.Characteristic.MotionDetected).updateValue(false);
35
+ }, 1000);
36
+ }
37
+ }
38
+ //# sourceMappingURL=doorbellAccessory.js.map
@@ -0,0 +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,gBAAgB;QAChB,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,kBAAkB;QAClB,IAAI,CAAC,gBAAgB,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEjF,mBAAmB;QACnB,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,yCAAyC;QACzC,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"}
@@ -0,0 +1,16 @@
1
+ import { CameraController, CameraStreamingDelegate, PlatformAccessory, SnapshotRequest, SnapshotRequestCallback } from 'homebridge';
2
+ import { ShomePlatform } from '../platform.js';
3
+ import { Visitor } from '../shomeClient.js';
4
+ export declare class ShomeCameraController implements CameraStreamingDelegate {
5
+ private readonly platform;
6
+ private readonly accessory;
7
+ private readonly hap;
8
+ private readonly log;
9
+ private latestVisitor;
10
+ readonly controller: CameraController;
11
+ constructor(platform: ShomePlatform, accessory: PlatformAccessory);
12
+ handleSnapshotRequest(request: SnapshotRequest, callback: SnapshotRequestCallback): Promise<void>;
13
+ updateVisitor(visitor: Visitor): void;
14
+ prepareStream(): Promise<void>;
15
+ handleStreamRequest(): void;
16
+ }
@@ -0,0 +1,71 @@
1
+ export class ShomeCameraController {
2
+ platform;
3
+ accessory;
4
+ hap;
5
+ log;
6
+ latestVisitor = null;
7
+ controller;
8
+ constructor(platform, accessory) {
9
+ this.platform = platform;
10
+ this.accessory = accessory;
11
+ this.hap = this.platform.api.hap;
12
+ this.log = this.platform.log;
13
+ this.controller = new this.hap.CameraController({
14
+ cameraStreamCount: 2,
15
+ delegate: this,
16
+ streamingOptions: {
17
+ supportedCryptoSuites: [0 /* this.hap.SRTPCryptoSuites.AES_CM_128_HMAC_SHA1_80 */],
18
+ video: {
19
+ resolutions: [
20
+ [1280, 720, 30],
21
+ [320, 240, 30],
22
+ ],
23
+ codec: {
24
+ profiles: [0 /* H264Profile.BASELINE */],
25
+ levels: [0 /* H264Level.LEVEL3_1 */],
26
+ },
27
+ },
28
+ },
29
+ });
30
+ let cameraOperatingMode = this.accessory.getService(this.hap.Service.CameraOperatingMode);
31
+ if (!cameraOperatingMode) {
32
+ cameraOperatingMode = this.accessory.addService(this.hap.Service.CameraOperatingMode, this.accessory.displayName + ' Mode');
33
+ }
34
+ cameraOperatingMode.setCharacteristic(this.hap.Characteristic.EventSnapshotsActive, this.hap.Characteristic.EventSnapshotsActive.ENABLE);
35
+ if (!this.accessory.getService(this.hap.Service.CameraRTPStreamManagement)) {
36
+ this.accessory.addService(this.hap.Service.CameraRTPStreamManagement, this.accessory.displayName + ' Stream Management');
37
+ }
38
+ }
39
+ async handleSnapshotRequest(request, callback) {
40
+ this.log.info('Handling snapshot request...');
41
+ if (!this.latestVisitor) {
42
+ this.log.warn('No visitor data available for snapshot. This will result in a "No Response" error until the first doorbell event.');
43
+ return callback(new Error('No snapshot available'));
44
+ }
45
+ try {
46
+ const imageBuffer = await this.platform.shomeClient.getThumbnailImage(this.latestVisitor);
47
+ if (imageBuffer) {
48
+ this.log.info('Snapshot fetched successfully via shomeClient.');
49
+ callback(undefined, imageBuffer);
50
+ }
51
+ else {
52
+ throw new Error('Failed to retrieve image buffer from shomeClient.');
53
+ }
54
+ }
55
+ catch (error) {
56
+ this.log.error('Failed to get snapshot:', error);
57
+ callback(error);
58
+ }
59
+ }
60
+ updateVisitor(visitor) {
61
+ this.log.debug(`Updating latest visitor data for sttId: ${visitor.sttId}`);
62
+ this.latestVisitor = visitor;
63
+ }
64
+ prepareStream() {
65
+ return Promise.resolve();
66
+ }
67
+ handleStreamRequest() {
68
+ // Streaming not supported
69
+ }
70
+ }
71
+ //# sourceMappingURL=cameraController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraController.js","sourceRoot":"","sources":["../../src/controller/cameraController.ts"],"names":[],"mappings":"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"}
@@ -11,10 +11,14 @@ export declare class ShomePlatform implements DynamicPlatformPlugin {
11
11
  private readonly accessoryHandlers;
12
12
  private pollingInterval;
13
13
  private pollingTimer?;
14
+ private lastCheckedTimestamp;
14
15
  constructor(log: Logger, config: PlatformConfig, api: API);
15
16
  configureAccessory(accessory: PlatformAccessory): void;
16
17
  discoverDevices(): Promise<void>;
17
18
  setupAccessory(mainDevice: MainDevice, subDevice: SubDevice | null, uuid: string): PlatformAccessory;
18
- createAccessory(accessory: PlatformAccessory): void;
19
+ createAccessoryHandler(accessory: PlatformAccessory): void;
19
20
  startPolling(): void;
21
+ pollDeviceUpdates(): Promise<void>;
22
+ checkForNewVisitors(): Promise<void>;
23
+ private parseRecodDt;
20
24
  }
package/dist/platform.js CHANGED
@@ -4,6 +4,7 @@ import { LightAccessory } from './accessories/lightAccessory.js';
4
4
  import { VentilatorAccessory } from './accessories/ventilatorAccessory.js';
5
5
  import { HeaterAccessory } from './accessories/heaterAccessory.js';
6
6
  import { DoorlockAccessory } from './accessories/doorlockAccessory.js';
7
+ import { DoorbellAccessory } from './accessories/doorbellAccessory.js';
7
8
  const CONTROLLABLE_MULTI_DEVICE_TYPES = ['LIGHT', 'HEATER', 'VENTILATOR'];
8
9
  const SPECIAL_CONTROLLABLE_TYPES = ['DOORLOCK'];
9
10
  export class ShomePlatform {
@@ -17,6 +18,7 @@ export class ShomePlatform {
17
18
  accessoryHandlers = new Map();
18
19
  pollingInterval;
19
20
  pollingTimer;
21
+ lastCheckedTimestamp = new Date();
20
22
  constructor(log, config, api) {
21
23
  this.log = log;
22
24
  this.config = config;
@@ -31,6 +33,7 @@ export class ShomePlatform {
31
33
  return;
32
34
  }
33
35
  this.shomeClient = new ShomeClient(this.log, this.config.username, this.config.password, this.config.deviceId);
36
+ this.log.info(`Video Doorbell service is active. Baseline time: ${this.lastCheckedTimestamp.toISOString()}`);
34
37
  this.api.on('didFinishLaunching', () => {
35
38
  this.discoverDevices();
36
39
  if (this.pollingInterval > 0) {
@@ -54,9 +57,6 @@ export class ShomePlatform {
54
57
  this.log.info('Discovering devices...');
55
58
  const devices = await this.shomeClient.getDeviceList();
56
59
  const foundAccessories = [];
57
- if (!devices || devices.length === 0) {
58
- this.log.warn('No devices found on your sHome account.');
59
- }
60
60
  for (const device of devices) {
61
61
  if (CONTROLLABLE_MULTI_DEVICE_TYPES.includes(device.thngModelTypeName)) {
62
62
  const deviceInfoList = await this.shomeClient.getDeviceInfo(device.thngId, device.thngModelTypeName);
@@ -73,10 +73,11 @@ export class ShomePlatform {
73
73
  const accessory = this.setupAccessory(device, null, uuid);
74
74
  foundAccessories.push(accessory);
75
75
  }
76
- else {
77
- this.log.info(`Ignoring device: ${device.nickname} (Type: ${device.thngModelTypeName})`);
78
- }
79
76
  }
77
+ const doorbellUUID = this.api.hap.uuid.generate('shome-doorbell');
78
+ const doorbellDevice = { thngModelTypeName: 'DOORBELL', nickname: 'Doorbell', thngId: 'shome-doorbell' };
79
+ const doorbellAccessory = this.setupAccessory(doorbellDevice, null, doorbellUUID);
80
+ foundAccessories.push(doorbellAccessory);
80
81
  const accessoriesToRemove = this.accessories.filter(cachedAccessory => !foundAccessories.some(foundAccessory => foundAccessory.UUID === cachedAccessory.UUID));
81
82
  if (accessoriesToRemove.length > 0) {
82
83
  this.log.info('Removing stale accessories:', accessoriesToRemove.map(a => a.displayName));
@@ -92,28 +93,27 @@ export class ShomePlatform {
92
93
  setupAccessory(mainDevice, subDevice, uuid) {
93
94
  const displayName = subDevice ? subDevice.nickname : mainDevice.nickname;
94
95
  const existingAccessory = this.accessories.find(accessory => accessory.UUID === uuid);
96
+ const accessory = existingAccessory ?? new this.api.platformAccessory(displayName, uuid);
97
+ accessory.context.device = mainDevice;
98
+ accessory.context.subDevice = subDevice;
95
99
  if (existingAccessory) {
96
100
  this.log.info('Restoring existing accessory from cache:', displayName);
97
- existingAccessory.context.device = mainDevice;
98
- existingAccessory.context.subDevice = subDevice;
99
- this.createAccessory(existingAccessory);
100
- return existingAccessory;
101
101
  }
102
102
  else {
103
103
  this.log.info('Adding new accessory:', displayName);
104
- const accessory = new this.api.platformAccessory(displayName, uuid);
105
- accessory.context.device = mainDevice;
106
- accessory.context.subDevice = subDevice;
107
- this.createAccessory(accessory);
108
104
  this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
109
- return accessory;
110
105
  }
106
+ this.createAccessoryHandler(accessory);
107
+ return accessory;
111
108
  }
112
- createAccessory(accessory) {
109
+ createAccessoryHandler(accessory) {
113
110
  const device = accessory.context.device;
114
111
  const accessoryType = device.thngModelTypeName;
115
- if (!this.accessoryHandlers.has(accessory.UUID)) {
116
- switch (accessoryType) {
112
+ if (this.accessoryHandlers.has(accessory.UUID)) {
113
+ return;
114
+ }
115
+ if (accessory.context.subDevice) {
116
+ switch (device.thngModelTypeName) {
117
117
  case 'LIGHT':
118
118
  this.accessoryHandlers.set(accessory.UUID, new LightAccessory(this, accessory));
119
119
  break;
@@ -123,44 +123,101 @@ export class ShomePlatform {
123
123
  case 'HEATER':
124
124
  this.accessoryHandlers.set(accessory.UUID, new HeaterAccessory(this, accessory));
125
125
  break;
126
- case 'DOORLOCK':
127
- this.accessoryHandlers.set(accessory.UUID, new DoorlockAccessory(this, accessory));
128
- break;
129
126
  }
127
+ return;
128
+ }
129
+ switch (accessoryType) {
130
+ case 'DOORLOCK':
131
+ this.accessoryHandlers.set(accessory.UUID, new DoorlockAccessory(this, accessory));
132
+ break;
133
+ case 'DOORBELL':
134
+ this.accessoryHandlers.set(accessory.UUID, new DoorbellAccessory(this, accessory));
135
+ break;
130
136
  }
131
137
  }
132
138
  startPolling() {
133
- this.log.info(`Starting periodic device state polling every ${this.pollingInterval / 1000} seconds.`);
139
+ this.log.info(`Starting periodic state polling every ${this.pollingInterval / 1000} seconds.`);
134
140
  this.pollingTimer = setInterval(async () => {
135
- this.log.debug('Polling for device updates...');
141
+ this.log.debug('Polling for updates...');
136
142
  try {
137
- const devices = await this.shomeClient.getDeviceList();
138
- for (const device of devices) {
139
- if (CONTROLLABLE_MULTI_DEVICE_TYPES.includes(device.thngModelTypeName)) {
140
- const deviceInfoList = await this.shomeClient.getDeviceInfo(device.thngId, device.thngModelTypeName);
141
- if (deviceInfoList) {
142
- for (const subDevice of deviceInfoList) {
143
- const subUuid = this.api.hap.uuid.generate(`${device.thngId}-${subDevice.deviceId}`);
144
- const handler = this.accessoryHandlers.get(subUuid);
145
- if (handler) {
146
- handler.updateState(subDevice);
147
- }
148
- }
143
+ await this.pollDeviceUpdates();
144
+ await this.checkForNewVisitors();
145
+ }
146
+ catch (error) {
147
+ this.log.error('An error occurred during polling:', error);
148
+ }
149
+ }, this.pollingInterval);
150
+ }
151
+ async pollDeviceUpdates() {
152
+ const devices = await this.shomeClient.getDeviceList();
153
+ for (const device of devices) {
154
+ if (CONTROLLABLE_MULTI_DEVICE_TYPES.includes(device.thngModelTypeName)) {
155
+ const deviceInfoList = await this.shomeClient.getDeviceInfo(device.thngId, device.thngModelTypeName);
156
+ if (deviceInfoList) {
157
+ for (const subDevice of deviceInfoList) {
158
+ const deviceId = `${device.thngId}-${subDevice.deviceId}`;
159
+ if (this.shomeClient.isDeviceBusy(deviceId)) {
160
+ this.log.debug(`Skipping polling update for ${subDevice.nickname} as it has a pending request.`);
161
+ continue;
149
162
  }
150
- }
151
- else if (SPECIAL_CONTROLLABLE_TYPES.includes(device.thngModelTypeName)) {
152
- const uuid = this.api.hap.uuid.generate(device.thngId);
153
- const handler = this.accessoryHandlers.get(uuid);
163
+ const subUuid = this.api.hap.uuid.generate(deviceId);
164
+ const handler = this.accessoryHandlers.get(subUuid);
154
165
  if (handler) {
155
- handler.updateState(device);
166
+ handler.updateState(subDevice);
156
167
  }
157
168
  }
158
169
  }
159
170
  }
160
- catch (error) {
161
- this.log.error('An error occurred during polling:', error);
171
+ else if (SPECIAL_CONTROLLABLE_TYPES.includes(device.thngModelTypeName)) {
172
+ const deviceId = device.thngId;
173
+ if (this.shomeClient.isDeviceBusy(deviceId)) {
174
+ this.log.debug(`Skipping polling update for ${device.nickname} as it has a pending request.`);
175
+ continue;
176
+ }
177
+ const uuid = this.api.hap.uuid.generate(deviceId);
178
+ const handler = this.accessoryHandlers.get(uuid);
179
+ if (handler) {
180
+ handler.updateState(device);
181
+ }
162
182
  }
163
- }, this.pollingInterval);
183
+ }
184
+ }
185
+ async checkForNewVisitors() {
186
+ this.log.debug('Checking for new doorbell events...');
187
+ const visitorList = await this.shomeClient.getVisitorHistory();
188
+ const newVisitors = [];
189
+ for (const visitor of visitorList) {
190
+ const visitorTime = this.parseRecodDt(visitor.recodDt);
191
+ if (visitorTime > this.lastCheckedTimestamp) {
192
+ newVisitors.push(visitor);
193
+ }
194
+ }
195
+ if (newVisitors.length > 0) {
196
+ this.log.info(`Found ${newVisitors.length} new doorbell event(s).`);
197
+ newVisitors.sort((a, b) => a.recodDt.localeCompare(b.recodDt));
198
+ const doorbellUUID = this.api.hap.uuid.generate('shome-doorbell');
199
+ const doorbellHandler = this.accessoryHandlers.get(doorbellUUID);
200
+ if (doorbellHandler) {
201
+ for (const visitor of newVisitors) {
202
+ doorbellHandler.newVisitor(visitor);
203
+ }
204
+ }
205
+ else {
206
+ this.log.warn('Doorbell accessory handler not found.');
207
+ }
208
+ const latestVisitor = newVisitors[newVisitors.length - 1];
209
+ this.lastCheckedTimestamp = this.parseRecodDt(latestVisitor.recodDt);
210
+ this.log.debug(`Updated last checked timestamp to: ${this.lastCheckedTimestamp.toISOString()}`);
211
+ }
212
+ }
213
+ parseRecodDt(recodDt) {
214
+ const year = parseInt(recodDt.substring(0, 4), 10);
215
+ const month = parseInt(recodDt.substring(4, 6), 10) - 1;
216
+ const day = parseInt(recodDt.substring(6, 8), 10);
217
+ const hour = parseInt(recodDt.substring(8, 10), 10);
218
+ const minute = parseInt(recodDt.substring(10, 12), 10);
219
+ const second = parseInt(recodDt.substring(12, 14), 10);
220
+ return new Date(year, month, day, hour, minute, second);
164
221
  }
165
222
  }
166
223
  //# sourceMappingURL=platform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,12 @@ export interface SubDevice {
10
10
  nickname: string;
11
11
  [key: string]: unknown;
12
12
  }
13
+ export interface Visitor {
14
+ sttId: string;
15
+ thumbNail: string;
16
+ recodDt: string;
17
+ deviceLabel: string;
18
+ }
13
19
  export declare class ShomeClient {
14
20
  private readonly log;
15
21
  private readonly username;
@@ -17,20 +23,25 @@ export declare class ShomeClient {
17
23
  private readonly deviceId;
18
24
  private cachedAccessToken;
19
25
  private ihdId;
26
+ private homeId;
20
27
  private tokenExpiry;
21
28
  private putQueue;
22
29
  private isProcessingPut;
23
30
  private loginPromise;
31
+ private pendingPutRequests;
24
32
  constructor(log: Logger, username: string, password: string, deviceId: string);
25
33
  private login;
26
34
  private performLogin;
27
35
  private enqueuePut;
28
36
  private processPutQueue;
29
37
  private executeWithRetries;
38
+ isDeviceBusy(deviceId: string): boolean;
30
39
  getDeviceList(): Promise<MainDevice[]>;
31
40
  getDeviceInfo(thingId: string, type: string): Promise<SubDevice[] | null>;
32
- setDevice(thingId: string, deviceId: string, type: string, controlType: string, state: string, nickname?: string): Promise<boolean>;
41
+ setDevice(thingId: string, subDeviceId: string, type: string, controlType: string, state: string, nickname?: string): Promise<boolean>;
33
42
  unlockDoorlock(thingId: string, nickname?: string): Promise<boolean>;
43
+ getVisitorHistory(): Promise<Visitor[]>;
44
+ getThumbnailImage(visitor: Visitor): Promise<Buffer | null>;
34
45
  private sha512;
35
46
  private isTokenExpired;
36
47
  private getDateTime;