@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.
Files changed (298) hide show
  1. package/README.md +354 -142
  2. package/config.schema.json +1221 -893
  3. package/dist/cloud/api/TuyaOpenAPI.js +108 -60
  4. package/dist/cloud/api/TuyaOpenAPI.js.map +1 -1
  5. package/dist/cloud/api/TuyaOpenMQ.js +45 -22
  6. package/dist/cloud/api/TuyaOpenMQ.js.map +1 -1
  7. package/dist/cloud/device/{TuyaDeviceManager.js → TuyaCloudDeviceManager.js} +146 -96
  8. package/dist/cloud/device/TuyaCloudDeviceManager.js.map +1 -0
  9. package/dist/cloud/device/TuyaCustomDeviceManager.js +75 -5
  10. package/dist/cloud/device/TuyaCustomDeviceManager.js.map +1 -1
  11. package/dist/cloud/device/TuyaDevice.js.map +1 -1
  12. package/dist/cloud/device/TuyaHomeDeviceManager.js +81 -13
  13. package/dist/cloud/device/TuyaHomeDeviceManager.js.map +1 -1
  14. package/dist/config.js +26 -5
  15. package/dist/config.js.map +1 -1
  16. package/dist/local/DynamicChildDiscovery.js +2 -1
  17. package/dist/local/DynamicChildDiscovery.js.map +1 -1
  18. package/dist/local/LocalDevice.js +16 -3
  19. package/dist/local/LocalDevice.js.map +1 -1
  20. package/dist/local/LocalDeviceManager.js +361 -164
  21. package/dist/local/LocalDeviceManager.js.map +1 -1
  22. package/dist/local/TuyaDiscovery.js +16 -7
  23. package/dist/local/TuyaDiscovery.js.map +1 -1
  24. package/dist/local/ZigbeeGatewayDetection.js +7 -4
  25. package/dist/local/ZigbeeGatewayDetection.js.map +1 -1
  26. package/dist/local/protocol/ProtocolUtilities.js +34 -17
  27. package/dist/local/protocol/ProtocolUtilities.js.map +1 -1
  28. package/dist/local/protocol/ProtocolV31V32.js +4 -2
  29. package/dist/local/protocol/ProtocolV31V32.js.map +1 -1
  30. package/dist/local/protocol/ProtocolV33.js +4 -2
  31. package/dist/local/protocol/ProtocolV33.js.map +1 -1
  32. package/dist/local/protocol/ProtocolV34.js +10 -5
  33. package/dist/local/protocol/ProtocolV34.js.map +1 -1
  34. package/dist/local/protocol/ProtocolV35.js +8 -4
  35. package/dist/local/protocol/ProtocolV35.js.map +1 -1
  36. package/dist/platform.js +253 -493
  37. package/dist/platform.js.map +1 -1
  38. package/dist/settings.js +0 -2
  39. package/dist/settings.js.map +1 -1
  40. package/dist/shared/TuyaDeviceManager.js +147 -0
  41. package/dist/shared/TuyaDeviceManager.js.map +1 -0
  42. package/dist/shared/TuyaHybridDeviceManager.js +215 -0
  43. package/dist/shared/TuyaHybridDeviceManager.js.map +1 -0
  44. package/dist/shared/accessory/AccessoryFactory.js +350 -0
  45. package/dist/shared/accessory/AccessoryFactory.js.map +1 -0
  46. package/dist/shared/{accessories → accessory}/AirConditionerAccessory.js +21 -15
  47. package/dist/shared/accessory/AirConditionerAccessory.js.map +1 -0
  48. package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js.map +1 -1
  49. package/dist/shared/accessory/AirQualitySensorAccessory.js.map +1 -0
  50. package/dist/shared/{accessories → accessory}/BaseAccessory.js +16 -95
  51. package/dist/shared/accessory/BaseAccessory.js.map +1 -0
  52. package/dist/shared/{accessories → accessory}/BlindsAccessory.js.map +1 -1
  53. package/dist/shared/{accessories → accessory}/CameraAccessory.js +2 -2
  54. package/dist/shared/accessory/CameraAccessory.js.map +1 -0
  55. package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js.map +1 -1
  56. package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js.map +1 -1
  57. package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js.map +1 -1
  58. package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js.map +1 -1
  59. package/dist/shared/{accessories → accessory}/DiffuserAccessory.js.map +1 -1
  60. package/dist/shared/{accessories → accessory}/DimmerAccessory.js.map +1 -1
  61. package/dist/shared/{accessories → accessory}/DoorbellAccessory.js.map +1 -1
  62. package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js.map +1 -1
  63. package/dist/shared/{accessories → accessory}/FanAccessory.js.map +1 -1
  64. package/dist/shared/{accessories → accessory}/GarageDoorAccessory.js +19 -2
  65. package/dist/shared/accessory/GarageDoorAccessory.js.map +1 -0
  66. package/dist/shared/{accessories → accessory}/HeaterAccessory.js.map +1 -1
  67. package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js.map +1 -1
  68. package/dist/shared/accessory/HumanPresenceSensorAccessory.js.map +1 -0
  69. package/dist/shared/{accessories → accessory}/HumidifierAccessory.js.map +1 -1
  70. package/dist/shared/accessory/IRAdapter.js +167 -0
  71. package/dist/shared/accessory/IRAdapter.js.map +1 -0
  72. package/dist/shared/accessory/IRAirConditionerAccessory.js.map +1 -0
  73. package/dist/shared/accessory/IRControlHubAccessory.js.map +1 -0
  74. package/dist/shared/accessory/IRControlHubSubAccessory.js.map +1 -0
  75. package/dist/shared/accessory/IRFanAccessory.js +90 -0
  76. package/dist/shared/accessory/IRFanAccessory.js.map +1 -0
  77. package/dist/shared/accessory/IRGenericAccessory.js.map +1 -0
  78. package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js.map +1 -1
  79. package/dist/shared/{accessories → accessory}/LightAccessory.js.map +1 -1
  80. package/dist/shared/{accessories → accessory}/LightSensorAccessory.js.map +1 -1
  81. package/dist/shared/{accessories → accessory}/LocationWeatherAccessory.js +1 -1
  82. package/dist/shared/accessory/LocationWeatherAccessory.js.map +1 -0
  83. package/dist/shared/{accessories → accessory}/LockAccessory.js +3 -3
  84. package/dist/shared/{accessories → accessory}/LockAccessory.js.map +1 -1
  85. package/dist/shared/accessory/MotionSensorAccessory.js.map +1 -0
  86. package/dist/shared/accessory/OutletAccessory.js.map +1 -0
  87. package/dist/shared/{accessories → accessory}/PetFeederAccessory.js.map +1 -1
  88. package/dist/shared/{accessories → accessory}/SceneAccessory.js +1 -1
  89. package/dist/shared/accessory/SceneAccessory.js.map +1 -0
  90. package/dist/shared/accessory/SceneSwitchAccessory.js.map +1 -0
  91. package/dist/shared/accessory/SecuritySystemAccessory.js.map +1 -0
  92. package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js.map +1 -1
  93. package/dist/shared/{accessories → accessory}/SwitchAccessory.js +1 -45
  94. package/dist/shared/accessory/SwitchAccessory.js.map +1 -0
  95. package/dist/shared/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
  96. package/dist/shared/{accessories → accessory}/ThermostatAccessory.js.map +1 -1
  97. package/dist/shared/{accessories → accessory}/TowerRackAccessory.js.map +1 -1
  98. package/dist/shared/{accessories → accessory}/ValveAccessory.js.map +1 -1
  99. package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js.map +1 -1
  100. package/dist/shared/accessory/WeatherStationAccessory.js.map +1 -0
  101. package/dist/shared/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
  102. package/dist/shared/{accessories → accessory}/WhiteNoiseLightAccessory.js +1 -0
  103. package/dist/shared/accessory/WhiteNoiseLightAccessory.js.map +1 -0
  104. package/dist/shared/accessory/WindowAccessory.js.map +1 -0
  105. package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js.map +1 -1
  106. package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js.map +1 -1
  107. package/dist/shared/accessory/characteristic/Active.js.map +1 -0
  108. package/dist/shared/accessory/characteristic/AirQuality.js.map +1 -0
  109. package/dist/shared/{accessories → accessory}/characteristic/CurrentRelativeHumidity.js +3 -0
  110. package/dist/shared/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
  111. package/dist/shared/accessory/characteristic/CurrentTemperature.js.map +1 -0
  112. package/dist/shared/accessory/characteristic/CurrentWeather.js.map +1 -0
  113. package/dist/shared/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
  114. package/dist/shared/{accessories → accessory}/characteristic/CurrentWetBulbGlobeTemperature.js +3 -2
  115. package/dist/shared/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
  116. package/dist/shared/{accessories → accessory}/characteristic/EnergyUsage.js +0 -5
  117. package/dist/shared/accessory/characteristic/EnergyUsage.js.map +1 -0
  118. package/dist/shared/{accessories → accessory}/characteristic/Light.js +28 -5
  119. package/dist/shared/accessory/characteristic/Light.js.map +1 -0
  120. package/dist/shared/accessory/characteristic/LightSensor.js.map +1 -0
  121. package/dist/shared/{accessories → accessory}/characteristic/LockPhysicalControls.js +3 -0
  122. package/dist/shared/accessory/characteristic/LockPhysicalControls.js.map +1 -0
  123. package/dist/shared/accessory/characteristic/MotionDetected.js.map +1 -0
  124. package/dist/shared/accessory/characteristic/Name.js.map +1 -0
  125. package/dist/shared/accessory/characteristic/OccupancyDetected.js.map +1 -0
  126. package/dist/shared/{accessories → accessory}/characteristic/On.js +1 -0
  127. package/dist/shared/accessory/characteristic/On.js.map +1 -0
  128. package/dist/shared/accessory/characteristic/OutletInUse.js.map +1 -0
  129. package/dist/shared/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
  130. package/dist/shared/{accessories → accessory}/characteristic/RelativeHumidityDehumidifierThreshold.js +3 -0
  131. package/dist/shared/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
  132. package/dist/shared/accessory/characteristic/RotationSpeed.js.map +1 -0
  133. package/dist/shared/accessory/characteristic/SecuritySystemState.js.map +1 -0
  134. package/dist/shared/{accessories → accessory}/characteristic/SwingMode.js +3 -0
  135. package/dist/shared/accessory/characteristic/SwingMode.js.map +1 -0
  136. package/dist/shared/accessory/characteristic/TargetTemperature.js.map +1 -0
  137. package/dist/shared/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
  138. package/dist/shared/util/ConfigHash.js +2 -2
  139. package/dist/shared/util/ConfigHash.js.map +1 -1
  140. package/dist/shared/util/ConfigMigrator.js +222 -0
  141. package/dist/shared/util/ConfigMigrator.js.map +1 -0
  142. package/dist/shared/util/FfmpegStreamingProcess.js +62 -0
  143. package/dist/shared/util/FfmpegStreamingProcess.js.map +1 -1
  144. package/dist/shared/util/InfraredTool.js +0 -2
  145. package/dist/shared/util/InfraredTool.js.map +1 -1
  146. package/dist/shared/util/Logger.js +85 -10
  147. package/dist/shared/util/Logger.js.map +1 -1
  148. package/dist/shared/util/TuyaStreamDelegate.js +194 -97
  149. package/dist/shared/util/TuyaStreamDelegate.js.map +1 -1
  150. package/dist/shared/util/util.js +59 -4
  151. package/dist/shared/util/util.js.map +1 -1
  152. package/docs/ADVANCED_OPTIONS.md +603 -0
  153. package/docs/CONFIG_GUIDE.md +616 -0
  154. package/docs/Get-Local-Keys-for-Your-Devices.md +246 -0
  155. package/{SUPPORTED_DEVICES.md → docs/SUPPORTED_DEVICES.md} +24 -3
  156. package/eslint.config.mjs +0 -1
  157. package/{jest.config.js → jest.config.ts} +5 -2
  158. package/package.json +12 -9
  159. package/test/ConfigMigrator.test.ts +1060 -0
  160. package/test/Logger.test.ts +482 -0
  161. package/test/accessoryFactory.data.test.ts +172 -0
  162. package/test/accessoryFactory.test.ts +64 -35
  163. package/test/airConditioner.test.ts +742 -0
  164. package/test/config.test.ts +17 -13
  165. package/test/custom.test.ts +2 -2
  166. package/test/errorHandling.test.ts +12 -12
  167. package/test/home.test.ts +1 -1
  168. package/test/hybridDeviceManager.test.ts +808 -0
  169. package/test/light.test.ts +250 -0
  170. package/test/localDevice.test.ts +21 -50
  171. package/test/localDeviceManager.behavior.test.ts +196 -31
  172. package/test/localDeviceManager.test.ts +124 -41
  173. package/test/mqttMessages.test.ts +33 -14
  174. package/test/platform.test.ts +337 -814
  175. package/test/platform.validation.local.test.ts +58 -119
  176. package/test/tuyaCustomDeviceManager.test.ts +106 -16
  177. package/test/tuyaDeviceManager.test.ts +636 -639
  178. package/test/tuyaDiscovery.test.ts +21 -33
  179. package/test/tuyaHomeDeviceManager.test.ts +109 -18
  180. package/test/tuyaOpenAPI.test.ts +25 -44
  181. package/test/tuyaOpenMQ.test.ts +15 -23
  182. package/test/util.test.ts +107 -7
  183. package/test/zigbee/LocalDevice.zigbee.test.ts +14 -18
  184. package/test/zigbee/LocalDeviceManager.cloud-discovery.test.ts +19 -20
  185. package/test/zigbee/LocalDeviceManager.zigbee.reconnect.test.ts +19 -20
  186. package/test/zigbee/LocalDeviceManager.zigbee.test.ts +73 -35
  187. package/test/zigbee/ZigbeeGatewayDetection.test.ts +2 -2
  188. package/ADVANCED_OPTIONS.md +0 -267
  189. package/dist/cloud/device/TuyaDeviceManager.js.map +0 -1
  190. package/dist/local/CloudLocalReconciliation.js +0 -180
  191. package/dist/local/CloudLocalReconciliation.js.map +0 -1
  192. package/dist/shared/AccessoryFactory.js +0 -276
  193. package/dist/shared/AccessoryFactory.js.map +0 -1
  194. package/dist/shared/accessories/AccessoryFactory.js +0 -305
  195. package/dist/shared/accessories/AccessoryFactory.js.map +0 -1
  196. package/dist/shared/accessories/AirConditionerAccessory.js.map +0 -1
  197. package/dist/shared/accessories/AirQualitySensorAccessory.js.map +0 -1
  198. package/dist/shared/accessories/BaseAccessory.js.map +0 -1
  199. package/dist/shared/accessories/CameraAccessory.js.map +0 -1
  200. package/dist/shared/accessories/GarageDoorAccessory.js.map +0 -1
  201. package/dist/shared/accessories/HumanPresenceSensorAccessory.js.map +0 -1
  202. package/dist/shared/accessories/IRAirConditionerAccessory.js.map +0 -1
  203. package/dist/shared/accessories/IRControlHubAccessory.js.map +0 -1
  204. package/dist/shared/accessories/IRControlHubSubAccessory.js.map +0 -1
  205. package/dist/shared/accessories/IRGenericAccessory.js.map +0 -1
  206. package/dist/shared/accessories/LocationWeatherAccessory.js.map +0 -1
  207. package/dist/shared/accessories/MotionSensorAccessory.js.map +0 -1
  208. package/dist/shared/accessories/OutletAccessory.js.map +0 -1
  209. package/dist/shared/accessories/SceneAccessory.js.map +0 -1
  210. package/dist/shared/accessories/SceneSwitchAccessory.js.map +0 -1
  211. package/dist/shared/accessories/SecuritySystemAccessory.js.map +0 -1
  212. package/dist/shared/accessories/SwitchAccessory.js.map +0 -1
  213. package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js.map +0 -1
  214. package/dist/shared/accessories/WeatherStationAccessory.js.map +0 -1
  215. package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js.map +0 -1
  216. package/dist/shared/accessories/WhiteNoiseLightAccessory.js.map +0 -1
  217. package/dist/shared/accessories/WindowAccessory.js.map +0 -1
  218. package/dist/shared/accessories/characteristic/Active.js.map +0 -1
  219. package/dist/shared/accessories/characteristic/AirQuality.js.map +0 -1
  220. package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js.map +0 -1
  221. package/dist/shared/accessories/characteristic/CurrentTemperature.js.map +0 -1
  222. package/dist/shared/accessories/characteristic/CurrentWeather.js.map +0 -1
  223. package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js.map +0 -1
  224. package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js.map +0 -1
  225. package/dist/shared/accessories/characteristic/EnergyUsage.js.map +0 -1
  226. package/dist/shared/accessories/characteristic/Light.js.map +0 -1
  227. package/dist/shared/accessories/characteristic/LightSensor.js.map +0 -1
  228. package/dist/shared/accessories/characteristic/LockPhysicalControls.js.map +0 -1
  229. package/dist/shared/accessories/characteristic/MotionDetected.js.map +0 -1
  230. package/dist/shared/accessories/characteristic/Name.js.map +0 -1
  231. package/dist/shared/accessories/characteristic/OccupancyDetected.js.map +0 -1
  232. package/dist/shared/accessories/characteristic/On.js.map +0 -1
  233. package/dist/shared/accessories/characteristic/OutletInUse.js.map +0 -1
  234. package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js.map +0 -1
  235. package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js.map +0 -1
  236. package/dist/shared/accessories/characteristic/RotationSpeed.js.map +0 -1
  237. package/dist/shared/accessories/characteristic/SecuritySystemState.js.map +0 -1
  238. package/dist/shared/accessories/characteristic/SwingMode.js.map +0 -1
  239. package/dist/shared/accessories/characteristic/TargetTemperature.js.map +0 -1
  240. package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js.map +0 -1
  241. package/test/zigbee/CloudLocalReconciliation.test.ts +0 -284
  242. package/tuya-local-configs/dev-1.hash +0 -1
  243. package/tuya-local-configs/device1.hash +0 -1
  244. package/wiki/Get-Local-Keys-for-Your-Devices.md +0 -85
  245. /package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js +0 -0
  246. /package/dist/shared/{accessories → accessory}/AirQualitySensorAccessory.js +0 -0
  247. /package/dist/shared/{accessories → accessory}/BlindsAccessory.js +0 -0
  248. /package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js +0 -0
  249. /package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js +0 -0
  250. /package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js +0 -0
  251. /package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js +0 -0
  252. /package/dist/shared/{accessories → accessory}/DiffuserAccessory.js +0 -0
  253. /package/dist/shared/{accessories → accessory}/DimmerAccessory.js +0 -0
  254. /package/dist/shared/{accessories → accessory}/DoorbellAccessory.js +0 -0
  255. /package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js +0 -0
  256. /package/dist/shared/{accessories → accessory}/FanAccessory.js +0 -0
  257. /package/dist/shared/{accessories → accessory}/HeaterAccessory.js +0 -0
  258. /package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js +0 -0
  259. /package/dist/shared/{accessories → accessory}/HumanPresenceSensorAccessory.js +0 -0
  260. /package/dist/shared/{accessories → accessory}/HumidifierAccessory.js +0 -0
  261. /package/dist/shared/{accessories → accessory}/IRAirConditionerAccessory.js +0 -0
  262. /package/dist/shared/{accessories → accessory}/IRControlHubAccessory.js +0 -0
  263. /package/dist/shared/{accessories → accessory}/IRControlHubSubAccessory.js +0 -0
  264. /package/dist/shared/{accessories → accessory}/IRGenericAccessory.js +0 -0
  265. /package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js +0 -0
  266. /package/dist/shared/{accessories → accessory}/LightAccessory.js +0 -0
  267. /package/dist/shared/{accessories → accessory}/LightSensorAccessory.js +0 -0
  268. /package/dist/shared/{accessories → accessory}/MotionSensorAccessory.js +0 -0
  269. /package/dist/shared/{accessories → accessory}/OutletAccessory.js +0 -0
  270. /package/dist/shared/{accessories → accessory}/PetFeederAccessory.js +0 -0
  271. /package/dist/shared/{accessories → accessory}/SceneSwitchAccessory.js +0 -0
  272. /package/dist/shared/{accessories → accessory}/SecuritySystemAccessory.js +0 -0
  273. /package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js +0 -0
  274. /package/dist/shared/{accessories → accessory}/TemperatureHumiditySensorAccessory.js +0 -0
  275. /package/dist/shared/{accessories → accessory}/ThermostatAccessory.js +0 -0
  276. /package/dist/shared/{accessories → accessory}/TowerRackAccessory.js +0 -0
  277. /package/dist/shared/{accessories → accessory}/ValveAccessory.js +0 -0
  278. /package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js +0 -0
  279. /package/dist/shared/{accessories → accessory}/WeatherStationAccessory.js +0 -0
  280. /package/dist/shared/{accessories → accessory}/WetBulbGlobeTemperatureAccessory.js +0 -0
  281. /package/dist/shared/{accessories → accessory}/WindowAccessory.js +0 -0
  282. /package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js +0 -0
  283. /package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js +0 -0
  284. /package/dist/shared/{accessories → accessory}/characteristic/Active.js +0 -0
  285. /package/dist/shared/{accessories → accessory}/characteristic/AirQuality.js +0 -0
  286. /package/dist/shared/{accessories → accessory}/characteristic/CurrentTemperature.js +0 -0
  287. /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeather.js +0 -0
  288. /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeatherByOpenMeteo.js +0 -0
  289. /package/dist/shared/{accessories → accessory}/characteristic/LightSensor.js +0 -0
  290. /package/dist/shared/{accessories → accessory}/characteristic/MotionDetected.js +0 -0
  291. /package/dist/shared/{accessories → accessory}/characteristic/Name.js +0 -0
  292. /package/dist/shared/{accessories → accessory}/characteristic/OccupancyDetected.js +0 -0
  293. /package/dist/shared/{accessories → accessory}/characteristic/OutletInUse.js +0 -0
  294. /package/dist/shared/{accessories → accessory}/characteristic/ProgrammableSwitchEvent.js +0 -0
  295. /package/dist/shared/{accessories → accessory}/characteristic/RotationSpeed.js +0 -0
  296. /package/dist/shared/{accessories → accessory}/characteristic/SecuritySystemState.js +0 -0
  297. /package/dist/shared/{accessories → accessory}/characteristic/TargetTemperature.js +0 -0
  298. /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.