@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,466 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.TuyaPlatform = void 0;
30
+ const jsonschema_1 = require("jsonschema");
31
+ const path_1 = __importDefault(require("path"));
32
+ const fs_1 = __importDefault(require("fs"));
33
+ const TuyaDeviceManager_1 = __importDefault(require("./device/TuyaDeviceManager"));
34
+ const TuyaCustomDeviceManager_1 = __importDefault(require("./device/TuyaCustomDeviceManager"));
35
+ const TuyaHomeDeviceManager_1 = __importDefault(require("./device/TuyaHomeDeviceManager"));
36
+ const settings_1 = require("./settings");
37
+ const config_1 = require("./config");
38
+ const AccessoryFactory_1 = __importDefault(require("./accessory/AccessoryFactory"));
39
+ const TuyaOpenAPI_1 = __importStar(require("./core/TuyaOpenAPI"));
40
+ /**
41
+ * HomebridgePlatform
42
+ * This class is the main constructor for your plugin, this is where you should
43
+ * parse the user config and discover/register accessories with Homebridge.
44
+ */
45
+ class TuyaPlatform {
46
+ validate() {
47
+ let result;
48
+ if (!this.options) {
49
+ this.log.error('Not configured, exit.');
50
+ return false;
51
+ }
52
+ else if (this.options.projectType === '1') {
53
+ result = new jsonschema_1.Validator().validate(this.options, config_1.customOptionsSchema);
54
+ }
55
+ else if (this.options.projectType === '2') {
56
+ result = new jsonschema_1.Validator().validate(this.options, config_1.homeOptionsSchema);
57
+ }
58
+ else {
59
+ this.log.error(`Unsupported projectType: ${this.options['projectType']}, exit.`);
60
+ return false;
61
+ }
62
+ result.errors.forEach(error => this.log.error(error.stack));
63
+ if (result.errors.length > 0) {
64
+ return false;
65
+ }
66
+ if (!this.validateDeviceOverrides() || !this.validateSchema()) {
67
+ return false;
68
+ }
69
+ return true;
70
+ }
71
+ validateDeviceOverrides() {
72
+ var _a;
73
+ if (!this.options.deviceOverrides) {
74
+ return true;
75
+ }
76
+ const idMap = new Map();
77
+ for (const item of this.options.deviceOverrides) {
78
+ if (idMap.has(item.id)) {
79
+ (_a = idMap.get(item.id)) === null || _a === void 0 ? void 0 : _a.push(item);
80
+ }
81
+ else {
82
+ idMap.set(item.id, [item]);
83
+ }
84
+ }
85
+ for (const items of idMap.values()) {
86
+ if (items.length > 1) {
87
+ this.log.error('"deviceOverrides" conflict, "id" must be unique: %o.', items);
88
+ return false;
89
+ }
90
+ }
91
+ return true;
92
+ }
93
+ validateSchema() {
94
+ var _a;
95
+ if (!this.options.deviceOverrides) {
96
+ return true;
97
+ }
98
+ for (const deviceOverride of this.options.deviceOverrides) {
99
+ if (!deviceOverride.schema) {
100
+ continue;
101
+ }
102
+ const idMap = new Map();
103
+ for (const item of deviceOverride.schema) {
104
+ if (idMap.has(item.code)) {
105
+ (_a = idMap.get(item.code)) === null || _a === void 0 ? void 0 : _a.push(item);
106
+ }
107
+ else {
108
+ idMap.set(item.code, [item]);
109
+ }
110
+ }
111
+ for (const items of idMap.values()) {
112
+ if (items.length > 1) {
113
+ this.log.error('"schema" conflict, "code" must be unique: %o.', items);
114
+ return false;
115
+ }
116
+ }
117
+ }
118
+ return true;
119
+ }
120
+ constructor(log, config, api) {
121
+ this.log = log;
122
+ this.config = config;
123
+ this.api = api;
124
+ this.Service = this.api.hap.Service;
125
+ this.Characteristic = this.api.hap.Characteristic;
126
+ this.options = this.config.options;
127
+ // this is used to track restored cached accessories
128
+ this.cachedAccessories = [];
129
+ this.accessoryHandlers = [];
130
+ if (!this.validate()) {
131
+ return;
132
+ }
133
+ this.log.debug('Finished initializing platform');
134
+ // When this event is fired it means Homebridge has restored all cached accessories from disk.
135
+ // Dynamic Platform plugins should only register new accessories after this event was fired,
136
+ // in order to ensure they weren't added to homebridge already. This event can also be used
137
+ // to start discovery of new accessories.
138
+ this.api.on('didFinishLaunching', async () => {
139
+ this.log.debug('Executed didFinishLaunching callback');
140
+ // run the method to discover / register your devices as accessories
141
+ await this.initDevices();
142
+ });
143
+ }
144
+ /**
145
+ * This function is invoked when homebridge restores cached accessories from disk at startup.
146
+ * It should be used to setup event handlers for characteristics and update respective values.
147
+ */
148
+ configureAccessory(accessory) {
149
+ this.log.info('Loading accessory from cache:', accessory.displayName);
150
+ AccessoryFactory_1.default.configAccessory(this, accessory);
151
+ // add the restored accessory to the accessories cache so we can track if it has already been registered
152
+ this.cachedAccessories.push(accessory);
153
+ }
154
+ /**
155
+ * This is an example method showing how to register discovered accessories.
156
+ * Accessories must only be registered once, previously created accessories
157
+ * must not be registered again to prevent "duplicate UUID" errors.
158
+ */
159
+ async initDevices() {
160
+ let devices;
161
+ if (this.options.projectType === '1') {
162
+ devices = await this.initCustomProject();
163
+ }
164
+ else if (this.options.projectType === '2') {
165
+ devices = await this.initHomeProject();
166
+ }
167
+ else {
168
+ this.log.warn(`Unsupported projectType: ${this.config.options.projectType}.`);
169
+ }
170
+ if (!devices || !this.deviceManager) {
171
+ return;
172
+ }
173
+ // override device category
174
+ for (const device of devices) {
175
+ const deviceConfig = this.getDeviceConfig(device);
176
+ if (!deviceConfig || !deviceConfig.category) {
177
+ continue;
178
+ }
179
+ this.log.warn('Override %o category from %o to %o', device.name, device.category, deviceConfig.category);
180
+ device.category = deviceConfig.category;
181
+ }
182
+ // override device bridged
183
+ for (const device of devices) {
184
+ const deviceConfig = this.getDeviceConfig(device);
185
+ if (!deviceConfig || !deviceConfig.unbridged) {
186
+ continue;
187
+ }
188
+ this.log.warn('Unbridge %o category %o', device.name, device.category);
189
+ device.unbridged = deviceConfig.unbridged;
190
+ }
191
+ await this.deviceManager.updateInfraredRemotes(devices);
192
+ this.log.info(`Got ${devices.length} device(s) and scene(s).`);
193
+ const file = path_1.default.join(this.api.user.persistPath(), `TuyaDeviceList.${this.deviceManager.api.tokenInfo.uid}.json`);
194
+ this.log.info('Device list saved at %s', file);
195
+ if (!fs_1.default.existsSync(this.api.user.persistPath())) {
196
+ await fs_1.default.promises.mkdir(this.api.user.persistPath());
197
+ }
198
+ await fs_1.default.promises.writeFile(file, JSON.stringify(devices, null, 2));
199
+ // add accessories
200
+ for (const device of devices) {
201
+ this.addAccessory(device);
202
+ }
203
+ // remove unused accessories
204
+ for (const cachedAccessory of this.cachedAccessories) {
205
+ this.log.warn('Removing unused accessory from cache:', cachedAccessory.displayName);
206
+ this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [cachedAccessory]);
207
+ }
208
+ this.cachedAccessories = [];
209
+ this.deviceManager.on(TuyaDeviceManager_1.default.Events.DEVICE_ADD, this.addAccessory.bind(this));
210
+ this.deviceManager.on(TuyaDeviceManager_1.default.Events.DEVICE_INFO_UPDATE, this.updateAccessoryInfo.bind(this));
211
+ this.deviceManager.on(TuyaDeviceManager_1.default.Events.DEVICE_STATUS_UPDATE, this.updateAccessoryStatus.bind(this));
212
+ this.deviceManager.on(TuyaDeviceManager_1.default.Events.DEVICE_DELETE, this.removeAccessory.bind(this));
213
+ }
214
+ getDeviceConfig(device) {
215
+ if (!this.options.deviceOverrides) {
216
+ return undefined;
217
+ }
218
+ const deviceConfig = this.options.deviceOverrides.find(config => config.id === device.id || config.id === device.uuid);
219
+ const productConfig = this.options.deviceOverrides.find(config => config.id === device.product_id);
220
+ const globalConfig = this.options.deviceOverrides.find(config => config.id === 'global');
221
+ return deviceConfig || productConfig || globalConfig;
222
+ }
223
+ getDeviceSchemaConfig(device, code) {
224
+ const deviceConfig = this.getDeviceConfig(device);
225
+ if (!deviceConfig || !deviceConfig.schema) {
226
+ return undefined;
227
+ }
228
+ // migrate old config
229
+ deviceConfig.schema.forEach(item => {
230
+ if (item['oldCode']) {
231
+ item.newCode = item.code;
232
+ item.code = item['oldCode'];
233
+ item['oldCode'] = undefined;
234
+ }
235
+ });
236
+ const schemaConfig = deviceConfig.schema.find(item => item.newCode ? item.newCode === code : item.code === code);
237
+ if (!schemaConfig) {
238
+ return undefined;
239
+ }
240
+ return schemaConfig;
241
+ }
242
+ async initCustomProject() {
243
+ if (this.options.projectType !== '1') {
244
+ return undefined;
245
+ }
246
+ const DEFAULT_USER = 'homebridge';
247
+ const DEFAULT_PASS = 'homebridge';
248
+ let res;
249
+ const { endpoint, accessId, accessKey, debug, debugLevel } = this.options;
250
+ const debugMode = debug && ((debugLevel !== null && debugLevel !== void 0 ? debugLevel : '').length > 0 ? debugLevel === null || debugLevel === void 0 ? void 0 : debugLevel.includes('api') : true);
251
+ const api = new TuyaOpenAPI_1.default(endpoint, accessId, accessKey, this.log, 'en', debugMode);
252
+ const deviceManager = new TuyaCustomDeviceManager_1.default(api, debugMode);
253
+ this.log.info('Get token.');
254
+ res = await api.getToken();
255
+ if (res.success === false) {
256
+ this.log.error(`Get token failed. code=${res.code}, msg=${res.msg}`);
257
+ return undefined;
258
+ }
259
+ this.log.info(`Search default user "${DEFAULT_USER}"`);
260
+ res = await api.customGetUserInfo(DEFAULT_USER);
261
+ if (res.success === false) {
262
+ this.log.error(`Search user failed. code=${res.code}, msg=${res.msg}`);
263
+ return undefined;
264
+ }
265
+ if (!res.result.user_name) {
266
+ this.log.info(`Default user "${DEFAULT_USER}" not exist.`);
267
+ this.log.info(`Creating default user "${DEFAULT_USER}".`);
268
+ res = await api.customCreateUser(DEFAULT_USER, DEFAULT_PASS);
269
+ if (res.success === false) {
270
+ this.log.error(`Create default user failed. code=${res.code}, msg=${res.msg}`);
271
+ return undefined;
272
+ }
273
+ }
274
+ else {
275
+ this.log.info(`Default user "${DEFAULT_USER}" exists.`);
276
+ }
277
+ const uid = res.result.user_id;
278
+ this.log.info('Fetching asset list.');
279
+ res = await deviceManager.getAssetList();
280
+ if (res.success === false) {
281
+ this.log.error(`Fetching asset list failed. code=${res.code}, msg=${res.msg}`);
282
+ return undefined;
283
+ }
284
+ const assetIDList = [];
285
+ for (const { asset_id, asset_name } of res.result.list) {
286
+ this.log.info(`Got asset_id=${asset_id}, asset_name=${asset_name}`);
287
+ assetIDList.push(asset_id);
288
+ }
289
+ if (assetIDList.length === 0) {
290
+ this.log.warn('Asset list is empty. exit.');
291
+ return undefined;
292
+ }
293
+ this.log.info('Authorize asset list.');
294
+ res = await deviceManager.authorizeAssetList(uid, assetIDList, true);
295
+ if (res.success === false) {
296
+ this.log.error(`Authorize asset list failed. code=${res.code}, msg=${res.msg}`);
297
+ return undefined;
298
+ }
299
+ this.log.info(`Log in with user "${DEFAULT_USER}".`);
300
+ res = await api.customLogin(DEFAULT_USER, DEFAULT_USER);
301
+ if (res.success === false) {
302
+ this.log.error(`Login failed. code=${res.code}, msg=${res.msg}`);
303
+ if (TuyaOpenAPI_1.LOGIN_ERROR_MESSAGES[res.code]) {
304
+ this.log.error(TuyaOpenAPI_1.LOGIN_ERROR_MESSAGES[res.code]);
305
+ }
306
+ return undefined;
307
+ }
308
+ this.log.info('Start MQTT connection.');
309
+ deviceManager.mq.start();
310
+ this.log.info('Fetching device list.');
311
+ deviceManager.ownerIDs = assetIDList;
312
+ const devices = await deviceManager.updateDevices(assetIDList);
313
+ this.deviceManager = deviceManager;
314
+ return devices;
315
+ }
316
+ async initHomeProject() {
317
+ if (this.options.projectType !== '2') {
318
+ return undefined;
319
+ }
320
+ let res;
321
+ const { accessId, accessKey, countryCode, username, password, appSchema, endpoint, debug, debugLevel } = this.options;
322
+ const debugMode = debug && ((debugLevel !== null && debugLevel !== void 0 ? debugLevel : '').length > 0 ? debugLevel === null || debugLevel === void 0 ? void 0 : debugLevel.includes('api') : true);
323
+ const api = new TuyaOpenAPI_1.default((endpoint && endpoint.length > 0) ? endpoint : TuyaOpenAPI_1.default.getDefaultEndpoint(countryCode), accessId, accessKey, this.log, 'en', debugMode);
324
+ const deviceManager = new TuyaHomeDeviceManager_1.default(api, debugMode);
325
+ this.log.info('Log in to Tuya Cloud.');
326
+ res = await api.homeLogin(countryCode, username, password, appSchema);
327
+ if (res.success === false) {
328
+ this.log.error(`Login failed. code=${res.code}, msg=${res.msg}`);
329
+ if (TuyaOpenAPI_1.LOGIN_ERROR_MESSAGES[res.code]) {
330
+ this.log.error(TuyaOpenAPI_1.LOGIN_ERROR_MESSAGES[res.code]);
331
+ }
332
+ return undefined;
333
+ }
334
+ this.log.info('Start MQTT connection.');
335
+ deviceManager.mq.start();
336
+ this.log.info('Fetching home list.');
337
+ res = await deviceManager.getHomeList();
338
+ if (res.success === false) {
339
+ this.log.error(`Fetching home list failed. code=${res.code}, msg=${res.msg}`);
340
+ return undefined;
341
+ }
342
+ const homeIDList = [];
343
+ for (const { home_id, name } of res.result) {
344
+ this.log.info(`Got home_id=${home_id}, name=${name}`);
345
+ if (this.options.homeWhitelist) {
346
+ if (this.options.homeWhitelist.includes(home_id)) {
347
+ this.log.info(`Found home_id=${home_id} in whitelist; including devices from this home.`);
348
+ homeIDList.push(home_id);
349
+ }
350
+ else {
351
+ this.log.info(`Did not find home_id=${home_id} in whitelist; excluding devices from this home.`);
352
+ }
353
+ }
354
+ else {
355
+ homeIDList.push(home_id);
356
+ }
357
+ }
358
+ if (homeIDList.length === 0) {
359
+ this.log.warn('Home list is empty.');
360
+ }
361
+ this.log.info('Fetching device list.');
362
+ deviceManager.ownerIDs = homeIDList.map(homeID => homeID.toString());
363
+ const devices = await deviceManager.updateDevices(homeIDList);
364
+ this.log.info('Fetching scene list.');
365
+ for (const homeID of homeIDList) {
366
+ const scenes = await deviceManager.getSceneList(homeID);
367
+ for (const scene of scenes) {
368
+ this.log.info(`Got scene_id=${scene.id}, name=${scene.name}`);
369
+ }
370
+ devices.push(...scenes);
371
+ }
372
+ this.deviceManager = deviceManager;
373
+ if (this.options.generateWeatherAccessory) {
374
+ const targetDevice = devices.find(device => device.lat && device.lon);
375
+ if (targetDevice) {
376
+ devices.push(this.createWeatherDevice(targetDevice, res.result));
377
+ }
378
+ }
379
+ return devices;
380
+ }
381
+ addAccessory(device) {
382
+ if (device.category === 'hidden') {
383
+ this.log.info('Hide Accessory:', device.name);
384
+ return;
385
+ }
386
+ const uuid = this.api.hap.uuid.generate(device.id);
387
+ const existingAccessory = this.cachedAccessories.find(accessory => accessory.UUID === uuid);
388
+ if (existingAccessory && !device.unbridged) {
389
+ this.log.info('Restoring existing accessory from cache:', existingAccessory.displayName);
390
+ // Update context
391
+ if (!existingAccessory.context || !existingAccessory.context.deviceID) {
392
+ this.log.info('Update accessory context:', existingAccessory.displayName);
393
+ existingAccessory.context.deviceID = device.id;
394
+ this.api.updatePlatformAccessories([existingAccessory]);
395
+ }
396
+ // create the accessory handler for the restored accessory
397
+ const handler = AccessoryFactory_1.default.createAccessory(this, existingAccessory, device);
398
+ this.accessoryHandlers.push(handler);
399
+ const index = this.cachedAccessories.indexOf(existingAccessory);
400
+ if (index >= 0) {
401
+ this.cachedAccessories.splice(index, 1);
402
+ }
403
+ }
404
+ else {
405
+ // the accessory does not yet exist, so we need to create it
406
+ this.log.info('Adding new accessory:', device.name);
407
+ // create a new accessory
408
+ const accessory = new this.api.platformAccessory(device.name, uuid);
409
+ accessory.context.deviceID = device.id;
410
+ // create the accessory handler for the newly create accessory
411
+ const handler = AccessoryFactory_1.default.createAccessory(this, accessory, device);
412
+ this.accessoryHandlers.push(handler);
413
+ // link the accessory to your platform
414
+ if (device.unbridged) {
415
+ this.api.publishExternalAccessories(settings_1.PLUGIN_NAME, [accessory]);
416
+ }
417
+ else {
418
+ this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
419
+ }
420
+ AccessoryFactory_1.default.configAccessory(this, accessory);
421
+ }
422
+ }
423
+ updateAccessoryInfo(device, info) {
424
+ const handler = this.getAccessoryHandler(device.id);
425
+ if (!handler) {
426
+ return;
427
+ }
428
+ // this.log.debug('onDeviceInfoUpdate devId = %s, status = %o}', device.id, info);
429
+ handler.onDeviceInfoUpdate(info);
430
+ }
431
+ updateAccessoryStatus(device, status) {
432
+ const handler = this.getAccessoryHandler(device.id);
433
+ if (!handler) {
434
+ return;
435
+ }
436
+ // this.log.debug('onDeviceStatusUpdate devId = %s, status = %o}', device.id, status);
437
+ handler.onDeviceStatusUpdate(status);
438
+ }
439
+ removeAccessory(deviceID) {
440
+ const handler = this.getAccessoryHandler(deviceID);
441
+ if (!handler) {
442
+ return;
443
+ }
444
+ const index = this.accessoryHandlers.indexOf(handler);
445
+ if (index >= 0) {
446
+ this.accessoryHandlers.splice(index, 1);
447
+ }
448
+ this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [handler.accessory]);
449
+ this.log.info('Removing existing accessory from cache:', handler.accessory.displayName);
450
+ }
451
+ getAccessoryHandler(deviceID) {
452
+ return this.accessoryHandlers.find(handler => handler.device.id === deviceID);
453
+ }
454
+ createWeatherDevice(device, result) {
455
+ const key = `weather-${device.owner_id}`;
456
+ const uuid = this.api.hap.uuid.generate(key);
457
+ this.log.info(`add weather device:${key}`);
458
+ const virtualDevice = this.deviceManager.createVirtualDevice(device, uuid);
459
+ virtualDevice.product_id = 'virtual-product-id-weather';
460
+ virtualDevice.category = 'wsdcg';
461
+ virtualDevice.name = `Weather(${result.find(home => home.home_id == device.owner_id).name})`;
462
+ return virtualDevice;
463
+ }
464
+ }
465
+ exports.TuyaPlatform = TuyaPlatform;
466
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLUGIN_NAME = exports.PLATFORM_NAME = void 0;
4
+ // eslint-disable-next-line
5
+ // @ts-ignore
6
+ const config_schema_json_1 = require("../config.schema.json");
7
+ // eslint-disable-next-line
8
+ // @ts-ignore
9
+ const package_json_1 = require("../package.json");
10
+ /**
11
+ * This is the name of the platform that users will use to register the plugin in the Homebridge config.json
12
+ */
13
+ exports.PLATFORM_NAME = config_schema_json_1.pluginAlias;
14
+ /**
15
+ * This must match the name of your plugin as defined the package.json
16
+ */
17
+ exports.PLUGIN_NAME = package_json_1.name;
18
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AAC3B,aAAa;AACb,8DAAoE;AAEpE,2BAA2B;AAC3B,aAAa;AACb,kDAAqD;AAErD;;GAEG;AACU,QAAA,aAAa,GAAG,gCAAY,CAAC;AAE1C;;GAEG;AACU,QAAA,WAAW,GAAG,mBAAU,CAAC"}
@@ -0,0 +1,126 @@
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.FfmpegStreamingProcess = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const os_1 = __importDefault(require("os"));
9
+ const readline_1 = __importDefault(require("readline"));
10
+ class FfmpegStreamingProcess {
11
+ constructor(sessionId, videoProcessor, ffmpegArgs, log, delegate, callback) {
12
+ log.debug(`Stream command: ${videoProcessor} ${ffmpegArgs.map(value => JSON.stringify(value)).join(' ')}`);
13
+ let started = false;
14
+ const startTime = Date.now();
15
+ this.process = (0, child_process_1.spawn)(videoProcessor, ffmpegArgs, { env: process.env });
16
+ this.stdin = this.process.stdin;
17
+ this.process.stdout.on('data', (data) => {
18
+ const progress = this.parseProgress(data);
19
+ if (progress) {
20
+ if (!started && progress.frame > 0) {
21
+ started = true;
22
+ const runtime = (Date.now() - startTime) / 1000;
23
+ const message = 'Getting the first frames took ' + runtime + ' seconds.';
24
+ if (runtime < 5) {
25
+ log.debug(message);
26
+ }
27
+ else if (runtime < 22) {
28
+ log.warn(message);
29
+ }
30
+ else {
31
+ log.error(message);
32
+ }
33
+ }
34
+ }
35
+ });
36
+ const stderr = readline_1.default.createInterface({
37
+ input: this.process.stderr,
38
+ terminal: false,
39
+ });
40
+ stderr.on('line', (line) => {
41
+ if (callback) {
42
+ callback();
43
+ callback = undefined;
44
+ }
45
+ if (line.match(/\[(panic|fatal|error)\]/)) {
46
+ log.error(line);
47
+ }
48
+ });
49
+ this.process.on('error', (error) => {
50
+ log.error('FFmpeg process creation failed: ' + error.message);
51
+ if (callback) {
52
+ callback(new Error('FFmpeg process creation failed'));
53
+ }
54
+ delegate.stopStream(sessionId);
55
+ });
56
+ this.process.on('exit', (code, signal) => {
57
+ if (this.killTimeout) {
58
+ clearTimeout(this.killTimeout);
59
+ }
60
+ const message = 'FFmpeg exited with code: ' + code + ' and signal: ' + signal;
61
+ if (this.killTimeout && code === 0) {
62
+ log.debug(message + ' (Expected)');
63
+ }
64
+ else if (code === null || code === 255) {
65
+ if (this.process.killed) {
66
+ log.debug(message + ' (Forced)');
67
+ }
68
+ else {
69
+ log.error(message + ' (Unexpected)');
70
+ }
71
+ }
72
+ else {
73
+ log.error(message + ' (Error)');
74
+ delegate.stopStream(sessionId);
75
+ if (!started && callback) {
76
+ callback(new Error(message));
77
+ }
78
+ else {
79
+ delegate.forceStopStream(sessionId);
80
+ }
81
+ }
82
+ });
83
+ }
84
+ parseProgress(data) {
85
+ const input = data.toString();
86
+ if (input.indexOf('frame=') === 0) {
87
+ try {
88
+ const progress = new Map();
89
+ input.split(/\r?\n/).forEach((line) => {
90
+ const split = line.split('=', 2);
91
+ progress.set(split[0], split[1]);
92
+ });
93
+ return {
94
+ frame: parseInt(progress.get('frame')),
95
+ fps: parseFloat(progress.get('fps')),
96
+ stream_q: parseFloat(progress.get('stream_0_0_q')),
97
+ bitrate: parseFloat(progress.get('bitrate')),
98
+ total_size: parseInt(progress.get('total_size')),
99
+ out_time_us: parseInt(progress.get('out_time_us')),
100
+ out_time: progress.get('out_time').trim(),
101
+ dup_frames: parseInt(progress.get('dup_frames')),
102
+ drop_frames: parseInt(progress.get('drop_frames')),
103
+ speed: parseFloat(progress.get('speed')),
104
+ progress: progress.get('progress').trim(),
105
+ };
106
+ }
107
+ catch (_a) {
108
+ return undefined;
109
+ }
110
+ }
111
+ else {
112
+ return undefined;
113
+ }
114
+ }
115
+ getStdin() {
116
+ return this.process.stdin;
117
+ }
118
+ stop() {
119
+ this.process.stdin.write('q' + os_1.default.EOL);
120
+ this.killTimeout = setTimeout(() => {
121
+ this.process.kill('SIGKILL');
122
+ }, 2 * 1000);
123
+ }
124
+ }
125
+ exports.FfmpegStreamingProcess = FfmpegStreamingProcess;
126
+ //# sourceMappingURL=FfmpegStreamingProcess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FfmpegStreamingProcess.js","sourceRoot":"","sources":["../../src/util/FfmpegStreamingProcess.ts"],"names":[],"mappings":"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"}