boneio 1.5.0.dev13__tar.gz → 1.5.0.dev15__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 (504) hide show
  1. {boneio-1.5.0.dev13/boneio.egg-info → boneio-1.5.0.dev15}/PKG-INFO +1 -1
  2. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/detectors.py +68 -6
  3. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/event.py +13 -5
  4. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/yaml_util.py +53 -5
  5. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/input/manager.py +47 -0
  6. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/schema.yaml +3 -2
  7. boneio-1.5.0.dev15/boneio/version.py +2 -0
  8. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/BindingMatrix-aj3riWWZ.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/BindingMatrix-DsKdP5N1.js +1 -1
  9. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ConfigEditor-Blrg9Au1.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/ConfigEditor-By202vRn.js +1 -1
  10. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EditItemDialog-cJc7C25R.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/EditItemDialog-CdZkM5Kd.js +2 -2
  11. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityCard-CVnjkl2Y.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/EntityCard-DpydvcZq.js +1 -1
  12. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityGrid-B6mC4OZ8.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/EntityGrid-BRj8qdE9.js +1 -1
  13. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/InputsView-C09ulmeN.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/InputsView-d7EOPtIN.js +1 -1
  14. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/LogViewer-U1DEZ2mc.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/LogViewer-DVkf_ukL.js +1 -1
  15. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ModbusView-MqeWOSDT.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/ModbusView-DJ7MoMI3.js +1 -1
  16. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/NodeRedView-CNPh9Kak.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/NodeRedView-DOJQnKOE.js +1 -1
  17. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/OutputsView-uXH9nyRR.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/OutputsView-CURtKQyQ.js +1 -1
  18. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SensorView-DW85dbP7.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/SensorView-B3omnBe8.js +1 -1
  19. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SudoPasswordDialog-C9jQ6QtB.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/SudoPasswordDialog-COFOpIj6.js +1 -1
  20. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SystemState-A6TNdNT0.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/SystemState-vbzgggYn.js +1 -1
  21. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/TemplatesView-Bmu7KfpS.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/TemplatesView-FAgj-ZKR.js +1 -1
  22. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/Tools-C-qgHesX.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/Tools-Cw5vVHi6.js +1 -1
  23. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/UISettings-B_Vt1ikn.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/UISettings-DMBdnf7H.js +3 -3
  24. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/dialog-Dj_HN1ZA.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/dialog-C-h9IDcL.js +1 -1
  25. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/gi-Dt8p1sub.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/gi-0yDnJaQ6.js +1 -1
  26. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/index-CyBZuJ67.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/index-mFb2SAmz.js +2 -2
  27. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D8uh5ILp.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-IFzjQYp0.js +1 -1
  28. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/select-Bxh-o8g9.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/select-UHPLBv4p.js +1 -1
  29. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/tabs-box-Bjw4Iwcm.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/tabs-box-DxyEvUVv.js +1 -1
  30. boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/utils-BmlJVtvk.js → boneio-1.5.0.dev15/boneio/webui/frontend-dist/assets/utils-D9LEYj3M.js +1 -1
  31. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/index.html +1 -1
  32. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/config.schema.json +1 -1
  33. {boneio-1.5.0.dev13/boneio/webui → boneio-1.5.0.dev15/boneio/webui/frontend-dist}/schema/event.schema.json +1 -1
  34. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/sw.js +1 -1
  35. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/config.py +14 -0
  36. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/config.schema.json +1 -1
  37. {boneio-1.5.0.dev13/boneio/webui/frontend-dist → boneio-1.5.0.dev15/boneio/webui}/schema/event.schema.json +1 -1
  38. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15/boneio.egg-info}/PKG-INFO +1 -1
  39. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio.egg-info/SOURCES.txt +23 -23
  40. boneio-1.5.0.dev13/boneio/version.py +0 -2
  41. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/LICENSE +0 -0
  42. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/MANIFEST.in +0 -0
  43. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/README.md +0 -0
  44. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/__init__.py +0 -0
  45. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/input.yaml +0 -0
  46. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/output_24_16.yaml +0 -0
  47. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/output_32_10.yaml +0 -0
  48. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/output_32_5.yaml +0 -0
  49. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/output_cover.yaml +0 -0
  50. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  51. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/input.yaml +0 -0
  52. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/output_24_16.yaml +0 -0
  53. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/output_32_10.yaml +0 -0
  54. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/output_32_5.yaml +0 -0
  55. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/output_cover.yaml +0 -0
  56. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  57. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/input.yaml +0 -0
  58. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/output_24_16.yaml +0 -0
  59. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/output_32_10.yaml +0 -0
  60. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/output_32_5.yaml +0 -0
  61. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/output_cover.yaml +0 -0
  62. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  63. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.5/input.yaml +0 -0
  64. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.5/output_24_16.yaml +0 -0
  65. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.5/output_32_10.yaml +0 -0
  66. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.5/output_cover.yaml +0 -0
  67. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  68. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.6/input.yaml +0 -0
  69. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.6/output_24_16.yaml +0 -0
  70. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.6/output_32_10.yaml +0 -0
  71. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.6/output_cover.yaml +0 -0
  72. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  73. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/input.yaml +0 -0
  74. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/output_24_16.yaml +0 -0
  75. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/output_32_10.yaml +0 -0
  76. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/output_48_4.yaml +0 -0
  77. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/output_cover.yaml +0 -0
  78. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  79. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/input.yaml +0 -0
  80. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/output_24_16.yaml +0 -0
  81. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/output_32_10.yaml +0 -0
  82. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/output_48_4.yaml +0 -0
  83. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/output_cover.yaml +0 -0
  84. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  85. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/input.yaml +0 -0
  86. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/output_24_16.yaml +0 -0
  87. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/output_32_10.yaml +0 -0
  88. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/output_48_4.yaml +0 -0
  89. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/output_cover.yaml +0 -0
  90. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  91. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/bonecli.py +0 -0
  92. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/__init__.py +0 -0
  93. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/cover/__init__.py +0 -0
  94. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/cover/cover.py +0 -0
  95. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/cover/time_based.py +0 -0
  96. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/cover/venetian.py +0 -0
  97. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/group/__init__.py +0 -0
  98. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/group/output_group.py +0 -0
  99. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/__init__.py +0 -0
  100. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/binary_sensor.py +0 -0
  101. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/remote/__init__.py +0 -0
  102. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/remote/base.py +0 -0
  103. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/input/remote/esphome.py +0 -0
  104. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/irrigation/__init__.py +0 -0
  105. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/irrigation/controller.py +0 -0
  106. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/irrigation/water_source.py +0 -0
  107. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/__init__.py +0 -0
  108. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/basic.py +0 -0
  109. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/buzzer.py +0 -0
  110. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/mcp.py +0 -0
  111. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/pca.py +0 -0
  112. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/pcf.py +0 -0
  113. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/output/remote.py +0 -0
  114. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/sensor/__init__.py +0 -0
  115. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/sensor/virtual_energy.py +0 -0
  116. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/template/__init__.py +0 -0
  117. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/template/alarm_panel.py +0 -0
  118. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/template/gate_cover.py +0 -0
  119. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/components/template/thermostat.py +0 -0
  120. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/const.py +0 -0
  121. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/__init__.py +0 -0
  122. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/__init__.py +0 -0
  123. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/data/__init__.py +0 -0
  124. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  125. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  126. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  127. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/registration.py +0 -0
  128. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/cloud/secrets.py +0 -0
  129. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/__init__.py +0 -0
  130. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/config_helper.py +0 -0
  131. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/migrations/__init__.py +0 -0
  132. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  133. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/migrations/v2_transition.py +0 -0
  134. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  135. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/package-lock.json +0 -0
  136. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/package.json +0 -0
  137. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/config/schema_converter.py +0 -0
  138. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/discovery.py +0 -0
  139. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/events/__init__.py +0 -0
  140. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/events/bus.py +0 -0
  141. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/__init__.py +0 -0
  142. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/action_conditions.py +0 -0
  143. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/canopen.py +0 -0
  144. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/covers.py +0 -0
  145. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/display.py +0 -0
  146. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/inputs.py +0 -0
  147. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/irrigation.py +0 -0
  148. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/manager.py +0 -0
  149. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/modbus.py +0 -0
  150. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/outputs.py +0 -0
  151. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/remote.py +0 -0
  152. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/remote_input_registrar.py +0 -0
  153. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/sensors.py +0 -0
  154. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/templates/__init__.py +0 -0
  155. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/templates/alarm.py +0 -0
  156. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/templates/gate_cover.py +0 -0
  157. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/templates/thermostat.py +0 -0
  158. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/templates.py +0 -0
  159. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/manager/update.py +0 -0
  160. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/__init__.py +0 -0
  161. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/basic.py +0 -0
  162. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/basic_mqtt.py +0 -0
  163. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/composite.py +0 -0
  164. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/local.py +0 -0
  165. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/lox.py +0 -0
  166. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/mqtt.py +0 -0
  167. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/messaging/queue.py +0 -0
  168. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/__init__.py +0 -0
  169. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/base.py +0 -0
  170. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/can.py +0 -0
  171. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/esphome.py +0 -0
  172. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/mqtt.py +0 -0
  173. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/wled.py +0 -0
  174. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/remote/wled_cache.py +0 -0
  175. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/sensor/__init__.py +0 -0
  176. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/sensor/base.py +0 -0
  177. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/sensor/system.py +0 -0
  178. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/state/__init__.py +0 -0
  179. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/state/manager.py +0 -0
  180. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/system/__init__.py +0 -0
  181. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/system/host_data.py +0 -0
  182. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/system/monitor.py +0 -0
  183. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/__init__.py +0 -0
  184. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/async_updater.py +0 -0
  185. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/conditions.py +0 -0
  186. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/filter.py +0 -0
  187. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/font_util.py +0 -0
  188. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/logger.py +0 -0
  189. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/timeperiod.py +0 -0
  190. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/core/utils/util.py +0 -0
  191. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/adc.yaml +0 -0
  192. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  193. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/config.yaml +0 -0
  194. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/event.yaml +0 -0
  195. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/mqtt.yaml +0 -0
  196. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  197. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/adc.yaml +0 -0
  198. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  199. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/config.yaml +0 -0
  200. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/event.yaml +0 -0
  201. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/mqtt.yaml +0 -0
  202. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  203. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/adc.yaml +0 -0
  204. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  205. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/config.yaml +0 -0
  206. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/event.yaml +0 -0
  207. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/mqtt.yaml +0 -0
  208. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  209. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/__init__.py +0 -0
  210. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/can_master.yaml +0 -0
  211. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/can_slave.yaml +0 -0
  212. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/adc.yaml +0 -0
  213. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  214. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/config.yaml +0 -0
  215. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/cover.yaml +0 -0
  216. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/event.yaml +0 -0
  217. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/mqtt.yaml +0 -0
  218. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover/outputCover.yaml +0 -0
  219. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/adc.yaml +0 -0
  220. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  221. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/config.yaml +0 -0
  222. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/cover.yaml +0 -0
  223. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/event.yaml +0 -0
  224. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  225. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  226. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/adc.yaml +0 -0
  227. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  228. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  229. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  230. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  231. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/event_all.yaml +0 -0
  232. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  233. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  234. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  235. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  236. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  237. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  238. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/exceptions.py +0 -0
  239. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/__init__.py +0 -0
  240. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/analog/__init__.py +0 -0
  241. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/analog/adc.py +0 -0
  242. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/__init__.py +0 -0
  243. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/bridge.py +0 -0
  244. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/client.py +0 -0
  245. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/interface.py +0 -0
  246. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/node.py +0 -0
  247. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/node_id.py +0 -0
  248. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/can/test_od.py +0 -0
  249. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/display/__init__.py +0 -0
  250. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/display/early_oled.py +0 -0
  251. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  252. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/display/oled.py +0 -0
  253. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/__init__.py +0 -0
  254. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  255. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  256. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  257. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  258. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/input/__init__.py +0 -0
  259. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/gpio/input/base.py +0 -0
  260. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/__init__.py +0 -0
  261. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/bus.py +0 -0
  262. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/ina219.py +0 -0
  263. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/ina219_driver.py +0 -0
  264. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/mcp9808.py +0 -0
  265. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/i2c/pct2075.py +0 -0
  266. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/onewire/__init__.py +0 -0
  267. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/onewire/bus.py +0 -0
  268. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/onewire/dallas.py +0 -0
  269. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/onewire/ds2482.py +0 -0
  270. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/sensor/__init__.py +0 -0
  271. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  272. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/sensor/temperature/base.py +0 -0
  273. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  274. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  275. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/integration/__init__.py +0 -0
  276. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/integration/homeassistant.py +0 -0
  277. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/integration/interlock.py +0 -0
  278. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/integration/lox_template.py +0 -0
  279. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/__init__.py +0 -0
  280. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/actions.py +0 -0
  281. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  282. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/daemon.json +0 -0
  283. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  284. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  285. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  286. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  287. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  288. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/journald/journald.conf +0 -0
  289. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  290. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/sudoers/boneio +0 -0
  291. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  292. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  293. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/systemd/boneio.service +0 -0
  294. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  295. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  296. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  297. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  298. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  299. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  300. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  301. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  302. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  303. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/runner.py +0 -0
  304. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/__init__.py +0 -0
  305. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  306. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  307. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  308. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  309. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  310. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  311. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  312. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  313. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/__init__.py +0 -0
  314. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/cli.py +0 -0
  315. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/client.py +0 -0
  316. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/coordinator.py +0 -0
  317. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/__init__.py +0 -0
  318. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  319. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  320. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  321. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  322. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  323. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  324. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  325. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  326. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  327. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  328. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/hvac/thessla.json +0 -0
  329. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  330. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  331. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/inverters/sofar.json +0 -0
  332. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  333. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  334. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  335. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  336. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/cwt.json +0 -0
  337. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  338. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  339. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  340. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  341. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/pt100.json +0 -0
  342. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/sht20.json +0 -0
  343. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/devices/sensors/sht30.json +0 -0
  344. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/__init__.py +0 -0
  345. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/base.py +0 -0
  346. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/derived/__init__.py +0 -0
  347. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/derived/numeric.py +0 -0
  348. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/derived/select.py +0 -0
  349. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/derived/switch.py +0 -0
  350. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/derived/text.py +0 -0
  351. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/sensor/__init__.py +0 -0
  352. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/sensor/binary.py +0 -0
  353. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/sensor/numeric.py +0 -0
  354. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/sensor/text.py +0 -0
  355. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/writeable/__init__.py +0 -0
  356. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/writeable/binary.py +0 -0
  357. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/entities/writeable/numeric.py +0 -0
  358. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/mock_coordinator.py +0 -0
  359. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/modbus/utils.py +0 -0
  360. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/__init__.py +0 -0
  361. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/actions.py +0 -0
  362. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/events.py +0 -0
  363. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/files.py +0 -0
  364. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/logs.py +0 -0
  365. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/mqtt.py +0 -0
  366. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/models/state.py +0 -0
  367. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/runner.py +0 -0
  368. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/actions.yaml +0 -0
  369. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/actions_sensor.yaml +0 -0
  370. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/actions_switch.yaml +0 -0
  371. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/condition.yaml +0 -0
  372. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/filters.yaml +0 -0
  373. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/filters_adc.yaml +0 -0
  374. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/id.yaml +0 -0
  375. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/remote_devices.yaml +0 -0
  376. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/remote_inputs.yaml +0 -0
  377. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/remote_outputs.yaml +0 -0
  378. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/temp_unit.yaml +0 -0
  379. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/schema/update_interval.yaml +0 -0
  380. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/action_validation.py +0 -0
  381. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/app.py +0 -0
  382. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/dashboard_cards.py +0 -0
  383. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +0 -0
  384. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +0 -0
  385. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +0 -0
  386. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +0 -0
  387. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  388. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  389. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  390. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  391. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  392. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  393. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  394. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  395. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  396. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +0 -0
  397. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  398. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  399. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  400. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  401. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  402. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +0 -0
  403. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +0 -0
  404. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  405. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  406. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  407. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  408. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/boneio.svg +0 -0
  409. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  410. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  411. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  412. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  413. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  414. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  415. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  416. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  417. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  418. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  419. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  420. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  421. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  422. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  423. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  424. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  425. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  426. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  427. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  428. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  429. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  430. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  431. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  432. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  433. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  434. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  435. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  436. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  437. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  438. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  439. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  440. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  441. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/hvac_svg_templates.py +0 -0
  442. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/middleware/__init__.py +0 -0
  443. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/middleware/auth.py +0 -0
  444. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/modbus_card_templates.py +0 -0
  445. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/__init__.py +0 -0
  446. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/auth.py +0 -0
  447. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/caddy.py +0 -0
  448. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/can.py +0 -0
  449. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/covers.py +0 -0
  450. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/dashboard.py +0 -0
  451. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/dev_fake_device.py +0 -0
  452. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/irrigation.py +0 -0
  453. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/migrations.py +0 -0
  454. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/modbus.py +0 -0
  455. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/outputs.py +0 -0
  456. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/remote_devices.py +0 -0
  457. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/sensors.py +0 -0
  458. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/system.py +0 -0
  459. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/templates.py +0 -0
  460. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/timezone_sudoers.py +0 -0
  461. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/tools.py +0 -0
  462. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/routes/update.py +0 -0
  463. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/adc.schema.json +0 -0
  464. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/areas.schema.json +0 -0
  465. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  466. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/boneio.schema.json +0 -0
  467. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/can.schema.json +0 -0
  468. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/cover.schema.json +0 -0
  469. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/dallas.schema.json +0 -0
  470. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/ds2482.schema.json +0 -0
  471. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/ina219.schema.json +0 -0
  472. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/irrigation.schema.json +0 -0
  473. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/lm75.schema.json +0 -0
  474. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/logger.schema.json +0 -0
  475. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/lox_udp.schema.json +0 -0
  476. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/mcp23017.schema.json +0 -0
  477. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/mcp9808.schema.json +0 -0
  478. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/modbus.schema.json +0 -0
  479. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  480. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/mqtt.schema.json +0 -0
  481. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/oled.schema.json +0 -0
  482. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/output.schema.json +0 -0
  483. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/output_group.schema.json +0 -0
  484. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/pca9685.schema.json +0 -0
  485. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/pcf8575.schema.json +0 -0
  486. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/remote_devices.schema.json +0 -0
  487. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  488. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  489. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/sensor.schema.json +0 -0
  490. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/template.schema.json +0 -0
  491. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  492. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/schema/web.schema.json +0 -0
  493. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/services/__init__.py +0 -0
  494. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/services/logs.py +0 -0
  495. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/web_server.py +0 -0
  496. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio/webui/websocket_manager.py +0 -0
  497. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio.egg-info/dependency_links.txt +0 -0
  498. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio.egg-info/entry_points.txt +0 -0
  499. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio.egg-info/requires.txt +0 -0
  500. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/boneio.egg-info/top_level.txt +0 -0
  501. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/pyproject.toml +0 -0
  502. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/setup.cfg +0 -0
  503. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/setup.py +0 -0
  504. {boneio-1.5.0.dev13 → boneio-1.5.0.dev15}/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.dev13
