@homebridge-plugins/homebridge-tuya 3.0.0-beta.2 → 3.0.0-beta.20

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 +51 -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
@@ -1,6 +1,9 @@
1
1
  import { beforeEach, describe, expect, jest, test } from '@jest/globals';
2
2
  import LocalDeviceManager from '../src/local/LocalDeviceManager';
3
3
  import type { LocalConfig } from '../src/local/config';
4
+ import { TuyaPluginMode } from '../src/config';
5
+ import { TuyaDeviceSchemaType } from '../src/cloud/device/TuyaDevice';
6
+ import { ExLogger, initLogger } from '../src/shared/util/Logger';
4
7
 
5
8
  const createdConnections: any[] = [];
6
9
 
@@ -29,37 +32,22 @@ jest.mock('../src/local/TuyaDiscovery', () => ({
29
32
  },
30
33
  }));
31
34
 
32
- jest.mock('../src/shared/util/Logger', () => ({
33
- __esModule: true,
34
- default: class Logger {
35
- log() {}
36
- info() {}
37
- warn() {}
38
- error() {}
39
- debug() {}
40
- },
41
- PrefixLogger: class PrefixLogger {
42
- constructor(public parentLog: unknown, public name: string, public debugMode: boolean) {}
43
- log() {}
44
- info() {}
45
- warn() {}
46
- error() {}
47
- debug() {}
48
- },
49
- }));
35
+ // Mock Logger
36
+ const mockLog: ExLogger = {
37
+ debug: jest.fn(),
38
+ info: jest.fn(),
39
+ warn: jest.fn(),
40
+ error: jest.fn(),
41
+ log: jest.fn(),
42
+ success: jest.fn(),
43
+ } as unknown as ExLogger;
50
44
 
51
45
  describe('LocalDeviceManager command and local mapping behavior', () => {
52
46
  let log: any;
53
47
 
54
48
  beforeEach(() => {
49
+ initLogger(mockLog);
55
50
  createdConnections.length = 0;
56
- log = {
57
- log: jest.fn(),
58
- info: jest.fn(),
59
- warn: jest.fn(),
60
- error: jest.fn(),
61
- debug: jest.fn(),
62
- };
63
51
  jest.clearAllMocks();
64
52
  });
65
53
 
@@ -74,7 +62,7 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
74
62
  ],
75
63
  };
76
64
 
77
- const manager = new LocalDeviceManager(config, log);
65
+ const manager = new LocalDeviceManager(config);
78
66
  await manager.initLocalDevices();
79
67
 
80
68
  expect(manager.getDevice('dev-1')).toBeDefined();
@@ -98,7 +86,7 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
98
86
  ],
99
87
  };
100
88
 
101
- const manager = new LocalDeviceManager(config, log);
89
+ const manager = new LocalDeviceManager(config);
102
90
  await manager.initLocalDevices();
103
91
 
104
92
  const result = await manager.sendCommands('dev-1', [
@@ -121,12 +109,12 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
121
109
  devices: [],
122
110
  };
123
111
 
124
- const manager = new LocalDeviceManager(config, log);
112
+ const manager = new LocalDeviceManager(config);
125
113
  await manager.initLocalDevices();
126
114
 
127
115
  const result = await manager.sendCommands('missing-device', [{ code: 'switch_1', value: true }]);
128
116
 
129
- expect(result).toBeUndefined();
117
+ expect(result).toBe(false);
130
118
  });
131
119
 
132
120
  test('updates existing configured device IP on discovery and disconnects stale connection', async () => {
@@ -142,7 +130,7 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
142
130
  ],
143
131
  };
144
132
 
145
- const manager = new LocalDeviceManager(config, log);
133
+ const manager = new LocalDeviceManager(config);
146
134
  await manager.initLocalDevices();
147
135
  manager.connectAllDevices();
148
136
 
@@ -166,7 +154,7 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
166
154
  devices: [],
167
155
  };
168
156
 
169
- const manager = new LocalDeviceManager(config, log);
157
+ const manager = new LocalDeviceManager(config);
170
158
  await manager.initLocalDevices();
171
159
 
