boneio 1.3.0.dev19__tar.gz → 1.3.1.dev1__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 (441) hide show
  1. {boneio-1.3.0.dev19/boneio.egg-info → boneio-1.3.1.dev1}/PKG-INFO +1 -1
  2. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/event.py +69 -51
  3. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/update.py +56 -8
  4. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/MANIFEST.sha256 +1 -1
  5. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/runner.py +33 -13
  6. boneio-1.3.1.dev1/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +29 -0
  7. boneio-1.3.1.dev1/boneio/version.py +2 -0
  8. boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/ConfigEditor-CIjN171I.js → boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-DcU5XNy1.js +1 -1
  9. boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/index-BoLwm6vF.js +44 -0
  10. boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/useTranslation-BRR2hwZk.js → boneio-1.3.1.dev1/boneio/webui/frontend-dist/assets/useTranslation-Dwuk-AFr.js +2 -2
  11. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/index.html +2 -2
  12. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/sw.js +1 -1
  13. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/can.py +2 -38
  14. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/migrations.py +10 -6
  15. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/system.py +16 -33
  16. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1/boneio.egg-info}/PKG-INFO +1 -1
  17. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/SOURCES.txt +4 -4
  18. boneio-1.3.0.dev19/boneio/hardware/can/sudoers.py +0 -199
  19. boneio-1.3.0.dev19/boneio/version.py +0 -2
  20. boneio-1.3.0.dev19/boneio/webui/frontend-dist/assets/index-eaBQjHZY.js +0 -44
  21. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/LICENSE +0 -0
  22. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/MANIFEST.in +0 -0
  23. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/README.md +0 -0
  24. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/__init__.py +0 -0
  25. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/input.yaml +0 -0
  26. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
  27. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
  28. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
  29. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
  30. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  31. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/input.yaml +0 -0
  32. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
  33. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
  34. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
  35. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
  36. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  37. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/input.yaml +0 -0
  38. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
  39. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
  40. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
  41. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
  42. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  43. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/input.yaml +0 -0
  44. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
  45. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
  46. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
  47. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  48. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/input.yaml +0 -0
  49. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
  50. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
  51. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
  52. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  53. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/input.yaml +0 -0
  54. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
  55. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  56. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
  57. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
  58. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  59. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/input.yaml +0 -0
  60. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
  61. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  62. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
  63. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
  64. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  65. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/bonecli.py +0 -0
  66. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/__init__.py +0 -0
  67. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/__init__.py +0 -0
  68. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/cover.py +0 -0
  69. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/time_based.py +0 -0
  70. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/cover/venetian.py +0 -0
  71. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/group/__init__.py +0 -0
  72. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/group/output_group.py +0 -0
  73. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/__init__.py +0 -0
  74. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/binary_sensor.py +0 -0
  75. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/input/detectors.py +0 -0
  76. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/__init__.py +0 -0
  77. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/controller.py +0 -0
  78. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/irrigation/water_source.py +0 -0
  79. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/__init__.py +0 -0
  80. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/basic.py +0 -0
  81. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/mcp.py +0 -0
  82. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/pca.py +0 -0
  83. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/output/pcf.py +0 -0
  84. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/sensor/__init__.py +0 -0
  85. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
  86. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/__init__.py +0 -0
  87. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/alarm_panel.py +0 -0
  88. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/gate_cover.py +0 -0
  89. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/components/template/thermostat.py +0 -0
  90. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/const.py +0 -0
  91. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/__init__.py +0 -0
  92. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/__init__.py +0 -0
  93. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/__init__.py +0 -0
  94. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  95. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  96. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  97. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/registration.py +0 -0
  98. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/cloud/secrets.py +0 -0
  99. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/__init__.py +0 -0
  100. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/config_helper.py +0 -0
  101. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/__init__.py +0 -0
  102. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  103. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
  104. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/package-lock.json +0 -0
  105. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/package.json +0 -0
  106. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/schema_converter.py +0 -0
  107. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/config/yaml_util.py +0 -0
  108. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/discovery.py +0 -0
  109. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/events/__init__.py +0 -0
  110. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/events/bus.py +0 -0
  111. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/__init__.py +0 -0
  112. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/action_conditions.py +0 -0
  113. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/canopen.py +0 -0
  114. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/covers.py +0 -0
  115. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/display.py +0 -0
  116. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/inputs.py +0 -0
  117. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/irrigation.py +0 -0
  118. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/manager.py +0 -0
  119. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/modbus.py +0 -0
  120. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/outputs.py +0 -0
  121. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/remote.py +0 -0
  122. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/sensors.py +0 -0
  123. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/__init__.py +0 -0
  124. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/alarm.py +0 -0
  125. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
  126. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
  127. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/manager/templates.py +0 -0
  128. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/__init__.py +0 -0
  129. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/basic.py +0 -0
  130. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
  131. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/composite.py +0 -0
  132. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/local.py +0 -0
  133. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/lox.py +0 -0
  134. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/loxone.py +0 -0
  135. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/mqtt.py +0 -0
  136. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/messaging/queue.py +0 -0
  137. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/__init__.py +0 -0
  138. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/base.py +0 -0
  139. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/can.py +0 -0
  140. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/esphome.py +0 -0
  141. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/mqtt.py +0 -0
  142. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/remote/wled.py +0 -0
  143. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/__init__.py +0 -0
  144. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/base.py +0 -0
  145. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/sensor/system.py +0 -0
  146. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/state/__init__.py +0 -0
  147. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/state/manager.py +0 -0
  148. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/__init__.py +0 -0
  149. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/host_data.py +0 -0
  150. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/system/monitor.py +0 -0
  151. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/__init__.py +0 -0
  152. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/async_updater.py +0 -0
  153. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/conditions.py +0 -0
  154. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/filter.py +0 -0
  155. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/font_util.py +0 -0
  156. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/logger.py +0 -0
  157. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/timeperiod.py +0 -0
  158. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/core/utils/util.py +0 -0
  159. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
  160. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  161. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/config.yaml +0 -0
  162. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/event.yaml +0 -0
  163. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
  164. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  165. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
  166. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  167. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/config.yaml +0 -0
  168. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/event.yaml +0 -0
  169. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
  170. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  171. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
  172. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  173. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/config.yaml +0 -0
  174. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/event.yaml +0 -0
  175. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
  176. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  177. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/__init__.py +0 -0
  178. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/can_master.yaml +0 -0
  179. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/can_slave.yaml +0 -0
  180. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/adc.yaml +0 -0
  181. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  182. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/config.yaml +0 -0
  183. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/cover.yaml +0 -0
  184. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/event.yaml +0 -0
  185. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
  186. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
  187. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
  188. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  189. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
  190. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
  191. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
  192. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  193. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  194. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
  195. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  196. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  197. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  198. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  199. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
  200. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  201. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  202. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  203. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  204. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  205. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  206. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/exceptions.py +0 -0
  207. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/__init__.py +0 -0
  208. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/analog/__init__.py +0 -0
  209. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/analog/adc.py +0 -0
  210. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/__init__.py +0 -0
  211. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/bridge.py +0 -0
  212. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/client.py +0 -0
  213. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/interface.py +0 -0
  214. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/node.py +0 -0
  215. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/node_id.py +0 -0
  216. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/can/test_od.py +0 -0
  217. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/__init__.py +0 -0
  218. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/early_oled.py +0 -0
  219. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  220. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/display/oled.py +0 -0
  221. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/__init__.py +0 -0
  222. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  223. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  224. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  225. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  226. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
  227. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/base.py +0 -0
  228. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
  229. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/__init__.py +0 -0
  230. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/bus.py +0 -0
  231. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/ina219.py +0 -0
  232. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
  233. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
  234. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
  235. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/__init__.py +0 -0
  236. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/bus.py +0 -0
  237. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/dallas.py +0 -0
  238. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/onewire/ds2482.py +0 -0
  239. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/__init__.py +0 -0
  240. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  241. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/base.py +0 -0
  242. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  243. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  244. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/__init__.py +0 -0
  245. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/homeassistant.py +0 -0
  246. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/interlock.py +0 -0
  247. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/integration/lox_template.py +0 -0
  248. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/__init__.py +0 -0
  249. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/actions.py +0 -0
  250. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
  251. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  252. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  253. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  254. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/journald/journald.conf +0 -0
  255. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  256. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
  257. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  258. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/boneio.service +0 -0
  259. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  260. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  261. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  262. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  263. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  264. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  265. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  266. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  267. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  268. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/__init__.py +0 -0
  269. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  270. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  271. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/__init__.py +0 -0
  272. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/cli.py +0 -0
  273. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/client.py +0 -0
  274. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/coordinator.py +0 -0
  275. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/__init__.py +0 -0
  276. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  277. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  278. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  279. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  280. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  281. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  282. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  283. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  284. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  285. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
  286. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/inverters/thessla.json +0 -0
  287. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  288. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  289. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  290. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/other/wanas415.json +0 -0
  291. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  292. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
  293. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  294. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  295. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  296. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  297. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  298. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
  299. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
  300. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
  301. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/__init__.py +0 -0
  302. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/base.py +0 -0
  303. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
  304. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
  305. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/select.py +0 -0
  306. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
  307. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/derived/text.py +0 -0
  308. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
  309. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
  310. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
  311. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
  312. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
  313. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
  314. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
  315. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/modbus/utils.py +0 -0
  316. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/__init__.py +0 -0
  317. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/actions.py +0 -0
  318. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/events.py +0 -0
  319. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/files.py +0 -0
  320. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/logs.py +0 -0
  321. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/mqtt.py +0 -0
  322. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/models/state.py +0 -0
  323. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/runner.py +0 -0
  324. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions.yaml +0 -0
  325. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions_sensor.yaml +0 -0
  326. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/actions_switch.yaml +0 -0
  327. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/condition.yaml +0 -0
  328. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/filters.yaml +0 -0
  329. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/filters_adc.yaml +0 -0
  330. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/id.yaml +0 -0
  331. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/remote_devices.yaml +0 -0
  332. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/schema.yaml +0 -0
  333. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/temp_unit.yaml +0 -0
  334. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/schema/update_interval.yaml +0 -0
  335. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/action_validation.py +0 -0
  336. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/app.py +0 -0
  337. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/aiConfig-LL3nlemJ.js +0 -0
  338. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CmumVq54.js +0 -0
  339. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  340. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  341. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/index-C_S5rhz7.css +0 -0
  342. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  343. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  344. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  345. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  346. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  347. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  348. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  349. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  350. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  351. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  352. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  353. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  354. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  355. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  356. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  357. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  358. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  359. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  360. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  361. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  362. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  363. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  364. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  365. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  366. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  367. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  368. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  369. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  370. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  371. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  372. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  373. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  374. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  375. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  376. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  377. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  378. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  379. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  380. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  381. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  382. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  383. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  384. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/middleware/__init__.py +0 -0
  385. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/middleware/auth.py +0 -0
  386. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/__init__.py +0 -0
  387. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/auth.py +0 -0
  388. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/caddy.py +0 -0
  389. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/config.py +0 -0
  390. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/covers.py +0 -0
  391. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/irrigation.py +0 -0
  392. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/modbus.py +0 -0
  393. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/outputs.py +0 -0
  394. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/remote_devices.py +0 -0
  395. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/sensors.py +0 -0
  396. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/templates.py +0 -0
  397. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
  398. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/tools.py +0 -0
  399. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/routes/update.py +0 -0
  400. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/adc.schema.json +0 -0
  401. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/areas.schema.json +0 -0
  402. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  403. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
  404. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/can.schema.json +0 -0
  405. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/config.schema.json +0 -0
  406. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/cover.schema.json +0 -0
  407. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
  408. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
  409. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/event.schema.json +0 -0
  410. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
  411. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
  412. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
  413. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/logger.schema.json +0 -0
  414. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
  415. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  416. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  417. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
  418. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  419. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
  420. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/oled.schema.json +0 -0
  421. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/output.schema.json +0 -0
  422. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
  423. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
  424. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  425. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
  426. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
  427. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/template.schema.json +0 -0
  428. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  429. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/schema/web.schema.json +0 -0
  430. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/services/__init__.py +0 -0
  431. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/services/logs.py +0 -0
  432. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/web_server.py +0 -0
  433. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio/webui/websocket_manager.py +0 -0
  434. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/dependency_links.txt +0 -0
  435. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/entry_points.txt +0 -0
  436. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/requires.txt +0 -0
  437. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/boneio.egg-info/top_level.txt +0 -0
  438. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/pyproject.toml +0 -0
  439. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/setup.cfg +0 -0
  440. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/setup.py +0 -0
  441. {boneio-1.3.0.dev19 → boneio-1.3.1.dev1}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.3.0.dev19
