iobroker.iot 4.0.3 → 4.1.2

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 (251) hide show
  1. package/README.md +5 -517
  2. package/admin/assets/index-6Itc0U48.js +681 -0
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{hostInit-hos3Txsy.js → hostInit-Dxp6BaAc.js} +2 -2
  5. package/admin/rules/assets/index-208Qrr3S.js +1152 -0
  6. package/admin/rules/assets/{index-CbxmbJvB.js → index-Bvn52imU.js} +1 -1
  7. package/admin/rules/assets/preload-helper-BDBacUwf.js +1 -0
  8. package/admin/rules/assets/{virtualExposes-BNZJTatg.js → virtualExposes-O8-92o9I.js} +1 -1
  9. package/admin/rules/customRuleBlocks.js +2 -2
  10. package/admin/rules/i18n/de.json +8 -8
  11. package/admin/rules/i18n/es.json +8 -8
  12. package/admin/rules/i18n/fr.json +8 -8
  13. package/admin/rules/i18n/it.json +8 -8
  14. package/admin/rules/i18n/nl.json +8 -8
  15. package/admin/rules/i18n/pl.json +8 -8
  16. package/admin/rules/i18n/pt.json +8 -8
  17. package/admin/rules/i18n/ru.json +8 -8
  18. package/admin/rules/i18n/uk.json +8 -8
  19. package/admin/rules/i18n/zh-cn.json +8 -8
  20. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +6 -0
  21. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -0
  22. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +2 -7
  23. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -0
  24. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +6 -5
  25. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +1 -0
  26. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +3 -2
  27. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +1 -0
  28. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +4 -3
  29. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +1 -0
  30. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +3 -2
  31. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +1 -0
  32. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +3 -2
  33. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +1 -0
  34. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js +4 -3
  35. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +1 -0
  36. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +3 -2
  37. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +1 -0
  38. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +3 -2
  39. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +1 -0
  40. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +6 -5
  41. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +1 -0
  42. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +5 -4
  43. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +1 -0
  44. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +3 -2
  45. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +1 -0
  46. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +5 -4
  47. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +1 -0
  48. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +1 -1
  49. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js.map +1 -1
  50. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +20 -18
  51. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -0
  52. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +2 -7
  53. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -0
  54. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +9 -0
  55. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +1 -0
  56. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js +20 -0
  57. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +1 -0
  58. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +17 -3
  59. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +1 -0
  60. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js +6 -0
  61. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +1 -0
  62. package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +3 -3
  63. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +1 -0
  64. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +0 -3
  65. package/build/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +1 -0
  66. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +5 -7
  67. package/build/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +1 -0
  68. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/AirCondition.js +65 -71
  69. package/build/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -0
  70. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +5 -1
  71. package/build/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +1 -0
  72. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Control.js +13 -29
  73. package/build/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -0
  74. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Ct.js +66 -73
  75. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -0
  76. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Dimmer.js +32 -39
  77. package/build/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +1 -0
  78. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Gate.js +5 -7
  79. package/build/lib/AlexaSmartHomeV3/Controls/Gate.js.map +1 -0
  80. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Hue.js +91 -89
  81. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -0
  82. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Light.js +10 -14
  83. package/build/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -0
  84. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Lock.js +6 -8
  85. package/build/lib/AlexaSmartHomeV3/Controls/Lock.js.map +1 -0
  86. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Motion.js +5 -1
  87. package/build/lib/AlexaSmartHomeV3/Controls/Motion.js.map +1 -0
  88. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +0 -10
  89. package/build/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +1 -0
  90. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Socket.js +5 -7
  91. package/build/lib/AlexaSmartHomeV3/Controls/Socket.js.map +1 -0
  92. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Temperature.js +5 -7
  93. package/build/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +1 -0
  94. package/build/lib/AlexaSmartHomeV3/Controls/Thermostat.js +82 -0
  95. package/build/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -0
  96. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +5 -7
  97. package/build/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -0
  98. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Volume.js +29 -36
  99. package/build/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -0
  100. package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/index.js +6 -6
  101. package/build/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -0
  102. package/{build-backend → build}/lib/AlexaSmartHomeV3/DeviceManager.js +16 -10
  103. package/build/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -0
  104. package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js +4 -1
  105. package/build/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +1 -0
  106. package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +1 -3
  107. package/build/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +1 -0
  108. package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +23 -16
  109. package/build/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +1 -0
  110. package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/Utils.js +0 -1
  111. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -0
  112. package/{build-backend → build}/lib/alexaSmartHomeV3.js +3 -3
  113. package/build/lib/alexaSmartHomeV3.js.map +1 -0
  114. package/{build-backend → build}/main.js +29 -9
  115. package/build/main.js.map +1 -0
  116. package/io-package.json +30 -29
  117. package/package.json +13 -13
  118. package/admin/assets/index-BjEWVyqN.js +0 -681
  119. package/admin/rules/assets/index-_Y2FN5EZ.js +0 -1152
  120. package/admin/rules/assets/preload-helper-Dp1pzeXC.js +0 -1
  121. package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +0 -1
  122. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +0 -1
  123. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +0 -1
  124. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +0 -1
  125. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +0 -1
  126. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +0 -1
  127. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +0 -1
  128. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +0 -1
  129. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +0 -1
  130. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +0 -1
  131. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +0 -1
  132. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +0 -1
  133. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +0 -1
  134. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +0 -1
  135. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +0 -1
  136. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +0 -1
  137. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +0 -1
  138. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +0 -1
  139. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +0 -1
  140. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +0 -1
  141. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +0 -1
  142. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +0 -1
  143. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +0 -1
  144. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +0 -1
  145. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +0 -1
  146. package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js.map +0 -1
  147. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js.map +0 -1
  148. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +0 -1
  149. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js.map +0 -1
  150. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js.map +0 -1
  151. package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js.map +0 -1
  152. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js.map +0 -1
  153. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js.map +0 -1
  154. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +0 -1
  155. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js.map +0 -1
  156. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +0 -1
  157. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js +0 -85
  158. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +0 -1
  159. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +0 -1
  160. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js.map +0 -1
  161. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js.map +0 -1
  162. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js.map +0 -1
  163. package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +0 -1
  164. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +0 -1
  165. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +0 -1
  166. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +0 -1
  167. package/build-backend/lib/alexaSmartHomeV3.js.map +0 -1
  168. package/build-backend/main.js.map +0 -1
  169. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +0 -0
  170. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +0 -0
  171. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +0 -0
  172. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js.map +0 -0
  173. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js +0 -0
  174. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js.map +0 -0
  175. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +0 -0
  176. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +0 -0
  177. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js +0 -0
  178. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js.map +0 -0
  179. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +0 -0
  180. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Directives/index.js.map +0 -0
  181. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +0 -0
  182. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js.map +0 -0
  183. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +0 -0
  184. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js.map +0 -0
  185. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +0 -0
  186. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js.map +0 -0
  187. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +0 -0
  188. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js.map +0 -0
  189. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +0 -0
  190. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js.map +0 -0
  191. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js +0 -0
  192. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js.map +0 -0
  193. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +0 -0
  194. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js.map +0 -0
  195. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +0 -0
  196. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js.map +0 -0
  197. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +0 -0
  198. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +0 -0
  199. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +0 -0
  200. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +0 -0
  201. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +0 -0
  202. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js.map +0 -0
  203. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +0 -0
  204. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Alexa/Properties/index.js.map +0 -0
  205. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Blind.js +0 -0
  206. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Blind.js.map +0 -0
  207. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Door.js +0 -0
  208. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Door.js.map +0 -0
  209. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Slider.js +0 -0
  210. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Slider.js.map +0 -0
  211. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +0 -0
  212. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js.map +0 -0
  213. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Window.js +0 -0
  214. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Controls/Window.js.map +0 -0
  215. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Device.js +0 -0
  216. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Device.js.map +0 -0
  217. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +0 -0
  218. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js.map +0 -0
  219. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +0 -0
  220. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js.map +0 -0
  221. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +0 -0
  222. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js.map +0 -0
  223. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/IotProxy.js +0 -0
  224. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/IotProxy.js.map +0 -0
  225. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/Logger.js +0 -0
  226. /package/{build-backend → build}/lib/AlexaSmartHomeV3/Helpers/Logger.js.map +0 -0
  227. /package/{build-backend → build}/lib/Utils.js +0 -0
  228. /package/{build-backend → build}/lib/Utils.js.map +0 -0
  229. /package/{build-backend → build}/lib/adminCommonSocket.js +0 -0
  230. /package/{build-backend → build}/lib/adminCommonSocket.js.map +0 -0
  231. /package/{build-backend → build}/lib/alexaCustom.js +0 -0
  232. /package/{build-backend → build}/lib/alexaCustom.js.map +0 -0
  233. /package/{build-backend → build}/lib/alexaSmartHomeV2.js +0 -0
  234. /package/{build-backend → build}/lib/alisa.js +0 -0
  235. /package/{build-backend → build}/lib/devices.js +0 -0
  236. /package/{build-backend → build}/lib/devices.js.map +0 -0
  237. /package/{build-backend → build}/lib/functions.js +0 -0
  238. /package/{build-backend → build}/lib/functions.js.map +0 -0
  239. /package/{build-backend → build}/lib/googleHome.js +0 -0
  240. /package/{build-backend → build}/lib/notifications.js +0 -0
  241. /package/{build-backend → build}/lib/notifications.js.map +0 -0
  242. /package/{build-backend → build}/lib/remote.js +0 -0
  243. /package/{build-backend → build}/lib/remote.js.map +0 -0
  244. /package/{build-backend → build}/lib/rooms.js +0 -0
  245. /package/{build-backend → build}/lib/rooms.js.map +0 -0
  246. /package/{build-backend → build}/lib/texts.js +0 -0
  247. /package/{build-backend → build}/lib/texts.js.map +0 -0
  248. /package/{build-backend → build}/lib/translate.js +0 -0
  249. /package/{build-backend → build}/lib/translate.js.map +0 -0
  250. /package/{build-backend → build}/lib/visuApp.js +0 -0
  251. /package/{build-backend → build}/lib/visuApp.js.map +0 -0
