@homebridge-plugins/homebridge-tuya 3.0.0-beta.1 → 3.0.0-beta.10

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 (284) hide show
  1. package/ADVANCED_OPTIONS.md +17 -0
  2. package/README.md +8 -2
  3. package/config.schema.json +387 -576
  4. package/dist/cloud/api/TuyaOpenAPI.js +98 -58
  5. package/dist/cloud/api/TuyaOpenAPI.js.map +1 -1
  6. package/dist/cloud/api/TuyaOpenMQ.js +45 -22
  7. package/dist/cloud/api/TuyaOpenMQ.js.map +1 -1
  8. package/dist/cloud/device/{TuyaDeviceManager.js → TuyaCloudDeviceManager.js} +102 -80
  9. package/dist/cloud/device/TuyaCloudDeviceManager.js.map +1 -0
  10. package/dist/cloud/device/TuyaCustomDeviceManager.js +74 -5
  11. package/dist/cloud/device/TuyaCustomDeviceManager.js.map +1 -1
  12. package/dist/cloud/device/TuyaHomeDeviceManager.js +76 -9
  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 +3 -2
  19. package/dist/local/LocalDevice.js.map +1 -1
  20. package/dist/local/LocalDeviceManager.js +228 -87
  21. package/dist/local/LocalDeviceManager.js.map +1 -1
  22. package/dist/local/TuyaDiscovery.js +14 -7
  23. package/dist/local/TuyaDiscovery.js.map +1 -1
  24. package/dist/local/ZigbeeGatewayDetection.js +2 -2
  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 +245 -358
  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 +97 -0
  41. package/dist/shared/TuyaDeviceManager.js.map +1 -0
  42. package/dist/shared/TuyaHybridDeviceManager.js +145 -0
  43. package/dist/shared/TuyaHybridDeviceManager.js.map +1 -0
  44. package/dist/shared/accessory/AccessoryFactory.js +334 -0
  45. package/dist/shared/accessory/AccessoryFactory.js.map +1 -0
  46. package/dist/shared/{accessories → accessory}/AirConditionerAccessory.js.map +1 -1
  47. package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js.map +1 -1
  48. package/dist/shared/accessory/AirQualitySensorAccessory.js.map +1 -0
  49. package/dist/shared/{accessories → accessory}/BaseAccessory.js +26 -70
  50. package/dist/shared/accessory/BaseAccessory.js.map +1 -0
  51. package/dist/shared/{accessories → accessory}/BlindsAccessory.js.map +1 -1
  52. package/dist/shared/{accessories → accessory}/CameraAccessory.js.map +1 -1
  53. package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js.map +1 -1
  54. package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js.map +1 -1
  55. package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js.map +1 -1
  56. package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js.map +1 -1
  57. package/dist/shared/{accessories → accessory}/DiffuserAccessory.js.map +1 -1
  58. package/dist/shared/{accessories → accessory}/DimmerAccessory.js.map +1 -1
  59. package/dist/shared/{accessories → accessory}/DoorbellAccessory.js.map +1 -1
  60. package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js.map +1 -1
  61. package/dist/shared/{accessories → accessory}/FanAccessory.js.map +1 -1
  62. package/dist/shared/{accessories → accessory}/GarageDoorAccessory.js +19 -2
  63. package/dist/shared/accessory/GarageDoorAccessory.js.map +1 -0
  64. package/dist/shared/{accessories → accessory}/HeaterAccessory.js.map +1 -1
  65. package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js.map +1 -1
  66. package/dist/shared/accessory/HumanPresenceSensorAccessory.js.map +1 -0
  67. package/dist/shared/{accessories → accessory}/HumidifierAccessory.js.map +1 -1
  68. package/dist/shared/accessory/IRAirConditionerAccessory.js.map +1 -0
  69. package/dist/shared/accessory/IRControlHubAccessory.js.map +1 -0
  70. package/dist/shared/accessory/IRControlHubSubAccessory.js.map +1 -0
  71. package/dist/shared/accessory/IRGenericAccessory.js.map +1 -0
  72. package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js.map +1 -1
  73. package/dist/shared/{accessories → accessory}/LightAccessory.js.map +1 -1
  74. package/dist/shared/{accessories → accessory}/LightSensorAccessory.js.map +1 -1
  75. package/dist/shared/{accessories → accessory}/LocationWeatherAccessory.js +1 -1
  76. package/dist/shared/accessory/LocationWeatherAccessory.js.map +1 -0
  77. package/dist/shared/{accessories → accessory}/LockAccessory.js +3 -3
  78. package/dist/shared/{accessories → accessory}/LockAccessory.js.map +1 -1
  79. package/dist/shared/accessory/MotionSensorAccessory.js.map +1 -0
  80. package/dist/shared/accessory/OutletAccessory.js.map +1 -0
  81. package/dist/shared/{accessories → accessory}/PetFeederAccessory.js.map +1 -1
  82. package/dist/shared/{accessories → accessory}/SceneAccessory.js +1 -1
  83. package/dist/shared/accessory/SceneAccessory.js.map +1 -0
  84. package/dist/shared/accessory/SceneSwitchAccessory.js.map +1 -0
  85. package/dist/shared/accessory/SecuritySystemAccessory.js.map +1 -0
  86. package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js.map +1 -1
  87. package/dist/shared/{accessories → accessory}/SwitchAccessory.js +1 -45
  88. package/dist/shared/accessory/SwitchAccessory.js.map +1 -0
  89. package/dist/shared/accessory/TemperatureHumiditySensorAccessory.js.map +1 -0
  90. package/dist/shared/{accessories → accessory}/ThermostatAccessory.js.map +1 -1
  91. package/dist/shared/{accessories → accessory}/TowerRackAccessory.js.map +1 -1
  92. package/dist/shared/{accessories → accessory}/ValveAccessory.js.map +1 -1
  93. package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js.map +1 -1
  94. package/dist/shared/accessory/WeatherStationAccessory.js.map +1 -0
  95. package/dist/shared/accessory/WetBulbGlobeTemperatureAccessory.js.map +1 -0
  96. package/dist/shared/{accessories → accessory}/WhiteNoiseLightAccessory.js +1 -0
  97. package/dist/shared/accessory/WhiteNoiseLightAccessory.js.map +1 -0
  98. package/dist/shared/accessory/WindowAccessory.js.map +1 -0
  99. package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js.map +1 -1
  100. package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js.map +1 -1
  101. package/dist/shared/accessory/characteristic/Active.js.map +1 -0
  102. package/dist/shared/accessory/characteristic/AirQuality.js.map +1 -0
  103. package/dist/shared/accessory/characteristic/CurrentRelativeHumidity.js.map +1 -0
  104. package/dist/shared/accessory/characteristic/CurrentTemperature.js.map +1 -0
  105. package/dist/shared/accessory/characteristic/CurrentWeather.js.map +1 -0
  106. package/dist/shared/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
  107. package/dist/shared/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
  108. package/dist/shared/{accessories → accessory}/characteristic/EnergyUsage.js +0 -5
  109. package/dist/shared/accessory/characteristic/EnergyUsage.js.map +1 -0
  110. package/dist/shared/{accessories → accessory}/characteristic/Light.js +28 -5
  111. package/dist/shared/accessory/characteristic/Light.js.map +1 -0
  112. package/dist/shared/accessory/characteristic/LightSensor.js.map +1 -0
  113. package/dist/shared/accessory/characteristic/LockPhysicalControls.js.map +1 -0
  114. package/dist/shared/accessory/characteristic/MotionDetected.js.map +1 -0
  115. package/dist/shared/accessory/characteristic/Name.js.map +1 -0
  116. package/dist/shared/accessory/characteristic/OccupancyDetected.js.map +1 -0
  117. package/dist/shared/{accessories → accessory}/characteristic/On.js +1 -0
  118. package/dist/shared/accessory/characteristic/On.js.map +1 -0
  119. package/dist/shared/accessory/characteristic/OutletInUse.js.map +1 -0
  120. package/dist/shared/accessory/characteristic/ProgrammableSwitchEvent.js.map +1 -0
  121. package/dist/shared/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
  122. package/dist/shared/accessory/characteristic/RotationSpeed.js.map +1 -0
  123. package/dist/shared/accessory/characteristic/SecuritySystemState.js.map +1 -0
  124. package/dist/shared/accessory/characteristic/SwingMode.js.map +1 -0
  125. package/dist/shared/accessory/characteristic/TargetTemperature.js.map +1 -0
  126. package/dist/shared/accessory/characteristic/TemperatureDisplayUnits.js.map +1 -0
  127. package/dist/shared/util/ConfigHash.js +2 -2
  128. package/dist/shared/util/ConfigHash.js.map +1 -1
  129. package/dist/shared/util/ConfigMigrator.js +173 -0
  130. package/dist/shared/util/ConfigMigrator.js.map +1 -0
  131. package/dist/shared/util/FfmpegStreamingProcess.js.map +1 -1
  132. package/dist/shared/util/InfraredTool.js +0 -2
  133. package/dist/shared/util/InfraredTool.js.map +1 -1
  134. package/dist/shared/util/Logger.js +69 -10
  135. package/dist/shared/util/Logger.js.map +1 -1
  136. package/dist/shared/util/TuyaStreamDelegate.js +2 -8
  137. package/dist/shared/util/TuyaStreamDelegate.js.map +1 -1
  138. package/dist/shared/util/util.js +13 -4
  139. package/dist/shared/util/util.js.map +1 -1
  140. package/eslint.config.mjs +0 -1
  141. package/{jest.config.js → jest.config.ts} +5 -2
  142. package/package.json +14 -11
  143. package/test/ConfigMigrator.test.ts +799 -0
  144. package/test/Logger.test.ts +482 -0
  145. package/test/accessoryFactory.data.test.ts +172 -0
  146. package/test/accessoryFactory.test.ts +64 -35
  147. package/test/config.test.ts +17 -13
  148. package/test/custom.test.ts +2 -2
  149. package/test/errorHandling.test.ts +12 -12
  150. package/test/home.test.ts +1 -1
  151. package/test/hybridDeviceManager.test.ts +808 -0
  152. package/test/light.test.ts +250 -0
  153. package/test/localDevice.test.ts +21 -50
  154. package/test/localDeviceManager.behavior.test.ts +16 -30
  155. package/test/localDeviceManager.test.ts +77 -34
  156. package/test/mqttMessages.test.ts +33 -14
  157. package/test/platform.test.ts +385 -60
  158. package/test/platform.validation.local.test.ts +58 -119
  159. package/test/tuyaCustomDeviceManager.test.ts +106 -16
  160. package/test/tuyaDeviceManager.test.ts +636 -639
  161. package/test/tuyaDiscovery.test.ts +21 -33
  162. package/test/tuyaHomeDeviceManager.test.ts +109 -18
  163. package/test/tuyaOpenAPI.test.ts +25 -44
  164. package/test/tuyaOpenMQ.test.ts +15 -23
  165. package/test/util.test.ts +87 -7
  166. package/test/zigbee/LocalDevice.zigbee.test.ts +14 -18
  167. package/test/zigbee/LocalDeviceManager.cloud-discovery.test.ts +19 -20
  168. package/test/zigbee/LocalDeviceManager.zigbee.reconnect.test.ts +18 -20
  169. package/test/zigbee/LocalDeviceManager.zigbee.test.ts +31 -34
  170. package/test/zigbee/ZigbeeGatewayDetection.test.ts +2 -2
  171. package/dist/cloud/device/TuyaDeviceManager.js.map +0 -1
  172. package/dist/local/CloudLocalReconciliation.js +0 -180
  173. package/dist/local/CloudLocalReconciliation.js.map +0 -1
  174. package/dist/shared/AccessoryFactory.js +0 -276
  175. package/dist/shared/AccessoryFactory.js.map +0 -1
  176. package/dist/shared/accessories/AccessoryFactory.js +0 -305
  177. package/dist/shared/accessories/AccessoryFactory.js.map +0 -1
  178. package/dist/shared/accessories/AirQualitySensorAccessory.js.map +0 -1
  179. package/dist/shared/accessories/BaseAccessory.js.map +0 -1
  180. package/dist/shared/accessories/GarageDoorAccessory.js.map +0 -1
  181. package/dist/shared/accessories/HumanPresenceSensorAccessory.js.map +0 -1
  182. package/dist/shared/accessories/IRAirConditionerAccessory.js.map +0 -1
  183. package/dist/shared/accessories/IRControlHubAccessory.js.map +0 -1
  184. package/dist/shared/accessories/IRControlHubSubAccessory.js.map +0 -1
  185. package/dist/shared/accessories/IRGenericAccessory.js.map +0 -1
  186. package/dist/shared/accessories/LocationWeatherAccessory.js.map +0 -1
  187. package/dist/shared/accessories/MotionSensorAccessory.js.map +0 -1
  188. package/dist/shared/accessories/OutletAccessory.js.map +0 -1
  189. package/dist/shared/accessories/SceneAccessory.js.map +0 -1
  190. package/dist/shared/accessories/SceneSwitchAccessory.js.map +0 -1
  191. package/dist/shared/accessories/SecuritySystemAccessory.js.map +0 -1
  192. package/dist/shared/accessories/SwitchAccessory.js.map +0 -1
  193. package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js.map +0 -1
  194. package/dist/shared/accessories/WeatherStationAccessory.js.map +0 -1
  195. package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js.map +0 -1
  196. package/dist/shared/accessories/WhiteNoiseLightAccessory.js.map +0 -1
  197. package/dist/shared/accessories/WindowAccessory.js.map +0 -1
  198. package/dist/shared/accessories/characteristic/Active.js.map +0 -1
  199. package/dist/shared/accessories/characteristic/AirQuality.js.map +0 -1
  200. package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js.map +0 -1
  201. package/dist/shared/accessories/characteristic/CurrentTemperature.js.map +0 -1
  202. package/dist/shared/accessories/characteristic/CurrentWeather.js.map +0 -1
  203. package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js.map +0 -1
  204. package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js.map +0 -1
  205. package/dist/shared/accessories/characteristic/EnergyUsage.js.map +0 -1
  206. package/dist/shared/accessories/characteristic/Light.js.map +0 -1
  207. package/dist/shared/accessories/characteristic/LightSensor.js.map +0 -1
  208. package/dist/shared/accessories/characteristic/LockPhysicalControls.js.map +0 -1
  209. package/dist/shared/accessories/characteristic/MotionDetected.js.map +0 -1
  210. package/dist/shared/accessories/characteristic/Name.js.map +0 -1
  211. package/dist/shared/accessories/characteristic/OccupancyDetected.js.map +0 -1
  212. package/dist/shared/accessories/characteristic/On.js.map +0 -1
  213. package/dist/shared/accessories/characteristic/OutletInUse.js.map +0 -1
  214. package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js.map +0 -1
  215. package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js.map +0 -1
  216. package/dist/shared/accessories/characteristic/RotationSpeed.js.map +0 -1
  217. package/dist/shared/accessories/characteristic/SecuritySystemState.js.map +0 -1
  218. package/dist/shared/accessories/characteristic/SwingMode.js.map +0 -1
  219. package/dist/shared/accessories/characteristic/TargetTemperature.js.map +0 -1
  220. package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js.map +0 -1
  221. package/test/zigbee/CloudLocalReconciliation.test.ts +0 -284
  222. package/tuya-local-configs/dev-1.hash +0 -1
  223. package/tuya-local-configs/device1.hash +0 -1
  224. /package/dist/shared/{accessories → accessory}/AirConditionerAccessory.js +0 -0
  225. /package/dist/shared/{accessories → accessory}/AirPurifierAccessory.js +0 -0
  226. /package/dist/shared/{accessories → accessory}/AirQualitySensorAccessory.js +0 -0
  227. /package/dist/shared/{accessories → accessory}/BlindsAccessory.js +0 -0
  228. /package/dist/shared/{accessories → accessory}/CameraAccessory.js +0 -0
  229. /package/dist/shared/{accessories → accessory}/CarbonDioxideSensorAccessory.js +0 -0
  230. /package/dist/shared/{accessories → accessory}/CarbonMonoxideSensorAccessory.js +0 -0
  231. /package/dist/shared/{accessories → accessory}/ContactSensorAccessory.js +0 -0
  232. /package/dist/shared/{accessories → accessory}/DehumidifierAccessory.js +0 -0
  233. /package/dist/shared/{accessories → accessory}/DiffuserAccessory.js +0 -0
  234. /package/dist/shared/{accessories → accessory}/DimmerAccessory.js +0 -0
  235. /package/dist/shared/{accessories → accessory}/DoorbellAccessory.js +0 -0
  236. /package/dist/shared/{accessories → accessory}/ExtractionHoodAccessory.js +0 -0
  237. /package/dist/shared/{accessories → accessory}/FanAccessory.js +0 -0
  238. /package/dist/shared/{accessories → accessory}/HeaterAccessory.js +0 -0
  239. /package/dist/shared/{accessories → accessory}/HeaterAccessory_old.js +0 -0
  240. /package/dist/shared/{accessories → accessory}/HumanPresenceSensorAccessory.js +0 -0
  241. /package/dist/shared/{accessories → accessory}/HumidifierAccessory.js +0 -0
  242. /package/dist/shared/{accessories → accessory}/IRAirConditionerAccessory.js +0 -0
  243. /package/dist/shared/{accessories → accessory}/IRControlHubAccessory.js +0 -0
  244. /package/dist/shared/{accessories → accessory}/IRControlHubSubAccessory.js +0 -0
  245. /package/dist/shared/{accessories → accessory}/IRGenericAccessory.js +0 -0
  246. /package/dist/shared/{accessories → accessory}/LeakSensorAccessory.js +0 -0
  247. /package/dist/shared/{accessories → accessory}/LightAccessory.js +0 -0
  248. /package/dist/shared/{accessories → accessory}/LightSensorAccessory.js +0 -0
  249. /package/dist/shared/{accessories → accessory}/MotionSensorAccessory.js +0 -0
  250. /package/dist/shared/{accessories → accessory}/OutletAccessory.js +0 -0
  251. /package/dist/shared/{accessories → accessory}/PetFeederAccessory.js +0 -0
  252. /package/dist/shared/{accessories → accessory}/SceneSwitchAccessory.js +0 -0
  253. /package/dist/shared/{accessories → accessory}/SecuritySystemAccessory.js +0 -0
  254. /package/dist/shared/{accessories → accessory}/SmokeSensorAccessory.js +0 -0
  255. /package/dist/shared/{accessories → accessory}/TemperatureHumiditySensorAccessory.js +0 -0
  256. /package/dist/shared/{accessories → accessory}/ThermostatAccessory.js +0 -0
  257. /package/dist/shared/{accessories → accessory}/TowerRackAccessory.js +0 -0
  258. /package/dist/shared/{accessories → accessory}/ValveAccessory.js +0 -0
  259. /package/dist/shared/{accessories → accessory}/VibrationSensorAccessory.js +0 -0
  260. /package/dist/shared/{accessories → accessory}/WeatherStationAccessory.js +0 -0
  261. /package/dist/shared/{accessories → accessory}/WetBulbGlobeTemperatureAccessory.js +0 -0
  262. /package/dist/shared/{accessories → accessory}/WindowAccessory.js +0 -0
  263. /package/dist/shared/{accessories → accessory}/WindowCoveringAccessory.js +0 -0
  264. /package/dist/shared/{accessories → accessory}/WirelessSwitchAccessory.js +0 -0
  265. /package/dist/shared/{accessories → accessory}/characteristic/Active.js +0 -0
  266. /package/dist/shared/{accessories → accessory}/characteristic/AirQuality.js +0 -0
  267. /package/dist/shared/{accessories → accessory}/characteristic/CurrentRelativeHumidity.js +0 -0
  268. /package/dist/shared/{accessories → accessory}/characteristic/CurrentTemperature.js +0 -0
  269. /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeather.js +0 -0
  270. /package/dist/shared/{accessories → accessory}/characteristic/CurrentWeatherByOpenMeteo.js +0 -0
  271. /package/dist/shared/{accessories → accessory}/characteristic/CurrentWetBulbGlobeTemperature.js +0 -0
  272. /package/dist/shared/{accessories → accessory}/characteristic/LightSensor.js +0 -0
  273. /package/dist/shared/{accessories → accessory}/characteristic/LockPhysicalControls.js +0 -0
  274. /package/dist/shared/{accessories → accessory}/characteristic/MotionDetected.js +0 -0
  275. /package/dist/shared/{accessories → accessory}/characteristic/Name.js +0 -0
  276. /package/dist/shared/{accessories → accessory}/characteristic/OccupancyDetected.js +0 -0
  277. /package/dist/shared/{accessories → accessory}/characteristic/OutletInUse.js +0 -0
  278. /package/dist/shared/{accessories → accessory}/characteristic/ProgrammableSwitchEvent.js +0 -0
  279. /package/dist/shared/{accessories → accessory}/characteristic/RelativeHumidityDehumidifierThreshold.js +0 -0
  280. /package/dist/shared/{accessories → accessory}/characteristic/RotationSpeed.js +0 -0
  281. /package/dist/shared/{accessories → accessory}/characteristic/SecuritySystemState.js +0 -0
  282. /package/dist/shared/{accessories → accessory}/characteristic/SwingMode.js +0 -0
  283. /package/dist/shared/{accessories → accessory}/characteristic/TargetTemperature.js +0 -0
  284. /package/dist/shared/{accessories → accessory}/characteristic/TemperatureDisplayUnits.js +0 -0