172
160
  (manager as any)._onDiscovered({
@@ -182,4 +170,181 @@ describe('LocalDeviceManager command and local mapping behavior', () => {
182
170
  expect(discovered?.ip).toBe('192.168.1.30');
183
171
  expect(discovered?.product_id).toBe('prod1');
184
172
  });
173
+
174
+ test('keeps DP mapping when a local override uses the same code as a no-op rename', async () => {
175
+ const config: LocalConfig = {
176
+ autoDiscoverDevices: false,
177
+ deviceOverrides: [{
178
+ id: 'dev-1',
179
+ configFor: TuyaPluginMode.local,
180
+ schema: [{
181
+ code: 'humidity_indoor',
182
+ newCode: 'humidity_indoor',
183
+ type: TuyaDeviceSchemaType.Integer,
184
+ property: { min: 0, max: 100, scale: 0, step: 1 },
185
+ }],
186
+ }],
187
+ devices: [{
188
+ tuyaDeviceId: 'dev-1',
189
+ ip: '192.168.1.10',
190
+ tuyaKey: 'abcdef1234567890',
191
+ protocolVersion: '3.5',
192
+ dpMapping: {
193
+ humidity_indoor: 6,
194
+ },
195
+ }],
196
+ };
197
+
198
+ const manager = new LocalDeviceManager(config);
199
+ await manager.initLocalDevices();
200
+
201
+ const device = manager.getDevice('dev-1');
202
+ const dpMap = (manager as any).dpMaps.get('dev-1');
203
+ const reverseMap = (manager as any).reverseDpMaps.get('dev-1');
204
+
205
+ expect(dpMap?.humidity_indoor).toBe(6);
206
+ expect(reverseMap?.[6]).toBe('humidity_indoor');
207
+ expect(device?.schema.some(schema => schema.code === 'humidity_indoor' && schema.type === TuyaDeviceSchemaType.Integer)).toBe(true);
208
+ });
209
+
210
+ test('applies local overrides without a rename using the original code', async () => {
211
+ const config: LocalConfig = {
212
+ autoDiscoverDevices: false,
213
+ deviceOverrides: [{
214
+ id: 'dev-1',
215
+ configFor: TuyaPluginMode.local,
216
+ schema: [{
217
+ code: 'humidity_indoor',
218
+ type: TuyaDeviceSchemaType.Integer,
219
+ property: { min: 0, max: 100, scale: 0, step: 1 },
220
+ }],
221
+ }],
222
+ devices: [{
223
+ tuyaDeviceId: 'dev-1',
224
+ ip: '192.168.1.10',
225
+ tuyaKey: 'abcdef1234567890',
226
+ protocolVersion: '3.5',
227
+ dpMapping: {
228
+ humidity_indoor: 6,
229
+ },
230
+ }],
231
+ };
232
+
233
+ const manager = new LocalDeviceManager(config);
234
+ await manager.initLocalDevices();
235
+
236
+ const device = manager.getDevice('dev-1');
237
+ const schema = device?.schema.find(item => item.code === 'humidity_indoor');
238
+
239
+ expect(schema).toBeDefined();
240
+ expect(schema?.type).toBe(TuyaDeviceSchemaType.Integer);
241
+ expect(device?.schema.every(item => !!item.code)).toBe(true);
242
+ });
243
+
244
+ test('applies local overrides', async () => {
245
+ const config: LocalConfig = {
246
+ autoDiscoverDevices: false,
247
+ devices: [],
248
+ deviceOverrides: [{
249
+ id: 'dev-1',
250
+ category: 'jsq',
251
+ configFor: TuyaPluginMode.local,
252
+ schema: [{
253
+ code: 'humidity_indoor',
254
+ type: TuyaDeviceSchemaType.Integer,
255
+ property: { min: 0, max: 100, scale: 0, step: 1 },
256
+ }],
257
+ }],
258
+ };
259
+
260
+ const manager = new LocalDeviceManager(config);
261
+ await manager.initLocalDevices();
262
+
263
+ (manager as any)._onDiscovered({
264
+ id: 'dev-1',
265
+ ip: '192.168.0.1',
266
+ version: '3.3',
267
+ productKey: 'prod1',
268
+ });
269
+
270
+ const device = manager.getDevice('dev-1');
271
+
272
+ expect(device).toBeDefined();
273
+ expect(device?.ip).toBe('192.168.0.1');
274
+ expect(device?.product_id).toBe('prod1');
275
+ expect(device?.category).toBe('jsq');
276
+ expect(device?.schema?.length).toBe(1);
277
+ expect(device?.schema?.[0].code).toBe('humidity_indoor');
278
+ });
279
+
280
+ test('do not apply cloud overrides to local devices', async () => {
281
+ const config: LocalConfig = {
282
+ autoDiscoverDevices: false,
283
+ devices: [],
284
+ deviceOverrides: [{
285
+ id: 'dev-1',
286
+ category: 'jsq',
287
+ configFor: TuyaPluginMode.cloud,
288
+ schema: [{
289
+ code: 'humidity_indoor',
290
+ type: TuyaDeviceSchemaType.Integer,
291
+ property: { min: 0, max: 100, scale: 0, step: 1 },
292
+ }],
293
+ }],
294
+ };
295
+
296
+ const manager = new LocalDeviceManager(config);
297
+ await manager.initLocalDevices();
298
+
299
+ (manager as any)._onDiscovered({
300
+ id: 'dev-1',
301
+ ip: '192.168.0.1',
302
+ version: '3.3',
303
+ productKey: 'prod1',
304
+ });
305
+
306
+ const device = manager.getDevice('dev-1');
307
+
308
+ expect(device).toBeDefined();
309
+ expect(device?.ip).toBe('192.168.0.1');
310
+ expect(device?.product_id).toBe('prod1');
311
+ expect(device?.category).toBe('unknown');
312
+ expect(device?.schema?.length).toBe(0);
313
+ });
314
+
315
+ test('applies overrides local device (configFor:both)', async () => {
316
+ const config: LocalConfig = {
317
+ autoDiscoverDevices: false,
318
+ devices: [],
319
+ deviceOverrides: [{
320
+ id: 'dev-1',
321
+ category: 'jsq',
322
+ configFor: TuyaPluginMode.both,
323
+ schema: [{
324
+ code: 'humidity_indoor',
325
+ type: TuyaDeviceSchemaType.Integer,
326
+ property: { min: 0, max: 100, scale: 0, step: 1 },
327
+ }],
328
+ }],
329
+ };
330
+
331
+ const manager = new LocalDeviceManager(config);
332
+ await manager.initLocalDevices();
333
+
334
+ (manager as any)._onDiscovered({
335
+ id: 'dev-1',
336
+ ip: '192.168.0.1',
337
+ version: '3.3',
338
+ productKey: 'prod1',
339
+ });
340
+
341
+ const device = manager.getDevice('dev-1');
342
+
343
+ expect(device).toBeDefined();
344
+ expect(device?.ip).toBe('192.168.0.1');
345
+ expect(device?.product_id).toBe('prod1');
346
+ expect(device?.category).toBe('jsq');
347
+ expect(device?.schema?.length).toBe(1);
348
+ expect(device?.schema?.[0].code).toBe('humidity_indoor');
349
+ });
185
350
  });
