@boozilla/homebridge-shome 1.0.0 → 1.0.2
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/.idea/codeStyles/codeStyleConfig.xml +1 -1
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/jsLinters/eslint.xml +6 -0
- package/config.schema.json +13 -9
- package/dist/accessories/doorlockAccessory.js +2 -4
- package/dist/accessories/doorlockAccessory.js.map +1 -1
- package/dist/accessories/heaterAccessory.js +15 -5
- package/dist/accessories/heaterAccessory.js.map +1 -1
- package/dist/accessories/lightAccessory.js +7 -1
- package/dist/accessories/lightAccessory.js.map +1 -1
- package/dist/accessories/ventilatorAccessory.js +14 -4
- package/dist/accessories/ventilatorAccessory.js.map +1 -1
- package/dist/settings.d.ts +1 -1
- package/dist/settings.js +1 -1
- package/dist/settings.js.map +1 -1
- package/dist/shomeClient.d.ts +2 -2
- package/dist/shomeClient.js +10 -6
- package/dist/shomeClient.js.map +1 -1
- package/package.json +1 -1
- package/src/accessories/doorlockAccessory.ts +16 -18
- package/src/accessories/heaterAccessory.ts +47 -32
- package/src/accessories/lightAccessory.ts +19 -13
- package/src/accessories/ventilatorAccessory.ts +35 -19
- package/src/settings.ts +1 -1
- package/src/shomeClient.ts +23 -19
package/config.schema.json
CHANGED
|
@@ -5,28 +5,32 @@
|
|
|
5
5
|
"name": {
|
|
6
6
|
"title": "Name",
|
|
7
7
|
"type": "string",
|
|
8
|
-
"default": "sHome"
|
|
9
|
-
"required": true
|
|
8
|
+
"default": "sHome"
|
|
10
9
|
},
|
|
11
10
|
"username": {
|
|
12
11
|
"title": "Username",
|
|
13
12
|
"type": "string",
|
|
14
|
-
"description": "Your Samsung sHome account username."
|
|
15
|
-
"required": true
|
|
13
|
+
"description": "Your Samsung sHome account username."
|
|
16
14
|
},
|
|
17
15
|
"password": {
|
|
18
16
|
"title": "Password",
|
|
19
17
|
"type": "string",
|
|
20
18
|
"description": "Your Samsung sHome account password.",
|
|
21
|
-
"required": true,
|
|
22
19
|
"format": "password"
|
|
23
20
|
},
|
|
24
21
|
"deviceId": {
|
|
25
22
|
"title": "Device ID",
|
|
26
23
|
"type": "string",
|
|
27
|
-
"description": "Your mobile device ID."
|
|
28
|
-
"required": true
|
|
24
|
+
"description": "Your mobile device ID."
|
|
29
25
|
}
|
|
30
|
-
}
|
|
31
|
-
|
|
26
|
+
},
|
|
27
|
+
"required": [
|
|
28
|
+
"name",
|
|
29
|
+
"username",
|
|
30
|
+
"password",
|
|
31
|
+
"deviceId"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"pluginAlias": "sHome",
|
|
35
|
+
"pluginType": "platform"
|
|
32
36
|
}
|
|
@@ -31,14 +31,12 @@ export class DoorlockAccessory {
|
|
|
31
31
|
async setTargetState(value) {
|
|
32
32
|
const device = this.accessory.context.device;
|
|
33
33
|
if (value === this.platform.Characteristic.LockTargetState.UNSECURED) {
|
|
34
|
-
this.platform.
|
|
35
|
-
const success = await this.platform.shomeClient.unlockDoorlock(device.thngId);
|
|
34
|
+
const success = await this.platform.shomeClient.unlockDoorlock(device.thngId, device.nickname);
|
|
36
35
|
if (success) {
|
|
37
|
-
this.
|
|
36
|
+
this.accessory.context.device.status = 0;
|
|
38
37
|
this.service.updateCharacteristic(this.platform.Characteristic.LockCurrentState, this.platform.Characteristic.LockCurrentState.UNSECURED);
|
|
39
38
|
}
|
|
40
39
|
else {
|
|
41
|
-
this.platform.log.error(`Failed to unlock ${device.nickname}.`);
|
|
42
40
|
setTimeout(() => {
|
|
43
41
|
this.service.updateCharacteristic(this.platform.Characteristic.LockTargetState, this.platform.Characteristic.LockTargetState.SECURED);
|
|
44
42
|
}, 1000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doorlockAccessory.js","sourceRoot":"","sources":["../../src/accessories/doorlockAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,iBAAiB;
|
|
1
|
+
{"version":3,"file":"doorlockAccessory.js","sourceRoot":"","sources":["../../src/accessories/doorlockAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,6 @@ export class HeaterAccessory {
|
|
|
20
20
|
this.service.getCharacteristic(this.platform.Characteristic.CurrentHeaterCoolerState)
|
|
21
21
|
.onGet(this.getCurrentState.bind(this));
|
|
22
22
|
this.service.getCharacteristic(this.platform.Characteristic.TargetHeaterCoolerState)
|
|
23
|
-
// 버그 수정: validValues를 HEAT로만 설정하여 다른 모드(냉방, 자동)를 UI에서 제거
|
|
24
23
|
.setProps({
|
|
25
24
|
validValues: [this.platform.Characteristic.TargetHeaterCoolerState.HEAT],
|
|
26
25
|
})
|
|
@@ -33,7 +32,6 @@ export class HeaterAccessory {
|
|
|
33
32
|
.onGet(this.getTargetTemperature.bind(this))
|
|
34
33
|
.onSet(this.setTargetTemperature.bind(this));
|
|
35
34
|
}
|
|
36
|
-
// ... (이하 다른 함수들은 이전과 동일)
|
|
37
35
|
async getActive() {
|
|
38
36
|
const subDevice = this.accessory.context.subDevice;
|
|
39
37
|
return subDevice.deviceStatus === 1
|
|
@@ -61,15 +59,27 @@ export class HeaterAccessory {
|
|
|
61
59
|
const device = this.accessory.context.device;
|
|
62
60
|
const subDevice = this.accessory.context.subDevice;
|
|
63
61
|
const state = value === this.platform.Characteristic.Active.ACTIVE ? 'ON' : 'OFF';
|
|
64
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'ON_OFF', state);
|
|
62
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'ON_OFF', state, subDevice.nickname);
|
|
63
|
+
if (success) {
|
|
64
|
+
this.accessory.context.subDevice.deviceStatus = value === this.platform.Characteristic.Active.ACTIVE ? 1 : 0;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
68
|
+
}
|
|
65
69
|
}
|
|
66
70
|
async setTargetState() {
|
|
67
|
-
//
|
|
71
|
+
// This function does not require separate processing as it only accepts HEAT values due to setProps.
|
|
68
72
|
}
|
|
69
73
|
async setTargetTemperature(value) {
|
|
70
74
|
const device = this.accessory.context.device;
|
|
71
75
|
const subDevice = this.accessory.context.subDevice;
|
|
72
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'TEMPERATURE', value.toString());
|
|
76
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'TEMPERATURE', value.toString(), subDevice.nickname);
|
|
77
|
+
if (success) {
|
|
78
|
+
this.accessory.context.subDevice.setTemp = value;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
82
|
+
}
|
|
73
83
|
}
|
|
74
84
|
}
|
|
75
85
|
//# sourceMappingURL=heaterAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heaterAccessory.js","sourceRoot":"","sources":["../../src/accessories/heaterAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"heaterAccessory.js","sourceRoot":"","sources":["../../src/accessories/heaterAccessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,13 @@ export class LightAccessory {
|
|
|
26
26
|
const device = this.accessory.context.device;
|
|
27
27
|
const subDevice = this.accessory.context.subDevice;
|
|
28
28
|
const state = value ? 'ON' : 'OFF';
|
|
29
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'LIGHT', 'ON_OFF', state);
|
|
29
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'LIGHT', 'ON_OFF', state, subDevice.nickname);
|
|
30
|
+
if (success) {
|
|
31
|
+
this.accessory.context.subDevice.deviceStatus = value ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
35
|
+
}
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
//# sourceMappingURL=lightAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightAccessory.js","sourceRoot":"","sources":["../../src/accessories/lightAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"lightAccessory.js","sourceRoot":"","sources":["../../src/accessories/lightAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,cAAc;IAIF;IACA;IAJf,OAAO,CAAU;IAEzB,YACuB,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAE/C,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,SAAS,CAAC;aACvE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC;aACpE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1G,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;YACrE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/D,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEtF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;aAC5D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACnD,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA0B;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAEnD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEtJ,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,4EAA+D,CAAC;QAChH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -30,7 +30,6 @@ export class VentilatorAccessory {
|
|
|
30
30
|
async getRotationSpeed() {
|
|
31
31
|
const subDevice = this.accessory.context.subDevice;
|
|
32
32
|
const apiSpeed = subDevice.windSpeedMode; // 1, 2, 3
|
|
33
|
-
// sHome API (1:강, 2:중, 3:약) -> HomeKit % (100:강, 66:중, 33:약)
|
|
34
33
|
if (apiSpeed === 1) {
|
|
35
34
|
return 100;
|
|
36
35
|
}
|
|
@@ -45,13 +44,18 @@ export class VentilatorAccessory {
|
|
|
45
44
|
const device = this.accessory.context.device;
|
|
46
45
|
const subDevice = this.accessory.context.subDevice;
|
|
47
46
|
const state = value === this.platform.Characteristic.Active.ACTIVE ? 'ON' : 'OFF';
|
|
48
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'ON_OFF', state);
|
|
47
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'ON_OFF', state, subDevice.nickname);
|
|
48
|
+
if (success) {
|
|
49
|
+
this.accessory.context.subDevice.deviceStatus = value === this.platform.Characteristic.Active.ACTIVE ? 1 : 0;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
53
|
+
}
|
|
49
54
|
}
|
|
50
55
|
async setRotationSpeed(value) {
|
|
51
56
|
const device = this.accessory.context.device;
|
|
52
57
|
const subDevice = this.accessory.context.subDevice;
|
|
53
58
|
const numericValue = Number(value);
|
|
54
|
-
// HomeKit % -> sHome API (1:강, 2:중, 3:약)
|
|
55
59
|
let apiSpeed = 3;
|
|
56
60
|
if (numericValue > 33) {
|
|
57
61
|
apiSpeed = 2;
|
|
@@ -59,7 +63,13 @@ export class VentilatorAccessory {
|
|
|
59
63
|
if (numericValue > 66) {
|
|
60
64
|
apiSpeed = 1;
|
|
61
65
|
}
|
|
62
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'WINDSPEED', apiSpeed.toString());
|
|
66
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'WINDSPEED', apiSpeed.toString(), subDevice.nickname);
|
|
67
|
+
if (success) {
|
|
68
|
+
this.accessory.context.subDevice.windSpeedMode = apiSpeed;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
|
|
72
|
+
}
|
|
63
73
|
}
|
|
64
74
|
}
|
|
65
75
|
//# sourceMappingURL=ventilatorAccessory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ventilatorAccessory.js","sourceRoot":"","sources":["../../src/accessories/ventilatorAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"ventilatorAccessory.js","sourceRoot":"","sources":["../../src/accessories/ventilatorAccessory.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,mBAAmB;IAIP;IACA;IAJf,UAAU,CAAU;IAE5B,YACuB,QAAuB,EACvB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAmB;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAE/C,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,SAAS,CAAC;aACvE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC;aACnE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1G,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE3D,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEzF,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;aACnE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAChC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC;aAC1E,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACvC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACnD,OAAO,SAAS,CAAC,YAAY,KAAK,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM;YAC5C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,UAAU;QAEpD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAC;QACb,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAA0B;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAEnD,MAAM,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAClF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE3J,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,4EAA+D,CAAC;QAChH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,KAA0B;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACnD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;YACtB,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;QACD,IAAI,YAAY,GAAG,EAAE,EAAE,CAAC;YACtB,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CACvD,MAAM,CAAC,MAAM,EACb,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAC7B,YAAY,EACZ,WAAW,EACX,QAAQ,CAAC,QAAQ,EAAE,EACnB,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEtB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,4EAA+D,CAAC;QAChH,CAAC;IACH,CAAC;CACF"}
|
package/dist/settings.d.ts
CHANGED
package/dist/settings.js
CHANGED
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,4BAA4B,CAAC"}
|
package/dist/shomeClient.d.ts
CHANGED
|
@@ -22,8 +22,8 @@ export declare class ShomeClient {
|
|
|
22
22
|
login(): Promise<string | null>;
|
|
23
23
|
getDeviceList(): Promise<MainDevice[]>;
|
|
24
24
|
getDeviceInfo(thingId: string, type: string): Promise<SubDevice[] | null>;
|
|
25
|
-
setDevice(thingId: string, deviceId: string, type: string, controlType: string, state: string): Promise<boolean>;
|
|
26
|
-
unlockDoorlock(thingId: string): Promise<boolean>;
|
|
25
|
+
setDevice(thingId: string, deviceId: string, type: string, controlType: string, state: string, nickname?: string): Promise<boolean>;
|
|
26
|
+
unlockDoorlock(thingId: string, nickname?: string): Promise<boolean>;
|
|
27
27
|
private sha512;
|
|
28
28
|
private isTokenExpired;
|
|
29
29
|
private getDateTime;
|
package/dist/shomeClient.js
CHANGED
|
@@ -97,7 +97,7 @@ export class ShomeClient {
|
|
|
97
97
|
return null;
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
async setDevice(thingId, deviceId, type, controlType, state) {
|
|
100
|
+
async setDevice(thingId, deviceId, type, controlType, state, nickname) {
|
|
101
101
|
const token = await this.login();
|
|
102
102
|
if (!token) {
|
|
103
103
|
return false;
|
|
@@ -115,15 +115,17 @@ export class ShomeClient {
|
|
|
115
115
|
},
|
|
116
116
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
117
117
|
});
|
|
118
|
-
|
|
118
|
+
const displayName = nickname || `${thingId}/${deviceId}`;
|
|
119
|
+
this.log.info(`[${displayName}] state set to ${state}.`);
|
|
119
120
|
return true;
|
|
120
121
|
}
|
|
121
122
|
catch (error) {
|
|
122
|
-
|
|
123
|
+
const displayName = nickname || `${thingId}/${deviceId}`;
|
|
124
|
+
this.log.error(`Error setting device [${displayName}]: ${error}`);
|
|
123
125
|
return false;
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
|
-
async unlockDoorlock(thingId) {
|
|
128
|
+
async unlockDoorlock(thingId, nickname) {
|
|
127
129
|
const token = await this.login();
|
|
128
130
|
if (!token) {
|
|
129
131
|
return false;
|
|
@@ -139,11 +141,13 @@ export class ShomeClient {
|
|
|
139
141
|
},
|
|
140
142
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
141
143
|
});
|
|
142
|
-
|
|
144
|
+
const displayName = nickname || thingId;
|
|
145
|
+
this.log.info(`Unlocked [${displayName}].`);
|
|
143
146
|
return true;
|
|
144
147
|
}
|
|
145
148
|
catch (error) {
|
|
146
|
-
|
|
149
|
+
const displayName = nickname || thingId;
|
|
150
|
+
this.log.error(`Error unlocking [${displayName}]: ${error}`);
|
|
147
151
|
return false;
|
|
148
152
|
}
|
|
149
153
|
}
|
package/dist/shomeClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shomeClient.js","sourceRoot":"","sources":["../src/shomeClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,MAAM,QAAQ,GAAG,mCAAmC,CAAC;AACrD,MAAM,YAAY,GAAG,kEAAkE,CAAC;AACxF,MAAM,kBAAkB,GAAG,yEAAyE,CAAC;AACrG,MAAM,QAAQ,GAAG,KAAK,CAAC;AAgBvB,MAAM,OAAO,WAAW;
|
|
1
|
+
{"version":3,"file":"shomeClient.js","sourceRoot":"","sources":["../src/shomeClient.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,26 +5,26 @@ export class DoorlockAccessory {
|
|
|
5
5
|
private service: Service;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
private readonly platform: ShomePlatform,
|
|
9
|
+
private readonly accessory: PlatformAccessory,
|
|
10
10
|
) {
|
|
11
11
|
const device = this.accessory.context.device;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
this.accessory.getService(this.platform.Service.AccessoryInformation)!
|
|
13
|
+
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Samsung')
|
|
14
|
+
.setCharacteristic(this.platform.Characteristic.Model, 'Doorlock')
|
|
15
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, device.thngId);
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
this.service = this.accessory.getService(this.platform.Service.LockMechanism) ||
|
|
18
|
+
this.accessory.addService(this.platform.Service.LockMechanism);
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
this.service.setCharacteristic(this.platform.Characteristic.Name, device.nickname);
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
this.service.getCharacteristic(this.platform.Characteristic.LockCurrentState)
|
|
23
|
+
.onGet(this.getCurrentState.bind(this));
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
this.service.getCharacteristic(this.platform.Characteristic.LockTargetState)
|
|
26
|
+
.onGet(this.getCurrentState.bind(this))
|
|
27
|
+
.onSet(this.setTargetState.bind(this));
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
async getCurrentState(): Promise<CharacteristicValue> {
|
|
@@ -40,14 +40,12 @@ export class DoorlockAccessory {
|
|
|
40
40
|
const device = this.accessory.context.device;
|
|
41
41
|
|
|
42
42
|
if (value === this.platform.Characteristic.LockTargetState.UNSECURED) {
|
|
43
|
-
this.platform.
|
|
44
|
-
const success = await this.platform.shomeClient.unlockDoorlock(device.thngId);
|
|
43
|
+
const success = await this.platform.shomeClient.unlockDoorlock(device.thngId, device.nickname);
|
|
45
44
|
|
|
46
45
|
if (success) {
|
|
47
|
-
this.
|
|
46
|
+
this.accessory.context.device.status = 0;
|
|
48
47
|
this.service.updateCharacteristic(this.platform.Characteristic.LockCurrentState, this.platform.Characteristic.LockCurrentState.UNSECURED);
|
|
49
48
|
} else {
|
|
50
|
-
this.platform.log.error(`Failed to unlock ${device.nickname}.`);
|
|
51
49
|
setTimeout(() => {
|
|
52
50
|
this.service.updateCharacteristic(this.platform.Characteristic.LockTargetState, this.platform.Characteristic.LockTargetState.SECURED);
|
|
53
51
|
}, 1000);
|
|
@@ -5,48 +5,45 @@ export class HeaterAccessory {
|
|
|
5
5
|
private service: Service;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
private readonly platform: ShomePlatform,
|
|
9
|
+
private readonly accessory: PlatformAccessory,
|
|
10
10
|
) {
|
|
11
11
|
const device = this.accessory.context.device;
|
|
12
12
|
const subDevice = this.accessory.context.subDevice;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
this.accessory.getService(this.platform.Service.AccessoryInformation)!
|
|
15
|
+
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Samsung')
|
|
16
|
+
.setCharacteristic(this.platform.Characteristic.Model, 'Heater')
|
|
17
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, `${device.thngId}-${subDevice.deviceId}`);
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
this.service = this.accessory.getService(this.platform.Service.HeaterCooler) ||
|
|
20
|
+
this.accessory.addService(this.platform.Service.HeaterCooler);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
this.service.setCharacteristic(this.platform.Characteristic.Name, subDevice.nickname);
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
this.service.getCharacteristic(this.platform.Characteristic.Active)
|
|
25
|
+
.onGet(this.getActive.bind(this))
|
|
26
|
+
.onSet(this.setActive.bind(this));
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
this.service.getCharacteristic(this.platform.Characteristic.CurrentHeaterCoolerState)
|
|
29
|
+
.onGet(this.getCurrentState.bind(this));
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.onGet(this.getTargetState.bind(this));
|
|
31
|
+
this.service.getCharacteristic(this.platform.Characteristic.TargetHeaterCoolerState)
|
|
32
|
+
.setProps({
|
|
33
|
+
validValues: [this.platform.Characteristic.TargetHeaterCoolerState.HEAT],
|
|
34
|
+
})
|
|
35
|
+
.onSet(this.setTargetState.bind(this))
|
|
36
|
+
.onGet(this.getTargetState.bind(this));
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
this.service.getCharacteristic(this.platform.Characteristic.CurrentTemperature)
|
|
39
|
+
.onGet(this.getCurrentTemperature.bind(this));
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
this.service.getCharacteristic(this.platform.Characteristic.HeatingThresholdTemperature)
|
|
42
|
+
.setProps({ minValue: 5, maxValue: 40, minStep: 1 })
|
|
43
|
+
.onGet(this.getTargetTemperature.bind(this))
|
|
44
|
+
.onSet(this.setTargetTemperature.bind(this));
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
// ... (이하 다른 함수들은 이전과 동일)
|
|
49
|
-
|
|
50
47
|
async getActive(): Promise<CharacteristicValue> {
|
|
51
48
|
const subDevice = this.accessory.context.subDevice;
|
|
52
49
|
return subDevice.deviceStatus === 1
|
|
@@ -79,16 +76,34 @@ export class HeaterAccessory {
|
|
|
79
76
|
const device = this.accessory.context.device;
|
|
80
77
|
const subDevice = this.accessory.context.subDevice;
|
|
81
78
|
const state = value === this.platform.Characteristic.Active.ACTIVE ? 'ON' : 'OFF';
|
|
82
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'ON_OFF', state);
|
|
79
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'HEATER', 'ON_OFF', state, subDevice.nickname);
|
|
80
|
+
|
|
81
|
+
if (success) {
|
|
82
|
+
this.accessory.context.subDevice.deviceStatus = value === this.platform.Characteristic.Active.ACTIVE ? 1 : 0;
|
|
83
|
+
} else {
|
|
84
|
+
throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
85
|
+
}
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
async setTargetState() {
|
|
86
|
-
//
|
|
89
|
+
// This function does not require separate processing as it only accepts HEAT values due to setProps.
|
|
87
90
|
}
|
|
88
91
|
|
|
89
92
|
async setTargetTemperature(value: CharacteristicValue) {
|
|
90
93
|
const device = this.accessory.context.device;
|
|
91
94
|
const subDevice = this.accessory.context.subDevice;
|
|
92
|
-
await this.platform.shomeClient.setDevice(
|
|
95
|
+
const success = await this.platform.shomeClient.setDevice(
|
|
96
|
+
device.thngId,
|
|
97
|
+
subDevice.deviceId.toString(),
|
|
98
|
+
'HEATER',
|
|
99
|
+
'TEMPERATURE',
|
|
100
|
+
value.toString(),
|
|
101
|
+
subDevice.nickname);
|
|
102
|
+
|
|
103
|
+
if (success) {
|
|
104
|
+
this.accessory.context.subDevice.setTemp = value as number;
|
|
105
|
+
} else {
|
|
106
|
+
throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
107
|
+
}
|
|
93
108
|
}
|
|
94
109
|
}
|
|
@@ -5,25 +5,25 @@ export class LightAccessory {
|
|
|
5
5
|
private service: Service;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
private readonly platform: ShomePlatform,
|
|
9
|
+
private readonly accessory: PlatformAccessory,
|
|
10
10
|
) {
|
|
11
11
|
const device = this.accessory.context.device;
|
|
12
12
|
const subDevice = this.accessory.context.subDevice;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
this.accessory.getService(this.platform.Service.AccessoryInformation)!
|
|
15
|
+
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Samsung')
|
|
16
|
+
.setCharacteristic(this.platform.Characteristic.Model, 'Smart Light')
|
|
17
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, `${device.thngId}-${subDevice.deviceId}`);
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
this.service = this.accessory.getService(this.platform.Service.Lightbulb) ||
|
|
20
|
+
this.accessory.addService(this.platform.Service.Lightbulb);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
this.service.setCharacteristic(this.platform.Characteristic.Name, subDevice.nickname);
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
this.service.getCharacteristic(this.platform.Characteristic.On)
|
|
25
|
+
.onGet(this.getOn.bind(this))
|
|
26
|
+
.onSet(this.setOn.bind(this));
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
async getOn(): Promise<CharacteristicValue> {
|
|
@@ -36,6 +36,12 @@ export class LightAccessory {
|
|
|
36
36
|
const subDevice = this.accessory.context.subDevice;
|
|
37
37
|
|
|
38
38
|
const state = value ? 'ON' : 'OFF';
|
|
39
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'LIGHT', 'ON_OFF', state);
|
|
39
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'LIGHT', 'ON_OFF', state, subDevice.nickname);
|
|
40
|
+
|
|
41
|
+
if (success) {
|
|
42
|
+
this.accessory.context.subDevice.deviceStatus = value ? 1 : 0;
|
|
43
|
+
} else {
|
|
44
|
+
throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
45
|
+
}
|
|
40
46
|
}
|
|
41
47
|
}
|
|
@@ -5,29 +5,29 @@ export class VentilatorAccessory {
|
|
|
5
5
|
private fanService: Service;
|
|
6
6
|
|
|
7
7
|
constructor(
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
private readonly platform: ShomePlatform,
|
|
9
|
+
private readonly accessory: PlatformAccessory,
|
|
10
10
|
) {
|
|
11
11
|
const device = this.accessory.context.device;
|
|
12
12
|
const subDevice = this.accessory.context.subDevice;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
this.accessory.getService(this.platform.Service.AccessoryInformation)!
|
|
15
|
+
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Samsung')
|
|
16
|
+
.setCharacteristic(this.platform.Characteristic.Model, 'Ventilator')
|
|
17
|
+
.setCharacteristic(this.platform.Characteristic.SerialNumber, `${device.thngId}-${subDevice.deviceId}`);
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
this.fanService = this.accessory.getService(this.platform.Service.Fanv2) ||
|
|
20
|
+
this.accessory.addService(this.platform.Service.Fanv2);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
this.fanService.setCharacteristic(this.platform.Characteristic.Name, subDevice.nickname);
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
this.fanService.getCharacteristic(this.platform.Characteristic.Active)
|
|
25
|
+
.onGet(this.getActive.bind(this))
|
|
26
|
+
.onSet(this.setActive.bind(this));
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
this.fanService.getCharacteristic(this.platform.Characteristic.RotationSpeed)
|
|
29
|
+
.onGet(this.getRotationSpeed.bind(this))
|
|
30
|
+
.onSet(this.setRotationSpeed.bind(this));
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async getActive(): Promise<CharacteristicValue> {
|
|
@@ -41,7 +41,6 @@ export class VentilatorAccessory {
|
|
|
41
41
|
const subDevice = this.accessory.context.subDevice;
|
|
42
42
|
const apiSpeed = subDevice.windSpeedMode; // 1, 2, 3
|
|
43
43
|
|
|
44
|
-
// sHome API (1:강, 2:중, 3:약) -> HomeKit % (100:강, 66:중, 33:약)
|
|
45
44
|
if (apiSpeed === 1) {
|
|
46
45
|
return 100;
|
|
47
46
|
} else if (apiSpeed === 2) {
|
|
@@ -56,7 +55,13 @@ export class VentilatorAccessory {
|
|
|
56
55
|
const subDevice = this.accessory.context.subDevice;
|
|
57
56
|
|
|
58
57
|
const state = value === this.platform.Characteristic.Active.ACTIVE ? 'ON' : 'OFF';
|
|
59
|
-
await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'ON_OFF', state);
|
|
58
|
+
const success = await this.platform.shomeClient.setDevice(device.thngId, subDevice.deviceId.toString(), 'VENTILATOR', 'ON_OFF', state, subDevice.nickname);
|
|
59
|
+
|
|
60
|
+
if (success) {
|
|
61
|
+
this.accessory.context.subDevice.deviceStatus = value === this.platform.Characteristic.Active.ACTIVE ? 1 : 0;
|
|
62
|
+
} else {
|
|
63
|
+
throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
64
|
+
}
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
async setRotationSpeed(value: CharacteristicValue) {
|
|
@@ -64,7 +69,6 @@ export class VentilatorAccessory {
|
|
|
64
69
|
const subDevice = this.accessory.context.subDevice;
|
|
65
70
|
const numericValue = Number(value);
|
|
66
71
|
|
|
67
|
-
// HomeKit % -> sHome API (1:강, 2:중, 3:약)
|
|
68
72
|
let apiSpeed = 3;
|
|
69
73
|
if (numericValue > 33) {
|
|
70
74
|
apiSpeed = 2;
|
|
@@ -73,6 +77,18 @@ export class VentilatorAccessory {
|
|
|
73
77
|
apiSpeed = 1;
|
|
74
78
|
}
|
|
75
79
|
|
|
76
|
-
await this.platform.shomeClient.setDevice(
|
|
80
|
+
const success = await this.platform.shomeClient.setDevice(
|
|
81
|
+
device.thngId,
|
|
82
|
+
subDevice.deviceId.toString(),
|
|
83
|
+
'VENTILATOR',
|
|
84
|
+
'WINDSPEED',
|
|
85
|
+
apiSpeed.toString(),
|
|
86
|
+
subDevice.nickname);
|
|
87
|
+
|
|
88
|
+
if (success) {
|
|
89
|
+
this.accessory.context.subDevice.windSpeedMode = apiSpeed;
|
|
90
|
+
} else {
|
|
91
|
+
throw new this.platform.api.hap.HapStatusError(this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE);
|
|
92
|
+
}
|
|
77
93
|
}
|
|
78
94
|
}
|
package/src/settings.ts
CHANGED
package/src/shomeClient.ts
CHANGED
|
@@ -9,16 +9,16 @@ const LANGUAGE = 'KOR';
|
|
|
9
9
|
|
|
10
10
|
// Define and export interfaces for device types
|
|
11
11
|
export interface MainDevice {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
thngId: string;
|
|
13
|
+
thngModelTypeName: string;
|
|
14
|
+
nickname: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export interface SubDevice {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
deviceId: string;
|
|
20
|
+
nickname: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
export class ShomeClient {
|
|
@@ -27,10 +27,10 @@ export class ShomeClient {
|
|
|
27
27
|
private tokenExpiry: number = 0;
|
|
28
28
|
|
|
29
29
|
constructor(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
private readonly log: Logger,
|
|
31
|
+
private readonly username: string,
|
|
32
|
+
private readonly password: string,
|
|
33
|
+
private readonly deviceId: string,
|
|
34
34
|
) {
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -43,7 +43,7 @@ export class ShomeClient {
|
|
|
43
43
|
const createDate = this.getDateTime();
|
|
44
44
|
const hashedPassword = this.sha512(this.password);
|
|
45
45
|
const hashData = this.sha512(`IHRESTAPI${this.username}${hashedPassword}${this.deviceId}` +
|
|
46
|
-
|
|
46
|
+
`${APP_REGST_ID}${CHINA_APP_REGST_ID}${LANGUAGE}${createDate}`);
|
|
47
47
|
|
|
48
48
|
const response = await axios.put(`${BASE_URL}/v18/users/login`, null, {
|
|
49
49
|
params: {
|
|
@@ -123,7 +123,7 @@ export class ShomeClient {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
async setDevice(thingId: string, deviceId: string, type: string, controlType: string, state: string): Promise<boolean> {
|
|
126
|
+
async setDevice(thingId: string, deviceId: string, type: string, controlType: string, state: string, nickname?: string): Promise<boolean> {
|
|
127
127
|
const token = await this.login();
|
|
128
128
|
if (!token) {
|
|
129
129
|
return false;
|
|
@@ -144,15 +144,17 @@ export class ShomeClient {
|
|
|
144
144
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
const displayName = nickname || `${thingId}/${deviceId}`;
|
|
148
|
+
this.log.info(`[${displayName}] state set to ${state}.`);
|
|
148
149
|
return true;
|
|
149
150
|
} catch (error) {
|
|
150
|
-
|
|
151
|
+
const displayName = nickname || `${thingId}/${deviceId}`;
|
|
152
|
+
this.log.error(`Error setting device [${displayName}]: ${error}`);
|
|
151
153
|
return false;
|
|
152
154
|
}
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
async unlockDoorlock(thingId: string): Promise<boolean> {
|
|
157
|
+
async unlockDoorlock(thingId: string, nickname?: string): Promise<boolean> {
|
|
156
158
|
const token = await this.login();
|
|
157
159
|
if (!token) {
|
|
158
160
|
return false;
|
|
@@ -171,10 +173,12 @@ export class ShomeClient {
|
|
|
171
173
|
headers: { 'Authorization': `Bearer ${token}` },
|
|
172
174
|
});
|
|
173
175
|
|
|
174
|
-
|
|
176
|
+
const displayName = nickname || thingId;
|
|
177
|
+
this.log.info(`Unlocked [${displayName}].`);
|
|
175
178
|
return true;
|
|
176
179
|
} catch (error) {
|
|
177
|
-
|
|
180
|
+
const displayName = nickname || thingId;
|
|
181
|
+
this.log.error(`Error unlocking [${displayName}]: ${error}`);
|
|
178
182
|
return false;
|
|
179
183
|
}
|
|
180
184
|
}
|
|
@@ -191,6 +195,6 @@ export class ShomeClient {
|
|
|
191
195
|
const now = new Date();
|
|
192
196
|
const pad = (num: number) => num.toString().padStart(2, '0');
|
|
193
197
|
return `${now.getUTCFullYear()}${pad(now.getUTCMonth() + 1)}${pad(now.getUTCDate())}` +
|
|
194
|
-
|
|
198
|
+
`${pad(now.getUTCHours())}${pad(now.getUTCMinutes())}${pad(now.getUTCSeconds())}`;
|
|
195
199
|
}
|
|
196
200
|
}
|