@@ -20,6 +20,7 @@ Before configuring, you may need to:
20
20
  - `category` - **optional**: Device category code. See [SUPPORTED_DEVICES.md](./SUPPORTED_DEVICES.md). Also you can use `hidden` to hide the device, product, or scene. **⚠️Overriding this property may lead to unexpected behaviors and exceptions, so please remove the accessory cache after making changes.**
21
21
  - `unbridged` - **optional**: Unbridge accessories. Defaults to `false`.
22
22
  - `adaptiveLighting` - **optional**: Adaptive Lighting. Defaults to `false`. Not all light device support this feature, please use it on demand.
23
+ - `garageDoorUseContactSensorForState` - **optional**: For garage door controllers. When `true`, `CurrentDoorState` and `TargetDoorState` reads use `doorcontact_state` only, while set commands still use `switch_1`. Defaults to `false`.
23
24
  - `schema` - **optional**: An array of schema overriding config objects, used for describing datapoint (DP). When your device has non-standard DP, you need to transform them manually with configuration. Each element in the schema array is described as follows:
24
25
  - `code` - **required**: DP code.
25
26
  - `newCode` - **optional**: New DP code.
@@ -94,6 +95,22 @@ An example of hide camera's floodlight (`floodlight_switch`):
94
95
  }