@@ -2,17 +2,19 @@
2
2
  import { describe, expect, test, beforeEach, afterEach, jest } from '@jest/globals';
3
3
  import LocalDeviceManager from '../src/local/LocalDeviceManager';
4
4
  import { LocalConfig } from '../src/local/config';
5
- import Logger from '../src/shared/util/Logger';
5
+ import ExLogger, { initLogger, logger } from '../src/shared/util/Logger';
6
+ import { ConfigHash } from '../src/shared/util/ConfigHash';
6
7
  import TuyaDevice from '../src/cloud/device/TuyaDevice';
7
8
 
8
9
  // Mock Logger
9
- const mockLog: Logger = {
10
+ const mockLog: ExLogger = {
10
11
  debug: jest.fn(),
11
12
  info: jest.fn(),
12
13
  warn: jest.fn(),
13
14
  error: jest.fn(),
14
15
  log: jest.fn(),
15
- } as unknown as Logger;
16
+ success: jest.fn(),
17
+ } as unknown as ExLogger;
16
18
 
17
19
  describe('LocalDeviceManager', () => {
18
20
  let manager: LocalDeviceManager;
@@ -21,7 +23,8 @@ describe('LocalDeviceManager', () => {
21
23
  const config: LocalConfig = {
22
24
  devices: [],
23
25
  };
24
- manager = new LocalDeviceManager(config, mockLog);
26
+ manager = new LocalDeviceManager(config);
27
+ initLogger(mockLog);
25
28
  });
26
29
 
27
30
  afterEach(() => {
@@ -73,7 +76,7 @@ describe('LocalDeviceManager', () => {
73
76
  const config: LocalConfig = {
74
77
  devices: [],
75
78
  };
76
- const mgr = new LocalDeviceManager(config, mockLog);
79
+ const mgr = new LocalDeviceManager(config);
77
80
  expect(mgr).toBeDefined();
78
81
  });
79
82
 
@@ -88,7 +91,7 @@ describe('LocalDeviceManager', () => {
88
91
  },
89
92
  ],
90
93
  };
91
- const mgr = new LocalDeviceManager(config, mockLog);
94
+ const mgr = new LocalDeviceManager(config);
92
95
  expect(mgr).toBeDefined();
93
96
  });
94
97
 
@@ -108,9 +111,34 @@ describe('LocalDeviceManager', () => {
108
111
  },
109
112
  ],
110
113
  };
