iobroker.eos-admin 7.9.75 → 7.9.76
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.
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v54.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v55.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v56.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v57.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v58.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v59.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v60.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v61.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v62.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v63.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v64.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v65.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v66.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v67.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v68.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v69.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v70.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v71.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v72.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v73.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v74.js +1 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v75.js +1 -2
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v76.js +2 -0
- package/adminWww/assets/Adapters-B5_jQ7DE-v54.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v55.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v56.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v57.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v58.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v59.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v60.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v61.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v62.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v63.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v64.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v65.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v66.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v67.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v68.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v69.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v70.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v71.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v72.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v73.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v74.js +1 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v75.js +1 -9
- package/adminWww/assets/Adapters-B5_jQ7DE-v76.js +9 -0
- package/adminWww/assets/Config-hHK2UzGP-v54.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v55.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v56.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v57.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v58.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v59.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v60.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v61.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v62.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v63.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v64.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v65.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v66.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v67.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v68.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v69.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v70.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v71.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v72.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v73.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v74.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v75.js +1 -1
- package/adminWww/assets/Config-hHK2UzGP-v76.js +1 -0
- package/adminWww/assets/CustomTab-B0wqoazH-v54.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v55.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v56.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v57.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v58.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v59.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v60.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v61.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v62.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v63.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v64.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v65.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v66.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v67.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v68.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v69.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v70.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v71.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v72.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v73.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v74.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v75.js +1 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v76.js +1 -0
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v54.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v55.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v56.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v57.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v58.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v59.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v60.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v61.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v62.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v63.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v64.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v65.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v66.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v67.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v68.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v69.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v70.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v71.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v72.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v73.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v74.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v75.js +1 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v76.js +1 -0
- package/adminWww/assets/EasyMode-B1d9Vdc4-v54.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v55.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v56.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v57.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v58.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v59.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v60.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v61.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v62.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v63.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v64.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v65.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v66.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v67.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v68.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v69.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v70.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v71.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v72.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v73.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v74.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v75.js +1 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v76.js +1 -0
- package/adminWww/assets/Enums-DbWYxKOo-v54.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v55.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v56.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v57.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v58.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v59.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v60.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v61.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v62.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v63.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v64.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v65.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v66.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v67.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v68.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v69.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v70.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v71.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v72.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v73.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v74.js +1 -1
- package/adminWww/assets/Enums-DbWYxKOo-v75.js +1 -91
- package/adminWww/assets/Enums-DbWYxKOo-v76.js +91 -0
- package/adminWww/assets/Fields-CX3rKuWb-v54.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v55.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v56.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v57.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v58.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v59.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v60.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v61.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v62.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v63.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v64.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v65.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v66.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v67.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v68.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v69.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v70.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v71.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v72.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v73.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v74.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v75.js +1 -1
- package/adminWww/assets/Fields-CX3rKuWb-v76.js +1 -0
- package/adminWww/assets/Files-Cd2HOzIE-v54.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v55.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v56.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v57.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v58.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v59.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v60.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v61.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v62.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v63.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v64.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v65.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v66.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v67.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v68.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v69.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v70.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v71.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v72.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v73.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v74.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v75.js +1 -1
- package/adminWww/assets/Files-Cd2HOzIE-v76.js +1 -0
- package/adminWww/assets/Hosts-Bg8QzW5i-v54.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v55.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v56.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v57.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v58.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v59.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v60.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v61.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v62.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v63.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v64.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v65.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v66.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v67.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v68.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v69.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v70.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v71.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v72.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v73.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v74.js +1 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v75.js +1 -121
- package/adminWww/assets/Hosts-Bg8QzW5i-v76.js +121 -0
- package/adminWww/assets/Instances-YdaGnS5a-v54.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v55.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v56.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v57.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v58.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v59.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v60.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v61.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v62.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v63.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v64.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v65.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v66.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v67.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v68.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v69.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v70.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v71.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v72.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v73.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v74.js +1 -1
- package/adminWww/assets/Instances-YdaGnS5a-v75.js +1 -2
- package/adminWww/assets/Instances-YdaGnS5a-v76.js +2 -0
- package/adminWww/assets/Intro-DkwRiz1n-v54.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v55.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v56.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v57.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v58.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v59.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v60.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v61.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v62.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v63.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v64.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v65.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v66.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v67.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v68.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v69.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v70.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v71.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v72.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v73.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v74.js +1 -1
- package/adminWww/assets/Intro-DkwRiz1n-v75.js +1 -2
- package/adminWww/assets/Intro-DkwRiz1n-v76.js +2 -0
- package/adminWww/assets/Logs-CsVPSLJH-v54.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v55.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v56.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v57.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v58.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v59.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v60.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v61.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v62.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v63.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v64.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v65.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v66.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v67.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v68.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v69.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v70.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v71.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v72.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v73.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v74.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v75.js +1 -1
- package/adminWww/assets/Logs-CsVPSLJH-v76.js +1 -0
- package/adminWww/assets/Objects-DPan0bzw-v54.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v55.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v56.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v57.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v58.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v59.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v60.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v61.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v62.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v63.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v64.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v65.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v66.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v67.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v68.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v69.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v70.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v71.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v72.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v73.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v74.js +1 -1
- package/adminWww/assets/Objects-DPan0bzw-v75.js +1 -878
- package/adminWww/assets/Objects-DPan0bzw-v76.js +878 -0
- package/adminWww/assets/Users-BgnBRgwU-v54.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v55.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v56.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v57.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v58.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v59.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v60.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v61.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v62.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v63.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v64.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v65.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v66.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v67.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v68.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v69.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v70.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v71.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v72.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v73.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v74.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v75.js +1 -1
- package/adminWww/assets/Users-BgnBRgwU-v76.js +1 -0
- package/adminWww/assets/bootstrap-COulQZax-v54.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v55.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v56.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v57.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v58.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v59.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v60.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v61.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v62.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v63.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v64.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v65.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v66.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v67.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v68.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v69.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v70.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v71.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v72.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v73.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v74.js +1 -1
- package/adminWww/assets/bootstrap-COulQZax-v75.js +1 -317
- package/adminWww/assets/bootstrap-COulQZax-v76.js +317 -0
- package/adminWww/assets/hostInit-v54.js +1 -1
- package/adminWww/assets/hostInit-v55.js +1 -1
- package/adminWww/assets/hostInit-v56.js +1 -1
- package/adminWww/assets/hostInit-v57.js +1 -1
- package/adminWww/assets/hostInit-v58.js +1 -1
- package/adminWww/assets/hostInit-v59.js +1 -1
- package/adminWww/assets/hostInit-v60.js +1 -1
- package/adminWww/assets/hostInit-v61.js +1 -1
- package/adminWww/assets/hostInit-v62.js +1 -1
- package/adminWww/assets/hostInit-v63.js +1 -1
- package/adminWww/assets/hostInit-v64.js +1 -1
- package/adminWww/assets/hostInit-v65.js +1 -1
- package/adminWww/assets/hostInit-v66.js +1 -1
- package/adminWww/assets/hostInit-v67.js +1 -1
- package/adminWww/assets/hostInit-v68.js +1 -1
- package/adminWww/assets/hostInit-v69.js +1 -1
- package/adminWww/assets/hostInit-v70.js +1 -1
- package/adminWww/assets/hostInit-v71.js +1 -1
- package/adminWww/assets/hostInit-v72.js +1 -1
- package/adminWww/assets/hostInit-v73.js +1 -1
- package/adminWww/assets/hostInit-v74.js +1 -1
- package/adminWww/assets/hostInit-v75.js +1 -2
- package/adminWww/assets/hostInit-v76.js +2 -0
- package/adminWww/assets/index-CQZugZ1z-v54.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v55.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v56.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v57.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v58.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v59.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v60.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v61.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v62.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v63.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v64.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v65.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v66.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v67.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v68.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v69.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v70.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v71.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v72.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v73.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v74.js +1 -1
- package/adminWww/assets/index-CQZugZ1z-v75.js +1 -2
- package/adminWww/assets/index-CQZugZ1z-v76.js +2 -0
- package/adminWww/assets/index-D2ymscJA-v54.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v55.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v56.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v57.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v58.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v59.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v60.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v61.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v62.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v63.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v64.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v65.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v66.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v67.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v68.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v69.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v70.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v71.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v72.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v73.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v74.js +1 -1
- package/adminWww/assets/index-D2ymscJA-v75.js +1 -950
- package/adminWww/assets/index-D2ymscJA-v76.js +950 -0
- package/adminWww/assets/sentry-B7YeoTAx-v71.js +1 -1
- package/adminWww/assets/sentry-B7YeoTAx-v72.js +1 -1
- package/adminWww/assets/sentry-B7YeoTAx-v73.js +1 -1
- package/adminWww/assets/sentry-B7YeoTAx-v74.js +1 -1
- package/adminWww/assets/sentry-B7YeoTAx-v75.js +1 -1
- package/adminWww/assets/sentry-B7YeoTAx-v76.js +1 -0
- package/adminWww/css/eos-branding.css +39 -1
- package/adminWww/index.html +11 -11
- package/adminWww/js/eos-branding.js +1 -1
- package/adminWww/js/eos-console-quiet.js +1 -1
- package/adminWww/js/eos-manual-write-policy.js +367 -36
- package/adminWww/js/eos-objects-state-tools.js +1 -1
- package/adminWww/js/eos-policy-client.js +1 -1
- package/adminWww/js/eos-role-ui.js +1 -1
- package/adminWww/js/eos-security-ui.js +1 -1
- package/adminWww/mf-manifest.json +1 -1
- package/adminWww/remoteEntry-v54.js +1 -1
- package/adminWww/remoteEntry-v55.js +1 -1
- package/adminWww/remoteEntry-v56.js +1 -1
- package/adminWww/remoteEntry-v57.js +1 -1
- package/adminWww/remoteEntry-v58.js +1 -1
- package/adminWww/remoteEntry-v59.js +1 -1
- package/adminWww/remoteEntry-v60.js +1 -1
- package/adminWww/remoteEntry-v61.js +1 -1
- package/adminWww/remoteEntry-v62.js +1 -1
- package/adminWww/remoteEntry-v63.js +1 -1
- package/adminWww/remoteEntry-v64.js +1 -1
- package/adminWww/remoteEntry-v65.js +1 -1
- package/adminWww/remoteEntry-v66.js +1 -1
- package/adminWww/remoteEntry-v67.js +1 -1
- package/adminWww/remoteEntry-v68.js +1 -1
- package/adminWww/remoteEntry-v69.js +1 -1
- package/adminWww/remoteEntry-v70.js +1 -1
- package/adminWww/remoteEntry-v71.js +1 -1
- package/adminWww/remoteEntry-v72.js +1 -1
- package/adminWww/remoteEntry-v73.js +1 -1
- package/adminWww/remoteEntry-v74.js +1 -1
- package/adminWww/remoteEntry-v75.js +1 -2
- package/adminWww/remoteEntry-v76.js +2 -0
- package/adminWww/remoteEntry.js +1 -1
- package/io-package.json +9 -9
- package/package.json +1 -1
- package/tools/nexowatt-validate-package.cjs +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./sentry-B7YeoTAx-
|
|
1
|
+
export * from "./sentry-B7YeoTAx-v76.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./sentry-B7YeoTAx-
|
|
1
|
+
export * from "./sentry-B7YeoTAx-v76.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./sentry-B7YeoTAx-
|
|
1
|
+
export * from "./sentry-B7YeoTAx-v76.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./sentry-B7YeoTAx-
|
|
1
|
+
export * from "./sentry-B7YeoTAx-v76.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export * from "./sentry-B7YeoTAx-v76.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as s}from"./DefaultPropsProvider-BiXBMQYQ.js";import{i as f}from"./iobroker_admin__loadShare__react__loadShare__-LM7uyL45.js";import{a as t,i as h}from"./iobroker_admin__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__-CJO5yP3h.js";const p={},b={All:t.AllInclusive,messaging:t.Message,communication:t.WifiTethering,general:t.Apps,logic:t.VpnKey,alarm:t.NotificationsActive,"iot-systems":t.SystemUpdateAlt,"misc-data":t.EmojiSymbols,multimedia:t.PermMedia,network:t.SettingsEthernet,storage:t.Storage,visualization:t.Visibility,"climate-control":t.SettingsBrightness,"date-and-time":t.DateRange,energy:t.BatteryChargingFull,garden:t.FilterVintage,geoposition:t.LocationOn,hardware:t.Phonelink,health:t.Favorite,household:t.House,infrastructure:t.Apartment,lighting:t.EmojiObjects,protocols:t.DialerSip,utility:t.PhonelinkSetup,vehicle:t.AirportShuttle,"visualization-icons":t.BubbleChart,"visualization-widgets":t.Widgets,weather:t.Brightness6,metering:t.LinearScale};function x({iconName:d,className:a,adapter:n,socket:e,onClick:r,style:m}){const[_,g]=f.useState("");if(f.useEffect(()=>{n&&e&&(p[n]instanceof Promise||(p[n]=e.getObject(`system.adapter.${n}`)),p[n].then(o=>{var c;return((c=o==null?void 0:o.common)==null?void 0:c.icon)&&g(`../../adapter/${n}/${o.common.icon}`)}))},[n,e]),n)return s.jsx("img",{onClick:o=>r&&r(o),src:_||"",className:a,style:m,alt:""});const l=b[d]||t.Help;return s.jsx(l,{className:a,style:m,onClick:o=>r&&r(o)})}const y={button:{marginLeft:10,marginRight:10},icon:{marginRight:5}};function E({arrayItem:d,title:a,onClick:n,value:e,contained:r,buttonIcon:m,icons:_,t:g,translateSuffix:l,noTranslation:o}){const[c,u]=f.useState(null);return l=l||"",s.jsxs(s.Fragment,{children:[s.jsx(h.Tooltip,{title:a||"",slotProps:{popper:{sx:{pointerEvents:"none"}}},children:s.jsxs(h.Button,{style:y.button,variant:r?"contained":"outlined",color:"primary",onClick:i=>u(i.currentTarget),children:[m||_&&s.jsx(x,{iconName:e,style:y.icon}),typeof e=="number"||o?e:g(e+l)]})}),s.jsx(h.Menu,{anchorEl:c,open:!!c,disableScrollLock:!0,marginThreshold:8,anchorOrigin:{vertical:"bottom",horizontal:"left"},transformOrigin:{vertical:"top",horizontal:"left"},slotProps:{root:{className:"eos-module-filter-menu"},paper:{className:"eos-module-filter-menu-paper",sx:{minWidth:180,maxWidth:"min(420px, calc(100vw - 24px))",maxHeight:"min(70vh, 640px)",overflowY:"auto"}}},onClose:()=>u(null),children:d.map(({name:i},S)=>s.jsxs(h.MenuItem,{selected:e||e===0?i===e:S===0,disabled:e||e===0?i===e:S===0,className:`tag-card-${i}`,style:{placeContent:"space-between"},value:i,onClick:()=>{n(i),u(null)},children:[_&&s.jsx(x,{iconName:i,style:y.icon}),typeof i=="number"||o?i:g(i+l)]},i))})]})}const A="data:image/svg+xml,%3csvg%20viewBox='0%200%20256%20230'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M251.22%20187.856c5.785%2010.045%206.345%2020.608%201.538%2028.958-4.8%208.357-14.192%2013.143-25.768%2013.143h-21.816c.259-4.068.431-8.17.431-12.302%200-4.628-.215-9.198-.531-13.754l14.35-.014c3.528%200%206.38-2.867%206.38-6.403a6.46%206.46%200%200%200-.768-3.053l-91.46-158.97a6.349%206.349%200%200%200-5.54-3.24%206.374%206.374%200%200%200-5.461%203.09l-14.522%2025.243c44.134%2033.27%2073.804%2084.813%2077.864%20143.333.316%204.548.531%209.119.531%2013.753%200%204.132-.172%208.228-.424%2012.302h-71.246c.388-4.053.611-8.148.611-12.302%200-4.649-.273-9.233-.776-13.753-3.52-32.206-19.286-60.748-42.503-80.89l-10.003%2017.376c17.54%2016.325%2029.512%2038.558%2032.767%2063.514.59%204.505.92%209.09.92%2013.753%200%204.154-.273%208.264-.74%2012.302H29.01c-11.576%200-20.968-4.793-25.768-13.15-4.807-8.35-4.247-18.905%201.538-28.958l13.56-23.238a79.42%2079.42%200%200%201%2020.715%2016.052l-8.083%2013.768a6.523%206.523%200%200%200-.77%203.054%206.383%206.383%200%200%200%206.382%206.395l32.033.015c-2.687-15.356-9.772-29.21-19.918-40.183-5.979-6.445-12.963-11.9-20.738-16.074l35.77-62.15a151.427%20151.427%200%200%201%2021.564%2014.624c30.827%2025.013%2051.644%2061.955%2055.416%20103.776h19.172c-3.91-48.892-28.477-92.006-64.937-120.548a171.205%20171.205%200%200%200-21.672-14.457l30.532-53.045C109.583%205.77%20118.42%200%20128.036%200c9.607%200%2018.438%205.77%2024.223%2015.823l98.961%20172.033z'%20fill='%23FB2D26'/%3e%3c/svg%3e";export{E as C,x as M,A as s};
|
|
@@ -3764,7 +3764,7 @@ html.eos-objects-surface [data-eos-scalar-capture="1"]:hover {
|
|
|
3764
3764
|
box-shadow: inset 0 0 0 1px rgba(0, 255, 136, .30) !important;
|
|
3765
3765
|
}
|
|
3766
3766
|
|
|
3767
|
-
/* === NexoWatt EOS v7.9.
|
|
3767
|
+
/* === NexoWatt EOS v7.9.76: universal manual datapoint controls =========
|
|
3768
3768
|
Button/trigger and boolean switch states use the whole value cell as one
|
|
3769
3769
|
deterministic action target. Safety-relevant commands remain visible but
|
|
3770
3770
|
are locked outside expert mode. */
|
|
@@ -3811,3 +3811,41 @@ html .eos-object-value-cell[data-eos-expert-only="1"]:hover {
|
|
|
3811
3811
|
background: rgba(255, 177, 0, .11) !important;
|
|
3812
3812
|
box-shadow: inset 0 0 0 1px rgba(255, 177, 0, .25) !important;
|
|
3813
3813
|
}
|
|
3814
|
+
|
|
3815
|
+
/* === NexoWatt EOS v7.9.76: universal manual write surface ================
|
|
3816
|
+
Every declared writable state gets a deterministic full-cell hit target.
|
|
3817
|
+
Write-only states without a current read value show a visible placeholder.
|
|
3818
|
+
The object browser remains responsible for ACL and common.write semantics. */
|
|
3819
|
+
html.eos-app.eos-objects-surface .eos-object-value-cell[data-eos-object-writable="1"],
|
|
3820
|
+
html.eos-objects-surface .eos-object-value-cell[data-eos-object-writable="1"] {
|
|
3821
|
+
min-height: 32px !important;
|
|
3822
|
+
display: flex !important;
|
|
3823
|
+
align-items: center !important;
|
|
3824
|
+
width: 100% !important;
|
|
3825
|
+
box-sizing: border-box !important;
|
|
3826
|
+
pointer-events: auto !important;
|
|
3827
|
+
cursor: pointer !important;
|
|
3828
|
+
}
|
|
3829
|
+
html.eos-app.eos-objects-surface .eos-object-value-cell[data-eos-write-behavior="dialog"],
|
|
3830
|
+
html.eos-objects-surface .eos-object-value-cell[data-eos-write-behavior="dialog"] {
|
|
3831
|
+
cursor: text !important;
|
|
3832
|
+
}
|
|
3833
|
+
html.eos-app.eos-objects-surface .eos-write-placeholder,
|
|
3834
|
+
html.eos-objects-surface .eos-write-placeholder {
|
|
3835
|
+
display: inline-flex !important;
|
|
3836
|
+
align-items: center !important;
|
|
3837
|
+
min-height: 26px !important;
|
|
3838
|
+
padding: 0 8px !important;
|
|
3839
|
+
border: 1px dashed rgba(0, 255, 170, .42) !important;
|
|
3840
|
+
border-radius: 7px !important;
|
|
3841
|
+
color: rgba(226, 255, 246, .82) !important;
|
|
3842
|
+
background: rgba(0, 255, 170, .055) !important;
|
|
3843
|
+
font-size: 12px !important;
|
|
3844
|
+
line-height: 1.2 !important;
|
|
3845
|
+
pointer-events: none !important;
|
|
3846
|
+
}
|
|
3847
|
+
html.eos-app.eos-objects-surface .eos-object-value-cell[data-eos-object-writable="1"]:focus-visible,
|
|
3848
|
+
html.eos-objects-surface .eos-object-value-cell[data-eos-object-writable="1"]:focus-visible {
|
|
3849
|
+
outline: 2px solid rgba(0, 255, 170, .75) !important;
|
|
3850
|
+
outline-offset: -2px !important;
|
|
3851
|
+
}
|
package/adminWww/index.html
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate" />
|
|
8
8
|
<meta http-equiv="Pragma" content="no-cache" />
|
|
9
9
|
<meta http-equiv="Expires" content="0" />
|
|
10
|
-
<script src="./js/eos-console-quiet.js?v=
|
|
11
|
-
<script src="./js/eos-manual-write-policy.js?v=
|
|
12
|
-
<script type="module" src="./assets/hostInit-
|
|
10
|
+
<script src="./js/eos-console-quiet.js?v=76"></script>
|
|
11
|
+
<script src="./js/eos-manual-write-policy.js?v=76"></script>
|
|
12
|
+
<script type="module" src="./assets/hostInit-v76.js?v=76"></script>
|
|
13
13
|
|
|
14
14
|
<meta charset="utf-8" />
|
|
15
15
|
<link
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
rel="stylesheet"
|
|
37
37
|
href="css/leaflet.css"
|
|
38
38
|
/>
|
|
39
|
-
<link rel="stylesheet" href="./css/eos-branding.css?v=
|
|
39
|
+
<link rel="stylesheet" href="./css/eos-branding.css?v=76" />
|
|
40
40
|
<link
|
|
41
41
|
rel="manifest"
|
|
42
42
|
href="manifest.json"
|
|
@@ -156,15 +156,15 @@
|
|
|
156
156
|
false,
|
|
157
157
|
);
|
|
158
158
|
</script>
|
|
159
|
-
<script type="module" crossorigin src="./assets/index-CQZugZ1z-
|
|
159
|
+
<script type="module" crossorigin src="./assets/index-CQZugZ1z-v76.js?v=76"></script>
|
|
160
160
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-BDBacUwf.js">
|
|
161
161
|
<link rel="modulepreload" crossorigin href="./assets/iobroker_admin__mf_v__runtimeInit__mf_v__-g2X2zhAf.js">
|
|
162
|
-
<script defer src="./js/eos-policy-client.js?v=
|
|
163
|
-
<script defer src="./js/eos-branding.js?v=
|
|
164
|
-
<script defer src="./js/eos-security-ui.js?v=
|
|
165
|
-
<script defer src="./js/eos-role-ui.js?v=
|
|
166
|
-
<script defer src="./js/eos-assistant.js?v=
|
|
167
|
-
<script defer src="./js/eos-objects-state-tools.js?v=
|
|
162
|
+
<script defer src="./js/eos-policy-client.js?v=76"></script>
|
|
163
|
+
<script defer src="./js/eos-branding.js?v=76"></script>
|
|
164
|
+
<script defer src="./js/eos-security-ui.js?v=76"></script>
|
|
165
|
+
<script defer src="./js/eos-role-ui.js?v=76"></script>
|
|
166
|
+
<script defer src="./js/eos-assistant.js?v=76"></script>
|
|
167
|
+
<script defer src="./js/eos-objects-state-tools.js?v=76"></script>
|
|
168
168
|
</head>
|
|
169
169
|
<body>
|
|
170
170
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
|
-
window.NEXOWATT_EOS_CONSOLE_QUIET_VERSION = '
|
|
3
|
+
window.NEXOWATT_EOS_CONSOLE_QUIET_VERSION = 'v76-universal-manual-write';
|
|
4
4
|
// Diagnostic output is intentionally left untouched in the stability release.
|
|
5
5
|
// Suppressing broad console prefixes hid important performance and runtime clues.
|
|
6
6
|
window.NEXOWATT_EOS_RESTORE_CONSOLE = () => undefined;
|
|
@@ -1,45 +1,64 @@
|
|
|
1
|
-
/* NexoWatt EOS manual datapoint write policy v7.9.
|
|
1
|
+
/* NexoWatt EOS manual datapoint write policy v7.9.76 */
|
|
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 = '
|
|
8
|
+
root.NEXOWATT_EOS_MANUAL_WRITE_POLICY_VERSION = 'v76-universal-manual-write';
|
|
9
9
|
root.NEXOWATT_EOS_GET_WRITE_BEHAVIOR = api.getWriteBehavior;
|
|
10
10
|
root.NEXOWATT_EOS_IS_EXPERT_ONLY_STATE = api.isExpertOnlyState;
|
|
11
11
|
root.NEXOWATT_EOS_COERCE_BOOLEAN = api.toBoolean;
|
|
12
12
|
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;
|
|
13
19
|
})(typeof window !== 'undefined' ? window : typeof globalThis !== 'undefined' ? globalThis : null, function () {
|
|
14
20
|
'use strict';
|
|
15
21
|
|
|
16
|
-
|
|
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();
|
|
17
25
|
|
|
18
26
|
const normalizeText = value => String(value == null ? '' : value)
|
|
19
27
|
.normalize('NFKD')
|
|
20
28
|
.replace(/[\u0300-\u036f]/g, '')
|
|
21
|
-
.toLowerCase()
|
|
29
|
+
.toLowerCase()
|
|
30
|
+
.trim();
|
|
22
31
|
|
|
23
32
|
const flattenTranslatedText = value => {
|
|
24
33
|
if (value == null) return '';
|
|
25
34
|
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);
|
|
26
|
-
if (typeof value === 'object') return Object.values(value).map(flattenTranslatedText).join(' ');
|
|
35
|
+
if (typeof value === 'object') return Object.values(value).map(flattenTranslatedText).filter(Boolean).join(' ');
|
|
27
36
|
return '';
|
|
28
37
|
};
|
|
29
38
|
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
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 : {});
|
|
41
|
+
|
|
42
|
+
const getExplicitValue = (obj, name) => {
|
|
43
|
+
const common = getCommon(obj);
|
|
44
|
+
const native = getNative(obj);
|
|
33
45
|
const custom = common.custom || {};
|
|
34
46
|
const candidates = [
|
|
35
|
-
common
|
|
36
|
-
|
|
37
|
-
native.
|
|
38
|
-
|
|
39
|
-
custom.
|
|
40
|
-
custom['
|
|
41
|
-
custom['eos-admin'] && custom['eos-admin'].manualWriteExpertOnly,
|
|
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],
|
|
42
53
|
];
|
|
54
|
+
for (const value of candidates) {
|
|
55
|
+
if (value !== undefined) return value;
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const getExplicitExpertOnly = obj => {
|
|
61
|
+
const candidates = [getExplicitValue(obj, 'manualWriteExpertOnly'), getExplicitValue(obj, 'expertOnly')];
|
|
43
62
|
for (const value of candidates) {
|
|
44
63
|
if (typeof value === 'boolean') return value;
|
|
45
64
|
}
|
|
@@ -50,7 +69,7 @@
|
|
|
50
69
|
const explicit = getExplicitExpertOnly(obj);
|
|
51
70
|
if (explicit !== undefined) return explicit;
|
|
52
71
|
|
|
53
|
-
const common = obj
|
|
72
|
+
const common = getCommon(obj);
|
|
54
73
|
const role = normalizeText(common.role);
|
|
55
74
|
const text = normalizeText([
|
|
56
75
|
id,
|
|
@@ -61,7 +80,8 @@
|
|
|
61
80
|
].join(' '));
|
|
62
81
|
const compact = text.replace(/[^a-z0-9]+/g, '');
|
|
63
82
|
|
|
64
|
-
//
|
|
83
|
+
// Conservative safety policy for commands that can reset equipment,
|
|
84
|
+
// open contactors or materially change charging/power/current limits.
|
|
65
85
|
if (/^(?:level\.)?(?:power|current)(?:\.|$)/.test(role)) return true;
|
|
66
86
|
if (/^(?:value\.)?(?:power|current)\.setpoint(?:\.|$)/.test(role)) return true;
|
|
67
87
|
|
|
@@ -85,54 +105,365 @@
|
|
|
85
105
|
const toBoolean = value => {
|
|
86
106
|
if (value === true || value === 1) return true;
|
|
87
107
|
if (value === false || value === 0 || value == null) return false;
|
|
88
|
-
const normalized = normalizeText(value)
|
|
89
|
-
if (['true', '1', 'on', 'yes', 'ja', 'enabled', 'active'].includes(normalized)) return true;
|
|
90
|
-
if (['false', '0', 'off', 'no', 'nein', 'disabled', 'inactive', '', 'null', '(null)'].includes(normalized)) 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;
|
|
91
111
|
return Boolean(value);
|
|
92
112
|
};
|
|
93
113
|
|
|
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' : '';
|
|
128
|
+
}
|
|
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 '';
|
|
139
|
+
};
|
|
140
|
+
|
|
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;
|
|
164
|
+
}
|
|
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
|
+
};
|
|
184
|
+
|
|
185
|
+
const stringifyJsonValue = value => {
|
|
186
|
+
if (typeof value === 'string') {
|
|
187
|
+
try {
|
|
188
|
+
return JSON.stringify(JSON.parse(value), null, 2);
|
|
189
|
+
} catch {
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
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
|
+
};
|
|
209
|
+
|
|
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);
|
|
239
|
+
try {
|
|
240
|
+
JSON.parse(value);
|
|
241
|
+
valid = true;
|
|
242
|
+
} catch {
|
|
243
|
+
valid = false;
|
|
244
|
+
}
|
|
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
|
+
}
|
|
252
|
+
|
|
253
|
+
return { type, value, propsValue: value, valid };
|
|
254
|
+
};
|
|
255
|
+
|
|
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;
|
|
265
|
+
};
|
|
266
|
+
|
|
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.');
|
|
274
|
+
}
|
|
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;
|
|
278
|
+
};
|
|
279
|
+
|
|
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;
|
|
298
|
+
};
|
|
299
|
+
|
|
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);
|
|
303
|
+
};
|
|
304
|
+
|
|
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);
|
|
315
|
+
};
|
|
316
|
+
|
|
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'],
|
|
320
|
+
};
|
|
321
|
+
|
|
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;
|
|
333
|
+
}
|
|
334
|
+
return undefined;
|
|
335
|
+
};
|
|
336
|
+
|
|
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;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
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;
|
|
352
|
+
};
|
|
353
|
+
|
|
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);
|
|
360
|
+
|
|
361
|
+
const stateKey = findBooleanStateKey(common.states, desired);
|
|
362
|
+
if (stateKey !== undefined) return coerceStateKey(obj, stateKey, currentValue);
|
|
363
|
+
|
|
364
|
+
if (behavior === 'button' && common.def !== undefined && common.def !== null) {
|
|
365
|
+
return coerceByDeclaredType(obj, common.def, currentValue);
|
|
366
|
+
}
|
|
367
|
+
|
|
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.');
|
|
379
|
+
}
|
|
380
|
+
if (declared === 'mixed') {
|
|
381
|
+
if (typeof currentValue === 'number') return desired ? 1 : 0;
|
|
382
|
+
if (typeof currentValue === 'string') return getStringToggleValue(currentValue, desired);
|
|
383
|
+
}
|
|
384
|
+
return desired;
|
|
385
|
+
};
|
|
386
|
+
|
|
94
387
|
const getWriteBehavior = (id, obj, item, expertMode) => {
|
|
95
388
|
if (!obj || obj.type !== 'state') return 'readonly';
|
|
96
|
-
const common = obj
|
|
389
|
+
const common = getCommon(obj);
|
|
97
390
|
if (common.write === false) return 'readonly';
|
|
98
391
|
if (isExpertOnlyState(id, obj) && !expertMode) return 'expert-only';
|
|
99
|
-
if (common.type === 'file') return 'file';
|
|
392
|
+
if (normalizeCommonType(common.type) === 'file') return 'file';
|
|
100
393
|
|
|
101
394
|
const role = normalizeText(common.role);
|
|
102
395
|
const data = item && item.data ? item.data : {};
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
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';
|
|
106
414
|
return 'dialog';
|
|
107
415
|
};
|
|
108
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';
|
|
424
|
+
};
|
|
425
|
+
|
|
109
426
|
const writeManualState = (socket, id, value) => {
|
|
110
427
|
if (!socket || typeof socket.setState !== 'function') {
|
|
111
428
|
return Promise.reject(new Error('ioBroker socket is not ready'));
|
|
112
429
|
}
|
|
113
430
|
const key = String(id || '');
|
|
114
431
|
if (!key) return Promise.reject(new Error('Missing datapoint ID'));
|
|
115
|
-
if (
|
|
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
|
+
}
|
|
116
436
|
|
|
117
|
-
|
|
118
|
-
const operation =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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 timeout = new Promise((_, reject) => {
|
|
442
|
+
timeoutHandle = setTimeout(() => reject(new Error(`Write timeout for ${key}`)), 15000);
|
|
443
|
+
});
|
|
444
|
+
return Promise.race([write, timeout]).finally(() => {
|
|
124
445
|
if (timeoutHandle) clearTimeout(timeoutHandle);
|
|
125
|
-
pendingWrites.delete(key);
|
|
126
446
|
});
|
|
127
|
-
|
|
128
|
-
|
|
447
|
+
});
|
|
448
|
+
const tail = operation.finally(() => {
|
|
449
|
+
if (writeQueues.get(key) === tail) writeQueues.delete(key);
|
|
450
|
+
});
|
|
451
|
+
writeQueues.set(key, tail);
|
|
452
|
+
return operation;
|
|
129
453
|
};
|
|
130
454
|
|
|
131
455
|
return {
|
|
132
456
|
getExplicitExpertOnly,
|
|
133
457
|
isExpertOnlyState,
|
|
134
458
|
getWriteBehavior,
|
|
459
|
+
getWriteLabel,
|
|
460
|
+
resolveEditorType,
|
|
461
|
+
prepareEditorValue,
|
|
462
|
+
coerceWriteValue,
|
|
463
|
+
getDirectWriteValue,
|
|
135
464
|
toBoolean,
|
|
136
465
|
writeManualState,
|
|
466
|
+
normalizeStates,
|
|
467
|
+
normalizeCommonType,
|
|
137
468
|
};
|
|
138
469
|
});
|