3
+ Version: 1.3.1.dev1
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
@@ -20,11 +20,11 @@ DEFAULT_SEQUENCE_WINDOW_MS = 500
20
20
 
21
21
  def _to_milliseconds(value, default_ms: int) -> int:
22
22
  """Convert a value to milliseconds.
23
-
23
+
24
24
  Args:
25
25
  value: Can be int, float, TimePeriod, or None
26
26
  default_ms: Default value in milliseconds if value is None
27
-
27
+
28
28
  Returns:
29
29
  Value in milliseconds as integer
30
30
  """
@@ -42,7 +42,7 @@ class GpioEventButton(GpioBaseClass):
42
42
 
43
43
  def __init__(self, **kwargs) -> None:
44
44
  """Setup GPIO Event Button with multiclick support.
45
-
45
+
46
46
  Args:
47
47
  double_click_duration: Time window in ms to detect double click (default: 220ms)
48
48
  long_press_duration: Time in ms to detect long press (default: 400ms)
@@ -50,51 +50,60 @@ class GpioEventButton(GpioBaseClass):
50
50
  **kwargs: Additional arguments passed to GpioBaseClass
51
51
  """
52
52
  super().__init__(**kwargs)
53
-
53
+
54
54
  # Get timing values from config or use defaults, converting TimePeriod to ms
