boneio 1.5.0.dev10__tar.gz → 1.5.0.dev12__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. {boneio-1.5.0.dev10/boneio.egg-info → boneio-1.5.0.dev12}/PKG-INFO +1 -1
  2. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/template/gate_cover.py +6 -2
  3. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/inputs.py +9 -7
  4. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/remote.py +9 -2
  5. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/templates/__init__.py +4 -0
  6. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/templates/gate_cover.py +53 -11
  7. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/templates.py +40 -10
  8. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/wled.py +46 -3
  9. boneio-1.5.0.dev12/boneio/version.py +2 -0
  10. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/BindingMatrix-DAAjBzzR.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/BindingMatrix-sPbnkk3q.js +1 -1
  11. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ConfigEditor-iXr5kaqI.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/ConfigEditor-BW5p6czH.js +1 -1
  12. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EditItemDialog-tVR2WDXW.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/EditItemDialog-EXSzv1h-.js +1 -1
  13. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityCard-CVch9a7x.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/EntityCard-Baa34yvR.js +1 -1
  14. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityGrid-DrIgH2RW.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/EntityGrid-ZMMQCacx.js +1 -1
  15. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/InputsView-DcezF20P.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/InputsView-3TWtNuVX.js +1 -1
  16. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/LogViewer-BPb6YMmQ.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/LogViewer-k5Gt8k2O.js +1 -1
  17. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ModbusView-DfHlmQ4U.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/ModbusView-DtvRzQPY.js +1 -1
  18. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/NodeRedView-CR3ZGtc9.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/NodeRedView-BPEkkqIb.js +1 -1
  19. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/OutputsView-nljQGE7z.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/OutputsView-DUnA3EG0.js +1 -1
  20. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SensorView-B2oFg70N.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/SensorView-WmoZT5VM.js +1 -1
  21. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SudoPasswordDialog-CYEaTaL9.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/SudoPasswordDialog-fC4HRGtE.js +1 -1
  22. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SystemState-D7PUoRdp.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/SystemState-BRigO9Bc.js +1 -1
  23. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/TemplatesView-BDccDcwP.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/TemplatesView-CAXj1gAG.js +1 -1
  24. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/Tools-DAFDHpzm.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/Tools-DfTLLXUx.js +1 -1
  25. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/UISettings-L_Uh0sL_.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/UISettings-CEZ5cjTg.js +3 -3
  26. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/dialog-Bj5BD-Tr.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/dialog-DaAuWrWH.js +1 -1
  27. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/gi-AjEh3QsP.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/gi-B6VoRVMX.js +1 -1
  28. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/index-CDsuwPez.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/index-mUeR1ZYi.js +2 -2
  29. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D5oIDT5t.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-DAG4PZPN.js +1 -1
  30. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/select-CZiAfWrl.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/select-CT8v8aH8.js +1 -1
  31. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/tabs-box-BQJbfr3G.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/tabs-box-DdJPCk-r.js +1 -1
  32. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/utils-C6puLrXz.js → boneio-1.5.0.dev12/boneio/webui/frontend-dist/assets/utils-BgjkKFNC.js +1 -1
  33. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/index.html +1 -1
  34. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/sw.js +1 -1
  35. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12/boneio.egg-info}/PKG-INFO +1 -1
  36. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio.egg-info/SOURCES.txt +23 -23
  37. boneio-1.5.0.dev10/boneio/version.py +0 -2
  38. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/LICENSE +0 -0
  39. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/MANIFEST.in +0 -0
  40. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/README.md +0 -0
  41. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/__init__.py +0 -0
  42. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/input.yaml +0 -0
  43. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/output_24_16.yaml +0 -0
  44. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/output_32_10.yaml +0 -0
  45. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/output_32_5.yaml +0 -0
  46. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/output_cover.yaml +0 -0
  47. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  48. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/input.yaml +0 -0
  49. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/output_24_16.yaml +0 -0
  50. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/output_32_10.yaml +0 -0
  51. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/output_32_5.yaml +0 -0
  52. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/output_cover.yaml +0 -0
  53. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  54. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/input.yaml +0 -0
  55. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/output_24_16.yaml +0 -0
  56. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/output_32_10.yaml +0 -0
  57. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/output_32_5.yaml +0 -0
  58. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/output_cover.yaml +0 -0
  59. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  60. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.5/input.yaml +0 -0
  61. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.5/output_24_16.yaml +0 -0
  62. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.5/output_32_10.yaml +0 -0
  63. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.5/output_cover.yaml +0 -0
  64. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  65. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.6/input.yaml +0 -0
  66. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.6/output_24_16.yaml +0 -0
  67. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.6/output_32_10.yaml +0 -0
  68. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.6/output_cover.yaml +0 -0
  69. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  70. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/input.yaml +0 -0
  71. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/output_24_16.yaml +0 -0
  72. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/output_32_10.yaml +0 -0
  73. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/output_48_4.yaml +0 -0
  74. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/output_cover.yaml +0 -0
  75. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  76. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/input.yaml +0 -0
  77. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/output_24_16.yaml +0 -0
  78. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/output_32_10.yaml +0 -0
  79. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/output_48_4.yaml +0 -0
  80. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/output_cover.yaml +0 -0
  81. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  82. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/input.yaml +0 -0
  83. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/output_24_16.yaml +0 -0
  84. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/output_32_10.yaml +0 -0
  85. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/output_48_4.yaml +0 -0
  86. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/output_cover.yaml +0 -0
  87. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  88. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/bonecli.py +0 -0
  89. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/__init__.py +0 -0
  90. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/cover/__init__.py +0 -0
  91. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/cover/cover.py +0 -0
  92. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/cover/time_based.py +0 -0
  93. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/cover/venetian.py +0 -0
  94. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/group/__init__.py +0 -0
  95. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/group/output_group.py +0 -0
  96. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/__init__.py +0 -0
  97. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/binary_sensor.py +0 -0
  98. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/detectors.py +0 -0
  99. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/event.py +0 -0
  100. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/remote/__init__.py +0 -0
  101. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/remote/base.py +0 -0
  102. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/input/remote/esphome.py +0 -0
  103. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/irrigation/__init__.py +0 -0
  104. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/irrigation/controller.py +0 -0
  105. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/irrigation/water_source.py +0 -0
  106. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/__init__.py +0 -0
  107. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/basic.py +0 -0
  108. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/buzzer.py +0 -0
  109. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/mcp.py +0 -0
  110. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/pca.py +0 -0
  111. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/pcf.py +0 -0
  112. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/output/remote.py +0 -0
  113. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/sensor/__init__.py +0 -0
  114. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/sensor/virtual_energy.py +0 -0
  115. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/template/__init__.py +0 -0
  116. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/template/alarm_panel.py +0 -0
  117. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/components/template/thermostat.py +0 -0
  118. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/const.py +0 -0
  119. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/__init__.py +0 -0
  120. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/__init__.py +0 -0
  121. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/data/__init__.py +0 -0
  122. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  123. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  124. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  125. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/registration.py +0 -0
  126. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/cloud/secrets.py +0 -0
  127. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/__init__.py +0 -0
  128. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/config_helper.py +0 -0
  129. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/migrations/__init__.py +0 -0
  130. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  131. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/migrations/v2_transition.py +0 -0
  132. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/package-lock.json +0 -0
  133. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/package.json +0 -0
  134. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/schema_converter.py +0 -0
  135. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/config/yaml_util.py +0 -0
  136. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/discovery.py +0 -0
  137. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/events/__init__.py +0 -0
  138. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/events/bus.py +0 -0
  139. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/__init__.py +0 -0
  140. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/action_conditions.py +0 -0
  141. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/canopen.py +0 -0
  142. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/covers.py +0 -0
  143. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/display.py +0 -0
  144. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/irrigation.py +0 -0
  145. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/manager.py +0 -0
  146. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/modbus.py +0 -0
  147. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/outputs.py +0 -0
  148. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/remote_input_registrar.py +0 -0
  149. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/sensors.py +0 -0
  150. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/templates/alarm.py +0 -0
  151. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/templates/thermostat.py +0 -0
  152. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/manager/update.py +0 -0
  153. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/__init__.py +0 -0
  154. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/basic.py +0 -0
  155. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/basic_mqtt.py +0 -0
  156. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/composite.py +0 -0
  157. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/local.py +0 -0
  158. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/lox.py +0 -0
  159. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/mqtt.py +0 -0
  160. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/messaging/queue.py +0 -0
  161. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/__init__.py +0 -0
  162. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/base.py +0 -0
  163. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/can.py +0 -0
  164. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/esphome.py +0 -0
  165. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/remote/mqtt.py +0 -0
  166. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/sensor/__init__.py +0 -0
  167. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/sensor/base.py +0 -0
  168. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/sensor/system.py +0 -0
  169. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/state/__init__.py +0 -0
  170. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/state/manager.py +0 -0
  171. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/system/__init__.py +0 -0
  172. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/system/host_data.py +0 -0
  173. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/system/monitor.py +0 -0
  174. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/__init__.py +0 -0
  175. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/async_updater.py +0 -0
  176. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/conditions.py +0 -0
  177. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/filter.py +0 -0
  178. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/font_util.py +0 -0
  179. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/logger.py +0 -0
  180. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/timeperiod.py +0 -0
  181. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/core/utils/util.py +0 -0
  182. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/adc.yaml +0 -0
  183. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  184. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/config.yaml +0 -0
  185. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/event.yaml +0 -0
  186. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/mqtt.yaml +0 -0
  187. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  188. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/adc.yaml +0 -0
  189. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  190. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/config.yaml +0 -0
  191. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/event.yaml +0 -0
  192. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/mqtt.yaml +0 -0
  193. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  194. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/adc.yaml +0 -0
  195. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  196. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/config.yaml +0 -0
  197. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/event.yaml +0 -0
  198. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/mqtt.yaml +0 -0
  199. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  200. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/__init__.py +0 -0
  201. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/can_master.yaml +0 -0
  202. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/can_slave.yaml +0 -0
  203. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/adc.yaml +0 -0
  204. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  205. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/config.yaml +0 -0
  206. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/cover.yaml +0 -0
  207. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/event.yaml +0 -0
  208. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/mqtt.yaml +0 -0
  209. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover/outputCover.yaml +0 -0
  210. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/adc.yaml +0 -0
  211. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  212. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/config.yaml +0 -0
  213. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/cover.yaml +0 -0
  214. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/event.yaml +0 -0
  215. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  216. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  217. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/adc.yaml +0 -0
  218. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  219. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  220. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  221. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  222. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/event_all.yaml +0 -0
  223. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  224. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  225. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  226. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  227. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  228. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  229. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/exceptions.py +0 -0
  230. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/__init__.py +0 -0
  231. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/analog/__init__.py +0 -0
  232. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/analog/adc.py +0 -0
  233. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/__init__.py +0 -0
  234. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/bridge.py +0 -0
  235. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/client.py +0 -0
  236. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/interface.py +0 -0
  237. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/node.py +0 -0
  238. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/node_id.py +0 -0
  239. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/can/test_od.py +0 -0
  240. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/display/__init__.py +0 -0
  241. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/display/early_oled.py +0 -0
  242. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  243. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/display/oled.py +0 -0
  244. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/__init__.py +0 -0
  245. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  246. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  247. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  248. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  249. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/input/__init__.py +0 -0
  250. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/input/base.py +0 -0
  251. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/gpio/input/manager.py +0 -0
  252. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/__init__.py +0 -0
  253. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/bus.py +0 -0
  254. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/ina219.py +0 -0
  255. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/ina219_driver.py +0 -0
  256. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/mcp9808.py +0 -0
  257. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/i2c/pct2075.py +0 -0
  258. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/onewire/__init__.py +0 -0
  259. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/onewire/bus.py +0 -0
  260. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/onewire/dallas.py +0 -0
  261. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/onewire/ds2482.py +0 -0
  262. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/sensor/__init__.py +0 -0
  263. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  264. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/sensor/temperature/base.py +0 -0
  265. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  266. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  267. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/integration/__init__.py +0 -0
  268. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/integration/homeassistant.py +0 -0
  269. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/integration/interlock.py +0 -0
  270. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/integration/lox_template.py +0 -0
  271. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/__init__.py +0 -0
  272. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/actions.py +0 -0
  273. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  274. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/daemon.json +0 -0
  275. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  276. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  277. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  278. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  279. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  280. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/journald/journald.conf +0 -0
  281. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  282. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/sudoers/boneio +0 -0
  283. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  284. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  285. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/systemd/boneio.service +0 -0
  286. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  287. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  288. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  289. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  290. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  291. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  292. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  293. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  294. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  295. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/runner.py +0 -0
  296. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/__init__.py +0 -0
  297. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  298. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  299. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  300. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  301. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  302. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  303. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  304. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  305. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/__init__.py +0 -0
  306. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/cli.py +0 -0
  307. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/client.py +0 -0
  308. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/coordinator.py +0 -0
  309. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/__init__.py +0 -0
  310. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  311. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  312. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  313. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  314. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  315. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  316. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  317. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  318. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  319. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  320. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/hvac/thessla.json +0 -0
  321. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  322. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  323. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/inverters/sofar.json +0 -0
  324. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  325. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  326. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  327. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  328. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/cwt.json +0 -0
  329. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  330. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  331. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  332. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  333. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/pt100.json +0 -0
  334. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/sht20.json +0 -0
  335. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/devices/sensors/sht30.json +0 -0
  336. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/__init__.py +0 -0
  337. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/base.py +0 -0
  338. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/derived/__init__.py +0 -0
  339. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/derived/numeric.py +0 -0
  340. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/derived/select.py +0 -0
  341. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/derived/switch.py +0 -0
  342. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/derived/text.py +0 -0
  343. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/sensor/__init__.py +0 -0
  344. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/sensor/binary.py +0 -0
  345. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/sensor/numeric.py +0 -0
  346. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/sensor/text.py +0 -0
  347. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/writeable/__init__.py +0 -0
  348. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/writeable/binary.py +0 -0
  349. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/entities/writeable/numeric.py +0 -0
  350. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/mock_coordinator.py +0 -0
  351. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/modbus/utils.py +0 -0
  352. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/__init__.py +0 -0
  353. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/actions.py +0 -0
  354. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/events.py +0 -0
  355. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/files.py +0 -0
  356. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/logs.py +0 -0
  357. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/mqtt.py +0 -0
  358. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/models/state.py +0 -0
  359. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/runner.py +0 -0
  360. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/actions.yaml +0 -0
  361. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/actions_sensor.yaml +0 -0
  362. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/actions_switch.yaml +0 -0
  363. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/condition.yaml +0 -0
  364. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/filters.yaml +0 -0
  365. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/filters_adc.yaml +0 -0
  366. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/id.yaml +0 -0
  367. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/remote_devices.yaml +0 -0
  368. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/remote_inputs.yaml +0 -0
  369. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/remote_outputs.yaml +0 -0
  370. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/schema.yaml +0 -0
  371. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/temp_unit.yaml +0 -0
  372. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/schema/update_interval.yaml +0 -0
  373. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/action_validation.py +0 -0
  374. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/app.py +0 -0
  375. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/dashboard_cards.py +0 -0
  376. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +0 -0
  377. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +0 -0
  378. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +0 -0
  379. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +0 -0
  380. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  381. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  382. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  383. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  384. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  385. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  386. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  387. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  388. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  389. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +0 -0
  390. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  391. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  392. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  393. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  394. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  395. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +0 -0
  396. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +0 -0
  397. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  398. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  399. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  400. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  401. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/boneio.svg +0 -0
  402. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  403. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  404. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  405. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  406. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  407. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  408. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  409. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  410. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  411. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  412. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  413. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  414. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  415. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  416. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  417. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  418. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  419. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  420. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  421. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  422. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  423. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  424. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  425. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  426. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  427. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  428. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  429. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  430. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  431. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  432. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  433. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  434. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  435. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  436. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/hvac_svg_templates.py +0 -0
  437. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/middleware/__init__.py +0 -0
  438. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/middleware/auth.py +0 -0
  439. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/modbus_card_templates.py +0 -0
  440. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/__init__.py +0 -0
  441. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/auth.py +0 -0
  442. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/caddy.py +0 -0
  443. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/can.py +0 -0
  444. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/config.py +0 -0
  445. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/covers.py +0 -0
  446. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/dashboard.py +0 -0
  447. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/dev_fake_device.py +0 -0
  448. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/irrigation.py +0 -0
  449. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/migrations.py +0 -0
  450. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/modbus.py +0 -0
  451. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/outputs.py +0 -0
  452. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/remote_devices.py +0 -0
  453. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/sensors.py +0 -0
  454. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/system.py +0 -0
  455. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/templates.py +0 -0
  456. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/timezone_sudoers.py +0 -0
  457. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/tools.py +0 -0
  458. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/routes/update.py +0 -0
  459. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/adc.schema.json +0 -0
  460. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/areas.schema.json +0 -0
  461. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  462. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/boneio.schema.json +0 -0
  463. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/can.schema.json +0 -0
  464. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/config.schema.json +0 -0
  465. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/cover.schema.json +0 -0
  466. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/dallas.schema.json +0 -0
  467. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/ds2482.schema.json +0 -0
  468. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/event.schema.json +0 -0
  469. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/ina219.schema.json +0 -0
  470. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/irrigation.schema.json +0 -0
  471. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/lm75.schema.json +0 -0
  472. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/logger.schema.json +0 -0
  473. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/lox_udp.schema.json +0 -0
  474. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/mcp23017.schema.json +0 -0
  475. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/mcp9808.schema.json +0 -0
  476. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/modbus.schema.json +0 -0
  477. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  478. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/mqtt.schema.json +0 -0
  479. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/oled.schema.json +0 -0
  480. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/output.schema.json +0 -0
  481. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/output_group.schema.json +0 -0
  482. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/pca9685.schema.json +0 -0
  483. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/pcf8575.schema.json +0 -0
  484. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/remote_devices.schema.json +0 -0
  485. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  486. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  487. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/sensor.schema.json +0 -0
  488. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/template.schema.json +0 -0
  489. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  490. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/schema/web.schema.json +0 -0
  491. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/services/__init__.py +0 -0
  492. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/services/logs.py +0 -0
  493. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/web_server.py +0 -0
  494. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio/webui/websocket_manager.py +0 -0
  495. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio.egg-info/dependency_links.txt +0 -0
  496. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio.egg-info/entry_points.txt +0 -0
  497. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio.egg-info/requires.txt +0 -0
  498. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/boneio.egg-info/top_level.txt +0 -0
  499. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/pyproject.toml +0 -0
  500. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/setup.cfg +0 -0
  501. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/setup.py +0 -0
  502. {boneio-1.5.0.dev10 → boneio-1.5.0.dev12}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.5.0.dev10
