iobroker.eos-admin 7.9.76 → 7.9.79

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 (561) hide show
  1. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v54.js +1 -1
  2. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v55.js +1 -1
  3. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v56.js +1 -1
  4. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v57.js +1 -1
  5. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v58.js +1 -1
  6. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v59.js +1 -1
  7. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v60.js +1 -1
  8. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v61.js +1 -1
  9. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v62.js +1 -1
  10. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v63.js +1 -1
  11. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v64.js +1 -1
  12. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v65.js +1 -1
  13. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v66.js +1 -1
  14. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v67.js +1 -1
  15. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v68.js +1 -1
  16. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v69.js +1 -1
  17. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v70.js +1 -1
  18. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v71.js +1 -1
  19. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v72.js +1 -1
  20. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v73.js +1 -1
  21. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v74.js +1 -1
  22. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v75.js +1 -1
  23. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v76.js +1 -2
  24. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v77.js +1 -0
  25. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v78.js +1 -0
  26. package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v79.js +2 -0
  27. package/adminWww/assets/Adapters-B5_jQ7DE-v54.js +1 -1
  28. package/adminWww/assets/Adapters-B5_jQ7DE-v55.js +1 -1
  29. package/adminWww/assets/Adapters-B5_jQ7DE-v56.js +1 -1
  30. package/adminWww/assets/Adapters-B5_jQ7DE-v57.js +1 -1
  31. package/adminWww/assets/Adapters-B5_jQ7DE-v58.js +1 -1
  32. package/adminWww/assets/Adapters-B5_jQ7DE-v59.js +1 -1
  33. package/adminWww/assets/Adapters-B5_jQ7DE-v60.js +1 -1
  34. package/adminWww/assets/Adapters-B5_jQ7DE-v61.js +1 -1
  35. package/adminWww/assets/Adapters-B5_jQ7DE-v62.js +1 -1
  36. package/adminWww/assets/Adapters-B5_jQ7DE-v63.js +1 -1
  37. package/adminWww/assets/Adapters-B5_jQ7DE-v64.js +1 -1
  38. package/adminWww/assets/Adapters-B5_jQ7DE-v65.js +1 -1
  39. package/adminWww/assets/Adapters-B5_jQ7DE-v66.js +1 -1
  40. package/adminWww/assets/Adapters-B5_jQ7DE-v67.js +1 -1
  41. package/adminWww/assets/Adapters-B5_jQ7DE-v68.js +1 -1
  42. package/adminWww/assets/Adapters-B5_jQ7DE-v69.js +1 -1
  43. package/adminWww/assets/Adapters-B5_jQ7DE-v70.js +1 -1
  44. package/adminWww/assets/Adapters-B5_jQ7DE-v71.js +1 -1
  45. package/adminWww/assets/Adapters-B5_jQ7DE-v72.js +1 -1
  46. package/adminWww/assets/Adapters-B5_jQ7DE-v73.js +1 -1
  47. package/adminWww/assets/Adapters-B5_jQ7DE-v74.js +1 -1
  48. package/adminWww/assets/Adapters-B5_jQ7DE-v75.js +1 -1
  49. package/adminWww/assets/Adapters-B5_jQ7DE-v76.js +1 -9
  50. package/adminWww/assets/Adapters-B5_jQ7DE-v77.js +1 -0
  51. package/adminWww/assets/Adapters-B5_jQ7DE-v78.js +1 -0
  52. package/adminWww/assets/Adapters-B5_jQ7DE-v79.js +9 -0
  53. package/adminWww/assets/Config-hHK2UzGP-v54.js +1 -1
  54. package/adminWww/assets/Config-hHK2UzGP-v55.js +1 -1
  55. package/adminWww/assets/Config-hHK2UzGP-v56.js +1 -1
  56. package/adminWww/assets/Config-hHK2UzGP-v57.js +1 -1
  57. package/adminWww/assets/Config-hHK2UzGP-v58.js +1 -1
  58. package/adminWww/assets/Config-hHK2UzGP-v59.js +1 -1
  59. package/adminWww/assets/Config-hHK2UzGP-v60.js +1 -1
  60. package/adminWww/assets/Config-hHK2UzGP-v61.js +1 -1
  61. package/adminWww/assets/Config-hHK2UzGP-v62.js +1 -1
  62. package/adminWww/assets/Config-hHK2UzGP-v63.js +1 -1
  63. package/adminWww/assets/Config-hHK2UzGP-v64.js +1 -1
  64. package/adminWww/assets/Config-hHK2UzGP-v65.js +1 -1
  65. package/adminWww/assets/Config-hHK2UzGP-v66.js +1 -1
  66. package/adminWww/assets/Config-hHK2UzGP-v67.js +1 -1
  67. package/adminWww/assets/Config-hHK2UzGP-v68.js +1 -1
  68. package/adminWww/assets/Config-hHK2UzGP-v69.js +1 -1
  69. package/adminWww/assets/Config-hHK2UzGP-v70.js +1 -1
  70. package/adminWww/assets/Config-hHK2UzGP-v71.js +1 -1
  71. package/adminWww/assets/Config-hHK2UzGP-v72.js +1 -1
  72. package/adminWww/assets/Config-hHK2UzGP-v73.js +1 -1
  73. package/adminWww/assets/Config-hHK2UzGP-v74.js +1 -1
  74. package/adminWww/assets/Config-hHK2UzGP-v75.js +1 -1
  75. package/adminWww/assets/Config-hHK2UzGP-v76.js +1 -1
  76. package/adminWww/assets/Config-hHK2UzGP-v77.js +1 -0
  77. package/adminWww/assets/Config-hHK2UzGP-v78.js +1 -0
  78. package/adminWww/assets/Config-hHK2UzGP-v79.js +1 -0
  79. package/adminWww/assets/CustomTab-B0wqoazH-v54.js +1 -1
  80. package/adminWww/assets/CustomTab-B0wqoazH-v55.js +1 -1
  81. package/adminWww/assets/CustomTab-B0wqoazH-v56.js +1 -1
  82. package/adminWww/assets/CustomTab-B0wqoazH-v57.js +1 -1
  83. package/adminWww/assets/CustomTab-B0wqoazH-v58.js +1 -1
  84. package/adminWww/assets/CustomTab-B0wqoazH-v59.js +1 -1
  85. package/adminWww/assets/CustomTab-B0wqoazH-v60.js +1 -1
  86. package/adminWww/assets/CustomTab-B0wqoazH-v61.js +1 -1
  87. package/adminWww/assets/CustomTab-B0wqoazH-v62.js +1 -1
  88. package/adminWww/assets/CustomTab-B0wqoazH-v63.js +1 -1
  89. package/adminWww/assets/CustomTab-B0wqoazH-v64.js +1 -1
  90. package/adminWww/assets/CustomTab-B0wqoazH-v65.js +1 -1
  91. package/adminWww/assets/CustomTab-B0wqoazH-v66.js +1 -1
  92. package/adminWww/assets/CustomTab-B0wqoazH-v67.js +1 -1
  93. package/adminWww/assets/CustomTab-B0wqoazH-v68.js +1 -1
  94. package/adminWww/assets/CustomTab-B0wqoazH-v69.js +1 -1
  95. package/adminWww/assets/CustomTab-B0wqoazH-v70.js +1 -1
  96. package/adminWww/assets/CustomTab-B0wqoazH-v71.js +1 -1
  97. package/adminWww/assets/CustomTab-B0wqoazH-v72.js +1 -1
  98. package/adminWww/assets/CustomTab-B0wqoazH-v73.js +1 -1
  99. package/adminWww/assets/CustomTab-B0wqoazH-v74.js +1 -1
  100. package/adminWww/assets/CustomTab-B0wqoazH-v75.js +1 -1
  101. package/adminWww/assets/CustomTab-B0wqoazH-v76.js +1 -1
  102. package/adminWww/assets/CustomTab-B0wqoazH-v77.js +1 -0
  103. package/adminWww/assets/CustomTab-B0wqoazH-v78.js +1 -0
  104. package/adminWww/assets/CustomTab-B0wqoazH-v79.js +1 -0
  105. package/adminWww/assets/DeviceManager-BFmQeYQ1-v54.js +1 -1
  106. package/adminWww/assets/DeviceManager-BFmQeYQ1-v55.js +1 -1
  107. package/adminWww/assets/DeviceManager-BFmQeYQ1-v56.js +1 -1
  108. package/adminWww/assets/DeviceManager-BFmQeYQ1-v57.js +1 -1
  109. package/adminWww/assets/DeviceManager-BFmQeYQ1-v58.js +1 -1
  110. package/adminWww/assets/DeviceManager-BFmQeYQ1-v59.js +1 -1
  111. package/adminWww/assets/DeviceManager-BFmQeYQ1-v60.js +1 -1
  112. package/adminWww/assets/DeviceManager-BFmQeYQ1-v61.js +1 -1
  113. package/adminWww/assets/DeviceManager-BFmQeYQ1-v62.js +1 -1
  114. package/adminWww/assets/DeviceManager-BFmQeYQ1-v63.js +1 -1
  115. package/adminWww/assets/DeviceManager-BFmQeYQ1-v64.js +1 -1
  116. package/adminWww/assets/DeviceManager-BFmQeYQ1-v65.js +1 -1
  117. package/adminWww/assets/DeviceManager-BFmQeYQ1-v66.js +1 -1
  118. package/adminWww/assets/DeviceManager-BFmQeYQ1-v67.js +1 -1
  119. package/adminWww/assets/DeviceManager-BFmQeYQ1-v68.js +1 -1
  120. package/adminWww/assets/DeviceManager-BFmQeYQ1-v69.js +1 -1
  121. package/adminWww/assets/DeviceManager-BFmQeYQ1-v70.js +1 -1
  122. package/adminWww/assets/DeviceManager-BFmQeYQ1-v71.js +1 -1
  123. package/adminWww/assets/DeviceManager-BFmQeYQ1-v72.js +1 -1
  124. package/adminWww/assets/DeviceManager-BFmQeYQ1-v73.js +1 -1
  125. package/adminWww/assets/DeviceManager-BFmQeYQ1-v74.js +1 -1
  126. package/adminWww/assets/DeviceManager-BFmQeYQ1-v75.js +1 -1
  127. package/adminWww/assets/DeviceManager-BFmQeYQ1-v76.js +1 -1
  128. package/adminWww/assets/DeviceManager-BFmQeYQ1-v77.js +1 -0
  129. package/adminWww/assets/DeviceManager-BFmQeYQ1-v78.js +1 -0
  130. package/adminWww/assets/DeviceManager-BFmQeYQ1-v79.js +1 -0
  131. package/adminWww/assets/EasyMode-B1d9Vdc4-v54.js +1 -1
  132. package/adminWww/assets/EasyMode-B1d9Vdc4-v55.js +1 -1
  133. package/adminWww/assets/EasyMode-B1d9Vdc4-v56.js +1 -1
  134. package/adminWww/assets/EasyMode-B1d9Vdc4-v57.js +1 -1
  135. package/adminWww/assets/EasyMode-B1d9Vdc4-v58.js +1 -1
  136. package/adminWww/assets/EasyMode-B1d9Vdc4-v59.js +1 -1
  137. package/adminWww/assets/EasyMode-B1d9Vdc4-v60.js +1 -1
  138. package/adminWww/assets/EasyMode-B1d9Vdc4-v61.js +1 -1
  139. package/adminWww/assets/EasyMode-B1d9Vdc4-v62.js +1 -1
  140. package/adminWww/assets/EasyMode-B1d9Vdc4-v63.js +1 -1
  141. package/adminWww/assets/EasyMode-B1d9Vdc4-v64.js +1 -1
  142. package/adminWww/assets/EasyMode-B1d9Vdc4-v65.js +1 -1
  143. package/adminWww/assets/EasyMode-B1d9Vdc4-v66.js +1 -1
  144. package/adminWww/assets/EasyMode-B1d9Vdc4-v67.js +1 -1
  145. package/adminWww/assets/EasyMode-B1d9Vdc4-v68.js +1 -1
  146. package/adminWww/assets/EasyMode-B1d9Vdc4-v69.js +1 -1
  147. package/adminWww/assets/EasyMode-B1d9Vdc4-v70.js +1 -1
  148. package/adminWww/assets/EasyMode-B1d9Vdc4-v71.js +1 -1
  149. package/adminWww/assets/EasyMode-B1d9Vdc4-v72.js +1 -1
  150. package/adminWww/assets/EasyMode-B1d9Vdc4-v73.js +1 -1
  151. package/adminWww/assets/EasyMode-B1d9Vdc4-v74.js +1 -1
  152. package/adminWww/assets/EasyMode-B1d9Vdc4-v75.js +1 -1
  153. package/adminWww/assets/EasyMode-B1d9Vdc4-v76.js +1 -1
  154. package/adminWww/assets/EasyMode-B1d9Vdc4-v77.js +1 -0
  155. package/adminWww/assets/EasyMode-B1d9Vdc4-v78.js +1 -0
  156. package/adminWww/assets/EasyMode-B1d9Vdc4-v79.js +1 -0
  157. package/adminWww/assets/Enums-DbWYxKOo-v54.js +1 -1
  158. package/adminWww/assets/Enums-DbWYxKOo-v55.js +1 -1
  159. package/adminWww/assets/Enums-DbWYxKOo-v56.js +1 -1
  160. package/adminWww/assets/Enums-DbWYxKOo-v57.js +1 -1
  161. package/adminWww/assets/Enums-DbWYxKOo-v58.js +1 -1
  162. package/adminWww/assets/Enums-DbWYxKOo-v59.js +1 -1
  163. package/adminWww/assets/Enums-DbWYxKOo-v60.js +1 -1
  164. package/adminWww/assets/Enums-DbWYxKOo-v61.js +1 -1
  165. package/adminWww/assets/Enums-DbWYxKOo-v62.js +1 -1
  166. package/adminWww/assets/Enums-DbWYxKOo-v63.js +1 -1
  167. package/adminWww/assets/Enums-DbWYxKOo-v64.js +1 -1
  168. package/adminWww/assets/Enums-DbWYxKOo-v65.js +1 -1
  169. package/adminWww/assets/Enums-DbWYxKOo-v66.js +1 -1
  170. package/adminWww/assets/Enums-DbWYxKOo-v67.js +1 -1
  171. package/adminWww/assets/Enums-DbWYxKOo-v68.js +1 -1
  172. package/adminWww/assets/Enums-DbWYxKOo-v69.js +1 -1
  173. package/adminWww/assets/Enums-DbWYxKOo-v70.js +1 -1
  174. package/adminWww/assets/Enums-DbWYxKOo-v71.js +1 -1
  175. package/adminWww/assets/Enums-DbWYxKOo-v72.js +1 -1
  176. package/adminWww/assets/Enums-DbWYxKOo-v73.js +1 -1
  177. package/adminWww/assets/Enums-DbWYxKOo-v74.js +1 -1
  178. package/adminWww/assets/Enums-DbWYxKOo-v75.js +1 -1
  179. package/adminWww/assets/Enums-DbWYxKOo-v76.js +1 -91
  180. package/adminWww/assets/Enums-DbWYxKOo-v77.js +1 -0
  181. package/adminWww/assets/Enums-DbWYxKOo-v78.js +1 -0
  182. package/adminWww/assets/Enums-DbWYxKOo-v79.js +91 -0
  183. package/adminWww/assets/Fields-CX3rKuWb-v54.js +1 -1
  184. package/adminWww/assets/Fields-CX3rKuWb-v55.js +1 -1
  185. package/adminWww/assets/Fields-CX3rKuWb-v56.js +1 -1
  186. package/adminWww/assets/Fields-CX3rKuWb-v57.js +1 -1
  187. package/adminWww/assets/Fields-CX3rKuWb-v58.js +1 -1
  188. package/adminWww/assets/Fields-CX3rKuWb-v59.js +1 -1
  189. package/adminWww/assets/Fields-CX3rKuWb-v60.js +1 -1
  190. package/adminWww/assets/Fields-CX3rKuWb-v61.js +1 -1
  191. package/adminWww/assets/Fields-CX3rKuWb-v62.js +1 -1
  192. package/adminWww/assets/Fields-CX3rKuWb-v63.js +1 -1
  193. package/adminWww/assets/Fields-CX3rKuWb-v64.js +1 -1
  194. package/adminWww/assets/Fields-CX3rKuWb-v65.js +1 -1
  195. package/adminWww/assets/Fields-CX3rKuWb-v66.js +1 -1
  196. package/adminWww/assets/Fields-CX3rKuWb-v67.js +1 -1
  197. package/adminWww/assets/Fields-CX3rKuWb-v68.js +1 -1
  198. package/adminWww/assets/Fields-CX3rKuWb-v69.js +1 -1
  199. package/adminWww/assets/Fields-CX3rKuWb-v70.js +1 -1
  200. package/adminWww/assets/Fields-CX3rKuWb-v71.js +1 -1
  201. package/adminWww/assets/Fields-CX3rKuWb-v72.js +1 -1
  202. package/adminWww/assets/Fields-CX3rKuWb-v73.js +1 -1
  203. package/adminWww/assets/Fields-CX3rKuWb-v74.js +1 -1
  204. package/adminWww/assets/Fields-CX3rKuWb-v75.js +1 -1
  205. package/adminWww/assets/Fields-CX3rKuWb-v76.js +1 -1
  206. package/adminWww/assets/Fields-CX3rKuWb-v77.js +1 -0
  207. package/adminWww/assets/Fields-CX3rKuWb-v78.js +1 -0
  208. package/adminWww/assets/Fields-CX3rKuWb-v79.js +1 -0
  209. package/adminWww/assets/Files-Cd2HOzIE-v54.js +1 -1
  210. package/adminWww/assets/Files-Cd2HOzIE-v55.js +1 -1
  211. package/adminWww/assets/Files-Cd2HOzIE-v56.js +1 -1
  212. package/adminWww/assets/Files-Cd2HOzIE-v57.js +1 -1
  213. package/adminWww/assets/Files-Cd2HOzIE-v58.js +1 -1
  214. package/adminWww/assets/Files-Cd2HOzIE-v59.js +1 -1
  215. package/adminWww/assets/Files-Cd2HOzIE-v60.js +1 -1
  216. package/adminWww/assets/Files-Cd2HOzIE-v61.js +1 -1
  217. package/adminWww/assets/Files-Cd2HOzIE-v62.js +1 -1
  218. package/adminWww/assets/Files-Cd2HOzIE-v63.js +1 -1
  219. package/adminWww/assets/Files-Cd2HOzIE-v64.js +1 -1
  220. package/adminWww/assets/Files-Cd2HOzIE-v65.js +1 -1
  221. package/adminWww/assets/Files-Cd2HOzIE-v66.js +1 -1
  222. package/adminWww/assets/Files-Cd2HOzIE-v67.js +1 -1
  223. package/adminWww/assets/Files-Cd2HOzIE-v68.js +1 -1
  224. package/adminWww/assets/Files-Cd2HOzIE-v69.js +1 -1
  225. package/adminWww/assets/Files-Cd2HOzIE-v70.js +1 -1
  226. package/adminWww/assets/Files-Cd2HOzIE-v71.js +1 -1
  227. package/adminWww/assets/Files-Cd2HOzIE-v72.js +1 -1
  228. package/adminWww/assets/Files-Cd2HOzIE-v73.js +1 -1
  229. package/adminWww/assets/Files-Cd2HOzIE-v74.js +1 -1
  230. package/adminWww/assets/Files-Cd2HOzIE-v75.js +1 -1
  231. package/adminWww/assets/Files-Cd2HOzIE-v76.js +1 -1
  232. package/adminWww/assets/Files-Cd2HOzIE-v77.js +1 -0
  233. package/adminWww/assets/Files-Cd2HOzIE-v78.js +1 -0
  234. package/adminWww/assets/Files-Cd2HOzIE-v79.js +1 -0
  235. package/adminWww/assets/Hosts-Bg8QzW5i-v54.js +1 -1
  236. package/adminWww/assets/Hosts-Bg8QzW5i-v55.js +1 -1
  237. package/adminWww/assets/Hosts-Bg8QzW5i-v56.js +1 -1
  238. package/adminWww/assets/Hosts-Bg8QzW5i-v57.js +1 -1
  239. package/adminWww/assets/Hosts-Bg8QzW5i-v58.js +1 -1
  240. package/adminWww/assets/Hosts-Bg8QzW5i-v59.js +1 -1
  241. package/adminWww/assets/Hosts-Bg8QzW5i-v60.js +1 -1
  242. package/adminWww/assets/Hosts-Bg8QzW5i-v61.js +1 -1
  243. package/adminWww/assets/Hosts-Bg8QzW5i-v62.js +1 -1
  244. package/adminWww/assets/Hosts-Bg8QzW5i-v63.js +1 -1
  245. package/adminWww/assets/Hosts-Bg8QzW5i-v64.js +1 -1
  246. package/adminWww/assets/Hosts-Bg8QzW5i-v65.js +1 -1
  247. package/adminWww/assets/Hosts-Bg8QzW5i-v66.js +1 -1
  248. package/adminWww/assets/Hosts-Bg8QzW5i-v67.js +1 -1
  249. package/adminWww/assets/Hosts-Bg8QzW5i-v68.js +1 -1
  250. package/adminWww/assets/Hosts-Bg8QzW5i-v69.js +1 -1
  251. package/adminWww/assets/Hosts-Bg8QzW5i-v70.js +1 -1
  252. package/adminWww/assets/Hosts-Bg8QzW5i-v71.js +1 -1
  253. package/adminWww/assets/Hosts-Bg8QzW5i-v72.js +1 -1
  254. package/adminWww/assets/Hosts-Bg8QzW5i-v73.js +1 -1
  255. package/adminWww/assets/Hosts-Bg8QzW5i-v74.js +1 -1
  256. package/adminWww/assets/Hosts-Bg8QzW5i-v75.js +1 -1
  257. package/adminWww/assets/Hosts-Bg8QzW5i-v76.js +1 -121
  258. package/adminWww/assets/Hosts-Bg8QzW5i-v77.js +1 -0
  259. package/adminWww/assets/Hosts-Bg8QzW5i-v78.js +1 -0
  260. package/adminWww/assets/Hosts-Bg8QzW5i-v79.js +121 -0
  261. package/adminWww/assets/Instances-YdaGnS5a-v54.js +1 -1
  262. package/adminWww/assets/Instances-YdaGnS5a-v55.js +1 -1
  263. package/adminWww/assets/Instances-YdaGnS5a-v56.js +1 -1
  264. package/adminWww/assets/Instances-YdaGnS5a-v57.js +1 -1
  265. package/adminWww/assets/Instances-YdaGnS5a-v58.js +1 -1
  266. package/adminWww/assets/Instances-YdaGnS5a-v59.js +1 -1
  267. package/adminWww/assets/Instances-YdaGnS5a-v60.js +1 -1
  268. package/adminWww/assets/Instances-YdaGnS5a-v61.js +1 -1
  269. package/adminWww/assets/Instances-YdaGnS5a-v62.js +1 -1
  270. package/adminWww/assets/Instances-YdaGnS5a-v63.js +1 -1
  271. package/adminWww/assets/Instances-YdaGnS5a-v64.js +1 -1
  272. package/adminWww/assets/Instances-YdaGnS5a-v65.js +1 -1
  273. package/adminWww/assets/Instances-YdaGnS5a-v66.js +1 -1
  274. package/adminWww/assets/Instances-YdaGnS5a-v67.js +1 -1
  275. package/adminWww/assets/Instances-YdaGnS5a-v68.js +1 -1
  276. package/adminWww/assets/Instances-YdaGnS5a-v69.js +1 -1
  277. package/adminWww/assets/Instances-YdaGnS5a-v70.js +1 -1
  278. package/adminWww/assets/Instances-YdaGnS5a-v71.js +1 -1
  279. package/adminWww/assets/Instances-YdaGnS5a-v72.js +1 -1
  280. package/adminWww/assets/Instances-YdaGnS5a-v73.js +1 -1
  281. package/adminWww/assets/Instances-YdaGnS5a-v74.js +1 -1
  282. package/adminWww/assets/Instances-YdaGnS5a-v75.js +1 -1
  283. package/adminWww/assets/Instances-YdaGnS5a-v76.js +1 -2
  284. package/adminWww/assets/Instances-YdaGnS5a-v77.js +1 -0
  285. package/adminWww/assets/Instances-YdaGnS5a-v78.js +1 -0
  286. package/adminWww/assets/Instances-YdaGnS5a-v79.js +2 -0
  287. package/adminWww/assets/Intro-DkwRiz1n-v54.js +1 -1
  288. package/adminWww/assets/Intro-DkwRiz1n-v55.js +1 -1
  289. package/adminWww/assets/Intro-DkwRiz1n-v56.js +1 -1
  290. package/adminWww/assets/Intro-DkwRiz1n-v57.js +1 -1
  291. package/adminWww/assets/Intro-DkwRiz1n-v58.js +1 -1
  292. package/adminWww/assets/Intro-DkwRiz1n-v59.js +1 -1
  293. package/adminWww/assets/Intro-DkwRiz1n-v60.js +1 -1
  294. package/adminWww/assets/Intro-DkwRiz1n-v61.js +1 -1
  295. package/adminWww/assets/Intro-DkwRiz1n-v62.js +1 -1
  296. package/adminWww/assets/Intro-DkwRiz1n-v63.js +1 -1
  297. package/adminWww/assets/Intro-DkwRiz1n-v64.js +1 -1
  298. package/adminWww/assets/Intro-DkwRiz1n-v65.js +1 -1
  299. package/adminWww/assets/Intro-DkwRiz1n-v66.js +1 -1
  300. package/adminWww/assets/Intro-DkwRiz1n-v67.js +1 -1
  301. package/adminWww/assets/Intro-DkwRiz1n-v68.js +1 -1
  302. package/adminWww/assets/Intro-DkwRiz1n-v69.js +1 -1
  303. package/adminWww/assets/Intro-DkwRiz1n-v70.js +1 -1
  304. package/adminWww/assets/Intro-DkwRiz1n-v71.js +1 -1
  305. package/adminWww/assets/Intro-DkwRiz1n-v72.js +1 -1
  306. package/adminWww/assets/Intro-DkwRiz1n-v73.js +1 -1
  307. package/adminWww/assets/Intro-DkwRiz1n-v74.js +1 -1
  308. package/adminWww/assets/Intro-DkwRiz1n-v75.js +1 -1
  309. package/adminWww/assets/Intro-DkwRiz1n-v76.js +1 -2
  310. package/adminWww/assets/Intro-DkwRiz1n-v77.js +1 -0
  311. package/adminWww/assets/Intro-DkwRiz1n-v78.js +1 -0
  312. package/adminWww/assets/Intro-DkwRiz1n-v79.js +2 -0
  313. package/adminWww/assets/Logs-CsVPSLJH-v54.js +1 -1
  314. package/adminWww/assets/Logs-CsVPSLJH-v55.js +1 -1
  315. package/adminWww/assets/Logs-CsVPSLJH-v56.js +1 -1
  316. package/adminWww/assets/Logs-CsVPSLJH-v57.js +1 -1
  317. package/adminWww/assets/Logs-CsVPSLJH-v58.js +1 -1
  318. package/adminWww/assets/Logs-CsVPSLJH-v59.js +1 -1
  319. package/adminWww/assets/Logs-CsVPSLJH-v60.js +1 -1
  320. package/adminWww/assets/Logs-CsVPSLJH-v61.js +1 -1
  321. package/adminWww/assets/Logs-CsVPSLJH-v62.js +1 -1
  322. package/adminWww/assets/Logs-CsVPSLJH-v63.js +1 -1
  323. package/adminWww/assets/Logs-CsVPSLJH-v64.js +1 -1
  324. package/adminWww/assets/Logs-CsVPSLJH-v65.js +1 -1
  325. package/adminWww/assets/Logs-CsVPSLJH-v66.js +1 -1
  326. package/adminWww/assets/Logs-CsVPSLJH-v67.js +1 -1
  327. package/adminWww/assets/Logs-CsVPSLJH-v68.js +1 -1
  328. package/adminWww/assets/Logs-CsVPSLJH-v69.js +1 -1
  329. package/adminWww/assets/Logs-CsVPSLJH-v70.js +1 -1
  330. package/adminWww/assets/Logs-CsVPSLJH-v71.js +1 -1
  331. package/adminWww/assets/Logs-CsVPSLJH-v72.js +1 -1
  332. package/adminWww/assets/Logs-CsVPSLJH-v73.js +1 -1
  333. package/adminWww/assets/Logs-CsVPSLJH-v74.js +1 -1
  334. package/adminWww/assets/Logs-CsVPSLJH-v75.js +1 -1
  335. package/adminWww/assets/Logs-CsVPSLJH-v76.js +1 -1
  336. package/adminWww/assets/Logs-CsVPSLJH-v77.js +1 -0
  337. package/adminWww/assets/Logs-CsVPSLJH-v78.js +1 -0
  338. package/adminWww/assets/Logs-CsVPSLJH-v79.js +1 -0
  339. package/adminWww/assets/Objects-DPan0bzw-v54.js +1 -1
  340. package/adminWww/assets/Objects-DPan0bzw-v55.js +1 -1
  341. package/adminWww/assets/Objects-DPan0bzw-v56.js +1 -1
  342. package/adminWww/assets/Objects-DPan0bzw-v57.js +1 -1
  343. package/adminWww/assets/Objects-DPan0bzw-v58.js +1 -1
  344. package/adminWww/assets/Objects-DPan0bzw-v59.js +1 -1
  345. package/adminWww/assets/Objects-DPan0bzw-v60.js +1 -1
  346. package/adminWww/assets/Objects-DPan0bzw-v61.js +1 -1
  347. package/adminWww/assets/Objects-DPan0bzw-v62.js +1 -1
  348. package/adminWww/assets/Objects-DPan0bzw-v63.js +1 -1
  349. package/adminWww/assets/Objects-DPan0bzw-v64.js +1 -1
  350. package/adminWww/assets/Objects-DPan0bzw-v65.js +1 -1
  351. package/adminWww/assets/Objects-DPan0bzw-v66.js +1 -1
  352. package/adminWww/assets/Objects-DPan0bzw-v67.js +1 -1
  353. package/adminWww/assets/Objects-DPan0bzw-v68.js +1 -1
  354. package/adminWww/assets/Objects-DPan0bzw-v69.js +1 -1
  355. package/adminWww/assets/Objects-DPan0bzw-v70.js +1 -1
  356. package/adminWww/assets/Objects-DPan0bzw-v71.js +1 -1
  357. package/adminWww/assets/Objects-DPan0bzw-v72.js +1 -1
  358. package/adminWww/assets/Objects-DPan0bzw-v73.js +1 -1
  359. package/adminWww/assets/Objects-DPan0bzw-v74.js +1 -1
  360. package/adminWww/assets/Objects-DPan0bzw-v75.js +1 -1
  361. package/adminWww/assets/Objects-DPan0bzw-v76.js +1 -878
  362. package/adminWww/assets/Objects-DPan0bzw-v77.js +1 -0
  363. package/adminWww/assets/Objects-DPan0bzw-v78.js +1 -0
  364. package/adminWww/assets/Objects-DPan0bzw-v79.js +878 -0
  365. package/adminWww/assets/Users-BgnBRgwU-v54.js +1 -1
  366. package/adminWww/assets/Users-BgnBRgwU-v55.js +1 -1
  367. package/adminWww/assets/Users-BgnBRgwU-v56.js +1 -1
  368. package/adminWww/assets/Users-BgnBRgwU-v57.js +1 -1
  369. package/adminWww/assets/Users-BgnBRgwU-v58.js +1 -1
  370. package/adminWww/assets/Users-BgnBRgwU-v59.js +1 -1
  371. package/adminWww/assets/Users-BgnBRgwU-v60.js +1 -1
  372. package/adminWww/assets/Users-BgnBRgwU-v61.js +1 -1
  373. package/adminWww/assets/Users-BgnBRgwU-v62.js +1 -1
  374. package/adminWww/assets/Users-BgnBRgwU-v63.js +1 -1
  375. package/adminWww/assets/Users-BgnBRgwU-v64.js +1 -1
  376. package/adminWww/assets/Users-BgnBRgwU-v65.js +1 -1
  377. package/adminWww/assets/Users-BgnBRgwU-v66.js +1 -1
  378. package/adminWww/assets/Users-BgnBRgwU-v67.js +1 -1
  379. package/adminWww/assets/Users-BgnBRgwU-v68.js +1 -1
  380. package/adminWww/assets/Users-BgnBRgwU-v69.js +1 -1
  381. package/adminWww/assets/Users-BgnBRgwU-v70.js +1 -1
  382. package/adminWww/assets/Users-BgnBRgwU-v71.js +1 -1
  383. package/adminWww/assets/Users-BgnBRgwU-v72.js +1 -1
  384. package/adminWww/assets/Users-BgnBRgwU-v73.js +1 -1
  385. package/adminWww/assets/Users-BgnBRgwU-v74.js +1 -1
  386. package/adminWww/assets/Users-BgnBRgwU-v75.js +1 -1
  387. package/adminWww/assets/Users-BgnBRgwU-v76.js +1 -1
  388. package/adminWww/assets/Users-BgnBRgwU-v77.js +1 -0
  389. package/adminWww/assets/Users-BgnBRgwU-v78.js +1 -0
  390. package/adminWww/assets/Users-BgnBRgwU-v79.js +1 -0
  391. package/adminWww/assets/bootstrap-COulQZax-v54.js +1 -1
  392. package/adminWww/assets/bootstrap-COulQZax-v55.js +1 -1
  393. package/adminWww/assets/bootstrap-COulQZax-v56.js +1 -1
  394. package/adminWww/assets/bootstrap-COulQZax-v57.js +1 -1
  395. package/adminWww/assets/bootstrap-COulQZax-v58.js +1 -1
  396. package/adminWww/assets/bootstrap-COulQZax-v59.js +1 -1
  397. package/adminWww/assets/bootstrap-COulQZax-v60.js +1 -1
  398. package/adminWww/assets/bootstrap-COulQZax-v61.js +1 -1
  399. package/adminWww/assets/bootstrap-COulQZax-v62.js +1 -1
  400. package/adminWww/assets/bootstrap-COulQZax-v63.js +1 -1
  401. package/adminWww/assets/bootstrap-COulQZax-v64.js +1 -1
  402. package/adminWww/assets/bootstrap-COulQZax-v65.js +1 -1
  403. package/adminWww/assets/bootstrap-COulQZax-v66.js +1 -1
  404. package/adminWww/assets/bootstrap-COulQZax-v67.js +1 -1
  405. package/adminWww/assets/bootstrap-COulQZax-v68.js +1 -1
  406. package/adminWww/assets/bootstrap-COulQZax-v69.js +1 -1
  407. package/adminWww/assets/bootstrap-COulQZax-v70.js +1 -1
  408. package/adminWww/assets/bootstrap-COulQZax-v71.js +1 -1
  409. package/adminWww/assets/bootstrap-COulQZax-v72.js +1 -1
  410. package/adminWww/assets/bootstrap-COulQZax-v73.js +1 -1
  411. package/adminWww/assets/bootstrap-COulQZax-v74.js +1 -1
  412. package/adminWww/assets/bootstrap-COulQZax-v75.js +1 -1
  413. package/adminWww/assets/bootstrap-COulQZax-v76.js +1 -317
  414. package/adminWww/assets/bootstrap-COulQZax-v77.js +1 -0
  415. package/adminWww/assets/bootstrap-COulQZax-v78.js +1 -0
  416. package/adminWww/assets/bootstrap-COulQZax-v79.js +317 -0
  417. package/adminWww/assets/hostInit-v54.js +1 -1
  418. package/adminWww/assets/hostInit-v55.js +1 -1
  419. package/adminWww/assets/hostInit-v56.js +1 -1
  420. package/adminWww/assets/hostInit-v57.js +1 -1
  421. package/adminWww/assets/hostInit-v58.js +1 -1
  422. package/adminWww/assets/hostInit-v59.js +1 -1
  423. package/adminWww/assets/hostInit-v60.js +1 -1
  424. package/adminWww/assets/hostInit-v61.js +1 -1
  425. package/adminWww/assets/hostInit-v62.js +1 -1
  426. package/adminWww/assets/hostInit-v63.js +1 -1
  427. package/adminWww/assets/hostInit-v64.js +1 -1
  428. package/adminWww/assets/hostInit-v65.js +1 -1
  429. package/adminWww/assets/hostInit-v66.js +1 -1
  430. package/adminWww/assets/hostInit-v67.js +1 -1
  431. package/adminWww/assets/hostInit-v68.js +1 -1
  432. package/adminWww/assets/hostInit-v69.js +1 -1
  433. package/adminWww/assets/hostInit-v70.js +1 -1
  434. package/adminWww/assets/hostInit-v71.js +1 -1
  435. package/adminWww/assets/hostInit-v72.js +1 -1
  436. package/adminWww/assets/hostInit-v73.js +1 -1
  437. package/adminWww/assets/hostInit-v74.js +1 -1
  438. package/adminWww/assets/hostInit-v75.js +1 -1
  439. package/adminWww/assets/hostInit-v76.js +1 -2
  440. package/adminWww/assets/hostInit-v77.js +1 -0
  441. package/adminWww/assets/hostInit-v78.js +1 -0
  442. package/adminWww/assets/hostInit-v79.js +2 -0
  443. package/adminWww/assets/index-CQZugZ1z-v54.js +1 -1
  444. package/adminWww/assets/index-CQZugZ1z-v55.js +1 -1
  445. package/adminWww/assets/index-CQZugZ1z-v56.js +1 -1
  446. package/adminWww/assets/index-CQZugZ1z-v57.js +1 -1
  447. package/adminWww/assets/index-CQZugZ1z-v58.js +1 -1
  448. package/adminWww/assets/index-CQZugZ1z-v59.js +1 -1
  449. package/adminWww/assets/index-CQZugZ1z-v60.js +1 -1
  450. package/adminWww/assets/index-CQZugZ1z-v61.js +1 -1
  451. package/adminWww/assets/index-CQZugZ1z-v62.js +1 -1
  452. package/adminWww/assets/index-CQZugZ1z-v63.js +1 -1
  453. package/adminWww/assets/index-CQZugZ1z-v64.js +1 -1
  454. package/adminWww/assets/index-CQZugZ1z-v65.js +1 -1
  455. package/adminWww/assets/index-CQZugZ1z-v66.js +1 -1
  456. package/adminWww/assets/index-CQZugZ1z-v67.js +1 -1
  457. package/adminWww/assets/index-CQZugZ1z-v68.js +1 -1
  458. package/adminWww/assets/index-CQZugZ1z-v69.js +1 -1
  459. package/adminWww/assets/index-CQZugZ1z-v70.js +1 -1
  460. package/adminWww/assets/index-CQZugZ1z-v71.js +1 -1
  461. package/adminWww/assets/index-CQZugZ1z-v72.js +1 -1
  462. package/adminWww/assets/index-CQZugZ1z-v73.js +1 -1
  463. package/adminWww/assets/index-CQZugZ1z-v74.js +1 -1
  464. package/adminWww/assets/index-CQZugZ1z-v75.js +1 -1
  465. package/adminWww/assets/index-CQZugZ1z-v76.js +1 -2
  466. package/adminWww/assets/index-CQZugZ1z-v77.js +1 -0
  467. package/adminWww/assets/index-CQZugZ1z-v78.js +1 -0
  468. package/adminWww/assets/index-CQZugZ1z-v79.js +2 -0
  469. package/adminWww/assets/index-D2ymscJA-v54.js +1 -1
  470. package/adminWww/assets/index-D2ymscJA-v55.js +1 -1
  471. package/adminWww/assets/index-D2ymscJA-v56.js +1 -1
  472. package/adminWww/assets/index-D2ymscJA-v57.js +1 -1
  473. package/adminWww/assets/index-D2ymscJA-v58.js +1 -1
  474. package/adminWww/assets/index-D2ymscJA-v59.js +1 -1
  475. package/adminWww/assets/index-D2ymscJA-v60.js +1 -1
  476. package/adminWww/assets/index-D2ymscJA-v61.js +1 -1
  477. package/adminWww/assets/index-D2ymscJA-v62.js +1 -1
  478. package/adminWww/assets/index-D2ymscJA-v63.js +1 -1
  479. package/adminWww/assets/index-D2ymscJA-v64.js +1 -1
  480. package/adminWww/assets/index-D2ymscJA-v65.js +1 -1
  481. package/adminWww/assets/index-D2ymscJA-v66.js +1 -1
  482. package/adminWww/assets/index-D2ymscJA-v67.js +1 -1
  483. package/adminWww/assets/index-D2ymscJA-v68.js +1 -1
  484. package/adminWww/assets/index-D2ymscJA-v69.js +1 -1
  485. package/adminWww/assets/index-D2ymscJA-v70.js +1 -1
  486. package/adminWww/assets/index-D2ymscJA-v71.js +1 -1
  487. package/adminWww/assets/index-D2ymscJA-v72.js +1 -1
  488. package/adminWww/assets/index-D2ymscJA-v73.js +1 -1
  489. package/adminWww/assets/index-D2ymscJA-v74.js +1 -1
  490. package/adminWww/assets/index-D2ymscJA-v75.js +1 -1
  491. package/adminWww/assets/index-D2ymscJA-v76.js +1 -950
  492. package/adminWww/assets/index-D2ymscJA-v77.js +1 -0
  493. package/adminWww/assets/index-D2ymscJA-v78.js +1 -0
  494. package/adminWww/assets/index-D2ymscJA-v79.js +950 -0
  495. package/adminWww/assets/sentry-B7YeoTAx-v54.js +1 -0
  496. package/adminWww/assets/sentry-B7YeoTAx-v55.js +1 -0
  497. package/adminWww/assets/sentry-B7YeoTAx-v56.js +1 -0
  498. package/adminWww/assets/sentry-B7YeoTAx-v57.js +1 -0
  499. package/adminWww/assets/sentry-B7YeoTAx-v58.js +1 -0
  500. package/adminWww/assets/sentry-B7YeoTAx-v59.js +1 -0
  501. package/adminWww/assets/sentry-B7YeoTAx-v60.js +1 -0
  502. package/adminWww/assets/sentry-B7YeoTAx-v61.js +1 -0
  503. package/adminWww/assets/sentry-B7YeoTAx-v62.js +1 -0
  504. package/adminWww/assets/sentry-B7YeoTAx-v63.js +1 -0
  505. package/adminWww/assets/sentry-B7YeoTAx-v64.js +1 -0
  506. package/adminWww/assets/sentry-B7YeoTAx-v65.js +1 -0
  507. package/adminWww/assets/sentry-B7YeoTAx-v66.js +1 -0
  508. package/adminWww/assets/sentry-B7YeoTAx-v67.js +1 -0
  509. package/adminWww/assets/sentry-B7YeoTAx-v68.js +1 -0
  510. package/adminWww/assets/sentry-B7YeoTAx-v69.js +1 -0
  511. package/adminWww/assets/sentry-B7YeoTAx-v70.js +1 -0
  512. package/adminWww/assets/sentry-B7YeoTAx-v71.js +1 -1
  513. package/adminWww/assets/sentry-B7YeoTAx-v72.js +1 -1
  514. package/adminWww/assets/sentry-B7YeoTAx-v73.js +1 -1
  515. package/adminWww/assets/sentry-B7YeoTAx-v74.js +1 -1
  516. package/adminWww/assets/sentry-B7YeoTAx-v75.js +1 -1
  517. package/adminWww/assets/sentry-B7YeoTAx-v76.js +1 -1
  518. package/adminWww/assets/sentry-B7YeoTAx-v77.js +1 -0
  519. package/adminWww/assets/sentry-B7YeoTAx-v78.js +1 -0
  520. package/adminWww/assets/sentry-B7YeoTAx-v79.js +1 -0
  521. package/adminWww/css/eos-branding.css +25 -32
  522. package/adminWww/index.html +11 -11
  523. package/adminWww/js/eos-branding.js +1 -1
  524. package/adminWww/js/eos-console-quiet.js +1 -1
  525. package/adminWww/js/eos-manual-write-policy.js +338 -328
  526. package/adminWww/js/eos-objects-state-tools.js +1 -1
  527. package/adminWww/js/eos-policy-client.js +1 -1
  528. package/adminWww/js/eos-role-ui.js +1 -1
  529. package/adminWww/js/eos-security-ui.js +1 -1
  530. package/adminWww/mf-manifest.json +1 -1
  531. package/adminWww/remoteEntry-v54.js +1 -1
  532. package/adminWww/remoteEntry-v55.js +1 -1
  533. package/adminWww/remoteEntry-v56.js +1 -1
  534. package/adminWww/remoteEntry-v57.js +1 -1
  535. package/adminWww/remoteEntry-v58.js +1 -1
  536. package/adminWww/remoteEntry-v59.js +1 -1
  537. package/adminWww/remoteEntry-v60.js +1 -1
  538. package/adminWww/remoteEntry-v61.js +1 -1
  539. package/adminWww/remoteEntry-v62.js +1 -1
  540. package/adminWww/remoteEntry-v63.js +1 -1
  541. package/adminWww/remoteEntry-v64.js +1 -1
  542. package/adminWww/remoteEntry-v65.js +1 -1
  543. package/adminWww/remoteEntry-v66.js +1 -1
  544. package/adminWww/remoteEntry-v67.js +1 -1
  545. package/adminWww/remoteEntry-v68.js +1 -1
  546. package/adminWww/remoteEntry-v69.js +1 -1
  547. package/adminWww/remoteEntry-v70.js +1 -1
  548. package/adminWww/remoteEntry-v71.js +1 -1
  549. package/adminWww/remoteEntry-v72.js +1 -1
  550. package/adminWww/remoteEntry-v73.js +1 -1
  551. package/adminWww/remoteEntry-v74.js +1 -1
  552. package/adminWww/remoteEntry-v75.js +1 -1
  553. package/adminWww/remoteEntry-v76.js +1 -2
  554. package/adminWww/remoteEntry-v77.js +1 -0
  555. package/adminWww/remoteEntry-v78.js +1 -0
  556. package/adminWww/remoteEntry-v79.js +2 -0
  557. package/adminWww/remoteEntry.js +1 -1
  558. package/docs/MANUAL_DATAPOINT_WRITE_POLICY.md +16 -13
  559. package/io-package.json +13 -8
  560. package/package.json +2 -2
  561. package/tools/nexowatt-validate-package.cjs +7 -3