3
+ Version: 1.5.0.dev15
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
@@ -65,6 +65,9 @@ class MultiClickDetector:
65
65
  Based on multiclick_detector.py from tests.
66
66
  """
67
67
 
68
+ # How often (in seconds) to verify physical GPIO state during long press
69
+ _GPIO_READBACK_INTERVAL_S = 3.0
70
+
68
71
  def __init__(
69
72
  self,
70
73
  loop: asyncio.AbstractEventLoop,
@@ -78,7 +81,7 @@ class MultiClickDetector:
78
81
  enable_triple_click: bool = False,
79
82
  name: str = "unknown",
80
83
  pin: str = "unknown",
81
- max_long_press_seconds: float = 120.0,
84
+ max_long_press_seconds: float = 30.0,
82
85
  ):
83
86
  """Initialize multiclick detector.
84
87
 
@@ -94,7 +97,7 @@ class MultiClickDetector:
94
97
  enable_triple_click: Enable triple click detection (default: False)
95
98
  name: Name of the input
96
99
  pin: Pin name for logging
97
- max_long_press_seconds: Safety timeout for long press in seconds (default: 120s)
100
+ max_long_press_seconds: Safety timeout for long press in seconds (default: 30s)
98
101
  """
99
102
  self._loop = loop
100
103
  self._callback = callback
@@ -107,9 +110,19 @@ class MultiClickDetector:
107
110
  self._enable_triple_click = enable_triple_click
108
111
  self._name = name
109
112
  self._pin = pin
110
- self._max_long_press_seconds = max_long_press_seconds
113
+ self._max_long_press_seconds = min(max_long_press_seconds, 30.0)
111
114
  self._state = ClickState()
112
115
  self._boot_press_suppressed = False # Set by GpioManager._seed_initial_states
116
+ # Optional GPIO readback function: returns True if pin is HIGH (released)
117
+ # Set by GpioManager after startup to enable physical state verification
118
+ self._gpio_readback_fn: Callable[[], bool | None] | None = None
119
+ # Track last readback time to avoid reading GPIO too often
120
+ self._last_readback_time: float = 0.0
121
+
122
+ _LOGGER.debug(
123
+ "MultiClickDetector init: %s (%s) max_long_press=%.1fs",
124
+ name, pin, self._max_long_press_seconds,
125
+ )
113
126
 
114
127
  # Pre-compute which click types should be delayed in exclusive mode
115
128
  # based on enabled sequences
@@ -363,15 +376,20 @@ class MultiClickDetector:
363
376
  def _detect_long_press(self) -> None:
364
377
  """Detect and report a long press and start periodic updates."""
365
378
  if not self._state.last_press_loop_ts:
379
+ _LOGGER.debug(
380
+ "_detect_long_press called for %s but no last_press_loop_ts — ignoring",
381
+ self._name,
382
+ )
366
383
  return
367
384
 
368
385
  # Reset executed actions for new long press
369
386
  self._state.executed_long_actions = set()
370
387
  self._state.last_repeat_times = {}
388
+ self._last_readback_time = self._loop.time() # Reset readback timer
371
389
 
372
390
  duration = self._loop.time() - self._state.last_press_loop_ts
373
391
 
374
- _LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
392
+ _LOGGER.info("Detected LONG press on %s (%s), duration=%.3fs", self._name, self._pin, duration)
375
393
 
376
394
  self._state.click_count = 0 # Reset click counter
377
395
  self._state.long_press_timer = None
@@ -385,14 +403,29 @@ class MultiClickDetector:
385
403
  0.2, # 200ms
386
404
  self._send_periodic_long_event
387
405
  )
406
+ _LOGGER.debug(
407
+ "Started periodic long timer for %s (interval=200ms, max=%.0fs)",
408
+ self._name, self._max_long_press_seconds,
409
+ )
388
410
 
389
411
  def _send_periodic_long_event(self) -> None:
390
- """Send periodic 'long' event with updated duration."""
412
+ """Send periodic 'long' event with updated duration.
413
+
414
+ Every _GPIO_READBACK_INTERVAL_S seconds, also reads the physical
415
+ GPIO state to detect missed RELEASE edge events.
416
+ """
391
417
  if not self._state.last_press_loop_ts or self._state.last_release_ts:
392
418
  # Button released or invalid state
419
+ _LOGGER.debug(
420
+ "Periodic long skipped for %s: press_ts=%s, release_ts=%s",
421
+ self._name,
422
+ self._state.last_press_loop_ts is not None,
423
+ self._state.last_release_ts,
424
+ )
393
425
  return
394
426
 
395
- duration = self._loop.time() - self._state.last_press_loop_ts
427
+ now = self._loop.time()
428
+ duration = now - self._state.last_press_loop_ts
396
429
 
397
430
  # Safety timeout: stop periodic events if duration exceeds max
398
431
  if duration > self._max_long_press_seconds:
@@ -407,6 +440,35 @@ class MultiClickDetector:
407
440
  self._force_stop_long_press()
408
441
  return
409
442
 
443
+ # GPIO readback check: every _GPIO_READBACK_INTERVAL_S, verify physical
444
+ # pin state to catch missed RELEASE edge events (EMI, kernel bugs, etc.)
445
+ if (
446
+ self._gpio_readback_fn is not None
447
+ and (now - self._last_readback_time) >= self._GPIO_READBACK_INTERVAL_S
448
+ ):
449
+ self._last_readback_time = now
450
+ try:
451
+ pin_is_high = self._gpio_readback_fn()
452
+ if pin_is_high is not None and pin_is_high:
453
+ # Pin is HIGH = button released (pull-up), but we never got RISING_EDGE
454
+ _LOGGER.warning(
455
+ "GPIO readback: %s (%s) pin is HIGH (released) but no RELEASE event received! "
456
+ "duration=%.1fs. Forcing stop — likely missed RISING_EDGE.",
457
+ self._name,
458
+ self._pin,
459
+ duration,
460
+ )
461
+ self._force_stop_long_press()
462
+ return
463
+ _LOGGER.debug(
464
+ "GPIO readback: %s (%s) pin is LOW (still pressed), duration=%.1fs",
465
+ self._name, self._pin, duration,
466
+ )
467
+ except Exception as exc:
468
+ _LOGGER.debug(
469
+ "GPIO readback failed for %s: %s", self._name, exc,
470
+ )
471
+
410
472
  _LOGGER.debug(
411
473
  "Periodic long event on %s (%s), duration=%.3fs",
412
474
  self._name,
@@ -80,24 +80,32 @@ class GpioEventButton(GpioBaseClass):
80
80
  # Get enable_triple_click setting (default: False)
81
81
  enable_triple_click = kwargs.get("enable_triple_click", False)
82
82
 
83
- # Safety timeout for long press (default: 120s)
83
+ # Safety timeout for long press (default: 30s, hard max: 30s)
84
84
  max_long_press_seconds = (
85
85
  _to_milliseconds(
86
86
  kwargs.get("max_long_press_duration"),
87
- 120 * 1000, # 120s default
87
+ 30 * 1000, # 30s default
88
88
  )
89
89
  / 1000.0
90
90
  )
91
- # Guard: if resolved to < 0.8s (misconfigured or zero), use default 120s
91
+ # Clamp to hard maximum of 30s no one holds a button longer
92
+ if max_long_press_seconds > 30.0:
93
+ _LOGGER.info(
94
+ "max_long_press_duration for %s clamped from %.1fs to 30s (hard max)",
95
+ kwargs.get("name", "unknown"),
96
+ max_long_press_seconds,
97
+ )
98
+ max_long_press_seconds = 30.0
99
+ # Guard: if resolved to < 0.8s (misconfigured or zero), use default 30s
92
100
  if max_long_press_seconds < 0.8:
93
101
  raw = kwargs.get("max_long_press_duration")
94
102
  if raw is not None:
95
103
  _LOGGER.warning(
96
- "max_long_press_duration for %s resolved to %.1fs (too small), using default 120s",
104
+ "max_long_press_duration for %s resolved to %.1fs (too small), using default 30s",
97
105
  kwargs.get("name", "unknown"),
98
106
  max_long_press_seconds,
99
107
  )
100
- max_long_press_seconds = 120.0
108
+ max_long_press_seconds = 30.0
101
109
  _LOGGER.debug(
102
110
  "max_long_press_seconds for %s = %.1fs",
103
111
  kwargs.get("name", "unknown"),
@@ -1227,11 +1227,17 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1227
1227
  Returns:
1228
1228
  dict: Status response with success/error message
1229
1229
  """
