@homebridge-plugins/homebridge-tuya 3.0.0-beta.2 → 3.0.0-beta.21
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/README.md +354 -142
- package/config.schema.json +1221 -893
- package/dist/cloud/api/TuyaOpenAPI.js +108 -60
- package/dist/cloud/api/TuyaOpenAPI.js.map +1 -1
- package/dist/cloud/api/TuyaOpenMQ.js +45 -22
- package/dist/cloud/api/TuyaOpenMQ.js.map +1 -1
- package/dist/cloud/device/{TuyaDeviceManager.js → TuyaCloudDeviceManager.js} +146 -96
- package/dist/cloud/device/TuyaCloudDeviceManager.js.map +1 -0
- package/dist/cloud/device/TuyaCustomDeviceManager.js +75 -5
- package/dist/cloud/device/TuyaCustomDeviceManager.js.map +1 -1
- package/dist/cloud/device/TuyaDevice.js.map +1 -1
- package/dist/cloud/device/TuyaHomeDeviceManager.js +81 -13
- package/dist/cloud/device/TuyaHomeDeviceManager.js.map +1 -1
- package/dist/config.js +26 -5
- package/dist/config.js.map +1 -1
- package/dist/local/DynamicChildDiscovery.js +2 -1
- package/dist/local/DynamicChildDiscovery.js.map +1 -1
- package/dist/local/LocalDevice.js +16 -3
- package/dist/local/LocalDevice.js.map +1 -1
- package/dist/local/LocalDeviceManager.js +361 -164
- package/dist/local/LocalDeviceManager.js.map +1 -1
- package/dist/local/TuyaDiscovery.js +16 -7
- package/dist/local/TuyaDiscovery.js.map +1 -1
- package/dist/local/ZigbeeGatewayDetection.js +7 -4
- package/dist/local/ZigbeeGatewayDetection.js.map +1 -1
- package/dist/local/protocol/ProtocolUtilities.js +34 -17
- package/dist/local/protocol/ProtocolUtilities.js.map +1 -1
- package/dist/local/protocol/ProtocolV31V32.js +4 -2
- package/dist/local/protocol/ProtocolV31V32.js.map +1 -1
- package/dist/local/protocol/ProtocolV33.js +4 -2
- package/dist/local/protocol/ProtocolV33.js.map +1 -1
- package/dist/local/protocol/ProtocolV34.js +10 -5
- package/dist/local/protocol/ProtocolV34.js.map +1 -1
- package/dist/local/protocol/ProtocolV35.js +8 -4
- package/dist/local/protocol/ProtocolV35.js.map +1 -1
- package/dist/platform.js +253 -493
- package/dist/platform.js.map +1 -1
- package/dist/settings.js +0 -2
- package/dist/settings.js.map +1 -1
- package/dist/shared/TuyaDeviceManager.js +147 -0
- package/dist/shared/TuyaDeviceManager.js.map +1 -0
- package/dist/shared/TuyaHybridDeviceManager.js +215 -0
- package/dist/shared/TuyaHybridDeviceManager.js.map +1 -0
- package/dist/shared/accessory/AccessoryFactory.js +350 -0
- package/dist/shared/accessory/AccessoryFactory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/AirConditionerAccessory.js +21 -15
- package/dist/shared/accessory/AirConditionerAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js.map +1 -1
- package/dist/shared/accessory/AirQualitySensorAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/BaseAccessory.js +16 -95
- package/dist/shared/accessory/BaseAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/BlindsAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/CameraAccessory.js +2 -2
- package/dist/shared/accessory/CameraAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/DiffuserAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/DimmerAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/DoorbellAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/FanAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/GarageDoorAccessory.js +19 -2
- package/dist/shared/accessory/GarageDoorAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/HeaterAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js.map +1 -1
- package/dist/shared/accessory/HumanPresenceSensorAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/HumidifierAccessory.js.map +1 -1
- package/dist/shared/accessory/IRAdapter.js +167 -0
- package/dist/shared/accessory/IRAdapter.js.map +1 -0
- package/dist/shared/accessory/IRAirConditionerAccessory.js.map +1 -0
- package/dist/shared/accessory/IRControlHubAccessory.js.map +1 -0
- package/dist/shared/accessory/IRControlHubSubAccessory.js.map +1 -0
- package/dist/shared/accessory/IRFanAccessory.js +90 -0
- package/dist/shared/accessory/IRFanAccessory.js.map +1 -0
- package/dist/shared/accessory/IRGenericAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/LightAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/LightSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/LocationWeatherAccessory.js +1 -1
- package/dist/shared/accessory/LocationWeatherAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/LockAccessory.js +3 -3
- package/dist/shared/{accessories → accessory}/LockAccessory.js.map +1 -1
- package/dist/shared/accessory/MotionSensorAccessory.js.map +1 -0
- package/dist/shared/accessory/OutletAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/PetFeederAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/SceneAccessory.js +1 -1
- package/dist/shared/accessory/SceneAccessory.js.map +1 -0
- package/dist/shared/accessory/SceneSwitchAccessory.js.map +1 -0
- package/dist/shared/accessory/SecuritySystemAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/SwitchAccessory.js +1 -45
- package/dist/shared/accessory/SwitchAccessory.js.map +1 -0
- package/dist/shared/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/ThermostatAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/TowerRackAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/ValveAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js.map +1 -1
- package/dist/shared/accessory/WeatherStationAccessory.js.map +1 -0
- package/dist/shared/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/WhiteNoiseLightAccessory.js +1 -0
- package/dist/shared/accessory/WhiteNoiseLightAccessory.js.map +1 -0
- package/dist/shared/accessory/WindowAccessory.js.map +1 -0
- package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js.map +1 -1
- package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js.map +1 -1
- package/dist/shared/accessory/characteristic/Active.js.map +1 -0
- package/dist/shared/accessory/characteristic/AirQuality.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/CurrentRelativeHumidity.js +3 -0
- package/dist/shared/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
- package/dist/shared/accessory/characteristic/CurrentTemperature.js.map +1 -0
- package/dist/shared/accessory/characteristic/CurrentWeather.js.map +1 -0
- package/dist/shared/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/CurrentWetBulbGlobeTemperature.js +3 -2
- package/dist/shared/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/EnergyUsage.js +0 -5
- package/dist/shared/accessory/characteristic/EnergyUsage.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/Light.js +28 -5
- package/dist/shared/accessory/characteristic/Light.js.map +1 -0
- package/dist/shared/accessory/characteristic/LightSensor.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/LockPhysicalControls.js +3 -0
- package/dist/shared/accessory/characteristic/LockPhysicalControls.js.map +1 -0
- package/dist/shared/accessory/characteristic/MotionDetected.js.map +1 -0
- package/dist/shared/accessory/characteristic/Name.js.map +1 -0
- package/dist/shared/accessory/characteristic/OccupancyDetected.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/On.js +1 -0
- package/dist/shared/accessory/characteristic/On.js.map +1 -0
- package/dist/shared/accessory/characteristic/OutletInUse.js.map +1 -0
- package/dist/shared/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/RelativeHumidityDehumidifierThreshold.js +3 -0
- package/dist/shared/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
- package/dist/shared/accessory/characteristic/RotationSpeed.js.map +1 -0
- package/dist/shared/accessory/characteristic/SecuritySystemState.js.map +1 -0
- package/dist/shared/{accessories → accessory}/characteristic/SwingMode.js +3 -0
- package/dist/shared/accessory/characteristic/SwingMode.js.map +1 -0
- package/dist/shared/accessory/characteristic/TargetTemperature.js.map +1 -0
- package/dist/shared/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
- package/dist/shared/util/ConfigHash.js +2 -2
- package/dist/shared/util/ConfigHash.js.map +1 -1
- package/dist/shared/util/ConfigMigrator.js +222 -0
- package/dist/shared/util/ConfigMigrator.js.map +1 -0
- package/dist/shared/util/FfmpegStreamingProcess.js +62 -0
- package/dist/shared/util/FfmpegStreamingProcess.js.map +1 -1
- package/dist/shared/util/InfraredTool.js +0 -2
- package/dist/shared/util/InfraredTool.js.map +1 -1
- package/dist/shared/util/Logger.js +85 -10
- package/dist/shared/util/Logger.js.map +1 -1
- package/dist/shared/util/TuyaStreamDelegate.js +194 -97
- package/dist/shared/util/TuyaStreamDelegate.js.map +1 -1
- package/dist/shared/util/util.js +59 -4
- package/dist/shared/util/util.js.map +1 -1
- package/docs/ADVANCED_OPTIONS.md +603 -0
- package/docs/CONFIG_GUIDE.md +616 -0
- package/docs/Get-Local-Keys-for-Your-Devices.md +246 -0
- package/{SUPPORTED_DEVICES.md → docs/SUPPORTED_DEVICES.md} +24 -3
- package/eslint.config.mjs +0 -1
- package/{jest.config.js → jest.config.ts} +5 -2
- package/package.json +12 -9
- package/test/ConfigMigrator.test.ts +1060 -0
- package/test/Logger.test.ts +482 -0
- package/test/accessoryFactory.data.test.ts +172 -0
- package/test/accessoryFactory.test.ts +64 -35
- package/test/airConditioner.test.ts +742 -0
- package/test/config.test.ts +17 -13
- package/test/custom.test.ts +2 -2
- package/test/errorHandling.test.ts +12 -12
- package/test/home.test.ts +1 -1
- package/test/hybridDeviceManager.test.ts +808 -0
- package/test/light.test.ts +250 -0
- package/test/localDevice.test.ts +21 -50
- package/test/localDeviceManager.behavior.test.ts +196 -31
- package/test/localDeviceManager.test.ts +124 -41
- package/test/mqttMessages.test.ts +33 -14
- package/test/platform.test.ts +337 -814
- package/test/platform.validation.local.test.ts +58 -119
- package/test/tuyaCustomDeviceManager.test.ts +106 -16
- package/test/tuyaDeviceManager.test.ts +636 -639
- package/test/tuyaDiscovery.test.ts +21 -33
- package/test/tuyaHomeDeviceManager.test.ts +109 -18
- package/test/tuyaOpenAPI.test.ts +25 -44
- package/test/tuyaOpenMQ.test.ts +15 -23
- package/test/util.test.ts +107 -7
- package/test/zigbee/LocalDevice.zigbee.test.ts +14 -18
- package/test/zigbee/LocalDeviceManager.cloud-discovery.test.ts +19 -20
- package/test/zigbee/LocalDeviceManager.zigbee.reconnect.test.ts +19 -20
- package/test/zigbee/LocalDeviceManager.zigbee.test.ts +73 -35
- package/test/zigbee/ZigbeeGatewayDetection.test.ts +2 -2
- package/ADVANCED_OPTIONS.md +0 -267
- package/dist/cloud/device/TuyaDeviceManager.js.map +0 -1
- package/dist/local/CloudLocalReconciliation.js +0 -180
- package/dist/local/CloudLocalReconciliation.js.map +0 -1
- package/dist/shared/AccessoryFactory.js +0 -276
- package/dist/shared/AccessoryFactory.js.map +0 -1
- package/dist/shared/accessories/AccessoryFactory.js +0 -305
- package/dist/shared/accessories/AccessoryFactory.js.map +0 -1
- package/dist/shared/accessories/AirConditionerAccessory.js.map +0 -1
- package/dist/shared/accessories/AirQualitySensorAccessory.js.map +0 -1
- package/dist/shared/accessories/BaseAccessory.js.map +0 -1
- package/dist/shared/accessories/CameraAccessory.js.map +0 -1
- package/dist/shared/accessories/GarageDoorAccessory.js.map +0 -1
- package/dist/shared/accessories/HumanPresenceSensorAccessory.js.map +0 -1
- package/dist/shared/accessories/IRAirConditionerAccessory.js.map +0 -1
- package/dist/shared/accessories/IRControlHubAccessory.js.map +0 -1
- package/dist/shared/accessories/IRControlHubSubAccessory.js.map +0 -1
- package/dist/shared/accessories/IRGenericAccessory.js.map +0 -1
- package/dist/shared/accessories/LocationWeatherAccessory.js.map +0 -1
- package/dist/shared/accessories/MotionSensorAccessory.js.map +0 -1
- package/dist/shared/accessories/OutletAccessory.js.map +0 -1
- package/dist/shared/accessories/SceneAccessory.js.map +0 -1
- package/dist/shared/accessories/SceneSwitchAccessory.js.map +0 -1
- package/dist/shared/accessories/SecuritySystemAccessory.js.map +0 -1
- package/dist/shared/accessories/SwitchAccessory.js.map +0 -1
- package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js.map +0 -1
- package/dist/shared/accessories/WeatherStationAccessory.js.map +0 -1
- package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js.map +0 -1
- package/dist/shared/accessories/WhiteNoiseLightAccessory.js.map +0 -1
- package/dist/shared/accessories/WindowAccessory.js.map +0 -1
- package/dist/shared/accessories/characteristic/Active.js.map +0 -1
- package/dist/shared/accessories/characteristic/AirQuality.js.map +0 -1
- package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js.map +0 -1
- package/dist/shared/accessories/characteristic/CurrentTemperature.js.map +0 -1
- package/dist/shared/accessories/characteristic/CurrentWeather.js.map +0 -1
- package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js.map +0 -1
- package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js.map +0 -1
- package/dist/shared/accessories/characteristic/EnergyUsage.js.map +0 -1
- package/dist/shared/accessories/characteristic/Light.js.map +0 -1
- package/dist/shared/accessories/characteristic/LightSensor.js.map +0 -1
- package/dist/shared/accessories/characteristic/LockPhysicalControls.js.map +0 -1
- package/dist/shared/accessories/characteristic/MotionDetected.js.map +0 -1
- package/dist/shared/accessories/characteristic/Name.js.map +0 -1
- package/dist/shared/accessories/characteristic/OccupancyDetected.js.map +0 -1
- package/dist/shared/accessories/characteristic/On.js.map +0 -1
- package/dist/shared/accessories/characteristic/OutletInUse.js.map +0 -1
- package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js.map +0 -1
- package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js.map +0 -1
- package/dist/shared/accessories/characteristic/RotationSpeed.js.map +0 -1
- package/dist/shared/accessories/characteristic/SecuritySystemState.js.map +0 -1
- package/dist/shared/accessories/characteristic/SwingMode.js.map +0 -1
- package/dist/shared/accessories/characteristic/TargetTemperature.js.map +0 -1
- package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js.map +0 -1
- package/test/zigbee/CloudLocalReconciliation.test.ts +0 -284
- package/tuya-local-configs/dev-1.hash +0 -1
- package/tuya-local-configs/device1.hash +0 -1
- package/wiki/Get-Local-Keys-for-Your-Devices.md +0 -85
- /package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/AirQualitySensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/BlindsAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/DiffuserAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/DimmerAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/DoorbellAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/FanAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/HeaterAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js +0 -0
- /package/dist/shared/{accessories → accessory}/HumanPresenceSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/HumidifierAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/IRAirConditionerAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/IRControlHubAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/IRControlHubSubAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/IRGenericAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/LightAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/LightSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/MotionSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/OutletAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/PetFeederAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/SceneSwitchAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/SecuritySystemAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/TemperatureHumiditySensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/ThermostatAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/TowerRackAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/ValveAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/WeatherStationAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/WetBulbGlobeTemperatureAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/WindowAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/Active.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/AirQuality.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/CurrentTemperature.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeather.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeatherByOpenMeteo.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/LightSensor.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/MotionDetected.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/Name.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/OccupancyDetected.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/OutletInUse.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/ProgrammableSwitchEvent.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/RotationSpeed.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/SecuritySystemState.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/TargetTemperature.js +0 -0
- /package/dist/shared/{accessories → accessory}/characteristic/TemperatureDisplayUnits.js +0 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Get Local Keys for Your Devices
|
|
2
|
+
|
|
3
|
+
This guide walks you through retrieving your Tuya device local keys, which are required for Local mode communication.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Quick Summary
|
|
8
|
+
|
|
9
|
+
- 🔑 **Local Key:** A 16-character AES encryption key for each device
|
|
10
|
+
- 📱 **Required for:** Local mode (LAN communication without cloud)
|
|
11
|
+
- ⏰ **Time to complete:** ~15 minutes
|
|
12
|
+
- 💰 **Cost:** Free (uses Tuya's free trial API)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
Before you start, ensure:
|
|
19
|
+
- ✅ All devices are added to Tuya Smart app
|
|
20
|
+
- ✅ You have a Tuya/SmartLife app account
|
|
21
|
+
- ✅ Access to the [Tuya IoT Platform](https://iot.tuya.com)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Step-by-Step Guide
|
|
26
|
+
|
|
27
|
+
### Step 1: Add Devices to Tuya Smart App
|
|
28
|
+
|
|
29
|
+
First, ensure all your smart devices are added to the Tuya Smart app.
|
|
30
|
+
|
|
31
|
+
**Download the app:**
|
|
32
|
+
- [iOS](https://apps.apple.com/app/tuya-smart/id1034649547)
|
|
33
|
+
- [Android](https://play.google.com/store/apps/details?id=com.tuya.smart)
|
|
34
|
+
|
|
35
|
+
**Add devices:**
|
|
36
|
+
1. Open the Tuya Smart app
|
|
37
|
+
2. Tap the **+** button to add a new device
|
|
38
|
+
3. Follow the app's instructions to connect each device
|
|
39
|
+
4. Note the device names for later reference
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
### Step 2: Create Tuya IoT Account
|
|
44
|
+
|
|
45
|
+
1. Go to [Tuya IoT Platform](https://iot.tuya.com)
|
|
46
|
+
2. Click **Sign Up** in the top right
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
3. Fill in your information:
|
|
51
|
+
- Email address
|
|
52
|
+
- Password
|
|
53
|
+
- Company name (can be anything)
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
4. Check "Agree to Terms"
|
|
58
|
+
5. Click **Agree**
|
|
59
|
+
6. You'll receive a verification code via email — enter it
|
|
60
|
+
7. Log in to your account
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### Step 3: Create Cloud Project
|
|
65
|
+
|
|
66
|
+
1. Once logged in, click **Cloud** in the left sidebar
|
|
67
|
+
2. Click **Projects**
|
|
68
|
+
3. Under **TRIAL EDITION**, click **Free Trial**
|
|
69
|
+
|
|
70
|
+

|
|
71
|
+
|
|
72
|
+
4. A new tab will open — click **Buy Now** (don't worry, it's free)
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
5. Close any popup tabs for "Tuya Value Added Service"
|
|
77
|
+
6. Back in the original tab, click **Subscribed** to refresh
|
|
78
|
+
7. Go back to **Cloud** → **Projects** if needed
|
|
79
|
+
8. Click **Create**
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### Step 4: Configure Project
|
|
84
|
+
|
|
85
|
+
When creating your project:
|
|
86
|
+
|
|
87
|
+
1. **Edition:** Select "**Smart Home PAAS**"
|
|
88
|
+
2. **Region:** Select your region (this is **important** — affects device access):
|
|
89
|
+
- 🇺🇸 **US** = United States
|
|
90
|
+
- 🇪🇺 **EU** = Europe
|
|
91
|
+
- 🇨🇳 **CN** = China
|
|
92
|
+
- 🇮🇳 **IN** = India
|
|
93
|
+
- See [Data Center Mapping](https://developer.tuya.com/en/docs/iot/oem-app-data-center-distributed?id=Kafi0ku9l07qb) or [Countries Regions and Tuya Data Center](https://github.com/tuya/tuya-home-assistant/wiki/Countries-Regions-and-Tuya-Data-Center) for your region
|
|
94
|
+
|
|
95
|
+
3. Click **Create**
|
|
96
|
+
|
|
97
|
+

|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### Step 5: Subscribe to APIs
|
|
102
|
+
|
|
103
|
+
You need to subscribe to APIs to access device information.
|
|
104
|
+
|
|
105
|
+
1. From your project, go to **Service API**
|
|
106
|
+
2. Click **Go to Authorize** or **Authorization**
|
|
107
|
+
3. Subscribe to these services:
|
|
108
|
+
- ✅ **Authorization Token Management** (required)
|
|
109
|
+
- ✅ **IoT Core** (required)
|
|
110
|
+
- ✅ **Device Status Notification** (optional but recommended)
|
|
111
|
+
|
|
112
|
+
4. Click **Authorize** for the recommended APIs
|
|
113
|
+
|
|
114
|
+

|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### Step 6: Link Your Tuya App Account
|
|
119
|
+
|
|
120
|
+
1. From your project, go to **Devices Panel** or **Link Devices**
|
|
121
|
+
2. Click **Link Tuya App Account** or **Add App Account**
|
|
122
|
+
|
|
123
|
+

|
|
124
|
+
|
|
125
|
+
3. Scan the QR code with your Tuya Smart app:
|
|
126
|
+
- Open Tuya Smart app
|
|
127
|
+
- Tap **Me** (bottom right)
|
|
128
|
+
- Tap the **Scan** icon
|
|
129
|
+
- Scan the QR code shown on the IoT Platform
|
|
130
|
+
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
4. Confirm the sign-in in your phone's Tuya app
|
|
134
|
+
5. Wait for confirmation on the web page
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### Step 7: Find Device ID
|
|
139
|
+
|
|
140
|
+
1. Go to **Devices Panel** → **All Devices** (or **Link Devices** → **Linked Devices**)
|
|
141
|
+
2. You should see all your linked devices
|
|
142
|
+
3. Find your device in the list
|
|
143
|
+
4. Copy the **Device ID** (usually a long hex string like `bf1234567890abcd`)
|
|
144
|
+
|
|
145
|
+

|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### Step 8: Retrieve Local Key
|
|
150
|
+
|
|
151
|
+
Now use the API to get your device's local key.
|
|
152
|
+
|
|
153
|
+
1. In the left sidebar, hover over **Cloud** and click **API Explorer**
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
2. In the search box, type `"get device information"` (note: search for the one WITHOUT "the")
|
|
158
|
+
- It should be under **Device Management** or **General Devices management** section
|
|
159
|
+
- **Do NOT** use "Get _the_ device information" — it won't work
|
|
160
|
+
|
|
161
|
+
3. Click on the correct endpoint
|
|
162
|
+
4. Paste your device ID into the **device_id** field
|
|
163
|
+
5. Click **Submit Request**
|
|
164
|
+
|
|
165
|
+
6. In the **Response** section, look for the `local_key` property
|
|
166
|
+
- This is your 16-character local key
|
|
167
|
+
|
|
168
|
+

|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### Step 9: Repeat for Other Devices
|
|
173
|
+
|
|
174
|
+
Repeat Steps 7-8 for each device you want to use in Local mode.
|
|
175
|
+
|
|
176
|
+
**Create a spreadsheet** to keep track:
|
|
177
|
+
|
|
178
|
+
| Device Name | Device ID | Local Key | Protocol Version |
|
|
179
|
+
|-------------|-----------|-----------|-----------------|
|
|
180
|
+
| Living Room Light | `bf1234567890abcd` | `0123456789abcdef` | 3.4 |
|
|
181
|
+
| Kitchen Plug | `cd0987654321dcba` | `fedcba9876543210` | 3.3 |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Using Your Local Keys
|
|
186
|
+
|
|
187
|
+
Once you have your local keys, add them to your Homebridge config in Local or Both mode:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"platform": "TuyaPlatform",
|
|
192
|
+
"mode": "local",
|
|
193
|
+
"local": {
|
|
194
|
+
"autoDiscoverDevices": true,
|
|
195
|
+
"devices": [
|
|
196
|
+
{
|
|
197
|
+
"tuyaDeviceId": "bf1234567890abcd",
|
|
198
|
+
"tuyaKey": "0123456789abcdef",
|
|
199
|
+
"name": "Living Room Light"
|
|
200
|
+
}
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Troubleshooting
|
|
209
|
+
|
|
210
|
+
### "Device not found in API Explorer"
|
|
211
|
+
|
|
212
|
+
**Solution:**
|
|
213
|
+
- Ensure device is linked in **Devices Panel** → **All Devices**
|
|
214
|
+
- Check that you selected the correct project and region
|
|
215
|
+
- Try refreshing the page and searching again
|
|
216
|
+
|
|
217
|
+
### "API Explorer returns empty response"
|
|
218
|
+
|
|
219
|
+
**Solution:**
|
|
220
|
+
- Verify you used the correct endpoint ("Get device information" NOT "Get _the_ device information")
|
|
221
|
+
- Ensure the device ID is copied correctly (no extra spaces)
|
|
222
|
+
- Check that the API is subscribed
|
|
223
|
+
|
|
224
|
+
### "Local key is invalid format"
|
|
225
|
+
|
|
226
|
+
**Solution:**
|
|
227
|
+
- Local keys should be exactly **16 characters**
|
|
228
|
+
- Don't confuse with device ID (which is longer)
|
|
229
|
+
- Copy the entire value from the `local_key` field in the API response
|
|
230
|
+
|
|
231
|
+
### "Can't find the device list in API"
|
|
232
|
+
|
|
233
|
+
**Solution:**
|
|
234
|
+
- Make sure you've linked your Tuya app account to the project
|
|
235
|
+
- Go back to **Devices Panel** and verify devices appear there first
|
|
236
|
+
- If no devices appear, you may need to check your project's region setting
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Next Steps
|
|
242
|
+
|
|
243
|
+
Once you have your local keys:
|
|
244
|
+
1. Add them to your [CONFIG_GUIDE.md](./CONFIG_GUIDE.md) in Local or Both mode
|
|
245
|
+
2. Restart Homebridge
|
|
246
|
+
3. Your devices should appear in HomeKit
|
|
@@ -1,9 +1,30 @@
|
|
|
1
1
|
# Supported Tuya Devices
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
https://developer.tuya.com/docs/iot/standarddescription?id=K9i5ql6waswzq
|
|
3
|
+
This plugin supports **60+ device categories** from Tuya's ecosystem. Use this page to find your device's category code and verify HomeKit service support.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## How to Use This Guide
|
|
8
|
+
|
|
9
|
+
1. **Find your device** — Locate it in the table by name or category
|
|
10
|
+
2. **Check the code** — Note the category code (e.g., `dj`, `kg`, `ms`)
|
|
11
|
+
3. **Verify support** — ✅ = supported, ❌ = not yet supported
|
|
12
|
+
4. **For unsupported devices** — See [ADVANCED_OPTIONS.md](./ADVANCED_OPTIONS.md) for custom mappings
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Table Legend
|
|
17
|
+
|
|
18
|
+
| Column | Meaning |
|
|
19
|
+
|--------|---------|
|
|
20
|
+
| Name | English device name |
|
|
21
|
+
| Name (zh) | Chinese device name |
|
|
22
|
+
| Code | Tuya category code (use in device overrides) |
|
|
23
|
+
| Homebridge Service | HomeKit accessory type |
|
|
24
|
+
| Supported | ✅ = supported, ❌ = not supported |
|
|
25
|
+
| Links | Link to official Tuya documentation |
|
|
26
|
+
|
|
27
|
+
**Reference:** [Tuya Standard Instruction Set](https://developer.tuya.com/docs/iot/standarddescription?id=K9i5ql6waswzq)
|
|
7
28
|
|
|
8
29
|
## Lighting
|
|
9
30
|
|
package/eslint.config.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { JestConfigWithTsJest } from 'ts-jest';
|
|
2
|
+
|
|
3
|
+
const config: JestConfigWithTsJest = {
|
|
3
4
|
preset: 'ts-jest',
|
|
4
5
|
testEnvironment: 'node',
|
|
5
6
|
moduleNameMapper: {
|
|
@@ -9,3 +10,5 @@ module.exports = {
|
|
|
9
10
|
'^@homebridge/camera-utils$': '<rootDir>/test/__mocks__/@homebridge-camera-utils.js',
|
|
10
11
|
},
|
|
11
12
|
};
|
|
13
|
+
|
|
14
|
+
export default config;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homebridge-plugins/homebridge-tuya",
|
|
3
3
|
"displayName": "Homebridge Tuya",
|
|
4
|
-
"version": "3.0.0-beta.
|
|
4
|
+
"version": "3.0.0-beta.21",
|
|
5
5
|
"description": "Unified Homebridge Tuya plugin supporting both Tuya Cloud (REST/MQTT) and Tuya Local (direct LAN TCP) communication.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
}
|
|
20
20
|
],
|
|
21
21
|
"engines": {
|
|
22
|
-
"homebridge": "^1.8.0 || ^2.0.0
|
|
22
|
+
"homebridge": "^1.8.0 || ^2.0.0",
|
|
23
23
|
"node": "^20 || ^22 || ^24 || ^25"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"homebridge": "^1.8.0 || ^2.0.0
|
|
26
|
+
"homebridge": "^1.8.0 || ^2.0.0"
|
|
27
27
|
},
|
|
28
28
|
"main": "dist/index.js",
|
|
29
29
|
"scripts": {
|
|
30
30
|
"check": "npm install && npm outdated",
|
|
31
31
|
"lint": "eslint src/**/*.ts",
|
|
32
32
|
"lint:fix": "eslint src/**/*.ts --fix",
|
|
33
|
-
"test": "jest",
|
|
33
|
+
"test": "jest --detectOpenHandles",
|
|
34
34
|
"coverage": "npm test -- --coverage",
|
|
35
35
|
"watch": "npm run build && npm link && nodemon",
|
|
36
36
|
"launch": "tsc && homebridge -I -D",
|
|
@@ -47,21 +47,24 @@
|
|
|
47
47
|
"color-convert": "^3.1.3",
|
|
48
48
|
"jsonschema": "^1.5.0",
|
|
49
49
|
"kelvin-to-rgb": "^1.0.2",
|
|
50
|
-
"
|
|
50
|
+
"lodash": "^4.18.1",
|
|
51
|
+
"mqtt": "^5.15.1",
|
|
52
|
+
"uuid": "^11.1.1"
|
|
51
53
|
},
|
|
52
54
|
"devDependencies": {
|
|
53
55
|
"@eslint/js": "^10.0.1",
|
|
54
56
|
"@types/color-convert": "^2.0.4",
|
|
55
57
|
"@types/jest": "^30.0.0",
|
|
56
|
-
"@types/
|
|
58
|
+
"@types/lodash": "^4.17.24",
|
|
59
|
+
"@types/node": "^25.9.4",
|
|
57
60
|
"@typescript-eslint/eslint-plugin": "^8.58.2",
|
|
58
61
|
"@typescript-eslint/parser": "^8.58.2",
|
|
59
62
|
"eslint": "^10.2.1",
|
|
60
|
-
"homebridge": "^2.0.0
|
|
61
|
-
"jest": "^30.
|
|
63
|
+
"homebridge": "^2.0.0",
|
|
64
|
+
"jest": "^30.4.2",
|
|
62
65
|
"nodemon": "^3.1.14",
|
|
63
66
|
"rimraf": "^6.1.3",
|
|
64
|
-
"ts-jest": "^29.4.
|
|
67
|
+
"ts-jest": "^29.4.11",
|
|
65
68
|
"ts-node": "^10.9.2",
|
|
66
69
|
"typescript": "^5.9.3"
|
|
67
70
|
},
|