iobroker.iot 3.6.0 → 4.0.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 (254) hide show
  1. package/README.md +8 -4
  2. package/admin/assets/index-5zouxn2w.js +680 -0
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{index-BRdNnGcA.js → index-DwYdaT5M.js} +80 -81
  5. package/admin/rules/customRuleBlocks.js +2 -2
  6. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/AlexaResponse.js +101 -95
  7. package/build-backend/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -0
  8. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +22 -36
  9. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -0
  10. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +19 -0
  11. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js.map +1 -0
  12. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +14 -0
  13. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js.map +1 -0
  14. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +19 -0
  15. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js.map +1 -0
  16. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +16 -0
  17. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js.map +1 -0
  18. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +14 -0
  19. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js.map +1 -0
  20. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js +27 -28
  21. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ModeController.js.map +1 -0
  22. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +14 -0
  23. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js.map +1 -0
  24. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +14 -0
  25. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js.map +1 -0
  26. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +19 -0
  27. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js.map +1 -0
  28. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +25 -0
  29. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js.map +1 -0
  30. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +14 -0
  31. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js.map +1 -0
  32. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +37 -0
  33. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js.map +1 -0
  34. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +32 -0
  35. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -0
  36. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +29 -0
  37. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js.map +1 -0
  38. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js +34 -27
  39. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ChangeReport.js.map +1 -0
  40. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +39 -0
  41. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +1 -0
  42. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Directives/ReportState.js +19 -22
  43. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/ReportState.js.map +1 -0
  44. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +14 -0
  45. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Directives/index.js.map +1 -0
  46. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +36 -0
  47. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js.map +1 -0
  48. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +57 -0
  49. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js.map +1 -0
  50. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +57 -0
  51. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js.map +1 -0
  52. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +12 -0
  53. package/build-backend/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js.map +1 -0
  54. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +16 -0
  55. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js.map +1 -0
  56. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +127 -0
  57. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -0
  58. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +18 -0
  59. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js.map +1 -0
  60. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +38 -0
  61. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -0
  62. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js +20 -29
  63. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ColorTemperatureInKelvin.js.map +1 -0
  64. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +23 -0
  65. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js.map +1 -0
  66. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/LockState.js +9 -12
  67. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/LockState.js.map +1 -0
  68. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +34 -0
  69. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js.map +1 -0
  70. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +19 -0
  71. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js.map +1 -0
  72. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +18 -0
  73. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js.map +1 -0
  74. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Alexa/Properties/PowerState.js +9 -9
  75. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.js.map +1 -0
  76. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +31 -0
  77. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +1 -0
  78. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +22 -0
  79. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +1 -0
  80. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +49 -0
  81. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js.map +1 -0
  82. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +21 -0
  83. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js.map +1 -0
  84. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +38 -0
  85. package/build-backend/lib/AlexaSmartHomeV3/Alexa/Properties/index.js.map +1 -0
  86. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +20 -0
  87. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js.map +1 -0
  88. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +26 -0
  89. package/build-backend/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js.map +1 -0
  90. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js +148 -0
  91. package/build-backend/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -0
  92. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js +13 -0
  93. package/build-backend/lib/AlexaSmartHomeV3/Controls/Blind.js.map +1 -0
  94. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +17 -0
  95. package/build-backend/lib/AlexaSmartHomeV3/Controls/ContactSensor.js.map +1 -0
  96. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Controls/Control.js +73 -104
  97. package/build-backend/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -0
  98. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js +182 -0
  99. package/build-backend/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -0
  100. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js +127 -0
  101. package/build-backend/lib/AlexaSmartHomeV3/Controls/Dimmer.js.map +1 -0
  102. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js +10 -0
  103. package/build-backend/lib/AlexaSmartHomeV3/Controls/Door.js.map +1 -0
  104. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js +38 -0
  105. package/build-backend/lib/AlexaSmartHomeV3/Controls/Gate.js.map +1 -0
  106. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js +208 -0
  107. package/build-backend/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -0
  108. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Controls/Light.js +15 -22
  109. package/build-backend/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -0
  110. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js +35 -0
  111. package/build-backend/lib/AlexaSmartHomeV3/Controls/Lock.js.map +1 -0
  112. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js +17 -0
  113. package/build-backend/lib/AlexaSmartHomeV3/Controls/Motion.js.map +1 -0
  114. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +26 -0
  115. package/build-backend/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js.map +1 -0
  116. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js +10 -0
  117. package/build-backend/lib/AlexaSmartHomeV3/Controls/Slider.js.map +1 -0
  118. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js +21 -0
  119. package/build-backend/lib/AlexaSmartHomeV3/Controls/Socket.js.map +1 -0
  120. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js +21 -0
  121. package/build-backend/lib/AlexaSmartHomeV3/Controls/Temperature.js.map +1 -0
  122. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js +85 -0
  123. package/build-backend/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -0
  124. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +27 -0
  125. package/build-backend/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -0
  126. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js +116 -0
  127. package/build-backend/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -0
  128. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +10 -0
  129. package/build-backend/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js.map +1 -0
  130. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js +10 -0
  131. package/build-backend/lib/AlexaSmartHomeV3/Controls/Window.js.map +1 -0
  132. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js +121 -0
  133. package/build-backend/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -0
  134. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Device.js +29 -30
  135. package/build-backend/lib/AlexaSmartHomeV3/Device.js.map +1 -0
  136. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js +392 -0
  137. package/build-backend/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -0
  138. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +10 -0
  139. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js.map +1 -0
  140. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +10 -0
  141. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js.map +1 -0
  142. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +10 -0
  143. package/build-backend/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js.map +1 -0
  144. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Helpers/AdapterProvider.js +12 -21
  145. package/build-backend/lib/AlexaSmartHomeV3/Helpers/AdapterProvider.js.map +1 -0
  146. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +53 -0
  147. package/build-backend/lib/AlexaSmartHomeV3/Helpers/FileHelper.js.map +1 -0
  148. package/{lib → build-backend/lib}/AlexaSmartHomeV3/Helpers/IotProxy.js +9 -26
  149. package/build-backend/lib/AlexaSmartHomeV3/Helpers/IotProxy.js.map +1 -0
  150. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js +93 -0
  151. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Logger.js.map +1 -0
  152. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +112 -0
  153. package/build-backend/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js.map +1 -0
  154. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js +625 -0
  155. package/build-backend/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -0
  156. package/build-backend/lib/Utils.js +96 -0
  157. package/build-backend/lib/Utils.js.map +1 -0
  158. package/build-backend/lib/adminCommonSocket.js +715 -0
  159. package/build-backend/lib/adminCommonSocket.js.map +1 -0
  160. package/build-backend/lib/alexaCustom.js +542 -0
  161. package/build-backend/lib/alexaCustom.js.map +1 -0
  162. package/{lib → build-backend/lib}/alexaSmartHomeV2.js +4 -8
  163. package/{lib → build-backend/lib}/alexaSmartHomeV3.js +25 -45
  164. package/build-backend/lib/alexaSmartHomeV3.js.map +1 -0
  165. package/{lib → build-backend/lib}/alisa.js +41 -44
  166. package/{lib → build-backend/lib}/devices.js +11 -8
  167. package/build-backend/lib/devices.js.map +1 -0
  168. package/{lib → build-backend/lib}/functions.js +11 -8
  169. package/build-backend/lib/functions.js.map +1 -0
  170. package/{lib → build-backend/lib}/googleHome.js +25 -26
  171. package/{lib → build-backend/lib}/notifications.js +15 -22
  172. package/build-backend/lib/notifications.js.map +1 -0
  173. package/{lib → build-backend/lib}/remote.js +615 -636
  174. package/build-backend/lib/remote.js.map +1 -0
  175. package/{lib → build-backend/lib}/rooms.js +11 -8
  176. package/build-backend/lib/rooms.js.map +1 -0
  177. package/{lib → build-backend/lib}/texts.js +6 -4
  178. package/build-backend/lib/texts.js.map +1 -0
  179. package/build-backend/lib/translate.js +21 -0
  180. package/build-backend/lib/translate.js.map +1 -0
  181. package/{lib → build-backend/lib}/visuApp.js +45 -65
  182. package/build-backend/lib/visuApp.js.map +1 -0
  183. package/build-backend/main.js +1361 -0
  184. package/build-backend/main.js.map +1 -0
  185. package/io-package.json +14 -14
  186. package/package.json +18 -15
  187. package/admin/assets/index-DCbOB3g_.js +0 -681
  188. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/BrightnessController.js +0 -15
  189. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorController.js +0 -10
  190. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ColorTemperatureController.js +0 -15
  191. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ContactSensor.js +0 -10
  192. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/LockController.js +0 -10
  193. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/MotionSensor.js +0 -10
  194. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/PercentageController.js +0 -10
  195. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/PowerController.js +0 -15
  196. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/Speaker.js +0 -20
  197. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/TemperatureSensor.js +0 -10
  198. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/ThermostatController.js +0 -34
  199. package/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +0 -14
  200. package/lib/AlexaSmartHomeV3/Alexa/Directives/Base.js +0 -27
  201. package/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +0 -39
  202. package/lib/AlexaSmartHomeV3/Alexa/Directives/index.js +0 -13
  203. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Base.js +0 -38
  204. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Closed.js +0 -55
  205. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/Open.js +0 -56
  206. package/lib/AlexaSmartHomeV3/Alexa/ModeValues/index.js +0 -14
  207. package/lib/AlexaSmartHomeV3/Alexa/Properties/AdjustableProperty.js +0 -11
  208. package/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js +0 -108
  209. package/lib/AlexaSmartHomeV3/Alexa/Properties/Brightness.js +0 -14
  210. package/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +0 -40
  211. package/lib/AlexaSmartHomeV3/Alexa/Properties/DetectionState.js +0 -22
  212. package/lib/AlexaSmartHomeV3/Alexa/Properties/Mode.js +0 -32
  213. package/lib/AlexaSmartHomeV3/Alexa/Properties/Muted.js +0 -17
  214. package/lib/AlexaSmartHomeV3/Alexa/Properties/Percentage.js +0 -14
  215. package/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +0 -28
  216. package/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +0 -20
  217. package/lib/AlexaSmartHomeV3/Alexa/Properties/ThermostatMode.js +0 -52
  218. package/lib/AlexaSmartHomeV3/Alexa/Properties/Volume.js +0 -19
  219. package/lib/AlexaSmartHomeV3/Alexa/Properties/index.js +0 -14
  220. package/lib/AlexaSmartHomeV3/Controls/AdjustableControl.js +0 -22
  221. package/lib/AlexaSmartHomeV3/Controls/AdjustablePercentageControl.js +0 -28
  222. package/lib/AlexaSmartHomeV3/Controls/AirCondition.js +0 -144
  223. package/lib/AlexaSmartHomeV3/Controls/Blind.js +0 -12
  224. package/lib/AlexaSmartHomeV3/Controls/ContactSensor.js +0 -17
  225. package/lib/AlexaSmartHomeV3/Controls/Ct.js +0 -172
  226. package/lib/AlexaSmartHomeV3/Controls/Dimmer.js +0 -124
  227. package/lib/AlexaSmartHomeV3/Controls/Door.js +0 -9
  228. package/lib/AlexaSmartHomeV3/Controls/Gate.js +0 -42
  229. package/lib/AlexaSmartHomeV3/Controls/Hue.js +0 -207
  230. package/lib/AlexaSmartHomeV3/Controls/Lock.js +0 -36
  231. package/lib/AlexaSmartHomeV3/Controls/Motion.js +0 -17
  232. package/lib/AlexaSmartHomeV3/Controls/ReadOnlyDetector.js +0 -25
  233. package/lib/AlexaSmartHomeV3/Controls/Slider.js +0 -10
  234. package/lib/AlexaSmartHomeV3/Controls/Socket.js +0 -21
  235. package/lib/AlexaSmartHomeV3/Controls/Temperature.js +0 -22
  236. package/lib/AlexaSmartHomeV3/Controls/Thermostat.js +0 -86
  237. package/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js +0 -28
  238. package/lib/AlexaSmartHomeV3/Controls/Volume.js +0 -109
  239. package/lib/AlexaSmartHomeV3/Controls/VolumeGroup.js +0 -9
  240. package/lib/AlexaSmartHomeV3/Controls/Window.js +0 -9
  241. package/lib/AlexaSmartHomeV3/Controls/index.js +0 -14
  242. package/lib/AlexaSmartHomeV3/DeviceManager.js +0 -415
  243. package/lib/AlexaSmartHomeV3/Exceptions/AlexaV3Exception.js +0 -8
  244. package/lib/AlexaSmartHomeV3/Exceptions/HourlyDeviceRateLimitExceeded.js +0 -5
  245. package/lib/AlexaSmartHomeV3/Exceptions/OverallDailyRateLimitExceeded.js +0 -5
  246. package/lib/AlexaSmartHomeV3/Helpers/FileHelper.js +0 -70
  247. package/lib/AlexaSmartHomeV3/Helpers/Logger.js +0 -95
  248. package/lib/AlexaSmartHomeV3/Helpers/RateLimiter.js +0 -82
  249. package/lib/AlexaSmartHomeV3/Helpers/Utils.js +0 -583
  250. package/lib/Utils.js +0 -608
  251. package/lib/adminCommonSocket.js +0 -781
  252. package/lib/alexaCustom.js +0 -622
  253. package/lib/translate.js +0 -19
  254. package/main.js +0 -1454