111
- const mgr = new LocalDeviceManager(config, mockLog);
114
+ const mgr = new LocalDeviceManager(config);
112
115
  expect(mgr).toBeDefined();
113
116
  });
117
+
118
+ test('uses outletCount for effective switch count hashing when switchCount is absent', () => {
119
+ const cfg = {
120
+ tuyaDeviceId: 'device1',
121
+ name: 'Patio Lights',
122
+ outletCount: 2,
123
+ };
124
+ const mgr = new LocalDeviceManager({ devices: [cfg as any] });
125
+ const device = new TuyaDevice({ id: 'device1', uuid: 'device1', name: 'Patio Lights', schema: [], status: [] });
126
+ (device as any).switchCount = 1;
127
+
128
+ const hash = mgr.createDeviceConfigHash(device);
129
+ const expectedHash = ConfigHash.computeHash({
130
+ tuyaDeviceId: cfg.tuyaDeviceId,
131
+ name: cfg.name,
132
+ tuyaKey: undefined,
133
+ dpMapping: (mgr as any)._getDPMap(cfg.tuyaDeviceId),
134
+ switchCount: 2,
135
+ outletCount: 2,
136
+ protocolVersion: undefined,
137
+ category: undefined,
138
+ });
139
+
140
+ expect(hash).toBe(expectedHash);
141
+ });
114
142
  });
115
143
 