1230
+ import time
1230
1231
  from pathlib import Path
1231
1232
 
1233
+ t_start = time.perf_counter()
1232
1234
  config_dir = Path(config_file).parent
1233
1235
 
1234
- _LOGGER.info(f"Updating section '{section}' with data: {data}")
1236
+ data_size = len(str(data)) if data else 0
1237
+ _LOGGER.info(
1238
+ "[SAVE] START section='%s' data_size=%d bytes",
1239
+ section, data_size,
1240
+ )
1235
1241
 
1236
1242
  # Special handling for mcp23017 - convert hex strings to integers
1237
1243
  # This ensures YAML writes them as integers which are then read back as hex
@@ -1259,8 +1265,12 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1259
1265
  wled.pop(field, None)
1260
1266
 
1261
1267
  # Strip default values to keep YAML clean
1268
+ t_strip = time.perf_counter()
1262
1269
  cleaned_data = strip_default_values(data, {}, section)
1263
- _LOGGER.info(f"Cleaned data (defaults removed): {cleaned_data}")
1270
+ _LOGGER.info(
1271
+ "[SAVE] strip_default_values took %.3fs",
1272
+ time.perf_counter() - t_strip,
1273
+ )
1264
1274
 
1265
1275
  # Custom YAML loader that preserves !include tags
