@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,616 @@
|
|
|
1
|
+
# Configuration Guide
|
|
2
|
+
|
|
3
|
+
This guide covers all configuration options for the Homebridge Tuya plugin. Use the Homebridge Web UI for easier configuration, or edit `config.json` directly.
|
|
4
|
+
|
|
5
|
+
**Table of Contents:**
|
|
6
|
+
1. [Connection Modes](#connection-modes)
|
|
7
|
+
2. [Cloud Setup](#cloud-setup)
|
|
8
|
+
3. [Local Setup](#local-setup)
|
|
9
|
+
4. [Both Mode](#both-mode)
|
|
10
|
+
5. [Common Settings](#common-settings)
|
|
11
|
+
6. [Camera Settings](#camera-settings)
|
|
12
|
+
7. [Complete Examples](#complete-examples)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Connection Modes
|
|
17
|
+
|
|
18
|
+
Choose one of three connection modes:
|
|
19
|
+
|
|
20
|
+
| Mode | Best For | Requirements | Features |
|
|
21
|
+
|------|----------|--------------|----------|
|
|
22
|
+
| `cloud` | Remote access, full features | Tuya IoT account | Scenes, automations, remote control |
|
|
23
|
+
| `local` | Privacy, fast response | Local network | Direct device control, no cloud |
|
|
24
|
+
| `both` | Reliability & performance | Both configs | Local-first with cloud fallback |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Cloud Setup
|
|
29
|
+
|
|
30
|
+
### Prerequisites
|
|
31
|
+
|
|
32
|
+
1. **Tuya app account** — Add your devices to the Tuya Smart app first
|
|
33
|
+
2. **Tuya IoT Platform account** — Free trial at [iot.tuya.com](https://iot.tuya.com)
|
|
34
|
+
3. **Cloud project** — Create and configure a project
|
|
35
|
+
4. **API credentials** — Access ID and Access Key
|
|
36
|
+
5. **Required API subscriptions** — See below
|
|
37
|
+
|
|
38
|
+
### Step-by-Step Setup
|
|
39
|
+
|
|
40
|
+
#### 1. Create Tuya IoT Platform Account
|
|
41
|
+
|
|
42
|
+
1. Go to [Tuya IoT Platform](https://iot.tuya.com) and sign up
|
|
43
|
+
2. Verify your email and log in
|
|
44
|
+
3. Complete your company profile (use any name)
|
|
45
|
+
|
|
46
|
+
#### 2. Create Cloud Project
|
|
47
|
+
|
|
48
|
+
1. Navigate to **Cloud** → **Projects**
|
|
49
|
+
2. Click **Free Trial** under **TRIAL EDITION**
|
|
50
|
+
3. Click **Buy Now** (free trial)
|
|
51
|
+
4. Close the value-added services tab
|
|
52
|
+
5. Go back to **Cloud** → **Projects**
|
|
53
|
+
6. Click **Create** and select:
|
|
54
|
+
- **Edition:** Smart Home PAAS (PAAS Edition)
|
|
55
|
+
- **Region:** Select your data center region ([View mapping](https://developer.tuya.com/en/docs/iot/oem-app-data-center-distributed?id=Kafi0ku9l07qb))
|
|
56
|
+
7. Click **Create**
|
|
57
|
+
|
|
58
|
+
#### 3. Link Your Tuya App Account
|
|
59
|
+
|
|
60
|
+
1. Go to your project → **Devices Panel**
|
|
61
|
+
2. Click **Link Tuya App Account**
|
|
62
|
+
3. Scan the QR code with your Tuya Smart app or enter credentials
|
|
63
|
+
4. Select the account and home to link
|
|
64
|
+
|
|
65
|
+
#### 4. Subscribe to Required APIs
|
|
66
|
+
|
|
67
|
+
1. Go to your project → **Service API**
|
|
68
|
+
2. Click **Go to Authorize**
|
|
69
|
+
3. Subscribe to these services:
|
|
70
|
+
- ✅ **Authorization Token Management** (required)
|
|
71
|
+
- ✅ **Device Status Notification** (required)
|
|
72
|
+
- ✅ **IoT Core** (required)
|
|
73
|
+
- ✅ **IoT Video Live Stream** (for cameras)
|
|
74
|
+
- ✅ **Smart Home Scene Linkage** (for scenes)
|
|
75
|
+
- ✅ **Smart Lock Open Service** (for door locks)
|
|
76
|
+
- ✅ **IR Control Hub Open Service** (for IR remotes)
|
|
77
|
+
- ✅ **Industry Project Client Service** (Custom project only)
|
|
78
|
+
|
|
79
|
+
#### 5. Get Your Credentials
|
|
80
|
+
|
|
81
|
+
1. Go back to your project overview
|
|
82
|
+
2. Copy your:
|
|
83
|
+
- **Access ID** (API ID)
|
|
84
|
+
- **Access Key** (API Secret)
|
|
85
|
+
3. Note your **endpoint** URL based on your region
|
|
86
|
+
|
|
87
|
+
### Configuration: Smart Home Project (projectType: "2")
|
|
88
|
+
|
|
89
|
+
**Most users should use this project type.**
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"platform": "TuyaPlatform",
|
|
94
|
+
"name": "Tuya",
|
|
95
|
+
"mode": "cloud",
|
|
96
|
+
"options": {
|
|
97
|
+
"projectType": "2",
|
|
98
|
+
"accessId": "YOUR_ACCESS_ID",
|
|
99
|
+
"accessKey": "YOUR_ACCESS_KEY",
|
|
100
|
+
"countryCode": 1,
|
|
101
|
+
"username": "your_tuya_email@example.com",
|
|
102
|
+
"password": "your_tuya_password",
|
|
103
|
+
"appSchema": "tuyaSmart",
|
|
104
|
+
"debug": false
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Field Details:**
|
|
110
|
+
|
|
111
|
+
| Field | Required | Description | Example |
|
|
112
|
+
|-------|----------|-------------|---------|
|
|
113
|
+
| `projectType` | ✅ | Must be `"2"` for Smart Home | `"2"` |
|
|
114
|
+
| `accessId` | ✅ | API ID from platform | `"c5a7b3d2c1e9f4b8"` |
|
|
115
|
+
| `accessKey` | ✅ | API Secret from platform | `"1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o"` |
|
|
116
|
+
| `countryCode` | ✅ | Country code (see below) | `1` (US), `86` (China) |
|
|
117
|
+
| `username` | ✅ | Tuya app login email | `"user@example.com"` |
|
|
118
|
+
| `password` | ✅ | Tuya app password | (plain text or MD5 hash) |
|
|
119
|
+
| `appSchema` | ✅ | App identifier | `"tuyaSmart"` or `"smartlife"` |
|
|
120
|
+
| `endpoint` | ➖ | Override auto-detected endpoint | `"https://openapi-xxxxxx.tuyaeu.com"` |
|
|
121
|
+
| `homeWhitelist` | ➖ | Array of home IDs to include (blank = all) | `[123456789, 987654321]` |
|
|
122
|
+
| `generateWeatherAccessory` | ➖ | Create weather sensor (experimental) | `false` |
|
|
123
|
+
| `forceIPv4` | ➖ | Force IPv4 connections | `false` |
|
|
124
|
+
| `debug` | ➖ | Enable debug logging | `false` |
|
|
125
|
+
| `debugLevel` | ➖ | Log filter: `api`, `mqtt`, or device ID | `"api,mqtt"` |
|
|
126
|
+
|
|
127
|
+
**Country Codes:**
|
|
128
|
+
|
|
129
|
+
| Region | Code | Region | Code |
|
|
130
|
+
|--------|------|--------|------|
|
|
131
|
+
| China | `86` | India | `91` |
|
|
132
|
+
| USA | `1` | Mexico | `52` |
|
|
133
|
+
| Canada | `1` | Australia | `61` |
|
|
134
|
+
| Europe (EU) | `44` | Brazil | `55` |
|
|
135
|
+
| UK | `44` | Singapore | `65` |
|
|
136
|
+
| Russia | `7` | Japan | `81` |
|
|
137
|
+
|
|
138
|
+
### Configuration: Custom Project (projectType: "1")
|
|
139
|
+
|
|
140
|
+
**Advanced users only.** Use Smart Home (type 2) if unsure.
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"platform": "TuyaPlatform",
|
|
145
|
+
"name": "Tuya",
|
|
146
|
+
"mode": "cloud",
|
|
147
|
+
"options": {
|
|
148
|
+
"projectType": "1",
|
|
149
|
+
"endpoint": "https://openapi-xxxxxx.tuyaeu.com",
|
|
150
|
+
"accessId": "YOUR_ACCESS_ID",
|
|
151
|
+
"accessKey": "YOUR_ACCESS_KEY",
|
|
152
|
+
"username": "your_tuya_email@example.com",
|
|
153
|
+
"password": "your_tuya_password",
|
|
154
|
+
"debug": false
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Field Details:**
|
|
160
|
+
|
|
161
|
+
| Field | Required | Description |
|
|
162
|
+
|-------|----------|-------------|
|
|
163
|
+
| `projectType` | ✅ | Must be `"1"` |
|
|
164
|
+
| `endpoint` | ✅ | Full endpoint URL from API reference |
|
|
165
|
+
| `accessId` | ✅ | API ID |
|
|
166
|
+
| `accessKey` | ✅ | API Secret |
|
|
167
|
+
| `username` | ✅ | Tuya account email |
|
|
168
|
+
| `password` | ✅ | Tuya account password |
|
|
169
|
+
|
|
170
|
+
**Finding your endpoint:** [Tuya API Endpoints](https://developer.tuya.com/en/docs/iot/api-request?id=Ka4a8uuo1j4t4#title-1-Endpoints)
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Local Setup
|
|
175
|
+
|
|
176
|
+
### Prerequisites
|
|
177
|
+
|
|
178
|
+
1. **Homebridge and devices on same network** — LAN communication required
|
|
179
|
+
2. **Device local keys** — Retrieve from Tuya IoT Platform
|
|
180
|
+
3. **Device IDs** — Available in Tuya app device details
|
|
181
|
+
4. **UDP broadcast enabled** — Typically enabled by default on home networks
|
|
182
|
+
|
|
183
|
+
### Getting Local Keys
|
|
184
|
+
|
|
185
|
+
Follow the detailed guide: [Get Local Keys for Your Devices](./Get-Local-Keys-for-Your-Devices.md)
|
|
186
|
+
|
|
187
|
+
**Quick summary:**
|
|
188
|
+
1. Log in to [Tuya IoT Platform](https://iot.tuya.com)
|
|
189
|
+
2. Go to **Projects** → Your Project → **Devices Panel** → **All Devices**
|
|
190
|
+
3. Select a device and click the device ID or view the product
|
|
191
|
+
4. In the device details, you'll find the **local key**
|
|
192
|
+
|
|
193
|
+
### Configuration
|
|
194
|
+
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"platform": "TuyaPlatform",
|
|
198
|
+
"name": "Tuya",
|
|
199
|
+
"mode": "local",
|
|
200
|
+
"local": {
|
|
201
|
+
"autoDiscoverDevices": true,
|
|
202
|
+
"discoverTimeout": 5,
|
|
203
|
+
"rediscoverInterval": 3600,
|
|
204
|
+
"devices": [
|
|
205
|
+
{
|
|
206
|
+
"tuyaDeviceId": "abcdef1234567890",
|
|
207
|
+
"tuyaKey": "0123456789abcdef",
|
|
208
|
+
"name": "Living Room Light",
|
|
209
|
+
"category": "light",
|
|
210
|
+
"ip": "192.168.1.100",
|
|
211
|
+
"protocolVersion": "3.4"
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Field Details:**
|
|
219
|
+
|
|
220
|
+
| Field | Required | Description | Default | Example |
|
|
221
|
+
|-------|----------|-------------|---------|---------|
|
|
222
|
+
| `enabled` | ➖ | Enable the local LAN configuration block | `true` | `true` |
|
|
223
|
+
| `autoDiscoverDevices` | ➖ | Auto-discover devices via UDP | `true` | `true` |
|
|
224
|
+
| `discoverTimeout` | ➖ | Discovery wait time (milliseconds) | `60000` | `10000` |
|
|
225
|
+
| `rediscoverInterval` | ➖ | Periodic rediscovery interval (seconds) | `900` | `7200` |
|
|
226
|
+
| `devices` | ➖ | Manual device list (optional) | | |
|
|
227
|
+
| `deviceOverrides` | ➖ | Per-device override settings such as category or schema mapping | | |
|
|
228
|
+
| `cameras` | ➖ | RTSP camera definitions | | |
|
|
229
|
+
|
|
230
|
+
**Per-Device Fields:**
|
|
231
|
+
|
|
232
|
+
| Field | Required | Description | Example |
|
|
233
|
+
|-------|----------|-------------|---------|
|
|
234
|
+
| `tuyaDeviceId` | ✅ | Device ID from Tuya | `"1234567890abcdef"` |
|
|
235
|
+
| `tuyaKey` | ✅ | Local AES key (16 chars) | `"0123456789abcdef"` |
|
|
236
|
+
| `ip` | ➖ | Fixed IP (auto-discover if blank) | `"192.168.1.100"` |
|
|
237
|
+
| `name` | ➖ | Friendly name in HomeKit | `"Living Room Light"` |
|
|
238
|
+
| `protocolVersion` | ➖ | Protocol version (auto-detect if blank) | `"3.3"`, `"3.4"`, `"3.5"` |
|
|
239
|
+
| `dpMapping` | ➖ | System-managed DP mapping (object of DP code → DP ID). This is mainly used by the plugin/UI and is not intended for direct user-side editing of `dpCode` values. | `{ "switch_1": 1, "bright_value": 2 }` |
|
|
240
|
+
| `dpMappingArray` | ➖ | Manual array form of DP mapping. Recommended when editing JSON directly, because you can define arbitrary `dpCode` and `dpID` pairs. | `[{ "dpCode": "switch_1", "dpID": 1 }]` |
|
|
241
|
+
| `category` | ➖ | Device type override | `"light"`, `"switch"` |
|
|
242
|
+
| `switchCount` | ➖ | Number of controllable switch channels on multi-switch devices | `2` |
|
|
243
|
+
| `outletCount` | ➖ | Alias for `switchCount` on outlet-style devices | `4` |
|
|
244
|
+
| `isZigbeeGateway` | ➖ | Mark this local device as a Zigbee gateway parent device | `true` |
|
|
245
|
+
| `parentDeviceId` | ➖ | Parent gateway device ID for a Zigbee child device | `"gw1234567890"` |
|
|
246
|
+
| `zigbeeChildId` | ➖ | Zigbee node ID (CID) for a child device | `"0011223344556601"` |
|
|
247
|
+
| `childDpMapping` | ➖ | Per-child DP mapping override for Zigbee sub-devices | `{ "switch_1": 3 }` |
|
|
248
|
+
| `childCategory` | ➖ | Per-child category override for Zigbee sub-devices | `"switch"` |
|
|
249
|
+
|
|
250
|
+
> `dpMapping` and `dpMappingArray` are related but different. `dpMapping` is an object that the plugin/system typically populates for internal use, and the UI generally does not allow the user to freely edit the `dpCode` keys. For JSON-based configuration, `dpMappingArray` is the recommended field because it lets you explicitly map any `dpCode` to a `dpID` in a clear array form.
|
|
251
|
+
>
|
|
252
|
+
> Example:
|
|
253
|
+
>
|
|
254
|
+
> ```json
|
|
255
|
+
> {
|
|
256
|
+
> "local": {
|
|
257
|
+
> "devices": [
|
|
258
|
+
> {
|
|
259
|
+
> "tuyaDeviceId": "abcdef1234567890",
|
|
260
|
+
> "tuyaKey": "0123456789abcdef",
|
|
261
|
+
> "dpMappingArray": [
|
|
262
|
+
> { "dpCode": "switch_1", "dpID": 1 },
|
|
263
|
+
> { "dpCode": "bright_value", "dpID": 2 }
|
|
264
|
+
> ]
|
|
265
|
+
> }
|
|
266
|
+
> ]
|
|
267
|
+
> }
|
|
268
|
+
> }
|
|
269
|
+
> ```
|
|
270
|
+
|
|
271
|
+
### Troubleshooting Local Connection
|
|
272
|
+
|
|
273
|
+
**Device not auto-discovered?**
|
|
274
|
+
1. Verify device is on same network: `ping <device_ip>`
|
|
275
|
+
2. Ensure UDP port 6666 is open
|
|
276
|
+
3. Check network firewall settings
|
|
277
|
+
4. Try manually adding the device with `devices` array
|
|
278
|
+
|
|
279
|
+
**Connection timeout?**
|
|
280
|
+
1. Verify device IP is correct
|
|
281
|
+
2. Check device protocol version (try auto-detect)
|
|
282
|
+
3. Ensure local key is exactly 16 characters
|
|
283
|
+
4. Enable debug logging to diagnose
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Both Mode
|
|
288
|
+
|
|
289
|
+
Combines Cloud and Local for optimal performance and reliability.
|
|
290
|
+
|
|
291
|
+
```json
|
|
292
|
+
{
|
|
293
|
+
"platform": "TuyaPlatform",
|
|
294
|
+
"name": "Tuya",
|
|
295
|
+
"mode": "both",
|
|
296
|
+
"options": {
|
|
297
|
+
"projectType": "2",
|
|
298
|
+
"accessId": "YOUR_ACCESS_ID",
|
|
299
|
+
"accessKey": "YOUR_ACCESS_KEY",
|
|
300
|
+
"countryCode": 1,
|
|
301
|
+
"username": "your@email.com",
|
|
302
|
+
"password": "yourpassword",
|
|
303
|
+
"appSchema": "tuyaSmart"
|
|
304
|
+
},
|
|
305
|
+
"local": {
|
|
306
|
+
"autoDiscoverDevices": true,
|
|
307
|
+
"discoverTimeout": 5
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**How it works:**
|
|
313
|
+
1. Plugin attempts local commands first (fast)
|
|
314
|
+
2. If local command confirms within 10 seconds, done
|
|
315
|
+
3. If no confirmation within 10 seconds, retries via cloud
|
|
316
|
+
4. Cloud status updates satisfy pending local commands (no double-send)
|
|
317
|
+
|
|
318
|
+
**Benefits:**
|
|
319
|
+
- ✅ Fast local response for normal operation
|
|
320
|
+
- ✅ Automatic fallback to cloud if local fails
|
|
321
|
+
- ✅ No duplicate commands sent
|
|
322
|
+
- ✅ Best reliability
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Common Settings
|
|
327
|
+
|
|
328
|
+
Add these options to any mode's config block for enhanced functionality.
|
|
329
|
+
|
|
330
|
+
### Debug Logging
|
|
331
|
+
|
|
332
|
+
```json
|
|
333
|
+
{
|
|
334
|
+
"options": {
|
|
335
|
+
"debug": true,
|
|
336
|
+
"debugLevel": "api,mqtt"
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Debug levels:**
|
|
342
|
+
- `api` — API call logs
|
|
343
|
+
- `mqtt` — MQTT message logs
|
|
344
|
+
- `{device_id}` — Specific device logs (e.g., `"abc123def456"`)
|
|
345
|
+
|
|
346
|
+
### Device Overrides
|
|
347
|
+
|
|
348
|
+
See [ADVANCED_OPTIONS.md](./ADVANCED_OPTIONS.md) for detailed examples.
|
|
349
|
+
|
|
350
|
+
```json
|
|
351
|
+
{
|
|
352
|
+
"options": {
|
|
353
|
+
"deviceOverrides": [
|
|
354
|
+
{
|
|
355
|
+
"id": "{device_id}",
|
|
356
|
+
"adaptiveLighting": true
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## Camera Settings
|
|
366
|
+
|
|
367
|
+
### RTSP Camera Streaming
|
|
368
|
+
|
|
369
|
+
Configure RTSP streaming for cameras:
|
|
370
|
+
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"local": {
|
|
374
|
+
"cameras": [
|
|
375
|
+
{
|
|
376
|
+
"deviceId": "abcdef1234567890",
|
|
377
|
+
"deviceName": "Front Door Camera",
|
|
378
|
+
"rtspUrl": "rtsp://192.168.1.50:554/stream",
|
|
379
|
+
"username": "admin",
|
|
380
|
+
"password": "password123"
|
|
381
|
+
}
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
**Field Details:**
|
|
388
|
+
|
|
389
|
+
| Field | Required | Description |
|
|
390
|
+
|-------|----------|-------------|
|
|
391
|
+
| `deviceId` | ✅ | Tuya device ID |
|
|
392
|
+
| `deviceName` | ➖ | Friendly name in HomeKit |
|
|
393
|
+
| `rtspUrl` | ✅ | RTSP stream URL |
|
|
394
|
+
| `username` | ➖ | RTSP username |
|
|
395
|
+
| `password` | ➖ | RTSP password |
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## Complete Examples
|
|
400
|
+
|
|
401
|
+
### Example 1: Cloud Only (Simple Setup)
|
|
402
|
+
|
|
403
|
+
Best for: Remote access, full features, easier setup
|
|
404
|
+
|
|
405
|
+
```json
|
|
406
|
+
{
|
|
407
|
+
"platform": "TuyaPlatform",
|
|
408
|
+
"name": "Tuya",
|
|
409
|
+
"mode": "cloud",
|
|
410
|
+
"options": {
|
|
411
|
+
"projectType": "2",
|
|
412
|
+
"accessId": "c5a7b3d2c1e9f4b8",
|
|
413
|
+
"accessKey": "1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o",
|
|
414
|
+
"countryCode": 1,
|
|
415
|
+
"username": "alice@example.com",
|
|
416
|
+
"password": "mypassword123",
|
|
417
|
+
"appSchema": "tuyaSmart",
|
|
418
|
+
"debug": false
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Example 2: Local Only (Privacy-Focused)
|
|
424
|
+
|
|
425
|
+
Best for: Privacy, fast response, no cloud dependency
|
|
426
|
+
|
|
427
|
+
```json
|
|
428
|
+
{
|
|
429
|
+
"platform": "TuyaPlatform",
|
|
430
|
+
"name": "Tuya",
|
|
431
|
+
"mode": "local",
|
|
432
|
+
"local": {
|
|
433
|
+
"autoDiscoverDevices": true,
|
|
434
|
+
"discoverTimeout": 5,
|
|
435
|
+
"devices": [
|
|
436
|
+
{
|
|
437
|
+
"tuyaDeviceId": "bf1234567890abcd",
|
|
438
|
+
"tuyaKey": "0123456789abcdef",
|
|
439
|
+
"name": "Living Room Light"
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
"tuyaDeviceId": "cd1234567890abef",
|
|
443
|
+
"tuyaKey": "fedcba9876543210",
|
|
444
|
+
"name": "Kitchen Plug"
|
|
445
|
+
}
|
|
446
|
+
]
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Example 3: Both Modes (Recommended)
|
|
452
|
+
|
|
453
|
+
Best for: Reliability, optimal performance, local-first with cloud fallback
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"platform": "TuyaPlatform",
|
|
458
|
+
"name": "Tuya",
|
|
459
|
+
"mode": "both",
|
|
460
|
+
"options": {
|
|
461
|
+
"projectType": "2",
|
|
462
|
+
"accessId": "c5a7b3d2c1e9f4b8",
|
|
463
|
+
"accessKey": "1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o",
|
|
464
|
+
"countryCode": 1,
|
|
465
|
+
"username": "alice@example.com",
|
|
466
|
+
"password": "mypassword123",
|
|
467
|
+
"appSchema": "tuyaSmart",
|
|
468
|
+
"deviceOverrides": [
|
|
469
|
+
{
|
|
470
|
+
"id": "bf1234567890abcd",
|
|
471
|
+
"adaptiveLighting": true
|
|
472
|
+
}
|
|
473
|
+
],
|
|
474
|
+
"debug": false
|
|
475
|
+
},
|
|
476
|
+
"local": {
|
|
477
|
+
"autoDiscoverDevices": true,
|
|
478
|
+
"discoverTimeout": 5,
|
|
479
|
+
"rediscoverInterval": 3600
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Example 4: Advanced Cloud with Custom Devices
|
|
485
|
+
|
|
486
|
+
```json
|
|
487
|
+
{
|
|
488
|
+
"platform": "TuyaPlatform",
|
|
489
|
+
"name": "Tuya",
|
|
490
|
+
"mode": "cloud",
|
|
491
|
+
"options": {
|
|
492
|
+
"projectType": "2",
|
|
493
|
+
"accessId": "c5a7b3d2c1e9f4b8",
|
|
494
|
+
"accessKey": "1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o",
|
|
495
|
+
"countryCode": 1,
|
|
496
|
+
"username": "alice@example.com",
|
|
497
|
+
"password": "mypassword123",
|
|
498
|
+
"appSchema": "tuyaSmart",
|
|
499
|
+
"homeWhitelist": [123456789],
|
|
500
|
+
"generateWeatherAccessory": false,
|
|
501
|
+
"deviceOverrides": [
|
|
502
|
+
{
|
|
503
|
+
"id": "bf1234567890abcd",
|
|
504
|
+
"adaptiveLighting": true,
|
|
505
|
+
"category": "light"
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"id": "scene123456789",
|
|
509
|
+
"category": "hidden"
|
|
510
|
+
}
|
|
511
|
+
],
|
|
512
|
+
"debug": false,
|
|
513
|
+
"debugLevel": "api"
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Example 5: Complete Setup with Cameras
|
|
519
|
+
|
|
520
|
+
```json
|
|
521
|
+
{
|
|
522
|
+
"platform": "TuyaPlatform",
|
|
523
|
+
"name": "Tuya",
|
|
524
|
+
"mode": "both",
|
|
525
|
+
"options": {
|
|
526
|
+
"projectType": "2",
|
|
527
|
+
"accessId": "c5a7b3d2c1e9f4b8",
|
|
528
|
+
"accessKey": "1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o",
|
|
529
|
+
"countryCode": 1,
|
|
530
|
+
"username": "alice@example.com",
|
|
531
|
+
"password": "mypassword123",
|
|
532
|
+
"appSchema": "tuyaSmart"
|
|
533
|
+
},
|
|
534
|
+
"local": {
|
|
535
|
+
"autoDiscoverDevices": true,
|
|
536
|
+
"discoverTimeout": 5,
|
|
537
|
+
"cameras": [
|
|
538
|
+
{
|
|
539
|
+
"deviceId": "cam1234567890abc",
|
|
540
|
+
"deviceName": "Front Door",
|
|
541
|
+
"rtspUrl": "rtsp://192.168.1.50:554/stream",
|
|
542
|
+
"username": "admin",
|
|
543
|
+
"password": "admin123"
|
|
544
|
+
}
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## Tips & Best Practices
|
|
553
|
+
|
|
554
|
+
### General
|
|
555
|
+
|
|
556
|
+
- 🔐 **Secure passwords** — Use strong, unique Tuya passwords
|
|
557
|
+
- 🔄 **Backup config** — Keep a copy of your `config.json`
|
|
558
|
+
- 📅 **Renew trial** — Set calendar reminder for API trial renewal (every 6 months)
|
|
559
|
+
- 🆔 **Separate accounts** — Use different Tuya accounts for different Homebridge instances
|
|
560
|
+
|
|
561
|
+
### Cloud Mode
|
|
562
|
+
|
|
563
|
+
- ⏰ **Monitor trial expiration** — API trial expires every 6 months; renewal is required
|
|
564
|
+
- 🏠 **Use Smart Home projects** — Easier setup than Custom projects
|
|
565
|
+
- 🗺️ **Verify region** — Ensure you select the correct data center during project creation
|
|
566
|
+
|
|
567
|
+
### Local Mode
|
|
568
|
+
|
|
569
|
+
- 🌐 **Network setup** — Ensure devices and Homebridge are on same subnet
|
|
570
|
+
- 🔑 **Backup local keys** — Store keys in a safe location
|
|
571
|
+
- 📡 **Protocol version** — Let auto-detect handle it unless you know your device version
|
|
572
|
+
|
|
573
|
+
### Both Mode
|
|
574
|
+
|
|
575
|
+
- ⚡ **Optimized for speed** — Local commands complete in <100ms
|
|
576
|
+
- 🔄 **Automatic failover** — Cloud fallback is transparent to user
|
|
577
|
+
- 🚀 **Best practice** — Recommended for most users
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## Troubleshooting Configuration
|
|
582
|
+
|
|
583
|
+
### "projectType not found" Error
|
|
584
|
+
|
|
585
|
+
**Solution:** Ensure you're using `"2"` (Smart Home) or `"1"` (Custom) as a string:
|
|
586
|
+
```json
|
|
587
|
+
"projectType": "2"
|
|
588
|
+
```
|
|
589
|
+
(not `projectType: 2`)
|
|
590
|
+
|
|
591
|
+
### "Invalid endpoint" Error
|
|
592
|
+
|
|
593
|
+
**Solution:** Verify your endpoint matches your data center region. Check [Tuya endpoints](https://developer.tuya.com/en/docs/iot/api-request?id=Ka4a8uuo1j4t4#title-1-Endpoints).
|
|
594
|
+
|
|
595
|
+
### "Devices not appearing"
|
|
596
|
+
|
|
597
|
+
**Cloud mode:** Ensure APIs are subscribed and your app account is linked to the project.
|
|
598
|
+
**Local mode:** Verify local keys are correct and devices are discoverable on your network.
|
|
599
|
+
|
|
600
|
+
### Config not updating
|
|
601
|
+
|
|
602
|
+
**Solution:** Restart Homebridge after editing config:
|
|
603
|
+
```bash
|
|
604
|
+
sudo systemctl restart homebridge
|
|
605
|
+
# or
|
|
606
|
+
systemctl --user restart homebridge
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## More Help
|
|
612
|
+
|
|
613
|
+
- 📖 [Main README](../README.md)
|
|
614
|
+
- 🔧 [Advanced Options](./ADVANCED_OPTIONS.md)
|
|
615
|
+
- 📱 [Get Local Keys](./Get-Local-Keys-for-Your-Devices.md)
|
|
616
|
+
- 💬 [GitHub Issues](https://github.com/homebridge-plugins/homebridge-tuya/issues)
|