homebridge-tuya-without-developer-account 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/LICENSE +20 -0
- package/PUBLISHING.md +80 -0
- package/README.md +233 -0
- package/SUPPORTED_DEVICES.md +206 -0
- package/config.schema.json +131 -0
- package/dist/cloud/api/TuyaHACloudAPI.js +286 -0
- package/dist/cloud/api/TuyaHASharingMQ.js +114 -0
- package/dist/cloud/device/TuyaDevice.js +50 -0
- package/dist/cloud/device/TuyaHADeviceManager.js +355 -0
- package/dist/index.js +7 -0
- package/dist/platform.js +397 -0
- package/dist/settings.js +18 -0
- package/dist/shared/AccessoryFactory.js +276 -0
- package/dist/shared/accessories/AccessoryFactory.js +305 -0
- package/dist/shared/accessories/AirConditionerAccessory.js +307 -0
- package/dist/shared/accessories/AirPurifierAccessory.js +90 -0
- package/dist/shared/accessories/AirQualitySensorAccessory.js +30 -0
- package/dist/shared/accessories/BaseAccessory.js +406 -0
- package/dist/shared/accessories/BlindsAccessory.js +199 -0
- package/dist/shared/accessories/CameraAccessory.js +121 -0
- package/dist/shared/accessories/CarbonDioxideSensorAccessory.js +52 -0
- package/dist/shared/accessories/CarbonMonoxideSensorAccessory.js +52 -0
- package/dist/shared/accessories/ContactSensorAccessory.js +30 -0
- package/dist/shared/accessories/DehumidifierAccessory.js +68 -0
- package/dist/shared/accessories/DiffuserAccessory.js +55 -0
- package/dist/shared/accessories/DimmerAccessory.js +94 -0
- package/dist/shared/accessories/DoorbellAccessory.js +91 -0
- package/dist/shared/accessories/ExtractionHoodAccessory.js +120 -0
- package/dist/shared/accessories/FanAccessory.js +129 -0
- package/dist/shared/accessories/GarageDoorAccessory.js +69 -0
- package/dist/shared/accessories/HeaterAccessory.js +102 -0
- package/dist/shared/accessories/HeaterAccessory_old.js +96 -0
- package/dist/shared/accessories/HumanPresenceSensorAccessory.js +20 -0
- package/dist/shared/accessories/HumidifierAccessory.js +137 -0
- package/dist/shared/accessories/IRAirConditionerAccessory.js +278 -0
- package/dist/shared/accessories/IRControlHubAccessory.js +49 -0
- package/dist/shared/accessories/IRControlHubSubAccessory.js +52 -0
- package/dist/shared/accessories/IRGenericAccessory.js +49 -0
- package/dist/shared/accessories/LeakSensorAccessory.js +36 -0
- package/dist/shared/accessories/LightAccessory.js +36 -0
- package/dist/shared/accessories/LightSensorAccessory.js +32 -0
- package/dist/shared/accessories/LocationWeatherAccessory.js +72 -0
- package/dist/shared/accessories/LockAccessory.js +56 -0
- package/dist/shared/accessories/MotionSensorAccessory.js +20 -0
- package/dist/shared/accessories/OutletAccessory.js +23 -0
- package/dist/shared/accessories/PetFeederAccessory.js +139 -0
- package/dist/shared/accessories/SceneAccessory.js +32 -0
- package/dist/shared/accessories/SceneSwitchAccessory.js +44 -0
- package/dist/shared/accessories/SecuritySystemAccessory.js +30 -0
- package/dist/shared/accessories/SmokeSensorAccessory.js +35 -0
- package/dist/shared/accessories/SwitchAccessory.js +148 -0
- package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js +24 -0
- package/dist/shared/accessories/ThermostatAccessory.js +192 -0
- package/dist/shared/accessories/TowerRackAccessory.js +157 -0
- package/dist/shared/accessories/ValveAccessory.js +45 -0
- package/dist/shared/accessories/VibrationSensorAccessory.js +46 -0
- package/dist/shared/accessories/WeatherStationAccessory.js +58 -0
- package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js +23 -0
- package/dist/shared/accessories/WhiteNoiseLightAccessory.js +59 -0
- package/dist/shared/accessories/WindowAccessory.js +14 -0
- package/dist/shared/accessories/WindowCoveringAccessory.js +156 -0
- package/dist/shared/accessories/WirelessSwitchAccessory.js +42 -0
- package/dist/shared/accessories/characteristic/Active.js +22 -0
- package/dist/shared/accessories/characteristic/AirQuality.js +74 -0
- package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js +23 -0
- package/dist/shared/accessories/characteristic/CurrentTemperature.js +23 -0
- package/dist/shared/accessories/characteristic/CurrentWeather.js +49 -0
- package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js +49 -0
- package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js +48 -0
- package/dist/shared/accessories/characteristic/EnergyUsage.js +98 -0
- package/dist/shared/accessories/characteristic/Light.js +268 -0
- package/dist/shared/accessories/characteristic/LightSensor.js +23 -0
- package/dist/shared/accessories/characteristic/LockPhysicalControls.js +21 -0
- package/dist/shared/accessories/characteristic/MotionDetected.js +22 -0
- package/dist/shared/accessories/characteristic/Name.js +15 -0
- package/dist/shared/accessories/characteristic/OccupancyDetected.js +19 -0
- package/dist/shared/accessories/characteristic/On.js +25 -0
- package/dist/shared/accessories/characteristic/OutletInUse.js +14 -0
- package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js +89 -0
- package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js +28 -0
- package/dist/shared/accessories/characteristic/RotationSpeed.js +78 -0
- package/dist/shared/accessories/characteristic/SecuritySystemState.js +74 -0
- package/dist/shared/accessories/characteristic/SwingMode.js +21 -0
- package/dist/shared/accessories/characteristic/TargetTemperature.js +29 -0
- package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js +25 -0
- package/dist/shared/util/ConfigHash.js +79 -0
- package/dist/shared/util/FfmpegStreamingProcess.js +126 -0
- package/dist/shared/util/InfraredTool.js +392 -0
- package/dist/shared/util/Logger.js +42 -0
- package/dist/shared/util/TuyaRecordingDelegate.js +22 -0
- package/dist/shared/util/TuyaStreamDelegate.js +329 -0
- package/dist/shared/util/color.js +23 -0
- package/dist/shared/util/util.js +135 -0
- package/homebridge-ui/public/index.html +329 -0
- package/homebridge-ui/server.js +224 -0
- package/package.json +61 -0
|
@@ -0,0 +1,276 @@
|
|
|
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
|
+
const BaseAccessory_1 = __importDefault(require("./accessories/BaseAccessory"));
|
|
7
|
+
const LightAccessory_1 = __importDefault(require("./accessories/LightAccessory"));
|
|
8
|
+
const DimmerAccessory_1 = __importDefault(require("./accessories/DimmerAccessory"));
|
|
9
|
+
const OutletAccessory_1 = __importDefault(require("./accessories/OutletAccessory"));
|
|
10
|
+
const SwitchAccessory_1 = __importDefault(require("./accessories/SwitchAccessory"));
|
|
11
|
+
const WirelessSwitchAccessory_1 = __importDefault(require("./accessories/WirelessSwitchAccessory"));
|
|
12
|
+
const SceneSwitchAccessory_1 = __importDefault(require("./accessories/SceneSwitchAccessory"));
|
|
13
|
+
const FanAccessory_1 = __importDefault(require("./accessories/FanAccessory"));
|
|
14
|
+
const GarageDoorAccessory_1 = __importDefault(require("./accessories/GarageDoorAccessory"));
|
|
15
|
+
const WindowAccessory_1 = __importDefault(require("./accessories/WindowAccessory"));
|
|
16
|
+
const WindowCoveringAccessory_1 = __importDefault(require("./accessories/WindowCoveringAccessory"));
|
|
17
|
+
const BlindsAccessory_1 = __importDefault(require("./accessories/BlindsAccessory"));
|
|
18
|
+
const LockAccessory_1 = __importDefault(require("./accessories/LockAccessory"));
|
|
19
|
+
const ThermostatAccessory_1 = __importDefault(require("./accessories/ThermostatAccessory"));
|
|
20
|
+
const HeaterAccessory_1 = __importDefault(require("./accessories/HeaterAccessory"));
|
|
21
|
+
const ValveAccessory_1 = __importDefault(require("./accessories/ValveAccessory"));
|
|
22
|
+
const ContactSensorAccessory_1 = __importDefault(require("./accessories/ContactSensorAccessory"));
|
|
23
|
+
const LeakSensorAccessory_1 = __importDefault(require("./accessories/LeakSensorAccessory"));
|
|
24
|
+
const CarbonMonoxideSensorAccessory_1 = __importDefault(require("./accessories/CarbonMonoxideSensorAccessory"));
|
|
25
|
+
const CarbonDioxideSensorAccessory_1 = __importDefault(require("./accessories/CarbonDioxideSensorAccessory"));
|
|
26
|
+
const SmokeSensorAccessory_1 = __importDefault(require("./accessories/SmokeSensorAccessory"));
|
|
27
|
+
const TemperatureHumiditySensorAccessory_1 = __importDefault(require("./accessories/TemperatureHumiditySensorAccessory"));
|
|
28
|
+
const LightSensorAccessory_1 = __importDefault(require("./accessories/LightSensorAccessory"));
|
|
29
|
+
const MotionSensorAccessory_1 = __importDefault(require("./accessories/MotionSensorAccessory"));
|
|
30
|
+
const AirQualitySensorAccessory_1 = __importDefault(require("./accessories/AirQualitySensorAccessory"));
|
|
31
|
+
const HumanPresenceSensorAccessory_1 = __importDefault(require("./accessories/HumanPresenceSensorAccessory"));
|
|
32
|
+
const HumidifierAccessory_1 = __importDefault(require("./accessories/HumidifierAccessory"));
|
|
33
|
+
const DehumidifierAccessory_1 = __importDefault(require("./accessories/DehumidifierAccessory"));
|
|
34
|
+
const DiffuserAccessory_1 = __importDefault(require("./accessories/DiffuserAccessory"));
|
|
35
|
+
const AirPurifierAccessory_1 = __importDefault(require("./accessories/AirPurifierAccessory"));
|
|
36
|
+
const ExtractionHoodAccessory_1 = __importDefault(require("./accessories/ExtractionHoodAccessory"));
|
|
37
|
+
const CameraAccessory_1 = __importDefault(require("./accessories/CameraAccessory"));
|
|
38
|
+
const SceneAccessory_1 = __importDefault(require("./accessories/SceneAccessory"));
|
|
39
|
+
const AirConditionerAccessory_1 = __importDefault(require("./accessories/AirConditionerAccessory"));
|
|
40
|
+
const IRControlHubAccessory_1 = __importDefault(require("./accessories/IRControlHubAccessory"));
|
|
41
|
+
const IRGenericAccessory_1 = __importDefault(require("./accessories/IRGenericAccessory"));
|
|
42
|
+
const IRAirConditionerAccessory_1 = __importDefault(require("./accessories/IRAirConditionerAccessory"));
|
|
43
|
+
const SecuritySystemAccessory_1 = __importDefault(require("./accessories/SecuritySystemAccessory"));
|
|
44
|
+
const VibrationSensorAccessory_1 = __importDefault(require("./accessories/VibrationSensorAccessory"));
|
|
45
|
+
const WeatherStationAccessory_1 = __importDefault(require("./accessories/WeatherStationAccessory"));
|
|
46
|
+
const DoorbellAccessory_1 = __importDefault(require("./accessories/DoorbellAccessory"));
|
|
47
|
+
const PetFeederAccessory_1 = __importDefault(require("./accessories/PetFeederAccessory"));
|
|
48
|
+
const WhiteNoiseLightAccessory_1 = __importDefault(require("./accessories/WhiteNoiseLightAccessory"));
|
|
49
|
+
const WetBulbGlobeTemperatureAccessory_1 = __importDefault(require("./accessories/WetBulbGlobeTemperatureAccessory"));
|
|
50
|
+
const IRControlHubSubAccessory_1 = __importDefault(require("./accessories/IRControlHubSubAccessory"));
|
|
51
|
+
const LocationWeatherAccessory_1 = __importDefault(require("./accessories/LocationWeatherAccessory"));
|
|
52
|
+
class AccessoryFactory {
|
|
53
|
+
static createAccessory(platform, accessory, device) {
|
|
54
|
+
let handler;
|
|
55
|
+
handler = resolveAccessoryByProductID(platform, accessory, device.product_id)
|
|
56
|
+
|| resolveAccessoryByCategory(platform, accessory, device.category);
|
|
57
|
+
// basically use should set the handler at the switch-case
|
|
58
|
+
if (!handler) {
|
|
59
|
+
// IR Remote Control
|
|
60
|
+
if (device.isIRRemoteControl()) {
|
|
61
|
+
switch (device.remote_keys?.category_id) {
|
|
62
|
+
case 5: // AC
|
|
63
|
+
platform.log.warn('case IRAirConditionerAccessory');
|
|
64
|
+
handler = new IRAirConditionerAccessory_1.default(platform, accessory);
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
platform.log.warn('case IRGenericAccessory');
|
|
68
|
+
handler = new IRGenericAccessory_1.default(platform, accessory);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (handler && !handler.checkRequirements()) {
|
|
74
|
+
handler = undefined;
|
|
75
|
+
}
|
|
76
|
+
if (!handler) {
|
|
77
|
+
platform.log.warn(`Unsupported device: ${device.name}.`);
|
|
78
|
+
handler = new BaseAccessory_1.default(platform, accessory);
|
|
79
|
+
}
|
|
80
|
+
handler.configureServices();
|
|
81
|
+
handler.configureStatusActive();
|
|
82
|
+
handler.updateAllValues();
|
|
83
|
+
handler.initialized = true;
|
|
84
|
+
return handler;
|
|
85
|
+
}
|
|
86
|
+
static configAccessory(platform, accessory) {
|
|
87
|
+
const configs = platform.options.serviceInformationOverrides;
|
|
88
|
+
if (!configs) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const sn = accessory.getService(platform.Service.AccessoryInformation)?.getCharacteristic(platform.Characteristic.SerialNumber).value;
|
|
92
|
+
configs.filter(config => config.device_id === sn).forEach(config => {
|
|
93
|
+
try {
|
|
94
|
+
const service = accessory.services[config.index];
|
|
95
|
+
if (config.manifacturer) {
|
|
96
|
+
const before = service.getCharacteristic(platform.Characteristic.Manufacturer).value;
|
|
97
|
+
service.getCharacteristic(platform.Characteristic.Manufacturer).updateValue(config.manifacturer);
|
|
98
|
+
platform.log.info(`manifacturer updated. ${before} -> ${config.manifacturer}`);
|
|
99
|
+
}
|
|
100
|
+
if (config.model) {
|
|
101
|
+
const before = service.getCharacteristic(platform.Characteristic.Model).value;
|
|
102
|
+
service.getCharacteristic(platform.Characteristic.Model).updateValue(config.model);
|
|
103
|
+
platform.log.info(`model updated. ${before} -> ${config.model}`);
|
|
104
|
+
}
|
|
105
|
+
if (config.firmwareRevision) {
|
|
106
|
+
const before = service.getCharacteristic(platform.Characteristic.FirmwareRevision).value;
|
|
107
|
+
service.getCharacteristic(platform.Characteristic.FirmwareRevision).updateValue(config.firmwareRevision);
|
|
108
|
+
platform.log.info(`firmwareRevision updated. ${before} -> ${config.firmwareRevision}`);
|
|
109
|
+
}
|
|
110
|
+
if (config.configuredName) {
|
|
111
|
+
const before = service.getCharacteristic(platform.Characteristic.ConfiguredName).value;
|
|
112
|
+
service.getCharacteristic(platform.Characteristic.Name).updateValue(config.configuredName);
|
|
113
|
+
service.getCharacteristic(platform.Characteristic.ConfiguredName).updateValue(config.configuredName);
|
|
114
|
+
platform.log.info(`configuredName updated. ${before} -> ${config.configuredName}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
platform.log.error(`index out of bound.:${config.index}`);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.default = AccessoryFactory;
|
|
124
|
+
function resolveAccessoryByProductID(platform, accessory, product_id) {
|
|
125
|
+
switch (product_id) {
|
|
126
|
+
case 'scene': // see TuyaHomeDeviceManager#getSceneList
|
|
127
|
+
return new SceneAccessory_1.default(platform, accessory);
|
|
128
|
+
case 'virtual-product-id-wbgt':
|
|
129
|
+
return new WetBulbGlobeTemperatureAccessory_1.default(platform, accessory);
|
|
130
|
+
case 'virtual-product-id-weather':
|
|
131
|
+
return new LocationWeatherAccessory_1.default(platform, accessory);
|
|
132
|
+
default:
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function resolveAccessoryByCategory(platform, accessory, category) {
|
|
137
|
+
switch (category) {
|
|
138
|
+
// Lighting
|
|
139
|
+
case 'dj':
|
|
140
|
+
case 'dsd':
|
|
141
|
+
case 'xdd':
|
|
142
|
+
case 'fwd':
|
|
143
|
+
case 'dc':
|
|
144
|
+
case 'dd':
|
|
145
|
+
case 'gyd':
|
|
146
|
+
case 'tyndj':
|
|
147
|
+
case 'sxd':
|
|
148
|
+
return new LightAccessory_1.default(platform, accessory);
|
|
149
|
+
case 'tgq':
|
|
150
|
+
case 'tgkg':
|
|
151
|
+
return new DimmerAccessory_1.default(platform, accessory);
|
|
152
|
+
// Electrical Products
|
|
153
|
+
case 'dlq':
|
|
154
|
+
case 'kg':
|
|
155
|
+
case 'tdq':
|
|
156
|
+
case 'qjdcz':
|
|
157
|
+
case 'szjqr':
|
|
158
|
+
return new SwitchAccessory_1.default(platform, accessory);
|
|
159
|
+
case 'cz':
|
|
160
|
+
case 'pc':
|
|
161
|
+
case 'wkcz':
|
|
162
|
+
return new OutletAccessory_1.default(platform, accessory);
|
|
163
|
+
case 'wxkg':
|
|
164
|
+
return new WirelessSwitchAccessory_1.default(platform, accessory);
|
|
165
|
+
case 'cjkg':
|
|
166
|
+
return new SceneSwitchAccessory_1.default(platform, accessory);
|
|
167
|
+
case 'bzyd':
|
|
168
|
+
return new WhiteNoiseLightAccessory_1.default(platform, accessory);
|
|
169
|
+
// Large Home Appliances
|
|
170
|
+
case 'kt':
|
|
171
|
+
case 'ktkzq':
|
|
172
|
+
return new AirConditionerAccessory_1.default(platform, accessory);
|
|
173
|
+
// Small Home Appliances
|
|
174
|
+
case 'qn':
|
|
175
|
+
return new HeaterAccessory_1.default(platform, accessory);
|
|
176
|
+
case 'kj':
|
|
177
|
+
return new AirPurifierAccessory_1.default(platform, accessory);
|
|
178
|
+
case 'xxj':
|
|
179
|
+
return new DiffuserAccessory_1.default(platform, accessory);
|
|
180
|
+
case 'ckmkzq':
|
|
181
|
+
return new GarageDoorAccessory_1.default(platform, accessory);
|
|
182
|
+
case 'mg':
|
|
183
|
+
case 'mgmt':
|
|
184
|
+
return new BlindsAccessory_1.default(platform, accessory);
|
|
185
|
+
case 'cl':
|
|
186
|
+
case 'clkg':
|
|
187
|
+
return new WindowCoveringAccessory_1.default(platform, accessory);
|
|
188
|
+
case 'cwwsq':
|
|
189
|
+
return new PetFeederAccessory_1.default(platform, accessory);
|
|
190
|
+
case 'mc':
|
|
191
|
+
return new WindowAccessory_1.default(platform, accessory);
|
|
192
|
+
case 'wk':
|
|
193
|
+
case 'wkf':
|
|
194
|
+
return new ThermostatAccessory_1.default(platform, accessory);
|
|
195
|
+
case 'ggq':
|
|
196
|
+
case 'sfkzq':
|
|
197
|
+
return new ValveAccessory_1.default(platform, accessory);
|
|
198
|
+
case 'jsq':
|
|
199
|
+
return new HumidifierAccessory_1.default(platform, accessory);
|
|
200
|
+
case 'cs':
|
|
201
|
+
return new DehumidifierAccessory_1.default(platform, accessory);
|
|
202
|
+
case 'fs':
|
|
203
|
+
case 'fsd':
|
|
204
|
+
case 'fskg':
|
|
205
|
+
return new FanAccessory_1.default(platform, accessory);
|
|
206
|
+
case 'yyj':
|
|
207
|
+
return new ExtractionHoodAccessory_1.default(platform, accessory);
|
|
208
|
+
// Security & Video Surveillance
|
|
209
|
+
case 'sp':
|
|
210
|
+
return new CameraAccessory_1.default(platform, accessory);
|
|
211
|
+
case 'ywbj':
|
|
212
|
+
return new SmokeSensorAccessory_1.default(platform, accessory);
|
|
213
|
+
case 'mcs':
|
|
214
|
+
return new ContactSensorAccessory_1.default(platform, accessory);
|
|
215
|
+
case 'zd':
|
|
216
|
+
return new VibrationSensorAccessory_1.default(platform, accessory);
|
|
217
|
+
case 'rqbj':
|
|
218
|
+
case 'jwbj':
|
|
219
|
+
case 'sj':
|
|
220
|
+
return new LeakSensorAccessory_1.default(platform, accessory);
|
|
221
|
+
case 'cobj':
|
|
222
|
+
case 'cocgq':
|
|
223
|
+
return new CarbonMonoxideSensorAccessory_1.default(platform, accessory);
|
|
224
|
+
case 'co2bj':
|
|
225
|
+
case 'co2cgq':
|
|
226
|
+
return new CarbonDioxideSensorAccessory_1.default(platform, accessory);
|
|
227
|
+
case 'wsdcg':
|
|
228
|
+
return new TemperatureHumiditySensorAccessory_1.default(platform, accessory);
|
|
229
|
+
case 'ldcg':
|
|
230
|
+
return new LightSensorAccessory_1.default(platform, accessory);
|
|
231
|
+
case 'pir':
|
|
232
|
+
return new MotionSensorAccessory_1.default(platform, accessory);
|
|
233
|
+
case 'pm25':
|
|
234
|
+
case 'pm2.5':
|
|
235
|
+
case 'pm25cgq':
|
|
236
|
+
case 'hjjcy':
|
|
237
|
+
return new AirQualitySensorAccessory_1.default(platform, accessory);
|
|
238
|
+
case 'hps':
|
|
239
|
+
return new HumanPresenceSensorAccessory_1.default(platform, accessory);
|
|
240
|
+
case 'ms':
|
|
241
|
+
case 'jtmspro':
|
|
242
|
+
return new LockAccessory_1.default(platform, accessory);
|
|
243
|
+
case 'mal':
|
|
244
|
+
return new SecuritySystemAccessory_1.default(platform, accessory);
|
|
245
|
+
case 'wxml':
|
|
246
|
+
return new DoorbellAccessory_1.default(platform, accessory);
|
|
247
|
+
case 'qxj':
|
|
248
|
+
return new WeatherStationAccessory_1.default(platform, accessory);
|
|
249
|
+
// IR Control
|
|
250
|
+
case 'wnykq':
|
|
251
|
+
case 'hwktwkq':
|
|
252
|
+
case 'wsdykq':
|
|
253
|
+
return new IRControlHubAccessory_1.default(platform, accessory);
|
|
254
|
+
case 'qt':
|
|
255
|
+
platform.log.debug('early product. add switch-case at function resolveAccessoryByProductID()');
|
|
256
|
+
// eslint-disable-next-line max-len
|
|
257
|
+
platform.log.warn('use plugin options and config category to another. https://github.com/homebridge-plugins/homebridge-tuya/blob/develop_1.7.0/ADVANCED_OPTIONS.md https://github.com/homebridge-plugins/homebridge-tuya/blob/develop_1.7.0/SUPPORTED_DEVICES.md');
|
|
258
|
+
return undefined;
|
|
259
|
+
case 'infrared_tv':
|
|
260
|
+
case 'infrared_stb':
|
|
261
|
+
case 'infrared_box':
|
|
262
|
+
case 'infrared_ac':
|
|
263
|
+
case 'infrared_fan':
|
|
264
|
+
case 'infrared_light':
|
|
265
|
+
case 'infrared_amplifier':
|
|
266
|
+
case 'infrared_projector':
|
|
267
|
+
case 'infrared_waterheater':
|
|
268
|
+
case 'infrared_airpurifier':
|
|
269
|
+
case 'infrared_humidifier':
|
|
270
|
+
// Since it's a DIY, it might be better to handle it with resolveAccessoryByProductID.
|
|
271
|
+
return new IRControlHubSubAccessory_1.default(platform, accessory);
|
|
272
|
+
default:
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=AccessoryFactory.js.map
|
|
@@ -0,0 +1,305 @@
|
|
|
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
|
+
const BaseAccessory_1 = __importDefault(require("./BaseAccessory"));
|
|
7
|
+
const util_1 = require("../util/util");
|
|
8
|
+
const LightAccessory_1 = __importDefault(require("./LightAccessory"));
|
|
9
|
+
const DimmerAccessory_1 = __importDefault(require("./DimmerAccessory"));
|
|
10
|
+
const OutletAccessory_1 = __importDefault(require("./OutletAccessory"));
|
|
11
|
+
const SwitchAccessory_1 = __importDefault(require("./SwitchAccessory"));
|
|
12
|
+
const WirelessSwitchAccessory_1 = __importDefault(require("./WirelessSwitchAccessory"));
|
|
13
|
+
const SceneSwitchAccessory_1 = __importDefault(require("./SceneSwitchAccessory"));
|
|
14
|
+
const FanAccessory_1 = __importDefault(require("./FanAccessory"));
|
|
15
|
+
const GarageDoorAccessory_1 = __importDefault(require("./GarageDoorAccessory"));
|
|
16
|
+
const WindowAccessory_1 = __importDefault(require("./WindowAccessory"));
|
|
17
|
+
const WindowCoveringAccessory_1 = __importDefault(require("./WindowCoveringAccessory"));
|
|
18
|
+
const LockAccessory_1 = __importDefault(require("./LockAccessory"));
|
|
19
|
+
const ThermostatAccessory_1 = __importDefault(require("./ThermostatAccessory"));
|
|
20
|
+
const HeaterAccessory_1 = __importDefault(require("./HeaterAccessory"));
|
|
21
|
+
const HeaterAccessory_old_1 = __importDefault(require("./HeaterAccessory_old"));
|
|
22
|
+
const ValveAccessory_1 = __importDefault(require("./ValveAccessory"));
|
|
23
|
+
const ContactSensorAccessory_1 = __importDefault(require("./ContactSensorAccessory"));
|
|
24
|
+
const LeakSensorAccessory_1 = __importDefault(require("./LeakSensorAccessory"));
|
|
25
|
+
const CarbonMonoxideSensorAccessory_1 = __importDefault(require("./CarbonMonoxideSensorAccessory"));
|
|
26
|
+
const CarbonDioxideSensorAccessory_1 = __importDefault(require("./CarbonDioxideSensorAccessory"));
|
|
27
|
+
const SmokeSensorAccessory_1 = __importDefault(require("./SmokeSensorAccessory"));
|
|
28
|
+
const TemperatureHumiditySensorAccessory_1 = __importDefault(require("./TemperatureHumiditySensorAccessory"));
|
|
29
|
+
const LightSensorAccessory_1 = __importDefault(require("./LightSensorAccessory"));
|
|
30
|
+
const MotionSensorAccessory_1 = __importDefault(require("./MotionSensorAccessory"));
|
|
31
|
+
const AirQualitySensorAccessory_1 = __importDefault(require("./AirQualitySensorAccessory"));
|
|
32
|
+
const HumanPresenceSensorAccessory_1 = __importDefault(require("./HumanPresenceSensorAccessory"));
|
|
33
|
+
const HumidifierAccessory_1 = __importDefault(require("./HumidifierAccessory"));
|
|
34
|
+
const DehumidifierAccessory_1 = __importDefault(require("./DehumidifierAccessory"));
|
|
35
|
+
const DiffuserAccessory_1 = __importDefault(require("./DiffuserAccessory"));
|
|
36
|
+
const AirPurifierAccessory_1 = __importDefault(require("./AirPurifierAccessory"));
|
|
37
|
+
const ExtractionHoodAccessory_1 = __importDefault(require("./ExtractionHoodAccessory"));
|
|
38
|
+
const CameraAccessory_1 = __importDefault(require("./CameraAccessory"));
|
|
39
|
+
const SceneAccessory_1 = __importDefault(require("./SceneAccessory"));
|
|
40
|
+
const AirConditionerAccessory_1 = __importDefault(require("./AirConditionerAccessory"));
|
|
41
|
+
const IRControlHubAccessory_1 = __importDefault(require("./IRControlHubAccessory"));
|
|
42
|
+
const IRGenericAccessory_1 = __importDefault(require("./IRGenericAccessory"));
|
|
43
|
+
const IRAirConditionerAccessory_1 = __importDefault(require("./IRAirConditionerAccessory"));
|
|
44
|
+
const SecuritySystemAccessory_1 = __importDefault(require("./SecuritySystemAccessory"));
|
|
45
|
+
const VibrationSensorAccessory_1 = __importDefault(require("./VibrationSensorAccessory"));
|
|
46
|
+
const WeatherStationAccessory_1 = __importDefault(require("./WeatherStationAccessory"));
|
|
47
|
+
const DoorbellAccessory_1 = __importDefault(require("./DoorbellAccessory"));
|
|
48
|
+
const PetFeederAccessory_1 = __importDefault(require("./PetFeederAccessory"));
|
|
49
|
+
const WhiteNoiseLightAccessory_1 = __importDefault(require("./WhiteNoiseLightAccessory"));
|
|
50
|
+
const WetBulbGlobeTemperatureAccessory_1 = __importDefault(require("./WetBulbGlobeTemperatureAccessory"));
|
|
51
|
+
const IRControlHubSubAccessory_1 = __importDefault(require("./IRControlHubSubAccessory"));
|
|
52
|
+
const LocationWeatherAccessory_1 = __importDefault(require("./LocationWeatherAccessory"));
|
|
53
|
+
const TowerRackAccessory_1 = __importDefault(require("./TowerRackAccessory"));
|
|
54
|
+
class AccessoryFactory {
|
|
55
|
+
static createAccessory(platform, accessory, device) {
|
|
56
|
+
let handler;
|
|
57
|
+
handler = resolveAccessoryByProductID(platform, accessory, device.product_id)
|
|
58
|
+
|| resolveAccessoryByCategory(platform, accessory, device.category);
|
|
59
|
+
// basically use should set the handler at the switch-case
|
|
60
|
+
if (!handler) {
|
|
61
|
+
// IR Remote Control
|
|
62
|
+
if (device.isIRRemoteControl()) {
|
|
63
|
+
switch (device.remote_keys?.category_id) {
|
|
64
|
+
case 5: // AC
|
|
65
|
+
platform.log.warn('case IRAirConditionerAccessory');
|
|
66
|
+
handler = new IRAirConditionerAccessory_1.default(platform, accessory);
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
platform.log.warn('case IRGenericAccessory');
|
|
70
|
+
handler = new IRGenericAccessory_1.default(platform, accessory);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (handler && !handler.checkRequirements()) {
|
|
76
|
+
handler = undefined;
|
|
77
|
+
}
|
|
78
|
+
if (!handler) {
|
|
79
|
+
platform.log.warn(`Unsupported device: ${device.name}.`);
|
|
80
|
+
handler = new BaseAccessory_1.default(platform, accessory);
|
|
81
|
+
}
|
|
82
|
+
handler.configureServices();
|
|
83
|
+
handler.configureStatusActive();
|
|
84
|
+
handler.updateAllValues();
|
|
85
|
+
handler.initialized = true;
|
|
86
|
+
return handler;
|
|
87
|
+
}
|
|
88
|
+
static configAccessory(platform, accessory) {
|
|
89
|
+
const configs = platform.options.serviceInformationOverrides;
|
|
90
|
+
// Always sanitize existing Name/ConfiguredName loaded from persist
|
|
91
|
+
try {
|
|
92
|
+
const info = accessory.getService(platform.Service.AccessoryInformation);
|
|
93
|
+
if (info) {
|
|
94
|
+
const currentConfigured = info.getCharacteristic(platform.Characteristic.ConfiguredName).value;
|
|
95
|
+
const currentName = info.getCharacteristic(platform.Characteristic.Name).value;
|
|
96
|
+
const safeConfigured = (0, util_1.sanitizeName)(currentConfigured) ?? undefined;
|
|
97
|
+
const safeName = (0, util_1.sanitizeName)(currentName) ?? undefined;
|
|
98
|
+
if (safeName && safeName !== currentName) {
|
|
99
|
+
info.getCharacteristic(platform.Characteristic.Name).updateValue(safeName);
|
|
100
|
+
platform.log.info(`Sanitized Name: ${currentName} -> ${safeName}`);
|
|
101
|
+
}
|
|
102
|
+
if (safeConfigured && safeConfigured !== currentConfigured) {
|
|
103
|
+
info.getCharacteristic(platform.Characteristic.ConfiguredName).updateValue(safeConfigured);
|
|
104
|
+
platform.log.info(`Sanitized ConfiguredName: ${currentConfigured} -> ${safeConfigured}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
platform.log.debug('Failed to sanitize accessory name:', e);
|
|
110
|
+
}
|
|
111
|
+
if (!configs) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const sn = accessory.getService(platform.Service.AccessoryInformation)?.getCharacteristic(platform.Characteristic.SerialNumber).value;
|
|
115
|
+
configs.filter(config => config.device_id === sn).forEach(config => {
|
|
116
|
+
try {
|
|
117
|
+
const service = accessory.services[config.index];
|
|
118
|
+
if (config.manifacturer) {
|
|
119
|
+
const before = service.getCharacteristic(platform.Characteristic.Manufacturer).value;
|
|
120
|
+
service.getCharacteristic(platform.Characteristic.Manufacturer).updateValue(config.manifacturer);
|
|
121
|
+
platform.log.info(`manifacturer updated. ${before} -> ${config.manifacturer}`);
|
|
122
|
+
}
|
|
123
|
+
if (config.model) {
|
|
124
|
+
const before = service.getCharacteristic(platform.Characteristic.Model).value;
|
|
125
|
+
service.getCharacteristic(platform.Characteristic.Model).updateValue(config.model);
|
|
126
|
+
platform.log.info(`model updated. ${before} -> ${config.model}`);
|
|
127
|
+
}
|
|
128
|
+
if (config.firmwareRevision) {
|
|
129
|
+
const before = service.getCharacteristic(platform.Characteristic.FirmwareRevision).value;
|
|
130
|
+
service.getCharacteristic(platform.Characteristic.FirmwareRevision).updateValue(config.firmwareRevision);
|
|
131
|
+
platform.log.info(`firmwareRevision updated. ${before} -> ${config.firmwareRevision}`);
|
|
132
|
+
}
|
|
133
|
+
if (config.configuredName) {
|
|
134
|
+
const safe = (0, util_1.sanitizeName)(config.configuredName)
|
|
135
|
+
?? config.configuredName
|
|
136
|
+
.replace(/[^A-Za-z0-9 '\s]/g, ' ')
|
|
137
|
+
.replace(/\s+/g, ' ')
|
|
138
|
+
.trim();
|
|
139
|
+
const before = service.getCharacteristic(platform.Characteristic.ConfiguredName).value;
|
|
140
|
+
service.getCharacteristic(platform.Characteristic.Name).updateValue(safe);
|
|
141
|
+
service.getCharacteristic(platform.Characteristic.ConfiguredName).updateValue(safe);
|
|
142
|
+
platform.log.info(`configuredName updated. ${before} -> ${safe}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (_e) {
|
|
146
|
+
platform.log.error(`index out of bound.:${config.index}`);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.default = AccessoryFactory;
|
|
152
|
+
function resolveAccessoryByProductID(platform, accessory, product_id) {
|
|
153
|
+
switch (product_id) {
|
|
154
|
+
case 'scene': // see TuyaHomeDeviceManager#getSceneList
|
|
155
|
+
return new SceneAccessory_1.default(platform, accessory);
|
|
156
|
+
case 'virtual-product-id-wbgt':
|
|
157
|
+
return new WetBulbGlobeTemperatureAccessory_1.default(platform, accessory);
|
|
158
|
+
case 'virtual-product-id-weather':
|
|
159
|
+
return new LocationWeatherAccessory_1.default(platform, accessory);
|
|
160
|
+
default:
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function resolveAccessoryByCategory(platform, accessory, category) {
|
|
165
|
+
switch (category) {
|
|
166
|
+
// Lighting
|
|
167
|
+
case 'dj':
|
|
168
|
+
case 'dsd':
|
|
169
|
+
case 'xdd':
|
|
170
|
+
case 'fwd':
|
|
171
|
+
case 'dc':
|
|
172
|
+
case 'dd':
|
|
173
|
+
case 'gyd':
|
|
174
|
+
case 'tyndj':
|
|
175
|
+
case 'sxd':
|
|
176
|
+
return new LightAccessory_1.default(platform, accessory);
|
|
177
|
+
case 'tgq':
|
|
178
|
+
case 'tgkg':
|
|
179
|
+
return new DimmerAccessory_1.default(platform, accessory);
|
|
180
|
+
// Electrical Products
|
|
181
|
+
case 'dlq':
|
|
182
|
+
case 'kg':
|
|
183
|
+
case 'tdq':
|
|
184
|
+
case 'qjdcz':
|
|
185
|
+
case 'szjqr':
|
|
186
|
+
return new SwitchAccessory_1.default(platform, accessory);
|
|
187
|
+
case 'cz':
|
|
188
|
+
case 'pc':
|
|
189
|
+
case 'wkcz':
|
|
190
|
+
return new OutletAccessory_1.default(platform, accessory);
|
|
191
|
+
case 'wxkg':
|
|
192
|
+
return new WirelessSwitchAccessory_1.default(platform, accessory);
|
|
193
|
+
case 'cjkg':
|
|
194
|
+
return new SceneSwitchAccessory_1.default(platform, accessory);
|
|
195
|
+
case 'bzyd':
|
|
196
|
+
return new WhiteNoiseLightAccessory_1.default(platform, accessory);
|
|
197
|
+
// Large Home Appliances
|
|
198
|
+
case 'kt':
|
|
199
|
+
case 'ktkzq':
|
|
200
|
+
return new AirConditionerAccessory_1.default(platform, accessory);
|
|
201
|
+
// Small Home Appliances
|
|
202
|
+
case 'qn':
|
|
203
|
+
return new HeaterAccessory_1.default(platform, accessory);
|
|
204
|
+
case 'qn_old':
|
|
205
|
+
return new HeaterAccessory_old_1.default(platform, accessory);
|
|
206
|
+
case 'kj':
|
|
207
|
+
return new AirPurifierAccessory_1.default(platform, accessory);
|
|
208
|
+
case 'xxj':
|
|
209
|
+
return new DiffuserAccessory_1.default(platform, accessory);
|
|
210
|
+
case 'ckmkzq':
|
|
211
|
+
return new GarageDoorAccessory_1.default(platform, accessory);
|
|
212
|
+
case 'cl':
|
|
213
|
+
case 'clkg':
|
|
214
|
+
return new WindowCoveringAccessory_1.default(platform, accessory);
|
|
215
|
+
case 'cwwsq':
|
|
216
|
+
return new PetFeederAccessory_1.default(platform, accessory);
|
|
217
|
+
case 'mc':
|
|
218
|
+
return new WindowAccessory_1.default(platform, accessory);
|
|
219
|
+
case 'wk':
|
|
220
|
+
case 'wkf':
|
|
221
|
+
return new ThermostatAccessory_1.default(platform, accessory);
|
|
222
|
+
case 'mjj':
|
|
223
|
+
return new TowerRackAccessory_1.default(platform, accessory);
|
|
224
|
+
case 'ggq':
|
|
225
|
+
case 'sfkzq':
|
|
226
|
+
return new ValveAccessory_1.default(platform, accessory);
|
|
227
|
+
case 'jsq':
|
|
228
|
+
return new HumidifierAccessory_1.default(platform, accessory);
|
|
229
|
+
case 'cs':
|
|
230
|
+
return new DehumidifierAccessory_1.default(platform, accessory);
|
|
231
|
+
case 'fs':
|
|
232
|
+
case 'fsd':
|
|
233
|
+
case 'fskg':
|
|
234
|
+
return new FanAccessory_1.default(platform, accessory);
|
|
235
|
+
case 'yyj':
|
|
236
|
+
return new ExtractionHoodAccessory_1.default(platform, accessory);
|
|
237
|
+
// Security & Video Surveillance
|
|
238
|
+
case 'sp':
|
|
239
|
+
return new CameraAccessory_1.default(platform, accessory);
|
|
240
|
+
case 'ywbj':
|
|
241
|
+
return new SmokeSensorAccessory_1.default(platform, accessory);
|
|
242
|
+
case 'mcs':
|
|
243
|
+
return new ContactSensorAccessory_1.default(platform, accessory);
|
|
244
|
+
case 'zd':
|
|
245
|
+
return new VibrationSensorAccessory_1.default(platform, accessory);
|
|
246
|
+
case 'rqbj':
|
|
247
|
+
case 'jwbj':
|
|
248
|
+
case 'sj':
|
|
249
|
+
return new LeakSensorAccessory_1.default(platform, accessory);
|
|
250
|
+
case 'cobj':
|
|
251
|
+
case 'cocgq':
|
|
252
|
+
return new CarbonMonoxideSensorAccessory_1.default(platform, accessory);
|
|
253
|
+
case 'co2bj':
|
|
254
|
+
case 'co2cgq':
|
|
255
|
+
return new CarbonDioxideSensorAccessory_1.default(platform, accessory);
|
|
256
|
+
case 'wsdcg':
|
|
257
|
+
return new TemperatureHumiditySensorAccessory_1.default(platform, accessory);
|
|
258
|
+
case 'ldcg':
|
|
259
|
+
return new LightSensorAccessory_1.default(platform, accessory);
|
|
260
|
+
case 'pir':
|
|
261
|
+
return new MotionSensorAccessory_1.default(platform, accessory);
|
|
262
|
+
case 'pm25':
|
|
263
|
+
case 'pm2.5':
|
|
264
|
+
case 'pm25cgq':
|
|
265
|
+
case 'hjjcy':
|
|
266
|
+
return new AirQualitySensorAccessory_1.default(platform, accessory);
|
|
267
|
+
case 'hps':
|
|
268
|
+
return new HumanPresenceSensorAccessory_1.default(platform, accessory);
|
|
269
|
+
case 'ms':
|
|
270
|
+
case 'jtmspro':
|
|
271
|
+
return new LockAccessory_1.default(platform, accessory);
|
|
272
|
+
case 'mal':
|
|
273
|
+
return new SecuritySystemAccessory_1.default(platform, accessory);
|
|
274
|
+
case 'wxml':
|
|
275
|
+
return new DoorbellAccessory_1.default(platform, accessory);
|
|
276
|
+
case 'qxj':
|
|
277
|
+
return new WeatherStationAccessory_1.default(platform, accessory);
|
|
278
|
+
// IR Control
|
|
279
|
+
case 'wnykq':
|
|
280
|
+
case 'hwktwkq':
|
|
281
|
+
case 'wsdykq':
|
|
282
|
+
return new IRControlHubAccessory_1.default(platform, accessory);
|
|
283
|
+
case 'qt':
|
|
284
|
+
platform.log.debug('early product. add switch-case at function resolveAccessoryByProductID()');
|
|
285
|
+
// eslint-disable-next-line max-len
|
|
286
|
+
platform.log.warn('use plugin options and config category to another. https://github.com/homebridge-plugins/homebridge-tuya/blob/develop_1.7.0/ADVANCED_OPTIONS.md https://github.com/homebridge-plugins/homebridge-tuya/blob/develop_1.7.0/SUPPORTED_DEVICES.md');
|
|
287
|
+
return undefined;
|
|
288
|
+
case 'infrared_tv':
|
|
289
|
+
case 'infrared_stb':
|
|
290
|
+
case 'infrared_box':
|
|
291
|
+
case 'infrared_ac':
|
|
292
|
+
case 'infrared_fan':
|
|
293
|
+
case 'infrared_light':
|
|
294
|
+
case 'infrared_amplifier':
|
|
295
|
+
case 'infrared_projector':
|
|
296
|
+
case 'infrared_waterheater':
|
|
297
|
+
case 'infrared_airpurifier':
|
|
298
|
+
case 'infrared_humidifier':
|
|
299
|
+
// Since it's a DIY, it might be better to handle it with resolveAccessoryByProductID.
|
|
300
|
+
return new IRControlHubSubAccessory_1.default(platform, accessory);
|
|
301
|
+
default:
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=AccessoryFactory.js.map
|