boneio 1.5.2.dev1__tar.gz → 1.5.3__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 (546) hide show
  1. {boneio-1.5.2.dev1/boneio.egg-info → boneio-1.5.3}/PKG-INFO +1 -1
  2. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/binary_sensor.py +71 -0
  3. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/detectors.py +35 -0
  4. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/event.py +34 -11
  5. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/inputs.py +14 -3
  6. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/input/base.py +13 -3
  7. boneio-1.5.3/boneio/version.py +2 -0
  8. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/BindingMatrix-D1OvlTso.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/BindingMatrix-Sq_Mfh0a.js +1 -1
  9. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-Bdpm9_Qo.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/ConfigEditor-bP6Hl3Ew.js +1 -1
  10. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/EditItemDialog-BIjzsrqq.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/EditItemDialog-DnzpXVT9.js +2 -2
  11. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/EntityCard-CJ0ccsW1.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/EntityCard-BJr0Z2Vh.js +1 -1
  12. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/EntityGrid-xCqfJxkw.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/EntityGrid-J2pMEVAC.js +1 -1
  13. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/FormInputToggle-Cn_hJrna.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/FormInputToggle-Bl4JsLEk.js +1 -1
  14. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/InputsView-CySRVJ90.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/InputsView-CTczAHKX.js +1 -1
  15. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/LogViewer-Bs7Xx9vL.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/LogViewer-3KToSszt.js +1 -1
  16. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/ModbusView-8rNY0iJT.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/ModbusView-BKsoFjy7.js +1 -1
  17. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/NodeRedView-DD2w3NAX.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/NodeRedView-CeimjpOx.js +1 -1
  18. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/OutputsView-B6cZ8NHI.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/OutputsView-DyePKfnd.js +1 -1
  19. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/SensorView-DsdnJqni.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/SensorView-DT4Xiwmi.js +1 -1
  20. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/SudoPasswordDialog-W42OQ76m.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/SudoPasswordDialog-yANkJZ5k.js +1 -1
  21. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/SystemState-De_QpQ-z.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/SystemState-qH4PbU4t.js +1 -1
  22. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/TemplatesView-CuLPA7iV.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/TemplatesView-CPj_t86s.js +1 -1
  23. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/Tools-DOmBe8W2.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/Tools-Du0szAxd.js +1 -1
  24. boneio-1.5.3/boneio/webui/frontend-dist/assets/UISettings-CNZ0Z5t9.js +38 -0
  25. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/gi-czqU2m4e.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/gi-DYNMHE5B.js +1 -1
  26. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/index-DCzOrheh.js → boneio-1.5.3/boneio/webui/frontend-dist/assets/index-BuJzdMCI.js +2 -2
  27. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/index.html +1 -1
  28. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/sw.js +1 -1
  29. {boneio-1.5.2.dev1 → boneio-1.5.3/boneio.egg-info}/PKG-INFO +1 -1
  30. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio.egg-info/SOURCES.txt +19 -19
  31. boneio-1.5.2.dev1/boneio/version.py +0 -2
  32. boneio-1.5.2.dev1/boneio/webui/frontend-dist/assets/UISettings-CtJheTh8.js +0 -38
  33. {boneio-1.5.2.dev1 → boneio-1.5.3}/LICENSE +0 -0
  34. {boneio-1.5.2.dev1 → boneio-1.5.3}/MANIFEST.in +0 -0
  35. {boneio-1.5.2.dev1 → boneio-1.5.3}/README.md +0 -0
  36. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/__init__.py +0 -0
  37. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/input.yaml +0 -0
  38. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/output_24_16.yaml +0 -0
  39. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/output_32_10.yaml +0 -0
  40. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/output_32_5.yaml +0 -0
  41. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/output_cover.yaml +0 -0
  42. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  43. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/input.yaml +0 -0
  44. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/output_24_16.yaml +0 -0
  45. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/output_32_10.yaml +0 -0
  46. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/output_32_5.yaml +0 -0
  47. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/output_cover.yaml +0 -0
  48. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  49. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/input.yaml +0 -0
  50. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/output_24_16.yaml +0 -0
  51. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/output_32_10.yaml +0 -0
  52. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/output_32_5.yaml +0 -0
  53. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/output_cover.yaml +0 -0
  54. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  55. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.5/input.yaml +0 -0
  56. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.5/output_24_16.yaml +0 -0
  57. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.5/output_32_10.yaml +0 -0
  58. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.5/output_cover.yaml +0 -0
  59. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  60. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.6/input.yaml +0 -0
  61. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.6/output_24_16.yaml +0 -0
  62. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.6/output_32_10.yaml +0 -0
  63. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.6/output_cover.yaml +0 -0
  64. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  65. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/input.yaml +0 -0
  66. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/output_24_16.yaml +0 -0
  67. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/output_32_10.yaml +0 -0
  68. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/output_48_4.yaml +0 -0
  69. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/output_cover.yaml +0 -0
  70. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  71. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/input.yaml +0 -0
  72. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/output_24_16.yaml +0 -0
  73. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/output_32_10.yaml +0 -0
  74. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/output_48_4.yaml +0 -0
  75. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/output_cover.yaml +0 -0
  76. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  77. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/input.yaml +0 -0
  78. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/output_24_16.yaml +0 -0
  79. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/output_32_10.yaml +0 -0
  80. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/output_48_4.yaml +0 -0
  81. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/output_cover.yaml +0 -0
  82. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  83. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/bonecli.py +0 -0
  84. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/__init__.py +0 -0
  85. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/cover/__init__.py +0 -0
  86. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/cover/cover.py +0 -0
  87. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/cover/time_based.py +0 -0
  88. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/cover/venetian.py +0 -0
  89. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/group/__init__.py +0 -0
  90. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/group/output_group.py +0 -0
  91. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/__init__.py +0 -0
  92. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/remote/__init__.py +0 -0
  93. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/remote/base.py +0 -0
  94. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/input/remote/esphome.py +0 -0
  95. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/irrigation/__init__.py +0 -0
  96. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/irrigation/controller.py +0 -0
  97. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/irrigation/water_source.py +0 -0
  98. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/__init__.py +0 -0
  99. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/basic.py +0 -0
  100. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/buzzer.py +0 -0
  101. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/mcp.py +0 -0
  102. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/pca.py +0 -0
  103. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/pcf.py +0 -0
  104. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/output/remote.py +0 -0
  105. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/sensor/__init__.py +0 -0
  106. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/sensor/virtual_energy.py +0 -0
  107. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/template/__init__.py +0 -0
  108. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/template/alarm_panel.py +0 -0
  109. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/template/gate_cover.py +0 -0
  110. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/components/template/thermostat.py +0 -0
  111. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/const.py +0 -0
  112. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/__init__.py +0 -0
  113. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/__init__.py +0 -0
  114. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/data/__init__.py +0 -0
  115. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  116. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  117. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  118. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/registration.py +0 -0
  119. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/cloud/secrets.py +0 -0
  120. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/__init__.py +0 -0
  121. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/config_helper.py +0 -0
  122. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/migrations/__init__.py +0 -0
  123. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  124. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/migrations/v2_transition.py +0 -0
  125. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  126. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
  127. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/package-lock.json +0 -0
  128. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/package.json +0 -0
  129. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/schema_converter.py +0 -0
  130. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/yaml_compat.py +0 -0
  131. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/config/yaml_util.py +0 -0
  132. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/discovery.py +0 -0
  133. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/events/__init__.py +0 -0
  134. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/events/bus.py +0 -0
  135. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/__init__.py +0 -0
  136. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/action_conditions.py +0 -0
  137. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/canopen.py +0 -0
  138. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/covers.py +0 -0
  139. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/display.py +0 -0
  140. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/irrigation.py +0 -0
  141. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/manager.py +0 -0
  142. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/modbus.py +0 -0
  143. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/outputs.py +0 -0
  144. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/remote.py +0 -0
  145. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/remote_input_registrar.py +0 -0
  146. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/sensors.py +0 -0
  147. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/templates/__init__.py +0 -0
  148. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/templates/alarm.py +0 -0
  149. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/templates/gate_cover.py +0 -0
  150. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/templates/thermostat.py +0 -0
  151. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/templates.py +0 -0
  152. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/manager/update.py +0 -0
  153. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/__init__.py +0 -0
  154. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/basic.py +0 -0
  155. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/basic_mqtt.py +0 -0
  156. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/composite.py +0 -0
  157. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/local.py +0 -0
  158. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/lox.py +0 -0
  159. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/mqtt.py +0 -0
  160. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/messaging/queue.py +0 -0
  161. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/__init__.py +0 -0
  162. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/base.py +0 -0
  163. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/can.py +0 -0
  164. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/esphome.py +0 -0
  165. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/mqtt.py +0 -0
  166. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/wled.py +0 -0
  167. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/remote/wled_cache.py +0 -0
  168. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/sensor/__init__.py +0 -0
  169. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/sensor/base.py +0 -0
  170. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/sensor/system.py +0 -0
  171. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/state/__init__.py +0 -0
  172. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/state/manager.py +0 -0
  173. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/system/__init__.py +0 -0
  174. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/system/host_data.py +0 -0
  175. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/system/monitor.py +0 -0
  176. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/__init__.py +0 -0
  177. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/async_updater.py +0 -0
  178. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/conditions.py +0 -0
  179. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/filter.py +0 -0
  180. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/font_util.py +0 -0
  181. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/logger.py +0 -0
  182. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/overlay.py +0 -0
  183. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/timeperiod.py +0 -0
  184. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/core/utils/util.py +0 -0
  185. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/adc.yaml +0 -0
  186. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  187. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/config.yaml +0 -0
  188. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/event.yaml +0 -0
  189. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/mqtt.yaml +0 -0
  190. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  191. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/adc.yaml +0 -0
  192. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  193. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/config.yaml +0 -0
  194. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/event.yaml +0 -0
  195. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/mqtt.yaml +0 -0
  196. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  197. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/adc.yaml +0 -0
  198. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  199. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/config.yaml +0 -0
  200. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/event.yaml +0 -0
  201. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/mqtt.yaml +0 -0
  202. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  203. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/__init__.py +0 -0
  204. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/can_master.yaml +0 -0
  205. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/can_slave.yaml +0 -0
  206. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/adc.yaml +0 -0
  207. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  208. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/config.yaml +0 -0
  209. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/cover.yaml +0 -0
  210. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/event.yaml +0 -0
  211. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/mqtt.yaml +0 -0
  212. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover/outputCover.yaml +0 -0
  213. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/adc.yaml +0 -0
  214. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  215. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/config.yaml +0 -0
  216. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/cover.yaml +0 -0
  217. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/event.yaml +0 -0
  218. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  219. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  220. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/adc.yaml +0 -0
  221. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  222. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  223. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  224. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  225. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/event_all.yaml +0 -0
  226. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  227. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  228. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  229. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  230. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  231. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  232. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/exceptions.py +0 -0
  233. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/__init__.py +0 -0
  234. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/analog/__init__.py +0 -0
  235. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/analog/adc.py +0 -0
  236. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/__init__.py +0 -0
  237. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/bridge.py +0 -0
  238. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/client.py +0 -0
  239. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/interface.py +0 -0
  240. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/node.py +0 -0
  241. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/node_id.py +0 -0
  242. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/can/test_od.py +0 -0
  243. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/display/__init__.py +0 -0
  244. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/display/early_oled.py +0 -0
  245. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  246. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/display/oled.py +0 -0
  247. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/__init__.py +0 -0
  248. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  249. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  250. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  251. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  252. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/input/__init__.py +0 -0
  253. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/gpio/input/manager.py +0 -0
  254. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/__init__.py +0 -0
  255. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/bus.py +0 -0
  256. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/ina219.py +0 -0
  257. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/ina219_driver.py +0 -0
  258. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/ina226.py +0 -0
  259. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/ina226_driver.py +0 -0
  260. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/mcp9808.py +0 -0
  261. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/i2c/pct2075.py +0 -0
  262. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/onewire/__init__.py +0 -0
  263. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/onewire/dallas.py +0 -0
  264. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/sensor/__init__.py +0 -0
  265. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  266. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/sensor/temperature/base.py +0 -0
  267. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  268. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  269. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/integration/__init__.py +0 -0
  270. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/integration/homeassistant.py +0 -0
  271. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/integration/interlock.py +0 -0
  272. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/integration/lox_template.py +0 -0
  273. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/__init__.py +0 -0
  274. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/actions.py +0 -0
  275. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  276. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/daemon.json +0 -0
  277. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  278. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  279. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  280. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  281. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  282. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/journald/journald.conf +0 -0
  283. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
  284. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  285. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  286. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/sudoers/boneio +0 -0
  287. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  288. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  289. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/boneio.service +0 -0
  290. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
  291. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
  292. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
  293. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
  294. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
  295. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/linger-marker +0 -0
  296. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  297. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  298. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  299. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  300. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  301. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  302. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  303. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  304. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  305. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  306. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/runner.py +0 -0
  307. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/__init__.py +0 -0
  308. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  309. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  310. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  311. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  312. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  313. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  314. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  315. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
  316. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
  317. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
  318. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
  319. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
  320. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
  321. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
  322. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
  323. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
  324. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  325. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  326. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  327. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  328. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
  329. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
  330. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
  331. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
  332. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
  333. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/__init__.py +0 -0
  334. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/cli.py +0 -0
  335. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/client.py +0 -0
  336. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/coordinator.py +0 -0
  337. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/__init__.py +0 -0
  338. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  339. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  340. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  341. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  342. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  343. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  344. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  345. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  346. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  347. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  348. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/hvac/thessla.json +0 -0
  349. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  350. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  351. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/inverters/sofar.json +0 -0
  352. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  353. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  354. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  355. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  356. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/cwt.json +0 -0
  357. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  358. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  359. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  360. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  361. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/pt100.json +0 -0
  362. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  363. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/sht20.json +0 -0
  364. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/devices/sensors/sht30.json +0 -0
  365. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/__init__.py +0 -0
  366. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/base.py +0 -0
  367. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/derived/__init__.py +0 -0
  368. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/derived/numeric.py +0 -0
  369. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/derived/select.py +0 -0
  370. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/derived/switch.py +0 -0
  371. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/derived/text.py +0 -0
  372. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/sensor/__init__.py +0 -0
  373. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/sensor/binary.py +0 -0
  374. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/sensor/numeric.py +0 -0
  375. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/sensor/text.py +0 -0
  376. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/writeable/__init__.py +0 -0
  377. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/writeable/binary.py +0 -0
  378. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/entities/writeable/numeric.py +0 -0
  379. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/mock_coordinator.py +0 -0
  380. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/modbus/utils.py +0 -0
  381. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/__init__.py +0 -0
  382. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/actions.py +0 -0
  383. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/events.py +0 -0
  384. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/files.py +0 -0
  385. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/logs.py +0 -0
  386. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/mqtt.py +0 -0
  387. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/models/state.py +0 -0
  388. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/runner.py +0 -0
  389. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/actions.yaml +0 -0
  390. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/actions_sensor.yaml +0 -0
  391. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/actions_switch.yaml +0 -0
  392. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/condition.yaml +0 -0
  393. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/filters.yaml +0 -0
  394. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/filters_adc.yaml +0 -0
  395. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/id.yaml +0 -0
  396. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/remote_devices.yaml +0 -0
  397. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/remote_inputs.yaml +0 -0
  398. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/remote_outputs.yaml +0 -0
  399. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/schema.yaml +0 -0
  400. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/temp_unit.yaml +0 -0
  401. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/schema/update_interval.yaml +0 -0
  402. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/action_validation.py +0 -0
  403. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/app.py +0 -0
  404. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/dashboard_cards.py +0 -0
  405. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
  406. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
  407. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
  408. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  409. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  410. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/axios-DHUeYRnu.js +0 -0
  411. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  412. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  413. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  414. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/configCache-BAkc0Ye7.js +0 -0
  415. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  416. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  417. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  418. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  419. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/index-CJSdgTd5.css +0 -0
  420. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  421. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
  422. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
  423. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  424. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  425. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  426. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
  427. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
  428. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  429. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
  430. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
  431. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  432. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  433. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  434. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  435. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/boneio.svg +0 -0
  436. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  437. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  438. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  439. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  440. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  441. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  442. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  443. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  444. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  445. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  446. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  447. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  448. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
  449. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  450. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  451. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  452. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  453. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  454. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  455. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  456. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  457. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  458. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  459. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  460. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  461. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  462. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  463. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  464. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  465. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  466. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  467. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  468. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  469. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  470. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  471. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/hvac_svg_templates.py +0 -0
  472. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/middleware/__init__.py +0 -0
  473. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/middleware/auth.py +0 -0
  474. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/modbus_card_templates.py +0 -0
  475. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/__init__.py +0 -0
  476. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/auth.py +0 -0
  477. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/caddy.py +0 -0
  478. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/can.py +0 -0
  479. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config.py +0 -0
  480. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config_actions.py +0 -0
  481. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config_backups.py +0 -0
  482. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config_core.py +0 -0
  483. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config_discovery.py +0 -0
  484. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/config_files.py +0 -0
  485. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/covers.py +0 -0
  486. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/dashboard.py +0 -0
  487. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/dev_fake_device.py +0 -0
  488. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/irrigation.py +0 -0
  489. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/migrations.py +0 -0
  490. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/modbus.py +0 -0
  491. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/mqtt_reference.py +0 -0
  492. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/nodered.py +0 -0
  493. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/outputs.py +0 -0
  494. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/remote_devices.py +0 -0
  495. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/sensors.py +0 -0
  496. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/system.py +0 -0
  497. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/templates.py +0 -0
  498. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/timezone_sudoers.py +0 -0
  499. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/tools.py +0 -0
  500. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/routes/update.py +0 -0
  501. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/adc.schema.json +0 -0
  502. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/areas.schema.json +0 -0
  503. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  504. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/boneio.schema.json +0 -0
  505. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/can.schema.json +0 -0
  506. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/config.schema.json +0 -0
  507. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/cover.schema.json +0 -0
  508. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/dallas.schema.json +0 -0
  509. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/ds2482.schema.json +0 -0
  510. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/event.schema.json +0 -0
  511. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/ina219.schema.json +0 -0
  512. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/ina226.schema.json +0 -0
  513. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/irrigation.schema.json +0 -0
  514. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/lm75.schema.json +0 -0
  515. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/logger.schema.json +0 -0
  516. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/lox_udp.schema.json +0 -0
  517. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/mcp23017.schema.json +0 -0
  518. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/mcp9808.schema.json +0 -0
  519. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/modbus.schema.json +0 -0
  520. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  521. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/mqtt.schema.json +0 -0
  522. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/oled.schema.json +0 -0
  523. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/output.schema.json +0 -0
  524. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/output_group.schema.json +0 -0
  525. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/pca9685.schema.json +0 -0
  526. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/pcf8575.schema.json +0 -0
  527. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/remote_devices.schema.json +0 -0
  528. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  529. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  530. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/sensor.schema.json +0 -0
  531. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/template.schema.json +0 -0
  532. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  533. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/schema/web.schema.json +0 -0
  534. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/services/__init__.py +0 -0
  535. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/services/logs.py +0 -0
  536. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/sudo_rate_limiter.py +0 -0
  537. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/web_server.py +0 -0
  538. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio/webui/websocket_manager.py +0 -0
  539. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio.egg-info/dependency_links.txt +0 -0
  540. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio.egg-info/entry_points.txt +0 -0
  541. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio.egg-info/requires.txt +0 -0
  542. {boneio-1.5.2.dev1 → boneio-1.5.3}/boneio.egg-info/top_level.txt +0 -0
  543. {boneio-1.5.2.dev1 → boneio-1.5.3}/pyproject.toml +0 -0
  544. {boneio-1.5.2.dev1 → boneio-1.5.3}/setup.cfg +0 -0
  545. {boneio-1.5.2.dev1 → boneio-1.5.3}/setup.py +0 -0
  546. {boneio-1.5.2.dev1 → boneio-1.5.3}/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.2.dev1
