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.
- 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 -1
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v76.js +1 -2
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v77.js +1 -0
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v78.js +1 -0
- package/adminWww/assets/AdapterUpdateDialog-BMg84Hpf-v79.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 -1
- package/adminWww/assets/Adapters-B5_jQ7DE-v76.js +1 -9
- package/adminWww/assets/Adapters-B5_jQ7DE-v77.js +1 -0
- package/adminWww/assets/Adapters-B5_jQ7DE-v78.js +1 -0
- package/adminWww/assets/Adapters-B5_jQ7DE-v79.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 -1
- package/adminWww/assets/Config-hHK2UzGP-v77.js +1 -0
- package/adminWww/assets/Config-hHK2UzGP-v78.js +1 -0
- package/adminWww/assets/Config-hHK2UzGP-v79.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 -1
- package/adminWww/assets/CustomTab-B0wqoazH-v77.js +1 -0
- package/adminWww/assets/CustomTab-B0wqoazH-v78.js +1 -0
- package/adminWww/assets/CustomTab-B0wqoazH-v79.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 -1
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v77.js +1 -0
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v78.js +1 -0
- package/adminWww/assets/DeviceManager-BFmQeYQ1-v79.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 -1
- package/adminWww/assets/EasyMode-B1d9Vdc4-v77.js +1 -0
- package/adminWww/assets/EasyMode-B1d9Vdc4-v78.js +1 -0
- package/adminWww/assets/EasyMode-B1d9Vdc4-v79.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 -1
- package/adminWww/assets/Enums-DbWYxKOo-v76.js +1 -91
- package/adminWww/assets/Enums-DbWYxKOo-v77.js +1 -0
- package/adminWww/assets/Enums-DbWYxKOo-v78.js +1 -0
- package/adminWww/assets/Enums-DbWYxKOo-v79.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 -1
- package/adminWww/assets/Fields-CX3rKuWb-v77.js +1 -0
- package/adminWww/assets/Fields-CX3rKuWb-v78.js +1 -0
- package/adminWww/assets/Fields-CX3rKuWb-v79.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 -1
- package/adminWww/assets/Files-Cd2HOzIE-v77.js +1 -0
- package/adminWww/assets/Files-Cd2HOzIE-v78.js +1 -0
- package/adminWww/assets/Files-Cd2HOzIE-v79.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 -1
- package/adminWww/assets/Hosts-Bg8QzW5i-v76.js +1 -121
- package/adminWww/assets/Hosts-Bg8QzW5i-v77.js +1 -0
- package/adminWww/assets/Hosts-Bg8QzW5i-v78.js +1 -0
- package/adminWww/assets/Hosts-Bg8QzW5i-v79.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 -1
- package/adminWww/assets/Instances-YdaGnS5a-v76.js +1 -2
- package/adminWww/assets/Instances-YdaGnS5a-v77.js +1 -0
- package/adminWww/assets/Instances-YdaGnS5a-v78.js +1 -0
- package/adminWww/assets/Instances-YdaGnS5a-v79.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 -1
- package/adminWww/assets/Intro-DkwRiz1n-v76.js +1 -2
- package/adminWww/assets/Intro-DkwRiz1n-v77.js +1 -0
- package/adminWww/assets/Intro-DkwRiz1n-v78.js +1 -0
- package/adminWww/assets/Intro-DkwRiz1n-v79.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 -1
- package/adminWww/assets/Logs-CsVPSLJH-v77.js +1 -0
- package/adminWww/assets/Logs-CsVPSLJH-v78.js +1 -0
- package/adminWww/assets/Logs-CsVPSLJH-v79.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 -1
- package/adminWww/assets/Objects-DPan0bzw-v76.js +1 -878
- package/adminWww/assets/Objects-DPan0bzw-v77.js +1 -0
- package/adminWww/assets/Objects-DPan0bzw-v78.js +1 -0
- package/adminWww/assets/Objects-DPan0bzw-v79.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 -1
- package/adminWww/assets/Users-BgnBRgwU-v77.js +1 -0
- package/adminWww/assets/Users-BgnBRgwU-v78.js +1 -0
- package/adminWww/assets/Users-BgnBRgwU-v79.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 -1
- package/adminWww/assets/bootstrap-COulQZax-v76.js +1 -317
- package/adminWww/assets/bootstrap-COulQZax-v77.js +1 -0
- package/adminWww/assets/bootstrap-COulQZax-v78.js +1 -0
- package/adminWww/assets/bootstrap-COulQZax-v79.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 -1
- package/adminWww/assets/hostInit-v76.js +1 -2
- package/adminWww/assets/hostInit-v77.js +1 -0
- package/adminWww/assets/hostInit-v78.js +1 -0
- package/adminWww/assets/hostInit-v79.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 -1
- package/adminWww/assets/index-CQZugZ1z-v76.js +1 -2
- package/adminWww/assets/index-CQZugZ1z-v77.js +1 -0
- package/adminWww/assets/index-CQZugZ1z-v78.js +1 -0
- package/adminWww/assets/index-CQZugZ1z-v79.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 -1
- package/adminWww/assets/index-D2ymscJA-v76.js +1 -950
- package/adminWww/assets/index-D2ymscJA-v77.js +1 -0
- package/adminWww/assets/index-D2ymscJA-v78.js +1 -0
- package/adminWww/assets/index-D2ymscJA-v79.js +950 -0
- package/adminWww/assets/sentry-B7YeoTAx-v54.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v55.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v56.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v57.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v58.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v59.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v60.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v61.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v62.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v63.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v64.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v65.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v66.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v67.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v68.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v69.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v70.js +1 -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 -1
- package/adminWww/assets/sentry-B7YeoTAx-v77.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v78.js +1 -0
- package/adminWww/assets/sentry-B7YeoTAx-v79.js +1 -0
- package/adminWww/css/eos-branding.css +25 -32
- 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 +338 -328
- 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 -1
- package/adminWww/remoteEntry-v76.js +1 -2
- package/adminWww/remoteEntry-v77.js +1 -0
- package/adminWww/remoteEntry-v78.js +1 -0
- package/adminWww/remoteEntry-v79.js +2 -0
- package/adminWww/remoteEntry.js +1 -1
- package/docs/MANUAL_DATAPOINT_WRITE_POLICY.md +16 -13
- package/io-package.json +13 -8
- package/package.json +2 -2
- package/tools/nexowatt-validate-package.cjs +7 -3
|
@@ -1,75 +1,129 @@
|
|
|
1
|
-
/* NexoWatt EOS manual datapoint write policy v7.9.
|
|
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 = '
|
|
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
|
-
|
|
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 (
|
|
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
|
|
40
|
-
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
48
|
-
|
|
49
|
-
native.
|
|
50
|
-
|
|
51
|
-
custom
|
|
52
|
-
custom['eos
|
|
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
|
|
83
|
+
if (typeof value === 'boolean') return value;
|
|
56
84
|
}
|
|
57
85
|
return undefined;
|
|
58
86
|
};
|
|
59
87
|
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
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
|
|
123
|
+
if (explicit === true) return 'explicit';
|
|
124
|
+
if (explicit === false) return '';
|
|
71
125
|
|
|
72
|
-
const common =
|
|
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
|
-
//
|
|
84
|
-
//
|
|
85
|
-
if (/^(?:level\.)?(?:power|current)(?:\.|$)/.test(role)) return
|
|
86
|
-
if (/^(?:value\.)?(?:power|current)\.setpoint(?:\.|$)/.test(role)) return
|
|
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
|
|
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
|
-
|
|
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', '
|
|
110
|
-
if (['false', '0', 'off', 'no', 'nein', 'disabled', '
|
|
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
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return
|
|
147
|
-
}
|
|
148
|
-
|
|
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
|
|
186
|
-
if (
|
|
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.
|
|
202
|
+
if (/^[\[{]/.test(text)) return JSON.parse(text);
|
|
189
203
|
} catch {
|
|
190
|
-
|
|
204
|
+
// keep as text
|
|
191
205
|
}
|
|
206
|
+
return text;
|
|
192
207
|
}
|
|
193
|
-
|
|
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
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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.
|
|
241
|
-
valid = true;
|
|
216
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
242
217
|
} catch {
|
|
243
|
-
|
|
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
|
-
|
|
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
|
|
257
|
-
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
|
|
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
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
|
281
|
-
const common =
|
|
282
|
-
const
|
|
283
|
-
|
|
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
|
|
301
|
-
const
|
|
302
|
-
|
|
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
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
if (
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
if (
|
|
313
|
-
if (
|
|
314
|
-
return
|
|
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
|
|
318
|
-
|
|
319
|
-
|
|
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
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
|
345
|
+
return fallbackValue;
|
|
335
346
|
};
|
|
336
347
|
|
|
337
|
-
const
|
|
338
|
-
const
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
387
|
+
return {
|
|
388
|
+
editorType,
|
|
389
|
+
value,
|
|
390
|
+
originalType,
|
|
391
|
+
};
|
|
352
392
|
};
|
|
353
393
|
|
|
354
|
-
const
|
|
355
|
-
const common =
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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
|
-
|
|
362
|
-
if (stateKey !== undefined) return coerceStateKey(obj, stateKey, currentValue);
|
|
401
|
+
if (editorType !== 'string' && value === 'null') return null;
|
|
363
402
|
|
|
364
|
-
if (
|
|
365
|
-
|
|
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
|
-
|
|
369
|
-
if (
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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 (
|
|
381
|
-
if (typeof
|
|
382
|
-
if (typeof
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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 =
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
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])
|
|
445
|
-
if (timeoutHandle) clearTimeout(timeoutHandle);
|
|
446
|
-
});
|
|
451
|
+
return Promise.race([write, timeout]);
|
|
447
452
|
});
|
|
448
|
-
const
|
|
449
|
-
if (
|
|
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
|
-
|
|
452
|
-
return
|
|
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
|
});
|