@homebridge-plugins/homebridge-tuya 2.0.2-beta.3
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/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/dictionaries/benpotter.xml +3 -0
- package/.idea/homebridge-tuya.iml +8 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.idea/workspace.xml +64 -0
- package/ADVANCED_OPTIONS.md +267 -0
- package/CHANGELOG.md +127 -0
- package/LICENSE +20 -0
- package/README.md +206 -0
- package/SUPPORTED_DEVICES.md +206 -0
- package/config.schema.json +550 -0
- package/dist/accessory/AccessoryFactory.js +274 -0
- package/dist/accessory/AccessoryFactory.js.map +1 -0
- package/dist/accessory/AirConditionerAccessory.js +307 -0
- package/dist/accessory/AirConditionerAccessory.js.map +1 -0
- package/dist/accessory/AirPurifierAccessory.js +90 -0
- package/dist/accessory/AirPurifierAccessory.js.map +1 -0
- package/dist/accessory/AirQualitySensorAccessory.js +30 -0
- package/dist/accessory/AirQualitySensorAccessory.js.map +1 -0
- package/dist/accessory/BaseAccessory.js +295 -0
- package/dist/accessory/BaseAccessory.js.map +1 -0
- package/dist/accessory/CameraAccessory.js +117 -0
- package/dist/accessory/CameraAccessory.js.map +1 -0
- package/dist/accessory/CarbonDioxideSensorAccessory.js +52 -0
- package/dist/accessory/CarbonDioxideSensorAccessory.js.map +1 -0
- package/dist/accessory/CarbonMonoxideSensorAccessory.js +52 -0
- package/dist/accessory/CarbonMonoxideSensorAccessory.js.map +1 -0
- package/dist/accessory/ContactSensorAccessory.js +30 -0
- package/dist/accessory/ContactSensorAccessory.js.map +1 -0
- package/dist/accessory/DehumidifierAccessory.js +68 -0
- package/dist/accessory/DehumidifierAccessory.js.map +1 -0
- package/dist/accessory/DiffuserAccessory.js +55 -0
- package/dist/accessory/DiffuserAccessory.js.map +1 -0
- package/dist/accessory/DimmerAccessory.js +94 -0
- package/dist/accessory/DimmerAccessory.js.map +1 -0
- package/dist/accessory/DoorbellAccessory.js +89 -0
- package/dist/accessory/DoorbellAccessory.js.map +1 -0
- package/dist/accessory/ExtractionHoodAccessory.js +118 -0
- package/dist/accessory/ExtractionHoodAccessory.js.map +1 -0
- package/dist/accessory/FanAccessory.js +123 -0
- package/dist/accessory/FanAccessory.js.map +1 -0
- package/dist/accessory/GarageDoorAccessory.js +69 -0
- package/dist/accessory/GarageDoorAccessory.js.map +1 -0
- package/dist/accessory/HeaterAccessory.js +96 -0
- package/dist/accessory/HeaterAccessory.js.map +1 -0
- package/dist/accessory/HumanPresenceSensorAccessory.js +20 -0
- package/dist/accessory/HumanPresenceSensorAccessory.js.map +1 -0
- package/dist/accessory/HumidifierAccessory.js +135 -0
- package/dist/accessory/HumidifierAccessory.js.map +1 -0
- package/dist/accessory/IRAirConditionerAccessory.js +285 -0
- package/dist/accessory/IRAirConditionerAccessory.js.map +1 -0
- package/dist/accessory/IRControlHubAccessory.js +49 -0
- package/dist/accessory/IRControlHubAccessory.js.map +1 -0
- package/dist/accessory/IRControlHubSubAccessory.js +53 -0
- package/dist/accessory/IRControlHubSubAccessory.js.map +1 -0
- package/dist/accessory/IRGenericAccessory.js +50 -0
- package/dist/accessory/IRGenericAccessory.js.map +1 -0
- package/dist/accessory/LeakSensorAccessory.js +36 -0
- package/dist/accessory/LeakSensorAccessory.js.map +1 -0
- package/dist/accessory/LightAccessory.js +36 -0
- package/dist/accessory/LightAccessory.js.map +1 -0
- package/dist/accessory/LightSensorAccessory.js +32 -0
- package/dist/accessory/LightSensorAccessory.js.map +1 -0
- package/dist/accessory/LocationWeatherAccessory.js +72 -0
- package/dist/accessory/LocationWeatherAccessory.js.map +1 -0
- package/dist/accessory/LockAccessory.js +56 -0
- package/dist/accessory/LockAccessory.js.map +1 -0
- package/dist/accessory/MotionSensorAccessory.js +20 -0
- package/dist/accessory/MotionSensorAccessory.js.map +1 -0
- package/dist/accessory/OutletAccessory.js +23 -0
- package/dist/accessory/OutletAccessory.js.map +1 -0
- package/dist/accessory/PetFeederAccessory.js +139 -0
- package/dist/accessory/PetFeederAccessory.js.map +1 -0
- package/dist/accessory/SceneAccessory.js +32 -0
- package/dist/accessory/SceneAccessory.js.map +1 -0
- package/dist/accessory/SceneSwitchAccessory.js +44 -0
- package/dist/accessory/SceneSwitchAccessory.js.map +1 -0
- package/dist/accessory/SecuritySystemAccessory.js +30 -0
- package/dist/accessory/SecuritySystemAccessory.js.map +1 -0
- package/dist/accessory/SmokeSensorAccessory.js +35 -0
- package/dist/accessory/SmokeSensorAccessory.js.map +1 -0
- package/dist/accessory/SwitchAccessory.js +86 -0
- package/dist/accessory/SwitchAccessory.js.map +1 -0
- package/dist/accessory/TemperatureHumiditySensorAccessory.js +24 -0
- package/dist/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
- package/dist/accessory/ThermostatAccessory.js +190 -0
- package/dist/accessory/ThermostatAccessory.js.map +1 -0
- package/dist/accessory/ValveAccessory.js +45 -0
- package/dist/accessory/ValveAccessory.js.map +1 -0
- package/dist/accessory/VibrationSensorAccessory.js +42 -0
- package/dist/accessory/VibrationSensorAccessory.js.map +1 -0
- package/dist/accessory/WeatherStationAccessory.js +59 -0
- package/dist/accessory/WeatherStationAccessory.js.map +1 -0
- package/dist/accessory/WetBulbGlobeTemperatureAccessory.js +23 -0
- package/dist/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
- package/dist/accessory/WhiteNoiseLightAccessory.js +59 -0
- package/dist/accessory/WhiteNoiseLightAccessory.js.map +1 -0
- package/dist/accessory/WindowAccessory.js +14 -0
- package/dist/accessory/WindowAccessory.js.map +1 -0
- package/dist/accessory/WindowCoveringAccessory.js +156 -0
- package/dist/accessory/WindowCoveringAccessory.js.map +1 -0
- package/dist/accessory/WirelessSwitchAccessory.js +42 -0
- package/dist/accessory/WirelessSwitchAccessory.js.map +1 -0
- package/dist/accessory/characteristic/Active.js +23 -0
- package/dist/accessory/characteristic/Active.js.map +1 -0
- package/dist/accessory/characteristic/AirQuality.js +75 -0
- package/dist/accessory/characteristic/AirQuality.js.map +1 -0
- package/dist/accessory/characteristic/CurrentRelativeHumidity.js +24 -0
- package/dist/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
- package/dist/accessory/characteristic/CurrentTemperature.js +24 -0
- package/dist/accessory/characteristic/CurrentTemperature.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWeather.js +51 -0
- package/dist/accessory/characteristic/CurrentWeather.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js +81 -0
- package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
- package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js +50 -0
- package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
- package/dist/accessory/characteristic/EnergyUsage.js +103 -0
- package/dist/accessory/characteristic/EnergyUsage.js.map +1 -0
- package/dist/accessory/characteristic/Light.js +269 -0
- package/dist/accessory/characteristic/Light.js.map +1 -0
- package/dist/accessory/characteristic/LightSensor.js +24 -0
- package/dist/accessory/characteristic/LightSensor.js.map +1 -0
- package/dist/accessory/characteristic/LockPhysicalControls.js +22 -0
- package/dist/accessory/characteristic/LockPhysicalControls.js.map +1 -0
- package/dist/accessory/characteristic/MotionDetected.js +23 -0
- package/dist/accessory/characteristic/MotionDetected.js.map +1 -0
- package/dist/accessory/characteristic/Name.js +12 -0
- package/dist/accessory/characteristic/Name.js.map +1 -0
- package/dist/accessory/characteristic/OccupancyDetected.js +20 -0
- package/dist/accessory/characteristic/OccupancyDetected.js.map +1 -0
- package/dist/accessory/characteristic/On.js +26 -0
- package/dist/accessory/characteristic/On.js.map +1 -0
- package/dist/accessory/characteristic/OutletInUse.js +15 -0
- package/dist/accessory/characteristic/OutletInUse.js.map +1 -0
- package/dist/accessory/characteristic/ProgrammableSwitchEvent.js +90 -0
- package/dist/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
- package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js +29 -0
- package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
- package/dist/accessory/characteristic/RotationSpeed.js +79 -0
- package/dist/accessory/characteristic/RotationSpeed.js.map +1 -0
- package/dist/accessory/characteristic/SecuritySystemState.js +76 -0
- package/dist/accessory/characteristic/SecuritySystemState.js.map +1 -0
- package/dist/accessory/characteristic/SwingMode.js +22 -0
- package/dist/accessory/characteristic/SwingMode.js.map +1 -0
- package/dist/accessory/characteristic/TemperatureDisplayUnits.js +26 -0
- package/dist/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/core/TuyaOpenAPI.js +314 -0
- package/dist/core/TuyaOpenAPI.js.map +1 -0
- package/dist/core/TuyaOpenMQ.js +182 -0
- package/dist/core/TuyaOpenMQ.js.map +1 -0
- package/dist/device/TuyaCustomDeviceManager.js +65 -0
- package/dist/device/TuyaCustomDeviceManager.js.map +1 -0
- package/dist/device/TuyaDevice.js +37 -0
- package/dist/device/TuyaDevice.js.map +1 -0
- package/dist/device/TuyaDeviceManager.js +447 -0
- package/dist/device/TuyaDeviceManager.js.map +1 -0
- package/dist/device/TuyaHomeDeviceManager.js +64 -0
- package/dist/device/TuyaHomeDeviceManager.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.js +466 -0
- package/dist/platform.js.map +1 -0
- package/dist/settings.js +18 -0
- package/dist/settings.js.map +1 -0
- package/dist/util/FfmpegStreamingProcess.js +126 -0
- package/dist/util/FfmpegStreamingProcess.js.map +1 -0
- package/dist/util/InfraredTool.js +396 -0
- package/dist/util/InfraredTool.js.map +1 -0
- package/dist/util/Logger.js +42 -0
- package/dist/util/Logger.js.map +1 -0
- package/dist/util/TuyaRecordingDelegate.js +22 -0
- package/dist/util/TuyaRecordingDelegate.js.map +1 -0
- package/dist/util/TuyaStreamDelegate.js +330 -0
- package/dist/util/TuyaStreamDelegate.js.map +1 -0
- package/dist/util/color.js +24 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/util.js +48 -0
- package/dist/util/util.js.map +1 -0
- package/jest.config.js +5 -0
- package/package.json +74 -0
- package/test/custom.test.ts +101 -0
- package/test/home.test.ts +81 -0
- package/test/util.ts +39 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureRotationSpeedOn = exports.configureRotationSpeedLevel = exports.configureRotationSpeed = void 0;
|
|
4
|
+
const util_1 = require("../../util/util");
|
|
5
|
+
function configureRotationSpeed(accessory, service, schema) {
|
|
6
|
+
if (!schema) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const property = schema.property;
|
|
10
|
+
const multiple = Math.pow(10, property.scale);
|
|
11
|
+
const props = {
|
|
12
|
+
minValue: property.min / multiple,
|
|
13
|
+
maxValue: property.max / multiple,
|
|
14
|
+
minStep: Math.max(1, property.step / multiple),
|
|
15
|
+
};
|
|
16
|
+
service.getCharacteristic(accessory.Characteristic.RotationSpeed)
|
|
17
|
+
.onGet(() => {
|
|
18
|
+
const status = accessory.getStatus(schema.code);
|
|
19
|
+
const value = status.value / multiple;
|
|
20
|
+
return (0, util_1.limit)(value, props.minValue, props.maxValue);
|
|
21
|
+
})
|
|
22
|
+
.onSet(async (value) => {
|
|
23
|
+
const speed = value * multiple;
|
|
24
|
+
await accessory.sendCommands([{ code: schema.code, value: speed }], true);
|
|
25
|
+
})
|
|
26
|
+
.setProps(props);
|
|
27
|
+
}
|
|
28
|
+
exports.configureRotationSpeed = configureRotationSpeed;
|
|
29
|
+
function configureRotationSpeedLevel(accessory, service, schema, ignoreValues) {
|
|
30
|
+
if (!schema) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const property = schema.property;
|
|
34
|
+
const range = [];
|
|
35
|
+
for (const value of property.range) {
|
|
36
|
+
if (ignoreValues === null || ignoreValues === void 0 ? void 0 : ignoreValues.includes(value)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
range.push(value);
|
|
40
|
+
}
|
|
41
|
+
const props = { minValue: 0, maxValue: range.length, minStep: 1, unit: 'speed' };
|
|
42
|
+
accessory.log.debug('Set props for RotationSpeed:', props);
|
|
43
|
+
const onGetHandler = () => {
|
|
44
|
+
const status = accessory.getStatus(schema.code);
|
|
45
|
+
const index = range.indexOf(status.value);
|
|
46
|
+
return (0, util_1.limit)(index + 1, props.minValue, props.maxValue);
|
|
47
|
+
};
|
|
48
|
+
service.getCharacteristic(accessory.Characteristic.RotationSpeed)
|
|
49
|
+
.onGet(onGetHandler)
|
|
50
|
+
.onSet(async (value) => {
|
|
51
|
+
accessory.log.debug('Set RotationSpeed to:', value);
|
|
52
|
+
const index = Math.round(value - 1);
|
|
53
|
+
if (index < 0 || index >= range.length) {
|
|
54
|
+
accessory.log.debug('Out of range, return.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const speedLevel = range[index].toString();
|
|
58
|
+
accessory.log.debug('Set RotationSpeedLevel to:', speedLevel);
|
|
59
|
+
await accessory.sendCommands([{ code: schema.code, value: speedLevel }], true);
|
|
60
|
+
})
|
|
61
|
+
.updateValue(onGetHandler()) // ensure the value is correct before set props
|
|
62
|
+
.setProps(props);
|
|
63
|
+
}
|
|
64
|
+
exports.configureRotationSpeedLevel = configureRotationSpeedLevel;
|
|
65
|
+
function configureRotationSpeedOn(accessory, service, schema) {
|
|
66
|
+
if (!schema) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const props = { minValue: 0, maxValue: 100, minStep: 100 };
|
|
70
|
+
accessory.log.debug('Set props for RotationSpeed:', props);
|
|
71
|
+
service.getCharacteristic(accessory.Characteristic.RotationSpeed)
|
|
72
|
+
.onGet(() => {
|
|
73
|
+
const status = accessory.getStatus(schema.code);
|
|
74
|
+
return status.value ? 100 : 0;
|
|
75
|
+
})
|
|
76
|
+
.setProps(props);
|
|
77
|
+
}
|
|
78
|
+
exports.configureRotationSpeedOn = configureRotationSpeedOn;
|
|
79
|
+
//# sourceMappingURL=RotationSpeed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RotationSpeed.js","sourceRoot":"","sources":["../../../src/accessory/characteristic/RotationSpeed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureSecuritySystemTargetState = exports.configureSecuritySystemCurrentState = void 0;
|
|
4
|
+
const TUYA_CODES = {
|
|
5
|
+
MASTER_MODE: {
|
|
6
|
+
ARMED: 'arm',
|
|
7
|
+
DISARMED: 'disarmed',
|
|
8
|
+
HOME: 'home',
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
function getTuyaHomebridgeMap(accessory) {
|
|
12
|
+
const tuyaHomebridgeMap = new Map();
|
|
13
|
+
tuyaHomebridgeMap.set(TUYA_CODES.MASTER_MODE.ARMED, accessory.Characteristic.SecuritySystemCurrentState.AWAY_ARM);
|
|
14
|
+
tuyaHomebridgeMap.set(TUYA_CODES.MASTER_MODE.DISARMED, accessory.Characteristic.SecuritySystemCurrentState.DISARMED);
|
|
15
|
+
tuyaHomebridgeMap.set(TUYA_CODES.MASTER_MODE.HOME, accessory.Characteristic.SecuritySystemCurrentState.STAY_ARM);
|
|
16
|
+
tuyaHomebridgeMap.set(accessory.Characteristic.SecuritySystemCurrentState.AWAY_ARM, TUYA_CODES.MASTER_MODE.ARMED);
|
|
17
|
+
tuyaHomebridgeMap.set(accessory.Characteristic.SecuritySystemCurrentState.DISARMED, TUYA_CODES.MASTER_MODE.DISARMED);
|
|
18
|
+
tuyaHomebridgeMap.set(accessory.Characteristic.SecuritySystemCurrentState.STAY_ARM, TUYA_CODES.MASTER_MODE.HOME);
|
|
19
|
+
tuyaHomebridgeMap.set(accessory.Characteristic.SecuritySystemCurrentState.NIGHT_ARM, TUYA_CODES.MASTER_MODE.HOME);
|
|
20
|
+
return tuyaHomebridgeMap;
|
|
21
|
+
}
|
|
22
|
+
function configureSecuritySystemCurrentState(accessory, service, masterModeSchema, sosStateSchema) {
|
|
23
|
+
if (!masterModeSchema || !sosStateSchema) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const tuyaHomebridgeMap = getTuyaHomebridgeMap(accessory);
|
|
27
|
+
service.getCharacteristic(accessory.Characteristic.SecuritySystemCurrentState)
|
|
28
|
+
.onGet(() => {
|
|
29
|
+
const alarmTriggered = accessory.getStatus(sosStateSchema.code).value;
|
|
30
|
+
if (alarmTriggered) {
|
|
31
|
+
return accessory.Characteristic.SecuritySystemCurrentState.ALARM_TRIGGERED;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const currentState = accessory.getStatus(masterModeSchema.code).value;
|
|
35
|
+
if (currentState === TUYA_CODES.MASTER_MODE.HOME) {
|
|
36
|
+
return accessory.isNightArm ? accessory.Characteristic.SecuritySystemCurrentState.NIGHT_ARM :
|
|
37
|
+
accessory.Characteristic.SecuritySystemCurrentState.STAY_ARM;
|
|
38
|
+
}
|
|
39
|
+
return tuyaHomebridgeMap.get(currentState);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
exports.configureSecuritySystemCurrentState = configureSecuritySystemCurrentState;
|
|
44
|
+
function configureSecuritySystemTargetState(accessory, service, masterModeSchema, sosStateSchema) {
|
|
45
|
+
if (!masterModeSchema || !sosStateSchema) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const tuyaHomebridgeMap = getTuyaHomebridgeMap(accessory);
|
|
49
|
+
service.getCharacteristic(accessory.Characteristic.SecuritySystemTargetState)
|
|
50
|
+
.onGet(() => {
|
|
51
|
+
const currentState = accessory.getStatus(masterModeSchema.code).value;
|
|
52
|
+
if (currentState === TUYA_CODES.MASTER_MODE.HOME) {
|
|
53
|
+
return accessory.isNightArm ? accessory.Characteristic.SecuritySystemCurrentState.NIGHT_ARM :
|
|
54
|
+
accessory.Characteristic.SecuritySystemCurrentState.STAY_ARM;
|
|
55
|
+
}
|
|
56
|
+
return tuyaHomebridgeMap.get(currentState);
|
|
57
|
+
})
|
|
58
|
+
.onSet(async (value) => {
|
|
59
|
+
var _a;
|
|
60
|
+
const sosState = (_a = accessory.getStatus(sosStateSchema.code)) === null || _a === void 0 ? void 0 : _a.value;
|
|
61
|
+
// If we received a request to disarm the alarm, we make sure sos_state is set to false
|
|
62
|
+
if (sosState && value === accessory.Characteristic.SecuritySystemTargetState.DISARM) {
|
|
63
|
+
await accessory.sendCommands([{
|
|
64
|
+
code: sosStateSchema.code,
|
|
65
|
+
value: false,
|
|
66
|
+
}], true);
|
|
67
|
+
}
|
|
68
|
+
accessory.isNightArm = value === accessory.Characteristic.SecuritySystemTargetState.NIGHT_ARM;
|
|
69
|
+
await accessory.sendCommands([{
|
|
70
|
+
code: masterModeSchema.code,
|
|
71
|
+
value: tuyaHomebridgeMap.get(value),
|
|
72
|
+
}], true);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
exports.configureSecuritySystemTargetState = configureSecuritySystemTargetState;
|
|
76
|
+
//# sourceMappingURL=SecuritySystemState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecuritySystemState.js","sourceRoot":"","sources":["../../../src/accessory/characteristic/SecuritySystemState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureSwingMode = void 0;
|
|
4
|
+
function configureSwingMode(accessory, service, schema) {
|
|
5
|
+
if (!schema) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const { SWING_DISABLED, SWING_ENABLED } = accessory.Characteristic.SwingMode;
|
|
9
|
+
service.getCharacteristic(accessory.Characteristic.SwingMode)
|
|
10
|
+
.onGet(() => {
|
|
11
|
+
const status = accessory.getStatus(schema.code);
|
|
12
|
+
return status.value ? SWING_ENABLED : SWING_DISABLED;
|
|
13
|
+
})
|
|
14
|
+
.onSet(async (value) => {
|
|
15
|
+
await accessory.sendCommands([{
|
|
16
|
+
code: schema.code,
|
|
17
|
+
value: (value === SWING_ENABLED) ? true : false,
|
|
18
|
+
}], true);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
exports.configureSwingMode = configureSwingMode;
|
|
22
|
+
//# sourceMappingURL=SwingMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SwingMode.js","sourceRoot":"","sources":["../../../src/accessory/characteristic/SwingMode.ts"],"names":[],"mappings":";;;AAIA,SAAgB,kBAAkB,CAAC,SAAwB,EAAE,OAAgB,EAAE,MAAyB;IACtG,IAAI,CAAC,MAAM,EAAE;QACX,OAAO;KACR;IAED,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC;IAC7E,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC;SAC1D,KAAK,CAAC,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC;QACjD,OAAQ,MAAM,CAAC,KAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC;IACpE,CAAC,CAAC;SACD,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;aAChD,CAAC,EAAE,IAAI,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AACP,CAAC;AAjBD,gDAiBC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureTempDisplayUnits = void 0;
|
|
4
|
+
function configureTempDisplayUnits(accessory, service, schema) {
|
|
5
|
+
if (!schema) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const { CELSIUS, FAHRENHEIT } = accessory.Characteristic.TemperatureDisplayUnits;
|
|
9
|
+
service.getCharacteristic(accessory.Characteristic.TemperatureDisplayUnits)
|
|
10
|
+
.onGet(() => {
|
|
11
|
+
const status = accessory.getStatus(schema.code);
|
|
12
|
+
return (status.value.toLowerCase() === 'c') ? CELSIUS : FAHRENHEIT;
|
|
13
|
+
})
|
|
14
|
+
.onSet(async (value) => {
|
|
15
|
+
const status = accessory.getStatus(schema.code);
|
|
16
|
+
const isLowerCase = status.value.toLowerCase() === status.value;
|
|
17
|
+
let unit = (value === CELSIUS) ? 'c' : 'f';
|
|
18
|
+
unit = isLowerCase ? unit.toLowerCase() : unit.toUpperCase();
|
|
19
|
+
await accessory.sendCommands([{
|
|
20
|
+
code: schema.code,
|
|
21
|
+
value: unit,
|
|
22
|
+
}]);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
exports.configureTempDisplayUnits = configureTempDisplayUnits;
|
|
26
|
+
//# sourceMappingURL=TemperatureDisplayUnits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemperatureDisplayUnits.js","sourceRoot":"","sources":["../../../src/accessory/characteristic/TemperatureDisplayUnits.ts"],"names":[],"mappings":";;;AAIA,SAAgB,yBAAyB,CAAC,SAAwB,EAAE,OAAgB,EAAE,MAAyB;IAC7G,IAAI,CAAC,MAAM,EAAE;QACX,OAAO;KACR;IAED,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,uBAAuB,CAAC;IACjF,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,cAAc,CAAC,uBAAuB,CAAC;SACxE,KAAK,CAAC,GAAG,EAAE;QACV,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC;QACjD,OAAO,CAAE,MAAM,CAAC,KAAgB,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IACjF,CAAC,CAAC;SACD,KAAK,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;QACnB,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC;QACjD,MAAM,WAAW,GAAI,MAAM,CAAC,KAAgB,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC;QAE5E,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3C,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AAtBD,8DAsBC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.homeOptionsSchema = exports.customOptionsSchema = void 0;
|
|
4
|
+
exports.customOptionsSchema = {
|
|
5
|
+
properties: {
|
|
6
|
+
endpoint: { type: 'string', format: 'url', required: true },
|
|
7
|
+
accessId: { type: 'string', required: true },
|
|
8
|
+
accessKey: { type: 'string', required: true },
|
|
9
|
+
deviceOverrides: { 'type': 'array' },
|
|
10
|
+
debug: { type: 'boolean' },
|
|
11
|
+
debugLevel: { 'type': 'string' },
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
exports.homeOptionsSchema = {
|
|
15
|
+
properties: {
|
|
16
|
+
accessId: { type: 'string', required: true },
|
|
17
|
+
accessKey: { type: 'string', required: true },
|
|
18
|
+
endpoint: { type: 'string', format: 'url' },
|
|
19
|
+
countryCode: { 'type': 'integer', 'minimum': 1, required: true },
|
|
20
|
+
username: { type: 'string', required: true },
|
|
21
|
+
password: { type: 'string', required: true },
|
|
22
|
+
appSchema: { 'type': 'string', required: true },
|
|
23
|
+
homeWhitelist: { 'type': 'array' },
|
|
24
|
+
deviceOverrides: { 'type': 'array' },
|
|
25
|
+
debug: { type: 'boolean' },
|
|
26
|
+
debugLevel: { 'type': 'string' },
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAqEa,QAAA,mBAAmB,GAAG;IACjC,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QACpC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;KACjC;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAG;IAC/B,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAC3C,WAAW,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;QAChE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC/C,aAAa,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAClC,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QACpC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;KACjC;CACF,CAAC"}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LOGIN_ERROR_MESSAGES = void 0;
|
|
7
|
+
/* eslint-disable max-len */
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-empty-function */
|
|
9
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
10
|
+
const https_1 = __importDefault(require("https"));
|
|
11
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
12
|
+
const uuid_1 = require("uuid");
|
|
13
|
+
const async_await_retry_1 = __importDefault(require("async-await-retry"));
|
|
14
|
+
// eslint-disable-next-line
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
const package_json_1 = require("../../package.json");
|
|
17
|
+
const Logger_1 = require("../util/Logger");
|
|
18
|
+
var Endpoints;
|
|
19
|
+
(function (Endpoints) {
|
|
20
|
+
Endpoints["AMERICA"] = "https://openapi.tuyaus.com";
|
|
21
|
+
Endpoints["AMERICA_EAST"] = "https://openapi-ueaz.tuyaus.com";
|
|
22
|
+
Endpoints["CHINA"] = "https://openapi.tuyacn.com";
|
|
23
|
+
Endpoints["EUROPE"] = "https://openapi.tuyaeu.com";
|
|
24
|
+
Endpoints["EUROPE_WEST"] = "https://openapi-weaz.tuyaeu.com";
|
|
25
|
+
Endpoints["INDIA"] = "https://openapi.tuyain.com";
|
|
26
|
+
})(Endpoints || (Endpoints = {}));
|
|
27
|
+
const DEFAULT_ENDPOINTS = {
|
|
28
|
+
[Endpoints.AMERICA.toString()]: [1, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64, 66, 81, 82, 84, 95, 239, 245, 246, 500, 502, 591, 593, 594, 595, 597, 598, 670, 672, 674, 675, 677, 678, 682, 683, 686, 690, 852, 853, 886, 970, 1721, 1787, 1809, 1829, 1849, 4779, 5999, 35818],
|
|
29
|
+
[Endpoints.CHINA.toString()]: [86],
|
|
30
|
+
[Endpoints.EUROPE.toString()]: [7, 20, 27, 30, 31, 32, 33, 34, 36, 39, 40, 41, 43, 44, 45, 46, 47, 48, 49, 61, 65, 90, 92, 93, 94, 212, 213, 216, 218, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 240, 241, 242, 243, 244, 248, 250, 251, 252, 253, 254, 255, 256, 257, 258, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 291, 297, 298, 299, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 385, 386, 387, 389, 420, 421, 423, 501, 503, 504, 505, 506, 507, 508, 509, 590, 592, 596, 673, 676, 679, 680, 681, 685, 687, 688, 689, 691, 692, 855, 856, 880, 960, 961, 962, 964, 965, 966, 967, 968, 971, 972, 973, 974, 975, 976, 977, 992, 993, 994, 995, 996, 998, 1242, 1246, 1264, 1268, 1284, 1340, 1345, 1441, 1473, 1649, 1664, 1670, 1671, 1684, 1758, 1767, 1784, 1868, 1869, 1876],
|
|
31
|
+
[Endpoints.INDIA.toString()]: [91],
|
|
32
|
+
};
|
|
33
|
+
exports.LOGIN_ERROR_MESSAGES = {
|
|
34
|
+
1004: 'Please make sure your endpoint, accessId, accessKey is right.',
|
|
35
|
+
1106: 'Please make sure your countryCode, username, password, appSchema is correct, and app account is linked with cloud project.',
|
|
36
|
+
1114: 'Please make sure your endpoint, accessId, accessKey is right.',
|
|
37
|
+
2401: 'Username or password is wrong.',
|
|
38
|
+
2406: 'Please make sure you selected the right data center where your app account located, and the app account is linked with cloud project.',
|
|
39
|
+
};
|
|
40
|
+
const API_NOT_SUBSCRIBED_ERROR = `
|
|
41
|
+
API not subscribed. Please go to "Tuya IoT Platform -> Cloud -> Development -> Project -> Service API",
|
|
42
|
+
and Authorize the following APIs before using:
|
|
43
|
+
- Authorization Token Management
|
|
44
|
+
- Device Status Notification
|
|
45
|
+
- IoT Core
|
|
46
|
+
- Industry Project Client Service (for "Custom" project)
|
|
47
|
+
`;
|
|
48
|
+
const API_ERROR_MESSAGES = {
|
|
49
|
+
1010: 'Token expired. Tuya Cloud don\'t support running multiple HomeBridge/HomeAssistant instance with same tuya account.',
|
|
50
|
+
28841002: 'API subscription expired. Please renew the API subscription at Tuya IoT Platform.',
|
|
51
|
+
28841101: API_NOT_SUBSCRIBED_ERROR,
|
|
52
|
+
28841105: API_NOT_SUBSCRIBED_ERROR,
|
|
53
|
+
};
|
|
54
|
+
class TuyaOpenAPI {
|
|
55
|
+
constructor(endpoint, accessId, accessKey, log = console, lang = 'en', debug = false) {
|
|
56
|
+
this.endpoint = endpoint;
|
|
57
|
+
this.accessId = accessId;
|
|
58
|
+
this.accessKey = accessKey;
|
|
59
|
+
this.log = log;
|
|
60
|
+
this.lang = lang;
|
|
61
|
+
this.debug = debug;
|
|
62
|
+
this.assetIDArr = [];
|
|
63
|
+
this.deviceArr = [];
|
|
64
|
+
this.tokenInfo = { access_token: '', refresh_token: '', uid: '', expire: 0 };
|
|
65
|
+
this.log = new Logger_1.PrefixLogger(log, TuyaOpenAPI.name, debug);
|
|
66
|
+
}
|
|
67
|
+
static getDefaultEndpoint(countryCode) {
|
|
68
|
+
for (const endpoint of Object.keys(DEFAULT_ENDPOINTS)) {
|
|
69
|
+
const countryCodeList = DEFAULT_ENDPOINTS[endpoint];
|
|
70
|
+
if (countryCodeList.includes(countryCode)) {
|
|
71
|
+
return endpoint;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return Endpoints.AMERICA;
|
|
75
|
+
}
|
|
76
|
+
isLogin() {
|
|
77
|
+
return this.tokenInfo.access_token.length > 0;
|
|
78
|
+
}
|
|
79
|
+
isTokenExpired() {
|
|
80
|
+
return (this.tokenInfo.expire - 60 * 1000 <= new Date().getTime());
|
|
81
|
+
}
|
|
82
|
+
isTokenManagementAPI(path) {
|
|
83
|
+
if (path.startsWith('/v1.0/token')) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
async _refreshAccessTokenIfNeed(path) {
|
|
89
|
+
if (!this.isLogin()) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!this.isTokenExpired()) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (this.isTokenManagementAPI(path)) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.log.debug('Refreshing access_token');
|
|
99
|
+
const res = await this.get(`/v1.0/token/${this.tokenInfo.refresh_token}`);
|
|
100
|
+
if (res.success === false) {
|
|
101
|
+
this.log.error('Refresh access_token failed. code = %s, msg = %s', res.code, res.msg);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const { access_token, refresh_token, uid, expire_time } = res.result;
|
|
105
|
+
this.tokenInfo = {
|
|
106
|
+
access_token: access_token,
|
|
107
|
+
refresh_token: refresh_token,
|
|
108
|
+
uid: uid,
|
|
109
|
+
expire: expire_time * 1000 + new Date().getTime(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* In 'Custom' project, get a token directly. (Login with admin)
|
|
114
|
+
* Have permission on asset management, user management.
|
|
115
|
+
* But lost some permission on device management.
|
|
116
|
+
* @returns
|
|
117
|
+
*/
|
|
118
|
+
async getToken() {
|
|
119
|
+
const res = await this.get('/v1.0/token', { grant_type: 1 });
|
|
120
|
+
if (res.success) {
|
|
121
|
+
const { access_token, refresh_token, uid, expire_time } = res.result;
|
|
122
|
+
this.tokenInfo = {
|
|
123
|
+
access_token: access_token,
|
|
124
|
+
refresh_token: refresh_token,
|
|
125
|
+
uid: uid,
|
|
126
|
+
expire: expire_time * 1000 + new Date().getTime(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return res;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* In 'Smart Home' project, login with App's user.
|
|
133
|
+
* @param countryCode 2-digit Country Code
|
|
134
|
+
* @param username Username
|
|
135
|
+
* @param password Password
|
|
136
|
+
* @param appSchema App Schema: 'tuyaSmart', 'smartlife'
|
|
137
|
+
* @returns
|
|
138
|
+
*/
|
|
139
|
+
async homeLogin(countryCode, username, password, appSchema) {
|
|
140
|
+
if (this._isSaltedPassword(password)) {
|
|
141
|
+
this.log.info('Login with md5 salted password.');
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
password = crypto_1.default.createHash('md5').update(password).digest('hex');
|
|
145
|
+
}
|
|
146
|
+
this.log.info('Login to: %s', this.endpoint);
|
|
147
|
+
this.tokenInfo = { access_token: '', refresh_token: '', uid: '', expire: 0 };
|
|
148
|
+
const res = await this.post('/v1.0/iot-01/associated-users/actions/authorized-login', {
|
|
149
|
+
country_code: countryCode,
|
|
150
|
+
username: username,
|
|
151
|
+
password: password,
|
|
152
|
+
schema: appSchema,
|
|
153
|
+
});
|
|
154
|
+
if (res.success) {
|
|
155
|
+
const { access_token, refresh_token, uid, expire_time, platform_url } = res.result;
|
|
156
|
+
this.endpoint = platform_url || this.endpoint;
|
|
157
|
+
this.tokenInfo = {
|
|
158
|
+
access_token: access_token,
|
|
159
|
+
refresh_token: refresh_token,
|
|
160
|
+
uid: uid,
|
|
161
|
+
expire: expire_time * 1000 + new Date().getTime(),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
return res;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* In 'Custom' project, Search user by username.
|
|
168
|
+
* @param username Username
|
|
169
|
+
* @returns
|
|
170
|
+
*/
|
|
171
|
+
async customGetUserInfo(username) {
|
|
172
|
+
const res = await this.get(`/v1.2/iot-02/users/${username}`);
|
|
173
|
+
return res;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* In 'Custom' project, create a user.
|
|
177
|
+
* @param username Username
|
|
178
|
+
* @param password Password
|
|
179
|
+
* @param country_code Country Code (Useless)
|
|
180
|
+
* @returns
|
|
181
|
+
*/
|
|
182
|
+
async customCreateUser(username, password, country_code = 1) {
|
|
183
|
+
const res = await this.post('/v1.0/iot-02/users', {
|
|
184
|
+
username,
|
|
185
|
+
password: crypto_1.default.createHash('sha256').update(password).digest('hex'),
|
|
186
|
+
country_code,
|
|
187
|
+
});
|
|
188
|
+
return res;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* In 'Custom' project, login with user.
|
|
192
|
+
* @param username Username
|
|
193
|
+
* @param password Password
|
|
194
|
+
* @returns
|
|
195
|
+
*/
|
|
196
|
+
async customLogin(username, password) {
|
|
197
|
+
this.tokenInfo = { access_token: '', refresh_token: '', uid: '', expire: 0 };
|
|
198
|
+
const res = await this.post('/v1.0/iot-03/users/login', {
|
|
199
|
+
username: username,
|
|
200
|
+
password: crypto_1.default.createHash('sha256').update(password).digest('hex'),
|
|
201
|
+
});
|
|
202
|
+
if (res.success) {
|
|
203
|
+
const { access_token, refresh_token, uid, expire } = res.result;
|
|
204
|
+
this.tokenInfo = {
|
|
205
|
+
access_token: access_token,
|
|
206
|
+
refresh_token: refresh_token,
|
|
207
|
+
uid: uid,
|
|
208
|
+
expire: expire * 1000 + new Date().getTime(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return res;
|
|
212
|
+
}
|
|
213
|
+
async request(method, path, params, body) {
|
|
214
|
+
await this._refreshAccessTokenIfNeed(path);
|
|
215
|
+
const now = new Date().getTime();
|
|
216
|
+
const nonce = (0, uuid_1.v4)();
|
|
217
|
+
const accessToken = this.tokenInfo.access_token || '';
|
|
218
|
+
const stringToSign = this._getStringToSign(method, path, params, body);
|
|
219
|
+
const headers = {
|
|
220
|
+
't': `${now}`,
|
|
221
|
+
'client_id': this.accessId,
|
|
222
|
+
'nonce': nonce,
|
|
223
|
+
'Signature-Headers': 'client_id',
|
|
224
|
+
'sign': this._getSign(this.accessId, this.accessKey, this.isTokenManagementAPI(path) ? '' : this.tokenInfo.access_token, now, nonce, stringToSign),
|
|
225
|
+
'sign_method': 'HMAC-SHA256',
|
|
226
|
+
'access_token': accessToken,
|
|
227
|
+
'lang': this.lang,
|
|
228
|
+
'dev_lang': 'javascript',
|
|
229
|
+
'dev_channel': 'homebridge',
|
|
230
|
+
'devVersion': package_json_1.version,
|
|
231
|
+
};
|
|
232
|
+
this.log.debug('Request:\nmethod = %s\nendpoint = %s\npath = %s\nquery = %s\nheaders = %s\nbody = %s', method, this.endpoint, path, JSON.stringify(params, null, 2), JSON.stringify(headers, null, 2), JSON.stringify(body, null, 2));
|
|
233
|
+
if (params) {
|
|
234
|
+
path += '?' + new URLSearchParams(params).toString();
|
|
235
|
+
}
|
|
236
|
+
const res = await (0, async_await_retry_1.default)(async () => new Promise((resolve, reject) => {
|
|
237
|
+
const req = https_1.default.request({
|
|
238
|
+
host: new URL(this.endpoint).host,
|
|
239
|
+
method,
|
|
240
|
+
headers,
|
|
241
|
+
path,
|
|
242
|
+
}, res => {
|
|
243
|
+
if (res.statusCode !== 200) {
|
|
244
|
+
this.log.warn('Status: %d %s', res.statusCode, res.statusMessage);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
res.setEncoding('utf8');
|
|
248
|
+
let rawData = '';
|
|
249
|
+
res.on('data', (chunk) => {
|
|
250
|
+
rawData += chunk;
|
|
251
|
+
});
|
|
252
|
+
res.on('end', () => {
|
|
253
|
+
resolve(JSON.parse(rawData));
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
if (body) {
|
|
257
|
+
req.write(JSON.stringify(body));
|
|
258
|
+
}
|
|
259
|
+
req.on('error', e => {
|
|
260
|
+
this.log.error('Network error: %s. Retrying...', e.message);
|
|
261
|
+
reject(e);
|
|
262
|
+
});
|
|
263
|
+
req.end();
|
|
264
|
+
}), undefined, { retriesMax: 10, interval: 100, exponential: true, factor: 2, jitter: 100 });
|
|
265
|
+
this.log.debug('Response:\npath = %s\ndata = %s', path, JSON.stringify(res, null, 2));
|
|
266
|
+
if (res && res.success !== true && API_ERROR_MESSAGES[res.code]) {
|
|
267
|
+
this.log.error(API_ERROR_MESSAGES[res.code]);
|
|
268
|
+
}
|
|
269
|
+
return res;
|
|
270
|
+
}
|
|
271
|
+
async get(path, params) {
|
|
272
|
+
return this.request('get', path, params, null);
|
|
273
|
+
}
|
|
274
|
+
async post(path, params) {
|
|
275
|
+
return this.request('post', path, null, params);
|
|
276
|
+
}
|
|
277
|
+
async delete(path, params) {
|
|
278
|
+
return this.request('delete', path, params, null);
|
|
279
|
+
}
|
|
280
|
+
_getSign(accessId, accessKey, accessToken = '', timestamp = 0, nonce, stringToSign) {
|
|
281
|
+
const message = [accessId, accessToken, timestamp, nonce, stringToSign].join('');
|
|
282
|
+
const sign = crypto_1.default.createHmac('SHA256', accessKey).update(message).digest('hex').toUpperCase();
|
|
283
|
+
return sign;
|
|
284
|
+
}
|
|
285
|
+
_getStringToSign(method, path, params, body) {
|
|
286
|
+
const httpMethod = method.toUpperCase();
|
|
287
|
+
const bodyStream = body ? JSON.stringify(body) : '';
|
|
288
|
+
const contentSHA256 = crypto_1.default.createHash('sha256').update(bodyStream).digest('hex');
|
|
289
|
+
const headers = `client_id:${this.accessId}\n`;
|
|
290
|
+
const url = this._getSignUrl(path, params);
|
|
291
|
+
const result = [httpMethod, contentSHA256, headers, url].join('\n');
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
_getSignUrl(path, params) {
|
|
295
|
+
if (!params) {
|
|
296
|
+
return path;
|
|
297
|
+
}
|
|
298
|
+
const sortedKeys = Object.keys(params).sort();
|
|
299
|
+
const kv = [];
|
|
300
|
+
for (const key of sortedKeys) {
|
|
301
|
+
if (params[key] !== null && params[key] !== undefined) {
|
|
302
|
+
kv.push(`${key}=${params[key]}`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const url = `${path}?${kv.join('&')}`;
|
|
306
|
+
return url;
|
|
307
|
+
}
|
|
308
|
+
_isSaltedPassword(password) {
|
|
309
|
+
return Buffer.from(password, 'hex').length === 16;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
exports.default = TuyaOpenAPI;
|
|
313
|
+
TuyaOpenAPI.Endpoints = Endpoints;
|
|
314
|
+
//# sourceMappingURL=TuyaOpenAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TuyaOpenAPI.js","sourceRoot":"","sources":["../../src/core/TuyaOpenAPI.ts"],"names":[],"mappings":";;;;;;AAAA,4BAA4B;AAC5B,yDAAyD;AACzD,sDAAsD;AACtD,kDAA0B;AAC1B,oDAA4B;AAC5B,+BAAoC;AACpC,0EAAsC;AAEtC,2BAA2B;AAC3B,aAAa;AACb,qDAA6C;AAE7C,2CAAsD;AAEtD,IAAK,SAOJ;AAPD,WAAK,SAAS;IACZ,mDAAsC,CAAA;IACtC,6DAAgD,CAAA;IAChD,iDAAoC,CAAA;IACpC,kDAAqC,CAAA;IACrC,4DAA+C,CAAA;IAC/C,iDAAoC,CAAA;AACtC,CAAC,EAPI,SAAS,KAAT,SAAS,QAOb;AAED,MAAM,iBAAiB,GAAG;IACxB,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;IACjR,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAClC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,G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"}
|