@@ -1,622 +0,0 @@
1
- 'use strict';
2
- const textsT = require('./texts');
3
-
4
- // Stop phrases all in lower case!
5
- // Required by v2 custom skill to detect when the user wants to cancel the conversation
6
- const stopPhrases = {
7
- de: ['es reicht', 'ich bin fertig', 'ende', 'abbrechen', 'stopp', 'stop', 'beenden', 'danke', 'danke schön'],
8
- en: ['enough', 'i am done', "i'm done", 'stop', 'quit', 'bye', 'thanks', 'thank you'],
9
- ru: [
10
- // TODO
11
- ],
12
- };
13
-
14
- function AlexaCustom(adapter) {
15
- let lang = 'de';
16
- const openSessions = {};
17
-
18
- const knownDevices = {};
19
- const knownUsers = {};
20
- let lastSkillRequestWasV2 = false;
21
-
22
- if (adapter.config.customKnownAlexaDevices && Array.isArray(adapter.config.customKnownAlexaDevices)) {
23
- adapter.config.customKnownAlexaDevices.forEach(device => {
24
- knownDevices[device.id] = device;
25
- // {
26
- // "id": "amzn1.ask.device.XXXXXXXXX", // just show last X chars in UI, should be unique enough
27
- // "room": "enum.room.xyz",
28
- // "lastSeen": 1234567899,
29
- // }
30
- });
31
- }
32
- if (adapter.config.customKnownAlexaUsers && Array.isArray(adapter.config.customKnownAlexaUsers)) {
33
- adapter.config.customKnownAlexaUsers.forEach(device => {
34
- knownUsers[device.id] = device;
35
- // {
36
- // "id": "amzn1.ask.account.XXXXXXXXX", // just show last X chars in UI, should be unique enough
37
- // "name": "Holger",
38
- // "lastSeen": 1234567899,
39
- // }
40
- });
41
- }
42
-
43
- this.getKnownDevices = () => {
44
- return Object.values(knownDevices);
45
- };
46
-
47
- this.getKnownUsers = () => {
48
- return Object.values(knownUsers);
49
- };
50
-
51
- function writeResponse(channelId, stateId, command, value) {
52
- //adapter.log.warn('[CUSTOM] Unknown applianceId: ' + deviceId);
53
- }
54
-
55
- function getResponseV1(text, repromptText, shouldEndSession) {
56
- if (typeof repromptText === 'boolean') {
57
- shouldEndSession = repromptText;
58
- repromptText = null;
59
- }
60
- let speechPlainText = text;
61
- let speechType = 'PlainText';
62
- if (text.startsWith('<speak>')) {
63
- speechPlainText = text.replace(/<[^>]*>/g, '').trim();
64
- speechType = 'SSML';
65
- }
66
-
67
- let repromptType = 'PlainText';
68
- if (repromptText && repromptText.startsWith('<speak>')) {
69
- repromptType = 'SSML';
70
- }
71
-
72
- let response = {
73
- version: '1.0',
74
- sessionAttributes: {},
75
- response: {
76
- outputSpeech: {
77
- type: speechType,
78
- text: text,
79
- },
80
- card: {
81
- content: speechPlainText,
82
- title: textsT(lang, 'Answer from ioBroker') || 'ioBroker',
83
- type: 'Simple',
84
- },
85
- shouldEndSession: shouldEndSession || false,
86
- },
87
- };
88
- if (repromptText) {
89
- response.response.reprompt = {
90
- outputSpeech: {
91
- type: repromptType,
92
- ssml: repromptText,
93
- },
94
- };
95
- }
96
- return response;
97
- }
98
-
99
- function getResponseV2(text, repromptText, shouldEndSession) {
100
- if (typeof repromptText === 'boolean') {
101
- shouldEndSession = repromptText;
102
- repromptText = null;
103
- }
104
- const response = getResponseV1(text, repromptText, shouldEndSession);
105
-
106
- if (!shouldEndSession) {
107
- // We redirect the user to the Dialog Intent to capture the full traffic
108
- response.response.directives = [
109
- {
110
- type: 'Dialog.ElicitSlot',
111
- updatedIntent: {
112
- name: 'queryIntent',
113
- confirmationStatus: 'NONE',
114
- slots: {
115
- query: {
116
- name: 'query',
117
- value: '',
118
- confirmationStatus: 'NONE',
119
- },
120
- },
121
- },
122
- slotToElicit: 'query',
123
- },
124
- ];
125
- }
126
- return response;
127
- }
128
-
129
- this.setLanguage = _lang => (lang = _lang || 'de');
130
-
131
- this.setResponse = (resp, shouldEndSession) => {
132
- if (resp.startsWith('{') && resp.endsWith('}')) {
133
- try {
134
- resp = JSON.parse(resp);
135
- } catch (err) {
136
- // ignore
137
- }
138
- }
139
- let session;
140
- let sessionId;
141
- if (resp !== null && typeof resp === 'object') {
142
- if (resp.sessionId) {
143
- sessionId = resp.sessionId;
144
- session = openSessions[sessionId];
145
- }
146
- }
147
- // We got a state response without session reference
148
- if (!session) {
149
- const sessions = Object.keys(openSessions).filter(
150
- sessionId => !!(openSessions[sessionId].responseTimer && openSessions[sessionId].callback),
151
- );
152
- if (sessions.length > 0) {
153
- sessionId = sessions[0];
154
- session = openSessions[sessionId];
155
- if (sessions.length > 1) {
156
- adapter.log.warn(
157
- '[CUSTOM] More than one session with expected responses ... consider the first one as the relevant one',
158
- );
159
- }
160
- }
161
- }
162
-
163
- let obj = {
164
- responseText: '',
165
- shouldEndSession: shouldEndSession === undefined ? !sessionId : shouldEndSession,
166
- };
167
- if (resp !== null && typeof resp === 'object') {
168
- if (resp.responseText) {
169
- obj.responseText = resp.responseText;
170
- }
171
- if (resp.shouldEndSession !== undefined) obj.shouldEndSession = resp.shouldEndSession;
172
- } else {
173
- obj.responseText = resp;
174
- }
175
-
176
- if (session && session.responseTimer && session.callback) {
177
- this.processAfter(session.request, obj.responseText, obj.shouldEndSession, session.callback);
178
- }
179
- };
180
-
181
- this.processAfter = (request, text, shouldEndSession, callback) => {
182
- if (typeof shouldEndSession === 'function') {
183
- callback = shouldEndSession;
184
- shouldEndSession = undefined;
185
- }
186
-
187
- adapter.setState('smart.lastResponse', text, true);
188
-
189
- const sessionId = request.session && request.session.sessionId ? request.session.sessionId : '';
190
-
191
- if (openSessions[sessionId].responseTimer) {
192
- clearTimeout(openSessions[sessionId].responseTimer);
193
- openSessions[sessionId].responseTimer = null;
194
- }
195
-
196
- openSessions[sessionId].callback = null;
197
- openSessions[sessionId].request = null;
198
-
199
- const isV2Skill =
200
- openSessions[sessionId].isV2Skill !== undefined
201
- ? openSessions[sessionId].isV2Skill
202
- : !!request.customSkillV2;
203
- const getResponse = isV2Skill ? getResponseV2 : getResponseV1;
204
-
205
- callback(getResponse(text, shouldEndSession));
206
- };
207
-
208
- this.touchSession = (sessionId, isV2Skill) => {
209
- if (openSessions[sessionId] && openSessions[sessionId].expiryTimer) {
210
- clearTimeout(openSessions[sessionId].expiryTimer);
211
- openSessions[sessionId].expiryTimer = null;
212
- }
213
- openSessions[sessionId] = openSessions[sessionId] || {
214
- expiryTimer: null,
215
- responseTimer: null,
216
- request: null,
217
- callback: null,
218
- isV2Skill,
219
- };
220
- openSessions[sessionId].expiryTimer = setTimeout(() => {
221
- delete openSessions[sessionId];
222
- }, 60000); // latest after 10 mins we declare a session as closed
223
- };
224
-
225
- this.deleteSession = sessionId => {
226
- if (openSessions[sessionId] && openSessions[sessionId].expiryTimer) {
227
- clearTimeout(openSessions[sessionId].expiryTimer);
228
- }
229
- delete openSessions[sessionId];
230
- };
231
-
232
- // let example = {
233
- // "session": {
234
- // "sessionId": "SessionId.74267f5d-3b58-45646-bdc7-4645645",
235
- // "application": {
236
- // "applicationId": "amzn1.ask.skill.6cee68cd-4356-456-9d53-45646456"
237
- // },
238
- // "attributes": {},
239
- // "user": {
240
- // "userId": "amzn1.ask.account.asdasdasdas"
241
- // },
242
- // "new": true
243
- // },
244
- // "request": {
245
- // "type": "IntentRequest",
246
- // "requestId": "EdwRequestId.b785ca9f-6ba9-45645-a667-4645646",
247
- // "locale": "de-DE",
248
- // "timestamp": "2017-07-25T15:30:51Z",
249
- // "intent": {
250
- // "name": "controlDevice",
251
- // "slots": {
252
- // "Command": {
253
- // "name": "Command",
254
- // "value": "an"
255
- // },
256
- // "Device": {
257
- // "name": "Device"
258
- // },
259
- // "Article": {
260
- // "name": "Article"
261
- // },
262
- // "Value": {
263
- // "name": "Value"
264
- // },
265
- // "Place": {
266
- // "name": "Place",
267
- // "value": "licht"
268
- // }
269
- // }
270
- // }
271
- // },
272
- // "version": "1.0"
273
- // }
274
- this.process = async (request, isEnabled) => {
275
- if (!request || !request.request) {
276
- adapter.log.error('Invalid request: no intent!');
277
- return { error: 'Invalid request: no intent!' };
278
- }
279
- const isV2Skill = !!request.customSkillV2;
280
- lastSkillRequestWasV2 = isV2Skill;
281
- const getResponse = isV2Skill ? getResponseV2 : getResponseV1;
282
-
283
- if (!isEnabled) {
284
- if (lang === 'en') {
285
- return getResponse(
286
- 'The service is not activated. Please enable Alexa integration in the iot Adapter.',
287
- true,
288
- );
289
- } else if (lang === 'ru') {
290
- return getResponse(
291
- 'Услуга не активирована. Включите интеграцию Alexa в адаптере Интернета вещей.',
292
- true,
293
- );
294
- } else {
295
- return getResponse(
296
- 'Der Service ist nicht aktiviert. Bitte aktiviere die Alex-Integration im iot-Adapter um Ihn zu aktivieren.',
297
- true,
298
- );
299
- }
300
- }
301
-
302
- const sessionId = request.session && request.session.sessionId ? request.session.sessionId : '';
303
- adapter.log.debug(
304
- `Custom Skill ${isV2Skill ? 'V2' : 'V1'} request: ${request.request.type}/${request.request.intent && request.request.intent.name} for session ${sessionId}, dialog: ${request.request.dialogState}`,
305
- );
306
-
307
- if (request.request.type === 'LaunchRequest') {
308
- adapter.log.debug(request.request.type);
309
- this.touchSession(sessionId, isV2Skill);
310
- if (lang === 'en') {
311
- return getResponse(
312
- 'Hello, what do you want to know or control?',
313
- 'What do you want to know or control?',
314
- );
315
- } else if (lang === 'ru') {
316
- return getResponse(
317
- 'Привет. Что вы хотите знать или контролировать?',
318
- 'Что вы хотите знать или контролировать?',
319
- );
320
- } else {
321
- return getResponse(
322
- 'Hallo, was möchtest Du wissen oder steuern?',
323
- 'Was möchtest Du wissen oder steuern?',
324
- );
325
- }
326
- } else if (request.request.type === 'IntentRequest') {
327
- if (request.request.intent) {
328
- this.touchSession(sessionId, isV2Skill);
329
-
330
- if (request.request.intent.name === 'AMAZON.HelpIntent') {
331
- if (lang === 'en') {
332
- return getResponse(
333
- 'This skill will pass all recognized words to your ioBroker installation and you can configure actions and responses there! What do you want to know or control?',
334
- 'What do you want to know or control?',
335
- );
336
- } else if (lang === 'ru') {
337
- return getResponse(
338
- 'Этот навык передаст все распознанные слова в вашу установку ioBroker, и вы сможете настроить действия и ответы там! Что вы хотите знать или контролировать?',
339
- 'Что вы хотите знать или контролировать?',
340
- );
341
- } else {
342
- return getResponse(
343
- 'Dieser Skill gibt alle erkannten Wörter an Deine ioBroker-Installation weiter und Du kannst dort Aktionen und Antworten konfigurieren! Was möchtest Du wissen oder steuern?',
344
- 'Was möchtest Du wissen oder steuern?',
345
- );
346
- }
347
- } else if (
348
- request.request.intent.name === 'AMAZON.CancelIntent' ||
349
- request.request.intent.name === 'AMAZON.StopIntent'
350
- ) {
351
- adapter.log.debug(request.request.intent.name);
352
- this.deleteSession(sessionId);
353
- if (lang === 'en') {
354
- return getResponse('Goodbye!', true);
355
- } else if (lang === 'ru') {
356
- return getResponse('До скорого!', true);
357
- } else {
358
- return getResponse('Bis bald!', true);
359
- }
360
- } else {
361
- let textsLog = [];
362
- let texts = [];
363
-
364
- const originalIntentName = request.request.intent.name;
365
- if (request.request.intent.name === 'AMAZON.YesIntent') {
366
- // Only relevant for v2 Skill. Convert an initial YesIntent to Words
367
- if (lang === 'en') {
368
- textsLog.push('AMAZON.YesIntent = Yes');
369
- texts.push('Yes');
370
- } else if (lang === 'ru') {
371
- textsLog.push('AMAZON.YesIntent = Да');
372
- texts.push('Да');
373
- } else if (lang === 'de') {
374
- textsLog.push('AMAZON.YesIntent = Ja');
375
- texts.push('Ja');
376
- }
377
- } else if (request.request.intent.name === 'AMAZON.NoIntent') {
378
- // Only relevant for v2 Skill. Convert an initial NoIntent to Words
379
- if (lang === 'en') {
380
- textsLog.push('AMAZON.NoIntent = No');
381
- texts.push('No');
382
- } else if (lang === 'ru') {
383
- textsLog.push('AMAZON.NoIntent = Нет');
384
- texts.push('Нет');
385
- } else if (lang === 'de') {
386
- textsLog.push('AMAZON.NoIntent = Nein');
387
- texts.push('Nein');
388
- }
389
- } else if (request.request.intent.name.startsWith('queryIntent')) {
390
- // v2 Skill
391
- // Only relevant for v2 Skill, get the start words out of the intent name
392
- const startWords = request.request.intent.name
393
- .replace(/^queryIntent/, '')
394
- .replace(/ae/, 'ä')
395
- .replace(/oe/, 'ö')
396
- .replace(/ue/, 'ü')
397
- .replace(/Oe/, 'Ö')
398
- .replace(/Ue/, 'Ü')
399
- .replace(/Ae/, 'Ä')
400
- .replace(/ss/, 'ß')
401
- .replace(/([A-Z])/g, ' $1')
402
- .trim();
403
- request.request.intent.name = 'queryIntent';
404
- if (startWords.length && startWords !== 'FillWords') {
405
- // ignore FillWords
406
- textsLog.push(`queryIntent = ${startWords}`);
407
- texts.push(startWords);
408
- }
409
- }
410
-
411
- if (!request.request.intent.slots && textsLog.length === 0) {
412
- // No slots and nothing from above
413
- adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);
414
- if (lang === 'en') {
415
- return getResponse('I did not hear you. Please repeat your question!');
416
- } else if (lang === 'ru') {
417
- return getResponse('Я не слышал тебя. Пожалуйста, повторите свой вопрос!');
418
- } else {
419
- return getResponse('Ich habe Dich nicht verstanden. Bitte wiederhole deine Frage!');
420
- }
421
- }
422
-
423
- // collect all filled slots (v1 and v2 skill)
424
- if (request.request.intent.slots) {
425
- let slots = Object.keys(request.request.intent.slots);
426
- slots.forEach(slotId => {
427
- const slot = request.request.intent.slots[slotId];
428
- let value = slot.value;
429
- let resolution =
430
- slot.resolutions &&
431
- slot.resolutions.resolutionsPerAuthority &&
432
- slot.resolutions.resolutionsPerAuthority.length > 0
433
- ? slot.resolutions.resolutionsPerAuthority[0]
434
- : null;
435
-
436
- if (resolution && resolution.status.code === 'ER_SUCCESS_MATCH') {
437
- let resolutionValue = resolution.values[0].value;
438
- value = resolutionValue.name;
439
- }
440
-
441
- if (value && value.length) {
442
- texts.push(value);
443
- textsLog.push(`${slotId} = ${value}`);
444
- }
445
- });
446
- }
447
-
448
- let text = texts.join(' ');
449
-
450
- const intent = request.request.intent.name || '';
451
- if (originalIntentName.startsWith('queryIntentStarteDialog')) {
452
- // v2 Skill StarteDialog* intents are automatically handled without sending anywhere
453
- let response = '';
454
- if (originalIntentName === 'queryIntentStarteDialog') {
455
- // Intent to directly redirect to the dialog state without further processing
456
- response = text.replace(/^Starte Dialog /, '').trim();
457
- } else if (originalIntentName === 'queryIntentStarteDialogMitFrage') {
458
- // Intent to directly redirect to the dialog state with asking a question without further processing
459
- response = text.replace(/^Starte Dialog Mit Frage /, '').trim();
460
- if (response.length) {
461
- response += '?';
462
- }
463
- }
464
- if (!response.length) {
465
- // We need to send an answer, else it is an error
466
- if (lang === 'en') {
467
- response = 'Yes?';
468
- } else if (lang === 'ru') {
469
- response = 'Да?';
470
- } else {
471
- response = 'Ja?';
472
- }
473
- }
474
- return getResponse(response, response);
475
- } else if (intent === 'queryIntent' && stopPhrases[lang].includes(text.toLowerCase())) {
476
- // v2 Skill when in dialog mode we need to take care of the exit criteria ourselves
477
- this.deleteSession(sessionId);
478
-
479
- if (lang === 'en') {
480
- return getResponse('Goodbye!', true);
481
- } else if (lang === 'ru') {
482
- return getResponse('До скорого!', true);
483
- } else {
484
- return getResponse('Bis bald!', true);
485
- }
486
- } else {
487
- // v1 and v2 Skill
488
- const deviceId =
489
- request.context &&
490
- request.context.System &&
491
- request.context.System.device &&
492
- request.context.System.device.deviceId
493
- ? request.context.System.device.deviceId
494
- : '';
495
- const deviceRoom = knownDevices[deviceId] ? knownDevices[deviceId].room : undefined;
496
- const userId =
497
- request.session && request.session.user && request.session.user.userId
498
- ? request.session.user.userId
499
- : '';
500
- const userName = knownUsers[userId] ? knownUsers[userId].name : undefined;
501
- const commandObj = {
502
- words: texts,
503
- intent: intent,
504
- deviceId,
505
- deviceRoom,
506
- sessionId,
507
- userId,
508
- userName,
509
- };
510
-
511
- // Add room and username to the text if configured
512
- if (deviceRoom && adapter.config.addCustomKnownAlexaDeviceRoomToText) {
513
- text += ` ${deviceRoom}`;
514
- }
515
- if (userName && adapter.config.addCustomKnownAlexaUserNameToText) {
516
- text += ` ${userName}`;
517
- }
518
-
519
- // Add intent in front of the text to stay compatible with v1 Skill
520
- text = `${intent} ${text}`;
521
- text = text.trim();
522
-
523
- await adapter.setStateAsync('smart.lastCommand', text, true);
524
- await adapter.setStateAsync('smart.lastCommandObj', JSON.stringify(commandObj), true);
525
-
526
- adapter.log.debug(`${intent}: ${textsLog.join(', ')}`);
527
-
528
- if (intent) {
529
- let text_timeout;
530
- if (lang === 'en') {
531
- text_timeout = `Processing of ${text} is not possible!`;
532
- } else if (lang === 'ru') {
533
- text_timeout = `Обработка ${text} не возможна!`;
534
- } else {
535
- text_timeout = `Die Verarbeitung von ${text} ist nicht möglich!`;
536
- }
537
-
538
- if (
539
- adapter.config.text2command !== null &&
540
- adapter.config.text2command !== undefined &&
541
- adapter.config.text2command !== ''
542
- ) {
543
- const state = await adapter.getForeignStateAsync(
544
- `system.adapter.text2command.${adapter.config.text2command}.alive`,
545
- );
546
- if (state && state.val) {
547
- return new Promise(resolve => {
548
- openSessions[sessionId].responseTimer = setTimeout(() => {
549
- openSessions[sessionId].responseTimer = null;
550
- if (resolve) {
551
- this.processAfter(request, text_timeout, true, resolve);
552
- resolve = null;
553
- }
554
- }, 1000);
555
-
556
- if (adapter.config.language) {
557
- text = `${adapter.config.language};${text}`;
558
- }
559
-
560
- adapter.sendTo(`text2command.${adapter.config.text2command}`, text, result => {
561
- if (openSessions[sessionId].responseTimer) {
562
- clearTimeout(openSessions[sessionId].responseTimer);
563
- openSessions[sessionId].responseTimer = null;
564
- }
565
- const regExp = new RegExp(`"${intent.toLowerCase()}\\s`);
566
- result.response = result.response
567
- .replace(/^\w\w;/, '')
568
- .replace(regExp, '"');
569
- adapter.log.debug(`Response from text2command: ${result.response}`);
570
-
571
- adapter.setState('smart.lastResponse', result.response, true);
572
- if (resolve) {
573
- resolve(getResponse(result.response, true));
574
- resolve = null;
575
- }
576
- });
577
- });
578
- }
579
- }
580
-
581
- return new Promise(resolve => {
582
- openSessions[sessionId].responseTimer &&
583
- clearTimeout(openSessions[sessionId].responseTimer);
584
- openSessions[sessionId].callback = resolve;
585
- openSessions[sessionId].request = request;
586
-
587
- openSessions[sessionId].responseTimer = setTimeout(
588
- () => this.processAfter(request, text_timeout, true, resolve),
589
- 200,
590
- );
591
- });
592
- } else {
593
- if (lang === 'en') {
594
- return getResponse('I did not understand the question!');
595
- } else if (lang === 'ru') {
596
- return getResponse('Я не поняла ваш вопрос!');
597
- } else {
598
- return getResponse('Ich habe Deine Frage nicht verstanden!');
599
- }
600
- }
601
- }
602
- }
603
- } else {
604
- adapter.log.warn(`Unexpected ALEXA Request: ${JSON.stringify(request)}`);
605
- if (lang === 'en') {
606
- return getResponse('Please repeat your question!');
607
- } else if (lang === 'ru') {
608
- return getResponse('Пожалуйста, повторите вопрос!');
609
- } else {
610
- return getResponse('Bitte wiederhole die Frage!');
611
- }
612
- }
613
- } else if (request.request.type === 'SessionEndedRequest') {
614
- adapter.log.debug(`SessionEndedRequest: ${request.request.reason}`);
615
- this.deleteSession(sessionId);
616
- // Should not be called
617
- return {};
618
- }
619
- };
620
- }
621
-
622
- module.exports = AlexaCustom;
package/lib/translate.js DELETED
@@ -1,19 +0,0 @@
1
- module.exports = function (dictionary, language, word) {
2
- let _word = (word || '').toString().toLowerCase();
3
- for (let r = 0; r < dictionary.length; r++) {
4
- for (let l in dictionary[r]) {
5
- if (dictionary[r].hasOwnProperty(l)) {
6
- let words = dictionary[r][l].toLowerCase().split('/');
7
- if (words.includes(_word)) {
8
- if (dictionary[r][language]) {
9
- return dictionary[r][language].split('/')[0];
10
- } else {
11
- return dictionary[r].en.split('/')[0];
12
- }
13
- }
14
- }
15
- }
16
- }
17
-
18
- return word;
19
- };