55
- double_click_duration = _to_milliseconds(
56
- kwargs.get('double_click_duration'),
57
- DEFAULT_DOUBLE_CLICK_DURATION_MS
58
- )
59
- long_press_duration = _to_milliseconds(
60
- kwargs.get('long_press_duration'),
61
- DEFAULT_LONG_PRESS_DURATION_MS
62
- )
63
- sequence_window_duration = _to_milliseconds(
64
- kwargs.get('sequence_window_duration'),
65
- DEFAULT_SEQUENCE_WINDOW_MS
66
- )
67
-
55
+ double_click_duration = _to_milliseconds(kwargs.get("double_click_duration"), DEFAULT_DOUBLE_CLICK_DURATION_MS)
56
+ long_press_duration = _to_milliseconds(kwargs.get("long_press_duration"), DEFAULT_LONG_PRESS_DURATION_MS)
57
+ sequence_window_duration = _to_milliseconds(kwargs.get("sequence_window_duration"), DEFAULT_SEQUENCE_WINDOW_MS)
58
+
68
59
  # Determine which sequences are enabled based on configured actions OR mqtt_sequences
69
60
  # A sequence is enabled if it has actions defined OR is set to publish to MQTT
70
61
  enabled_sequences: set[str] = set()
71
- sequence_types = {'double_then_long', 'single_then_long', 'double_then_single'}
72
-
62
+ sequence_types = {"double_then_long", "single_then_long", "double_then_single"}
63
+
73
64
  # Check actions
