@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,603 @@
|
|
|
1
|
+
# Advanced Options
|
|
2
|
+
|
|
3
|
+
This document covers advanced device customization using device schema overrides. These options allow you to:
|
|
4
|
+
|
|
5
|
+
- 🔧 Map non-standard device properties to HomeKit standards
|
|
6
|
+
- 🔄 Transform data types and value ranges
|
|
7
|
+
- 🎨 Enable special features like Adaptive Lighting
|
|
8
|
+
- 👁️ Hide unsupported or unwanted device properties
|
|
9
|
+
- 🏠 Unbridge accessories for custom HomeKit organization
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Table of Contents
|
|
14
|
+
|
|
15
|
+
1. [Prerequisites](#prerequisites)
|
|
16
|
+
2. [Device Overrides Reference](#device-overrides-reference)
|
|
17
|
+
3. [Schema Override Reference](#schema-override-reference)
|
|
18
|
+
4. [Common Use Cases](#common-use-cases)
|
|
19
|
+
5. [Troubleshooting](#troubleshooting)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
Before using device overrides, you should:
|
|
26
|
+
|
|
27
|
+
1. **Understand device schema** — Data Points (DPs) are device properties. See [Tuya Standard Instruction Set](https://developer.tuya.com/en/docs/iot/standarddescription?id=K9i5ql6waswzq)
|
|
28
|
+
2. **Enable debug logging** — To see your device's actual DPs:
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"options": {
|
|
32
|
+
"debug": true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
3. **Find your device info** — After connecting, find the device list at the path shown in logs:
|
|
37
|
+
```
|
|
38
|
+
[TuyaPlatform] Device list saved at /path/to/persist/TuyaDeviceList.{uid}.json
|
|
39
|
+
```
|
|
40
|
+
This JSON contains your device's actual schema and data point codes.
|
|
41
|
+
|
|
42
|
+
4. **Basic JavaScript knowledge** — The `onGet` and `onSet` transformations use JavaScript
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Device Overrides Reference
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"options": {
|
|
51
|
+
"deviceOverrides": [
|
|
52
|
+
{
|
|
53
|
+
"id": "device_id_or_product_id",
|
|
54
|
+
"category": "light",
|
|
55
|
+
"unbridged": false,
|
|
56
|
+
"adaptiveLighting": false,
|
|
57
|
+
"garageDoorUseContactSensorForState": false,
|
|
58
|
+
"schema": []
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Device Override Fields
|
|
66
|
+
|
|
67
|
+
| Field | Required | Type | Description | Default |
|
|
68
|
+
|-------|----------|------|-------------|---------|
|
|
69
|
+
| `id` | ✅ | string | Device ID, Product ID, Scene ID, or `"global"` | — |
|
|
70
|
+
| `category` | ➖ | string | Override device category (e.g., `"light"`, `"switch"`) or `"hidden"` | auto-detect |
|
|
71
|
+
| `unbridged` | ➖ | boolean | Create as unbridged accessory in HomeKit | `false` |
|
|
72
|
+
| `adaptiveLighting` | ➖ | boolean | Enable Apple Adaptive Lighting (lights only) | `false` |
|
|
73
|
+
| `garageDoorUseContactSensorForState` | ➖ | boolean | Garage doors: read state from contact sensor | `false` |
|
|
74
|
+
| `configFor` | ➖ | string | Apply to specific mode: `"cloud"`, `"local"`, or `"both"` | `"cloud"` |
|
|
75
|
+
| `schema` | ➖ | array | Array of DP (Data Point) overrides | `[]` |
|
|
76
|
+
|
|
77
|
+
### Targeting Devices
|
|
78
|
+
|
|
79
|
+
**By Device ID** (most common):
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"id": "bf1234567890abcd",
|
|
83
|
+
"category": "light"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**By Product ID** (applies to all devices of that product):
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"id": "dzxsq0rnibq6szvq",
|
|
91
|
+
"schema": [/* ... */]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**By Scene ID** (for Tuya Scenes):
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"id": "scene_123456789",
|
|
99
|
+
"category": "hidden"
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Globally** (apply to all devices):
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"id": "global",
|
|
107
|
+
"adaptiveLighting": true
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Schema Override Reference
|
|
114
|
+
|
|
115
|
+
The `schema` array contains overrides for individual Data Points (DPs).
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"schema": [
|
|
120
|
+
{
|
|
121
|
+
"code": "switch_led",
|
|
122
|
+
"newCode": "switch",
|
|
123
|
+
"type": "Boolean",
|
|
124
|
+
"property": { "min": 0, "max": 100, "scale": 0.1, "step": 1 },
|
|
125
|
+
"onGet": "Boolean(value)",
|
|
126
|
+
"onSet": "value ? 1 : 0",
|
|
127
|
+
"hidden": false
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Schema Override Fields
|
|
134
|
+
|
|
135
|
+
| Field | Required | Type | Description | Example |
|
|
136
|
+
|-------|----------|------|-------------|---------|
|
|
137
|
+
| `code` | ✅ | string | Original DP code | `"switch_led"` |
|
|
138
|
+
| `newCode` | ➖ | string | Rename the DP code | `"switch"` |
|
|
139
|
+
| `type` | ➖ | string | New type: `Boolean`, `Integer`, `Enum`, `String`, `Json`, `Raw` | `"Boolean"` |
|
|
140
|
+
| `property` | ➖ | object | Type-specific properties (min, max, scale, step, range) | `{ min: 0, max: 100 }` |
|
|
141
|
+
| `onGet` | ➖ | string | JavaScript to transform device→HomeKit value | `"value * 2"` |
|
|
142
|
+
| `onSet` | ➖ | string | JavaScript to transform HomeKit→device value | `"value / 2"` |
|
|
143
|
+
| `hidden` | ➖ | boolean | Hide this DP from HomeKit | `false` |
|
|
144
|
+
|
|
145
|
+
### Property Object
|
|
146
|
+
|
|
147
|
+
**For Integer types:**
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"type": "Integer",
|
|
151
|
+
"property": {
|
|
152
|
+
"min": 0,
|
|
153
|
+
"max": 100,
|
|
154
|
+
"scale": 0.5,
|
|
155
|
+
"step": 1
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**For Enum types:**
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"type": "Enum",
|
|
164
|
+
"property": {
|
|
165
|
+
"range": ["off", "low", "medium", "high"]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Common Use Cases
|
|
173
|
+
|
|
174
|
+
### 1. Hide Device / Scene
|
|
175
|
+
|
|
176
|
+
Hide a device or scene from HomeKit entirely.
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"options": {
|
|
181
|
+
"deviceOverrides": [
|
|
182
|
+
{
|
|
183
|
+
"id": "{device_id}",
|
|
184
|
+
"category": "hidden"
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**When to use:**
|
|
192
|
+
- Device is already controlled through another plugin
|
|
193
|
+
- Duplicate entry in HomeKit
|
|
194
|
+
- Unsupported device you don't want visible
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
### 2. Hide Specific Device Property
|
|
199
|
+
|
|
200
|
+
Hide a camera's floodlight or other unwanted properties.
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"options": {
|
|
205
|
+
"deviceOverrides": [
|
|
206
|
+
{
|
|
207
|
+
"id": "{camera_id}",
|
|
208
|
+
"schema": [
|
|
209
|
+
{
|
|
210
|
+
"code": "floodlight_switch",
|
|
211
|
+
"hidden": true
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
### 3. Enable Adaptive Lighting
|
|
223
|
+
|
|
224
|
+
Enable Apple's Adaptive Lighting feature for compatible lights.
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"options": {
|
|
229
|
+
"deviceOverrides": [
|
|
230
|
+
{
|
|
231
|
+
"id": "{light_id}",
|
|
232
|
+
"adaptiveLighting": true
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Requirements:**
|
|
240
|
+
- Light must support color temperature adjustment
|
|
241
|
+
- `color_temp` DP must be present and working
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
### 4. Garage Door Contact Sensor
|
|
246
|
+
|
|
247
|
+
For garage doors that report incorrect state, use contact sensor instead of switch state.
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"options": {
|
|
252
|
+
"deviceOverrides": [
|
|
253
|
+
{
|
|
254
|
+
"id": "{garage_door_id}",
|
|
255
|
+
"garageDoorUseContactSensorForState": true
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### 5. Change Device Category
|
|
265
|
+
|
|
266
|
+
Override detected category for non-standard devices.
|
|
267
|
+
|
|
268
|
+
```json
|
|
269
|
+
{
|
|
270
|
+
"options": {
|
|
271
|
+
"deviceOverrides": [
|
|
272
|
+
{
|
|
273
|
+
"id": "{device_id}",
|
|
274
|
+
"category": "light"
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Note:** ⚠️ Changing category may cause unexpected behavior. Clear HomeKit cache after changes:
|
|
282
|
+
```bash
|
|
283
|
+
rm -rf ~/.homebridge/persist/AccessoryInfo.*.json
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
### 6. Show Device as Unbridged
|
|
289
|
+
|
|
290
|
+
Create as separate HomeKit accessory instead of under bridge.
|
|
291
|
+
|
|
292
|
+
```json
|
|
293
|
+
{
|
|
294
|
+
"options": {
|
|
295
|
+
"deviceOverrides": [
|
|
296
|
+
{
|
|
297
|
+
"id": "{device_id}",
|
|
298
|
+
"unbridged": true
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### 7. Convert Enum to Boolean
|
|
308
|
+
|
|
309
|
+
Convert enum values like `"open"`/`"close"` to `true`/`false`.
|
|
310
|
+
|
|
311
|
+
```json
|
|
312
|
+
{
|
|
313
|
+
"options": {
|
|
314
|
+
"deviceOverrides": [
|
|
315
|
+
{
|
|
316
|
+
"id": "{device_id}",
|
|
317
|
+
"schema": [
|
|
318
|
+
{
|
|
319
|
+
"code": "open_close",
|
|
320
|
+
"type": "Boolean",
|
|
321
|
+
"onGet": "(value === 'open') ? true : false",
|
|
322
|
+
"onSet": "(value === true) ? 'open' : 'close'"
|
|
323
|
+
}
|
|
324
|
+
]
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
### 8. Transform Value Range
|
|
334
|
+
|
|
335
|
+
Adjust numeric ranges for temperature, brightness, or other integer values.
|
|
336
|
+
|
|
337
|
+
**Scenario:** Device sends brightness 0-255, but needs to be 0-100.
|
|
338
|
+
|
|
339
|
+
```json
|
|
340
|
+
{
|
|
341
|
+
"options": {
|
|
342
|
+
"deviceOverrides": [
|
|
343
|
+
{
|
|
344
|
+
"id": "{device_id}",
|
|
345
|
+
"schema": [
|
|
346
|
+
{
|
|
347
|
+
"code": "bright_value",
|
|
348
|
+
"type": "Integer",
|
|
349
|
+
"property": {
|
|
350
|
+
"min": 0,
|
|
351
|
+
"max": 100,
|
|
352
|
+
"scale": 1,
|
|
353
|
+
"step": 1
|
|
354
|
+
},
|
|
355
|
+
"onGet": "Math.round(value / 2.55)",
|
|
356
|
+
"onSet": "Math.round(value * 2.55)"
|
|
357
|
+
}
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
### 9. Handle Device Offline State
|
|
368
|
+
|
|
369
|
+
Show device as "Off" when it goes offline.
|
|
370
|
+
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"options": {
|
|
374
|
+
"deviceOverrides": [
|
|
375
|
+
{
|
|
376
|
+
"id": "{device_id}",
|
|
377
|
+
"schema": [
|
|
378
|
+
{
|
|
379
|
+
"code": "switch_led",
|
|
380
|
+
"onGet": "(device.online && value)"
|
|
381
|
+
}
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
### 10. Temperature Unit Conversion
|
|
392
|
+
|
|
393
|
+
Convert between Fahrenheit and Celsius.
|
|
394
|
+
|
|
395
|
+
**Formula:**
|
|
396
|
+
- F → C: `(F - 32) / 1.8`
|
|
397
|
+
- C → F: `C * 1.8 + 32`
|
|
398
|
+
|
|
399
|
+
```json
|
|
400
|
+
{
|
|
401
|
+
"options": {
|
|
402
|
+
"deviceOverrides": [
|
|
403
|
+
{
|
|
404
|
+
"id": "{thermostat_id}",
|
|
405
|
+
"schema": [
|
|
406
|
+
{
|
|
407
|
+
"code": "temp_current",
|
|
408
|
+
"onGet": "Math.round((value - 32) / 1.8)",
|
|
409
|
+
"onSet": "Math.round(value * 1.8 + 32)"
|
|
410
|
+
}
|
|
411
|
+
]
|
|
412
|
+
}
|
|
413
|
+
]
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
### 11. Reverse Curtain Direction
|
|
421
|
+
|
|
422
|
+
Reverse curtain open/close if motor direction is backwards.
|
|
423
|
+
|
|
424
|
+
```json
|
|
425
|
+
{
|
|
426
|
+
"options": {
|
|
427
|
+
"deviceOverrides": [
|
|
428
|
+
{
|
|
429
|
+
"id": "{curtain_id}",
|
|
430
|
+
"schema": [
|
|
431
|
+
{
|
|
432
|
+
"code": "percent_control",
|
|
433
|
+
"onGet": "(100 - value)",
|
|
434
|
+
"onSet": "(100 - value)"
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"code": "percent_state",
|
|
438
|
+
"onGet": "(100 - value)"
|
|
439
|
+
}
|
|
440
|
+
]
|
|
441
|
+
}
|
|
442
|
+
]
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**Alternative:** Most Tuya devices have a "reverse" setting in the Tuya app — use that first.
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
### 12. Fix Double-Brightness Issue
|
|
452
|
+
|
|
453
|
+
Skip on/off command when brightness slider is touched (prevents sending duplicate commands).
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"options": {
|
|
458
|
+
"deviceOverrides": [
|
|
459
|
+
{
|
|
460
|
+
"id": "{dimmer_id}",
|
|
461
|
+
"schema": [
|
|
462
|
+
{
|
|
463
|
+
"code": "switch_led",
|
|
464
|
+
"onSet": "(value === device.status.find(s => s.code === 'switch_led').value) ? undefined : value"
|
|
465
|
+
}
|
|
466
|
+
]
|
|
467
|
+
}
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### 13. Handle Half-Degree Temperature
|
|
476
|
+
|
|
477
|
+
Device stores double the value to preserve decimal (e.g., `41` = `20.5°C`).
|
|
478
|
+
|
|
479
|
+
```json
|
|
480
|
+
{
|
|
481
|
+
"options": {
|
|
482
|
+
"deviceOverrides": [
|
|
483
|
+
{
|
|
484
|
+
"id": "{device_id}",
|
|
485
|
+
"schema": [
|
|
486
|
+
{
|
|
487
|
+
"code": "temp_set",
|
|
488
|
+
"onGet": "(value * 5)",
|
|
489
|
+
"onSet": "(value / 5)",
|
|
490
|
+
"property": {
|
|
491
|
+
"min": 50,
|
|
492
|
+
"max": 350,
|
|
493
|
+
"scale": 1,
|
|
494
|
+
"step": 5
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
]
|
|
498
|
+
}
|
|
499
|
+
]
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## Troubleshooting
|
|
507
|
+
|
|
508
|
+
### "onGet is not a function" Error
|
|
509
|
+
|
|
510
|
+
**Issue:** Syntax error in JavaScript transformation.
|
|
511
|
+
|
|
512
|
+
**Solution:** Check your `onGet`/`onSet` code:
|
|
513
|
+
```json
|
|
514
|
+
{
|
|
515
|
+
"onGet": "Math.round(value / 2)", // ✅ Correct
|
|
516
|
+
"onGet": "Math.round(value / 2);" // ❌ Don't add semicolon
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
### Device Not Responding to Commands
|
|
521
|
+
|
|
522
|
+
**Issue:** `onSet` returns `undefined`, skipping the command.
|
|
523
|
+
|
|
524
|
+
**Solution:** Ensure `onSet` returns a value:
|
|
525
|
+
```json
|
|
526
|
+
{
|
|
527
|
+
"onSet": "value ? 1 : 0" // ✅ Returns 0 or 1
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### Device Appears Twice in HomeKit
|
|
532
|
+
|
|
533
|
+
**Issue:** Product-level override conflicts with device-level.
|
|
534
|
+
|
|
535
|
+
**Solution:** Use device ID for specificity:
|
|
536
|
+
```json
|
|
537
|
+
{
|
|
538
|
+
"id": "bf1234567890abcd" // ✅ Device ID (specific)
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
Rather than:
|
|
542
|
+
```json
|
|
543
|
+
{
|
|
544
|
+
"id": "dzxsq0rnibq6szvq" // Product ID (all devices of type)
|
|
545
|
+
}
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### Changes Not Taking Effect
|
|
549
|
+
|
|
550
|
+
**Solution:** Clear HomeKit accessories cache and restart Homebridge:
|
|
551
|
+
```bash
|
|
552
|
+
rm -rf ~/.homebridge/persist/AccessoryInfo.*.json
|
|
553
|
+
systemctl --user restart homebridge
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## Advanced: Complex Transformations
|
|
559
|
+
|
|
560
|
+
### Conditional Logic
|
|
561
|
+
|
|
562
|
+
```json
|
|
563
|
+
{
|
|
564
|
+
"onGet": "(value === 0) ? 'off' : (value < 50) ? 'low' : 'high'"
|
|
565
|
+
}
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Using Device State
|
|
569
|
+
|
|
570
|
+
```json
|
|
571
|
+
{
|
|
572
|
+
"onGet": "device.status.find(s => s.code === 'power').value ? value : 0"
|
|
573
|
+
}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
### Complex Math
|
|
577
|
+
|
|
578
|
+
```json
|
|
579
|
+
{
|
|
580
|
+
"onGet": "Math.max(0, Math.min(100, Math.round(value * 1.25)))"
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
---
|
|
585
|
+
|
|
586
|
+
## Resources
|
|
587
|
+
|
|
588
|
+
- 📖 [Tuya Standard Instruction Set](https://developer.tuya.com/en/docs/iot/standarddescription?id=K9i5ql6waswzq)
|
|
589
|
+
- 🔧 [TuyaDevice.ts Source](../src/cloud/device/TuyaDevice.ts) — See `TuyaDeviceSchemaProperty`
|
|
590
|
+
- 📱 [Supported Devices](./SUPPORTED_DEVICES.md)
|
|
591
|
+
- 💬 [GitHub Issues](https://github.com/homebridge-plugins/homebridge-tuya/issues)
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## Contributing Device Configs
|
|
596
|
+
|
|
597
|
+
If you create a working device override, consider sharing it! Open an issue or pull request with:
|
|
598
|
+
|
|
599
|
+
1. Device model and category
|
|
600
|
+
2. Your device override config
|
|
601
|
+
3. Explanation of what it fixes
|
|
602
|
+
|
|
603
|
+
This helps other users with the same device.
|