3
+ Version: 1.5.3
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
@@ -8,12 +8,18 @@ from typing import cast
8
8
 
9
9
  from boneio.components.input.detectors import BinarySensorDetector
10
10
  from boneio.const import PRESSED, RELEASED, BinaryStateTypes, ClickTypes
11
+ from boneio.core.utils.timeperiod import parse_time_to_ms
11
12
  from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
12
13
  from boneio.models import InputState
13
14
  from boneio.models.events import InputEvent
14
15
 
15
16
  _LOGGER = logging.getLogger(__name__)
16
17
 
18
+ # Matches the binary_sensor bounce_time default in schema.yaml. Needed on the
19
+ # hot-reload path, which reads the YAML without running Cerberus, so an
20
+ # omitted bounce_time arrives as None rather than as the schema default.
21
+ DEFAULT_BOUNCE_TIME_MS = 120
22
+
17
23
 
18
24
  class GpioInputBinarySensor(GpioBaseClass):
19
25
  """Represent Gpio binary sensor on input boards."""
@@ -57,6 +63,71 @@ class GpioInputBinarySensor(GpioBaseClass):
57
63
  if kwargs.get("initial_send", False):
58
64
  gpio_manager.register_on_start_callback(self._send_initial_state)
59
65
 
66
+ def update_inverted(self, inverted: bool) -> bool:
67
+ """Apply a new ``inverted`` setting to a running sensor.
68
+
69
+ Polarity is decided in ``__init__`` and baked into the detector, so a
70
+ config reload alone used to leave the running sensor on the old
71
+ polarity until the application was restarted.
72
+
73
+ Args:
74
+ inverted: New inverted flag from the reloaded config.
75
+
76
+ Returns:
77
+ True if the polarity actually changed (caller should re-publish
78
+ the state), False if it was already set that way.
79
+ """
80
+ inverted = bool(inverted)
81
+ if inverted == self._inverted:
82
+ return False
83
+
84
+ self._inverted = inverted
85
+ self._click_type = (RELEASED, PRESSED) if inverted else (PRESSED, RELEASED)
86
+
87
+ # Re-read the pin and re-anchor the detector with the new polarity.
88
+ gpio_manager = get_gpio_manager(loop=self._loop)
89
+ current_value = gpio_manager.read_value(self._pin)
90
+ is_pressed = current_value if inverted else not current_value
91
+ self._detector.resync(inverted=inverted, current_state=is_pressed)
92
+
93
+ _LOGGER.info(
94
+ "Binary sensor %s (%s): inverted changed to %s without restart",
95
+ self._name,
96
+ self._pin,
97
+ inverted,
98
+ )
99
+ return True
100
+
101
+ def update_bounce_time(self, bounce_time) -> bool:
102
+ """Apply a new debounce window to a running sensor.
103
+
104
+ Like ``inverted``, ``bounce_time`` is read in ``__init__`` and handed to
105
+ the detector, so a config reload used to leave the old window in place
106
+ until the application was restarted.
107
+
108
+ Args:
109
+ bounce_time: Value straight from the reloaded config — a TimePeriod
110
+ at startup, but a bare number of milliseconds (WebUI) or a string
111
+ such as "120ms" (hand-written YAML) on the hot-reload path, which
112
+ skips Cerberus coercion. ``None`` means the schema default.
113
+
114
+ Returns:
115
+ True if the window actually changed.
116
+ """
117
+ seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
118
+ if seconds == self._bounce_time:
119
+ return False
120
+
121
+ self._bounce_time = seconds
122
+ self._detector.set_debounce(seconds)
123
+ _LOGGER.info(
124
+ "Binary sensor %s (%s): bounce_time changed to %.0fms without restart",
125
+ self._name,
126
+ self._pin,
127
+ seconds * 1000,
128
+ )
129
+ return True
130
+
60
131
  def _send_initial_state(self) -> None:
61
132
  """Send initial state after setup."""
62
133
  self.send_current_state()
@@ -135,6 +135,14 @@ class MultiClickDetector:
135
135
  self._delay_click_types.add(first)
136
136
  break
137
137
 
138
+ def set_debounce(self, debounce_seconds: float) -> None:
139
+ """Change the debounce window on a running detector.
140
+
141
+ Only the window is replaced; timestamps already recorded stay valid
142
+ and are simply compared against the new window from now on.
143
+ """
144
+ self._debounce_seconds = debounce_seconds
145
+
138
146
  def _finalize_clicks(self) -> None:
139
147
  """Finalize a multi-click sequence."""
140
148
  count = self._state.click_count
@@ -847,6 +855,33 @@ class BinarySensorDetector:
847
855
  self._pin = pin
848
856
  self._state = BinarySensorState()
849
857
 
858
+ def set_debounce(self, debounce_seconds: float) -> None:
859
+ """Change the debounce window on a running detector.
860
+
861
+ Only the window is replaced; timestamps already recorded stay valid
862
+ and are simply compared against the new window from now on.
863
+ """
864
+ self._debounce_seconds = debounce_seconds
865
+
866
+ def resync(self, inverted: bool, current_state: bool) -> None:
867
+ """Apply a new polarity to a running detector.
868
+
869
+ Called when ``inverted`` is changed in the config and reloaded, so the
870
+ user does not have to restart the application for it to take effect.
871
+
872
+ Args:
873
+ inverted: New inverted flag.
874
+ current_state: Pressed state as read from the pin right now, already
875
+ interpreted with the *new* polarity. Without re-anchoring it the
876
+ cached state would still describe the old polarity and the next
877
+ edge would be dropped by the "state unchanged" guard.
878
+ """
879
+ self._inverted = bool(inverted)
880
+ self._state.current_state = bool(current_state)
881
+ # Drop the debounce anchor — the pending window belongs to the old
882
+ # polarity and would swallow the first edge after the change.
883
+ self._state.last_press_ts = None
884
+
850
885
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
851
886
  """Process a GPIO edge event for binary sensor.
852
887
 
@@ -7,7 +7,7 @@ import time
7
7
 
8
8
  from boneio.components.input.detectors import MultiClickDetector
9
9
  from boneio.const import ClickTypes
10
- from boneio.core.utils import TimePeriod
10
+ from boneio.core.utils.timeperiod import parse_time_to_ms
11
11
  from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
12
12
 
13
13
  _LOGGER = logging.getLogger(__name__)
@@ -16,25 +16,31 @@ _LOGGER = logging.getLogger(__name__)
16
16
  DEFAULT_DOUBLE_CLICK_DURATION_MS = 220
17
17
  DEFAULT_LONG_PRESS_DURATION_MS = 400
18
18
  DEFAULT_SEQUENCE_WINDOW_MS = 500
19
+ # Matches the event bounce_time default in schema.yaml. Needed on the hot-reload
20
+ # path, which reads the YAML without running Cerberus, so an omitted bounce_time
21
+ # arrives as None rather than as the schema default.
22
+ DEFAULT_BOUNCE_TIME_MS = 30
19
23
 
20
24
 
21
25
  def _to_milliseconds(value, default_ms: int) -> int:
22
26
  """Convert a value to milliseconds.