74
- actions = kwargs.get('actions', {})
65
+ actions = kwargs.get("actions", {})
75
66
  if isinstance(actions, dict):
76
67
  for seq_type in sequence_types:
77
68
  if seq_type in actions and actions[seq_type]:
78
69
  enabled_sequences.add(seq_type)
79
-
70
+
80
71
  # Check mqtt_sequences
81
- mqtt_sequences = kwargs.get('mqtt_sequences', {})
72
+ mqtt_sequences = kwargs.get("mqtt_sequences", {})
82
73
  if isinstance(mqtt_sequences, dict):
83
74
  for seq_type in sequence_types:
84
75
  if mqtt_sequences.get(seq_type):
85
76
  enabled_sequences.add(seq_type)
86
-
77
+
87
78
  _LOGGER.debug("Enabled sequences for %s: %s", self._name, enabled_sequences)
88
-
79
+
89
80
  # Get enable_triple_click setting (default: False)
90
- enable_triple_click = kwargs.get('enable_triple_click', False)
91
-
81
+ enable_triple_click = kwargs.get("enable_triple_click", False)
82
+
92
83
  # Safety timeout for long press (default: 120s)
93
- max_long_press_seconds = _to_milliseconds(
94
- kwargs.get('max_long_press_duration'),
95
- 120 * 1000 # 120s default
96
- ) / 1000.0
97
-
84
+ max_long_press_seconds = (
85
+ _to_milliseconds(
86
+ kwargs.get("max_long_press_duration"),
87
+ 120 * 1000, # 120s default
88
+ )
89
+ / 1000.0
90
+ )
91
+ # Guard: if resolved to < 0.8s (misconfigured or zero), use default 120s
92
+ if max_long_press_seconds < 0.8:
93
+ raw = kwargs.get("max_long_press_duration")
94
+ if raw is not None:
95
+ _LOGGER.warning(
96
+ "max_long_press_duration for %s resolved to %.1fs (too small), using default 120s",
97
+ kwargs.get("name", "unknown"),
98
+ max_long_press_seconds,
99
+ )
100
+ max_long_press_seconds = 120.0
101
+ _LOGGER.debug(
102
+ "max_long_press_seconds for %s = %.1fs",
103
+ kwargs.get("name", "unknown"),
104
+ max_long_press_seconds,
105
+ )
106
+
98
107
  # Create multiclick detector
99
108
  self._detector = MultiClickDetector(
100
109
  loop=self._loop,
@@ -110,7 +119,7 @@ class GpioEventButton(GpioBaseClass):
110
119
  pin=self._pin,
111
120
  max_long_press_seconds=max_long_press_seconds,
112
121
  )
113
-
122
+
114
123
  # Register with GPIO manager
115
124
  gpio_manager = get_gpio_manager(loop=self._loop)
116
125
  gpio_manager.add_input(
@@ -119,12 +128,12 @@ class GpioEventButton(GpioBaseClass):
119
128
  detector=self._detector,
120
129
  gpio_mode=kwargs.get("gpio_mode", "gpio"),
121
130
  )
122
-
131
+
123
132
  _LOGGER.debug("Configured event input %s on pin %s", self._name, self._pin)
124
133
 
125
134
  def _on_click_detected(self, click_type: ClickTypes, duration: float | None) -> None:
126
135
  """Called by MultiClickDetector when a click is detected.
127
-
136
+
128
137
  Args:
129
138
  click_type: Type of click (SINGLE, DOUBLE, LONG)
130
139
  duration: Duration of the press (for LONG press)
@@ -137,7 +146,7 @@ class GpioEventButton(GpioBaseClass):
137
146
  click_type,
138
147
  duration,
139
148
  )
140
-
149
+
141
150
  # Call the base class press_callback which handles manager callback and events
142
151
  self.press_callback(
143
152
  click_type=click_type,
@@ -158,10 +167,10 @@ class GpioEventButton(GpioBaseClass):
158
167
  max_long_press_duration: int | float | None = None,
159
168
  ) -> None:
160
169
  """Update timing parameters for click detection.