1266
1276
  class IncludeLoader(SafeLoader):
@@ -1277,8 +1287,13 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1277
1287
 
1278
1288
  try:
1279
1289
  # Read current config.yaml with custom loader
1290
+ t_load = time.perf_counter()
1280
1291
  with open(config_file, encoding="utf-8") as f:
1281
1292
  config_content = load(f, Loader=IncludeLoader)
1293
+ _LOGGER.info(
1294
+ "[SAVE] yaml.load(config.yaml) took %.3fs",
1295
+ time.perf_counter() - t_load,
1296
+ )
1282
1297
 
1283
1298
  if config_content is None:
1284
1299
  config_content = {}
@@ -1296,13 +1311,21 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1296
1311
  _LOGGER.info(f"Section '{section}' uses !include '{include_filename}', updating {include_file_path}")
1297
1312
 
1298
1313
  # Save cleaned data to the included file
1314
+ t_dump = time.perf_counter()
1299
1315
  content = dump(
1300
1316
  cleaned_data, Dumper=TimePeriodDumper, default_flow_style=False, allow_unicode=True, sort_keys=False
1301
1317
  )
1318
+ _LOGGER.info(
1319
+ "[SAVE] yaml.dump(!include data) took %.3fs (%d bytes)",
1320
+ time.perf_counter() - t_dump, len(content),
1321
+ )
1322
+ t_write = time.perf_counter()
1302
1323
  with open(include_file_path, "w", encoding="utf-8") as f:
1303
1324
  f.write(content)
1304
-
1305
- _LOGGER.info(f"Successfully updated included file: {include_file_path}")
1325
+ _LOGGER.info(
1326
+ "[SAVE] file write (!include) took %.3fs",
1327
+ time.perf_counter() - t_write,
1328
+ )
1306
1329
 
1307
1330
  else:
1308
1331
  # It's a regular section - replace in config.yaml
@@ -1311,14 +1334,20 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1311
1334
 
1312
1335
  # Save updated config.yaml (need to handle !include when saving)
1313
1336
  # Read original file as text to preserve !include syntax
1337
+ t_reread = time.perf_counter()
1314
1338
  with open(config_file, encoding="utf-8") as f:
1315
1339
  original_lines = f.readlines()
1340
+ _LOGGER.info(
1341
+ "[SAVE] re-read config as text took %.3fs (%d lines)",
1342
+ time.perf_counter() - t_reread, len(original_lines),
1343
+ )
1316
1344
 
1317
1345
  # Find and replace the section in the original text
1318
1346
  updated_lines = []
1319
1347
  in_section = False
1320
1348
  section_indent = 0
1321
1349
 
1350
+ t_dump = time.perf_counter()
1322
1351
  for line in original_lines:
1323
1352
  stripped = line.strip()