95
96
  ```
96
97
 
98
+ ### Use garage door contact sensor for state
99
+
100
+ Some `ckmkzq` garage door controllers keep `switch_1` as `true`, which can make HomeKit show the door as stuck Opening or Closing. Enable this per-device option to read the door state from `doorcontact_state`, while commands are still sent to `switch_1`.
101
+
102
+ ```js
103
+ {
104
+ "options": {
105
+ // ...
106
+ "deviceOverrides": [{
107
+ "id": "{device_id}",
108
+ "garageDoorUseContactSensorForState": true
109
+ }]
110
+ }
111
+ }
112
+ ```
113
+
97
114
 
98
115
  ### Offline as off
99
116
 
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![verified-by-homebridge](https://img.shields.io/badge/homebridge-verified-blueviolet?color=%23491F59&style=for-the-badge&logoColor=%23FFFFFF&logo=homebridge)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
4
4
 
5
5
  ![node](https://badgen.net/npm/node/@homebridge-plugins/homebridge-tuya)
6
- ![homebridge](https://img.shields.io/github/package-json/dependency-version/homebridge-plugins/homebridge-tuya/dev/homebridge)
6
+ ![homebridge](https://img.shields.io/github/package-json/dependency-version/homebridge-plugins/homebridge-tuya/peer/homebridge)
7
7
 
8
8
  [![Sponsor](https://img.shields.io/badge/Sponsor-❤-ff69b4)](https://github.com/sponsors/tassy-h)
9
9
  [![version](https://badgen.net/npm/v/@homebridge-plugins/homebridge-tuya)](https://npmjs.com/package/@homebridge-plugins/homebridge-tuya)
@@ -174,12 +174,18 @@ Communicates directly with your Tuya devices over LAN — no internet or Tuya Cl
174
174
  ### Both Mode (`mode: "both"`)
175
175
 
176
176
  Uses cloud + local simultaneously. Provide both `options` (cloud) and `local` blocks.
177
-
177
+ - Local LAN commands are attempted first when the device is available locally.
178
+ - The cloud connection remains active as a fallback.
179
+ - This fallback is only used when a local command does not receive confirmation within 10 seconds; normal local commands remain local.
180
+ - If a local command does not receive confirmation within 10 seconds, the plugin automatically retries it via cloud.
181
+ - Cloud status updates can also satisfy pending local commands so the device does not get double-sent commands.
178
182
  ---
179
183
 
180
184
  ### Advanced Options
181
185
  See [ADVANCED_OPTIONS.md](./ADVANCED_OPTIONS.md)
182
186
 
187
+ Garage door controllers that keep `switch_1=true` can opt in to contact-sensor-only state reads with `garageDoorUseContactSensorForState` in `options.deviceOverrides`. This keeps commands on `switch_1`, but reads HomeKit state from `doorcontact_state`.
188
+
183
189
 
184
190
  ## Limitations
185
191
  - Using the same app account for multiple Homebridge/HomeAssistant instances is not recommended. Use separate app accounts per instance.