161
-
170
+
162
171
  This method allows updating timing parameters at runtime without
163
172
  recreating the detector. Useful for config reload.
164
-
173
+
165
174
  Args:
166
175
  double_click_duration: Time window in ms to detect double click
167
176
  long_press_duration: Time in ms to detect long press
@@ -174,48 +183,48 @@ class GpioEventButton(GpioBaseClass):
174
183
  max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
175
184
  """
176
185
  from boneio.const import CLICK_SEQUENCES
177
-
186
+
178
187
  if double_click_duration is not None:
179
188
  value_ms = _to_milliseconds(double_click_duration, DEFAULT_DOUBLE_CLICK_DURATION_MS)
180
189
  self._detector._multiclick_window = value_ms / 1000.0
181
190
  _LOGGER.debug("Updated double_click_duration to %dms for %s", value_ms, self._name)
182
-
191
+
183
192
  if long_press_duration is not None:
184
193
  value_ms = _to_milliseconds(long_press_duration, DEFAULT_LONG_PRESS_DURATION_MS)
185
194
  self._detector._hold_threshold = value_ms / 1000.0
186
195
  _LOGGER.debug("Updated long_press_duration to %dms for %s", value_ms, self._name)
187
-
196
+
188
197
  if sequence_window_duration is not None:
189
198
  value_ms = _to_milliseconds(sequence_window_duration, DEFAULT_SEQUENCE_WINDOW_MS)
190
199
  self._detector._sequence_window = value_ms / 1000.0
191
200
  _LOGGER.debug("Updated sequence_window_duration to %dms for %s", value_ms, self._name)
192
-
201
+
193
202
  if sequence_mode is not None:
194
203
  self._sequence_mode = sequence_mode
195
204
  self._detector._sequence_mode = sequence_mode
196
205
  _LOGGER.debug("Updated sequence_mode to %s for %s", sequence_mode, self._name)
197
-
206
+
198
207
  if enable_triple_click is not None:
199
208
  self._detector._enable_triple_click = enable_triple_click
200
209
  _LOGGER.debug("Updated enable_triple_click to %s for %s", enable_triple_click, self._name)
201
-
210
+
202
211
  # Update enabled sequences based on actions and mqtt_sequences
203
- sequence_types = {'double_then_long', 'single_then_long', 'double_then_single'}
212
+ sequence_types = {"double_then_long", "single_then_long", "double_then_single"}
204
213
  enabled_sequences: set[str] = set()
205
-
214
+
206
215
  if actions is not None and isinstance(actions, dict):
207
216
  for seq_type in sequence_types:
208
217
  if seq_type in actions and actions[seq_type]:
209
218
  enabled_sequences.add(seq_type)
210
-
219
+
211
220
  if mqtt_sequences is not None and isinstance(mqtt_sequences, dict):
212
221
  for seq_type in sequence_types:
213
222
  if mqtt_sequences.get(seq_type):
214
223
  enabled_sequences.add(seq_type)
215
-
224
+
216
225
  if actions is not None or mqtt_sequences is not None:
217
226
  self._detector._enabled_sequences = enabled_sequences
218
-
227
+
219
228
  # Recompute delay_click_types
220
229
  self._detector._delay_click_types = set()
221
230
  if self._detector._sequence_mode == "exclusive" and enabled_sequences:
@@ -228,9 +237,18 @@ class GpioEventButton(GpioBaseClass):
228
237
 
229
238
  if max_long_press_duration is not None:
230
239
  value_ms = _to_milliseconds(max_long_press_duration, 120 * 1000)
231
- self._detector._max_long_press_seconds = value_ms / 1000.0
232
- _LOGGER.debug("Updated max_long_press_duration to %dms for %s", value_ms, self._name)
240
+ value_s = value_ms / 1000.0
241
+ # Guard: if resolved to < 1s (misconfigured or zero), use default 120s
242
+ if value_s < 1.0:
243
+ _LOGGER.warning(
244
+ "max_long_press_duration for %s resolved to %.1fs (too small), using default 120s",
245
+ self._name,
246
+ value_s,
247
+ )
248
+ value_s = 120.0
249
+ self._detector._max_long_press_seconds = value_s
250
+ _LOGGER.debug("Updated max_long_press_duration to %.0fs for %s", value_s, self._name)
233
251
 
234
252
  if long_press_mqtt_mode is not None:
235
253
  self._long_press_mqtt_mode = long_press_mqtt_mode
236
- _LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
254
+ _LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
@@ -12,6 +12,7 @@ import logging
12
12
  import os
13
13
  import subprocess
14
14
  from collections.abc import Callable
15
+ from pathlib import Path
15
16
  from typing import TYPE_CHECKING
16
17
 
17
18
  from boneio.core.utils.async_updater import AsyncUpdater
@@ -19,6 +20,9 @@ from boneio.core.utils.timeperiod import TimePeriod
19
20
  from boneio.version import __version__
20
21
  from boneio.webui.services.logs import is_running_as_service
21
22
 
23
+ # Flag file created before restart so the new process knows it was an update
24
+ UPDATE_FLAG_PATH = Path("/tmp/boneio_update_in_progress")
25
+
22
26
  if TYPE_CHECKING:
23
27
  from boneio.core.manager import Manager
24
28
 
@@ -532,19 +536,27 @@ class UpdateManager(AsyncUpdater):
532
536
  await _report(90, "Installation verified", f"Updated from {current_version} to {new_version}")
533
537
  await _report(95, "Finalizing...")
534
538
 
535
- # Publish final success state (no longer in progress)
536
- current_version = new_version # update for final MQTT publish
539
+ # Keep in_progress=true as retained so HA shows "Updating"
540
+ # even during the restart window. The new process will clear
541
+ # this via _check_post_update_flag() on startup.
537
542
  await self._publish_update_progress(
538
- current_version=new_version,
539
- target_version=None,
540
- progress=0,
543
+ current_version=current_version,
544
+ target_version=new_version,
545
+ progress=95,
541
546
  )
547
+
548
+ # Write a flag file so the new process knows to immediately
549
+ # publish "up to date" on startup.
550
+ try:
551
+ UPDATE_FLAG_PATH.write_text(new_version, encoding="utf-8")
552
+ except OSError:
553
+ _LOGGER.warning("Could not write update flag file at %s", UPDATE_FLAG_PATH)
554
+
542
555
  if on_progress:
543
556
  on_progress(100, "Update complete!", "Restarting service in 2 seconds...")
544
557
 
545
- # Wait long enough for MQTT to drain the final state message
546
- # before killing the process. Short delays risk the retained
547
- # "in_progress" message persisting in the broker.
558
+ # Wait long enough for MQTT to drain the retained in_progress
559
+ # message before killing the process.
548
560
  await asyncio.sleep(5)
549
561
 
550
562
  _LOGGER.info("Restarting BoneIO service after update...")
@@ -664,10 +676,46 @@ class UpdateManager(AsyncUpdater):
664
676
  )
665
677
  _LOGGER.info("Subscribed to update command topic: %s", command_topic)
666
678
 
679
+ # If we just restarted after an update, immediately clear the
680
+ # retained in_progress state so HA transitions from "Updating"
681
+ # to "Up to date" as fast as possible.
682
+ await self._check_post_update_flag()
683
+
667
684
  # Migration alert event entity — fires when system migrations are pending
668
685
  await self._send_migration_event_discovery()
669
686
  await self._fire_migration_event_if_pending()
670
687
 
688
+ async def _check_post_update_flag(self) -> None:
689
+ """Check if we just restarted after a firmware update.
690
+
691
+ If the flag file exists, publish an immediate 'up to date' state
692
+ to clear the retained ``in_progress: true`` message left by the
693
+ previous process before it called ``os._exit()``. This minimises
694
+ the window in which HA shows "unavailable" for the update entity.
695
+ """
696
+ if not UPDATE_FLAG_PATH.exists():
697
+ return
698
+
699
+ try:
700
+ new_version = UPDATE_FLAG_PATH.read_text(encoding="utf-8").strip()
701
+ UPDATE_FLAG_PATH.unlink(missing_ok=True)
702
+ except OSError as exc:
703
+ _LOGGER.warning("Failed to read/remove update flag: %s", exc)
704
+ return
705
+
706
+ _LOGGER.info(
707
+ "Post-update restart detected (updated to %s). "
708
+ "Publishing 'up to date' state to clear retained in_progress.",
709
+ new_version,
710
+ )
711
+
712
+ # Publish idle state with the new version
713
+ await self._publish_update_progress(
714
+ current_version=new_version,
715
+ target_version=None,
716
+ progress=0,
717
+ )
718
+
671
719
  async def _send_migration_event_discovery(self) -> None:
672
720
  """Register HA event entity for system migration alerts.