3
+ Version: 1.5.0.dev12
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
@@ -191,10 +191,14 @@ class BoneIOGateCover:
191
191
  # -- MQTT ----------------------------------------------------------------
192
192
 
193
193
  async def start(self) -> None:
194
- """Subscribe to MQTT command topic."""
194
+ """Subscribe to MQTT command topic and publish current state.
195
+
196
+ Initial sensor state is already set by TemplateManager during
197
+ configuration, so start() just subscribes and publishes.
198
+ """
195
199
  await self._message_bus.subscribe_and_listen(self._cmd_topic, self.handle_command)
196
200
  self._publish_state()
197
- _LOGGER.info("GateCover %s started, subscribed to %s", self._id, self._cmd_topic)
201
+ _LOGGER.info("GateCover %s started (state=%s), subscribed to %s", self._id, self._state, self._cmd_topic)
198
202
 
199
203
  async def stop(self) -> None:
200
204
  """Unsubscribe from MQTT and cancel timers."""
@@ -801,16 +801,18 @@ class InputManager:
801
801
  # Send event to MQTT for Home Assistant
802
802
  self._publish_input_event_to_mqtt(input_instance, event)
803
803
 
804
- # Route to template entities (gate covers, alarm panels)
805
- # This must happen before the publish_only check so initial state
806
- # sync events reach gate covers and alarm panels.
807
- self._manager.templates.on_input_event(event.entity_id, event.click_type)
808
-
809
- # If publish_only is set, skip action execution (used for initial state sync)
804
+ # If publish_only is set, skip action execution AND template routing.
805
+ # publish_only events come from initial state sync (binary_sensor
806
+ # initial_send) routing them to gate covers would cause spurious
807
+ # state transitions that trigger HA automations on every restart.
808
+ # Gate covers read sensor state silently during their own start().
810
809
  if event.publish_only:
811
- _LOGGER.debug("Skipping action execution for %s (publish_only=True)", event.entity_id)
810
+ _LOGGER.debug("Skipping actions and template routing for %s (publish_only=True)", event.entity_id)
812
811
  return
813
812
 
813
+ # Route to template entities (gate covers, alarm panels)
814
+ self._manager.templates.on_input_event(event.entity_id, event.click_type)
815
+
814
816
  # Cancel pending delayed actions if this event matches delay_cancel_on
815
817
  # Check ALL click types' actions for delay_cancel_on (not just current click_type)
816
818
  self._cancel_delayed_if_matching(input_instance, event.entity_id, event.click_type)
@@ -473,7 +473,11 @@ class RemoteDeviceManager:
473
473
  action=action,
474
474
  )
475
475
 
476
- # For WLED devices, use HTTP JSON API
476
+ # For WLED devices, use fire-and-forget HTTP JSON API.
477
+ # WLED HTTP requests can stall for seconds when the device is
478
+ # unreachable (DNS timeout on .local), which blocks the EventBus
479
+ # worker and freezes ALL input events. Fire-and-forget schedules
480
+ # the request as a background task so the caller returns immediately.
477
481
  if device.protocol == RemoteDeviceProtocol.WLED:
478
482
  _LOGGER.debug("Controlling WLED '%s' segment '%s' on device '%s'", output_id, action, device_id)
479
483
  # Parse segment_id - "main" means whole device, otherwise it's segment ID
@@ -482,7 +486,9 @@ class RemoteDeviceManager:
482
486
  wled_rgb: tuple[int, int, int] | None = None
483
487
  if rgb and len(rgb) >= 3:
484
488
  wled_rgb = (rgb[0], rgb[1], rgb[2])