@@ -12,23 +12,17 @@ const AdjustableControl_1 = __importDefault(require("./AdjustableControl"));
12
12
  class Volume extends AdjustableControl_1.default {
13
13
  _speaker;
14
14
  _lastVolume;
15
+ constructor(detectedControl) {
16
+ super(detectedControl);
17
+ this._speaker = new Speaker_1.default(this.composeInitObjectVolume(), this.composeInitObjectMuted());
18
+ this._supported = [this._speaker];
19
+ }
15
20
  get categories() {
16
21
  return ['SPEAKER'];
17
22
  }
18
23
  adjustableProperties() {
19
24
  return [Volume_1.Volume];
20
25
  }
21
- initCapabilities() {
22
- this._speaker = new Speaker_1.default();
23
- const result = [this._speaker];
24
- for (const property of result.flatMap(item => item.properties)) {
25
- const intiOption = this.composeInitObject(property);
26
- if (intiOption) {
27
- property.init(intiOption);
28
- }
29
- }
30
- return result;
31
- }
32
26
  async setState(property, value) {
33
27
  // set the property itself
34
28
  await AdapterProvider_1.default.setState(property.setId, value);
@@ -84,32 +78,31 @@ class Volume extends AdjustableControl_1.default {
84
78
  }
85
79
  return property.currentValue;
86
80
  }
87
- composeInitObject(property) {
81
+ composeInitObjectVolume() {
88
82
  const map = this.statesMap;
89
- if (property.propertyName === Properties_1.default.Volume.propertyName) {
90
- return {
91
- setState: this.states[map.set],
92
- getState: this.states[map.actual] || this.states[map.set],
93
- alexaSetter: function (alexaValue) {
94
- return (0, Utils_1.denormalize_0_100)(alexaValue, this.valuesRangeMin, this.valuesRangeMax);
95
- },
96
- alexaGetter: function (value) {
97
- return (0, Utils_1.normalize_0_100)(value, this.valuesRangeMin, this.valuesRangeMax);
98
- },
99
- };
100
- }
101
- if (property.propertyName === Properties_1.default.Muted.propertyName) {
102
- return {
103
- setState: this.states[map.mute] || this.states[map.set],
104
- getState: this.states[map.mute] || this.states[map.set],
105
- alexaSetter: function (alexaValue) {
106
- return alexaValue;
107
- },
108
- alexaGetter: function (value) {
109
- return value;
110
- },
111
- };
112
- }
83
+ return {
84
+ setState: this.states[map.set],
85
+ getState: this.states[map.actual] || this.states[map.set],
86
+ alexaSetter: function (alexaValue) {
87
+ return (0, Utils_1.denormalize_0_100)(alexaValue, this.valuesRangeMin, this.valuesRangeMax);
88
+ },
89
+ alexaGetter: function (value) {
90
+ return (0, Utils_1.normalize_0_100)(value, this.valuesRangeMin, this.valuesRangeMax);
91
+ },
92
+ };
93
+ }
94
+ composeInitObjectMuted() {
95
+ const map = this.statesMap;
96
+ return {
97
+ setState: this.states[map.mute] || this.states[map.set],
98
+ getState: this.states[map.mute] || this.states[map.set],
99
+ alexaSetter: function (alexaValue) {
100
+ return alexaValue;
101
+ },
102
+ alexaGetter: function (value) {
103
+ return value;
104
+ },
105
+ };
113
106
  }
114
107
  }
115
108
  exports.default = Volume;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Volume.ts"],"names":[],"mappings":"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","sourcesContent":["import Speaker from '../Alexa/Capabilities/Speaker';\nimport Properties from '../Alexa/Properties';\nimport type { Base as PropertiesBase } from '../Alexa/Properties/Base';\nimport { Volume as PropertiesVolume } from '../Alexa/Properties/Volume';\nimport AdapterProvider from '../Helpers/AdapterProvider';\nimport { denormalize_0_100, normalize_0_100 } from '../Helpers/Utils';\nimport AdjustableControl from './AdjustableControl';\nimport type {\n AlexaV3Category,\n AlexaV3DirectiveValue,\n IotExternalDetectorState,\n IotExternalPatternControl,\n} from '../types';\n\nexport default class Volume extends AdjustableControl {\n private readonly _speaker: Speaker;\n private _lastVolume: ioBroker.StateValue | undefined;\n\n constructor(detectedControl: IotExternalPatternControl) {\n super(detectedControl);\n\n this._speaker = new Speaker(this.composeInitObjectVolume(), this.composeInitObjectMuted());\n this._supported = [this._speaker];\n }\n\n get categories(): AlexaV3Category[] {\n return ['SPEAKER'];\n }\n\n adjustableProperties(): (typeof PropertiesBase)[] {\n return [PropertiesVolume];\n }\n\n async setState(property: PropertiesBase, value: ioBroker.StateValue | undefined): Promise<void> {\n // set the property itself\n await AdapterProvider.setState(property.setId, value!);\n property.currentValue = value;\n\n if (property.propertyName === Properties.Muted.propertyName) {\n if (!this._speaker) {\n throw new Error('Muted property name is missing');\n }\n // set volume\n if (value) {\n // set volume to 0 on MUTED true\n await AdapterProvider.setState(this._speaker.volume.setId, 0);\n this._lastVolume = this._speaker.volume.currentValue;\n this._speaker.volume.currentValue = 0;\n } else {\n // set volume to the last known, configured or 20 otherwise on MUTED false\n if (this._lastVolume === undefined) {\n const smartName = this.states[this.statesMap.set]!.smartName;\n if (typeof smartName === 'object' && smartName && smartName.byON !== undefined) {\n this._lastVolume = smartName.byON;\n }\n this._lastVolume =\n this._lastVolume === undefined || isNaN(this._lastVolume as unknown as number)\n ? denormalize_0_100(\n 20,\n this._speaker.volume.valuesRangeMin as number,\n this._speaker.volume.valuesRangeMax as number,\n )\n : parseInt(this._lastVolume as string, 10);\n }\n await AdapterProvider.setState(this._speaker.volume.setId, this._lastVolume as number);\n this._speaker.volume.currentValue = this._lastVolume;\n }\n } else {\n // set muted\n const muted = value === 0;\n // only on different IDs for volume and muted\n if (this._speaker.volume.setId !== this._speaker.muted.setId) {\n await AdapterProvider.setState(this._speaker.muted.setId, muted);\n }\n this._speaker.muted.currentValue = muted;\n }\n }\n\n protected async getOrRetrieveCurrentValue(property: PropertiesBase): Promise<ioBroker.StateValue> {\n if (property.currentValue === undefined) {\n property.currentValue = await AdapterProvider.getState(property.getId);\n\n // convert non zero volumes to muted = false\n if (\n property.propertyName === this._speaker.muted.propertyName &&\n property.getId === this._speaker.volume.getId\n ) {\n property.currentValue = property.currentValue === 0;\n }\n }\n\n if (property.currentValue === undefined) {\n throw new Error(`unable to retrieve ${property.getId}`);\n }\n\n return property.currentValue;\n }\n\n private composeInitObjectVolume(): {\n setState: IotExternalDetectorState;\n getState: IotExternalDetectorState;\n alexaSetter?: (alexaValue: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n } {\n const map = this.statesMap;\n\n return {\n setState: this.states[map.set]!,\n getState: this.states[map.actual] || this.states[map.set]!,\n alexaSetter: function (\n this: PropertiesBase,\n alexaValue: AlexaV3DirectiveValue,\n ): ioBroker.StateValue | undefined {\n return denormalize_0_100(\n alexaValue as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n );\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return normalize_0_100(value as number, this.valuesRangeMin as number, this.valuesRangeMax as number);\n },\n };\n }\n\n private composeInitObjectMuted(): {\n setState: IotExternalDetectorState;\n getState: IotExternalDetectorState;\n alexaSetter?: (alexaValue: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n } {\n const map = this.statesMap;\n\n return {\n setState: this.states[map.mute] || this.states[map.set]!,\n getState: this.states[map.mute] || this.states[map.set]!,\n alexaSetter: function (alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n return alexaValue as boolean;\n },\n alexaGetter: function (value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n return value as boolean;\n },\n };\n }\n}\n"]}
@@ -27,9 +27,9 @@ const VolumeGroup_1 = __importDefault(require("./VolumeGroup"));
27
27
  const Window_1 = __importDefault(require("./Window"));
28
28
  exports.default = {
29
29
  factory: (item) => {
30
- if (item.type === AdjustableControl_1.default.type) {
31
- return new AdjustableControl_1.default(item);
32
- }
30
+ // if (item.type === AdjustableControl.type) {
31
+ // return new AdjustableControl(item);
32
+ // }
33
33
  if (item.type === AdjustablePercentageControl_1.default.type) {
34
34
  return new AdjustablePercentageControl_1.default(item);
35
35
  }
@@ -66,9 +66,9 @@ exports.default = {
66
66
  if (item.type === Motion_1.default.type) {
67
67
  return new Motion_1.default(item);
68
68
  }
69
- if (item.type === ReadOnlyDetector_1.default.type) {
70
- return new ReadOnlyDetector_1.default(item);
71
- }
69
+ // if (item.type === ReadOnlyDetector.type) {
70
+ // return new ReadOnlyDetector(item);
71
+ // }
72
72
  if (item.type === Slider_1.default.type) {
73
73
  return new Slider_1.default(item);
74
74
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/index.ts"],"names":[],"mappings":"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","sourcesContent":["import AdjustableControl from './AdjustableControl';\nimport AdjustablePercentageControl from './AdjustablePercentageControl';\nimport AirCondition from './AirCondition';\nimport Blind from './Blind';\nimport ContactSensor from './ContactSensor';\nimport type Control from './Control';\nimport Ct from './Ct';\nimport Dimmer from './Dimmer';\nimport Door from './Door';\nimport Gate from './Gate';\nimport Hue from './Hue';\nimport Light from './Light';\nimport Lock from './Lock';\nimport Motion from './Motion';\nimport ReadOnlyDetector from './ReadOnlyDetector';\nimport Slider from './Slider';\nimport Socket from './Socket';\nimport Temperature from './Temperature';\nimport Thermostat from './Thermostat';\nimport VacuumCleaner from './VacuumCleaner';\nimport Volume from './Volume';\nimport VolumeGroup from './VolumeGroup';\nimport Window from './Window';\nimport type { IotExternalPatternControl } from '../types';\n\nexport default {\n factory: (item: IotExternalPatternControl): Control | null => {\n // if (item.type === AdjustableControl.type) {\n // return new AdjustableControl(item);\n // }\n if (item.type === AdjustablePercentageControl.type) {\n return new AdjustablePercentageControl(item);\n }\n if (item.type === AirCondition.type) {\n return new AirCondition(item);\n }\n if (item.type === Blind.type) {\n return new Blind(item);\n }\n if (item.type === ContactSensor.type) {\n return new ContactSensor(item);\n }\n if (item.type === Ct.type) {\n return new Ct(item);\n }\n if (item.type === Dimmer.type) {\n return new Dimmer(item);\n }\n if (item.type === Door.type) {\n return new Door(item);\n }\n if (item.type === Gate.type) {\n return new Gate(item);\n }\n if (item.type === Hue.type) {\n return new Hue(item);\n }\n if (item.type === Light.type) {\n return new Light(item);\n }\n if (item.type === Lock.type) {\n return new Lock(item);\n }\n if (item.type === Motion.type) {\n return new Motion(item);\n }\n // if (item.type === ReadOnlyDetector.type) {\n // return new ReadOnlyDetector(item);\n // }\n if (item.type === Slider.type) {\n return new Slider(item);\n }\n if (item.type === Socket.type) {\n return new Socket(item);\n }\n if (item.type === Temperature.type) {\n return new Temperature(item);\n }\n if (item.type === Thermostat.type) {\n return new Thermostat(item);\n }\n if (item.type === VacuumCleaner.type) {\n return new VacuumCleaner(item);\n }\n if (item.type === Volume.type) {\n return new Volume(item);\n }\n if (item.type === VolumeGroup.type) {\n return new VolumeGroup(item);\n }\n if (item.type === Window.type) {\n return new Window(item);\n }\n return null;\n },\n AdjustableControl,\n AdjustablePercentageControl,\n AirCondition,\n Blind,\n ContactSensor,\n Ct,\n Dimmer,\n Door,\n Gate,\n Hue,\n Light,\n Lock,\n Motion,\n ReadOnlyDetector,\n Slider,\n Socket,\n Temperature,\n Thermostat,\n VacuumCleaner,\n Volume,\n VolumeGroup,\n Window,\n};\n"]}
@@ -63,8 +63,8 @@ class DeviceManager {
63
63
  constructor() {
64
64
  this.log = new Logger_1.default(this);
65
65
  }
66
- informAboutStatesChange() {
67
- void AdapterProvider_1.default.get().setState('smart.updates3', true, true);
66
+ async informAboutStatesChange() {
67
+ await AdapterProvider_1.default.get().setStateAsync('smart.updates3', true, true);
68
68
  }
69
69
  get language() {
70
70
  return this.lang;
@@ -310,15 +310,17 @@ class DeviceManager {
310
310
  const directive = this.matchDirective(responseEvent);
311
311
  if (directive) {
312
312
  // BF[2024.02.04]: temporarily disabled as produced a huge number of events
313
- // const stateChange = await directive.handle(responseEvent, this);
313
+ const stateChange = await directive.handle(responseEvent, this);
314
314
  // get device state (not just one control)
315
315
  const deviceState = await device.reportState();
316
316
  if (JSON.stringify(device.lastReportedState) !== JSON.stringify(deviceState)) {
317
317
  device.lastReportedState = deviceState;
318
318
  // fire state change report to Alexa
319
319
  // BF[2024.02.04]: temporarily disabled as produced a huge number of events
320
- // this.publishStateChange(stateChange);
321
- this.informAboutStatesChange();
320
+ if (process.env.TESTS_EXECUTION) {
321
+ this.publishStateChange(stateChange);
322
+ }
323
+ await this.informAboutStatesChange();
322
324
  }
323
325
  else {
324
326
  this.log.debug(`ignoring state change event for ${endpointId} due to the same_ value [${JSON.stringify(deviceState)}]`);
@@ -326,7 +328,7 @@ class DeviceManager {
326
328
  }
327
329
  }
328
330
  return response;
329
- }, AlexaResponse_1.default.endpointUnreachable(event.directive.header.messageId).get());
331
+ }, AlexaResponse_1.default.throttlingException(event.directive.header.messageId).get());
330
332
  }
331
333
  else {
332
334
  response = AlexaResponse_1.default.directiveNotSupportedByDevice(device.friendlyName, event.directive.header.namespace, event.directive.header.messageId, event.directive.header.payloadVersion).get();
@@ -362,16 +364,20 @@ class DeviceManager {
362
364
  const directive = this.matchDirective(responseEvent);
363
365
  if (directive) {
364
366
  // BF[2024.02.04]: temporarily disabled as produced a huge number of events
365
- // const stateChange = await directive.handle(event, this);
367
+ const stateChange = await directive.handle(responseEvent, this);
366
368
  // get device state (not just one control)
367
369
  const deviceState = await device.reportState();
368
370
  if (JSON.stringify(device.lastReportedState) !== JSON.stringify(deviceState)) {
369
371
  device.lastReportedState = deviceState;
370
- this.informAboutStatesChange();
372
+ await this.informAboutStatesChange();
371
373
  // fire state change report to Alexa
372
374
  // BF[2024.02.04]: temporarily disabled as produced a huge number of events
373
- // await this.executeWithinRateLimits(device.id, async () =>
374
- // this.publishStateChange(stateChange), undefined);
375
+ if (process.env.TESTS_EXECUTION) {
376
+ await this.executeWithinRateLimits(device.id, () => {
377
+ this.publishStateChange(stateChange);
378
+ return Promise.resolve(stateChange);
379
+ }, AlexaResponse_1.default.throttlingException(responseEvent.directive.header.messageId).get());
380
+ }
375
381
  }
376
382
  else {
377
383
  this.log.debug(`ignoring state change event for ${id} due to the same_ value [${JSON.stringify(deviceState)}]`);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceManager.js","sourceRoot":"","sources":["../../../src/lib/AlexaSmartHomeV3/DeviceManager.ts"],"names":[],"mappings":"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","sourcesContent":["import Device from './Device';\nimport * as Utils from './Helpers/Utils';\nimport Directives from './Alexa/Directives';\nimport Controls from './Controls';\nimport type Control from './Controls/Control';\nimport Logger from './Helpers/Logger';\nimport AdapterProvider from './Helpers/AdapterProvider';\nimport AlexaResponse from './Alexa/AlexaResponse';\nimport IotProxy from './Helpers/IotProxy';\nimport RateLimiter from './Helpers/RateLimiter';\nimport OverallDailyRateLimitExceeded from './Exceptions/OverallDailyRateLimitExceeded';\nimport HourlyDeviceRateLimitExceeded from './Exceptions/HourlyDeviceRateLimitExceeded';\nimport type { AlexaV3EndpointID, AlexaV3Request, IotExternalPatternControl } from './types';\nimport ChangeReport from './Alexa/Directives/ChangeReport';\nimport Discovery from './Alexa/Directives/Discovery';\nimport ReportState from './Alexa/Directives/ReportState';\nimport { randomUUID } from 'node:crypto';\n\nexport default class DeviceManager {\n private lang: ioBroker.Languages = 'en';\n private devices: Device[] = [];\n private subscribed: string[] = [];\n private log: Logger;\n private eventsPausedTill = 0; // timestamp\n\n private collecting = false;\n private recollect = false;\n\n /** Creates a Device Manager */\n constructor() {\n this.log = new Logger(this);\n }\n\n async informAboutStatesChange(): Promise<void> {\n await AdapterProvider.get().setStateAsync('smart.updates3', true, true);\n }\n\n get language(): ioBroker.Languages {\n return this.lang;\n }\n\n set language(value: ioBroker.Languages) {\n this.lang = value;\n }\n\n matchDirective(event: AlexaV3Request): ChangeReport | Discovery | ReportState | null {\n if (ChangeReport.matches(event)) {\n return new ChangeReport();\n }\n if (Discovery.matches(event)) {\n return new Discovery();\n }\n if (ReportState.matches(event)) {\n return new ReportState();\n }\n\n return null;\n }\n\n get endpoints(): Device[] {\n return this.devices;\n }\n\n endpointById(id: AlexaV3EndpointID): Device | undefined {\n return this.devices.find(device => device.id === id);\n }\n\n addDevice(device: Device): void {\n this.devices.push(device);\n }\n\n toDevice(\n detectedControls: IotExternalPatternControl[],\n friendlyName: string,\n autoDetected: boolean,\n roomName: string | undefined,\n funcName: string | undefined,\n toggle?: boolean,\n ): Device | undefined {\n const controls: Control[] = [];\n\n this.log.debug(`merging controls to a device with name ${friendlyName}`);\n\n detectedControls.forEach(item => {\n this.log.silly(`processing control: ${JSON.stringify(item)}`);\n const control = Controls.factory(item);\n if (control) {\n this.log.debug(`${item.type} added to ${friendlyName}`);\n controls.push(control);\n } else {\n this.log.debug(`control of type ${item.type} not supported yet. Skipped.`);\n }\n });\n\n if (controls.length === 0) {\n // the controls are not supported yet...\n return;\n }\n\n // create and add a new device to the collected devices\n this.addDevice(\n new Device({\n id: friendlyName,\n friendlyName,\n controls,\n autoDetected,\n roomName,\n funcName,\n toggle,\n }),\n );\n }\n\n getName(name: ioBroker.StringOrTranslated | undefined): string {\n if (!name) {\n return '';\n }\n if (typeof name === 'object') {\n return name[this.lang] || name.en || '';\n }\n return name;\n }\n\n async collectEndpoints(): Promise<void> {\n if (this.collecting) {\n this.log.debug(`collecting devices already in progress. Skipping...`);\n this.recollect = true;\n return;\n }\n this.collecting = true;\n this.log.debug(`(re)collecting devices...`);\n try {\n // const discoveryNeeded = this.devices.length > 0;\n\n this.devices = [];\n const defaultToggle = AdapterProvider.get().config.defaultToggle || false;\n\n // collect all iobroker controls in terms of iobroker type detector (https://github.com/ioBroker/ioBroker.type-detector)\n let detectedControls = await Utils.controls(AdapterProvider.get(), this.lang);\n\n this.log.debug(`type detector found ${detectedControls.length} controls`);\n\n // Normally, every control is a smart device. But due to the iobroker concept of 'rooms and functions'\n // multiple controls might be merged to a single device.\n\n // as long as not all controls mapped to a device...\n\n // detectedControls = detectedControls.filter(c => ['light', 'dimmer'].includes(c.type));\n const createdGroups: string[] = [];\n\n while (detectedControls.length) {\n // take the next control\n const control = detectedControls[0];\n let processedControls: IotExternalPatternControl[] = [];\n\n if (control.room?.common?.name) {\n if (control.functionality?.common?.name) {\n // controls in the same room with the same functionality\n processedControls = detectedControls.filter(\n item =>\n control.room &&\n item.room?.id === control.room.id &&\n control.functionality &&\n item.functionality?.id === control.functionality.id,\n );\n this.toDevice(\n processedControls,\n Utils.friendlyNameByRoomAndFunctionName(control, this.lang),\n true,\n this.getName(control.room?.common?.name),\n this.getName(control.functionality?.common?.name),\n processedControls[0].object?.toggle ?? defaultToggle,\n );\n } else {\n this.log.debug(\n `Control of type [${control.type}] assigned to room [${this.getName(control.room.common.name)}] has no function. Skipped.`,\n );\n }\n } else if (control.groupNames) {\n // no room, but smart name (not only one)\n control.groupNames.forEach(groupName => {\n if (!createdGroups.includes(groupName)) {\n createdGroups.push(groupName);\n processedControls = detectedControls.filter(item => item.groupNames?.includes(groupName));\n this.toDevice(\n processedControls,\n this.getName(groupName),\n false,\n undefined,\n undefined,\n processedControls[0].object?.toggle ?? defaultToggle,\n );\n }\n });\n } else {\n // neither room nor smart name\n this.log.debug(`Control of type [${control.type}] has neither room no smart name. Skipped.`);\n }\n\n if (processedControls.length === 0) {\n processedControls = [control];\n }\n\n // remove processed controls\n const objectIds = processedControls.map(item => item.object?.id);\n detectedControls = detectedControls.filter(item => item.object && !objectIds.includes(item.object.id));\n }\n\n // done\n this.log.debug(`finished collecting devices. there is/are ${this.devices.length} device(s) in total`);\n for (const device of this.devices) {\n this.log.debug(`${device.toString()}`);\n }\n\n // a new discovery process is needed in case we had already devices and device collection was\n // triggered again by, e.g., a change in room/function enums\n // if (discoveryNeeded) {\n // this.log.info(`Please delete all managed by ioBroker devices in your Alexa app and then start discovery`);\n // }\n\n // collect all relevant states to subscribe to updates\n const stateIds = new Set(\n this.devices\n .flatMap(d => d.controls)\n .flatMap(item => item.supported)\n .flatMap(item => item.properties)\n .map(item => item.getId)\n .filter(id => id),\n );\n this.log.debug(`registering for updates of total ${stateIds.size} states`);\n const promises = [];\n const newSubscribed = Array.from(stateIds);\n // subscribe to updates\n for (const id of newSubscribed) {\n this.log.silly(`subscribing to updates of ${id}`);\n if (!this.subscribed.includes(id)) {\n this.subscribed.push(id);\n promises.push(AdapterProvider.subscribe(id));\n }\n }\n\n this.subscribed.sort();\n\n // wait till all promises are settled\n const results = await Promise.allSettled(promises);\n\n // unsubscribe from unused states\n for (let i = this.subscribed.length - 1; i >= 0; i--) {\n const id = this.subscribed[i];\n if (!newSubscribed.includes(id)) {\n this.log.silly(`unsubscribing from updates of ${id}`);\n this.subscribed.splice(i, 1);\n await AdapterProvider.unsubscribe(id);\n }\n }\n\n const failedReasons = results.filter(item => item.status !== 'fulfilled').flatMap(item => item.reason);\n if (failedReasons.length) {\n this.log.debug(`failed to subscribe for updates of ${failedReasons.length} states`);\n try {\n for (const reason of failedReasons) {\n this.log.silly(\n `failed subscribing: ${typeof reason === 'string' ? reason : JSON.stringify(reason)}`,\n );\n }\n } catch {\n // nop\n }\n }\n } catch (e) {\n this.log.error(`failed to collect devices: ${e}`);\n }\n\n this.collecting = false;\n\n // if during the collection a new collection was triggered, start collecting again\n if (this.recollect) {\n this.recollect = false;\n setTimeout(() => this.collectEndpoints(), 1000);\n }\n }\n\n async destroy(): Promise<void> {\n const promises = [];\n for (const id of this.subscribed) {\n this.log.silly(`unsubscribing from updates of ${id}`);\n promises.push(AdapterProvider.subscribe(id));\n }\n await Promise.allSettled(promises);\n\n this.subscribed = [];\n }\n\n publishStateChange(stateChange: AlexaResponse): void {\n if (this.eventsPausedTill < Date.now()) {\n this.log.silly(`publishing ${JSON.stringify(stateChange)}`);\n IotProxy.publishStateChange(stateChange);\n }\n }\n\n pauseEvents(): void {\n this.eventsPausedTill = Date.now() + 30 * 60 * 1000; // 30 minutes\n }\n\n async executeWithinRateLimits(\n endpointId: AlexaV3EndpointID,\n awaitable: () => Promise<AlexaResponse>,\n errorResponse: AlexaResponse,\n ): Promise<AlexaResponse> {\n try {\n await RateLimiter.incrementAndGet(endpointId);\n return await awaitable();\n } catch (error) {\n if (error instanceof OverallDailyRateLimitExceeded || error instanceof HourlyDeviceRateLimitExceeded) {\n this.log.warn(error.message);\n } else {\n this.log.error(error.message);\n }\n\n return errorResponse;\n }\n }\n\n async handleAlexaEvent(event: AlexaV3Request): Promise<AlexaResponse> {\n this.log.debug(`incoming Alexa event`);\n this.log.silly(`${JSON.stringify(event)}`);\n if (!event?.directive?.header) {\n throw new Error('Alexa event header is missing');\n }\n\n let response: AlexaResponse;\n const directive = this.matchDirective(event);\n if (directive) {\n response = await directive.handle(event, this);\n } else {\n const endpointId = event?.directive?.endpoint?.endpointId;\n const device = endpointId ? this.endpointById(endpointId) : undefined;\n\n if (device) {\n if (device.supports(event)) {\n response = await this.executeWithinRateLimits(\n endpointId!,\n async () => {\n response = await device.handle(event);\n if (!AlexaResponse.isErrorResponse(response)) {\n // report state change via voice interaction\n const propertyName = response.context?.properties[0].name;\n const responseEvent = ChangeReport.get(\n device.id,\n propertyName || '',\n false,\n event.directive.header.messageId,\n );\n const directive = this.matchDirective(responseEvent);\n if (directive) {\n // BF[2024.02.04]: temporarily disabled as produced a huge number of events\n const stateChange = await directive.handle(responseEvent, this);\n // get device state (not just one control)\n const deviceState = await device.reportState();\n if (JSON.stringify(device.lastReportedState) !== JSON.stringify(deviceState)) {\n device.lastReportedState = deviceState;\n // fire state change report to Alexa\n // BF[2024.02.04]: temporarily disabled as produced a huge number of events\n if (process.env.TESTS_EXECUTION) {\n this.publishStateChange(stateChange);\n }\n await this.informAboutStatesChange();\n } else {\n this.log.debug(\n `ignoring state change event for ${endpointId} due to the same_ value [${JSON.stringify(deviceState)}]`,\n );\n }\n }\n }\n return response;\n },\n AlexaResponse.throttlingException(event.directive.header.messageId).get(),\n );\n } else {\n response = AlexaResponse.directiveNotSupportedByDevice(\n device.friendlyName,\n event.directive.header.namespace,\n event.directive.header.messageId,\n event.directive.header.payloadVersion,\n ).get();\n }\n } else {\n response = AlexaResponse.endpointUnreachable(event.directive.header.messageId).get();\n }\n }\n\n this.log.silly(`response: ${JSON.stringify(response)}`);\n return response;\n }\n\n async handleStateUpdate(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n // ignore updates not confirmed by a corresponding device\n if (!state?.ack) {\n this.log.silly(`ignoring state change event for ${id} due to state.ack == ${state?.ack}`);\n return;\n }\n\n let notFound = true;\n\n for (const device of this.devices) {\n const property = device.controls\n .flatMap(item => item.supported)\n .flatMap(item => item.properties)\n .find(item => item.getId === id);\n\n if (property) {\n notFound = false;\n if (property.currentValue === state.val) {\n this.log.debug(`ignoring state change event for ${id} due to the same value [${state.val}]`);\n } else {\n property.currentValue = state.val;\n\n const responseEvent = Directives.ChangeReport.get(\n device.id,\n property.propertyName,\n true,\n randomUUID(),\n );\n const directive = this.matchDirective(responseEvent);\n if (directive) {\n // BF[2024.02.04]: temporarily disabled as produced a huge number of events\n const stateChange = await directive.handle(responseEvent, this);\n\n // get device state (not just one control)\n const deviceState = await device.reportState();\n\n if (JSON.stringify(device.lastReportedState) !== JSON.stringify(deviceState)) {\n device.lastReportedState = deviceState;\n await this.informAboutStatesChange();\n // fire state change report to Alexa\n\n // BF[2024.02.04]: temporarily disabled as produced a huge number of events\n if (process.env.TESTS_EXECUTION) {\n await this.executeWithinRateLimits(\n device.id,\n () => {\n this.publishStateChange(stateChange);\n return Promise.resolve(stateChange);\n },\n AlexaResponse.throttlingException(responseEvent.directive.header.messageId).get(),\n );\n }\n } else {\n this.log.debug(\n `ignoring state change event for ${id} due to the same_ value [${JSON.stringify(deviceState)}]`,\n );\n }\n }\n }\n\n // should be the only device having the id => stop processing here\n break;\n }\n }\n\n // this should never happen\n if (notFound) {\n this.log.debug(`state id ${id} doesn't belong to any device`);\n }\n }\n}\n"]}
@@ -24,7 +24,10 @@ class AdapterProvider {
24
24
  */
25
25
  static async getState(id) {
26
26
  const state = await AdapterProvider.get().getForeignStateAsync(id);
27
- return state?.val;
27
+ if (state === null) {
28
+ return null;
29
+ }
30
+ return state ? (state.val === undefined ? null : state.val) : undefined;
28
31
  }
29
32
  static async subscribe(id) {
30
33
  await AdapterProvider.get().subscribeForeignStatesAsync(id);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdapterProvider.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.ts"],"names":[],"mappings":";;AAEA,MAAqB,eAAe;IAChC,MAAM,CAAC,eAAe,CAAa;IAEnC,MAAM,CAAC,IAAI,CAAC,OAAmB;QAC3B,eAAe,CAAC,eAAe,GAAG,OAAO,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,GAAG;QACN,OAAO,eAAe,CAAC,eAAe,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,KAA0B;QACxD,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnE,eAAe,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC5B,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAU;QAC7B,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAU;QAC/B,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;CACJ;AAzCD,kCAyCC","sourcesContent":["import type { IotAdapter } from '../../../main';\n\nexport default class AdapterProvider {\n static adapterInstance: IotAdapter;\n\n static init(adapter: IotAdapter): void {\n AdapterProvider.adapterInstance = adapter;\n }\n\n static get(): IotAdapter {\n return AdapterProvider.adapterInstance;\n }\n\n /**\n * Sets iobroker state to the passed on value\n *\n * @param id - id of the state to write the value to\n * @param value - value to set the provided state to\n */\n static async setState(id: string, value: ioBroker.StateValue): Promise<void> {\n await AdapterProvider.get().setForeignStateAsync(id, value, false);\n AdapterProvider.get().log.silly(`[AlexaV3::AdapterProvider]: set [${id}] to [${value}]`);\n }\n\n /**\n * @param id State id to get the value from\n * @returns Object's val returned by the iobroker getForeignStateAsync function\n */\n static async getState(id: string): Promise<ioBroker.StateValue | undefined> {\n const state = await AdapterProvider.get().getForeignStateAsync(id);\n if (state === null) {\n return null;\n }\n return state ? (state.val === undefined ? null : state.val) : undefined;\n }\n\n static async subscribe(id: string): Promise<void> {\n await AdapterProvider.get().subscribeForeignStatesAsync(id);\n }\n\n static async unsubscribe(id: string): Promise<void> {\n await AdapterProvider.get().unsubscribeForeignStatesAsync(id);\n }\n}\n"]}
@@ -5,12 +5,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const node_fs_1 = __importDefault(require("node:fs"));
7
7
  const node_path_1 = __importDefault(require("node:path"));
8
- const adapter_core_1 = __importDefault(require("@iobroker/adapter-core"));
9
- const AdapterProvider_1 = __importDefault(require("./AdapterProvider"));
10
8
  class FileHelper {
11
9
  static _rootFolder;
12
10
  static get rootFolder() {
13
- this._rootFolder ||= adapter_core_1.default.getAbsoluteInstanceDataDir(AdapterProvider_1.default.get());
11
+ this._rootFolder ||= __dirname;
14
12
  return this._rootFolder;
15
13
  }
16
14
  static async createFolder(folderPath) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileHelper.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/FileHelper.ts"],"names":[],"mappings":";;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAE7B,MAAqB,UAAU;IAC3B,MAAM,CAAC,WAAW,CAAS;IAC3B,MAAM,KAAK,UAAU;QACjB,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAkB;QACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,iBAAE,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;gBAC1B,IAAI,KAAK,EAAE,CAAC;oBACR,kDAAkD;oBAClD,iBAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE;wBAC9C,IAAI,KAAK,EAAE,CAAC;4BACR,MAAM,CAAC,KAAK,CAAC,CAAC;wBAClB,CAAC;6BAAM,CAAC;4BACJ,OAAO,EAAE,CAAC;wBACd,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,OAAO,EAAE,CAAC;gBACd,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,YAAoB;QACpC,OAAO,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,QAAgB;QAC1B,OAAO,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAgB;QAC9B,OAAO,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,OAAY;QAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,iBAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ;AA5CD,6BA4CC","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nexport default class FileHelper {\n static _rootFolder: string;\n static get rootFolder(): string {\n this._rootFolder ||= __dirname;\n return this._rootFolder;\n }\n\n static async createFolder(folderPath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.access(folderPath, error => {\n if (error) {\n // If the directory does not exist, then create it\n fs.mkdir(folderPath, { recursive: true }, error => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n resolve();\n }\n });\n });\n }\n\n static absolutePath(relativePath: string): string {\n return path.join(this.rootFolder, relativePath);\n }\n\n static exists(fileName: string): boolean {\n return fs.existsSync(fileName);\n }\n\n static async read(fileName: string): Promise<string> {\n return fs.promises.readFile(fileName, 'utf-8');\n }\n\n static async write(fileName: string, content: any): Promise<void> {\n if (typeof content !== 'string') {\n content = JSON.stringify(content);\n }\n return fs.promises.writeFile(fileName, content);\n }\n}\n"]}
@@ -36,10 +36,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- // import path from 'path';
39
+ const path_1 = __importDefault(require("path"));
40
40
  const HourlyDeviceRateLimitExceeded_1 = __importDefault(require("../Exceptions/HourlyDeviceRateLimitExceeded"));
41
41
  const OverallDailyRateLimitExceeded_1 = __importDefault(require("../Exceptions/OverallDailyRateLimitExceeded"));
42
- // import FileHelper from './FileHelper';
42
+ const FileHelper_1 = __importDefault(require("./FileHelper"));
43
43
  const Utils = __importStar(require("./Utils"));
44
44
  class RateLimiter {
45
45
  static MAX_DEVICE_STATE_CHANGES_PER_HOUR = 60;
@@ -47,27 +47,34 @@ class RateLimiter {
47
47
  static USAGE_STORAGE_FOLDER = 'usage';
48
48
  static USAGE_STORAGE_FILE_NAME = 'usage.json';
49
49
  static usage = new Map();
50
- static init() {
50
+ static async init() {
51
51
  try {
52
- // await FileHelper.createFolder(FileHelper.absolutePath(this.USAGE_STORAGE_FOLDER));
53
- // const raw = await FileHelper.read(this.storageFileName);
54
- // this.usage = new Map(JSON.parse(raw));
55
- this.usage = new Map();
52
+ if (process.env.TESTS_EXECUTION) {
53
+ await FileHelper_1.default.createFolder(FileHelper_1.default.absolutePath(this.USAGE_STORAGE_FOLDER));
54
+ const raw = await FileHelper_1.default.read(this.storageFileName);
55
+ this.usage = new Map(JSON.parse(raw));
56
+ }
57
+ else {
58
+ this.usage = new Map();
59
+ }
56
60
  }
57
61
  catch {
58
62
  this.usage = new Map();
59
63
  }
60
- return Promise.resolve();
64
+ return;
65
+ }
66
+ static get storageFileName() {
67
+ return FileHelper_1.default.absolutePath(path_1.default.join(this.USAGE_STORAGE_FOLDER, this.USAGE_STORAGE_FILE_NAME));
61
68
  }
62
- // static get storageFileName(): string {
63
- // return FileHelper.absolutePath(path.join(this.USAGE_STORAGE_FOLDER, this.USAGE_STORAGE_FILE_NAME));
64
- // }
65
69
  static async store() {
66
- // try {
67
- // await FileHelper.write(this.storageFileName, JSON.stringify(Array.from(this.usage.entries())));
68
- // } catch (error) {
69
- // // nop
70
- // }
70
+ if (process.env.TESTS_EXECUTION) {
71
+ try {
72
+ await FileHelper_1.default.write(this.storageFileName, JSON.stringify(Array.from(this.usage.entries())));
73
+ }
74
+ catch {
75
+ // nop
76
+ }
77
+ }
71
78
  }
72
79
  static get(endpointId) {
73
80
  let item = this.usage.get(endpointId);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/RateLimiter.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\nimport HourlyDeviceRateLimitExceeded from '../Exceptions/HourlyDeviceRateLimitExceeded';\nimport OverallDailyRateLimitExceeded from '../Exceptions/OverallDailyRateLimitExceeded';\nimport FileHelper from './FileHelper';\nimport * as Utils from './Utils';\nimport type { AlexaV3EndpointID } from '../types';\n\nexport default class RateLimiter {\n static MAX_DEVICE_STATE_CHANGES_PER_HOUR = 60;\n static MAX_CHANGES_PER_DAY = 1000;\n static USAGE_STORAGE_FOLDER = 'usage';\n static USAGE_STORAGE_FILE_NAME = 'usage.json';\n\n static usage: Map<\n string,\n {\n changeCounter: number;\n timestamp: string;\n }\n > = new Map();\n\n static async init(): Promise<void> {\n try {\n if (process.env.TESTS_EXECUTION) {\n await FileHelper.createFolder(FileHelper.absolutePath(this.USAGE_STORAGE_FOLDER));\n const raw = await FileHelper.read(this.storageFileName);\n this.usage = new Map(JSON.parse(raw));\n } else {\n this.usage = new Map();\n }\n } catch {\n this.usage = new Map();\n }\n return;\n }\n\n static get storageFileName(): string {\n return FileHelper.absolutePath(path.join(this.USAGE_STORAGE_FOLDER, this.USAGE_STORAGE_FILE_NAME));\n }\n\n static async store(): Promise<void> {\n if (process.env.TESTS_EXECUTION) {\n try {\n await FileHelper.write(this.storageFileName, JSON.stringify(Array.from(this.usage.entries())));\n } catch {\n // nop\n }\n }\n }\n\n static get(endpointId: AlexaV3EndpointID): {\n changeCounter: number;\n timestamp: string;\n } {\n let item = this.usage.get(endpointId);\n if (!item) {\n item = {\n changeCounter: 0,\n timestamp: Utils.currentHour().toISOString(),\n };\n this.usage.set(endpointId, item);\n }\n return item;\n }\n\n static async incrementAndGet(endpointId: AlexaV3EndpointID): Promise<{\n changeCounter: number;\n timestamp: string;\n }> {\n const item = this.get(endpointId);\n\n if (!Utils.isCurrentHour(Utils.parseISOString(item.timestamp))) {\n item.changeCounter = 1;\n item.timestamp = Utils.currentHour().toISOString();\n } else {\n item.changeCounter += 1;\n }\n\n this.usage.set(endpointId, item);\n\n try {\n await this.store();\n } catch {\n // nop\n }\n\n if (item.changeCounter > this.MAX_DEVICE_STATE_CHANGES_PER_HOUR) {\n throw new HourlyDeviceRateLimitExceeded(`Hourly state change limit for ${endpointId} exceeded`);\n }\n\n const changesToday = Array.from(this.usage.values())\n .filter(item => Utils.isToday(Utils.parseISOString(item.timestamp)))\n .reduce((sum, { changeCounter }) => sum + changeCounter, 0);\n\n if (changesToday > this.MAX_CHANGES_PER_DAY) {\n throw new OverallDailyRateLimitExceeded(`Overall daily state change limit exceeded`);\n }\n\n return item;\n }\n}\n"]}
@@ -618,7 +618,6 @@ function asEnum(values) {
618
618
  for (let i = 0; i < values.length; i++) {
619
619
  enumeration[i] = values[i];
620
620
  enumeration[values[i]] = i;
621
- i++;
622
621
  }
623
622
  return enumeration;
624
623
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport AdapterProvider from './AdapterProvider';\nimport ChannelDetector, { type DetectOptions, Types } from '@iobroker/type-detector';\nimport type {\n AlexaV3EndpointID,\n IotExternalDetectorState,\n IotExternalPatternControl,\n SmartName,\n SmartNameObject,\n} from '../types';\nimport type { IotAdapterConfig } from '../../types';\nimport roomTranslator from '../../rooms';\nimport functionTranslator from '../../functions';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction onlyValidCharactersAndLength(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nfunction isRoom(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.rooms.');\n}\n\nfunction isFunctionality(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.functions.');\n}\n\nasync function allEnums(adapter: ioBroker.Adapter): Promise<ioBroker.EnumObject[]> {\n const result = await adapter.getObjectViewAsync('system', 'enum', {});\n return result.rows.map(row => row.value);\n}\n\nfunction parentOf(id: string): string {\n const parts = (id || '').split('.');\n parts.pop();\n return parts.join('.');\n}\n\nasync function allObjects(adapter: ioBroker.Adapter): Promise<Record<string, ioBroker.Object>> {\n const states = await adapter.getObjectViewAsync('system', 'state', {});\n const channels = await adapter.getObjectViewAsync('system', 'channel', {});\n const devices = await adapter.getObjectViewAsync('system', 'device', {});\n const enums = await adapter.getObjectViewAsync('system', 'enum', {});\n\n return (states.rows as { id: string; value: ioBroker.Object }[])\n .concat(channels.rows)\n .concat(devices.rows)\n .concat(enums.rows)\n .reduce(\n (obj, item) => (\n (obj[item.id] = {\n common: item.value?.common,\n type: item.value?.type,\n } as ioBroker.Object),\n obj\n ),\n {} as Record<string, ioBroker.Object>,\n );\n}\n\nconst SMART_TYPES: { [name: string]: string } = {\n LIGHT: 'light',\n SWITCH: 'socket',\n THERMOSTAT: 'thermostat',\n SMARTPLUG: 'socket',\n SMARTLOCK: 'lock',\n CAMERA: 'camera',\n};\n\nfunction getSmartNameFromObj(\n obj: ioBroker.Object | ioBroker.StateCommon,\n instanceId: string,\n noCommon?: boolean,\n): undefined | false | SmartNameObject {\n if (!obj) {\n return undefined;\n }\n let result: undefined | false | SmartNameObject;\n // If it is a common object\n if (!(obj as ioBroker.StateObject).common) {\n result = (obj as ioBroker.StateCommon).smartName as undefined | false | SmartNameObject;\n } else if (!noCommon) {\n result = (obj as ioBroker.StateObject).common.smartName as undefined | false | SmartNameObject;\n } else {\n const custom = (obj as ioBroker.StateObject).common.custom;\n if (!custom) {\n return undefined;\n }\n result = custom[instanceId] ? custom[instanceId].smartName : undefined;\n }\n if (result && typeof result === 'string') {\n if (result === 'ignore') {\n return false;\n }\n return {\n en: result,\n };\n }\n return result;\n}\n\nasync function functionalitiesAndRooms(\n adapter: ioBroker.Adapter,\n): Promise<[ioBroker.EnumObject[], ioBroker.EnumObject[]]> {\n const enumerations = await allEnums(adapter);\n // skip empty enums (with no members, i.e. states, assigned)\n const notEmptyRoomsAndFunctionalities = enumerations\n .filter(item => {\n const smartName = getSmartNameFromObj(\n item,\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n return smartName !== false;\n })\n .filter(item => item?.common?.members?.length);\n // all enums that are of type 'function'\n const functionalities = notEmptyRoomsAndFunctionalities.filter(item => isFunctionality(item));\n // all enums, that are of type 'room'\n const rooms = notEmptyRoomsAndFunctionalities.filter(item => isRoom(item));\n return [functionalities, rooms];\n}\n\nfunction getChannelId(id: string, objects: Record<string, ioBroker.Object>): string | null | undefined {\n if (objects[id] && objects[id].type === 'channel') {\n return id;\n }\n\n if (objects[id] && objects[id].type === 'state') {\n const channelId = parentOf(id);\n if (objects[channelId] && objects[channelId].type === 'channel') {\n return channelId;\n }\n return null;\n }\n}\n\nfunction getDeviceId(id: string, objects: Record<string, ioBroker.Object>): string | null {\n const channelId = getChannelId(id, objects);\n if (channelId) {\n const deviceId = parentOf(channelId);\n if (objects[deviceId] && (objects[deviceId].type === 'device' || objects[deviceId].type === 'channel')) {\n return deviceId;\n }\n }\n return null;\n}\n\nexport function parseISOString(dateTimeAsISOString: string): Date {\n const [year, month, date, hours, minutes, seconds, ms]: string[] = dateTimeAsISOString.split(/\\D+/);\n return new Date(\n Date.UTC(\n parseInt(year, 10),\n parseInt(month, 10) - 1,\n parseInt(date, 10),\n parseInt(hours, 10),\n parseInt(minutes, 10),\n parseInt(seconds, 10),\n parseInt(ms, 10),\n ),\n );\n}\n\nexport function configuredRangeOrDefault(state: IotExternalDetectorState): {\n min: number | boolean;\n max: number | boolean;\n} {\n if (state.common?.type === 'boolean') {\n return { min: false, max: true };\n }\n const configuredMin = state.common?.min;\n const configuredMax = state.common?.max;\n const min =\n configuredMin === undefined || isNaN(configuredMin) ? 0 : parseFloat(configuredMin as unknown as string);\n const max =\n configuredMax === undefined || isNaN(configuredMax) ? 100 : parseFloat(configuredMax as unknown as string);\n\n return { min, max };\n}\n\nexport function currentHour(): Date {\n const datetime = new Date();\n datetime.setMinutes(0);\n datetime.setSeconds(0);\n return datetime;\n}\n\nexport function isToday(dateTime: Date): boolean {\n const today = new Date();\n return (\n dateTime.getDate() === today.getDate() &&\n dateTime.getMonth() === today.getMonth() &&\n dateTime.getFullYear() === today.getFullYear()\n );\n}\n\nexport function isCurrentHour(dateTime: Date): boolean {\n const now = new Date();\n const diffInHours = Math.abs(now.getTime() - dateTime.getTime()) / 3.6e6;\n return diffInHours < 1;\n}\n\nexport function endpointId(id: string): AlexaV3EndpointID {\n // even more restrictive than Alexa documents\n const regex = /^[A-Za-z0-9\\-_]{1,256}$/g;\n id = id.replace(/\\s/g, '_');\n if (!regex.test(id)) {\n const hash = createHash('sha256').update(id).digest('hex');\n id = `${hash}#${id.replace(/[^A-Za-z0-9\\-_]+/g, '-')}`.substring(0, 256);\n }\n\n return id;\n}\n\nexport function onlyValidCharactersAndLengthForFriendlyName(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nexport function stringify(smartName: SmartName, lang: ioBroker.Languages): string {\n if (smartName && typeof smartName === 'object') {\n return smartName[lang] || smartName.en || '';\n }\n if (!smartName) {\n return '';\n }\n return onlyValidCharactersAndLengthForFriendlyName(smartName);\n}\n\nexport function friendlyNameByRoomAndFunctionName(\n control: IotExternalPatternControl,\n lang: ioBroker.Languages,\n): string {\n const config: IotAdapterConfig = AdapterProvider.get().config;\n const funcNameFirst = config.functionFirst;\n let concatenation = config.concatWord;\n let name;\n\n let roomName: ioBroker.StringOrTranslated | undefined = control.room?.common?.name;\n let translateRoomName;\n if (typeof roomName === 'object') {\n // try to translate from EN to any other language\n translateRoomName = lang && lang !== 'en' && !roomName[lang];\n roomName = roomName[lang] || roomName.en || '';\n } else {\n // always try to translate room names provided as a non-object type\n translateRoomName = true;\n }\n\n if (translateRoomName && roomName) {\n roomName = roomTranslator(lang, roomName);\n }\n\n let funcName = control.functionality?.common?.name;\n let translateFunctionalityName;\n if (typeof funcName === 'object') {\n translateFunctionalityName = lang && lang !== 'en' && !funcName[lang];\n funcName = funcName[lang] || funcName.en;\n } else {\n translateFunctionalityName = true;\n }\n if (translateFunctionalityName && funcName) {\n funcName = functionTranslator(lang, funcName);\n }\n\n concatenation = concatenation ? ` ${concatenation} ` : ' ';\n\n name = `${funcNameFirst ? funcName : roomName}${concatenation}${funcNameFirst ? roomName : funcName}`;\n name = name.trim();\n\n return onlyValidCharactersAndLengthForFriendlyName(name);\n}\n\n/**\n * Checks whether the provided value is a valid smart name.\n *\n * @param smartName The value to check\n * @param lang Configured language\n * @returns True if a valid smart name, false - otherwise.\n */\nexport function isValidSmartName(smartName: SmartName | undefined, lang: ioBroker.Languages): boolean {\n let name = smartName;\n if (smartName === false || smartName === 'ignore') {\n return false;\n }\n if (smartName && typeof smartName === 'object') {\n name = smartName[lang] || smartName.en || smartName.de;\n }\n return ![null, undefined, 'ignore', false].includes(name as string);\n}\n\n/**\n * Checks a value for validity or returns a default.\n *\n * @param value The value being checked\n * @param defaultValue A default value if the passed value is not valid\n * @returns The passed value if valid otherwise the default value.\n */\nexport function defaultIfNullOrEmpty<T>(value: T | undefined, defaultValue: T): T {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n value === ''\n ) {\n return defaultValue;\n }\n\n return value;\n}\n\n/**\n * Inspects all objects (states, channels and devices) and tries to identify so-called 'controls'\n *\n * To identify the controls, the ioBroker type detector library is used (https://github.com/ioBroker/ioBroker.type-detector).\n *\n * @param adapter The iot adapter instance\n * @param lang language\n * @returns An array containing the detected controls\n */\nexport async function controls(\n adapter: ioBroker.Adapter,\n lang: ioBroker.Languages,\n): Promise<IotExternalPatternControl[]> {\n // here we collect ids to inspect\n const list: string[] = [];\n\n // fetch all objects (states, channels and devices in terms of iobroker)\n const devicesObject = await allObjects(adapter);\n // fetch all defined rooms and functions (enumerations)\n const [functionalities, rooms] = await functionalitiesAndRooms(adapter);\n\n // every member of a function enumeration is added to the list of ids to inspect\n functionalities.forEach(functionEnumItem => {\n functionEnumItem.common.members?.forEach(id => {\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n list.push(id);\n }\n });\n });\n\n // a member of a room enumeration is only added if neither its parent (channel) nor its grandparent (device) is in\n rooms.forEach(roomEnumItem => {\n roomEnumItem.common.members?.forEach(id => {\n if (!devicesObject[id]) {\n return;\n }\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n if (!list.includes(channelId)) {\n const deviceId = getDeviceId(id, devicesObject);\n if (deviceId) {\n if (!list.includes(deviceId)) {\n list.push(id);\n }\n } else {\n list.push(id);\n }\n }\n } else {\n list.push(id);\n }\n }\n });\n });\n\n // all ids, i.e. ids of all iobroker states/channels/devices\n const keys = Object.keys(devicesObject).sort();\n\n const idsWithSmartName: string[] = [];\n // if a state has got a smart name directly assigned and neither itself nor its channel is in the list, add its id to the inspection list\n // and process it first\n keys.forEach(id => {\n const smartName =\n devicesObject[id] &&\n getSmartNameFromObj(devicesObject[id], adapter.namespace, (adapter.config as IotAdapterConfig).noCommon);\n\n const objType = devicesObject[id].type;\n\n if (\n isValidSmartName(smartName, lang) &&\n devicesObject[id].common &&\n (objType === 'state' || objType === 'channel' || objType === 'device')\n ) {\n idsWithSmartName.push(id);\n }\n });\n\n // collect first all smart names and remove them from the auto-groups\n const detectedControls: IotExternalPatternControl[] = [];\n const detector = new ChannelDetector();\n\n const patterns = ChannelDetector.getPatterns();\n // process states with defined smartName\n for (let s = 0; s < idsWithSmartName.length; s++) {\n const id = idsWithSmartName[s];\n const common = devicesObject[id].common;\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n ) as SmartNameObject;\n\n // try to convert the state to typeDetector format\n // \"smartName\": {\n // \"de\": \"Rote Lampe\",\n // \"smartType\": \"LIGHT\", // optional\n // \"byON\": 80 // optional\n // }\n if (!smartName.smartType) {\n // by default,\n // all booleans are sockets\n // all numbers are dimmer\n // string is not possible to control\n if (common.type === 'boolean' || common.type === 'mixed') {\n // we will write boolean\n smartName.smartType = 'socket';\n } else if (common.type === 'number') {\n smartName.smartType = 'dimmer';\n } else {\n smartName.smartType = 'socket';\n }\n }\n // convert alexa2 smartType to alexa 3\n if (SMART_TYPES[smartName.smartType]) {\n smartName.smartType = SMART_TYPES[smartName.smartType];\n }\n // try to simulate typeDetector format\n if (patterns[smartName.smartType]) {\n const control: IotExternalPatternControl = JSON.parse(JSON.stringify(patterns[smartName.smartType]));\n // find first required\n const state = control.states.find(state => state.required);\n if (state) {\n state.id = id;\n // process control\n // remove all unassigned control register\n control.states = control.states.filter(s => s.id);\n\n // take all smartNames if any\n control.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n devicesObject[id].common.smartName = smartName;\n\n control.object = {\n id,\n type: devicesObject[id].type,\n common: devicesObject[id].common,\n autoDetected: false,\n toggle: smartName?.toggle,\n };\n\n // remove id from the groups\n let pos = list.indexOf(id);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n pos = list.indexOf(channelId);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n }\n\n const name = smartName[lang] || smartName.en || smartName.de;\n control.groupNames = name?.split(',').map(n => n.trim()) || [];\n\n adapter.log.debug(`[ALEXA3] added ${id} with smartName as \"${smartName.smartType}\"`);\n detectedControls.push(control);\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n }\n\n // initialize iobroker type detector\n const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\n const options: DetectOptions = {\n objects: devicesObject,\n _keysOptional: keys,\n _usedIdsOptional: usedIds,\n ignoreIndicators,\n excludedTypes,\n id: '', // this will be set for each id in the list\n };\n\n // go other the list of IDs to inspect and collect the detected controls\n list.forEach(id => {\n options.id = id;\n const controls = detector.detect(options);\n controls?.forEach(control => {\n const iotControl: IotExternalPatternControl = control as IotExternalPatternControl;\n\n // if any detected state has an ID, we can use this control\n if (iotControl.states.find(state => state.id)) {\n // console.log(`In ${id} was detected \"${control.type}\" with the following states:`);\n\n // remove all unassigned control register\n iotControl.states = iotControl.states.filter(s => s.id);\n\n // take all smartNames if any\n iotControl.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n // find out the room the found control is in\n const room = rooms.find(room => room?.common?.members?.includes(id));\n\n // find out the functionality the found control assigned to\n const functionality = functionalities.find(functionality =>\n functionality?.common?.members?.includes(id),\n );\n\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n iotControl.object = {\n id,\n type: devicesObject[id].type,\n common: {\n min: devicesObject[id].common?.min,\n max: devicesObject[id].common?.max,\n type: devicesObject[id].common?.type,\n states: devicesObject[id].common?.states,\n role: devicesObject[id].common?.role,\n name: devicesObject[id].common?.name,\n smartName,\n },\n autoDetected: true,\n toggle: smartName && typeof smartName === 'object' ? smartName.toggle : undefined,\n };\n\n iotControl.room = room\n ? {\n id: room._id,\n common: room.common,\n }\n : undefined;\n\n iotControl.functionality = functionality\n ? {\n id: functionality._id,\n common: functionality.common,\n }\n : undefined;\n\n detectedControls.push(iotControl);\n }\n });\n });\n\n return detectedControls;\n}\n\n/**\n * Normalizes any provided value with observed min and max to the range 0..100\n *\n * @param value value to be normalized\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Normalized value in the range 0..100 or undefined on invalid input\n */\nexport function normalize_0_100(value: number, min: number, max: number): number | undefined {\n return min >= max || value < min || value > max ? undefined : Math.round(((value - min) / (max - min)) * 100);\n}\n\n/**\n * Denormalizes any provided value from range 0..100 to the min..max range\n *\n * @param normalized normalized value\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_100(normalized: number, min: number, max: number): number | undefined {\n return min >= max || normalized < 0 || normalized > 100\n ? undefined\n : Math.round((normalized / 100) * (max - min) + min);\n}\n\n/**\n * Returns distinct objects in a list based on values of the provided property name\n *\n * @param list - list of objects\n * @param propertyName - name of the property to build distinct values on\n * @param combineValues - if the values should be combined and not just overwritten\n * @returns List containing at most one element per property value\n */\nexport function distinctByPropertyName<T extends Record<string, any>>(\n list: T[],\n propertyName: keyof T,\n combineValues?: boolean,\n): T[] {\n const map = new Map<T[keyof T], T>();\n for (const item of list) {\n const key = item[propertyName];\n if (combineValues && map.has(key)) {\n const existing = map.get(key)!;\n if (existing.value === 'ON' || existing.value === 'OFF') {\n if ((item as any).value === 'ON') {\n (existing as any).value = (item as any).value;\n }\n } else if (isFinite((existing as any).value) && isFinite((item as any).value)) {\n (existing as any).value = Math.max((existing as any).value, (item as any).value);\n }\n continue;\n }\n map.set(key, item);\n }\n return Array.from(map.values());\n}\n\nexport function className(thisToString: string): string {\n const classNameRegEx = /\\S+\\s+([a-zA-Z_$][0-9a-zA-Z_$]*)/;\n const result = classNameRegEx.exec(thisToString);\n return result?.[1] || 'UnknownClass';\n}\n\n/**\n * Updates the provided value if required to fit it into the range 0..100\n */\nexport function ensureValueInRange_0_100(value: number): number {\n return ensureValueInRange(value, 0, 100);\n}\n\n/**\n * Updates the provided value if required to fit it into the range min..max\n */\nexport function ensureValueInRange(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function firstLower(input: string): string {\n if (!input || typeof input !== 'string') {\n return input;\n }\n return input[0].toLowerCase() + input.slice(1);\n}\n\nexport function closestFromList(target: number, list: number[]): number {\n return list.reduce((prev, curr) => (Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev));\n}\n\nexport function asEnum(values: string[]): Record<string, number | string> {\n const enumeration: Record<string, number | string> = {};\n for (let i = 0; i < values.length; i++) {\n enumeration[i] = values[i];\n enumeration[values[i]] = i;\n }\n return enumeration;\n}\n"]}
@@ -37,13 +37,13 @@ class AlexaSH3 {
37
37
  const control = endpoint.controls[c];
38
38
  let supported = [];
39
39
  let enforced = [];
40
- control._supported.forEach(item => item._properties.forEach(prop => !supported.includes(prop.constructor.name) && supported.push(prop.constructor.name)));
41
- control._enforced.forEach(item => item._properties.forEach(prop => !enforced.includes(prop.constructor.name) && enforced.push(prop.constructor.name)));
40
+ control.supported.forEach(item => item.properties.forEach(prop => !supported.includes(prop.constructor.name) && supported.push(prop.constructor.name)));
41
+ control.enforced.forEach(item => item.properties.forEach(prop => !enforced.includes(prop.constructor.name) && enforced.push(prop.constructor.name)));
42
42
  supported = supported.map(prop => prop.replace(/^[A-Z]/, c => c.toLowerCase())).sort();
43
43
  enforced = enforced.map(prop => prop.replace(/^[A-Z]/, c => c.toLowerCase())).sort();
44
44
  controls.push({
45
45
  type: control.log._component,
46
- states: control._states,
46
+ states: control.states,
47
47
  // always sort by id, so the GUI can address the group by the first control
48
48
  supported,
49
49
  // always sort by id, so the GUI can address the group by the first control
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alexaSmartHomeV3.js","sourceRoot":"","sources":["../../src/lib/alexaSmartHomeV3.ts"],"names":[],"mappings":"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","sourcesContent":["import type { device as DeviceModule } from 'aws-iot-device-sdk';\n\nimport DeviceManager from './AlexaSmartHomeV3/DeviceManager';\nimport AdapterProvider from './AlexaSmartHomeV3/Helpers/AdapterProvider';\nimport IotProxy from './AlexaSmartHomeV3/Helpers/IotProxy';\nimport RateLimiter from './AlexaSmartHomeV3/Helpers/RateLimiter';\nimport type { AlexaSH3ControlDescription, AlexaSH3DeviceDescription, AlexaV3Request } from './AlexaSmartHomeV3/types';\nimport type AlexaResponse from './AlexaSmartHomeV3/Alexa/AlexaResponse';\nimport type { IotAdapter } from '../main';\n\nexport default class AlexaSH3 {\n private readonly deviceManager: DeviceManager;\n\n constructor(options: { adapter: IotAdapter; iotDevice: DeviceModule; iotClientId: string }) {\n this.deviceManager = new DeviceManager();\n AdapterProvider.init(options.adapter);\n IotProxy.init(options.iotDevice, options.iotClientId, options.adapter.config.login);\n RateLimiter.init().catch((err: Error) => options.adapter.log.error(err.message));\n // Subscribe on enum changes\n options.adapter.subscribeForeignObjects('enum.functions.*');\n options.adapter.subscribeForeignObjects('enum.rooms.*');\n }\n\n setLanguage(lang: ioBroker.Languages): void {\n this.deviceManager.language = lang;\n }\n\n async process(event: AlexaV3Request): Promise<AlexaResponse> {\n return await this.deviceManager.handleAlexaEvent(event);\n }\n\n async updateDevices(): Promise<void> {\n await this.deviceManager.collectEndpoints();\n }\n\n async getDevices(): Promise<AlexaSH3DeviceDescription[]> {\n const endpoints = this.deviceManager ? this.deviceManager.endpoints : [];\n\n const result: AlexaSH3DeviceDescription[] = [];\n\n for (let p = 0; p < endpoints.length; p++) {\n const endpoint = endpoints[p];\n const controls: AlexaSH3ControlDescription[] = [];\n\n for (let c = 0; c < endpoint.controls.length; c++) {\n const control = endpoint.controls[c];\n let supported: string[] = [];\n let enforced: string[] = [];\n control.supported.forEach(item =>\n item.properties.forEach(\n prop => !supported.includes(prop.constructor.name) && supported.push(prop.constructor.name),\n ),\n );\n control.enforced.forEach(item =>\n item.properties.forEach(\n prop => !enforced.includes(prop.constructor.name) && enforced.push(prop.constructor.name),\n ),\n );\n\n supported = supported.map(prop => prop.replace(/^[A-Z]/, c => c.toLowerCase())).sort();\n\n enforced = enforced.map(prop => prop.replace(/^[A-Z]/, c => c.toLowerCase())).sort();\n\n controls.push({\n type: control.log._component,\n states: control.states,\n // always sort by id, so the GUI can address the group by the first control\n supported,\n // always sort by id, so the GUI can address the group by the first control\n enforced,\n state: await control.reportState(),\n });\n }\n // always sort by id, so the GUI can address the group by the first control\n controls.sort((c1, c2) => (c1.type > c2.type ? -1 : c1.type < c2.type ? 1 : 0));\n\n const device: AlexaSH3DeviceDescription = {\n controls,\n friendlyName: endpoint.friendlyName,\n autoDetected: endpoint.autoDetected,\n funcName: endpoint.funcName,\n roomName: endpoint.roomName,\n id: endpoint.id,\n type: endpoint.log._component,\n state: await endpoint.reportState(),\n };\n result.push(device);\n }\n\n return result;\n }\n\n async handleStateUpdate(id: string, state: ioBroker.State | null | undefined): Promise<void> {\n await this.deviceManager.handleStateUpdate(id, state);\n }\n\n async handleObjectChange(id: string, obj: ioBroker.Object | null | undefined): Promise<void> {\n // Handle enum changes\n if (obj) {\n // An object was changed\n // console.log(`object ${id} changed: ${JSON.stringify(obj)}`);\n } else {\n // An object was deleted\n // console.log(`object ${id} deleted`);\n }\n\n // either an enum was deleted or changed => re-collect devices\n\n // intentionally not waiting for the promise to resolve\n await this.deviceManager.collectEndpoints();\n }\n\n pauseEvents(): void {\n this.deviceManager.pauseEvents();\n }\n\n async destroy(): Promise<void> {\n await this.deviceManager.destroy();\n await AdapterProvider.get().unsubscribeForeignObjectsAsync('enum.functions.*');\n await AdapterProvider.get().unsubscribeForeignObjectsAsync('enum.rooms.*');\n }\n}\n"]}