673
721
 
@@ -13,7 +13,7 @@ f2ed05c6f5934a15f12571139bdc225804f67b8c83561cc39868f7b2296d2697 docker/daemon.
13
13
  9d4f46cfe6df36ee786b4b08fccc0a4dbe8161b82bdcb74f61cde45869e20ff9 systemd/boneio.service
14
14
  5abbd8e37720f31d44ad59814c7ebbcfb5ae09ef32d83682dee6479f34270a31 systemd/set-hostname-once.service
15
15
  8eaea86c51a17c1bc7b68e9ea65a20b428577a0bc16793768f8dba575532e8ed usr-local-bin/set-hostname-once.sh
16
- b6b7c306841f4bb3ce576fcc8cfe982f33189983afc395d769ff04575b51c990 usr-sbin/oled_boot_splash.py
16
+ 3340abd637e15bb789e20f2e7de5d95dc45d8e427689e0c62312d044cd3ad86e usr-sbin/oled_boot_splash.py
17
17
  0537e194700c50d91295517e23bcccce9b23be740b93381dff35b510d562c6fe usr-sbin/oled_boot_splash.sh
18
18
  700c812bcf192f8be079ae58fce45543c8f60d9a9c25ab149f8dd68786c717d7 usr-sbin/oled_msg.py