116
144
  describe('device discovery', () => {
@@ -118,7 +146,7 @@ describe('LocalDeviceManager', () => {
118
146
  const config: LocalConfig = {
119
147
  devices: [],
120
148
  };
121
- const mgr = new LocalDeviceManager(config, mockLog);
149
+ const mgr = new LocalDeviceManager(config);
122
150
 
123
151
  // Should not throw
124
152
  await expect(mgr.initLocalDevices()).resolves.not.toThrow();
@@ -139,15 +167,15 @@ describe('LocalDeviceManager', () => {
139
167
  };
140
168
 
141
169
  // Should create manager without crashing
142
- const mgr = new LocalDeviceManager(config, mockLog);
170
+ const mgr = new LocalDeviceManager(config);
143
171
  expect(mgr).toBeDefined();
144
172
  });
145
173
 
146
174
  test('falls back when local command has no response after 10 seconds', async () => {
147
175
  jest.useFakeTimers();
148
- const mgr = new LocalDeviceManager({ devices: [] }, mockLog);
176
+ const mgr = new LocalDeviceManager({ devices: [] });
149
177
  mgr['dpMaps'].set('device1', { switch_1: 1 });
150
- mgr['localDevices'].push(new TuyaDevice({ id: 'device1', uuid: 'device1', name: 'Device 1', schema: [], status: [] }));
178
+ mgr['devices'].push(new TuyaDevice({ id: 'device1', uuid: 'device1', name: 'Device 1', schema: [], status: [] }));
151
179
 
152
180
  const conn = new (require('events').EventEmitter)();
153
181
  conn.connected = true;
@@ -157,15 +185,15 @@ describe('LocalDeviceManager', () => {
157
185
  const sendPromise = mgr.sendCommands('device1', [{ code: 'switch_1', value: true }]);
158
186
  jest.advanceTimersByTime(10000);
159
187
 
160
- await expect(sendPromise).rejects.toThrow('Local command response timeout');
188
+ await expect(sendPromise).resolves.toBe(false);
161
189
  jest.useRealTimers();
162
190
  });
163
191
 
164
192
  test('cancels older pending local responses when newer command supersedes same DP', async () => {
165
193
  jest.useFakeTimers();
166
- const mgr = new LocalDeviceManager({ devices: [] }, mockLog);
194
+ const mgr = new LocalDeviceManager({ devices: [] });
167
195
  mgr['dpMaps'].set('device1', { switch_1: 1 });
168
- mgr['localDevices'].push(new TuyaDevice({ id: 'device1', uuid: 'device1', name: 'Device 1', schema: [], status: [] }));
196
+ mgr['devices'].push(new TuyaDevice({ id: 'device1', uuid: 'device1', name: 'Device 1', schema: [], status: [] }));
169
197
 
170
198
  const conn = new (require('events').EventEmitter)();
171
199
  conn.connected = true;
@@ -177,7 +205,7 @@ describe('LocalDeviceManager', () => {
177
205
 
178
206
  await expect(firstSend).resolves.toBe(true);
179
207
  jest.advanceTimersByTime(10000);
180
- await expect(secondSend).rejects.toThrow('Local command response timeout');
208
+ await expect(secondSend).resolves.toBe(false);
181
209
  jest.useRealTimers();
182
210
  });
183
211
 
@@ -192,7 +220,7 @@ describe('LocalDeviceManager', () => {
192
220
  },
193
221
  ],
194
222
  };
195
- const mgr = new LocalDeviceManager(config, mockLog);
223
+ const mgr = new LocalDeviceManager(config);
196
224
 
197
225
  // Should not throw during init
198
226
  await expect(mgr.initLocalDevices()).resolves.not.toThrow();
@@ -211,7 +239,7 @@ describe('LocalDeviceManager', () => {
211
239
  };
212
240
 
213
241
  // Should create manager without immediate error
214
- const mgr = new LocalDeviceManager(config, mockLog);
242
+ const mgr = new LocalDeviceManager(config);
215
243
  expect(mgr).toBeDefined();
216
244
  });
217
245
 
@@ -227,7 +255,7 @@ describe('LocalDeviceManager', () => {
227
255
  } as any,
228
256
  ],
229
257
  };
230
- const mgr = new LocalDeviceManager(config, mockLog);
258
+ const mgr = new LocalDeviceManager(config);
231
259
  (mgr as any)._registerDeviceConfig(config.devices![0]);
232
260
 
233
261
  expect(mgr.devices.length).toBe(0);
@@ -242,7 +270,7 @@ describe('LocalDeviceManager', () => {
242
270
  const config: LocalConfig = {
243
271
  devices: [],
244
272
  };
245
- const mgr = new LocalDeviceManager(config, mockLog);
273
+ const mgr = new LocalDeviceManager(config);
246
274
  expect(mgr).toBeDefined();
247
275
  // Default mappings should be applied internally
248
276
  });
@@ -264,25 +292,7 @@ describe('LocalDeviceManager', () => {
264
292
  },
265
293
  ],
266
294
  };
267
- const mgr = new LocalDeviceManager(config, mockLog);
268
- expect(mgr).toBeDefined();
269
- });
270
- });
271
-
272
- describe('logging', () => {
273
- test('uses provided logger', () => {
274
- const customLog: Logger = {
275
- debug: jest.fn(),
276
- info: jest.fn(),
277
- warn: jest.fn(),
278
- error: jest.fn(),
279
- log: jest.fn(),
280
- } as unknown as Logger;
281
-
282
- const config: LocalConfig = {
283
- devices: [],
284
- };
285
- const mgr = new LocalDeviceManager(config, customLog);
295
+ const mgr = new LocalDeviceManager(config);
286
296
  expect(mgr).toBeDefined();
287
297
  });
288
298
  });
