@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,246 @@
1
+ # Get Local Keys for Your Devices
2
+
3
+ This guide walks you through retrieving your Tuya device local keys, which are required for Local mode communication.
4
+
5
+ ---
6
+
7
+ ## Quick Summary
8
+
9
+ - 🔑 **Local Key:** A 16-character AES encryption key for each device
10
+ - 📱 **Required for:** Local mode (LAN communication without cloud)
11
+ - ⏰ **Time to complete:** ~15 minutes
12
+ - 💰 **Cost:** Free (uses Tuya's free trial API)
13
+
14
+ ---
15
+
16
+ ## Prerequisites
17
+
18
+ Before you start, ensure:
19
+ - ✅ All devices are added to Tuya Smart app
20
+ - ✅ You have a Tuya/SmartLife app account
21
+ - ✅ Access to the [Tuya IoT Platform](https://iot.tuya.com)
22
+
23
+ ---
24
+
25
+ ## Step-by-Step Guide
26
+
27
+ ### Step 1: Add Devices to Tuya Smart App
28
+
29
+ First, ensure all your smart devices are added to the Tuya Smart app.
30
+
31
+ **Download the app:**
32
+ - [iOS](https://apps.apple.com/app/tuya-smart/id1034649547)
33
+ - [Android](https://play.google.com/store/apps/details?id=com.tuya.smart)
34
+
35
+ **Add devices:**
36
+ 1. Open the Tuya Smart app
37
+ 2. Tap the **+** button to add a new device
38
+ 3. Follow the app's instructions to connect each device
39
+ 4. Note the device names for later reference
40
+
41
+ ---
42
+
43
+ ### Step 2: Create Tuya IoT Account
44
+
45
+ 1. Go to [Tuya IoT Platform](https://iot.tuya.com)
46
+ 2. Click **Sign Up** in the top right
47
+
48
+ ![Sign Up Button](https://user-images.githubusercontent.com/82495132/120384295-d2c95100-c2da-11eb-930d-75eaad628f4f.png)
49
+
50
+ 3. Fill in your information:
51
+ - Email address
52
+ - Password
53
+ - Company name (can be anything)
54
+
55
+ ![Sign Up Form](https://user-images.githubusercontent.com/82495132/120384453-099f6700-c2db-11eb-8cbc-20f3bc5bb17f.png)
56
+
57
+ 4. Check "Agree to Terms"
58
+ 5. Click **Agree**
59
+ 6. You'll receive a verification code via email — enter it
60
+ 7. Log in to your account
61
+
62
+ ---
63
+
64
+ ### Step 3: Create Cloud Project
65
+
66
+ 1. Once logged in, click **Cloud** in the left sidebar
67
+ 2. Click **Projects**
68
+ 3. Under **TRIAL EDITION**, click **Free Trial**
69
+
70
+ ![Free Trial Button](https://user-images.githubusercontent.com/82495132/120384723-60a53c00-c2db-11eb-8f79-f2a2f38dbc8a.png)
71
+
72
+ 4. A new tab will open — click **Buy Now** (don't worry, it's free)
73
+
74
+ ![Buy Now Button](https://user-images.githubusercontent.com/82495132/120384754-69960d80-c2db-11eb-802c-7067dff3274a.png)
75
+
76
+ 5. Close any popup tabs for "Tuya Value Added Service"
77
+ 6. Back in the original tab, click **Subscribed** to refresh
78
+ 7. Go back to **Cloud** → **Projects** if needed
79
+ 8. Click **Create**
80
+
81
+ ---
82
+
83
+ ### Step 4: Configure Project
84
+
85
+ When creating your project:
86
+
87
+ 1. **Edition:** Select "**Smart Home PAAS**"
88
+ 2. **Region:** Select your region (this is **important** — affects device access):
89
+ - 🇺🇸 **US** = United States
90
+ - 🇪🇺 **EU** = Europe
91
+ - 🇨🇳 **CN** = China
92
+ - 🇮🇳 **IN** = India
93
+ - See [Data Center Mapping](https://developer.tuya.com/en/docs/iot/oem-app-data-center-distributed?id=Kafi0ku9l07qb) or [Countries Regions and Tuya Data Center](https://github.com/tuya/tuya-home-assistant/wiki/Countries-Regions-and-Tuya-Data-Center) for your region
94
+
95
+ 3. Click **Create**
96
+
97
+ ![Create Project](https://user-images.githubusercontent.com/82495132/120386067-04431c00-c2dd-11eb-93ff-27371397e1e2.png)
98
+
99
+ ---
100
+
101
+ ### Step 5: Subscribe to APIs
102
+
103
+ You need to subscribe to APIs to access device information.
104
+
105
+ 1. From your project, go to **Service API**
106
+ 2. Click **Go to Authorize** or **Authorization**
107
+ 3. Subscribe to these services:
108
+ - ✅ **Authorization Token Management** (required)
109
+ - ✅ **IoT Core** (required)
110
+ - ✅ **Device Status Notification** (optional but recommended)
111
+
112
+ 4. Click **Authorize** for the recommended APIs
113
+
114
+ ![Authorize APIs](https://user-images.githubusercontent.com/82495132/120384846-87637280-c2db-11eb-8a3c-b2fd256f68d5.png)
115
+
116
+ ---
117
+
118
+ ### Step 6: Link Your Tuya App Account
119
+
120
+ 1. From your project, go to **Devices Panel** or **Link Devices**
121
+ 2. Click **Link Tuya App Account** or **Add App Account**
122
+
123
+ ![Add App Account](https://user-images.githubusercontent.com/82495132/120385095-d7dad000-c2db-11eb-9e4c-595af4502154.png)
124
+
125
+ 3. Scan the QR code with your Tuya Smart app:
126
+ - Open Tuya Smart app
127
+ - Tap **Me** (bottom right)
128
+ - Tap the **Scan** icon
129
+ - Scan the QR code shown on the IoT Platform
130
+
131
+ ![Scan QR Code](https://user-images.githubusercontent.com/82495132/120385375-2f793b80-c2dc-11eb-9343-c579fc288962.png)
132
+
133
+ 4. Confirm the sign-in in your phone's Tuya app
134
+ 5. Wait for confirmation on the web page
135
+
136
+ ---
137
+
138
+ ### Step 7: Find Device ID
139
+
140
+ 1. Go to **Devices Panel** → **All Devices** (or **Link Devices** → **Linked Devices**)
141
+ 2. You should see all your linked devices
142
+ 3. Find your device in the list
143
+ 4. Copy the **Device ID** (usually a long hex string like `bf1234567890abcd`)
144
+
145
+ ![Device List](https://user-images.githubusercontent.com/484912/204113199-a7ffd1c6-7f22-4295-a3a1-948ba15643b2.png)
146
+
147
+ ---
148
+
149
+ ### Step 8: Retrieve Local Key
150
+
151
+ Now use the API to get your device's local key.
152
+
153
+ 1. In the left sidebar, hover over **Cloud** and click **API Explorer**
154
+
155
+ ![API Explorer](https://user-images.githubusercontent.com/484912/204113419-3d106164-eff8-4ff3-a4f5-c7f2a025de96.png)
156
+
157
+ 2. In the search box, type `"get device information"` (note: search for the one WITHOUT "the")
158
+ - It should be under **Device Management** or **General Devices management** section
159
+ - **Do NOT** use "Get _the_ device information" — it won't work
160
+
161
+ 3. Click on the correct endpoint
162
+ 4. Paste your device ID into the **device_id** field
163
+ 5. Click **Submit Request**
164
+
165
+ 6. In the **Response** section, look for the `local_key` property
166
+ - This is your 16-character local key
167
+
168
+ ![Local Key in Response](https://user-images.githubusercontent.com/484912/204113337-81ebe3c3-5f3a-4854-a069-aa929bfb145d.png)
169
+
170
+ ---
171
+
172
+ ### Step 9: Repeat for Other Devices
173
+
174
+ Repeat Steps 7-8 for each device you want to use in Local mode.
175
+
176
+ **Create a spreadsheet** to keep track:
177
+
178
+ | Device Name | Device ID | Local Key | Protocol Version |
179
+ |-------------|-----------|-----------|-----------------|
180
+ | Living Room Light | `bf1234567890abcd` | `0123456789abcdef` | 3.4 |
181
+ | Kitchen Plug | `cd0987654321dcba` | `fedcba9876543210` | 3.3 |
182
+
183
+ ---
184
+
185
+ ## Using Your Local Keys
186
+
187
+ Once you have your local keys, add them to your Homebridge config in Local or Both mode:
188
+
189
+ ```json
190
+ {
191
+ "platform": "TuyaPlatform",
192
+ "mode": "local",
193
+ "local": {
194
+ "autoDiscoverDevices": true,
195
+ "devices": [
196
+ {
197
+ "tuyaDeviceId": "bf1234567890abcd",
198
+ "tuyaKey": "0123456789abcdef",
199
+ "name": "Living Room Light"
200
+ }
201
+ ]
202
+ }
203
+ }
204
+ ```
205
+
206
+ ---
207
+
208
+ ## Troubleshooting
209
+
210
+ ### "Device not found in API Explorer"
211
+
212
+ **Solution:**
213
+ - Ensure device is linked in **Devices Panel** → **All Devices**
214
+ - Check that you selected the correct project and region
215
+ - Try refreshing the page and searching again
216
+
217
+ ### "API Explorer returns empty response"
218
+
219
+ **Solution:**
220
+ - Verify you used the correct endpoint ("Get device information" NOT "Get _the_ device information")
221
+ - Ensure the device ID is copied correctly (no extra spaces)
222
+ - Check that the API is subscribed
223
+
224
+ ### "Local key is invalid format"
225
+
226
+ **Solution:**
227
+ - Local keys should be exactly **16 characters**
228
+ - Don't confuse with device ID (which is longer)
229
+ - Copy the entire value from the `local_key` field in the API response
230
+
231
+ ### "Can't find the device list in API"
232
+
233
+ **Solution:**
234
+ - Make sure you've linked your Tuya app account to the project
235
+ - Go back to **Devices Panel** and verify devices appear there first
236
+ - If no devices appear, you may need to check your project's region setting
237
+
238
+
239
+ ---
240
+
241
+ ## Next Steps
242
+
243
+ Once you have your local keys:
244
+ 1. Add them to your [CONFIG_GUIDE.md](./CONFIG_GUIDE.md) in Local or Both mode
245
+ 2. Restart Homebridge
246
+ 3. Your devices should appear in HomeKit
@@ -1,9 +1,30 @@
1
1
  # Supported Tuya Devices
2
2
 
3
- First-class category name, sedond-class category name, category code can be found here:
4
- https://developer.tuya.com/docs/iot/standarddescription?id=K9i5ql6waswzq
3
+ This plugin supports **60+ device categories** from Tuya's ecosystem. Use this page to find your device's category code and verify HomeKit service support.
5
4
 
6
- Most category code is pinyin abbreviation of Chinese name.
5
+ ---
6
+
7
+ ## How to Use This Guide
8
+
9
+ 1. **Find your device** — Locate it in the table by name or category
10
+ 2. **Check the code** — Note the category code (e.g., `dj`, `kg`, `ms`)
11
+ 3. **Verify support** — ✅ = supported, ❌ = not yet supported
12
+ 4. **For unsupported devices** — See [ADVANCED_OPTIONS.md](./ADVANCED_OPTIONS.md) for custom mappings
13
+
14
+ ---
15
+
16
+ ## Table Legend
17
+
18
+ | Column | Meaning |
19
+ |--------|---------|
20
+ | Name | English device name |
21
+ | Name (zh) | Chinese device name |
22
+ | Code | Tuya category code (use in device overrides) |
23
+ | Homebridge Service | HomeKit accessory type |
24
+ | Supported | ✅ = supported, ❌ = not supported |
25
+ | Links | Link to official Tuya documentation |
26
+
27
+ **Reference:** [Tuya Standard Instruction Set](https://developer.tuya.com/docs/iot/standarddescription?id=K9i5ql6waswzq)
7
28
 
8
29
  ## Lighting
9
30
 
package/eslint.config.mjs CHANGED
@@ -1,4 +1,3 @@
1
- import js from '@eslint/js';
2
1
  import tsPlugin from '@typescript-eslint/eslint-plugin';
3
2
  import tsParser from '@typescript-eslint/parser';
4
3
 
@@ -1,5 +1,6 @@
1
- /** @type {import('ts-jest').JestConfigWithTsJest} */
2
- module.exports = {
1
+ import type { JestConfigWithTsJest } from 'ts-jest';
2
+
3
+ const config: JestConfigWithTsJest = {
3
4
  preset: 'ts-jest',
4
5
  testEnvironment: 'node',
5
6
  moduleNameMapper: {
@@ -9,3 +10,5 @@ module.exports = {
9
10
  '^@homebridge/camera-utils$': '<rootDir>/test/__mocks__/@homebridge-camera-utils.js',
10
11
  },
11
12
  };
13
+
14
+ export default config;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@homebridge-plugins/homebridge-tuya",
3
3
  "displayName": "Homebridge Tuya",
4
- "version": "3.0.0-beta.2",
4
+ "version": "3.0.0-beta.21",
5
5
  "description": "Unified Homebridge Tuya plugin supporting both Tuya Cloud (REST/MQTT) and Tuya Local (direct LAN TCP) communication.",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -19,18 +19,18 @@
19
19
  }
20
20
  ],
21
21
  "engines": {
22
- "homebridge": "^1.8.0 || ^2.0.0-beta.0",
22
+ "homebridge": "^1.8.0 || ^2.0.0",
23
23
  "node": "^20 || ^22 || ^24 || ^25"
24
24
  },
25
25
  "peerDependencies": {
26
- "homebridge": "^1.8.0 || ^2.0.0-beta.0"
26
+ "homebridge": "^1.8.0 || ^2.0.0"
27
27
  },
28
28
  "main": "dist/index.js",
29
29
  "scripts": {
30
30
  "check": "npm install && npm outdated",
31
31
  "lint": "eslint src/**/*.ts",
32
32
  "lint:fix": "eslint src/**/*.ts --fix",
33
- "test": "jest",
33
+ "test": "jest --detectOpenHandles",
34
34
  "coverage": "npm test -- --coverage",
35
35
  "watch": "npm run build && npm link && nodemon",
36
36
  "launch": "tsc && homebridge -I -D",
@@ -47,21 +47,24 @@
47
47
  "color-convert": "^3.1.3",
48
48
  "jsonschema": "^1.5.0",
49
49
  "kelvin-to-rgb": "^1.0.2",
50
- "mqtt": "^5.15.1"
50
+ "lodash": "^4.18.1",
51
+ "mqtt": "^5.15.1",
52
+ "uuid": "^11.1.1"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@eslint/js": "^10.0.1",
54
56
  "@types/color-convert": "^2.0.4",
55
57
  "@types/jest": "^30.0.0",
56
- "@types/node": "^25.6.0",
58
+ "@types/lodash": "^4.17.24",
59
+ "@types/node": "^25.9.4",
57
60
  "@typescript-eslint/eslint-plugin": "^8.58.2",
58
61
  "@typescript-eslint/parser": "^8.58.2",
59
62
  "eslint": "^10.2.1",
60
- "homebridge": "^2.0.0-beta.0",
61
- "jest": "^30.3.0",
63
+ "homebridge": "^2.0.0",
64
+ "jest": "^30.4.2",
62
65
  "nodemon": "^3.1.14",
63
66
  "rimraf": "^6.1.3",
64
- "ts-jest": "^29.4.9",
67
+ "ts-jest": "^29.4.11",
65
68
  "ts-node": "^10.9.2",
66
69
  "typescript": "^5.9.3"
67
70
  },