19
19
  e07152aae00b0d020ae69a69bfe2738a5f4b8768b62639516d85bbd2d808ba0a usr-sbin/oled_msg.sh
@@ -27,7 +27,7 @@ from enum import Enum
27
27
  from pathlib import Path
28
28
  from typing import TYPE_CHECKING, Any
29
29
 
30
- from boneio.migrations.actions import InstallFile, MigrationAction, sha256_of_content, render_template
30
+ from boneio.migrations.actions import InstallFile, MigrationAction, render_template, sha256_of_content
31
31
 
32
32
  if TYPE_CHECKING:
33
33
  pass
@@ -53,6 +53,7 @@ BOOTSTRAP_INSTALL_SCRIPT = Path(__file__).parent / "bootstrap" / "install-helper
53
53
  # Status enum
54
54
  # ---------------------------------------------------------------------------
55
55
 
56
+
56
57
  class MigrationStatus(str, Enum):
57
58
  """High-level migration subsystem status."""
58
59
 
@@ -66,6 +67,7 @@ class MigrationStatus(str, Enum):
66
67
  # Migration descriptor
67
68
  # ---------------------------------------------------------------------------
68
69
 
70
+
69
71
  @dataclass
70
72
  class MigrationInfo:
71
73
  """Metadata about a single versioned migration module.
@@ -94,6 +96,7 @@ class MigrationInfo:
94
96
  # MigrationRunner
95
97
  # ---------------------------------------------------------------------------
96
98
 
99
+
97
100
  class MigrationRunner:
98
101
  """Discovers, tracks and applies boneio system migrations.
99
102
 
@@ -145,8 +148,7 @@ class MigrationRunner:
145
148
 
146
149
  if not self._helper_installed():
147
150
  _LOGGER.warning(
148
- "boneio-migrate helper not found at %s. "
149
- "Bootstrap required — open WebUI to install.",
151
+ "boneio-migrate helper not found at %s. Bootstrap required — open WebUI to install.",
150
152
  HELPER_PATH,
151
153
  )
152
154
  self.bootstrap_required = True
@@ -195,13 +197,26 @@ class MigrationRunner:
195
197
  self._load_applied_flags()
196
198
  pending = self._get_pending()
197
199
 
200
+ # Build applied list with descriptions from discovered migrations
201
+ migration_by_version = {m.version: m for m in self._all_migrations}
202
+ applied_list = []
203
+ for version in sorted(self._applied):
204
+ migration = migration_by_version.get(version)
205
+ applied_list.append(
206
+ {
207
+ "version": version,
208
+ "description": migration.description if migration else "",
209
+ "module_name": migration.module_name if migration else "",
210
+ }
211
+ )
212
+
198
213
  return {
199
214
  "status": self.status.value,
200
215
  "bootstrap_required": self.bootstrap_required,
201
216
  "helper_installed": self._helper_installed(),
202
217
  "pending_count": len(pending),
203
218
  "pending": [{"version": m.version, "description": m.description} for m in pending],
204
- "applied": sorted(self._applied),
219
+ "applied": applied_list,
205
220
  "last_error": self.last_error,
206
221
  }
207
222
 
@@ -225,8 +240,11 @@ class MigrationRunner:
225
240
  return False, f"Bootstrap install script not found: {BOOTSTRAP_INSTALL_SCRIPT}"
226
241
 
227
242
  cmd = [
228
- "sudo", "-S", "-k",
229
- "bash", str(BOOTSTRAP_INSTALL_SCRIPT),
243
+ "sudo",
244
+ "-S",
245
+ "-k",
246
+ "bash",
247
+ str(BOOTSTRAP_INSTALL_SCRIPT),
230
248
  str(BOOTSTRAP_HELPER_SRC),
231
249
  str(BOOTSTRAP_SUDOERS_SRC),
232
250
  ]
@@ -295,7 +313,7 @@ class MigrationRunner:
295
313
 
296
314
  migrations: list[MigrationInfo] = []
297
315
 
298
- for finder, module_name, _ in pkgutil.iter_modules([str(versions_path)]):
316
+ for _, module_name, _ in pkgutil.iter_modules([str(versions_path)]):
299
317
  full_name = f"{VERSIONS_PKG}.{module_name}"
300
318
  try:
301
319
  mod = importlib.import_module(full_name)
@@ -307,12 +325,14 @@ class MigrationRunner:
307
325
  _LOGGER.warning("Migration module %s has no VERSION, skipping.", full_name)