@@ -305,8 +315,8 @@ describe('LocalDeviceManager Integration', () => {
305
315
  ],
306
316
  };
307
317
 
308
- const mgr1 = new LocalDeviceManager(config1, mockLog);
309
- const mgr2 = new LocalDeviceManager(config2, mockLog);
318
+ const mgr1 = new LocalDeviceManager(config1);
319
+ const mgr2 = new LocalDeviceManager(config2);
310
320
 
311
321
  expect(mgr1).toBeDefined();
312
322
  expect(mgr2).toBeDefined();
@@ -317,7 +327,7 @@ describe('LocalDeviceManager Integration', () => {
317
327
  const config: LocalConfig = {
318
328
  devices: [],
319
329
  };
320
- const mgr = new LocalDeviceManager(config, mockLog);
330
+ const mgr = new LocalDeviceManager(config);
321
331
 
322
332
  await mgr.initLocalDevices();
323
333
  await mgr.initLocalDevices(); // Should handle multiple inits
@@ -1,21 +1,19 @@
1
1
  /* eslint-disable no-console */
2
2
  import { describe, expect, test, beforeEach, jest } from '@jest/globals';
3
- import TuyaDeviceManager from '../src/cloud/device/TuyaDeviceManager';
3
+ import TuyaDeviceManager from '../src/cloud/device/TuyaCloudDeviceManager';
4
4
  import TuyaDevice from '../src/cloud/device/TuyaDevice';
5
+ import TuyaHomeDeviceManager from '../src/cloud/device/TuyaHomeDeviceManager';
6
+ import { ExLogger, initLogger } from '../src/shared/util/Logger';
5
7
 
6
8
  // Mock Logger
7
- jest.mock('../src/shared/util/Logger', () => ({
8
- __esModule: true,
9
- default: class Logger {
10
- log() {}
11
- info() {}
12
- warn() {}
13
- error() {}
14
- },
15
- PrefixLogger: class PrefixLogger {
16
- constructor(public log: any, public name: string, public debug: boolean) {}
17
- },
18
- }));
9
+ const mockLog: ExLogger = {
10
+ debug: jest.fn(),
11
+ info: jest.fn(),
12
+ warn: jest.fn(),
13
+ error: jest.fn(),
14
+ log: jest.fn(),
15
+ success: jest.fn(),
16
+ } as unknown as ExLogger;
19
17
 
20
18
  // Mock TuyaOpenMQ
21
19
  jest.mock('../src/cloud/api/TuyaOpenMQ', () => {
@@ -44,8 +42,11 @@ jest.mock('../src/cloud/api/TuyaOpenMQ', () => {
44
42
  describe('MQTT Device Updates - TuyaDeviceManager Message Handling', () => {
45
43
  let manager: TuyaDeviceManager;
46
44
  let mockAPI: any;
45
+ let mockConfig: any;
47
46
 
48
47
  beforeEach(() => {
48
+ initLogger(mockLog);
49
+
49
50
  mockAPI = {
50
51
  log: { log: console.log } as any,
51
52
  post: jest.fn(),
@@ -53,7 +54,25 @@ describe('MQTT Device Updates - TuyaDeviceManager Message Handling', () => {
53
54
  tokenInfo: { uid: 'test_uid' },
54
55
  };
55
56
 
56
- manager = new TuyaDeviceManager(mockAPI, false);
57
+ mockConfig = {
58
+ platform: 'TuyaPlatform',
59
+ name: 'Tuya',
60
+ mode: 'cloud',
61
+ cloud: {
62
+ projectType: '2',
63
+ accessId: 'test_id',
64
+ accessKey: 'test_key',
65
+ countryCode: 1,
66
+ username: 'user@example.com',
67
+ password: 'password',
68
+ appSchema: 'tuyaSmart',
69
+ generateWeatherAccessory: false,
70
+ weatherAPI: '',
71
+ forceIPv4: false,
72
+ },
73
+ };
74
+
75
+ manager = new TuyaHomeDeviceManager(mockAPI, mockConfig.cloud, false);
57
76
  });
58
77
 
59
78
  describe('device status updates', () => {