@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.
Files changed (191) hide show
  1. package/.idea/copilot.data.migration.agent.xml +6 -0
  2. package/.idea/copilot.data.migration.ask.xml +6 -0
  3. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  4. package/.idea/copilot.data.migration.edit.xml +6 -0
  5. package/.idea/dictionaries/benpotter.xml +3 -0
  6. package/.idea/homebridge-tuya.iml +8 -0
  7. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  8. package/.idea/modules.xml +8 -0
  9. package/.idea/vcs.xml +6 -0
  10. package/.idea/workspace.xml +64 -0
  11. package/ADVANCED_OPTIONS.md +267 -0
  12. package/CHANGELOG.md +127 -0
  13. package/LICENSE +20 -0
  14. package/README.md +206 -0
  15. package/SUPPORTED_DEVICES.md +206 -0
  16. package/config.schema.json +550 -0
  17. package/dist/accessory/AccessoryFactory.js +274 -0
  18. package/dist/accessory/AccessoryFactory.js.map +1 -0
  19. package/dist/accessory/AirConditionerAccessory.js +307 -0
  20. package/dist/accessory/AirConditionerAccessory.js.map +1 -0
  21. package/dist/accessory/AirPurifierAccessory.js +90 -0
  22. package/dist/accessory/AirPurifierAccessory.js.map +1 -0
  23. package/dist/accessory/AirQualitySensorAccessory.js +30 -0
  24. package/dist/accessory/AirQualitySensorAccessory.js.map +1 -0
  25. package/dist/accessory/BaseAccessory.js +295 -0
  26. package/dist/accessory/BaseAccessory.js.map +1 -0
  27. package/dist/accessory/CameraAccessory.js +117 -0
  28. package/dist/accessory/CameraAccessory.js.map +1 -0
  29. package/dist/accessory/CarbonDioxideSensorAccessory.js +52 -0
  30. package/dist/accessory/CarbonDioxideSensorAccessory.js.map +1 -0
  31. package/dist/accessory/CarbonMonoxideSensorAccessory.js +52 -0
  32. package/dist/accessory/CarbonMonoxideSensorAccessory.js.map +1 -0
  33. package/dist/accessory/ContactSensorAccessory.js +30 -0
  34. package/dist/accessory/ContactSensorAccessory.js.map +1 -0
  35. package/dist/accessory/DehumidifierAccessory.js +68 -0
  36. package/dist/accessory/DehumidifierAccessory.js.map +1 -0
  37. package/dist/accessory/DiffuserAccessory.js +55 -0
  38. package/dist/accessory/DiffuserAccessory.js.map +1 -0
  39. package/dist/accessory/DimmerAccessory.js +94 -0
  40. package/dist/accessory/DimmerAccessory.js.map +1 -0
  41. package/dist/accessory/DoorbellAccessory.js +89 -0
  42. package/dist/accessory/DoorbellAccessory.js.map +1 -0
  43. package/dist/accessory/ExtractionHoodAccessory.js +118 -0
  44. package/dist/accessory/ExtractionHoodAccessory.js.map +1 -0
  45. package/dist/accessory/FanAccessory.js +123 -0
  46. package/dist/accessory/FanAccessory.js.map +1 -0
  47. package/dist/accessory/GarageDoorAccessory.js +69 -0
  48. package/dist/accessory/GarageDoorAccessory.js.map +1 -0
  49. package/dist/accessory/HeaterAccessory.js +96 -0
  50. package/dist/accessory/HeaterAccessory.js.map +1 -0
  51. package/dist/accessory/HumanPresenceSensorAccessory.js +20 -0
  52. package/dist/accessory/HumanPresenceSensorAccessory.js.map +1 -0
  53. package/dist/accessory/HumidifierAccessory.js +135 -0
  54. package/dist/accessory/HumidifierAccessory.js.map +1 -0
  55. package/dist/accessory/IRAirConditionerAccessory.js +285 -0
  56. package/dist/accessory/IRAirConditionerAccessory.js.map +1 -0
  57. package/dist/accessory/IRControlHubAccessory.js +49 -0
  58. package/dist/accessory/IRControlHubAccessory.js.map +1 -0
  59. package/dist/accessory/IRControlHubSubAccessory.js +53 -0
  60. package/dist/accessory/IRControlHubSubAccessory.js.map +1 -0
  61. package/dist/accessory/IRGenericAccessory.js +50 -0
  62. package/dist/accessory/IRGenericAccessory.js.map +1 -0
  63. package/dist/accessory/LeakSensorAccessory.js +36 -0
  64. package/dist/accessory/LeakSensorAccessory.js.map +1 -0
  65. package/dist/accessory/LightAccessory.js +36 -0
  66. package/dist/accessory/LightAccessory.js.map +1 -0
  67. package/dist/accessory/LightSensorAccessory.js +32 -0
  68. package/dist/accessory/LightSensorAccessory.js.map +1 -0
  69. package/dist/accessory/LocationWeatherAccessory.js +72 -0
  70. package/dist/accessory/LocationWeatherAccessory.js.map +1 -0
  71. package/dist/accessory/LockAccessory.js +56 -0
  72. package/dist/accessory/LockAccessory.js.map +1 -0
  73. package/dist/accessory/MotionSensorAccessory.js +20 -0
  74. package/dist/accessory/MotionSensorAccessory.js.map +1 -0
  75. package/dist/accessory/OutletAccessory.js +23 -0
  76. package/dist/accessory/OutletAccessory.js.map +1 -0
  77. package/dist/accessory/PetFeederAccessory.js +139 -0
  78. package/dist/accessory/PetFeederAccessory.js.map +1 -0
  79. package/dist/accessory/SceneAccessory.js +32 -0
  80. package/dist/accessory/SceneAccessory.js.map +1 -0
  81. package/dist/accessory/SceneSwitchAccessory.js +44 -0
  82. package/dist/accessory/SceneSwitchAccessory.js.map +1 -0
  83. package/dist/accessory/SecuritySystemAccessory.js +30 -0
  84. package/dist/accessory/SecuritySystemAccessory.js.map +1 -0
  85. package/dist/accessory/SmokeSensorAccessory.js +35 -0
  86. package/dist/accessory/SmokeSensorAccessory.js.map +1 -0
  87. package/dist/accessory/SwitchAccessory.js +86 -0
  88. package/dist/accessory/SwitchAccessory.js.map +1 -0
  89. package/dist/accessory/TemperatureHumiditySensorAccessory.js +24 -0
  90. package/dist/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
  91. package/dist/accessory/ThermostatAccessory.js +190 -0
  92. package/dist/accessory/ThermostatAccessory.js.map +1 -0
  93. package/dist/accessory/ValveAccessory.js +45 -0
  94. package/dist/accessory/ValveAccessory.js.map +1 -0
  95. package/dist/accessory/VibrationSensorAccessory.js +42 -0
  96. package/dist/accessory/VibrationSensorAccessory.js.map +1 -0
  97. package/dist/accessory/WeatherStationAccessory.js +59 -0
  98. package/dist/accessory/WeatherStationAccessory.js.map +1 -0
  99. package/dist/accessory/WetBulbGlobeTemperatureAccessory.js +23 -0
  100. package/dist/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
  101. package/dist/accessory/WhiteNoiseLightAccessory.js +59 -0
  102. package/dist/accessory/WhiteNoiseLightAccessory.js.map +1 -0
  103. package/dist/accessory/WindowAccessory.js +14 -0
  104. package/dist/accessory/WindowAccessory.js.map +1 -0
  105. package/dist/accessory/WindowCoveringAccessory.js +156 -0
  106. package/dist/accessory/WindowCoveringAccessory.js.map +1 -0
  107. package/dist/accessory/WirelessSwitchAccessory.js +42 -0
  108. package/dist/accessory/WirelessSwitchAccessory.js.map +1 -0
  109. package/dist/accessory/characteristic/Active.js +23 -0
  110. package/dist/accessory/characteristic/Active.js.map +1 -0
  111. package/dist/accessory/characteristic/AirQuality.js +75 -0
  112. package/dist/accessory/characteristic/AirQuality.js.map +1 -0
  113. package/dist/accessory/characteristic/CurrentRelativeHumidity.js +24 -0
  114. package/dist/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
  115. package/dist/accessory/characteristic/CurrentTemperature.js +24 -0
  116. package/dist/accessory/characteristic/CurrentTemperature.js.map +1 -0
  117. package/dist/accessory/characteristic/CurrentWeather.js +51 -0
  118. package/dist/accessory/characteristic/CurrentWeather.js.map +1 -0
  119. package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js +81 -0
  120. package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
  121. package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js +50 -0
  122. package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
  123. package/dist/accessory/characteristic/EnergyUsage.js +103 -0
  124. package/dist/accessory/characteristic/EnergyUsage.js.map +1 -0
  125. package/dist/accessory/characteristic/Light.js +269 -0
  126. package/dist/accessory/characteristic/Light.js.map +1 -0
  127. package/dist/accessory/characteristic/LightSensor.js +24 -0
  128. package/dist/accessory/characteristic/LightSensor.js.map +1 -0
  129. package/dist/accessory/characteristic/LockPhysicalControls.js +22 -0
  130. package/dist/accessory/characteristic/LockPhysicalControls.js.map +1 -0
  131. package/dist/accessory/characteristic/MotionDetected.js +23 -0
  132. package/dist/accessory/characteristic/MotionDetected.js.map +1 -0
  133. package/dist/accessory/characteristic/Name.js +12 -0
  134. package/dist/accessory/characteristic/Name.js.map +1 -0
  135. package/dist/accessory/characteristic/OccupancyDetected.js +20 -0
  136. package/dist/accessory/characteristic/OccupancyDetected.js.map +1 -0
  137. package/dist/accessory/characteristic/On.js +26 -0
  138. package/dist/accessory/characteristic/On.js.map +1 -0
  139. package/dist/accessory/characteristic/OutletInUse.js +15 -0
  140. package/dist/accessory/characteristic/OutletInUse.js.map +1 -0
  141. package/dist/accessory/characteristic/ProgrammableSwitchEvent.js +90 -0
  142. package/dist/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
  143. package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js +29 -0
  144. package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
  145. package/dist/accessory/characteristic/RotationSpeed.js +79 -0
  146. package/dist/accessory/characteristic/RotationSpeed.js.map +1 -0
  147. package/dist/accessory/characteristic/SecuritySystemState.js +76 -0
  148. package/dist/accessory/characteristic/SecuritySystemState.js.map +1 -0
  149. package/dist/accessory/characteristic/SwingMode.js +22 -0
  150. package/dist/accessory/characteristic/SwingMode.js.map +1 -0
  151. package/dist/accessory/characteristic/TemperatureDisplayUnits.js +26 -0
  152. package/dist/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
  153. package/dist/config.js +29 -0
  154. package/dist/config.js.map +1 -0
  155. package/dist/core/TuyaOpenAPI.js +314 -0
  156. package/dist/core/TuyaOpenAPI.js.map +1 -0
  157. package/dist/core/TuyaOpenMQ.js +182 -0
  158. package/dist/core/TuyaOpenMQ.js.map +1 -0
  159. package/dist/device/TuyaCustomDeviceManager.js +65 -0
  160. package/dist/device/TuyaCustomDeviceManager.js.map +1 -0
  161. package/dist/device/TuyaDevice.js +37 -0
  162. package/dist/device/TuyaDevice.js.map +1 -0
  163. package/dist/device/TuyaDeviceManager.js +447 -0
  164. package/dist/device/TuyaDeviceManager.js.map +1 -0
  165. package/dist/device/TuyaHomeDeviceManager.js +64 -0
  166. package/dist/device/TuyaHomeDeviceManager.js.map +1 -0
  167. package/dist/index.js +7 -0
  168. package/dist/index.js.map +1 -0
  169. package/dist/platform.js +466 -0
  170. package/dist/platform.js.map +1 -0
  171. package/dist/settings.js +18 -0
  172. package/dist/settings.js.map +1 -0
  173. package/dist/util/FfmpegStreamingProcess.js +126 -0
  174. package/dist/util/FfmpegStreamingProcess.js.map +1 -0
  175. package/dist/util/InfraredTool.js +396 -0
  176. package/dist/util/InfraredTool.js.map +1 -0
  177. package/dist/util/Logger.js +42 -0
  178. package/dist/util/Logger.js.map +1 -0
  179. package/dist/util/TuyaRecordingDelegate.js +22 -0
  180. package/dist/util/TuyaRecordingDelegate.js.map +1 -0
  181. package/dist/util/TuyaStreamDelegate.js +330 -0
  182. package/dist/util/TuyaStreamDelegate.js.map +1 -0
  183. package/dist/util/color.js +24 -0
  184. package/dist/util/color.js.map +1 -0
  185. package/dist/util/util.js +48 -0
  186. package/dist/util/util.js.map +1 -0
  187. package/jest.config.js +5 -0
  188. package/package.json +74 -0
  189. package/test/custom.test.ts +101 -0
  190. package/test/home.test.ts +81 -0
  191. 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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"}