485
- return await cast(Any, device).control_light(
489
+ from boneio.core.remote.wled import WLEDRemoteDevice
490
+ wled_device = cast(WLEDRemoteDevice, device)
491
+ wled_device.control_light_fire_and_forget(
486
492
  segment_id=segment_id,
487
493
  action=action,
488
494
  brightness=brightness,
@@ -494,6 +500,7 @@ class RemoteDeviceManager:
494
500
  effect_speed=effect_speed,
495
501
  effect_intensity=effect_intensity,
496
502
  )
503
+ return True # Optimistic: task is scheduled
497
504
 
498
505
  # For MQTT devices, use standard control_output
499
506
  return await device.control_output(
@@ -145,6 +145,9 @@ class TemplateManager:
145
145
  for alarm in self._alarms.items:
146
146
  await alarm.start()
147
147
  for gate in self._gates.items:
148
+ # Sync sensor state silently before start() publishes state.
149
+ # Done here (not in configure()) because GPIO manager is now running.
150
+ self._gates.sync_initial_state(gate)
148
151
  await gate.start()
149
152
  _LOGGER.info("TemplateManager started all entities")
150
153
 
@@ -242,6 +245,7 @@ class TemplateManager:
242
245
  continue
243
246
  gate = self._gates.get(eid)
244
247
  if gate:
248
+ self._gates.sync_initial_state(gate)
245
249
  await gate.start()
246
250
 
247
251
  # Re-register all sensor EventBus listeners (clean slate)
@@ -143,10 +143,6 @@ class GateCoverManager:
143
143
  self._input_map[sensor_id] = []
144
144
  self._input_map[sensor_id].append(gate)
145
145
 
146
- # Read current sensor states to set correct initial gate state.
147
- # Without this, gate defaults to CLOSED which may be wrong.
148
- self._sync_initial_state(closed_sensor_id, open_sensor_id)
149
-
150
146
  # Publish HA discovery
151
147
  self._publish_discovery(gate)
152
148
 
@@ -159,23 +155,69 @@ class GateCoverManager:
159
155
 
160
156
  def _sync_initial_state(
161
157
  self,
158
+ gate: BoneIOGateCover,
162
159
  closed_sensor_id: str | None,
163
160
  open_sensor_id: str | None,
164
161
  ) -> None:
165
- """Sync initial gate state by asking InputManager to re-send sensor states.
162
+ """Read current sensor GPIO state and set gate cover's initial state.
166
163
 
167
- Delegates to InputManager.send_current_state_for_input() which reads
168
- live GPIO and fires an EventBus event. The gate cover's event listener
169
- picks it up automatically no direct GPIO access needed here.
164
+ Reads the binary sensor's ``is_active`` property directly —
165
+ no EventBus events are fired, no MQTT messages are published.
166
+ Gate cover's ``start()`` will publish the correct state later.
170
167
 
171
168
  Args:
169
+ gate: The gate cover instance to initialize.
172
170
  closed_sensor_id: ID of the closed contact sensor (or None).
173
171
  open_sensor_id: ID of the open contact sensor (or None).
174
172
  """
173
+ from boneio.components.input.binary_sensor import GpioInputBinarySensor
174
+ from boneio.components.template.gate_cover import CYCLE_CLOSE, CYCLE_OPEN
175
+ from boneio.const import CLOSED, IDLE, OPEN
176
+
175
177
  input_mgr = self._manager.inputs
176
- for sensor_id in (closed_sensor_id, open_sensor_id):
177
- if sensor_id:
178
- input_mgr.send_current_state_for_input(sensor_id)
178
+
179
+ if closed_sensor_id:
180
+ sensor = input_mgr._inputs.get(closed_sensor_id)
181
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
182
+ is_closed = sensor.is_active
183
+ _LOGGER.debug(
184
+ "Gate %s: initial closed_sensor %s is_active=%s",
185
+ gate.id, closed_sensor_id, is_closed,
186
+ )
187
+ if is_closed:
188
+ gate._state = CLOSED
189
+ gate._current_operation = IDLE
190
+ gate._cycle_next = CYCLE_OPEN
191
+ elif not gate._has_open_sensor:
192
+ gate._state = OPEN
193
+ gate._current_operation = IDLE
194
+
195
+ if open_sensor_id:
196
+ sensor = input_mgr._inputs.get(open_sensor_id)
197
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
198
+ is_open = sensor.is_active
199
+ _LOGGER.debug(
200
+ "Gate %s: initial open_sensor %s is_active=%s",
201
+ gate.id, open_sensor_id, is_open,
202
+ )
203
+ if is_open:
204
+ gate._state = OPEN
205
+ gate._current_operation = IDLE
206
+ gate._cycle_next = CYCLE_CLOSE
207
+
208
+ def sync_initial_state(self, gate: BoneIOGateCover) -> None:
209
+ """Public entry point for setting gate's initial state from sensor GPIO.
210
+
211
+ Called by TemplateManager during start() when GPIO manager is ready.
212
+
213
+ Args:
214
+ gate: Gate cover to sync.
215
+ """
216
+ self._sync_initial_state(
217
+ gate,
218
+ gate._closed_sensor_id,
219
+ gate._open_sensor_id,
220
+ )
179
221
 
180
222
  # -- Removal -------------------------------------------------------------
181
223
 
@@ -17,9 +17,9 @@ from boneio.components.template.alarm_panel import (
17
17
  BoneIOAlarmPanel,
18
18
  ZoneInput,
19
19
  )
20
- from boneio.components.template.gate_cover import BoneIOGateCover
20
+ from boneio.components.template.gate_cover import BoneIOGateCover, CYCLE_CLOSE, CYCLE_OPEN
21
21
  from boneio.components.template.thermostat import BoneIOThermostat
22
- from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, COVER
22
+ from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, CLOSED, COVER, IDLE, OPEN
23
23
  from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
24
24
 
25
25
  if TYPE_CHECKING:
@@ -365,7 +365,7 @@ class TemplateManager:
365
365
 
366
366
  # Read current sensor states to set correct initial gate state.
367
367
  # Without this, gate defaults to CLOSED which may be wrong.
368
- self._sync_gate_initial_state(closed_sensor_id, open_sensor_id)
368
+ self._sync_gate_initial_state(gate, closed_sensor_id, open_sensor_id)
369
369
 
370
370
  # Publish HA discovery
371
371
  self._publish_gate_cover_discovery(gate)
@@ -379,23 +379,53 @@ class TemplateManager:
379
379
 
380
380
  def _sync_gate_initial_state(
381
381
  self,
382
+ gate: BoneIOGateCover,
382
383
  closed_sensor_id: str | None,
383
384
  open_sensor_id: str | None,
384
385
  ) -> None:
385
- """Sync initial gate state by asking InputManager to re-send sensor states.
386
+ """Read current sensor GPIO state and set gate cover's initial state.
386
387
 
387
- Delegates to InputManager.send_current_state_for_input() which reads
388
- live GPIO and fires an EventBus event. The gate cover's event listener
389
- picks it up automatically.
388
+ Reads the binary sensor's ``is_active`` property directly —
389
+ no EventBus events are fired, no MQTT messages are published.
390
+ Gate cover's ``start()`` will publish the correct state later.
390
391
 
391
392
  Args:
393
+ gate: The gate cover instance to initialize.
392
394
  closed_sensor_id: ID of the closed contact sensor (or None).
393
395
  open_sensor_id: ID of the open contact sensor (or None).
394
396
  """
397
+ from boneio.components.input.binary_sensor import GpioInputBinarySensor
398
+
395
399
  input_mgr = self._manager.inputs
396
- for sensor_id in (closed_sensor_id, open_sensor_id):
397
- if sensor_id:
398
- input_mgr.send_current_state_for_input(sensor_id)
400
+
401
+ if closed_sensor_id:
402
+ sensor = input_mgr._inputs.get(closed_sensor_id)
403
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
404
+ is_closed = sensor.is_active
405
+ _LOGGER.debug(
406
+ "Gate %s: initial closed_sensor %s is_active=%s",
407
+ gate.id, closed_sensor_id, is_closed,
408
+ )
409
+ if is_closed:
410
+ gate._state = CLOSED
411
+ gate._current_operation = IDLE
412
+ gate._cycle_next = CYCLE_OPEN
413
+ elif not gate._has_open_sensor:
414
+ gate._state = OPEN
415
+ gate._current_operation = IDLE
416
+
417
+ if open_sensor_id:
418
+ sensor = input_mgr._inputs.get(open_sensor_id)
419
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
420
+ is_open = sensor.is_active
421
+ _LOGGER.debug(
422
+ "Gate %s: initial open_sensor %s is_active=%s",
423
+ gate.id, open_sensor_id, is_open,
424
+ )
425
+ if is_open:
426
+ gate._state = OPEN
427
+ gate._current_operation = IDLE
428
+ gate._cycle_next = CYCLE_CLOSE
399
429
 
400
430
  # -- HA Discovery --------------------------------------------------------
401
431
 
@@ -169,10 +169,25 @@ class WLEDRemoteDevice(RemoteDevice):
169
169
  _LOGGER.debug("Closed session for WLED '%s'", self._name)
170
170
 
171
171
  async def _get_session(self) -> aiohttp.ClientSession:
172
- """Get or create aiohttp session."""
172
+ """Get or create aiohttp session.
173
+
174
+ Uses ``ThreadedResolver`` (system ``getaddrinfo`` via NSS) so that
175
+ mDNS ``.local`` hostnames are resolved correctly through Avahi.
176
+ The default aiohttp resolver (``AsyncResolver`` / c-ares) bypasses
177
+ NSS entirely, causing ``Name or service not known`` errors for
178
+ ``.local`` names even when ``ping`` from the same host works fine.
179
+
180
+ Timeout is kept short (3s total, 2s connect) so that unreachable
181
+ devices do not block the caller.
182
+ """
173
183
  if self._session is None or self._session.closed:
174
- timeout = aiohttp.ClientTimeout(total=10)
175
- self._session = aiohttp.ClientSession(timeout=timeout)
184
+ timeout = aiohttp.ClientTimeout(total=3, connect=2)
185
+ resolver = aiohttp.resolver.ThreadedResolver()
186
+ connector = aiohttp.TCPConnector(resolver=resolver)
187
+ self._session = aiohttp.ClientSession(
188
+ timeout=timeout,
189
+ connector=connector,
190
+ )
176
191
  return self._session
177
192
 
178
193
  async def _send_state(self, state: dict[str, Any]) -> bool:
@@ -366,6 +381,34 @@ class WLEDRemoteDevice(RemoteDevice):
366
381
  )
367
382
 
368
383
  return await self._send_state(state)
384
+
385
+ def control_light_fire_and_forget(
386
+ self,
387
+ **kwargs: Any,
388
+ ) -> None:
389
+ """Schedule ``control_light`` as a background task.
390
+
391
+ Use this when the caller must not be blocked by network I/O
392
+ (e.g. when called from the EventBus action handler). The task
393
+ runs independently; failures are logged but do not propagate.
394
+
395
+ Args:
396
+ **kwargs: Forwarded to :meth:`control_light`.
397
+ """
398
+ asyncio.create_task(
399
+ self._control_light_safe(**kwargs),
400
+ name=f"wled_ff_{self._id}",
401
+ )
402
+
403
+ async def _control_light_safe(self, **kwargs: Any) -> None:
404
+ """Wrapper that catches all exceptions so fire-and-forget tasks never crash."""
405
+ try:
406
+ await self.control_light(**kwargs)
407
+ except Exception as exc:
408
+ _LOGGER.error(
409
+ "WLED fire-and-forget failed for '%s': %s",
410
+ self._name, exc,
411
+ )
369
412
 
370
413
  async def control_output(
371
414
  self,
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.5.0dev12"
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{y as n}from"./vendor-DjFmndpd.js";import{t as r}from"./useTranslation-DWIecEyP.js";import{$ as i,B as a,C as o,I as s,It as c,N as l,Pt as u,U as d,Ut as f,Wt as p,b as m,s as h,ut as g,y as _,z as v}from"./index-CDsuwPez.js";import{t as y}from"./EditItemDialog-tVR2WDXW.js";var b=e(t(),1);function x(e){return p({tag:`svg`,attr:{viewBox:`0 0 512 512`},child:[{tag:`path`,attr:{d:`M224 0c17.7 0 32 14.3 32 32l0 12 96-12c17.7 0 32 14.3 32 32s-14.3 32-32 32L256 84l-31-3.9-1-.1-1 .1L192 84 96 96C78.3 96 64 81.7 64 64s14.3-32 32-32l96 12 0-12c0-17.7 14.3-32 32-32zM0 224c0-17.7 14.3-32 32-32l96 0 22.6-22.6c6-6 14.1-9.4 22.6-9.4l18.7 0 0-43.8 32-4 32 4 0 43.8 18.7 0c8.5 0 16.6 3.4 22.6 9.4L320 192l32 0c88.4 0 160 71.6 160 160c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32s-14.3-32-32-32l-36.1 0c-20.2 29-53.9 48-91.9 48s-71.7-19-91.9-48L32 320c-17.7 0-32-14.3-32-32l0-64zM436.8 423.4c1.9-4.5 6.3-7.4 11.2-7.4s9.2 2.9 11.2 7.4l18.2 42.4c1.8 4.1 2.7 8.6 2.7 13.1l0 1.2c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-1.2c0-4.5 .9-8.9 2.7-13.1l18.2-42.4z`},child:[]}]})(e)}var S=n();function C({outputType:e,className:t}){switch(e){case`light`:return(0,S.jsx)(i,{className:h(`text-warning`,t)});case`switch`:return(0,S.jsx)(c,{className:h(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:h(`text-accent`,t)});case`cover`:return(0,S.jsx)(l,{className:h(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:h(`text-secondary`,t)});default:return null}}var w={single:`1×`,double:`2×`,triple:`3×`,long:`L`,pressed:`P`,released:`R`,double_then_long:`2×L`,single_then_long:`1×L`,double_then_single:`2×1`},T={TOGGLE:`short_toggle`,ON:`short_on`,OFF:`short_off`,OPEN:`short_open`,CLOSE:`short_close`,STOP:`short_stop`},E=[{key:`single`,labelKey:`binding_matrix.legend_single`,icon:`1×`},{key:`double`,labelKey:`binding_matrix.legend_double`,icon:`2×`},{key:`triple`,labelKey:`binding_matrix.legend_triple`,icon:`3×`},{key:`long`,labelKey:`binding_matrix.legend_long`,icon:`L`},{key:`pressed`,labelKey:`binding_matrix.legend_pressed`,icon:`P`},{key:`released`,labelKey:`binding_matrix.legend_released`,icon:`R`}],D=[{labelKey:`actions.toggle`,shortKey:`actions.short_toggle`},{labelKey:`actions.on`,shortKey:`actions.short_on`},{labelKey:`actions.off`,shortKey:`actions.short_off`},{labelKey:`actions.open`,shortKey:`actions.short_open`},{labelKey:`actions.close`,shortKey:`actions.short_close`},{labelKey:`actions.stop`,shortKey:`actions.short_stop`}],O={single:`single`,double:`double`,triple:`triple`,long:`long`,pressed:`basic`,released:`basic`,double_then_long:`sequences`,single_then_long:`sequences`,double_then_single:`sequences`};function k(e,t){let n=w[e.clickType]||e.clickType,r=T[e.actionValue];return`${n} ${r?t(`actions.${r}`):e.actionValue}`}function A(e,t){let n=`actions.${e.actionValue.toLowerCase()}`,r=t(n),i=r===n?e.actionValue:r;return`${e.clickType} → ${i}`}function j(e){let t=e.action||`output`,n=``,r=``,i;switch(t){case`output`:n=e.boneio_output||``,r=e.action_output||`TOGGLE`;break;case`cover`:n=e.boneio_cover||``,r=e.action_cover||`TOGGLE`;break;case`remote_output`:i=e.boneio_id||``,n=i?`${i}/${e.output_id||``}`:e.output_id||``,r=e.action_output||`TOGGLE`;break;case`remote_cover`:i=e.boneio_id||``,n=i?`${i}/${e.cover_id||``}`:e.cover_id||``,r=e.action_cover||`TOGGLE`;break;default:n=``,r=e.action_output||e.action_cover||``;break}return{targetId:n,actionType:t,actionValue:r,remoteDevice:i}}function M(e){let t=[],n=[`single`,`double`,`triple`,`long`,`pressed`,`released`,`double_then_long`,`single_then_long`,`double_then_single`],r=e.local_inputs||[];for(let e=0;e<r.length;e++){let i=r[e],a=i.id||i.pin||`local_${e}`,o=[];for(let e of n){let t=i.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&o.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:a,name:i.name||i.id||i.pin||a,area:i.area||void 0,type:`local`,bindings:o})}let i=e.remote_inputs||[];for(let e=0;e<i.length;e++){let r=i[e],a=r.boneio_id||r.remote_device||``,o=r.id||r.entity_id||``,s=a?`${a}/${o}`:o||`remote_${e}`,c=[];for(let e of n){let t=r.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&c.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:s,name:r.name||r.id||o,area:r.area||void 0,type:`remote`,remoteDevice:a,bindings:c})}return t}function N(e){let t=[],n=e.output||[];for(let e=0;e<n.length;e++){let r=n[e];if(r.output_type===`cover`||r.output_type===`none`)continue;let i=r.id||`output_${e}`;t.push({id:i,name:r.name||r.id||i,area:r.area||void 0,type:`output`,outputType:r.output_type})}let r=e.cover||[];for(let e=0;e<r.length;e++){let n=r[e],i=n.id||`cover_${e}`;t.push({id:i,name:n.name||n.id||i,area:n.area||void 0,type:`cover`,outputType:n.device_class||`cover`})}let i=e.remote_outputs||[];for(let e=0;e<i.length;e++){let n=i[e],r=n.boneio_id||n.remote_device||``,a=n.id||n.output_id||``,o=r?`${r}/${a}`:a||`remote_out_${e}`;t.push({id:o,name:n.name||n.id||a,area:n.area||void 0,type:`remote_output`,remoteDevice:r,outputType:n.output_type})}return t}function P({inputs:e,outputs:t,t:n}){let r=e.filter(e=>e.type===`local`),i=e.filter(e=>e.type===`remote`),a=t.filter(e=>e.type===`output`),o=t.filter(e=>e.type===`cover`),s=t.filter(e=>e.type===`remote_output`||e.type===`remote_cover`),c=r.filter(e=>e.bindings.length>0),l=i.filter(e=>e.bindings.length>0),u=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),d=a.filter(e=>u.has(e.id)),f=o.filter(e=>u.has(e.id)),p=s.filter(e=>u.has(e.id)),m=e.reduce((e,t)=>e+t.bindings.length,0);return(0,S.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3 mb-4`,children:[(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50`,children:n(`binding_matrix.local`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,r.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,r.length-c.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`💡 `,n(`binding_matrix.outputs`),`: `,a.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,a.length-d.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`🚪 `,n(`binding_matrix.covers`),`: `,o.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`bg-info/5 rounded-xl p-3 border border-info/20 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-info/70`,children:n(`binding_matrix.remote`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,i.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,i.length-l.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📡 `,n(`binding_matrix.outputs`),`: `,s.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`bg-primary/5 rounded-xl p-3 border border-primary/20 flex flex-col justify-center`,children:[(0,S.jsx)(`p`,{className:`text-2xl font-extrabold text-primary`,children:m}),(0,S.jsx)(`p`,{className:`text-xs font-medium text-primary/70`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50 mb-1.5`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-0.5`,children:E.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:e.icon}),` `,n(e.labelKey)]},e.key))}),(0,S.jsx)(`div`,{className:`border-t border-base-300 mt-1.5 pt-1.5 grid grid-cols-3 gap-x-2 gap-y-0.5`,children:D.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:n(e.shortKey)}),` `,n(e.labelKey)]},e.shortKey))})]})]})}function F({inputs:e,outputs:t,t:n}){let[r,i]=(0,b.useState)(!0),[a,c]=(0,b.useState)(!0),l=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),u=e.filter(e=>e.type===`local`&&e.bindings.length===0),d=t.filter(e=>e.type===`output`&&!l.has(e.id)),f=t.filter(e=>e.type===`cover`&&!l.has(e.id)),p=e.filter(e=>e.type===`remote`&&e.bindings.length===0),h=t.filter(e=>(e.type===`remote_output`||e.type===`remote_cover`)&&!l.has(e.id)),g=u.length>0||d.length>0||f.length>0,_=p.length>0||h.length>0;return!g&&!_?null:(0,S.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[g&&(0,S.jsxs)(`div`,{className:`border border-warning/20 rounded-xl bg-warning/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-warning hover:bg-warning/10 transition-colors`,onClick:()=>i(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[u.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_inputs`)} (${u.length})`,items:u.map(e=>({id:e.id,name:e.name,area:e.area}))}),d.length>0&&(0,S.jsx)(I,{title:`💡 ${n(`binding_matrix.free_outputs`)} (${d.length})`,items:d.map(e=>({id:e.id,name:e.name,area:e.area}))}),f.length>0&&(0,S.jsx)(I,{title:`🚪 ${n(`binding_matrix.free_covers`)} (${f.length})`,items:f.map(e=>({id:e.id,name:e.name,area:e.area}))})]})]}),_&&(0,S.jsxs)(`div`,{className:`border border-info/20 rounded-xl bg-info/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-info hover:bg-info/10 transition-colors`,onClick:()=>c(!a),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),a?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),a&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[p.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_remote_inputs`)} (${p.length})`,items:p.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))}),h.length>0&&(0,S.jsx)(I,{title:`📡 ${n(`binding_matrix.free_remote_outputs`)} (${h.length})`,items:h.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))})]})]})]})}function I({title:e,items:t}){return(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`text-xs font-semibold text-base-content/60 mb-1`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`badge badge-sm badge-ghost text-xxs font-mono gap-1`,title:e.id,children:[e.name,e.area&&(0,S.jsxs)(`span`,{className:`text-base-content/40`,children:[`(`,e.area,`)`]}),e.badge&&(0,S.jsxs)(`span`,{className:`text-info/60`,children:[`[`,e.badge,`]`]})]},e.id))})]})}function ee({inputs:e,outputs:t,areaFilter:n,hideEmpty:r,t:i,onEditInput:a,onEditOutput:o}){let[s,c]=(0,b.useState)(null),[l,u]=(0,b.useState)(null),d=(0,b.useRef)(null),f=(0,b.useRef)(!1),p=(0,b.useRef)(!1),m=(0,b.useRef)(0),_=(0,b.useRef)(0),[v,y]=(0,b.useState)(null),x=(0,b.useRef)(null),w=(0,b.useCallback)((e,t,n)=>{n||(e.preventDefault(),y({x:e.clientX,y:e.clientY,row:t}))},[]),T=(0,b.useCallback)((e,t,n)=>{if(n)return;let r=`touches`in e?{x:e.touches[0].clientX,y:e.touches[0].clientY}:{x:e.clientX,y:e.clientY};x.current=setTimeout(()=>{y({...r,row:t}),x.current=null},500)},[]),D=(0,b.useCallback)(()=>{x.current&&=(clearTimeout(x.current),null)},[]);(0,b.useEffect)(()=>{if(!v)return;let e=null,t=requestAnimationFrame(()=>{let t=()=>y(null);window.addEventListener(`click`,t,{capture:!0}),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t,{capture:!0}),window.removeEventListener(`contextmenu`,t,{capture:!0}),window.removeEventListener(`scroll`,t,!0)}});return()=>{cancelAnimationFrame(t),e?.()}},[v]);let O=(0,b.useMemo)(()=>{let e=new Map;for(let n of t)e.set(n.id,n.area);return e},[t]),j=(0,b.useMemo)(()=>{let t=e;return n.size>0&&(t=t.filter(e=>{let t=e.area||`__none__`;return n.has(t)?!0:e.bindings.some(e=>{let t=O.get(e.targetId)||`__none__`;return n.has(t)})})),r&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,r,O]),M=(0,b.useMemo)(()=>new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),[e]),N=(0,b.useMemo)(()=>{let t=new Map;for(let n of e){let e=n.area||`__none__`;for(let r of n.bindings)t.has(r.targetId)||t.set(r.targetId,new Set),t.get(r.targetId).add(e)}return t},[e]),P=(0,b.useMemo)(()=>{let e=t;return n.size>0&&(e=e.filter(e=>{let t=e.area||`__none__`;if(n.has(t))return!0;let r=N.get(e.id);if(r){for(let e of r)if(n.has(e))return!0}return!1})),r&&(e=e.filter(e=>M.has(e.id))),e},[t,n,r,M,N]),F=(0,b.useMemo)(()=>{let e=new Map;for(let t of j){let n=new Map;for(let e of t.bindings){let t=n.get(e.targetId)||[];t.push(e),n.set(e.targetId,t)}e.set(t.id,n)}return e},[j]);return j.length===0||P.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:i(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:d,className:`overflow-x-auto rounded-xl border border-base-300 cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{f.current=!0,p.current=!1,m.current=e.clientX,_.current=d.current?.scrollLeft||0},onMouseMove:e=>{if(!f.current||!d.current)return;let t=e.clientX-m.current;!p.current&&Math.abs(t)>5&&(p.current=!0),p.current&&(d.current.scrollLeft=_.current-t)},onMouseUp:()=>{f.current=!1,p.current=!1},onMouseLeave:()=>{f.current=!1,p.current=!1},onClickCapture:e=>{p.current&&(e.stopPropagation(),e.preventDefault())},children:[(0,S.jsxs)(`table`,{className:`table table-xs w-auto`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{className:`sticky left-0 z-20 bg-base-200 border-r border-base-300 min-w-[120px]`}),P.map(e=>(0,S.jsxs)(`th`,{className:h(`text-center text-xxs font-bold px-2 py-2 min-w-[80px] border-r border-base-300 bg-base-200 cursor-pointer group/col whitespace-nowrap`,l===e.id&&`bg-primary/10`),onMouseEnter:()=>u(e.id),onMouseLeave:()=>u(null),onClick:()=>o(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-center gap-1`,children:[(0,S.jsx)(C,{outputType:e.outputType,className:`w-3 h-3 shrink-0`}),(0,S.jsx)(`span`,{className:`whitespace-nowrap`,children:e.name}),(0,S.jsx)(g,{className:`w-2 h-2 opacity-0 group-hover/col:opacity-40 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs font-normal text-info/50 truncate`,children:e.remoteDevice})]},e.id))]})}),(0,S.jsx)(`tbody`,{children:j.map(e=>{let t=F.get(e.id);return(0,S.jsxs)(`tr`,{className:h(`hover:bg-base-200/50`,s===e.id&&`bg-base-200/40`),onMouseEnter:()=>c(e.id),onMouseLeave:()=>c(null),children:[(0,S.jsxs)(`td`,{className:h(`sticky left-0 z-10 bg-base-100 border-r border-base-300 font-medium text-xs cursor-pointer group/row`,s===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>a(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`font-bold truncate max-w-[120px] flex items-center gap-1`,title:e.id,children:[e.name,(0,S.jsx)(g,{className:`w-2.5 h-2.5 opacity-0 group-hover/row:opacity-40 transition-opacity shrink-0`})]}),e.area&&(0,S.jsx)(`div`,{className:`text-xxs text-base-content/40`,children:e.area}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs text-info/50`,children:e.remoteDevice})]}),P.map(n=>{let r=t?.get(n.id)||[],o=s===e.id||l===n.id;return(0,S.jsx)(`td`,{className:h(`text-center text-xs border-r border-base-300 px-1 py-1`,r.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,o&&r.length>0&&`bg-success/25`,o&&r.length===0&&`bg-base-200/40`),onMouseEnter:()=>u(n.id),onMouseLeave:()=>{u(null),D()},onContextMenu:t=>w(t,e,r.length>0),onMouseDown:t=>{t.button===0&&T(t,e,r.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,r.length>0),onTouchEnd:D,onTouchMove:D,children:r.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:r.map((t,n)=>(0,S.jsx)(`button`,{className:`whitespace-nowrap cursor-pointer hover:bg-success/30 rounded px-0.5 transition-colors text-left`,onClick:()=>a(e,t.clickType),title:`${A(t,i)}\n${i(`binding_matrix.click_to_edit`)}`,children:k(t,i)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[180px] animate-in fade-in zoom-in-95 duration-100`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 text-xxs font-semibold text-base-content/40 uppercase tracking-wider`,children:i(`binding_matrix.add_action`)}),E.map(e=>(0,S.jsxs)(`button`,{className:`w-full text-left px-3 py-1.5 text-sm hover:bg-primary/10 transition-colors flex items-center gap-2`,onClick:()=>{a(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),i(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:r,onEditInput:i}){let[a,s]=(0,b.useState)(null),c=(0,b.useMemo)(()=>{let r=e;return t.size>0&&(r=r.filter(e=>{let n=e.area||`__none__`;return t.has(n)})),n&&(r=r.filter(e=>e.bindings.length>0)),r},[e,t,n]),l=(0,b.useCallback)(e=>{s(t=>t===e?null:e)},[]);return c.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:r(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:c.map(e=>{let t=a===e.id,n=e.bindings.length>0,s=new Map;for(let t of e.bindings){let e=s.get(t.targetId)||[];e.push(t),s.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:h(`rounded-xl border overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm hover:bg-base-200/30 transition-colors`,onClick:()=>n&&l(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(_,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(u,{className:`w-3.5 h-3.5 text-base-content/20 shrink-0`}),(0,S.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,S.jsx)(`span`,{className:h(`font-semibold truncate block`,!n&&`text-base-content/30`),children:e.name}),e.area&&(0,S.jsx)(`span`,{className:`text-xxs text-base-content/40`,children:e.area})]})]}),(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[n&&(0,S.jsx)(`span`,{className:`badge badge-sm badge-success font-bold`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`badge badge-xs badge-info font-mono`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(o,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`border-t border-base-300 p-3 space-y-2 bg-base-100/50`,children:[[...s.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/70 shrink-0 mt-0.5`,children:`→`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`span`,{className:`font-semibold`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:t.map((e,t)=>(0,S.jsx)(`span`,{className:`badge badge-xs badge-success font-mono gap-0.5`,children:k(e,r)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`btn btn-xs btn-primary btn-outline gap-1 mt-1`,onClick:t=>{t.stopPropagation(),i(e)},children:[(0,S.jsx)(g,{className:`w-2.5 h-2.5`}),r(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:i})=>{let{t:o}=r(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[h,g]=(0,b.useState)(!1),[_,x]=(0,b.useState)(null),[C,w]=(0,b.useState)(``),[T,E]=(0,b.useState)(-1),[D,k]=(0,b.useState)(`basic`),[A,j]=(0,b.useState)(!1),[I,L]=(0,b.useState)(!1),R=(0,b.useRef)(null),[ne,z]=(0,b.useState)(!1),[B,V]=(0,b.useState)(null),[H,re]=(0,b.useState)(``),[U,ie]=(0,b.useState)(-1),[ae,W]=(0,b.useState)(!1),G=(0,b.useRef)(null),K=(0,b.useCallback)((t,n)=>{let r=t.type===`remote`?`remote_inputs`:`local_inputs`,i=e[r]||[],a=i.findIndex((e,n)=>{if(t.type===`remote`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.entity_id||``;return(r?`${r}/${i}`:i||`remote_${n}`)===t.id}return(e.id||e.pin||`local_${n}`)===t.id});a<0||(w(r),E(a),x(JSON.parse(JSON.stringify(i[a]))),R.current=JSON.stringify(i[a]),k(n&&O[n]||`basic`),j(!1),g(!0))},[e]),oe=(0,b.useCallback)(async()=>{if(A||T<0||!_)return;let t=[...e[C]||[]];t[T]=_,L(!0);try{i(C,t),await n(C,t),g(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[_,T,C,e,A,n,i]),se=(0,b.useCallback)(()=>{g(!1),x(null)},[]),q=(0,b.useMemo)(()=>M(e),[e]),J=(0,b.useMemo)(()=>N(e),[e]),ce=(0,b.useMemo)(()=>{let e=new Set;return q.forEach(t=>{t.area&&e.add(t.area)}),J.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[q,J]),le=(0,b.useMemo)(()=>q.some(e=>!e.area)||J.some(e=>!e.area),[q,J]),Y=(0,b.useMemo)(()=>e.output||[],[e.output]),X=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Z=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),ue=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),Q=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),fe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),he=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),ge=(0,b.useCallback)(t=>{let n={output:`output`,cover:`cover`,remote_output:`remote_outputs`,remote_cover:`remote_covers`}[t.type]||`output`,r=e[n]||[],i=r.findIndex((e,n)=>{if(t.type===`remote_output`||t.type===`remote_cover`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.output_id||``;return(r?`${r}/${i}`:i||`remote_out_${n}`)===t.id}return(e.id||``)===t.id});i<0||(re(n),ie(i),V(JSON.parse(JSON.stringify(r[i]))),G.current=JSON.stringify(r[i]),z(!0))},[e]),_e=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,W(!0);try{i(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{W(!1)}},[B,U,H,e,n,i]),ve=(0,b.useCallback)(()=>{z(!1),V(null)},[]),ye=_&&R.current&&JSON.stringify(_)!==R.current,be=B&&G.current&&JSON.stringify(B)!==G.current;return(0,S.jsxs)(`div`,{className:`p-4 md:p-6 max-w-full`,children:[(0,S.jsxs)(`div`,{className:`mb-4`,children:[(0,S.jsx)(`h2`,{className:`text-xl font-extrabold tracking-tight`,children:o(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:o(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:q,outputs:J,t:o}),(0,S.jsxs)(`div`,{className:`flex flex-wrap gap-3 mb-4 items-center`,children:[(0,S.jsxs)(`div`,{className:`relative flex items-center gap-2`,children:[(0,S.jsx)(d,{className:`w-3 h-3 text-base-content/40`}),(0,S.jsxs)(`button`,{className:`btn btn-sm btn-outline gap-1 min-w-[160px] justify-between`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`truncate text-xs`,children:s.size===0?o(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?o(`binding_matrix.no_area`):[...s][0]:o(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(m,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`absolute top-full left-0 mt-1 z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[200px] max-h-[300px] overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.size===0,onChange:()=>c(new Set)}),(0,S.jsx)(`span`,{className:`text-xs font-semibold`,children:o(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`border-t border-base-300 my-0.5`}),le&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(`__none__`),onChange:()=>{let e=new Set(s);e.has(`__none__`)?e.delete(`__none__`):e.add(`__none__`),c(e)}}),(0,S.jsx)(`span`,{className:`text-xs italic text-base-content/50`,children:o(`binding_matrix.no_area`)})]}),ce.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(e),onChange:()=>{let t=new Set(s);t.has(e)?t.delete(e):t.add(e),c(t)}}),(0,S.jsx)(`span`,{className:`text-xs`,children:e})]},e))]})]})]}),(0,S.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-sm checkbox-primary`,checked:f,onChange:e=>p(e.target.checked)}),(0,S.jsxs)(`span`,{className:`text-xs font-medium text-base-content/60 flex items-center gap-1`,children:[f?(0,S.jsx)(a,{className:`w-3 h-3`}):(0,S.jsx)(v,{className:`w-3 h-3`}),o(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:q,outputs:J,areaFilter:s,hideEmpty:f,t:o,onEditInput:K,onEditOutput:ge})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:q,areaFilter:s,hideEmpty:f,t:o,onEditInput:K})}),(0,S.jsx)(F,{inputs:q,outputs:J,t:o}),(0,S.jsx)(y,{open:h,onOpenChange:g,editingItem:_,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:fe,allBinarySensors:de,allEvents:Q,allOutputs:Y,allOutputGroups:Z,allCovers:X,allAreas:$,allRemoteDevices:ue,savedOutputs:Y,savedOutputGroups:Z,savedCovers:X,onChange:x,onSave:oe,onCancel:se,onValidationChange:j,saveDisabled:A||!ye,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?he:pe,uiSchema:H===`cover`?void 0:me,allOutputs:Y,allCovers:X,allAreas:$,onChange:V,onSave:_e,onCancel:ve,saveDisabled:!be,isSaving:ae})]})};export{L as default};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{y as n}from"./vendor-DjFmndpd.js";import{t as r}from"./useTranslation-DWIecEyP.js";import{$ as i,B as a,C as o,I as s,It as c,N as l,Pt as u,U as d,Ut as f,Wt as p,b as m,s as h,ut as g,y as _,z as v}from"./index-mUeR1ZYi.js";import{t as y}from"./EditItemDialog-EXSzv1h-.js";var b=e(t(),1);function x(e){return p({tag:`svg`,attr:{viewBox:`0 0 512 512`},child:[{tag:`path`,attr:{d:`M224 0c17.7 0 32 14.3 32 32l0 12 96-12c17.7 0 32 14.3 32 32s-14.3 32-32 32L256 84l-31-3.9-1-.1-1 .1L192 84 96 96C78.3 96 64 81.7 64 64s14.3-32 32-32l96 12 0-12c0-17.7 14.3-32 32-32zM0 224c0-17.7 14.3-32 32-32l96 0 22.6-22.6c6-6 14.1-9.4 22.6-9.4l18.7 0 0-43.8 32-4 32 4 0 43.8 18.7 0c8.5 0 16.6 3.4 22.6 9.4L320 192l32 0c88.4 0 160 71.6 160 160c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32s-14.3-32-32-32l-36.1 0c-20.2 29-53.9 48-91.9 48s-71.7-19-91.9-48L32 320c-17.7 0-32-14.3-32-32l0-64zM436.8 423.4c1.9-4.5 6.3-7.4 11.2-7.4s9.2 2.9 11.2 7.4l18.2 42.4c1.8 4.1 2.7 8.6 2.7 13.1l0 1.2c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-1.2c0-4.5 .9-8.9 2.7-13.1l18.2-42.4z`},child:[]}]})(e)}var S=n();function C({outputType:e,className:t}){switch(e){case`light`:return(0,S.jsx)(i,{className:h(`text-warning`,t)});case`switch`:return(0,S.jsx)(c,{className:h(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:h(`text-accent`,t)});case`cover`:return(0,S.jsx)(l,{className:h(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:h(`text-secondary`,t)});default:return null}}var w={single:`1×`,double:`2×`,triple:`3×`,long:`L`,pressed:`P`,released:`R`,double_then_long:`2×L`,single_then_long:`1×L`,double_then_single:`2×1`},T={TOGGLE:`short_toggle`,ON:`short_on`,OFF:`short_off`,OPEN:`short_open`,CLOSE:`short_close`,STOP:`short_stop`},E=[{key:`single`,labelKey:`binding_matrix.legend_single`,icon:`1×`},{key:`double`,labelKey:`binding_matrix.legend_double`,icon:`2×`},{key:`triple`,labelKey:`binding_matrix.legend_triple`,icon:`3×`},{key:`long`,labelKey:`binding_matrix.legend_long`,icon:`L`},{key:`pressed`,labelKey:`binding_matrix.legend_pressed`,icon:`P`},{key:`released`,labelKey:`binding_matrix.legend_released`,icon:`R`}],D=[{labelKey:`actions.toggle`,shortKey:`actions.short_toggle`},{labelKey:`actions.on`,shortKey:`actions.short_on`},{labelKey:`actions.off`,shortKey:`actions.short_off`},{labelKey:`actions.open`,shortKey:`actions.short_open`},{labelKey:`actions.close`,shortKey:`actions.short_close`},{labelKey:`actions.stop`,shortKey:`actions.short_stop`}],O={single:`single`,double:`double`,triple:`triple`,long:`long`,pressed:`basic`,released:`basic`,double_then_long:`sequences`,single_then_long:`sequences`,double_then_single:`sequences`};function k(e,t){let n=w[e.clickType]||e.clickType,r=T[e.actionValue];return`${n} ${r?t(`actions.${r}`):e.actionValue}`}function A(e,t){let n=`actions.${e.actionValue.toLowerCase()}`,r=t(n),i=r===n?e.actionValue:r;return`${e.clickType} → ${i}`}function j(e){let t=e.action||`output`,n=``,r=``,i;switch(t){case`output`:n=e.boneio_output||``,r=e.action_output||`TOGGLE`;break;case`cover`:n=e.boneio_cover||``,r=e.action_cover||`TOGGLE`;break;case`remote_output`:i=e.boneio_id||``,n=i?`${i}/${e.output_id||``}`:e.output_id||``,r=e.action_output||`TOGGLE`;break;case`remote_cover`:i=e.boneio_id||``,n=i?`${i}/${e.cover_id||``}`:e.cover_id||``,r=e.action_cover||`TOGGLE`;break;default:n=``,r=e.action_output||e.action_cover||``;break}return{targetId:n,actionType:t,actionValue:r,remoteDevice:i}}function M(e){let t=[],n=[`single`,`double`,`triple`,`long`,`pressed`,`released`,`double_then_long`,`single_then_long`,`double_then_single`],r=e.local_inputs||[];for(let e=0;e<r.length;e++){let i=r[e],a=i.id||i.pin||`local_${e}`,o=[];for(let e of n){let t=i.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&o.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:a,name:i.name||i.id||i.pin||a,area:i.area||void 0,type:`local`,bindings:o})}let i=e.remote_inputs||[];for(let e=0;e<i.length;e++){let r=i[e],a=r.boneio_id||r.remote_device||``,o=r.id||r.entity_id||``,s=a?`${a}/${o}`:o||`remote_${e}`,c=[];for(let e of n){let t=r.actions?.[e]||[];for(let n of t){let{targetId:t,actionType:r,actionValue:i,remoteDevice:a}=j(n);t&&c.push({clickType:e,actionType:r,targetId:t,actionValue:i,remoteDevice:a})}}t.push({id:s,name:r.name||r.id||o,area:r.area||void 0,type:`remote`,remoteDevice:a,bindings:c})}return t}function N(e){let t=[],n=e.output||[];for(let e=0;e<n.length;e++){let r=n[e];if(r.output_type===`cover`||r.output_type===`none`)continue;let i=r.id||`output_${e}`;t.push({id:i,name:r.name||r.id||i,area:r.area||void 0,type:`output`,outputType:r.output_type})}let r=e.cover||[];for(let e=0;e<r.length;e++){let n=r[e],i=n.id||`cover_${e}`;t.push({id:i,name:n.name||n.id||i,area:n.area||void 0,type:`cover`,outputType:n.device_class||`cover`})}let i=e.remote_outputs||[];for(let e=0;e<i.length;e++){let n=i[e],r=n.boneio_id||n.remote_device||``,a=n.id||n.output_id||``,o=r?`${r}/${a}`:a||`remote_out_${e}`;t.push({id:o,name:n.name||n.id||a,area:n.area||void 0,type:`remote_output`,remoteDevice:r,outputType:n.output_type})}return t}function P({inputs:e,outputs:t,t:n}){let r=e.filter(e=>e.type===`local`),i=e.filter(e=>e.type===`remote`),a=t.filter(e=>e.type===`output`),o=t.filter(e=>e.type===`cover`),s=t.filter(e=>e.type===`remote_output`||e.type===`remote_cover`),c=r.filter(e=>e.bindings.length>0),l=i.filter(e=>e.bindings.length>0),u=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),d=a.filter(e=>u.has(e.id)),f=o.filter(e=>u.has(e.id)),p=s.filter(e=>u.has(e.id)),m=e.reduce((e,t)=>e+t.bindings.length,0);return(0,S.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-3 mb-4`,children:[(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50`,children:n(`binding_matrix.local`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,r.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,r.length-c.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`💡 `,n(`binding_matrix.outputs`),`: `,a.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,a.length-d.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`🚪 `,n(`binding_matrix.covers`),`: `,o.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`bg-info/5 rounded-xl p-3 border border-info/20 space-y-1`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-info/70`,children:n(`binding_matrix.remote`)}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📥 `,n(`binding_matrix.inputs`),`: `,i.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,i.length-l.length,` ○)`]})]}),(0,S.jsxs)(`p`,{className:`text-xs text-base-content/70`,children:[`📡 `,n(`binding_matrix.outputs`),`: `,s.length,(0,S.jsxs)(`span`,{className:`text-success ml-1`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`text-warning ml-1`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`bg-primary/5 rounded-xl p-3 border border-primary/20 flex flex-col justify-center`,children:[(0,S.jsx)(`p`,{className:`text-2xl font-extrabold text-primary`,children:m}),(0,S.jsx)(`p`,{className:`text-xs font-medium text-primary/70`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 rounded-xl p-3 border border-base-300`,children:[(0,S.jsx)(`h4`,{className:`text-xs font-bold uppercase tracking-wider text-base-content/50 mb-1.5`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`grid grid-cols-2 gap-x-3 gap-y-0.5`,children:E.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:e.icon}),` `,n(e.labelKey)]},e.key))}),(0,S.jsx)(`div`,{className:`border-t border-base-300 mt-1.5 pt-1.5 grid grid-cols-3 gap-x-2 gap-y-0.5`,children:D.map(e=>(0,S.jsxs)(`span`,{className:`text-xxs text-base-content/60`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/80`,children:n(e.shortKey)}),` `,n(e.labelKey)]},e.shortKey))})]})]})}function F({inputs:e,outputs:t,t:n}){let[r,i]=(0,b.useState)(!0),[a,c]=(0,b.useState)(!0),l=new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),u=e.filter(e=>e.type===`local`&&e.bindings.length===0),d=t.filter(e=>e.type===`output`&&!l.has(e.id)),f=t.filter(e=>e.type===`cover`&&!l.has(e.id)),p=e.filter(e=>e.type===`remote`&&e.bindings.length===0),h=t.filter(e=>(e.type===`remote_output`||e.type===`remote_cover`)&&!l.has(e.id)),g=u.length>0||d.length>0||f.length>0,_=p.length>0||h.length>0;return!g&&!_?null:(0,S.jsxs)(`div`,{className:`mt-4 space-y-3`,children:[g&&(0,S.jsxs)(`div`,{className:`border border-warning/20 rounded-xl bg-warning/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-warning hover:bg-warning/10 transition-colors`,onClick:()=>i(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[u.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_inputs`)} (${u.length})`,items:u.map(e=>({id:e.id,name:e.name,area:e.area}))}),d.length>0&&(0,S.jsx)(I,{title:`💡 ${n(`binding_matrix.free_outputs`)} (${d.length})`,items:d.map(e=>({id:e.id,name:e.name,area:e.area}))}),f.length>0&&(0,S.jsx)(I,{title:`🚪 ${n(`binding_matrix.free_covers`)} (${f.length})`,items:f.map(e=>({id:e.id,name:e.name,area:e.area}))})]})]}),_&&(0,S.jsxs)(`div`,{className:`border border-info/20 rounded-xl bg-info/5 overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm font-semibold text-info hover:bg-info/10 transition-colors`,onClick:()=>c(!a),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(s,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),a?(0,S.jsx)(o,{className:`w-3 h-3`}):(0,S.jsx)(m,{className:`w-3 h-3`})]}),a&&(0,S.jsxs)(`div`,{className:`p-3 pt-0 space-y-2`,children:[p.length>0&&(0,S.jsx)(I,{title:`📥 ${n(`binding_matrix.free_remote_inputs`)} (${p.length})`,items:p.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))}),h.length>0&&(0,S.jsx)(I,{title:`📡 ${n(`binding_matrix.free_remote_outputs`)} (${h.length})`,items:h.map(e=>({id:e.id,name:e.name,area:e.area,badge:e.remoteDevice}))})]})]})]})}function I({title:e,items:t}){return(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`p`,{className:`text-xs font-semibold text-base-content/60 mb-1`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`badge badge-sm badge-ghost text-xxs font-mono gap-1`,title:e.id,children:[e.name,e.area&&(0,S.jsxs)(`span`,{className:`text-base-content/40`,children:[`(`,e.area,`)`]}),e.badge&&(0,S.jsxs)(`span`,{className:`text-info/60`,children:[`[`,e.badge,`]`]})]},e.id))})]})}function ee({inputs:e,outputs:t,areaFilter:n,hideEmpty:r,t:i,onEditInput:a,onEditOutput:o}){let[s,c]=(0,b.useState)(null),[l,u]=(0,b.useState)(null),d=(0,b.useRef)(null),f=(0,b.useRef)(!1),p=(0,b.useRef)(!1),m=(0,b.useRef)(0),_=(0,b.useRef)(0),[v,y]=(0,b.useState)(null),x=(0,b.useRef)(null),w=(0,b.useCallback)((e,t,n)=>{n||(e.preventDefault(),y({x:e.clientX,y:e.clientY,row:t}))},[]),T=(0,b.useCallback)((e,t,n)=>{if(n)return;let r=`touches`in e?{x:e.touches[0].clientX,y:e.touches[0].clientY}:{x:e.clientX,y:e.clientY};x.current=setTimeout(()=>{y({...r,row:t}),x.current=null},500)},[]),D=(0,b.useCallback)(()=>{x.current&&=(clearTimeout(x.current),null)},[]);(0,b.useEffect)(()=>{if(!v)return;let e=null,t=requestAnimationFrame(()=>{let t=()=>y(null);window.addEventListener(`click`,t,{capture:!0}),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t,{capture:!0}),window.removeEventListener(`contextmenu`,t,{capture:!0}),window.removeEventListener(`scroll`,t,!0)}});return()=>{cancelAnimationFrame(t),e?.()}},[v]);let O=(0,b.useMemo)(()=>{let e=new Map;for(let n of t)e.set(n.id,n.area);return e},[t]),j=(0,b.useMemo)(()=>{let t=e;return n.size>0&&(t=t.filter(e=>{let t=e.area||`__none__`;return n.has(t)?!0:e.bindings.some(e=>{let t=O.get(e.targetId)||`__none__`;return n.has(t)})})),r&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,r,O]),M=(0,b.useMemo)(()=>new Set(e.flatMap(e=>e.bindings.map(e=>e.targetId))),[e]),N=(0,b.useMemo)(()=>{let t=new Map;for(let n of e){let e=n.area||`__none__`;for(let r of n.bindings)t.has(r.targetId)||t.set(r.targetId,new Set),t.get(r.targetId).add(e)}return t},[e]),P=(0,b.useMemo)(()=>{let e=t;return n.size>0&&(e=e.filter(e=>{let t=e.area||`__none__`;if(n.has(t))return!0;let r=N.get(e.id);if(r){for(let e of r)if(n.has(e))return!0}return!1})),r&&(e=e.filter(e=>M.has(e.id))),e},[t,n,r,M,N]),F=(0,b.useMemo)(()=>{let e=new Map;for(let t of j){let n=new Map;for(let e of t.bindings){let t=n.get(e.targetId)||[];t.push(e),n.set(e.targetId,t)}e.set(t.id,n)}return e},[j]);return j.length===0||P.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:i(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:d,className:`overflow-x-auto rounded-xl border border-base-300 cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{f.current=!0,p.current=!1,m.current=e.clientX,_.current=d.current?.scrollLeft||0},onMouseMove:e=>{if(!f.current||!d.current)return;let t=e.clientX-m.current;!p.current&&Math.abs(t)>5&&(p.current=!0),p.current&&(d.current.scrollLeft=_.current-t)},onMouseUp:()=>{f.current=!1,p.current=!1},onMouseLeave:()=>{f.current=!1,p.current=!1},onClickCapture:e=>{p.current&&(e.stopPropagation(),e.preventDefault())},children:[(0,S.jsxs)(`table`,{className:`table table-xs w-auto`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{className:`sticky left-0 z-20 bg-base-200 border-r border-base-300 min-w-[120px]`}),P.map(e=>(0,S.jsxs)(`th`,{className:h(`text-center text-xxs font-bold px-2 py-2 min-w-[80px] border-r border-base-300 bg-base-200 cursor-pointer group/col whitespace-nowrap`,l===e.id&&`bg-primary/10`),onMouseEnter:()=>u(e.id),onMouseLeave:()=>u(null),onClick:()=>o(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-center gap-1`,children:[(0,S.jsx)(C,{outputType:e.outputType,className:`w-3 h-3 shrink-0`}),(0,S.jsx)(`span`,{className:`whitespace-nowrap`,children:e.name}),(0,S.jsx)(g,{className:`w-2 h-2 opacity-0 group-hover/col:opacity-40 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`text-xxs font-normal text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs font-normal text-info/50 truncate`,children:e.remoteDevice})]},e.id))]})}),(0,S.jsx)(`tbody`,{children:j.map(e=>{let t=F.get(e.id);return(0,S.jsxs)(`tr`,{className:h(`hover:bg-base-200/50`,s===e.id&&`bg-base-200/40`),onMouseEnter:()=>c(e.id),onMouseLeave:()=>c(null),children:[(0,S.jsxs)(`td`,{className:h(`sticky left-0 z-10 bg-base-100 border-r border-base-300 font-medium text-xs cursor-pointer group/row`,s===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>a(e),title:i(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`font-bold truncate max-w-[120px] flex items-center gap-1`,title:e.id,children:[e.name,(0,S.jsx)(g,{className:`w-2.5 h-2.5 opacity-0 group-hover/row:opacity-40 transition-opacity shrink-0`})]}),e.area&&(0,S.jsx)(`div`,{className:`text-xxs text-base-content/40`,children:e.area}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`text-xxs text-info/50`,children:e.remoteDevice})]}),P.map(n=>{let r=t?.get(n.id)||[],o=s===e.id||l===n.id;return(0,S.jsx)(`td`,{className:h(`text-center text-xs border-r border-base-300 px-1 py-1`,r.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,o&&r.length>0&&`bg-success/25`,o&&r.length===0&&`bg-base-200/40`),onMouseEnter:()=>u(n.id),onMouseLeave:()=>{u(null),D()},onContextMenu:t=>w(t,e,r.length>0),onMouseDown:t=>{t.button===0&&T(t,e,r.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,r.length>0),onTouchEnd:D,onTouchMove:D,children:r.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:r.map((t,n)=>(0,S.jsx)(`button`,{className:`whitespace-nowrap cursor-pointer hover:bg-success/30 rounded px-0.5 transition-colors text-left`,onClick:()=>a(e,t.clickType),title:`${A(t,i)}\n${i(`binding_matrix.click_to_edit`)}`,children:k(t,i)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`fixed z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[180px] animate-in fade-in zoom-in-95 duration-100`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 text-xxs font-semibold text-base-content/40 uppercase tracking-wider`,children:i(`binding_matrix.add_action`)}),E.map(e=>(0,S.jsxs)(`button`,{className:`w-full text-left px-3 py-1.5 text-sm hover:bg-primary/10 transition-colors flex items-center gap-2`,onClick:()=>{a(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),i(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:r,onEditInput:i}){let[a,s]=(0,b.useState)(null),c=(0,b.useMemo)(()=>{let r=e;return t.size>0&&(r=r.filter(e=>{let n=e.area||`__none__`;return t.has(n)})),n&&(r=r.filter(e=>e.bindings.length>0)),r},[e,t,n]),l=(0,b.useCallback)(e=>{s(t=>t===e?null:e)},[]);return c.length===0?(0,S.jsx)(`div`,{className:`text-center py-12 text-base-content/40`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:r(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:c.map(e=>{let t=a===e.id,n=e.bindings.length>0,s=new Map;for(let t of e.bindings){let e=s.get(t.targetId)||[];e.push(t),s.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:h(`rounded-xl border overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`w-full p-3 flex items-center justify-between text-sm hover:bg-base-200/30 transition-colors`,onClick:()=>n&&l(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(_,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(u,{className:`w-3.5 h-3.5 text-base-content/20 shrink-0`}),(0,S.jsxs)(`div`,{className:`min-w-0 text-left`,children:[(0,S.jsx)(`span`,{className:h(`font-semibold truncate block`,!n&&`text-base-content/30`),children:e.name}),e.area&&(0,S.jsx)(`span`,{className:`text-xxs text-base-content/40`,children:e.area})]})]}),(0,S.jsxs)(`div`,{className:`flex items-center gap-2`,children:[n&&(0,S.jsx)(`span`,{className:`badge badge-sm badge-success font-bold`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`badge badge-xs badge-info font-mono`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(o,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`border-t border-base-300 p-3 space-y-2 bg-base-100/50`,children:[[...s.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`font-mono font-bold text-base-content/70 shrink-0 mt-0.5`,children:`→`}),(0,S.jsxs)(`div`,{children:[(0,S.jsx)(`span`,{className:`font-semibold`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1 mt-0.5`,children:t.map((e,t)=>(0,S.jsx)(`span`,{className:`badge badge-xs badge-success font-mono gap-0.5`,children:k(e,r)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`btn btn-xs btn-primary btn-outline gap-1 mt-1`,onClick:t=>{t.stopPropagation(),i(e)},children:[(0,S.jsx)(g,{className:`w-2.5 h-2.5`}),r(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:i})=>{let{t:o}=r(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[h,g]=(0,b.useState)(!1),[_,x]=(0,b.useState)(null),[C,w]=(0,b.useState)(``),[T,E]=(0,b.useState)(-1),[D,k]=(0,b.useState)(`basic`),[A,j]=(0,b.useState)(!1),[I,L]=(0,b.useState)(!1),R=(0,b.useRef)(null),[ne,z]=(0,b.useState)(!1),[B,V]=(0,b.useState)(null),[H,re]=(0,b.useState)(``),[U,ie]=(0,b.useState)(-1),[ae,W]=(0,b.useState)(!1),G=(0,b.useRef)(null),K=(0,b.useCallback)((t,n)=>{let r=t.type===`remote`?`remote_inputs`:`local_inputs`,i=e[r]||[],a=i.findIndex((e,n)=>{if(t.type===`remote`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.entity_id||``;return(r?`${r}/${i}`:i||`remote_${n}`)===t.id}return(e.id||e.pin||`local_${n}`)===t.id});a<0||(w(r),E(a),x(JSON.parse(JSON.stringify(i[a]))),R.current=JSON.stringify(i[a]),k(n&&O[n]||`basic`),j(!1),g(!0))},[e]),oe=(0,b.useCallback)(async()=>{if(A||T<0||!_)return;let t=[...e[C]||[]];t[T]=_,L(!0);try{i(C,t),await n(C,t),g(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[_,T,C,e,A,n,i]),se=(0,b.useCallback)(()=>{g(!1),x(null)},[]),q=(0,b.useMemo)(()=>M(e),[e]),J=(0,b.useMemo)(()=>N(e),[e]),ce=(0,b.useMemo)(()=>{let e=new Set;return q.forEach(t=>{t.area&&e.add(t.area)}),J.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[q,J]),le=(0,b.useMemo)(()=>q.some(e=>!e.area)||J.some(e=>!e.area),[q,J]),Y=(0,b.useMemo)(()=>e.output||[],[e.output]),X=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Z=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),ue=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),Q=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),fe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),he=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),ge=(0,b.useCallback)(t=>{let n={output:`output`,cover:`cover`,remote_output:`remote_outputs`,remote_cover:`remote_covers`}[t.type]||`output`,r=e[n]||[],i=r.findIndex((e,n)=>{if(t.type===`remote_output`||t.type===`remote_cover`){let r=e.boneio_id||e.remote_device||``,i=e.id||e.output_id||``;return(r?`${r}/${i}`:i||`remote_out_${n}`)===t.id}return(e.id||``)===t.id});i<0||(re(n),ie(i),V(JSON.parse(JSON.stringify(r[i]))),G.current=JSON.stringify(r[i]),z(!0))},[e]),_e=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,W(!0);try{i(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{W(!1)}},[B,U,H,e,n,i]),ve=(0,b.useCallback)(()=>{z(!1),V(null)},[]),ye=_&&R.current&&JSON.stringify(_)!==R.current,be=B&&G.current&&JSON.stringify(B)!==G.current;return(0,S.jsxs)(`div`,{className:`p-4 md:p-6 max-w-full`,children:[(0,S.jsxs)(`div`,{className:`mb-4`,children:[(0,S.jsx)(`h2`,{className:`text-xl font-extrabold tracking-tight`,children:o(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:o(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:q,outputs:J,t:o}),(0,S.jsxs)(`div`,{className:`flex flex-wrap gap-3 mb-4 items-center`,children:[(0,S.jsxs)(`div`,{className:`relative flex items-center gap-2`,children:[(0,S.jsx)(d,{className:`w-3 h-3 text-base-content/40`}),(0,S.jsxs)(`button`,{className:`btn btn-sm btn-outline gap-1 min-w-[160px] justify-between`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`truncate text-xs`,children:s.size===0?o(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?o(`binding_matrix.no_area`):[...s][0]:o(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(m,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`fixed inset-0 z-40`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`absolute top-full left-0 mt-1 z-50 bg-base-100 border border-base-300 rounded-lg shadow-xl py-1 min-w-[200px] max-h-[300px] overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.size===0,onChange:()=>c(new Set)}),(0,S.jsx)(`span`,{className:`text-xs font-semibold`,children:o(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`border-t border-base-300 my-0.5`}),le&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(`__none__`),onChange:()=>{let e=new Set(s);e.has(`__none__`)?e.delete(`__none__`):e.add(`__none__`),c(e)}}),(0,S.jsx)(`span`,{className:`text-xs italic text-base-content/50`,children:o(`binding_matrix.no_area`)})]}),ce.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 px-3 py-1.5 hover:bg-base-200/60 cursor-pointer transition-colors`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-xs checkbox-primary`,checked:s.has(e),onChange:()=>{let t=new Set(s);t.has(e)?t.delete(e):t.add(e),c(t)}}),(0,S.jsx)(`span`,{className:`text-xs`,children:e})]},e))]})]})]}),(0,S.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer`,children:[(0,S.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-sm checkbox-primary`,checked:f,onChange:e=>p(e.target.checked)}),(0,S.jsxs)(`span`,{className:`text-xs font-medium text-base-content/60 flex items-center gap-1`,children:[f?(0,S.jsx)(a,{className:`w-3 h-3`}):(0,S.jsx)(v,{className:`w-3 h-3`}),o(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:q,outputs:J,areaFilter:s,hideEmpty:f,t:o,onEditInput:K,onEditOutput:ge})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:q,areaFilter:s,hideEmpty:f,t:o,onEditInput:K})}),(0,S.jsx)(F,{inputs:q,outputs:J,t:o}),(0,S.jsx)(y,{open:h,onOpenChange:g,editingItem:_,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:fe,allBinarySensors:de,allEvents:Q,allOutputs:Y,allOutputGroups:Z,allCovers:X,allAreas:$,allRemoteDevices:ue,savedOutputs:Y,savedOutputGroups:Z,savedCovers:X,onChange:x,onSave:oe,onCancel:se,onValidationChange:j,saveDisabled:A||!ye,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?he:pe,uiSchema:H===`cover`?void 0:me,allOutputs:Y,allCovers:X,allAreas:$,onChange:V,onSave:_e,onCancel:ve,saveDisabled:!be,isSaving:ae})]})};export{L as default};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,c as n,i as r,n as i,o as a,r as o,t as s}from"./monaco-61yH0vfd.js";import{y as c}from"./vendor-DjFmndpd.js";import{r as l,t as u}from"./useTranslation-DWIecEyP.js";import{S as d,Wt as f,_t as p,b as m,gt as h,vt as g}from"./index-CDsuwPez.js";var _=e(n(),1);function v(){let[e,t]=(0,_.useState)(`dark`);return(0,_.useEffect)(()=>{t(localStorage.getItem(`theme`)||`dark`);let e=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`data-theme`&&t(document.documentElement.getAttribute(`data-theme`)||`dark`)})});return e.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]}),()=>e.disconnect()},[]),e}function y(e){return f({tag:`svg`,attr:{viewBox:`0 0 24 24`},child:[{tag:`path`,attr:{d:`M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z`},child:[]},{tag:`path`,attr:{d:`M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z`},child:[]}]})(e)}var b=c();function x({isOpen:e,onClose:t}){let{t:n}=u(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await l.get(`/api/check_configuration`);o({status:e.data.status,message:e.data.message})}catch{o({status:`error`,message:n(`config_check.failed`)})}finally{i(!1)}};return e?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4`,children:[(0,b.jsx)(`h2`,{className:`text-2xl font-bold mb-6`,children:n(`config_check.title`)}),r?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-8`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg`}),(0,b.jsx)(`p`,{className:`text-lg`,children:n(`config_check.checking`)})]}):a?(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsx)(`div`,{className:`text-lg font-semibold ${a.status===`success`?`text-success`:`text-error`}`,children:a.status===`success`?n(`config_check.valid`):n(`config_check.error`)}),a.message&&(0,b.jsx)(`pre`,{className:`bg-base-300 p-4 rounded-lg whitespace-pre-wrap`,children:a.message}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4 mt-6`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{o(null),t()},children:n(`common.close`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:()=>{o(null),s()},children:n(`config_check.check_again`)})]})]}):(0,b.jsxs)(`div`,{className:`space-y-6`,children:[(0,b.jsx)(`p`,{className:`text-base-content/70`,children:n(`config_check.description`)}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:t,children:n(`common.cancel`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:s,children:n(`config_check.check_button`)})]})]})]})}):null}function S(e){return new Worker(`/assets/yaml.worker-BKRoXlmz.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new s:new i}},a.config({monaco:r});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[a,s]=(0,_.useState)(``),[c,u]=(0,_.useState)(!1),[f,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await l.get(`/api/files`)).data.items)}catch(e){console.error(`Error loading directory:`,e)}},A=async e=>{try{let t=`/api/files/${encodeURIComponent(e)}`,n=await l.get(t);i(e),s(n.data.content),localStorage.setItem(`lastOpenedFile`,e)}catch(e){console.error(`Error loading file:`,e)}},j=async()=>{if(r)try{await l.put(`/api/files/${encodeURIComponent(r)}`,{content:a}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await l.get(`/schema/config.schema.json`)).data;C=await o(e,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+`/schema/config.schema.json`,fileMatch:[`config.yaml`,`config.yml`],schema:t},...Object.keys(t.properties).map(e=>({uri:window.location.origin+`/schema/${e}.schema.json`,fileMatch:[`${e}.yaml`,`${e}.yml`],schema:t.properties[e]}))],validate:!0})}},N=async(e,t)=>{e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>{j()})},P=e=>{n(t=>{let n=t=>t.map(t=>t.path===e?{...t,isOpen:!t.isOpen}:t.children?{...t,children:n(t.children)}:t);return n(t)})},F=(e,t=0)=>e.map(e=>{let n=t==0||e.isOpen;return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${r===e.path?`bg-primary/10`:``}`,style:{paddingLeft:`${t*16+8}px`},onClick:()=>e.type===`file`?A(e.path):P(e.path),children:[e.type===`directory`&&(0,b.jsx)(`span`,{className:`text-xs`,children:n?(0,b.jsx)(m,{}):(0,b.jsx)(d,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(g,{}):(0,b.jsx)(p,{}):(0,b.jsx)(h,{})}),(0,b.jsx)(`span`,{className:`text-sm truncate`,children:e.name})]}),e.type===`directory`&&n&&e.children&&F(e.children,t+1)]},e.path)}),I=async()=>{try{return await l.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(u(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),u(!1),k();break}await new Promise(e=>setTimeout(e,1e3))}};return(0,_.useEffect)(()=>{(async()=>{await k();let e=localStorage.getItem(`lastOpenedFile`);e&&A(e)})()},[]),(0,b.jsxs)(`div`,{className:`flex h-full bg-base-300`,children:[c?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg text-center`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg mb-4`}),(0,b.jsxs)(`h2`,{className:`text-xl font-bold mb-4`,children:[f===`waiting`&&`Restarting Service...`,f===`checking`&&`Waiting for Service...`,f===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[f===`waiting`&&`Initiating service restart`,f===`checking`&&`Checking if service is back online`,f===`ready`&&`Redirecting...`]})]})}):null,(0,b.jsxs)(`div`,{className:`${w?`w-64`:`w-0`} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`p-2 text-sm font-semibold text-base-content/70 uppercase`,children:`Explorer`}),(0,b.jsx)(`div`,{className:`overflow-y-auto`,children:F(e)})]}),(0,b.jsxs)(`div`,{className:`flex-1 overflow-hidden flex flex-col h-full max-h-screen`,children:[(0,b.jsxs)(`div`,{className:`flex items-center p-2 border-b border-base-content/10`,children:[(0,b.jsx)(`button`,{onClick:()=>T(!w),className:`btn btn-ghost btn-sm p-1`,title:w?`Hide file tree`:`Show file tree`,children:(0,b.jsx)(y,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${w?``:`rotate-180`}`})}),r&&(0,b.jsx)(`span`,{className:`ml-2 text-sm opacity-70`,children:r})]}),(0,b.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,b.jsx)(t,{height:`100%`,width:`100%`,defaultLanguage:`yaml`,path:r||`config.yaml`,theme:O===`light`?`vs-light`:`vs-dark`,value:a,onChange:e=>s(e||``),onMount:N,beforeMount:M,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),(0,b.jsxs)(`div`,{className:`h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4`,children:[(0,b.jsx)(`button`,{onClick:j,disabled:!r,className:`btn btn-primary btn-sm`,children:`Save`}),(0,b.jsx)(`button`,{onClick:()=>D(!0),className:`btn btn-primary btn-sm`,children:`Check Config`}),(0,b.jsx)(`button`,{onClick:async()=>{await j();try{if((await l.post(`/api/restart`)).data.status===`not available`){let e=document.getElementById(`toast`);e&&(e.classList.remove(`hidden`),setTimeout(()=>{e.classList.add(`hidden`)},5e3))}else console.log(`Service restarted successfully`),L()}catch(e){console.error(`Error restarting service:`,e)}},disabled:!r,className:`btn btn-secondary btn-sm`,children:`Save and Restart`})]})]}),(0,b.jsx)(`div`,{id:`toast`,className:`toast toast-end hidden`,children:(0,b.jsx)(`div`,{className:`alert alert-warning`,children:(0,b.jsx)(`span`,{children:`Restart not possible. Application is not running as systemd service. Restart manually.`})})}),(0,b.jsx)(x,{isOpen:E,onClose:()=>D(!1)})]})}export{w as default};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,c as n,i as r,n as i,o as a,r as o,t as s}from"./monaco-61yH0vfd.js";import{y as c}from"./vendor-DjFmndpd.js";import{r as l,t as u}from"./useTranslation-DWIecEyP.js";import{S as d,Wt as f,_t as p,b as m,gt as h,vt as g}from"./index-mUeR1ZYi.js";var _=e(n(),1);function v(){let[e,t]=(0,_.useState)(`dark`);return(0,_.useEffect)(()=>{t(localStorage.getItem(`theme`)||`dark`);let e=new MutationObserver(e=>{e.forEach(e=>{e.attributeName===`data-theme`&&t(document.documentElement.getAttribute(`data-theme`)||`dark`)})});return e.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-theme`]}),()=>e.disconnect()},[]),e}function y(e){return f({tag:`svg`,attr:{viewBox:`0 0 24 24`},child:[{tag:`path`,attr:{d:`M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z`},child:[]},{tag:`path`,attr:{d:`M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z`},child:[]}]})(e)}var b=c();function x({isOpen:e,onClose:t}){let{t:n}=u(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await l.get(`/api/check_configuration`);o({status:e.data.status,message:e.data.message})}catch{o({status:`error`,message:n(`config_check.failed`)})}finally{i(!1)}};return e?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4`,children:[(0,b.jsx)(`h2`,{className:`text-2xl font-bold mb-6`,children:n(`config_check.title`)}),r?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-4 py-8`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg`}),(0,b.jsx)(`p`,{className:`text-lg`,children:n(`config_check.checking`)})]}):a?(0,b.jsxs)(`div`,{className:`space-y-4`,children:[(0,b.jsx)(`div`,{className:`text-lg font-semibold ${a.status===`success`?`text-success`:`text-error`}`,children:a.status===`success`?n(`config_check.valid`):n(`config_check.error`)}),a.message&&(0,b.jsx)(`pre`,{className:`bg-base-300 p-4 rounded-lg whitespace-pre-wrap`,children:a.message}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4 mt-6`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{o(null),t()},children:n(`common.close`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:()=>{o(null),s()},children:n(`config_check.check_again`)})]})]}):(0,b.jsxs)(`div`,{className:`space-y-6`,children:[(0,b.jsx)(`p`,{className:`text-base-content/70`,children:n(`config_check.description`)}),(0,b.jsxs)(`div`,{className:`flex justify-end gap-4`,children:[(0,b.jsx)(`button`,{className:`btn btn-ghost`,onClick:t,children:n(`common.cancel`)}),(0,b.jsx)(`button`,{className:`btn btn-primary`,onClick:s,children:n(`config_check.check_button`)})]})]})]})}):null}function S(e){return new Worker(`/assets/yaml.worker-BKRoXlmz.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new s:new i}},a.config({monaco:r});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[a,s]=(0,_.useState)(``),[c,u]=(0,_.useState)(!1),[f,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await l.get(`/api/files`)).data.items)}catch(e){console.error(`Error loading directory:`,e)}},A=async e=>{try{let t=`/api/files/${encodeURIComponent(e)}`,n=await l.get(t);i(e),s(n.data.content),localStorage.setItem(`lastOpenedFile`,e)}catch(e){console.error(`Error loading file:`,e)}},j=async()=>{if(r)try{await l.put(`/api/files/${encodeURIComponent(r)}`,{content:a}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await l.get(`/schema/config.schema.json`)).data;C=await o(e,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+`/schema/config.schema.json`,fileMatch:[`config.yaml`,`config.yml`],schema:t},...Object.keys(t.properties).map(e=>({uri:window.location.origin+`/schema/${e}.schema.json`,fileMatch:[`${e}.yaml`,`${e}.yml`],schema:t.properties[e]}))],validate:!0})}},N=async(e,t)=>{e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>{j()})},P=e=>{n(t=>{let n=t=>t.map(t=>t.path===e?{...t,isOpen:!t.isOpen}:t.children?{...t,children:n(t.children)}:t);return n(t)})},F=(e,t=0)=>e.map(e=>{let n=t==0||e.isOpen;return(0,b.jsxs)(`div`,{children:[(0,b.jsxs)(`button`,{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${r===e.path?`bg-primary/10`:``}`,style:{paddingLeft:`${t*16+8}px`},onClick:()=>e.type===`file`?A(e.path):P(e.path),children:[e.type===`directory`&&(0,b.jsx)(`span`,{className:`text-xs`,children:n?(0,b.jsx)(m,{}):(0,b.jsx)(d,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(g,{}):(0,b.jsx)(p,{}):(0,b.jsx)(h,{})}),(0,b.jsx)(`span`,{className:`text-sm truncate`,children:e.name})]}),e.type===`directory`&&n&&e.children&&F(e.children,t+1)]},e.path)}),I=async()=>{try{return await l.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(u(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),u(!1),k();break}await new Promise(e=>setTimeout(e,1e3))}};return(0,_.useEffect)(()=>{(async()=>{await k();let e=localStorage.getItem(`lastOpenedFile`);e&&A(e)})()},[]),(0,b.jsxs)(`div`,{className:`flex h-full bg-base-300`,children:[c?(0,b.jsx)(`div`,{className:`fixed inset-0 bg-base-300/80 flex items-center justify-center z-50`,children:(0,b.jsxs)(`div`,{className:`bg-base-200 p-8 rounded-lg shadow-lg text-center`,children:[(0,b.jsx)(`div`,{className:`loading loading-spinner loading-lg mb-4`}),(0,b.jsxs)(`h2`,{className:`text-xl font-bold mb-4`,children:[f===`waiting`&&`Restarting Service...`,f===`checking`&&`Waiting for Service...`,f===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[f===`waiting`&&`Initiating service restart`,f===`checking`&&`Checking if service is back online`,f===`ready`&&`Redirecting...`]})]})}):null,(0,b.jsxs)(`div`,{className:`${w?`w-64`:`w-0`} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[(0,b.jsx)(`div`,{className:`p-2 text-sm font-semibold text-base-content/70 uppercase`,children:`Explorer`}),(0,b.jsx)(`div`,{className:`overflow-y-auto`,children:F(e)})]}),(0,b.jsxs)(`div`,{className:`flex-1 overflow-hidden flex flex-col h-full max-h-screen`,children:[(0,b.jsxs)(`div`,{className:`flex items-center p-2 border-b border-base-content/10`,children:[(0,b.jsx)(`button`,{onClick:()=>T(!w),className:`btn btn-ghost btn-sm p-1`,title:w?`Hide file tree`:`Show file tree`,children:(0,b.jsx)(y,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${w?``:`rotate-180`}`})}),r&&(0,b.jsx)(`span`,{className:`ml-2 text-sm opacity-70`,children:r})]}),(0,b.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,b.jsx)(t,{height:`100%`,width:`100%`,defaultLanguage:`yaml`,path:r||`config.yaml`,theme:O===`light`?`vs-light`:`vs-dark`,value:a,onChange:e=>s(e||``),onMount:N,beforeMount:M,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),(0,b.jsxs)(`div`,{className:`h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4`,children:[(0,b.jsx)(`button`,{onClick:j,disabled:!r,className:`btn btn-primary btn-sm`,children:`Save`}),(0,b.jsx)(`button`,{onClick:()=>D(!0),className:`btn btn-primary btn-sm`,children:`Check Config`}),(0,b.jsx)(`button`,{onClick:async()=>{await j();try{if((await l.post(`/api/restart`)).data.status===`not available`){let e=document.getElementById(`toast`);e&&(e.classList.remove(`hidden`),setTimeout(()=>{e.classList.add(`hidden`)},5e3))}else console.log(`Service restarted successfully`),L()}catch(e){console.error(`Error restarting service:`,e)}},disabled:!r,className:`btn btn-secondary btn-sm`,children:`Save and Restart`})]})]}),(0,b.jsx)(`div`,{id:`toast`,className:`toast toast-end hidden`,children:(0,b.jsx)(`div`,{className:`alert alert-warning`,children:(0,b.jsx)(`span`,{children:`Restart not possible. Application is not running as systemd service. Restart manually.`})})}),(0,b.jsx)(x,{isOpen:E,onClose:()=>D(!1)})]})}export{w as default};