@@ -1,75 +1,129 @@
1
- /* NexoWatt EOS manual datapoint write policy v7.9.76 */
1
+ /* NexoWatt EOS manual datapoint write policy v7.9.79 */
2
2
  (function (root, factory) {
3
3
  'use strict';
4
4
  const api = factory();
5
5
  if (typeof module === 'object' && module.exports) module.exports = api;
6
6
  if (!root) return;
7
7
 
8
- root.NEXOWATT_EOS_MANUAL_WRITE_POLICY_VERSION = 'v76-universal-manual-write';
8
+ root.NEXOWATT_EOS_MANUAL_WRITE_POLICY_VERSION = 'v79-direct-control-runtime-fix';
9
+ root.NEXOWATT_EOS_MANUAL_WRITE_POLICY = api;
9
10
  root.NEXOWATT_EOS_GET_WRITE_BEHAVIOR = api.getWriteBehavior;
11
+ root.NEXOWATT_EOS_GET_DIRECT_WRITE_VALUE = api.getDirectWriteValue;
12
+ root.NEXOWATT_EOS_RESOLVE_DIRECT_WRITE_VALUE = api.resolveDirectWriteValue;
13
+ root.NEXOWATT_EOS_GET_EXPERT_ONLY_REASON = api.getExpertOnlyReason;
10
14
  root.NEXOWATT_EOS_IS_EXPERT_ONLY_STATE = api.isExpertOnlyState;
11
15
  root.NEXOWATT_EOS_COERCE_BOOLEAN = api.toBoolean;
16
+ root.NEXOWATT_EOS_PREPARE_MANUAL_EDITOR = api.prepareEditor;
17
+ root.NEXOWATT_EOS_PARSE_MANUAL_VALUE = api.parseEditorValue;
12
18
  root.NEXOWATT_EOS_WRITE_MANUAL_STATE = api.writeManualState;
13
- root.NEXOWATT_EOS_RESOLVE_EDITOR_TYPE = api.resolveEditorType;
14
- root.NEXOWATT_EOS_PREPARE_EDITOR_VALUE = api.prepareEditorValue;
15
- root.NEXOWATT_EOS_COERCE_WRITE_VALUE = api.coerceWriteValue;
16
- root.NEXOWATT_EOS_GET_DIRECT_WRITE_VALUE = api.getDirectWriteValue;
17
- root.NEXOWATT_EOS_GET_WRITE_LABEL = api.getWriteLabel;
18
- root.NEXOWATT_EOS_NORMALIZE_STATES = api.normalizeStates;
19
19
  })(typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : null, function () {
20
20
  'use strict';
21
21
 
22
- // Manual writes are serialized per datapoint. A second command is queued
23
- // instead of being silently dropped while the previous write is pending.
24
- const writeQueues = new Map();
22
+ const pendingWrites = new Map();
25
23
 
26
24
  const normalizeText = value => String(value == null ? '' : value)
27
25
  .normalize('NFKD')
28
26
  .replace(/[\u0300-\u036f]/g, '')
29
- .toLowerCase()
30
- .trim();
27
+ .toLowerCase();
31
28
 
32
29
  const flattenTranslatedText = value => {
33
30
  if (value == null) return '';
34
31
  if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);
35
- if (typeof value === 'object') return Object.values(value).map(flattenTranslatedText).filter(Boolean).join(' ');
32
+ if (Array.isArray(value)) return value.map(flattenTranslatedText).join(' ');
33
+ if (typeof value === 'object') return Object.values(value).map(flattenTranslatedText).join(' ');
36
34
  return '';
37
35
  };
38
36
 
39
- const getCommon = obj => (obj && obj.common && typeof obj.common === 'object' ? obj.common : {});
40
- const getNative = obj => (obj && obj.native && typeof obj.native === 'object' ? obj.native : {});
37
+ const normalizeCommonType = (obj, value) => {
38
+ const common = obj && obj.common ? obj.common : {};
39
+ const type = Array.isArray(common.type) ? common.type[0] : common.type;
40
+ if (['number', 'string', 'boolean', 'array', 'object', 'mixed', 'file', 'json'].includes(type)) return type;
41
+ if (Array.isArray(value)) return 'array';
42
+ if (value && typeof value === 'object') return 'object';
43
+ if (typeof value === 'number') return 'number';
44
+ if (typeof value === 'boolean') return 'boolean';
45
+ return 'string';
46
+ };
41
47
 
42
- const getExplicitValue = (obj, name) => {
43
- const common = getCommon(obj);
44
- const native = getNative(obj);
48
+ const normalizeStates = states => {
49
+ if (!states) return [];
50
+ if (Array.isArray(states)) return states.map((label, index) => ({ key: String(index), label: String(label) }));
51
+ if (typeof states === 'string') {
52
+ return states
53
+ .split(';')
54
+ .map(part => part.trim())
55
+ .filter(Boolean)
56
+ .map(part => {
57
+ const index = part.indexOf(':');
58
+ return index === -1
59
+ ? { key: part, label: part }
60
+ : { key: part.slice(0, index).trim(), label: part.slice(index + 1).trim() };
61
+ });
62
+ }
63
+ if (typeof states === 'object') {
64
+ return Object.entries(states).map(([key, label]) => ({ key, label: flattenTranslatedText(label) || key }));
65
+ }
66
+ return [];
67
+ };
68
+
69
+ const getExplicitExpertOnly = obj => {
70
+ const common = obj && obj.common ? obj.common : {};
71
+ const native = obj && obj.native ? obj.native : {};
45
72
  const custom = common.custom || {};
46
73
  const candidates = [
47
- common[name],
48
- native[name],
49
- native.nexowatt && native.nexowatt[name],
50
- custom.nexowatt && custom.nexowatt[name],
51
- custom['nexowatt.eos'] && custom['nexowatt.eos'][name],
52
- custom['eos-admin'] && custom['eos-admin'][name],
74
+ common.manualWriteExpertOnly,
75
+ common.expertOnly,
76
+ native.manualWriteExpertOnly,
77
+ native.nexowatt && native.nexowatt.manualWriteExpertOnly,
78
+ custom.nexowatt && custom.nexowatt.manualWriteExpertOnly,
79
+ custom['nexowatt.eos'] && custom['nexowatt.eos'].manualWriteExpertOnly,
80
+ custom['eos-admin'] && custom['eos-admin'].manualWriteExpertOnly,
53
81
  ];
54
82
  for (const value of candidates) {
55
- if (value !== undefined) return value;
83
+ if (typeof value === 'boolean') return value;
56
84
  }
57
85
  return undefined;
58
86
  };
59
87
 
60
- const getExplicitExpertOnly = obj => {
61
- const candidates = [getExplicitValue(obj, 'manualWriteExpertOnly'), getExplicitValue(obj, 'expertOnly')];
62
- for (const value of candidates) {
63
- if (typeof value === 'boolean') return value;
88
+ const getExplicitManualValue = (obj, name) => {
89
+ const common = obj && obj.common ? obj.common : {};
90
+ const native = obj && obj.native ? obj.native : {};
91
+ const custom = common.custom || {};
92
+ const sources = [
93
+ common,
94
+ native,
95
+ native.nexowatt || {},
96
+ custom.nexowatt || {},
97
+ custom['nexowatt.eos'] || {},
98
+ custom['eos-admin'] || {},
99
+ ];
100
+ for (const source of sources) {
101
+ if (source && Object.prototype.hasOwnProperty.call(source, name)) {
102
+ return { found: true, value: source[name] };
103
+ }
64
104
  }
65
- return undefined;
105
+ return { found: false, value: undefined };
66
106
  };
67
107
 
68
- const isExpertOnlyState = (id, obj) => {
108
+ const getExplicitBinaryOptions = obj => {
109
+ const off = getExplicitManualValue(obj, 'manualFalseValue');
110
+ const on = getExplicitManualValue(obj, 'manualTrueValue');
111
+ return off.found && on.found ? { off: off.value, on: on.value } : null;
112
+ };
113
+
114
+ const isInactiveTriggerValue = value => {
115
+ if (value == null || value === false || value === 0) return true;
116
+ if (typeof value !== 'string') return false;
117
+ const normalized = normalizeText(value).trim();
118
+ return ['', 'false', '0', 'off', 'no', 'nein', 'disabled', 'inactive', 'closed', 'stop', 'aus', 'null', '(null)'].includes(normalized);
119
+ };
120
+
121
+ const getExpertOnlyReason = (id, obj) => {
69
122
  const explicit = getExplicitExpertOnly(obj);
70
- if (explicit !== undefined) return explicit;
123
+ if (explicit === true) return 'explicit';
124
+ if (explicit === false) return '';
71
125
 
72
- const common = getCommon(obj);
126
+ const common = obj && obj.common ? obj.common : {};
73
127
  const role = normalizeText(common.role);
74
128
  const text = normalizeText([
75
129
  id,
@@ -80,10 +134,10 @@
80
134
  ].join(' '));
81
135
  const compact = text.replace(/[^a-z0-9]+/g, '');
82
136
 
83
- // Conservative safety policy for commands that can reset equipment,
84
- // open contactors or materially change charging/power/current limits.
85
- if (/^(?:level\.)?(?:power|current)(?:\.|$)/.test(role)) return true;
86
- if (/^(?:value\.)?(?:power|current)\.setpoint(?:\.|$)/.test(role)) return true;
137
+ // High-confidence safety classes only. Normal setpoints such as room
138
+ // temperatures remain available outside expert mode.
139
+ if (/^(?:level\.)?(?:power|current)(?:\.|$)/.test(role)) return 'power-or-current-command';
140
+ if (/^(?:value\.)?(?:power|current)\.(?:setpoint|limit|target|command)(?:\.|$)/.test(role)) return 'power-or-current-command';
87
141
 
88
142
  const exactRiskTokens = [
89
143
  'hardreset', 'softreset', 'factoryreset', 'factorydefault', 'reboot', 'restartdevice', 'shutdown',
@@ -95,332 +149,286 @@
95
149
  'ladeleistung', 'entladeleistung', 'ladestrom', 'stromlimit', 'leistungsgrenze',
96
150
  'leistungssollwert', 'einspeiselimit', 'ruecksetzen', 'neustart',
97
151
  ];
98
- if (exactRiskTokens.some(token => compact.includes(token))) return true;
152
+ if (exactRiskTokens.some(token => compact.includes(token))) return 'safety-command';
99
153
 
100
154
  const powerCommand = /(?:charge|charging|discharge|export|feedin|grid|netz|pv|lade|entlade|einspeise)[\s._/-]{0,6}(?:power|current|leistung|strom).{0,28}(?:limit|setpoint|target|command|override|control|grenze|soll|vorgabe)/;
101
155
  const inversePowerCommand = /(?:limit|setpoint|target|command|override|control|grenze|soll|vorgabe).{0,28}(?:charge|charging|discharge|export|feedin|grid|netz|pv|lade|entlade|einspeise|power|current|leistung|strom)/;
102
- return powerCommand.test(text) || inversePowerCommand.test(text);
156
+ if (powerCommand.test(text) || inversePowerCommand.test(text)) return 'power-or-current-command';
157
+ return '';
103
158
  };
104
159
 
160
+ const isExpertOnlyState = (id, obj) => Boolean(getExpertOnlyReason(id, obj));
161
+
105
162
  const toBoolean = value => {
106
163
  if (value === true || value === 1) return true;
107
164
  if (value === false || value === 0 || value == null) return false;
108
- const normalized = normalizeText(value);
109
- if (['true', '1', 'on', 'yes', 'ja', 'enabled', 'enable', 'active', 'start', 'open', 'ein', 'an'].includes(normalized)) return true;
110
- if (['false', '0', 'off', 'no', 'nein', 'disabled', 'disable', 'inactive', 'stop', 'closed', 'aus', '', 'null', '(null)'].includes(normalized)) return false;
165
+ const normalized = normalizeText(value).trim();
166
+ if (['true', '1', 'on', 'yes', 'ja', 'enabled', 'active', 'open', 'start', 'ein'].includes(normalized)) return true;
167
+ if (['false', '0', 'off', 'no', 'nein', 'disabled', 'inactive', 'closed', 'stop', 'aus', '', 'null', '(null)'].includes(normalized)) return false;
111
168
  return Boolean(value);
112
169
  };
113
170
 
114
- const normalizeSingleCommonType = value => {
115
- const type = normalizeText(value);
116
- if (type === 'int' || type === 'integer' || type === 'float' || type === 'double') return 'number';
117
- if (type === 'bool') return 'boolean';
118
- if (type === 'object' || type === 'array') return type;
119
- if (type === 'json') return 'json';
120
- if (type === 'number' || type === 'boolean' || type === 'string' || type === 'mixed' || type === 'file') return type;
121
- return '';
122
- };
123
-
124
- const normalizeCommonType = value => {
125
- if (Array.isArray(value)) {
126
- const types = [...new Set(value.map(normalizeSingleCommonType).filter(Boolean))];
127
- return types.length === 1 ? types[0] : types.length ? 'mixed' : '';
171
+ const parseNumber = value => {
172
+ if (typeof value === 'number') {
173
+ if (!Number.isFinite(value)) throw new Error('Ungültiger Zahlenwert');
174
+ return value;
128
175
  }
129
- return normalizeSingleCommonType(value);
130
- };
131
-
132
- const inferPrimitiveType = value => {
133
- if (Array.isArray(value)) return 'array';
134
- if (value !== null && typeof value === 'object') return 'object';
135
- if (typeof value === 'boolean') return 'boolean';
136
- if (typeof value === 'number') return 'number';
137
- if (typeof value === 'string') return 'string';
138
- return '';
176
+ const normalized = String(value == null ? '' : value).trim().replace(',', '.');
177
+ if (!normalized) throw new Error('Zahlenwert fehlt');
178
+ const parsed = Number(normalized);
179
+ if (!Number.isFinite(parsed)) throw new Error(`Ungültiger Zahlenwert: ${value}`);
180
+ return parsed;
139
181
  };
140
182
 
141
- const normalizeStates = states => {
142
- if (!states) return null;
143
- if (Array.isArray(states)) {
144
- const result = {};
145
- states.forEach((value, index) => { result[String(index)] = flattenTranslatedText(value); });
146
- return result;
147
- }
148
- if (typeof states === 'string') {
149
- const result = {};
150
- states.split(/[;,]/).map(part => part.trim()).filter(Boolean).forEach(part => {
151
- const separator = part.includes(':') ? ':' : part.includes('=') ? '=' : '';
152
- if (!separator) return;
153
- const index = part.indexOf(separator);
154
- const key = part.slice(0, index).trim();
155
- const label = part.slice(index + 1).trim();
156
- if (key) result[key] = label || key;
157
- });
158
- return Object.keys(result).length ? result : null;
159
- }
160
- if (typeof states === 'object') {
161
- const result = {};
162
- Object.keys(states).forEach(key => { result[String(key)] = flattenTranslatedText(states[key]); });
163
- return result;
183
+ const parseJson = value => {
184
+ if (value && typeof value === 'object') return value;
185
+ const text = String(value == null ? '' : value).trim();
186
+ if (!text) throw new Error('JSON-Wert fehlt');
187
+ try {
188
+ return JSON.parse(text);
189
+ } catch (error) {
190
+ throw new Error(`Ungültiges JSON: ${error && error.message ? error.message : error}`);
164
191
  }
165
- return null;
166
- };
167
-
168
- const resolveEditorType = (obj, currentValue, states) => {
169
- const common = getCommon(obj);
170
- const normalizedStates = normalizeStates(states || common.states);
171
- if (normalizedStates && Object.keys(normalizedStates).length) return 'states';
172
-
173
- const declared = normalizeCommonType(common.type);
174
- if (declared === 'file') return 'file';
175
- if (declared === 'object' || declared === 'array' || declared === 'json') return 'json';
176
- if (declared === 'number' || declared === 'boolean' || declared === 'string') return declared;
177
-
178
- const candidate = currentValue !== undefined && currentValue !== null ? currentValue : common.def;
179
- const inferred = inferPrimitiveType(candidate);
180
- if (inferred === 'object' || inferred === 'array') return 'json';
181
- if (inferred) return inferred;
182
- return 'string';
183
192
  };
184
193
 
185
- const stringifyJsonValue = value => {
186
- if (typeof value === 'string') {
194
+ const castStateKey = (key, type) => {
195
+ if (type === 'number') return parseNumber(key);
196
+ if (type === 'boolean') return toBoolean(key);
197
+ if (type === 'mixed') {
198
+ const text = String(key).trim();
199
+ if (/^(true|false|on|off|yes|no|ja|nein|1|0)$/i.test(text)) return toBoolean(text);
200
+ if (/^[+-]?(?:\d+\.?\d*|\.\d+)$/.test(text.replace(',', '.'))) return parseNumber(text);
187
201
  try {
188
- return JSON.stringify(JSON.parse(value), null, 2);
202
+ if (/^[\[{]/.test(text)) return JSON.parse(text);
189
203
  } catch {
190
- return value;
204
+ // keep as text
191
205
  }
206
+ return text;
192
207
  }
193
- if (value === undefined || value === null) return '';
194
- try {
195
- return JSON.stringify(value, null, 2);
196
- } catch {
197
- return String(value);
198
- }
199
- };
200
-
201
- const isNumberInRange = (value, common) => {
202
- if (value === '') return false;
203
- const number = Number(typeof value === 'string' ? value.trim().replace(',', '.') : value);
204
- if (!Number.isFinite(number)) return false;
205
- if (typeof common.min === 'number' && number < common.min) return false;
206
- if (typeof common.max === 'number' && number > common.max) return false;
207
- return true;
208
+ return String(key);
208
209
  };
209
210
 
210
- const prepareEditorValue = (obj, currentValue, states) => {
211
- const common = getCommon(obj);
212
- const type = resolveEditorType(obj, currentValue, states);
213
- const hasCurrentValue = currentValue !== undefined && currentValue !== null;
214
- const hasDefault = common.def !== undefined && common.def !== null;
215
- let value = hasCurrentValue ? currentValue : hasDefault ? common.def : undefined;
216
- let valid = true;
217
-
218
- if (type === 'number') {
219
- if (value === undefined || value === '') {
220
- value = '';
221
- valid = false;
222
- } else {
223
- const normalized = typeof value === 'string' ? value.trim().replace(',', '.') : value;
224
- const parsed = Number(normalized);
225
- if (Number.isFinite(parsed)) {
226
- value = parsed;
227
- valid = isNumberInRange(parsed, common);
228
- } else {
229
- value = String(value);
230
- valid = false;
231
- }
232
- }
233
- } else if (type === 'boolean') {
234
- value = toBoolean(value);
235
- } else if (type === 'json') {
236
- const declared = normalizeCommonType(common.type);
237
- if (value === undefined) value = declared === 'array' ? '[]' : declared === 'object' ? '{}' : '';
238
- value = stringifyJsonValue(value);
211
+ const sameValue = (left, right) => {
212
+ if (Object.is(left, right)) return true;
213
+ if (left == null || right == null) return left == null && right == null;
214
+ if (typeof left === 'object' || typeof right === 'object') {
239
215
  try {
240
- JSON.parse(value);
241
- valid = true;
216
+ return JSON.stringify(left) === JSON.stringify(right);
242
217
  } catch {
243
- valid = false;
218
+ return false;
244
219
  }
245
- } else if (type === 'states') {
246
- value = value === undefined ? '' : value;
247
- const normalizedStates = normalizeStates(states || common.states) || {};
248
- valid = value !== '' && Object.prototype.hasOwnProperty.call(normalizedStates, String(value));
249
- } else {
250
- value = value === undefined ? '' : String(value);
251
220
  }
221
+ return String(left) === String(right);
222
+ };
252
223
 
253
- return { type, value, propsValue: value, valid };
224
+ const sameTypedValue = (left, right, type) => {
225
+ if (type === 'boolean') return toBoolean(left) === toBoolean(right);
226
+ if (type === 'number') {
227
+ try { return parseNumber(left) === parseNumber(right); } catch { return sameValue(left, right); }
228
+ }
229
+ if (type === 'mixed') {
230
+ if (typeof right === 'boolean') return toBoolean(left) === right;
231
+ if (typeof right === 'number') {
232
+ try { return parseNumber(left) === right; } catch { return false; }
233
+ }
234
+ }
235
+ return sameValue(left, right);
254
236
  };
255
237
 
256
- const parseNumber = (value, common) => {
257
- if (value === null || value === 'null') return null;
258
- const normalized = typeof value === 'string' ? value.trim().replace(',', '.') : value;
259
- if (normalized === '') throw new Error('Der Zahlenwert darf nicht leer sein.');
260
- const number = Number(normalized);
261
- if (!Number.isFinite(number)) throw new Error(`Ungültiger Zahlenwert: ${String(value)}`);
262
- if (typeof common.min === 'number' && number < common.min) throw new Error(`Wert liegt unter dem Minimum ${common.min}.`);
263
- if (typeof common.max === 'number' && number > common.max) throw new Error(`Wert liegt über dem Maximum ${common.max}.`);
264
- return number;
238
+ const optionScore = (option, mode) => {
239
+ const text = normalizeText(`${option.key} ${option.label}`).replace(/[^a-z0-9]+/g, ' ');
240
+ const offWords = ['false', '0', 'off', 'no', 'nein', 'disabled', 'inactive', 'closed', 'stop', 'aus'];
241
+ const onWords = ['true', '1', 'on', 'yes', 'ja', 'enabled', 'active', 'open', 'start', 'ein'];
242
+ const words = mode === 'on' ? onWords : offWords;
243
+ return words.reduce((score, word) => score + (new RegExp(`(?:^|\\s)${word}(?:\\s|$)`).test(text) ? 10 : 0), 0);
265
244
  };
266
245
 
267
- const parseJsonStateValue = (value, declared) => {
268
- const raw = value == null ? '' : typeof value === 'string' ? value : JSON.stringify(value);
269
- if (!raw.trim()) throw new Error('Der JSON-Wert darf nicht leer sein.');
270
- const parsed = JSON.parse(raw);
271
- if (declared === 'array' && !Array.isArray(parsed)) throw new Error('Der Datenpunkt erwartet ein JSON-Array.');
272
- if (declared === 'object' && (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))) {
273
- throw new Error('Der Datenpunkt erwartet ein JSON-Objekt.');
246
+ const getBinaryOptions = obj => {
247
+ const common = obj && obj.common ? obj.common : {};
248
+ const explicit = getExplicitBinaryOptions(obj);
249
+ if (explicit) return explicit;
250
+ const type = normalizeCommonType(obj);
251
+ const entries = normalizeStates(common.states);
252
+ if (entries.length > 2) return null;
253
+ if (entries.length === 2) {
254
+ const typed = entries.map(entry => ({ ...entry, value: castStateKey(entry.key, type) }));
255
+ const firstOff = optionScore(typed[0], 'off');
256
+ const firstOn = optionScore(typed[0], 'on');
257
+ const secondOff = optionScore(typed[1], 'off');
258
+ const secondOn = optionScore(typed[1], 'on');
259
+ if (firstOn > firstOff && secondOff >= secondOn) return { off: typed[1].value, on: typed[0].value };
260
+ if (secondOn > secondOff && firstOff >= firstOn) return { off: typed[0].value, on: typed[1].value };
261
+ return { off: typed[0].value, on: typed[1].value };
274
262
  }
275
- // ioBroker StateValue is scalar. Structured values are therefore stored
276
- // as a validated JSON string instead of passing an unsupported object.
277
- return raw;
263
+ if (type === 'boolean') return { off: false, on: true };
264
+ if (type === 'number') {
265
+ const off = typeof common.min === 'number' ? common.min : 0;
266
+ let on = typeof common.max === 'number' ? common.max : 1;
267
+ if (sameValue(off, on)) on = off === 0 ? 1 : 0;
268
+ return { off, on };
269
+ }
270
+ if (type === 'string') return { off: 'false', on: 'true' };
271
+ if (type === 'mixed') return { off: false, on: true };
272
+ return null;
278
273
  };
279
274
 
280
- const coerceByDeclaredType = (obj, value, currentValue) => {
281
- const common = getCommon(obj);
282
- const declared = normalizeCommonType(common.type);
283
- if (value && typeof value === 'object' && Object.prototype.hasOwnProperty.call(value, 'value')) value = value.value;
284
-
285
- if (declared === 'number') return parseNumber(value, common);
286
- if (declared === 'boolean') return value === null || value === 'null' ? null : toBoolean(value);
287
- if (declared === 'string') return value === null ? '' : String(value);
288
- if (declared === 'object' || declared === 'array' || declared === 'json') return parseJsonStateValue(value, declared);
289
-
290
- // mixed or missing type: preserve the current/default primitive type where possible.
291
- const candidate = currentValue !== undefined && currentValue !== null ? currentValue : common.def;
292
- const inferred = inferPrimitiveType(candidate);
293
- if (inferred === 'number') return parseNumber(value, common);
294
- if (inferred === 'boolean') return value === null || value === 'null' ? null : toBoolean(value);
295
- if (inferred === 'object' || inferred === 'array') return parseJsonStateValue(value, inferred);
296
- if (typeof value === 'string' && value.trim() === 'null') return null;
297
- return value == null ? '' : value;
275
+ const isButtonState = (obj, item) => {
276
+ const common = obj && obj.common ? obj.common : {};
277
+ const role = normalizeText(common.role);
278
+ const data = item && item.data ? item.data : {};
279
+ return Boolean(data.button) || role === 'button' || role.startsWith('button.') || role === 'action' || role.startsWith('action.');
298
280
  };
299
281
 
300
- const coerceStateKey = (obj, value, currentValue) => {
301
- const raw = value && typeof value === 'object' && Object.prototype.hasOwnProperty.call(value, 'value') ? value.value : value;
302
- return coerceByDeclaredType(obj, raw, currentValue);
282
+ const isSwitchState = (obj, item) => {
283
+ const common = obj && obj.common ? obj.common : {};
284
+ const role = normalizeText(common.role);
285
+ const data = item && item.data ? item.data : {};
286
+ const requested = Boolean(data.switch) || role === 'switch' || role.startsWith('switch.') || normalizeCommonType(obj) === 'boolean';
287
+ return requested && Boolean(getBinaryOptions(obj));
303
288
  };
304
289
 
305
- const coerceWriteValue = (obj, rawValue, editorType, originalType, currentValue) => {
306
- const common = getCommon(obj);
307
- if (common.write === false) throw new Error('common.write=false');
308
-
309
- if (editorType === 'states') return coerceStateKey(obj, rawValue, currentValue);
310
- if (editorType === 'number') return parseNumber(rawValue, common);
311
- if (editorType === 'boolean') return rawValue === null || rawValue === 'null' ? null : toBoolean(rawValue);
312
- if (editorType === 'json') return parseJsonStateValue(rawValue, normalizeCommonType(common.type));
313
- if (editorType === 'string') return rawValue == null ? '' : String(rawValue);
314
- return coerceByDeclaredType(obj, rawValue, currentValue);
290
+ const getWriteBehavior = (id, obj, item, expertMode) => {
291
+ if (!obj || obj.type !== 'state') return 'readonly';
292
+ const common = obj.common || {};
293
+ if (common.write === false) return 'readonly';
294
+ if (isExpertOnlyState(id, obj) && !expertMode) return 'expert-only';
295
+ if (normalizeCommonType(obj) === 'file') return 'file';
296
+ const explicitTrigger = getExplicitManualValue(obj, 'manualTriggerValue');
297
+ if (isButtonState(obj, item) && (explicitTrigger.found || common.def !== undefined || !['array', 'object'].includes(normalizeCommonType(obj)))) return 'button';
298
+ if (isSwitchState(obj, item)) return 'switch';
299
+ return 'dialog';
315
300
  };
316
301
 
317
- const booleanTokens = {
318
- true: ['true', '1', 'on', 'yes', 'ja', 'enabled', 'enable', 'active', 'start', 'open', 'ein', 'an'],
319
- false: ['false', '0', 'off', 'no', 'nein', 'disabled', 'disable', 'inactive', 'stop', 'closed', 'aus'],
302
+ const getDirectWriteValue = (id, obj, item, currentValue, behavior) => {
303
+ const common = obj && obj.common ? obj.common : {};
304
+ const type = normalizeCommonType(obj, currentValue);
305
+ const mode = behavior || getWriteBehavior(id, obj, item, true);
306
+ if (mode === 'button') {
307
+ const explicit = getExplicitManualValue(obj, 'manualTriggerValue');
308
+ if (explicit.found) return explicit.value;
309
+ // A default false/0/empty value describes the idle state of most
310
+ // ioBroker buttons (not the trigger payload). Only active defaults
311
+ // are allowed to become the command value.
312
+ if (common.def !== undefined && !isInactiveTriggerValue(common.def)) return common.def;
313
+ const options = getBinaryOptions(obj);
314
+ if (options) return options.on;
315
+ if (type === 'boolean') return true;
316
+ if (type === 'number') return 1;
317
+ if (type === 'string') return 'true';
318
+ if (type === 'mixed') return true;
319
+ if (common.def !== undefined) return common.def;
320
+ throw new Error(`Button-Datenpunkt ${id} benötigt einen expliziten Vorgabewert`);
321
+ }
322
+ if (mode === 'switch') {
323
+ const options = getBinaryOptions(obj);
324
+ if (!options) throw new Error(`Datenpunkt ${id} ist kein binärer Schalter`);
325
+ return sameTypedValue(currentValue, options.on, type) ? options.off : options.on;
326
+ }
327
+ throw new Error(`Direktes Schreiben ist für ${mode} nicht vorgesehen`);
320
328
  };
321
329
 
322
- const stringTogglePairs = [
323
- ['off', 'on'], ['false', 'true'], ['0', '1'], ['disabled', 'enabled'], ['disable', 'enable'],
324
- ['inactive', 'active'], ['stop', 'start'], ['closed', 'open'], ['aus', 'ein'], ['nein', 'ja'],
325
- ];
326
-
327
- const findBooleanStateKey = (states, desired) => {
328
- const normalized = normalizeStates(states);
329
- if (!normalized) return undefined;
330
- const tokens = desired ? booleanTokens.true : booleanTokens.false;
331
- for (const [key, label] of Object.entries(normalized)) {
332
- if (tokens.includes(normalizeText(key)) || tokens.includes(normalizeText(label))) return key;
330
+ const readFreshStateValue = async (socket, id, fallbackValue, timeoutMs = 1500) => {
331
+ if (!socket || typeof socket.getState !== 'function') return fallbackValue;
332
+ let timeoutHandle;
333
+ try {
334
+ const timeout = new Promise(resolve => {
335
+ timeoutHandle = setTimeout(() => resolve(null), timeoutMs);
336
+ });
337
+ const state = await Promise.race([Promise.resolve(socket.getState(id)), timeout]);
338
+ if (state && Object.prototype.hasOwnProperty.call(state, 'val')) return state.val;
339
+ } catch {
340
+ // A transient read failure must not block manual operation. The
341
+ // ObjectBrowser cache remains a safe fallback for the toggle.
342
+ } finally {
343
+ if (timeoutHandle) clearTimeout(timeoutHandle);
333
344
  }
334
- return undefined;
345
+ return fallbackValue;
335
346
  };
336
347
 
337
- const getStringToggleValue = (currentValue, desired) => {
338
- const raw = String(currentValue == null ? '' : currentValue).trim();
339
- const current = normalizeText(raw);
340
- let result = desired ? 'true' : 'false';
341
- for (const [falseToken, trueToken] of stringTogglePairs) {
342
- if (current === falseToken || current === trueToken) {
343
- result = desired ? trueToken : falseToken;
344
- break;
348
+ const resolveDirectWriteValue = async (socket, id, obj, item, currentValue, behavior) => {
349
+ const mode = behavior || getWriteBehavior(id, obj, item, true);
350
+ const effectiveValue = mode === 'switch'
351
+ ? await readFreshStateValue(socket, id, currentValue)
352
+ : currentValue;
353
+ return getDirectWriteValue(id, obj, item, effectiveValue, mode);
354
+ };
355
+
356
+ const inferEditorType = (obj, currentValue) => {
357
+ const common = obj && obj.common ? obj.common : {};
358
+ if (normalizeStates(common.states).length) return 'states';
359
+ const type = normalizeCommonType(obj, currentValue);
360
+ if (type === 'array' || type === 'object' || type === 'json') return 'json';
361
+ if (type === 'mixed') return 'json';
362
+ if (type === 'number' || type === 'boolean' || type === 'string') return type;
363
+ return 'string';
364
+ };
365
+
366
+ const prepareEditor = (obj, currentValue) => {
367
+ const editorType = inferEditorType(obj, currentValue);
368
+ const originalType = normalizeCommonType(obj, currentValue);
369
+ let value = currentValue;
370
+ if (editorType === 'json') {
371
+ if (typeof value === 'string') {
372
+ try {
373
+ value = JSON.stringify(JSON.parse(value), null, 2);
374
+ } catch {
375
+ value = originalType === 'mixed' ? JSON.stringify(value) : value;
376
+ }
377
+ } else {
378
+ value = JSON.stringify(value == null ? null : value, null, 2);
345
379
  }
380
+ } else if (editorType === 'number') {
381
+ value = value == null ? '' : value;
382
+ } else if (editorType === 'boolean') {
383
+ value = toBoolean(value);
384
+ } else if (editorType === 'string') {
385
+ value = value == null ? '' : String(value);
346
386
  }
347
- if (raw && raw === raw.toUpperCase()) return result.toUpperCase();
348
- if (raw && raw[0] === raw[0].toUpperCase() && raw.slice(1) === raw.slice(1).toLowerCase()) {
349
- return result.charAt(0).toUpperCase() + result.slice(1);
350
- }
351
- return result;
387
+ return {
388
+ editorType,
389
+ value,
390
+ originalType,
391
+ };
352
392
  };
353
393
 
354
- const getDirectWriteValue = (id, obj, item, behavior, currentValue) => {
355
- const common = getCommon(obj);
356
- const desired = behavior === 'button' ? true : !toBoolean(currentValue);
357
- const explicitName = behavior === 'button' ? 'manualTriggerValue' : desired ? 'manualTrueValue' : 'manualFalseValue';
358
- const explicit = getExplicitValue(obj, explicitName);
359
- if (explicit !== undefined) return coerceByDeclaredType(obj, explicit, currentValue);
394
+ const parseEditorValue = (obj, editorType, rawValue) => {
395
+ const common = obj && obj.common ? obj.common : {};
396
+ const originalType = normalizeCommonType(obj, rawValue);
397
+ let value = rawValue && typeof rawValue === 'object' && Object.prototype.hasOwnProperty.call(rawValue, 'value')
398
+ ? rawValue.value
399
+ : rawValue;
360
400
 
361
- const stateKey = findBooleanStateKey(common.states, desired);
362
- if (stateKey !== undefined) return coerceStateKey(obj, stateKey, currentValue);
401
+ if (editorType !== 'string' && value === 'null') return null;
363
402
 
364
- if (behavior === 'button' && common.def !== undefined && common.def !== null) {
365
- return coerceByDeclaredType(obj, common.def, currentValue);
403
+ if (editorType === 'states') {
404
+ value = castStateKey(value, originalType);
405
+ } else if (editorType === 'number') {
406
+ value = parseNumber(value);
407
+ } else if (editorType === 'boolean') {
408
+ value = toBoolean(value);
409
+ } else if (editorType === 'json') {
410
+ value = parseJson(value);
411
+ } else {
412
+ value = value == null ? '' : String(value);
366
413
  }
367
414
 
368
- const declared = normalizeCommonType(common.type);
369
- if (declared === 'number') {
370
- if (behavior === 'switch') {
371
- if (desired && typeof common.max === 'number') return common.max;
372
- if (!desired && typeof common.min === 'number') return common.min;
373
- }
374
- return desired ? 1 : 0;
375
- }
376
- if (declared === 'string') return getStringToggleValue(currentValue, desired);
377
- if (declared === 'object' || declared === 'array' || declared === 'json') {
378
- throw new Error('Objekt-/Array-Befehle müssen über den Wertdialog gesetzt werden.');
415
+ if (originalType === 'number' && typeof value !== 'number') value = parseNumber(value);
416
+ if (originalType === 'boolean' && typeof value !== 'boolean') value = toBoolean(value);
417
+ if (originalType === 'string' && typeof value !== 'string') value = String(value);
418
+ if (originalType === 'array') {
419
+ if (typeof value === 'string') value = parseJson(value);
420
+ if (!Array.isArray(value)) throw new Error('Der Datenpunkt erwartet ein JSON-Array');
379
421
  }
380
- if (declared === 'mixed') {
381
- if (typeof currentValue === 'number') return desired ? 1 : 0;
382
- if (typeof currentValue === 'string') return getStringToggleValue(currentValue, desired);
422
+ if (originalType === 'object') {
423
+ if (typeof value === 'string') value = parseJson(value);
424
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Der Datenpunkt erwartet ein JSON-Objekt');
383
425
  }
384
- return desired;
385
- };
386
426
 
387
- const getWriteBehavior = (id, obj, item, expertMode) => {
388
- if (!obj || obj.type !== 'state') return 'readonly';
389
- const common = getCommon(obj);
390
- if (common.write === false) return 'readonly';
391
- if (isExpertOnlyState(id, obj) && !expertMode) return 'expert-only';
392
- if (normalizeCommonType(common.type) === 'file') return 'file';
393
-
394
- const role = normalizeText(common.role);
395
- const data = item && item.data ? item.data : {};
396
- const declared = normalizeCommonType(common.type);
397
- const explicitControl = normalizeText(
398
- getExplicitValue(obj, 'manualWriteControl') !== undefined
399
- ? getExplicitValue(obj, 'manualWriteControl')
400
- : getExplicitValue(obj, 'manualControl'),
401
- );
402
- if (['button', 'trigger', 'action'].includes(explicitControl) && !['object', 'array', 'json'].includes(declared)) return 'button';
403
- if (['dialog', 'value', 'editor'].includes(explicitControl)) return 'dialog';
404
- if (['switch', 'toggle'].includes(explicitControl)) return 'switch';
405
-
406
- const normalizedStates = normalizeStates(common.states);
407
- const stateCount = normalizedStates ? Object.keys(normalizedStates).length : 0;
408
- const isButton = Boolean(data.button) || role === 'button' || role.startsWith('button.') || role === 'action' || role.startsWith('action.') || role === 'trigger' || role.startsWith('trigger.');
409
- if (isButton && declared !== 'object' && declared !== 'array' && declared !== 'json') return 'button';
410
- if (declared === 'boolean') return 'switch';
411
- // A numeric/string mode with more than two states is a selector, not a
412
- // toggle. Treating it as a switch would make only two of its values reachable.
413
- if ((Boolean(data.switch) || role === 'switch' || role.startsWith('switch.')) && stateCount <= 2) return 'switch';
414
- return 'dialog';
415
- };
416
-
417
- const getWriteLabel = (id, obj, behavior, expertMode, hasState) => {
418
- if (behavior === 'readonly') return 'Nur lesbar';
419
- if (behavior === 'expert-only') return 'Nur im Expertenmodus beschreibbar';
420
- if (behavior === 'button') return 'Befehl auslösen';
421
- if (behavior === 'switch') return 'Schalten';
422
- if (!hasState) return 'Wert setzen (schreibender Datenpunkt ohne aktuellen Lesewert)';
423
- return 'Wert bearbeiten';
427
+ if (typeof value === 'number') {
428
+ if (typeof common.min === 'number' && value < common.min) throw new Error(`Wert liegt unter dem Minimum ${common.min}`);
429
+ if (typeof common.max === 'number' && value > common.max) throw new Error(`Wert liegt über dem Maximum ${common.max}`);
430
+ }
431
+ return value;
424
432
  };
425
433
 
426
434
  const writeManualState = (socket, id, value) => {
@@ -429,41 +437,43 @@
429
437
  }
430
438
  const key = String(id || '');
431
439
  if (!key) return Promise.reject(new Error('Missing datapoint ID'));
432
- if (value === undefined) return Promise.reject(new Error(`Undefined is not a valid state value for ${key}`));
433
- if (value !== null && !['string', 'number', 'boolean'].includes(typeof value)) {
434
- return Promise.reject(new Error(`Unsupported state value type for ${key}: ${typeof value}`));
435
- }
436
440
 
437
- const previous = writeQueues.get(key) || Promise.resolve();
438
- const operation = previous.catch(() => undefined).then(() => {
439
- let timeoutHandle;
440
- const write = Promise.resolve().then(() => socket.setState(key, { val: value, ack: false, q: 0 }));
441
+ const previous = pendingWrites.get(key);
442
+ if (previous && sameValue(previous.value, value)) return previous.promise;
443
+
444
+ const predecessor = previous ? previous.promise.catch(() => undefined) : Promise.resolve();
445
+ let timeoutHandle;
446
+ const operation = predecessor.then(() => {
447
+ const write = Promise.resolve(socket.setState(key, { val: value, ack: false, q: 0 }));
441
448
  const timeout = new Promise((_, reject) => {
442
449
  timeoutHandle = setTimeout(() => reject(new Error(`Write timeout for ${key}`)), 15000);
443
450
  });
444
- return Promise.race([write, timeout]).finally(() => {
445
- if (timeoutHandle) clearTimeout(timeoutHandle);
446
- });
451
+ return Promise.race([write, timeout]);
447
452
  });
448
- const tail = operation.finally(() => {
449
- if (writeQueues.get(key) === tail) writeQueues.delete(key);
453
+ const promise = operation.finally(() => {
454
+ if (timeoutHandle) clearTimeout(timeoutHandle);
455
+ const active = pendingWrites.get(key);
456
+ if (active && active.promise === promise) pendingWrites.delete(key);
450
457
  });
451
- writeQueues.set(key, tail);
452
- return operation;
458
+ pendingWrites.set(key, { value, promise });
459
+ return promise;
453
460
  };
454
461
 
455
462
  return {
463
+ normalizeCommonType,
464
+ normalizeStates,
456
465
  getExplicitExpertOnly,
466
+ getExpertOnlyReason,
457
467
  isExpertOnlyState,
468
+ getBinaryOptions,
458
469
  getWriteBehavior,
459
- getWriteLabel,
460
- resolveEditorType,
461
- prepareEditorValue,
462
- coerceWriteValue,
463
470
  getDirectWriteValue,
471
+ resolveDirectWriteValue,
472
+ readFreshStateValue,
473
+ inferEditorType,
474
+ prepareEditor,
475
+ parseEditorValue,
464
476
  toBoolean,
465
477
  writeManualState,
466
- normalizeStates,
467
- normalizeCommonType,
468
478
  };
469
479
  });