1324
1353
  # Check if this line starts the target section
@@ -1352,12 +1381,21 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1352
1381
  # Skip lines that are part of the old section
1353
1382
  else:
1354
1383
  updated_lines.append(line)
1384
+ _LOGGER.info(
1385
+ "[SAVE] yaml.dump(section) + line replace took %.3fs",
1386
+ time.perf_counter() - t_dump,
1387
+ )
1355
1388
 
1356
1389
  # Write updated config
1390
+ t_write = time.perf_counter()
1357
1391
  with open(config_file, "w", encoding="utf-8") as f:
1358
1392
  f.writelines(updated_lines)
1393
+ _LOGGER.info(
1394
+ "[SAVE] file write (config.yaml) took %.3fs",
1395
+ time.perf_counter() - t_write,
1396
+ )
1359
1397
 
1360
- _LOGGER.info(f"Successfully updated section '{section}' in config.yaml")
1398
+ _LOGGER.info("[SAVE] section '%s' inline update done", section)
1361
1399
  else:
1362
1400
  # Section doesn't exist - add it to config.yaml
1363
1401
  _LOGGER.info(f"Section '{section}' doesn't exist, adding to config.yaml")
@@ -1375,6 +1413,16 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1375
1413
 
1376
1414
  _LOGGER.info(f"Successfully added new section '{section}' to config.yaml")
