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