308
326
  continue
309
327
 
310
- migrations.append(MigrationInfo(
311
- version=version,
312
- module_name=full_name,
313
- description=description,
314
- requires_root=requires_root,
315
- ))
328
+ migrations.append(
329
+ MigrationInfo(
330
+ version=version,
331
+ module_name=full_name,
332
+ description=description,
333
+ requires_root=requires_root,
334
+ )
335
+ )
316
336
  except Exception as exc:
317
337
  _LOGGER.error("Failed to import migration module %s: %s", full_name, exc)
318
338
 
@@ -0,0 +1,29 @@
1
+ """Remove legacy /etc/sudoers.d/boneio-can (CAN rules now in boneio sudoers).
2
+
3
+ The CAN interface NOPASSWD rules (/sbin/ip link set can0/can1) were
4
+ historically installed as a separate file ``/etc/sudoers.d/boneio-can``
5
+ by the old ``FixCanSudoers`` WebUI component.
6
+
7
+ Since v1.3.0 baseline, these rules live in ``/etc/sudoers.d/boneio``.
8
+ The separate file is therefore redundant and should be removed to avoid
9
+ duplicated sudoers entries.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from boneio.migrations.actions import MigrationAction, RemoveFile
15
+
16
+ VERSION = "1.3.2"
17
+ DESCRIPTION = "Remove legacy /etc/sudoers.d/boneio-can (CAN rules already in /etc/sudoers.d/boneio)"
18
+ REQUIRES_ROOT = True
19
+
20
+
21
+ def plan() -> list[MigrationAction]:
22
+ """Return the ordered list of migration actions.
23
+
24
+ Returns:
25
+ List of actions: removes the redundant CAN sudoers file.
26
+ """
27
+ return [
28
+ RemoveFile(path="/etc/sudoers.d/boneio-can"),
29
+ ]
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.3.1dev1"
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Dt as l,Ot as u,d,f,it as p,nt as m,rt as h,t as g}from"./useTranslation-BRR2hwZk.js";var _=e(s(),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 l({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}=g(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await u.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-nZQZSRZ7.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new o:new r}},i.config({monaco:n});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[g,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await u.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 u.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 u.put(`/api/files/${encodeURIComponent(r)}`,{content:o}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await u.get(`/schema/config.schema.json`)).data;C=await a(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)(d,{}):(0,b.jsx)(f,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(p,{}):(0,b.jsx)(h,{}):(0,b.jsx)(m,{})}),(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 u.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(l(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),l(!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:[g===`waiting`&&`Restarting Service...`,g===`checking`&&`Waiting for Service...`,g===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[g===`waiting`&&`Initiating service restart`,g===`checking`&&`Checking if service is back online`,g===`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:o,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 u.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-Dw2cE7zH.js";import{a as t,i as n,n as r,o as i,r as a,t as o,zt as s}from"./monaco-CAZoGZNF.js";import{b as c}from"./vendor-BD5Ml_Uz.js";import{Dt as l,Ot as u,d,f,it as p,nt as m,rt as h,t as g}from"./useTranslation-Dwuk-AFr.js";var _=e(s(),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 l({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}=g(),[r,i]=(0,_.useState)(!1),[a,o]=(0,_.useState)(null),s=async()=>{i(!0);try{let e=await u.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-nZQZSRZ7.js`,{name:e?.name})}self.MonacoEnvironment={getWorker(e,t){return t===`yaml`?new S:t===`json`?new o:new r}},i.config({monaco:n});var C;function w(){let[e,n]=(0,_.useState)([]),[r,i]=(0,_.useState)(null),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(!1),[g,S]=(0,_.useState)(`waiting`),[w,T]=(0,_.useState)(!0),[E,D]=(0,_.useState)(!1),O=v(),k=async()=>{try{n((await u.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 u.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 u.put(`/api/files/${encodeURIComponent(r)}`,{content:o}),console.log(`File saved successfully`)}catch(e){console.error(`Error saving file:`,e)}},M=async e=>{if(!C){let t=(await u.get(`/schema/config.schema.json`)).data;C=await a(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)(d,{}):(0,b.jsx)(f,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(p,{}):(0,b.jsx)(h,{}):(0,b.jsx)(m,{})}),(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 u.get(`/api/files`),!0}catch{return!1}},L=async()=>{for(l(!0),S(`waiting`),await new Promise(e=>setTimeout(e,2e3)),S(`checking`);;){if(await I()){S(`ready`),await new Promise(e=>setTimeout(e,1e3)),l(!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:[g===`waiting`&&`Restarting Service...`,g===`checking`&&`Waiting for Service...`,g===`ready`&&`Service Restarted!`]}),(0,b.jsxs)(`p`,{className:`text-base-content/70`,children:[g===`waiting`&&`Initiating service restart`,g===`checking`&&`Checking if service is back online`,g===`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:o,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 u.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};