1377
1415
 
1416
+ t_total = time.perf_counter() - t_start
1417
+ _LOGGER.info(
1418
+ "[SAVE] DONE section='%s' total=%.3fs",
1419
+ section, t_total,
1420
+ )
1421
+ if t_total > 1.0:
1422
+ _LOGGER.warning(
1423
+ "[SAVE] SLOW save detected: section='%s' took %.3fs",
1424
+ section, t_total,
1425
+ )
1378
1426
  return {"status": "success", "message": f"Section '{section}' saved successfully"}
1379
1427
 
1380
1428
  except Exception as e:
@@ -354,6 +354,53 @@ class GpioManager:
354
354
  "Armed boot press suppression on %d GPIO detector(s)", seeded
355
355
  )
356
356
 
357
+ # Install GPIO readback callbacks on detectors for missed-RELEASE detection.
358
+ # During long press, detectors periodically call this to verify the physical
359
+ # pin state hasn't changed without an edge event.
360
+ self._install_gpio_readback()
361
+
362
+ def _install_gpio_readback(self) -> None:
363
+ """Install GPIO readback callbacks on MultiClickDetectors.
364
+
365
+ Creates a closure for each detector that reads the physical GPIO line state
366
+ via gpiod get_values(). The detector calls this every ~3s during long press
367
+ to catch missed RISING_EDGE events (EMI, kernel bugs, etc.).
368
+ """
369
+ from boneio.components.input.detectors import MultiClickDetector
370
+
371
+ installed = 0
372
+ for chip, request in self._requests.items():
373
+ for (c, line), detector in self._detectors.items():
374
+ if c != chip:
375
+ continue
376
+ if not isinstance(detector, MultiClickDetector):
377
+ continue
378
+
379
+ # Create a closure capturing this specific chip/line/request
380
+ def make_readback(req: gpiod.LineRequest, ln: int) -> Callable[[], bool | None]:
381
+ """Create readback function for a specific GPIO line.
382
+
383
+ Args:
384
+ req: gpiod LineRequest for this chip.
385
+ ln: Line offset within the chip.
386
+
387
+ Returns:
388
+ Function returning True if pin is HIGH (released), False if LOW.
389
+ """
390
+ def readback() -> bool | None:
391
+ values = req.get_values([ln])
392
+ return bool(values[0])
393
+ return readback
394
+
395
+ detector._gpio_readback_fn = make_readback(request, line)
396
+ installed += 1
397
+
398
+ if installed:
399
+ _LOGGER.info(
400
+ "Installed GPIO readback on %d MultiClickDetector(s) for missed-RELEASE detection",
401
+ installed,
402
+ )
403
+
357
404
  def _handle_gpiod_events(self, chip: int, request: gpiod.LineRequest) -> None:
358
405
  """Handle GPIO events from libgpiod.
359
406
 
@@ -1279,13 +1279,14 @@ event:
1279
1279
  - str
1280
1280
  - positive_time_period
1281
1281
  required: False
1282
- default: '120s'
1282
+ default: '30s'
1283
1283
  meta:
1284
1284
  label: Max Long Press Duration
1285
1285
  description: |
1286
- Safety timeout for long press in seconds.
1286
+ Safety timeout for long press (hard max: 30s).
1287
1287
  If a long press exceeds this duration, it is automatically stopped.
1288
1288
  Prevents infinite long press events when RELEASE edge is missed (e.g., due to EMI or hardware issues).
1289
+ Values above 30s are clamped to 30s.
1289
1290
  mqtt_sequences:
1290
1291
  required: False
1291
1292
  type: dict
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.5.0dev15"
@@ -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-CyBZuJ67.js";import{t as y}from"./EditItemDialog-cJc7C25R.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-mFb2SAmz.js";import{t as y}from"./EditItemDialog-CdZkM5Kd.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-CyBZuJ67.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-mFb2SAmz.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};