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

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 (341) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +161 -144
  3. package/config.schema.json +976 -11
  4. package/dist/{core → cloud/api}/TuyaOpenAPI.js +6 -7
  5. package/dist/cloud/api/TuyaOpenAPI.js.map +1 -0
  6. package/dist/{core → cloud/api}/TuyaOpenMQ.js +13 -11
  7. package/dist/cloud/api/TuyaOpenMQ.js.map +1 -0
  8. package/dist/cloud/device/TuyaCustomDeviceManager.js.map +1 -0
  9. package/dist/{device → cloud/device}/TuyaDevice.js +14 -1
  10. package/dist/cloud/device/TuyaDevice.js.map +1 -0
  11. package/dist/{device → cloud/device}/TuyaDeviceManager.js +8 -3
  12. package/dist/cloud/device/TuyaDeviceManager.js.map +1 -0
  13. package/dist/cloud/device/TuyaHomeDeviceManager.js.map +1 -0
  14. package/dist/config.js +1 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/local/CloudLocalReconciliation.js +180 -0
  17. package/dist/local/CloudLocalReconciliation.js.map +1 -0
  18. package/dist/local/DynamicChildDiscovery.js +154 -0
  19. package/dist/local/DynamicChildDiscovery.js.map +1 -0
  20. package/dist/local/LocalDevice.js +419 -0
  21. package/dist/local/LocalDevice.js.map +1 -0
  22. package/dist/local/LocalDeviceManager.js +833 -0
  23. package/dist/local/LocalDeviceManager.js.map +1 -0
  24. package/dist/local/TuyaDiscovery.js +248 -0
  25. package/dist/local/TuyaDiscovery.js.map +1 -0
  26. package/dist/local/ZigbeeEventDetection.js +213 -0
  27. package/dist/local/ZigbeeEventDetection.js.map +1 -0
  28. package/dist/local/ZigbeeGatewayDetection.js +109 -0
  29. package/dist/local/ZigbeeGatewayDetection.js.map +1 -0
  30. package/dist/local/config.js +6 -0
  31. package/dist/local/config.js.map +1 -0
  32. package/dist/local/protocol/ChildPayloadUtility.js +94 -0
  33. package/dist/local/protocol/ChildPayloadUtility.js.map +1 -0
  34. package/dist/local/protocol/Protocol.js +3 -0
  35. package/dist/local/protocol/Protocol.js.map +1 -0
  36. package/dist/local/protocol/ProtocolFactory.js +27 -0
  37. package/dist/local/protocol/ProtocolFactory.js.map +1 -0
  38. package/dist/local/protocol/ProtocolUtilities.js +329 -0
  39. package/dist/local/protocol/ProtocolUtilities.js.map +1 -0
  40. package/dist/local/protocol/ProtocolV31V32.js +60 -0
  41. package/dist/local/protocol/ProtocolV31V32.js.map +1 -0
  42. package/dist/local/protocol/ProtocolV33.js +52 -0
  43. package/dist/local/protocol/ProtocolV33.js.map +1 -0
  44. package/dist/local/protocol/ProtocolV34.js +104 -0
  45. package/dist/local/protocol/ProtocolV34.js.map +1 -0
  46. package/dist/local/protocol/ProtocolV35.js +77 -0
  47. package/dist/local/protocol/ProtocolV35.js.map +1 -0
  48. package/dist/platform.js +149 -69
  49. package/dist/platform.js.map +1 -1
  50. package/dist/shared/AccessoryFactory.js +276 -0
  51. package/dist/shared/AccessoryFactory.js.map +1 -0
  52. package/dist/{accessory → shared/accessories}/AccessoryFactory.js +2 -2
  53. package/dist/shared/accessories/AccessoryFactory.js.map +1 -0
  54. package/dist/shared/accessories/AirConditionerAccessory.js.map +1 -0
  55. package/dist/{accessory → shared/accessories}/AirPurifierAccessory.js +1 -1
  56. package/dist/shared/accessories/AirPurifierAccessory.js.map +1 -0
  57. package/dist/shared/accessories/AirQualitySensorAccessory.js.map +1 -0
  58. package/dist/{accessory → shared/accessories}/BaseAccessory.js +99 -30
  59. package/dist/shared/accessories/BaseAccessory.js.map +1 -0
  60. package/dist/shared/accessories/BlindsAccessory.js +199 -0
  61. package/dist/shared/accessories/BlindsAccessory.js.map +1 -0
  62. package/dist/{accessory → shared/accessories}/CameraAccessory.js +7 -3
  63. package/dist/shared/accessories/CameraAccessory.js.map +1 -0
  64. package/dist/shared/accessories/CarbonDioxideSensorAccessory.js.map +1 -0
  65. package/dist/shared/accessories/CarbonMonoxideSensorAccessory.js.map +1 -0
  66. package/dist/shared/accessories/ContactSensorAccessory.js.map +1 -0
  67. package/dist/shared/accessories/DehumidifierAccessory.js.map +1 -0
  68. package/dist/shared/accessories/DiffuserAccessory.js.map +1 -0
  69. package/dist/shared/accessories/DimmerAccessory.js.map +1 -0
  70. package/dist/{accessory → shared/accessories}/DoorbellAccessory.js +3 -1
  71. package/dist/shared/accessories/DoorbellAccessory.js.map +1 -0
  72. package/dist/{accessory → shared/accessories}/ExtractionHoodAccessory.js +4 -2
  73. package/dist/shared/accessories/ExtractionHoodAccessory.js.map +1 -0
  74. package/dist/{accessory → shared/accessories}/FanAccessory.js +10 -4
  75. package/dist/shared/accessories/FanAccessory.js.map +1 -0
  76. package/dist/shared/accessories/GarageDoorAccessory.js.map +1 -0
  77. package/dist/shared/accessories/HeaterAccessory.js.map +1 -0
  78. package/dist/shared/accessories/HeaterAccessory_old.js.map +1 -0
  79. package/dist/shared/accessories/HumanPresenceSensorAccessory.js.map +1 -0
  80. package/dist/{accessory → shared/accessories}/HumidifierAccessory.js +3 -1
  81. package/dist/shared/accessories/HumidifierAccessory.js.map +1 -0
  82. package/dist/{accessory → shared/accessories}/IRAirConditionerAccessory.js +2 -2
  83. package/dist/shared/accessories/IRAirConditionerAccessory.js.map +1 -0
  84. package/dist/shared/accessories/IRControlHubAccessory.js.map +1 -0
  85. package/dist/shared/accessories/IRControlHubSubAccessory.js.map +1 -0
  86. package/dist/shared/accessories/IRGenericAccessory.js.map +1 -0
  87. package/dist/shared/accessories/LeakSensorAccessory.js.map +1 -0
  88. package/dist/shared/accessories/LightAccessory.js.map +1 -0
  89. package/dist/shared/accessories/LightSensorAccessory.js.map +1 -0
  90. package/dist/shared/accessories/LocationWeatherAccessory.js.map +1 -0
  91. package/dist/shared/accessories/LockAccessory.js.map +1 -0
  92. package/dist/shared/accessories/MotionSensorAccessory.js.map +1 -0
  93. package/dist/shared/accessories/OutletAccessory.js.map +1 -0
  94. package/dist/shared/accessories/PetFeederAccessory.js.map +1 -0
  95. package/dist/shared/accessories/SceneAccessory.js.map +1 -0
  96. package/dist/{accessory → shared/accessories}/SceneSwitchAccessory.js +1 -1
  97. package/dist/shared/accessories/SceneSwitchAccessory.js.map +1 -0
  98. package/dist/shared/accessories/SecuritySystemAccessory.js.map +1 -0
  99. package/dist/shared/accessories/SmokeSensorAccessory.js.map +1 -0
  100. package/dist/shared/accessories/SwitchAccessory.js +148 -0
  101. package/dist/shared/accessories/SwitchAccessory.js.map +1 -0
  102. package/dist/shared/accessories/TemperatureHumiditySensorAccessory.js.map +1 -0
  103. package/dist/shared/accessories/ThermostatAccessory.js.map +1 -0
  104. package/dist/shared/accessories/TowerRackAccessory.js.map +1 -0
  105. package/dist/{accessory → shared/accessories}/ValveAccessory.js +1 -1
  106. package/dist/shared/accessories/ValveAccessory.js.map +1 -0
  107. package/dist/{accessory → shared/accessories}/VibrationSensorAccessory.js +7 -3
  108. package/dist/shared/accessories/VibrationSensorAccessory.js.map +1 -0
  109. package/dist/shared/accessories/WeatherStationAccessory.js.map +1 -0
  110. package/dist/shared/accessories/WetBulbGlobeTemperatureAccessory.js.map +1 -0
  111. package/dist/shared/accessories/WhiteNoiseLightAccessory.js.map +1 -0
  112. package/dist/shared/accessories/WindowAccessory.js.map +1 -0
  113. package/dist/shared/accessories/WindowCoveringAccessory.js.map +1 -0
  114. package/dist/shared/accessories/WirelessSwitchAccessory.js.map +1 -0
  115. package/dist/shared/accessories/characteristic/Active.js.map +1 -0
  116. package/dist/{accessory → shared/accessories}/characteristic/AirQuality.js +1 -1
  117. package/dist/shared/accessories/characteristic/AirQuality.js.map +1 -0
  118. package/dist/shared/accessories/characteristic/CurrentRelativeHumidity.js.map +1 -0
  119. package/dist/shared/accessories/characteristic/CurrentTemperature.js.map +1 -0
  120. package/dist/shared/accessories/characteristic/CurrentWeather.js.map +1 -0
  121. package/dist/shared/accessories/characteristic/CurrentWeatherByOpenMeteo.js.map +1 -0
  122. package/dist/shared/accessories/characteristic/CurrentWetBulbGlobeTemperature.js.map +1 -0
  123. package/dist/shared/accessories/characteristic/EnergyUsage.js.map +1 -0
  124. package/dist/shared/accessories/characteristic/Light.js.map +1 -0
  125. package/dist/shared/accessories/characteristic/LightSensor.js.map +1 -0
  126. package/dist/shared/accessories/characteristic/LockPhysicalControls.js.map +1 -0
  127. package/dist/{accessory → shared/accessories}/characteristic/MotionDetected.js +1 -1
  128. package/dist/shared/accessories/characteristic/MotionDetected.js.map +1 -0
  129. package/dist/shared/accessories/characteristic/Name.js.map +1 -0
  130. package/dist/shared/accessories/characteristic/OccupancyDetected.js.map +1 -0
  131. package/dist/{accessory → shared/accessories}/characteristic/On.js +1 -1
  132. package/dist/shared/accessories/characteristic/On.js.map +1 -0
  133. package/dist/shared/accessories/characteristic/OutletInUse.js.map +1 -0
  134. package/dist/{accessory → shared/accessories}/characteristic/ProgrammableSwitchEvent.js +2 -2
  135. package/dist/shared/accessories/characteristic/ProgrammableSwitchEvent.js.map +1 -0
  136. package/dist/shared/accessories/characteristic/RelativeHumidityDehumidifierThreshold.js.map +1 -0
  137. package/dist/shared/accessories/characteristic/RotationSpeed.js.map +1 -0
  138. package/dist/shared/accessories/characteristic/SecuritySystemState.js.map +1 -0
  139. package/dist/shared/accessories/characteristic/SwingMode.js.map +1 -0
  140. package/dist/shared/accessories/characteristic/TargetTemperature.js.map +1 -0
  141. package/dist/shared/accessories/characteristic/TemperatureDisplayUnits.js.map +1 -0
  142. package/dist/shared/util/ConfigHash.js +79 -0
  143. package/dist/shared/util/ConfigHash.js.map +1 -0
  144. package/dist/shared/util/FfmpegStreamingProcess.js.map +1 -0
  145. package/dist/shared/util/InfraredTool.js.map +1 -0
  146. package/dist/shared/util/Logger.js.map +1 -0
  147. package/dist/shared/util/TuyaRecordingDelegate.js.map +1 -0
  148. package/dist/shared/util/TuyaStreamDelegate.js.map +1 -0
  149. package/dist/shared/util/color.js.map +1 -0
  150. package/dist/shared/util/util.js +135 -0
  151. package/dist/shared/util/util.js.map +1 -0
  152. package/eslint.config.mjs +52 -0
  153. package/jest.config.js +6 -0
  154. package/package.json +22 -27
  155. package/test/__mocks__/@homebridge-camera-utils.js +10 -0
  156. package/test/__mocks__/color-convert.js +24 -0
  157. package/test/__mocks__/kelvin-to-rgb.js +21 -0
  158. package/test/accessoryFactory.test.ts +522 -0
  159. package/test/config.test.ts +430 -0
  160. package/test/custom.test.ts +4 -4
  161. package/test/errorHandling.test.ts +570 -0
  162. package/test/errorHandlingCoverage.test.ts +410 -0
  163. package/test/home.test.ts +4 -4
  164. package/test/localDevice.test.ts +616 -0
  165. package/test/localDeviceManager.behavior.test.ts +185 -0
  166. package/test/localDeviceManager.test.ts +268 -0
  167. package/test/mqttMessages.test.ts +495 -0
  168. package/test/platform.test.ts +515 -0
  169. package/test/platform.validation.local.test.ts +250 -0
  170. package/test/protocol.test.ts +446 -0
  171. package/test/protocolUtilities.test.ts +351 -0
  172. package/test/sanitizeName.test.ts +2 -1
  173. package/test/tuyaCustomDeviceManager.test.ts +469 -0
  174. package/test/tuyaDevice.test.ts +425 -0
  175. package/test/tuyaDeviceManager.test.ts +813 -0
  176. package/test/tuyaDiscovery.test.ts +439 -0
  177. package/test/tuyaHomeDeviceManager.test.ts +540 -0
  178. package/test/tuyaOpenAPI.test.ts +404 -0
  179. package/test/tuyaOpenMQ.test.ts +444 -0
  180. package/test/util.test.ts +318 -0
  181. package/test/util.ts +4 -3
  182. package/test/zigbee/ChildPayloadUtility.test.ts +199 -0
  183. package/test/zigbee/CloudLocalReconciliation.test.ts +284 -0
  184. package/test/zigbee/DynamicChildDiscovery.test.ts +333 -0
  185. package/test/zigbee/LocalDevice.zigbee.test.ts +274 -0
  186. package/test/zigbee/LocalDeviceManager.cloud-discovery.test.ts +163 -0
  187. package/test/zigbee/LocalDeviceManager.zigbee.reconnect.test.ts +200 -0
  188. package/test/zigbee/LocalDeviceManager.zigbee.test.ts +344 -0
  189. package/test/zigbee/ZigbeeEventDetection.test.ts +418 -0
  190. package/test/zigbee/ZigbeeGatewayDetection.test.ts +222 -0
  191. package/tuya-local-configs/dev-1.hash +1 -0
  192. package/tuya-local-configs/device1.hash +1 -0
  193. package/wiki/Get-Local-Keys-for-Your-Devices.md +85 -0
  194. package/dist/accessory/AccessoryFactory.js.map +0 -1
  195. package/dist/accessory/AirConditionerAccessory.js.map +0 -1
  196. package/dist/accessory/AirPurifierAccessory.js.map +0 -1
  197. package/dist/accessory/AirQualitySensorAccessory.js.map +0 -1
  198. package/dist/accessory/BaseAccessory.js.map +0 -1
  199. package/dist/accessory/CameraAccessory.js.map +0 -1
  200. package/dist/accessory/CarbonDioxideSensorAccessory.js.map +0 -1
  201. package/dist/accessory/CarbonMonoxideSensorAccessory.js.map +0 -1
  202. package/dist/accessory/ContactSensorAccessory.js.map +0 -1
  203. package/dist/accessory/DehumidifierAccessory.js.map +0 -1
  204. package/dist/accessory/DiffuserAccessory.js.map +0 -1
  205. package/dist/accessory/DimmerAccessory.js.map +0 -1
  206. package/dist/accessory/DoorbellAccessory.js.map +0 -1
  207. package/dist/accessory/ExtractionHoodAccessory.js.map +0 -1
  208. package/dist/accessory/FanAccessory.js.map +0 -1
  209. package/dist/accessory/GarageDoorAccessory.js.map +0 -1
  210. package/dist/accessory/HeaterAccessory.js.map +0 -1
  211. package/dist/accessory/HeaterAccessory_old.js.map +0 -1
  212. package/dist/accessory/HumanPresenceSensorAccessory.js.map +0 -1
  213. package/dist/accessory/HumidifierAccessory.js.map +0 -1
  214. package/dist/accessory/IRAirConditionerAccessory.js.map +0 -1
  215. package/dist/accessory/IRControlHubAccessory.js.map +0 -1
  216. package/dist/accessory/IRControlHubSubAccessory.js.map +0 -1
  217. package/dist/accessory/IRGenericAccessory.js.map +0 -1
  218. package/dist/accessory/LeakSensorAccessory.js.map +0 -1
  219. package/dist/accessory/LightAccessory.js.map +0 -1
  220. package/dist/accessory/LightSensorAccessory.js.map +0 -1
  221. package/dist/accessory/LocationWeatherAccessory.js.map +0 -1
  222. package/dist/accessory/LockAccessory.js.map +0 -1
  223. package/dist/accessory/MotionSensorAccessory.js.map +0 -1
  224. package/dist/accessory/OutletAccessory.js.map +0 -1
  225. package/dist/accessory/PetFeederAccessory.js.map +0 -1
  226. package/dist/accessory/SceneAccessory.js.map +0 -1
  227. package/dist/accessory/SceneSwitchAccessory.js.map +0 -1
  228. package/dist/accessory/SecuritySystemAccessory.js.map +0 -1
  229. package/dist/accessory/SmokeSensorAccessory.js.map +0 -1
  230. package/dist/accessory/SwitchAccessory.js +0 -85
  231. package/dist/accessory/SwitchAccessory.js.map +0 -1
  232. package/dist/accessory/TemperatureHumiditySensorAccessory.js.map +0 -1
  233. package/dist/accessory/ThermostatAccessory.js.map +0 -1
  234. package/dist/accessory/TowerRackAccessory.js.map +0 -1
  235. package/dist/accessory/ValveAccessory.js.map +0 -1
  236. package/dist/accessory/VibrationSensorAccessory.js.map +0 -1
  237. package/dist/accessory/WeatherStationAccessory.js.map +0 -1
  238. package/dist/accessory/WetBulbGlobeTemperatureAccessory.js.map +0 -1
  239. package/dist/accessory/WhiteNoiseLightAccessory.js.map +0 -1
  240. package/dist/accessory/WindowAccessory.js.map +0 -1
  241. package/dist/accessory/WindowCoveringAccessory.js.map +0 -1
  242. package/dist/accessory/WirelessSwitchAccessory.js.map +0 -1
  243. package/dist/accessory/characteristic/Active.js.map +0 -1
  244. package/dist/accessory/characteristic/AirQuality.js.map +0 -1
  245. package/dist/accessory/characteristic/CurrentRelativeHumidity.js.map +0 -1
  246. package/dist/accessory/characteristic/CurrentTemperature.js.map +0 -1
  247. package/dist/accessory/characteristic/CurrentWeather.js.map +0 -1
  248. package/dist/accessory/characteristic/CurrentWeatherByOpenMeteo.js.map +0 -1
  249. package/dist/accessory/characteristic/CurrentWetBulbGlobeTemperature.js.map +0 -1
  250. package/dist/accessory/characteristic/EnergyUsage.js.map +0 -1
  251. package/dist/accessory/characteristic/Light.js.map +0 -1
  252. package/dist/accessory/characteristic/LightSensor.js.map +0 -1
  253. package/dist/accessory/characteristic/LockPhysicalControls.js.map +0 -1
  254. package/dist/accessory/characteristic/MotionDetected.js.map +0 -1
  255. package/dist/accessory/characteristic/Name.js.map +0 -1
  256. package/dist/accessory/characteristic/OccupancyDetected.js.map +0 -1
  257. package/dist/accessory/characteristic/On.js.map +0 -1
  258. package/dist/accessory/characteristic/OutletInUse.js.map +0 -1
  259. package/dist/accessory/characteristic/ProgrammableSwitchEvent.js.map +0 -1
  260. package/dist/accessory/characteristic/RelativeHumidityDehumidifierThreshold.js.map +0 -1
  261. package/dist/accessory/characteristic/RotationSpeed.js.map +0 -1
  262. package/dist/accessory/characteristic/SecuritySystemState.js.map +0 -1
  263. package/dist/accessory/characteristic/SwingMode.js.map +0 -1
  264. package/dist/accessory/characteristic/TargetTemperature.js.map +0 -1
  265. package/dist/accessory/characteristic/TemperatureDisplayUnits.js.map +0 -1
  266. package/dist/core/TuyaOpenAPI.js.map +0 -1
  267. package/dist/core/TuyaOpenMQ.js.map +0 -1
  268. package/dist/device/TuyaCustomDeviceManager.js.map +0 -1
  269. package/dist/device/TuyaDevice.js.map +0 -1
  270. package/dist/device/TuyaDeviceManager.js.map +0 -1
  271. package/dist/device/TuyaHomeDeviceManager.js.map +0 -1
  272. package/dist/util/FfmpegStreamingProcess.js.map +0 -1
  273. package/dist/util/InfraredTool.js.map +0 -1
  274. package/dist/util/Logger.js.map +0 -1
  275. package/dist/util/TuyaRecordingDelegate.js.map +0 -1
  276. package/dist/util/TuyaStreamDelegate.js.map +0 -1
  277. package/dist/util/color.js.map +0 -1
  278. package/dist/util/util.js +0 -63
  279. package/dist/util/util.js.map +0 -1
  280. /package/dist/{device → cloud/device}/TuyaCustomDeviceManager.js +0 -0
  281. /package/dist/{device → cloud/device}/TuyaHomeDeviceManager.js +0 -0
  282. /package/dist/{accessory → shared/accessories}/AirConditionerAccessory.js +0 -0
  283. /package/dist/{accessory → shared/accessories}/AirQualitySensorAccessory.js +0 -0
  284. /package/dist/{accessory → shared/accessories}/CarbonDioxideSensorAccessory.js +0 -0
  285. /package/dist/{accessory → shared/accessories}/CarbonMonoxideSensorAccessory.js +0 -0
  286. /package/dist/{accessory → shared/accessories}/ContactSensorAccessory.js +0 -0
  287. /package/dist/{accessory → shared/accessories}/DehumidifierAccessory.js +0 -0
  288. /package/dist/{accessory → shared/accessories}/DiffuserAccessory.js +0 -0
  289. /package/dist/{accessory → shared/accessories}/DimmerAccessory.js +0 -0
  290. /package/dist/{accessory → shared/accessories}/GarageDoorAccessory.js +0 -0
  291. /package/dist/{accessory → shared/accessories}/HeaterAccessory.js +0 -0
  292. /package/dist/{accessory → shared/accessories}/HeaterAccessory_old.js +0 -0
  293. /package/dist/{accessory → shared/accessories}/HumanPresenceSensorAccessory.js +0 -0
  294. /package/dist/{accessory → shared/accessories}/IRControlHubAccessory.js +0 -0
  295. /package/dist/{accessory → shared/accessories}/IRControlHubSubAccessory.js +0 -0
  296. /package/dist/{accessory → shared/accessories}/IRGenericAccessory.js +0 -0
  297. /package/dist/{accessory → shared/accessories}/LeakSensorAccessory.js +0 -0
  298. /package/dist/{accessory → shared/accessories}/LightAccessory.js +0 -0
  299. /package/dist/{accessory → shared/accessories}/LightSensorAccessory.js +0 -0
  300. /package/dist/{accessory → shared/accessories}/LocationWeatherAccessory.js +0 -0
  301. /package/dist/{accessory → shared/accessories}/LockAccessory.js +0 -0
  302. /package/dist/{accessory → shared/accessories}/MotionSensorAccessory.js +0 -0
  303. /package/dist/{accessory → shared/accessories}/OutletAccessory.js +0 -0
  304. /package/dist/{accessory → shared/accessories}/PetFeederAccessory.js +0 -0
  305. /package/dist/{accessory → shared/accessories}/SceneAccessory.js +0 -0
  306. /package/dist/{accessory → shared/accessories}/SecuritySystemAccessory.js +0 -0
  307. /package/dist/{accessory → shared/accessories}/SmokeSensorAccessory.js +0 -0
  308. /package/dist/{accessory → shared/accessories}/TemperatureHumiditySensorAccessory.js +0 -0
  309. /package/dist/{accessory → shared/accessories}/ThermostatAccessory.js +0 -0
  310. /package/dist/{accessory → shared/accessories}/TowerRackAccessory.js +0 -0
  311. /package/dist/{accessory → shared/accessories}/WeatherStationAccessory.js +0 -0
  312. /package/dist/{accessory → shared/accessories}/WetBulbGlobeTemperatureAccessory.js +0 -0
  313. /package/dist/{accessory → shared/accessories}/WhiteNoiseLightAccessory.js +0 -0
  314. /package/dist/{accessory → shared/accessories}/WindowAccessory.js +0 -0
  315. /package/dist/{accessory → shared/accessories}/WindowCoveringAccessory.js +0 -0
  316. /package/dist/{accessory → shared/accessories}/WirelessSwitchAccessory.js +0 -0
  317. /package/dist/{accessory → shared/accessories}/characteristic/Active.js +0 -0
  318. /package/dist/{accessory → shared/accessories}/characteristic/CurrentRelativeHumidity.js +0 -0
  319. /package/dist/{accessory → shared/accessories}/characteristic/CurrentTemperature.js +0 -0
  320. /package/dist/{accessory → shared/accessories}/characteristic/CurrentWeather.js +0 -0
  321. /package/dist/{accessory → shared/accessories}/characteristic/CurrentWeatherByOpenMeteo.js +0 -0
  322. /package/dist/{accessory → shared/accessories}/characteristic/CurrentWetBulbGlobeTemperature.js +0 -0
  323. /package/dist/{accessory → shared/accessories}/characteristic/EnergyUsage.js +0 -0
  324. /package/dist/{accessory → shared/accessories}/characteristic/Light.js +0 -0
  325. /package/dist/{accessory → shared/accessories}/characteristic/LightSensor.js +0 -0
  326. /package/dist/{accessory → shared/accessories}/characteristic/LockPhysicalControls.js +0 -0
  327. /package/dist/{accessory → shared/accessories}/characteristic/Name.js +0 -0
  328. /package/dist/{accessory → shared/accessories}/characteristic/OccupancyDetected.js +0 -0
  329. /package/dist/{accessory → shared/accessories}/characteristic/OutletInUse.js +0 -0
  330. /package/dist/{accessory → shared/accessories}/characteristic/RelativeHumidityDehumidifierThreshold.js +0 -0
  331. /package/dist/{accessory → shared/accessories}/characteristic/RotationSpeed.js +0 -0
  332. /package/dist/{accessory → shared/accessories}/characteristic/SecuritySystemState.js +0 -0
  333. /package/dist/{accessory → shared/accessories}/characteristic/SwingMode.js +0 -0
  334. /package/dist/{accessory → shared/accessories}/characteristic/TargetTemperature.js +0 -0
  335. /package/dist/{accessory → shared/accessories}/characteristic/TemperatureDisplayUnits.js +0 -0
  336. /package/dist/{util → shared/util}/FfmpegStreamingProcess.js +0 -0
  337. /package/dist/{util → shared/util}/InfraredTool.js +0 -0
  338. /package/dist/{util → shared/util}/Logger.js +0 -0
  339. /package/dist/{util → shared/util}/TuyaRecordingDelegate.js +0 -0
  340. /package/dist/{util → shared/util}/TuyaStreamDelegate.js +0 -0
  341. /package/dist/{util → shared/util}/color.js +0 -0
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ const net_1 = __importDefault(require("net"));
8
+ const events_1 = __importDefault(require("events"));
9
+ const Logger_1 = require("../shared/util/Logger");
10
+ const ProtocolFactory_1 = require("./protocol/ProtocolFactory");
11
+ const ProtocolUtilities_1 = require("./protocol/ProtocolUtilities");
12
+ const ChildPayloadUtility_1 = require("./protocol/ChildPayloadUtility");
13
+ /**
14
+ * LocalDevice – maintains a persistent TCP connection to a single Tuya local
15
+ * device. Handles all protocol versions (3.1–3.5) including the 3-way key
16
+ * exchange required by v3.4 and v3.5.
17
+ *
18
+ * Emits:
19
+ * 'connect' – TCP connection established and key exchange complete
20
+ * 'change' – { dps: {[dp]: value} , state } on any DP update
21
+ * 'disconnect' – connection lost
22
+ * 'error' – Error object
23
+ */
24
+ class LocalDevice extends events_1.default {
25
+ constructor(context, parentLog) {
26
+ super();
27
+ this.context = context;
28
+ this.connected = false;
29
+ this.state = {};
30
+ /**
31
+ * Map of Zigbee CID → child LocalDevice for parent gateways.
32
+ * Populated by LocalDeviceManager when children are registered.
33
+ */
34
+ this.children = new Map();
35
+ this.cachedBuffer = Buffer.allocUnsafe(0);
36
+ this.sendCounter = 0;
37
+ this.connectionAttempts = 0;
38
+ this.log = new Logger_1.PrefixLogger(parentLog, context.name || context.id, false);
39
+ this.context.port = this.context.port ?? 6668;
40
+ this.context.pingGap = this.context.pingGap ?? 9;
41
+ this.context.connectTimeout = this.context.connectTimeout ?? 30;
42
+ this.protocol = ProtocolFactory_1.ProtocolFactory.createProtocol(context.version);
43
+ }
44
+ connect() {
45
+ if (this.socket) {
46
+ return;
47
+ }
48
+ this._connect();
49
+ }
50
+ disconnect() {
51
+ this._clearTimers();
52
+ if (this.socket) {
53
+ this.socket.removeAllListeners();
54
+ this.socket.destroy();
55
+ this.socket = undefined;
56
+ }
57
+ this.connected = false;
58
+ this.sessionKey = undefined;
59
+ // Propagate disconnect to all registered Zigbee children
60
+ for (const child of this.children.values()) {
61
+ if (child.connected) {
62
+ child.connected = false;
63
+ child.emit('disconnect');
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Send DP update to device.
69
+ *
70
+ * For a Zigbee child device (parentDevice is set) this routes the command
71
+ * through the parent gateway connection with CID injection.
72
+ *
73
+ * @param dps Object mapping DP number (string key) to new value.
74
+ */
75
+ update(dps) {
76
+ // ── Zigbee child path ────────────────────────────────────────────────────
77
+ if (this.parentDevice && this.childId) {
78
+ this.parentDevice.updateChild(this.childId, dps);
79
+ return;
80
+ }
81
+ // ── Standard / parent path ───────────────────────────────────────────────
82
+ this._sendDps(dps);
83
+ }
84
+ /**
85
+ * Send a DP update to a Zigbee child device via this gateway connection.
86
+ * Only valid when this LocalDevice represents a gateway (has children registered).
87
+ *
88
+ * @param childId Zigbee CID of the target sub-device
89
+ * @param dps DP values to set
90
+ */
91
+ updateChild(childId, dps) {
92
+ if (!ChildPayloadUtility_1.ChildPayloadUtility.isValidCid(childId)) {
93
+ this.log.warn(`updateChild called with invalid CID "${childId}"`);
94
+ return;
95
+ }
96
+ const version = this.context.version;
97
+ if (version !== '3.3' && version !== '3.4' && version !== '3.5') {
98
+ this.log.warn(`updateChild: protocol ${version} is not supported for Zigbee child routing`);
99
+ return;
100
+ }
101
+ const childPayload = ChildPayloadUtility_1.ChildPayloadUtility.prepareChildPayload(childId, dps, version);
102
+ this._sendRaw(childPayload);
103
+ }
104
+ /**
105
+ * Query the current state of a Zigbee child device via this gateway connection.
106
+ *
107
+ * @param childId Zigbee CID of the target sub-device
108
+ */
109
+ queryStateChild(childId) {
110
+ if (!ChildPayloadUtility_1.ChildPayloadUtility.isValidCid(childId)) {
111
+ this.log.warn(`queryStateChild called with invalid CID "${childId}"`);
112
+ return;
113
+ }
114
+ const version = this.context.version;
115
+ if (version !== '3.3' && version !== '3.4' && version !== '3.5') {
116
+ this.log.warn(`queryStateChild: protocol ${version} is not supported for Zigbee child routing`);
117
+ return;
118
+ }
119
+ const queryPayload = ChildPayloadUtility_1.ChildPayloadUtility.prepareChildQueryPayload(childId, version);
120
+ this._sendRaw(queryPayload);
121
+ }
122
+ // ── Private: standard DPS send (non-child path) ───────────────────────────
123
+ _sendDps(dps) {
124
+ const t = Math.floor(Date.now() / 1000).toString();
125
+ let cmd;
126
+ let data;
127
+ if (this.context.version === '3.4' || this.context.version === '3.5') {
128
+ cmd = 13;
129
+ data = {
130
+ data: {
131
+ devId: this.context.id,
132
+ uid: '',
133
+ dps,
134
+ ctype: 0,
135
+ },
136
+ protocol: 5,
137
+ t,
138
+ };
139
+ }
140
+ else {
141
+ cmd = 7;
142
+ data = { devId: this.context.id, uid: '', t, dps };
143
+ }
144
+ this._send({ cmd, data });
145
+ }
146
+ /**
147
+ * Send an arbitrary JSON payload through this connection (used for child routing).
148
+ * The payload is serialised as-is without DP wrapping.
149
+ */
150
+ _sendRaw(payload) {
151
+ const cmd = (this.context.version === '3.4' || this.context.version === '3.5') ? 13 : 7;
152
+ this._send({ cmd, data: payload });
153
+ }
154
+ /** Request current state from device (cmd=10 for v3.1-3.3, cmd=16 for v3.4-3.5). */
155
+ queryState() {
156
+ this._send({
157
+ cmd: (this.context.version === '3.4' || this.context.version === '3.5') ? 16 : 10,
158
+ data: { gwId: this.context.id, devId: this.context.id },
159
+ });
160
+ }
161
+ // ── Private: connect / lifecycle ──────────────────────────────────────────
162
+ _connect() {
163
+ this._clearTimers();
164
+ this.cachedBuffer = Buffer.allocUnsafe(0);
165
+ this.sessionKey = undefined;
166
+ this.tmpLocalKey = undefined;
167
+ this.tmpRemoteKey = undefined;
168
+ this.connected = false;
169
+ this.connectionAttempts++;
170
+ const sock = net_1.default.createConnection({
171
+ host: this.context.ip,
172
+ port: this.context.port,
173
+ });
174
+ this.socket = sock;
175
+ sock.setKeepAlive(true);
176
+ sock.setNoDelay(true);
177
+ this.connTimeout = setTimeout(() => {
178
+ const msg = `timeout ${this.context.connectTimeout}s ${this.context.ip}:${this.context.port} proto=${this.context.version}`;
179
+ this._reportError(new Error(msg));
180
+ }, this.context.connectTimeout * 1000);
181
+ this.connTimeout.unref?.();
182
+ sock.on('connect', () => {
183
+ if (this.context.version !== '3.4' && this.context.version !== '3.5') {
184
+ clearTimeout(this.connTimeout);
185
+ this.connected = true;
186
+ this.emit('connect');
187
+ this._schedulePing();
188
+ this.queryState();
189
+ }
190
+ });
191
+ sock.on('ready', () => {
192
+ if (this.context.version === '3.4' || this.context.version === '3.5') {
193
+ clearTimeout(this.connTimeout);
194
+ // Begin 3-way key exchange
195
+ this.tmpLocalKey = crypto_1.default.randomBytes(16);
196
+ this._send({ cmd: 3, data: this.tmpLocalKey, encrypted: true });
197
+ }
198
+ });
199
+ sock.on('data', (chunk) => {
200
+ this.cachedBuffer = Buffer.concat([this.cachedBuffer, chunk]);
201
+ this._drainBuffer();
202
+ });
203
+ sock.on('error', (err) => {
204
+ const connInfo = `${this.context.name} (${this.context.id} @ ${this.context.ip}, proto=${this.context.version})`;
205
+ this.log.warn(`Socket error for ${connInfo}: ${err.message}`);
206
+ this.emit('error', err);
207
+ clearTimeout(this.connTimeout);
208
+ if (!this.errorReconnect) {
209
+ const delay = Math.min(30000, 1000 * Math.min(this.connectionAttempts, 10));
210
+ this.errorReconnect = setTimeout(() => {
211
+ this.errorReconnect = undefined;
212
+ this._connect();
213
+ }, delay);
214
+ this.errorReconnect.unref?.();
215
+ }
216
+ });
217
+ sock.on('close', () => {
218
+ this.connected = false;
219
+ this.sessionKey = undefined;
220
+ this.emit('disconnect');
221
+ this.socket = undefined;
222
+ });
223
+ sock.on('end', () => {
224
+ this.connected = false;
225
+ this.sessionKey = undefined;
226
+ this.log.info(`Disconnected from ${this.context.name ?? this.context.id}`);
227
+ });
228
+ }
229
+ _reportError(err) {
230
+ // Prefer LocalDevice error stream, then socket stream, and fall back to internal logging.
231
+ if (this.listenerCount('error') > 0) {
232
+ this.emit('error', err);
233
+ return;
234
+ }
235
+ if (this.socket && typeof this.socket.listenerCount === 'function' && this.socket.listenerCount('error') > 0) {
236
+ this.socket.emit('error', err);
237
+ return;
238
+ }
239
+ // No listener attached, avoid throwing in process, but keep device state consistent
240
+ this.log.warn(err.message);
241
+ this.disconnect();
242
+ }
243
+ _clearTimers() {
244
+ if (this.pinger) {
245
+ clearTimeout(this.pinger);
246
+ this.pinger = undefined;
247
+ }
248
+ if (this.connTimeout) {
249
+ clearTimeout(this.connTimeout);
250
+ this.connTimeout = undefined;
251
+ }
252
+ if (this.errorReconnect) {
253
+ clearTimeout(this.errorReconnect);
254
+ this.errorReconnect = undefined;
255
+ }
256
+ }
257
+ _schedulePing() {
258
+ if (this.pinger) {
259
+ clearTimeout(this.pinger);
260
+ this.pinger = undefined;
261
+ }
262
+ const primaryDelay = (this.context.pingGap ?? 20) * 1000;
263
+ this.pinger = setTimeout(() => {
264
+ this._send({ cmd: 9 });
265
+ if (this.pinger) {
266
+ clearTimeout(this.pinger);
267
+ }
268
+ this.pinger = setTimeout(() => {
269
+ const msg = `ping timeout – no response within 5s for ${this.context.name} (${this.context.ip})`;
270
+ this._reportError(new Error(msg));
271
+ }, 5000);
272
+ this.pinger.unref?.();
273
+ }, primaryDelay);
274
+ this.pinger.unref?.();
275
+ }
276
+ // ── Private: frame parsing ────────────────────────────────────────────────
277
+ _drainBuffer() {
278
+ // Keep consuming complete frames until the buffer is exhausted
279
+ while (true) {
280
+ if (!this.protocol.isFrameComplete(this.cachedBuffer)) {
281
+ break;
282
+ }
283
+ const extracted = this.protocol.extractFrame(this.cachedBuffer);
284
+ if (!extracted) {
285
+ break;
286
+ }
287
+ this.cachedBuffer = Buffer.from(extracted.remaining);
288
+ this._handleFrame(extracted.frame);
289
+ }
290
+ }
291
+ _handleFrame(frame) {
292
+ const decoded = this.protocol.decodeFrame(frame, this.context.key, this.sessionKey);
293
+ if (!decoded) {
294
+ this.log.debug(`Failed to decode frame for ${this.context.name} (frame_size=${frame.length}, proto=${this.context.version})`);
295
+ return;
296
+ }
297
+ const { cmd, payload } = decoded;
298
+ // Handle version-specific control commands
299
+ if (cmd === 9) {
300
+ // Pong
301
+ this._schedulePing();
302
+ return;
303
+ }
304
+ if (cmd === 7 || cmd === 13) {
305
+ // Echo of our own command, ignore
306
+ return;
307
+ }
308
+ if (cmd === 4) {
309
+ // Key exchange response
310
+ this._handleKeyExchangeResponse(payload);
311
+ return;
312
+ }
313
+ // Regular data update
314
+ if ((cmd === 8 || cmd === 10 || cmd === 16) && payload) {
315
+ try {
316
+ let payloadStr = payload.toString('utf8');
317
+ // Strip version headers if present
318
+ if (payloadStr.startsWith('3.')) {
319
+ payloadStr = payloadStr.slice(15);
320
+ }
321
+ const data = JSON.parse(payloadStr);
322
+ // ── Zigbee child routing ──────────────────────────────────────────────
323
+ const childData = ChildPayloadUtility_1.ChildPayloadUtility.extractChildData(data);
324
+ if (childData) {
325
+ const childDevice = this.children.get(childData.childId.toLowerCase());
326
+ if (childDevice) {
327
+ childDevice._change(childData.dps);
328
+ }
329
+ else {
330
+ this.log.debug(`Gateway ${this.context.id}: received update for unknown child CID ${childData.childId}`);
331
+ }
332
+ return; // do not apply CID payloads to the parent's own state
333
+ }
334
+ // ─────────────────────────────────────────────────────────────────────
335
+ if (data?.dps) {
336
+ this._change(data.dps);
337
+ }
338
+ }
339
+ catch (e) {
340
+ const err = e instanceof Error ? e.message : String(e);
341
+ this.log.debug(`Failed to parse payload for ${this.context.name} (proto=${this.context.version}): ${err}`);
342
+ }
343
+ }
344
+ }
345
+ _handleKeyExchangeResponse(payload) {
346
+ if (payload.length < 48) {
347
+ this.log.warn(`Invalid key exchange response for ${this.context.name} (${this.context.ip}) – size=${payload.length}, expected ≥48`);
348
+ return;
349
+ }
350
+ this.tmpRemoteKey = payload.subarray(0, 16);
351
+ const expHmac = payload.slice(16, 48).toString('hex');
352
+ const calcHmac = (0, ProtocolUtilities_1.hmac)(this.tmpLocalKey, this.context.key).toString('hex');
353
+ if (calcHmac !== expHmac) {
354
+ this.log.warn(`Key exchange HMAC mismatch for ${this.context.name}`);
355
+ return;
356
+ }
357
+ // Send confirmation: HMAC(remoteNonce, realKey)
358
+ this._send({ cmd: 5, data: (0, ProtocolUtilities_1.hmac)(this.tmpRemoteKey, this.context.key), encrypted: true });
359
+ // Derive session key: AES-ECB-encrypt(localNonce XOR remoteNonce, realKey) [no padding]
360
+ const sk = Buffer.from(this.tmpLocalKey);
361
+ for (let i = 0; i < sk.length; i++) {
362
+ sk[i] ^= this.tmpRemoteKey[i];
363
+ }
364
+ // Session key derivation depends on version
365
+ if (this.context.version === '3.4') {
366
+ this.sessionKey = (0, ProtocolUtilities_1.encryptECBNoPad)(sk, this.context.key);
367
+ }
368
+ else if (this.context.version === '3.5') {
369
+ // For v3.5, use GCM encrypt with IV=localNonce[:12]
370
+ const iv = this.tmpLocalKey.subarray(0, 12);
371
+ const { ciphertext } = (0, ProtocolUtilities_1.encryptGCM)(sk, this.context.key, iv);
372
+ this.sessionKey = ciphertext.subarray(0, 16);
373
+ }
374
+ this.connected = true;
375
+ this._schedulePing();
376
+ this.emit('connect');
377
+ this.queryState();
378
+ }
379
+ /** @internal Used by gateway to propagate child state updates. */
380
+ _change(dps) {
381
+ const changes = {};
382
+ for (const [dp, val] of Object.entries(dps)) {
383
+ if (this.state[dp] !== val) {
384
+ changes[dp] = val;
385
+ this.state[dp] = val;
386
+ }
387
+ }
388
+ if (Object.keys(changes).length > 0) {
389
+ this.emit('change', changes, { ...this.state });
390
+ }
391
+ }
392
+ // ── Private: send ─────────────────────────────────────────────────────────
393
+ _send(o) {
394
+ if (!this.socket) {
395
+ return;
396
+ }
397
+ this.sendCounter++;
398
+ const { cmd, data } = o;
399
+ // Prepare data payload
400
+ let dataBuffer = Buffer.alloc(0);
401
+ if (data instanceof Buffer) {
402
+ dataBuffer = data;
403
+ }
404
+ else if (data) {
405
+ dataBuffer = Buffer.from(typeof data === 'string' ? data : JSON.stringify(data));
406
+ }
407
+ // Use protocol handler to encode frame
408
+ try {
409
+ const frame = this.protocol.encodeFrame(cmd, dataBuffer, this.sendCounter, this.sessionKey, this.context.key);
410
+ this.socket.write(frame);
411
+ }
412
+ catch (err) {
413
+ const msg = err instanceof Error ? err.message : String(err);
414
+ this.log.debug(`Failed to encode frame for ${this.context.name}: ${msg}`);
415
+ }
416
+ }
417
+ }
418
+ exports.default = LocalDevice;
419
+ //# sourceMappingURL=LocalDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalDevice.js","sourceRoot":"","sources":["../../src/local/LocalDevice.ts"],"names":[],"mappings":"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"}