23
27
 
24
28
  Args:
25
- value: Can be int, float, TimePeriod, or None
26
- default_ms: Default value in milliseconds if value is None
29
+ value: TimePeriod, bare number of milliseconds, string with a unit
30
+ (e.g. "300ms"), or None.
31
+ default_ms: Default value in milliseconds if value is None or unusable.
27
32
 
28
33
  Returns:
29
- Value in milliseconds as integer
34
+ Value in milliseconds as integer.
35
+
36
+ Note:
37
+ Strings have to be handled here, not just TimePeriod: Cerberus coerces
38
+ these fields at startup, but the hot-reload path reads the YAML without
39
+ validating, and EventForm writes them as strings like "300ms". Falling
40
+ back to the default for those quietly reset every custom click timing on
41
+ each reload.
30
42
  """
31
- if value is None:
32
- return default_ms
33
- if isinstance(value, TimePeriod):
34
- return int(value.total_milliseconds)
35
- if isinstance(value, (int, float)):
36
- return int(value)
37
- return default_ms
43
+ return parse_time_to_ms(value, default_ms)
38
44
 
39
45
 
40
46
  class GpioEventButton(GpioBaseClass):
@@ -173,6 +179,7 @@ class GpioEventButton(GpioBaseClass):
173
179
  enable_triple_click: bool | None = None,
174
180
  long_press_mqtt_mode: str | None = None,
175
181
  max_long_press_duration: int | float | None = None,
182
+ bounce_time: object | None = None,
176
183
  ) -> None:
177
184
  """Update timing parameters for click detection.
178
185
 
@@ -189,6 +196,9 @@ class GpioEventButton(GpioBaseClass):
189
196
  enable_triple_click: Enable triple click detection
190
197
  long_press_mqtt_mode: 'single' or 'periodic' for MQTT long press events
191
198
  max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
199
+ bounce_time: Debounce window — a TimePeriod at startup, but a bare
200
+ number of milliseconds or a string such as "30ms" on the
201
+ hot-reload path, which skips Cerberus coercion
192
202
  """
193
203
  from boneio.const import CLICK_SEQUENCES
194
204
 
@@ -260,3 +270,16 @@ class GpioEventButton(GpioBaseClass):
260
270
  if long_press_mqtt_mode is not None:
261
271
  self._long_press_mqtt_mode = long_press_mqtt_mode
262
272
  _LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
273
+
274
+ # bounce_time is handed to the detector in __init__, so it needs pushing
275
+ # through explicitly — None here means "back to the schema default".
276
+ seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
277
+ if seconds != self._bounce_time:
278
+ self._bounce_time = seconds
279
+ self._detector.set_debounce(seconds)
280
+ _LOGGER.info(
281
+ "Event input %s (%s): bounce_time changed to %.0fms without restart",
282
+ self._name,
283
+ self._pin,
284
+ seconds * 1000,
285
+ )
@@ -296,6 +296,7 @@ class InputManager:
296
296
  enable_triple_click=gpio.get("enable_triple_click"),
297
297
  long_press_mqtt_mode=gpio.get("long_press_mqtt_mode"),
298
298
  max_long_press_duration=gpio.get("max_long_press_duration"),
299
+ bounce_time=gpio.get("bounce_time"),
299
300
  )
300
301
 
301
302
  # Re-send HA discovery only if HA-relevant fields changed (name, area, mqtt_sequences)
@@ -410,6 +411,14 @@ class InputManager:
410
411
  # Update device_class from new config
411
412
  existing_input._device_class = gpio.get(DEVICE_CLASS)
412
413
 
414
+ # Apply polarity live — 'inverted' is baked into the detector at
415
+ # construction, so without this the change only took effect after
416
+ # an application restart.
417
+ inverted_changed = existing_input.update_inverted(gpio.get("inverted", False))
418
+
419
+ # Same story for the debounce window.
420
+ existing_input.update_bounce_time(gpio.get("bounce_time"))
421
+
413
422
  # Re-send HA discovery only if HA-relevant fields changed (name, area)
414
423
  # Actions are internal to the controller and don't need HA update
415
424
  if ha_fields_changed and gpio.get(SHOW_HA, True):
@@ -422,9 +431,11 @@ class InputManager:
422
431
  area=area,
423
432
  )
424
433
 
425
- # Send current state if initial_send is enabled (so user doesn't need to restart)
426
- if gpio.get("initial_send", False):
427
- _LOGGER.debug(f"Sending current state for {input_id} after reload (initial_send=True)")
434
+ # Publish the current state when polarity flipped (the reported
435
+ # state is now the opposite one) or when initial_send asks for it,
436
+ # so the user doesn't need to restart.
437
+ if inverted_changed or gpio.get("initial_send", False):
438
+ _LOGGER.debug(f"Sending current state for {input_id} after reload")
428
439
  existing_input.send_current_state()
429
440
 
430
441
  return existing_input
@@ -12,12 +12,17 @@ import time
12
12
 
13
13
  from boneio.const import PRESSED, RELEASED, ClickTypes
14
14
  from boneio.core.events import EventBus
15
- from boneio.core.utils import TimePeriod
15
+ from boneio.core.utils.timeperiod import parse_time_to_ms
16
16
  from boneio.models import InputState
17
17
  from boneio.models.events import InputEvent
18
18
 
19
19
  _LOGGER = logging.getLogger(__name__)
20
20
 
21
+ # Fallback debounce when a config carries no bounce_time at all. The per-type
22
+ # schema defaults (120ms binary_sensor, 30ms event) normally win long before
23
+ # this, via Cerberus at startup or the update_* methods on reload.
24
+ DEFAULT_BOUNCE_TIME_MS = 50
25
+
21
26
 
22
27
  class GpioBaseClass:
23
28
  """Base class for GPIO inputs.
@@ -58,8 +63,13 @@ class GpioBaseClass:
58
63
  ) -> None:
59
64
  """Initialize GPIO input base class."""
60
65
  self._pin = pin
61
- bounce_time: TimePeriod = kwargs.get("bounce_time", TimePeriod(milliseconds=50))
62
- self._bounce_time = bounce_time.total_in_seconds
66
+ # A TimePeriod at startup, where Cerberus has coerced it — but the
67
+ # hot-reload path reads the YAML without validation, so an input added
68
+ # while the app runs arrives with a bare number of milliseconds (WebUI)
69
+ # or a string such as "30ms" (hand-written config).
70
+ self._bounce_time = (
71
+ parse_time_to_ms(kwargs.get("bounce_time"), DEFAULT_BOUNCE_TIME_MS) / 1000.0
72
+ )
63
73
  self._loop = asyncio.get_running_loop()
64
74
  self._name = name
65
75
  self._actions = actions
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.5.3"
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{b as n}from"./vendor-IzweXARb.js";import{r}from"./utils-C8nShLO6.js";import{E as i,Ht as a,K as o,Qt as s,T as c,U as l,Wt as u,X as d,Zt as f,_t as p,k as m,ot as h,p as g,q as _,z as v}from"./index-DCzOrheh.js";import{t as y}from"./EditItemDialog-BIjzsrqq.js";var b=e(t(),1);function x(e){return s({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)(h,{className:r(`text-warning`,t)});case`switch`:return(0,S.jsx)(u,{className:r(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:r(`text-accent`,t)});case`cover`:return(0,S.jsx)(v,{className:r(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:r(`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:`pressed`,released:`released`,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.boneio_input||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.boneio_input||i.pin||a,area:i.area||void 0,type:`local`,inputKind:i._type===`binary_sensor`?`binary_sensor`:`event`,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`,inputKind:r._type===`binary_sensor`?`binary_sensor`:`event`,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:`gap-3 grid grid-cols-1 md:grid-cols-4 mb-4`,children:[(0,S.jsxs)(`div`,{className:`space-y-1 bg-base-200/50 p-3 border border-base-300 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`font-bold text-xs text-base-content/50 uppercase tracking-wider`,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:`ml-1 text-success`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`space-y-1 bg-info/5 p-3 border border-info/20 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`font-bold text-info/70 text-xs uppercase tracking-wider`,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:`ml-1 text-success`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`flex flex-col justify-center bg-primary/5 p-3 border border-primary/20 rounded-xl`,children:[(0,S.jsx)(`p`,{className:`font-extrabold text-primary text-2xl`,children:m}),(0,S.jsx)(`p`,{className:`font-medium text-primary/70 text-xs`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 p-3 border border-base-300 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`mb-1.5 font-bold text-xs text-base-content/50 uppercase tracking-wider`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`gap-x-3 gap-y-0.5 grid grid-cols-2`,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:`gap-x-2 gap-y-0.5 grid grid-cols-3 mt-1.5 pt-1.5 border-base-300 border-t`,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,a]=(0,b.useState)(!0),[o,s]=(0,b.useState)(!0),c=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`&&!c.has(e.id)),f=t.filter(e=>e.type===`cover`&&!c.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`)&&!c.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:`space-y-3 mt-4`,children:[g&&(0,S.jsxs)(`div`,{className:`bg-warning/5 border border-warning/20 rounded-xl overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-warning/10 p-3 w-full font-semibold text-warning text-sm transition-colors`,onClick:()=>a(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(l,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(m,{className:`w-3 h-3`}):(0,S.jsx)(i,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`space-y-2 p-3 pt-0`,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:`bg-info/5 border border-info/20 rounded-xl overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-info/10 p-3 w-full font-semibold text-info text-sm transition-colors`,onClick:()=>s(!o),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(l,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),o?(0,S.jsx)(m,{className:`w-3 h-3`}):(0,S.jsx)(i,{className:`w-3 h-3`})]}),o&&(0,S.jsxs)(`div`,{className:`space-y-2 p-3 pt-0`,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:`mb-1 font-semibold text-xs text-base-content/60`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`gap-1 font-mono text-xxs badge badge-sm badge-ghost`,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:i,t:a,onEditInput:o,onEditOutput:s}){let[c,l]=(0,b.useState)(null),[u,d]=(0,b.useState)(null),f=(0,b.useRef)(null),m=(0,b.useRef)(!1),h=(0,b.useRef)(!1),g=(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),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t),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)})})),i&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,i,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})),i&&(e=e.filter(e=>M.has(e.id))),e},[t,n,i,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:`py-12 text-base-content/40 text-center`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:a(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:f,className:`border border-base-300 rounded-xl overflow-x-auto cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{m.current=!0,h.current=!1,g.current=e.clientX,_.current=f.current?.scrollLeft||0},onMouseMove:e=>{if(!m.current||!f.current)return;let t=e.clientX-g.current;!h.current&&Math.abs(t)>5&&(h.current=!0),h.current&&(f.current.scrollLeft=_.current-t)},onMouseUp:()=>{m.current=!1,h.current=!1},onMouseLeave:()=>{m.current=!1,h.current=!1},onClickCapture:e=>{h.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:`left-0 z-20 sticky bg-base-200 border-base-300 border-r min-w-30`}),P.map(e=>(0,S.jsxs)(`th`,{className:r(`group/col bg-base-200 px-2 py-2 border-base-300 border-r min-w-20 font-bold text-xxs text-center whitespace-nowrap cursor-pointer`,u===e.id&&`bg-primary/10`),onMouseEnter:()=>d(e.id),onMouseLeave:()=>d(null),onClick:()=>s(e),title:a(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex justify-center items-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)(p,{className:`opacity-0 group-hover/col:opacity-40 w-2 h-2 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`font-normal text-xxs text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`font-normal text-xxs text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`font-normal text-info/50 text-xxs 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:r(`hover:bg-base-200/50`,c===e.id&&`bg-base-200/40`),onMouseEnter:()=>l(e.id),onMouseLeave:()=>l(null),children:[(0,S.jsxs)(`td`,{className:r(`group/row left-0 z-10 sticky bg-base-100 border-base-300 border-r font-medium text-xs cursor-pointer`,c===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>o(e),title:a(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-1 max-w-30 font-bold truncate`,title:e.id,children:[e.name,(0,S.jsx)(p,{className:`opacity-0 group-hover/row:opacity-40 w-2.5 h-2.5 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-info/50 text-xxs`,children:e.remoteDevice})]}),P.map(n=>{let i=t?.get(n.id)||[],s=c===e.id||u===n.id;return(0,S.jsx)(`td`,{className:r(`px-1 py-1 border-base-300 border-r text-xs text-center`,i.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,s&&i.length>0&&`bg-success/25`,s&&i.length===0&&`bg-base-200/40`),onMouseEnter:()=>d(n.id),onMouseLeave:()=>{d(null),D()},onContextMenu:t=>w(t,e,i.length>0),onMouseDown:t=>{t.button===0&&T(t,e,i.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,i.length>0),onTouchEnd:D,onTouchMove:D,children:i.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:i.map((t,n)=>(0,S.jsx)(`button`,{className:`hover:bg-success/30 px-0.5 rounded text-left whitespace-nowrap transition-colors cursor-pointer`,onClick:()=>o(e,t.clickType),title:`${A(t,a)}\n${a(`binding_matrix.click_to_edit`)}`,children:k(t,a)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`z-50 fixed bg-base-100 shadow-xl py-1 border border-base-300 rounded-lg min-w-45 animate-in duration-100 fade-in zoom-in-95`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 font-semibold text-xxs text-base-content/40 uppercase tracking-wider`,children:a(`binding_matrix.add_action`)}),E.filter(e=>v.row.inputKind===`binary_sensor`?e.key===`pressed`||e.key===`released`:e.key!==`pressed`&&e.key!==`released`).map(e=>(0,S.jsxs)(`button`,{className:`flex items-center gap-2 hover:bg-primary/10 px-3 py-1.5 w-full text-sm text-left transition-colors`,onClick:()=>{o(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),a(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:o,onEditInput:s}){let[l,u]=(0,b.useState)(null),d=(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]),f=(0,b.useCallback)(e=>{u(t=>t===e?null:e)},[]);return d.length===0?(0,S.jsx)(`div`,{className:`py-12 text-base-content/40 text-center`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:o(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:d.map(e=>{let t=l===e.id,n=e.bindings.length>0,u=new Map;for(let t of e.bindings){let e=u.get(t.targetId)||[];e.push(t),u.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:r(`border rounded-xl overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-base-200/30 p-3 w-full text-sm transition-colors`,onClick:()=>n&&f(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(c,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(a,{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:r(`block font-semibold truncate`,!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:`font-bold badge badge-sm badge-success`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`font-mono badge badge-xs badge-info`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(i,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`space-y-2 bg-base-100/50 p-3 border-base-300 border-t`,children:[[...u.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`mt-0.5 font-mono font-bold text-base-content/70 shrink-0`,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:`gap-0.5 font-mono badge badge-xs badge-success`,children:k(e,o)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`gap-1 mt-1 btn-outline btn btn-xs btn-primary`,onClick:t=>{t.stopPropagation(),s(e)},children:[(0,S.jsx)(p,{className:`w-2.5 h-2.5`}),o(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:r})=>{let{t:a}=g(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[m,h]=(0,b.useState)(!1),[v,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),[W,G]=(0,b.useState)(!1),K=(0,b.useRef)(null),q=(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.boneio_input||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),h(!0))},[e]),ae=(0,b.useCallback)(async()=>{if(A||T<0||!v)return;let t=[...e[C]||[]];t[T]=v,L(!0);try{r(C,t),await n(C,t),h(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[v,T,C,e,A,n,r]),oe=(0,b.useCallback)(()=>{h(!1),x(null)},[]),J=(0,b.useMemo)(()=>M(e),[e]),Y=(0,b.useMemo)(()=>N(e),[e]),se=(0,b.useMemo)(()=>{let e=new Set;return J.forEach(t=>{t.area&&e.add(t.area)}),Y.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[J,Y]),ce=(0,b.useMemo)(()=>J.some(e=>!e.area)||Y.some(e=>!e.area),[J,Y]),X=(0,b.useMemo)(()=>e.output||[],[e.output]),Z=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Q=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),le=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),ue=(0,b.useMemo)(()=>e.remote_inputs||[],[e.remote_inputs]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),fe=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),he=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),ge=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),_e=(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]))),K.current=JSON.stringify(r[i]),z(!0))},[e]),ve=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,G(!0);try{r(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{G(!1)}},[B,U,H,e,n,r]),ye=(0,b.useCallback)(()=>{z(!1),V(null)},[]),be=v&&R.current&&JSON.stringify(v)!==R.current,xe=B&&K.current&&JSON.stringify(B)!==K.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:`font-extrabold text-xl tracking-tight`,children:a(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:a(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:J,outputs:Y,t:a}),(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 mb-4`,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:`justify-between gap-1 btn-outline min-w-40 btn btn-sm`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`text-xs truncate`,children:s.size===0?a(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?a(`binding_matrix.no_area`):[...s][0]:a(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(i,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`z-40 fixed inset-0`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`top-full left-0 z-50 absolute bg-base-100 shadow-xl mt-1 py-1 border border-base-300 rounded-lg min-w-50 max-h-75 overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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:`font-semibold text-xs`,children:a(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`my-0.5 border-base-300 border-t`}),ce&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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 text-base-content/50 italic`,children:a(`binding_matrix.no_area`)})]}),se.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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:`flex items-center gap-1 font-medium text-xs text-base-content/60`,children:[f?(0,S.jsx)(_,{className:`w-3 h-3`}):(0,S.jsx)(o,{className:`w-3 h-3`}),a(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:J,outputs:Y,areaFilter:s,hideEmpty:f,t:a,onEditInput:q,onEditOutput:_e})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:J,areaFilter:s,hideEmpty:f,t:a,onEditInput:q})}),(0,S.jsx)(F,{inputs:J,outputs:Y,t:a}),(0,S.jsx)(y,{open:m,onOpenChange:h,editingItem:v,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:pe,allBinarySensors:de,allEvents:fe,allOutputs:X,allOutputGroups:Q,allCovers:Z,allAreas:$,allRemoteDevices:le,allRemoteInputs:ue,savedOutputs:X,savedOutputGroups:Q,savedCovers:Z,onChange:x,onSave:ae,onCancel:oe,onValidationChange:j,saveDisabled:A||!be,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?ge:me,uiSchema:H===`cover`?void 0:he,allOutputs:X,allCovers:Z,allAreas:$,onChange:V,onSave:ve,onCancel:ye,saveDisabled:!xe,isSaving:W})]})};export{L as default};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{c as t}from"./monaco-61yH0vfd.js";import{b as n}from"./vendor-IzweXARb.js";import{r}from"./utils-C8nShLO6.js";import{E as i,Ht as a,K as o,Qt as s,T as c,U as l,Wt as u,X as d,Zt as f,_t as p,k as m,ot as h,p as g,q as _,z as v}from"./index-BuJzdMCI.js";import{t as y}from"./EditItemDialog-DnzpXVT9.js";var b=e(t(),1);function x(e){return s({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)(h,{className:r(`text-warning`,t)});case`switch`:return(0,S.jsx)(u,{className:r(`text-info`,t)});case`valve`:return(0,S.jsx)(x,{className:r(`text-accent`,t)});case`cover`:return(0,S.jsx)(v,{className:r(`text-secondary`,t)});case`shutter`:case`blind`:case`curtain`:return(0,S.jsx)(f,{className:r(`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:`pressed`,released:`released`,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.boneio_input||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.boneio_input||i.pin||a,area:i.area||void 0,type:`local`,inputKind:i._type===`binary_sensor`?`binary_sensor`:`event`,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`,inputKind:r._type===`binary_sensor`?`binary_sensor`:`event`,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:`gap-3 grid grid-cols-1 md:grid-cols-4 mb-4`,children:[(0,S.jsxs)(`div`,{className:`space-y-1 bg-base-200/50 p-3 border border-base-300 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`font-bold text-xs text-base-content/50 uppercase tracking-wider`,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:`ml-1 text-success`,children:[`(`,c.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,d.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,f.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,children:[`(`,o.length-f.length,` ○)`]})]})]}),(i.length>0||s.length>0)&&(0,S.jsxs)(`div`,{className:`space-y-1 bg-info/5 p-3 border border-info/20 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`font-bold text-info/70 text-xs uppercase tracking-wider`,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:`ml-1 text-success`,children:[`(`,l.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,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:`ml-1 text-success`,children:[`(`,p.length,` ✓)`]}),(0,S.jsxs)(`span`,{className:`ml-1 text-warning`,children:[`(`,s.length-p.length,` ○)`]})]})]}),(0,S.jsxs)(`div`,{className:`flex flex-col justify-center bg-primary/5 p-3 border border-primary/20 rounded-xl`,children:[(0,S.jsx)(`p`,{className:`font-extrabold text-primary text-2xl`,children:m}),(0,S.jsx)(`p`,{className:`font-medium text-primary/70 text-xs`,children:n(`binding_matrix.total_bindings`)})]}),(0,S.jsxs)(`div`,{className:`bg-base-200/50 p-3 border border-base-300 rounded-xl`,children:[(0,S.jsx)(`h4`,{className:`mb-1.5 font-bold text-xs text-base-content/50 uppercase tracking-wider`,children:n(`binding_matrix.legend`)}),(0,S.jsx)(`div`,{className:`gap-x-3 gap-y-0.5 grid grid-cols-2`,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:`gap-x-2 gap-y-0.5 grid grid-cols-3 mt-1.5 pt-1.5 border-base-300 border-t`,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,a]=(0,b.useState)(!0),[o,s]=(0,b.useState)(!0),c=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`&&!c.has(e.id)),f=t.filter(e=>e.type===`cover`&&!c.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`)&&!c.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:`space-y-3 mt-4`,children:[g&&(0,S.jsxs)(`div`,{className:`bg-warning/5 border border-warning/20 rounded-xl overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-warning/10 p-3 w-full font-semibold text-warning text-sm transition-colors`,onClick:()=>a(!r),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(l,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_local`)]}),r?(0,S.jsx)(m,{className:`w-3 h-3`}):(0,S.jsx)(i,{className:`w-3 h-3`})]}),r&&(0,S.jsxs)(`div`,{className:`space-y-2 p-3 pt-0`,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:`bg-info/5 border border-info/20 rounded-xl overflow-hidden`,children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-info/10 p-3 w-full font-semibold text-info text-sm transition-colors`,onClick:()=>s(!o),children:[(0,S.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,S.jsx)(l,{className:`w-3.5 h-3.5`}),n(`binding_matrix.unconfigured_remote`)]}),o?(0,S.jsx)(m,{className:`w-3 h-3`}):(0,S.jsx)(i,{className:`w-3 h-3`})]}),o&&(0,S.jsxs)(`div`,{className:`space-y-2 p-3 pt-0`,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:`mb-1 font-semibold text-xs text-base-content/60`,children:e}),(0,S.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map(e=>(0,S.jsxs)(`span`,{className:`gap-1 font-mono text-xxs badge badge-sm badge-ghost`,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:i,t:a,onEditInput:o,onEditOutput:s}){let[c,l]=(0,b.useState)(null),[u,d]=(0,b.useState)(null),f=(0,b.useRef)(null),m=(0,b.useRef)(!1),h=(0,b.useRef)(!1),g=(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),window.addEventListener(`contextmenu`,t,{capture:!0}),window.addEventListener(`scroll`,t,!0),e=()=>{window.removeEventListener(`click`,t),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)})})),i&&(t=t.filter(e=>e.bindings.length>0)),t},[e,n,i,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})),i&&(e=e.filter(e=>M.has(e.id))),e},[t,n,i,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:`py-12 text-base-content/40 text-center`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:a(`binding_matrix.no_data`)})}):(0,S.jsxs)(`div`,{ref:f,className:`border border-base-300 rounded-xl overflow-x-auto cursor-grab active:cursor-grabbing select-none`,onMouseDown:e=>{m.current=!0,h.current=!1,g.current=e.clientX,_.current=f.current?.scrollLeft||0},onMouseMove:e=>{if(!m.current||!f.current)return;let t=e.clientX-g.current;!h.current&&Math.abs(t)>5&&(h.current=!0),h.current&&(f.current.scrollLeft=_.current-t)},onMouseUp:()=>{m.current=!1,h.current=!1},onMouseLeave:()=>{m.current=!1,h.current=!1},onClickCapture:e=>{h.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:`left-0 z-20 sticky bg-base-200 border-base-300 border-r min-w-30`}),P.map(e=>(0,S.jsxs)(`th`,{className:r(`group/col bg-base-200 px-2 py-2 border-base-300 border-r min-w-20 font-bold text-xxs text-center whitespace-nowrap cursor-pointer`,u===e.id&&`bg-primary/10`),onMouseEnter:()=>d(e.id),onMouseLeave:()=>d(null),onClick:()=>s(e),title:a(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex justify-center items-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)(p,{className:`opacity-0 group-hover/col:opacity-40 w-2 h-2 transition-opacity shrink-0`})]}),e.area?(0,S.jsx)(`div`,{className:`font-normal text-xxs text-base-content/40 truncate`,children:e.area}):(0,S.jsx)(`div`,{className:`font-normal text-xxs text-base-content/20`,children:`—`}),e.remoteDevice&&(0,S.jsx)(`div`,{className:`font-normal text-info/50 text-xxs 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:r(`hover:bg-base-200/50`,c===e.id&&`bg-base-200/40`),onMouseEnter:()=>l(e.id),onMouseLeave:()=>l(null),children:[(0,S.jsxs)(`td`,{className:r(`group/row left-0 z-10 sticky bg-base-100 border-base-300 border-r font-medium text-xs cursor-pointer`,c===e.id&&`bg-base-200/60`,e.bindings.length===0&&`text-base-content/30`),onClick:()=>o(e),title:a(`binding_matrix.click_to_edit`),children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-1 max-w-30 font-bold truncate`,title:e.id,children:[e.name,(0,S.jsx)(p,{className:`opacity-0 group-hover/row:opacity-40 w-2.5 h-2.5 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-info/50 text-xxs`,children:e.remoteDevice})]}),P.map(n=>{let i=t?.get(n.id)||[],s=c===e.id||u===n.id;return(0,S.jsx)(`td`,{className:r(`px-1 py-1 border-base-300 border-r text-xs text-center`,i.length>0?`bg-success/15 text-success font-medium`:`text-base-content/30`,s&&i.length>0&&`bg-success/25`,s&&i.length===0&&`bg-base-200/40`),onMouseEnter:()=>d(n.id),onMouseLeave:()=>{d(null),D()},onContextMenu:t=>w(t,e,i.length>0),onMouseDown:t=>{t.button===0&&T(t,e,i.length>0)},onMouseUp:D,onTouchStart:t=>T(t,e,i.length>0),onTouchEnd:D,onTouchMove:D,children:i.length>0&&(0,S.jsx)(`div`,{className:`flex flex-col gap-0.5`,children:i.map((t,n)=>(0,S.jsx)(`button`,{className:`hover:bg-success/30 px-0.5 rounded text-left whitespace-nowrap transition-colors cursor-pointer`,onClick:()=>o(e,t.clickType),title:`${A(t,a)}\n${a(`binding_matrix.click_to_edit`)}`,children:k(t,a)},n))})},n.id)})]},e.id)})})]}),v&&(0,S.jsxs)(`div`,{className:`z-50 fixed bg-base-100 shadow-xl py-1 border border-base-300 rounded-lg min-w-45 animate-in duration-100 fade-in zoom-in-95`,style:{left:v.x,top:v.y},onClick:e=>e.stopPropagation(),children:[(0,S.jsx)(`div`,{className:`px-3 py-1.5 font-semibold text-xxs text-base-content/40 uppercase tracking-wider`,children:a(`binding_matrix.add_action`)}),E.filter(e=>v.row.inputKind===`binary_sensor`?e.key===`pressed`||e.key===`released`:e.key!==`pressed`&&e.key!==`released`).map(e=>(0,S.jsxs)(`button`,{className:`flex items-center gap-2 hover:bg-primary/10 px-3 py-1.5 w-full text-sm text-left transition-colors`,onClick:()=>{o(v.row,e.key),y(null)},children:[(0,S.jsx)(`span`,{className:`font-mono text-base-content/70`,children:e.icon}),a(`binding_matrix.legend_${e.key}`)]},e.key))]})]})}function te({inputs:e,areaFilter:t,hideEmpty:n,t:o,onEditInput:s}){let[l,u]=(0,b.useState)(null),d=(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]),f=(0,b.useCallback)(e=>{u(t=>t===e?null:e)},[]);return d.length===0?(0,S.jsx)(`div`,{className:`py-12 text-base-content/40 text-center`,children:(0,S.jsx)(`p`,{className:`text-sm`,children:o(`binding_matrix.no_data`)})}):(0,S.jsx)(`div`,{className:`space-y-1.5`,children:d.map(e=>{let t=l===e.id,n=e.bindings.length>0,u=new Map;for(let t of e.bindings){let e=u.get(t.targetId)||[];e.push(t),u.set(t.targetId,e)}return(0,S.jsxs)(`div`,{className:r(`border rounded-xl overflow-hidden transition-colors`,n?`border-success/20 bg-success/5`:`border-base-300 bg-base-200/30`),children:[(0,S.jsxs)(`button`,{className:`flex justify-between items-center hover:bg-base-200/30 p-3 w-full text-sm transition-colors`,onClick:()=>n&&f(e.id),disabled:!n,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[n?(0,S.jsx)(c,{className:`w-3.5 h-3.5 text-success shrink-0`}):(0,S.jsx)(a,{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:r(`block font-semibold truncate`,!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:`font-bold badge badge-sm badge-success`,children:e.bindings.length}),e.type===`remote`&&(0,S.jsx)(`span`,{className:`font-mono badge badge-xs badge-info`,children:e.remoteDevice}),n&&(t?(0,S.jsx)(m,{className:`w-3 h-3 text-base-content/30`}):(0,S.jsx)(i,{className:`w-3 h-3 text-base-content/30`}))]})]}),t&&n&&(0,S.jsxs)(`div`,{className:`space-y-2 bg-base-100/50 p-3 border-base-300 border-t`,children:[[...u.entries()].map(([e,t])=>(0,S.jsxs)(`div`,{className:`flex items-start gap-2 text-xs`,children:[(0,S.jsx)(`span`,{className:`mt-0.5 font-mono font-bold text-base-content/70 shrink-0`,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:`gap-0.5 font-mono badge badge-xs badge-success`,children:k(e,o)},t))})]})]},e)),(0,S.jsxs)(`button`,{className:`gap-1 mt-1 btn-outline btn btn-xs btn-primary`,onClick:t=>{t.stopPropagation(),s(e)},children:[(0,S.jsx)(p,{className:`w-2.5 h-2.5`}),o(`binding_matrix.edit_input`)]})]})]},e.id)})})}var L=({formData:e,sections:t,onSaveSection:n,onUpdateFormData:r})=>{let{t:a}=g(),[s,c]=(0,b.useState)(new Set),[l,u]=(0,b.useState)(!1),[f,p]=(0,b.useState)(!1),[m,h]=(0,b.useState)(!1),[v,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),[W,G]=(0,b.useState)(!1),K=(0,b.useRef)(null),q=(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.boneio_input||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),h(!0))},[e]),ae=(0,b.useCallback)(async()=>{if(A||T<0||!v)return;let t=[...e[C]||[]];t[T]=v,L(!0);try{r(C,t),await n(C,t),h(!1),x(null)}catch(e){console.error(`Failed to save input:`,e)}finally{L(!1)}},[v,T,C,e,A,n,r]),oe=(0,b.useCallback)(()=>{h(!1),x(null)},[]),J=(0,b.useMemo)(()=>M(e),[e]),Y=(0,b.useMemo)(()=>N(e),[e]),se=(0,b.useMemo)(()=>{let e=new Set;return J.forEach(t=>{t.area&&e.add(t.area)}),Y.forEach(t=>{t.area&&e.add(t.area)}),[...e].sort()},[J,Y]),ce=(0,b.useMemo)(()=>J.some(e=>!e.area)||Y.some(e=>!e.area),[J,Y]),X=(0,b.useMemo)(()=>e.output||[],[e.output]),Z=(0,b.useMemo)(()=>e.cover||[],[e.cover]),Q=(0,b.useMemo)(()=>e.output_group||[],[e.output_group]),le=(0,b.useMemo)(()=>e.remote_devices||[],[e.remote_devices]),ue=(0,b.useMemo)(()=>e.remote_inputs||[],[e.remote_inputs]),de=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType===`binary_sensor`),[e.local_inputs]),fe=(0,b.useMemo)(()=>(e.local_inputs||[]).filter(e=>e._inputType!==`binary_sensor`),[e.local_inputs]),$=(0,b.useMemo)(()=>e.areas||[],[e.areas]),pe=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`local_inputs`);return e?.schema||e?.normalizedSchema||{}},[t]),me=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`output`);return e?.schema||e?.normalizedSchema||{}},[t]),he=(0,b.useMemo)(()=>t.find(e=>e.name===`output`)?.uiSchema||{},[t]),ge=(0,b.useMemo)(()=>{let e=t.find(e=>e.name===`cover`);return e?.schema||e?.normalizedSchema||{}},[t]),_e=(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]))),K.current=JSON.stringify(r[i]),z(!0))},[e]),ve=(0,b.useCallback)(async()=>{if(U<0||!B)return;let t=[...e[H]||[]];t[U]=B,G(!0);try{r(H,t),await n(H,t),z(!1),V(null)}catch(e){console.error(`Failed to save output:`,e)}finally{G(!1)}},[B,U,H,e,n,r]),ye=(0,b.useCallback)(()=>{z(!1),V(null)},[]),be=v&&R.current&&JSON.stringify(v)!==R.current,xe=B&&K.current&&JSON.stringify(B)!==K.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:`font-extrabold text-xl tracking-tight`,children:a(`binding_matrix.title`)}),(0,S.jsx)(`p`,{className:`text-sm text-base-content/50`,children:a(`binding_matrix.subtitle`)})]}),(0,S.jsx)(P,{inputs:J,outputs:Y,t:a}),(0,S.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 mb-4`,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:`justify-between gap-1 btn-outline min-w-40 btn btn-sm`,onClick:()=>u(e=>!e),children:[(0,S.jsx)(`span`,{className:`text-xs truncate`,children:s.size===0?a(`binding_matrix.all_areas`):s.size===1?s.has(`__none__`)?a(`binding_matrix.no_area`):[...s][0]:a(`binding_matrix.areas_selected`,{count:s.size})}),(0,S.jsx)(i,{className:`w-2.5 h-2.5 shrink-0`})]}),l&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`z-40 fixed inset-0`,onClick:()=>u(!1)}),(0,S.jsxs)(`div`,{className:`top-full left-0 z-50 absolute bg-base-100 shadow-xl mt-1 py-1 border border-base-300 rounded-lg min-w-50 max-h-75 overflow-y-auto`,children:[(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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:`font-semibold text-xs`,children:a(`binding_matrix.all_areas`)})]}),(0,S.jsx)(`div`,{className:`my-0.5 border-base-300 border-t`}),ce&&(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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 text-base-content/50 italic`,children:a(`binding_matrix.no_area`)})]}),se.map(e=>(0,S.jsxs)(`label`,{className:`flex items-center gap-2 hover:bg-base-200/60 px-3 py-1.5 transition-colors cursor-pointer`,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:`flex items-center gap-1 font-medium text-xs text-base-content/60`,children:[f?(0,S.jsx)(_,{className:`w-3 h-3`}):(0,S.jsx)(o,{className:`w-3 h-3`}),a(`binding_matrix.hide_empty`)]})]})]}),(0,S.jsx)(`div`,{className:`hidden md:block`,children:(0,S.jsx)(ee,{inputs:J,outputs:Y,areaFilter:s,hideEmpty:f,t:a,onEditInput:q,onEditOutput:_e})}),(0,S.jsx)(`div`,{className:`md:hidden`,children:(0,S.jsx)(te,{inputs:J,areaFilter:s,hideEmpty:f,t:a,onEditInput:q})}),(0,S.jsx)(F,{inputs:J,outputs:Y,t:a}),(0,S.jsx)(y,{open:m,onOpenChange:h,editingItem:v,editingIndex:T,sectionType:C,schema:C===`remote_inputs`?t.find(e=>e.name===`remote_inputs`)?.schema||t.find(e=>e.name===`remote_inputs`)?.normalizedSchema||{}:pe,allBinarySensors:de,allEvents:fe,allOutputs:X,allOutputGroups:Q,allCovers:Z,allAreas:$,allRemoteDevices:le,allRemoteInputs:ue,savedOutputs:X,savedOutputGroups:Q,savedCovers:Z,onChange:x,onSave:ae,onCancel:oe,onValidationChange:j,saveDisabled:A||!be,isSaving:I,initialTab:D}),(0,S.jsx)(y,{open:ne,onOpenChange:z,editingItem:B,editingIndex:U,sectionType:H,schema:H===`cover`?ge:me,uiSchema:H===`cover`?void 0:he,allOutputs:X,allCovers:Z,allAreas:$,onChange:V,onSave:ve,onCancel:ye,saveDisabled:!xe,isSaving:W})]})};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{b as c}from"./vendor-IzweXARb.js";import{t as l}from"./axios-DHUeYRnu.js";import{E as u,Et as d,O as f,Qt as p,Tt as m,p as h,wt as g}from"./index-DCzOrheh.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 p({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}=h(),[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,p]=(0,_.useState)(!1),[h,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)(u,{}):(0,b.jsx)(f,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(d,{}):(0,b.jsx)(m,{}):(0,b.jsx)(g,{})}),(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(p(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),p(!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:[h===`waiting`&&`Restarting Service...`,h===`checking`&&`Waiting for Service...`,h===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[h===`waiting`&&`Initiating service restart`,h===`checking`&&`Checking if service is back online`,h===`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{b as c}from"./vendor-IzweXARb.js";import{t as l}from"./axios-DHUeYRnu.js";import{E as u,Et as d,O as f,Qt as p,Tt as m,p as h,wt as g}from"./index-BuJzdMCI.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 p({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}=h(),[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,p]=(0,_.useState)(!1),[h,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)(u,{}):(0,b.jsx)(f,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(d,{}):(0,b.jsx)(m,{}):(0,b.jsx)(g,{})}),(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(p(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),p(!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:[h===`waiting`&&`Restarting Service...`,h===`checking`&&`Waiting for Service...`,h===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[h===`waiting`&&`Initiating service restart`,h===`checking`&&`Checking if service is back online`,h===`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};