boneio 1.4.0.dev12__tar.gz → 1.4.0.dev13__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 (452) hide show
  1. {boneio-1.4.0.dev12/boneio.egg-info → boneio-1.4.0.dev13}/PKG-INFO +1 -1
  2. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/irrigation/controller.py +117 -24
  3. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/irrigation.py +8 -0
  4. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/integration/homeassistant.py +4 -0
  5. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/hvac/eht-topventil-plus.json +71 -3
  6. boneio-1.4.0.dev13/boneio/version.py +2 -0
  7. boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/ConfigEditor-Cs0wqNzh.js → boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +1 -1
  8. boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/index-DvzU3Ztp.js → boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/index-CEComJE_.js +3 -3
  9. boneio-1.4.0.dev12/boneio/webui/frontend-dist/assets/useTranslation-BbOWxWUU.js → boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +2 -2
  10. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/index.html +2 -2
  11. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/sw.js +1 -1
  12. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/irrigation.py +3 -1
  13. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13/boneio.egg-info}/PKG-INFO +1 -1
  14. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio.egg-info/SOURCES.txt +3 -3
  15. boneio-1.4.0.dev12/boneio/version.py +0 -2
  16. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/LICENSE +0 -0
  17. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/MANIFEST.in +0 -0
  18. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/README.md +0 -0
  19. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/__init__.py +0 -0
  20. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/input.yaml +0 -0
  21. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_24_16.yaml +0 -0
  22. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_32_10.yaml +0 -0
  23. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_32_5.yaml +0 -0
  24. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_cover.yaml +0 -0
  25. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  26. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/input.yaml +0 -0
  27. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_24_16.yaml +0 -0
  28. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_32_10.yaml +0 -0
  29. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_32_5.yaml +0 -0
  30. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_cover.yaml +0 -0
  31. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  32. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/input.yaml +0 -0
  33. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_24_16.yaml +0 -0
  34. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_32_10.yaml +0 -0
  35. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_32_5.yaml +0 -0
  36. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_cover.yaml +0 -0
  37. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  38. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.5/input.yaml +0 -0
  39. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_24_16.yaml +0 -0
  40. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_32_10.yaml +0 -0
  41. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_cover.yaml +0 -0
  42. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  43. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.6/input.yaml +0 -0
  44. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_24_16.yaml +0 -0
  45. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_32_10.yaml +0 -0
  46. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_cover.yaml +0 -0
  47. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  48. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/input.yaml +0 -0
  49. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_24_16.yaml +0 -0
  50. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_32_10.yaml +0 -0
  51. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_48_4.yaml +0 -0
  52. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_cover.yaml +0 -0
  53. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  54. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/input.yaml +0 -0
  55. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_24_16.yaml +0 -0
  56. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_32_10.yaml +0 -0
  57. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_48_4.yaml +0 -0
  58. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_cover.yaml +0 -0
  59. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  60. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/bonecli.py +0 -0
  61. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/__init__.py +0 -0
  62. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/cover/__init__.py +0 -0
  63. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/cover/cover.py +0 -0
  64. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/cover/time_based.py +0 -0
  65. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/cover/venetian.py +0 -0
  66. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/group/__init__.py +0 -0
  67. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/group/output_group.py +0 -0
  68. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/__init__.py +0 -0
  69. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/binary_sensor.py +0 -0
  70. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/detectors.py +0 -0
  71. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/event.py +0 -0
  72. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/remote/__init__.py +0 -0
  73. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/remote/base.py +0 -0
  74. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/input/remote/esphome.py +0 -0
  75. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/irrigation/__init__.py +0 -0
  76. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/irrigation/water_source.py +0 -0
  77. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/__init__.py +0 -0
  78. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/basic.py +0 -0
  79. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/mcp.py +0 -0
  80. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/pca.py +0 -0
  81. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/pcf.py +0 -0
  82. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/output/remote.py +0 -0
  83. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/sensor/__init__.py +0 -0
  84. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/sensor/virtual_energy.py +0 -0
  85. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/template/__init__.py +0 -0
  86. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/template/alarm_panel.py +0 -0
  87. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/template/gate_cover.py +0 -0
  88. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/components/template/thermostat.py +0 -0
  89. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/const.py +0 -0
  90. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/__init__.py +0 -0
  91. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/__init__.py +0 -0
  92. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/data/__init__.py +0 -0
  93. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  94. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  95. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  96. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/registration.py +0 -0
  97. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/cloud/secrets.py +0 -0
  98. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/__init__.py +0 -0
  99. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/config_helper.py +0 -0
  100. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/migrations/__init__.py +0 -0
  101. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  102. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/migrations/v2_transition.py +0 -0
  103. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/package-lock.json +0 -0
  104. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/package.json +0 -0
  105. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/schema_converter.py +0 -0
  106. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/config/yaml_util.py +0 -0
  107. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/discovery.py +0 -0
  108. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/events/__init__.py +0 -0
  109. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/events/bus.py +0 -0
  110. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/__init__.py +0 -0
  111. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/action_conditions.py +0 -0
  112. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/canopen.py +0 -0
  113. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/covers.py +0 -0
  114. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/display.py +0 -0
  115. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/inputs.py +0 -0
  116. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/manager.py +0 -0
  117. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/modbus.py +0 -0
  118. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/outputs.py +0 -0
  119. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/remote.py +0 -0
  120. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/remote_input_registrar.py +0 -0
  121. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/sensors.py +0 -0
  122. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/templates/__init__.py +0 -0
  123. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/templates/alarm.py +0 -0
  124. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/templates/gate_cover.py +0 -0
  125. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/templates/thermostat.py +0 -0
  126. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/templates.py +0 -0
  127. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/manager/update.py +0 -0
  128. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/__init__.py +0 -0
  129. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/basic.py +0 -0
  130. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/basic_mqtt.py +0 -0
  131. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/composite.py +0 -0
  132. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/local.py +0 -0
  133. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/lox.py +0 -0
  134. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/mqtt.py +0 -0
  135. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/messaging/queue.py +0 -0
  136. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/__init__.py +0 -0
  137. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/base.py +0 -0
  138. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/can.py +0 -0
  139. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/esphome.py +0 -0
  140. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/mqtt.py +0 -0
  141. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/remote/wled.py +0 -0
  142. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/sensor/__init__.py +0 -0
  143. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/sensor/base.py +0 -0
  144. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/sensor/system.py +0 -0
  145. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/state/__init__.py +0 -0
  146. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/state/manager.py +0 -0
  147. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/system/__init__.py +0 -0
  148. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/system/host_data.py +0 -0
  149. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/system/monitor.py +0 -0
  150. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/__init__.py +0 -0
  151. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/async_updater.py +0 -0
  152. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/conditions.py +0 -0
  153. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/filter.py +0 -0
  154. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/font_util.py +0 -0
  155. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/logger.py +0 -0
  156. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/timeperiod.py +0 -0
  157. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/core/utils/util.py +0 -0
  158. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/adc.yaml +0 -0
  159. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  160. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/config.yaml +0 -0
  161. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/event.yaml +0 -0
  162. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/mqtt.yaml +0 -0
  163. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  164. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/adc.yaml +0 -0
  165. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  166. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/config.yaml +0 -0
  167. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/event.yaml +0 -0
  168. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/mqtt.yaml +0 -0
  169. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  170. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/adc.yaml +0 -0
  171. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  172. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/config.yaml +0 -0
  173. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/event.yaml +0 -0
  174. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/mqtt.yaml +0 -0
  175. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  176. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/__init__.py +0 -0
  177. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/can_master.yaml +0 -0
  178. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/can_slave.yaml +0 -0
  179. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/adc.yaml +0 -0
  180. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  181. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/config.yaml +0 -0
  182. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/cover.yaml +0 -0
  183. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/event.yaml +0 -0
  184. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/mqtt.yaml +0 -0
  185. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover/outputCover.yaml +0 -0
  186. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/adc.yaml +0 -0
  187. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  188. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/config.yaml +0 -0
  189. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/cover.yaml +0 -0
  190. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/event.yaml +0 -0
  191. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  192. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  193. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/adc.yaml +0 -0
  194. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  195. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  196. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  197. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  198. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/event_all.yaml +0 -0
  199. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  200. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  201. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  202. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  203. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  204. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  205. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/exceptions.py +0 -0
  206. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/__init__.py +0 -0
  207. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/analog/__init__.py +0 -0
  208. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/analog/adc.py +0 -0
  209. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/__init__.py +0 -0
  210. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/bridge.py +0 -0
  211. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/client.py +0 -0
  212. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/interface.py +0 -0
  213. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/node.py +0 -0
  214. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/node_id.py +0 -0
  215. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/can/test_od.py +0 -0
  216. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/display/__init__.py +0 -0
  217. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/display/early_oled.py +0 -0
  218. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  219. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/display/oled.py +0 -0
  220. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/__init__.py +0 -0
  221. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  222. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  223. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  224. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  225. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/__init__.py +0 -0
  226. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/base.py +0 -0
  227. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/manager.py +0 -0
  228. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/__init__.py +0 -0
  229. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/bus.py +0 -0
  230. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/ina219.py +0 -0
  231. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/ina219_driver.py +0 -0
  232. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/mcp9808.py +0 -0
  233. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/i2c/pct2075.py +0 -0
  234. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/onewire/__init__.py +0 -0
  235. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/onewire/bus.py +0 -0
  236. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/onewire/dallas.py +0 -0
  237. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/onewire/ds2482.py +0 -0
  238. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/sensor/__init__.py +0 -0
  239. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  240. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/base.py +0 -0
  241. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  242. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  243. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/integration/__init__.py +0 -0
  244. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/integration/interlock.py +0 -0
  245. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/integration/lox_template.py +0 -0
  246. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/__init__.py +0 -0
  247. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/actions.py +0 -0
  248. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  249. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/daemon.json +0 -0
  250. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  251. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  252. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  253. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/journald/journald.conf +0 -0
  254. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  255. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/sudoers/boneio +0 -0
  256. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  257. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/boneio.service +0 -0
  258. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  259. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  260. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  261. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  262. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  263. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  264. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  265. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  266. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  267. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/runner.py +0 -0
  268. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/versions/__init__.py +0 -0
  269. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  270. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  271. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  272. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  273. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/__init__.py +0 -0
  274. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/cli.py +0 -0
  275. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/client.py +0 -0
  276. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/coordinator.py +0 -0
  277. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/__init__.py +0 -0
  278. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  279. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  280. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  281. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  282. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  283. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  284. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  285. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  286. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  287. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/inverters/sofar.json +0 -0
  288. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/inverters/thessla.json +0 -0
  289. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  290. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  291. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  292. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/wanas415.json +0 -0
  293. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  294. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/cwt.json +0 -0
  295. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  296. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  297. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  298. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  299. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  300. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/pt100.json +0 -0
  301. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/sht20.json +0 -0
  302. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/sht30.json +0 -0
  303. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/__init__.py +0 -0
  304. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/base.py +0 -0
  305. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/__init__.py +0 -0
  306. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/numeric.py +0 -0
  307. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/select.py +0 -0
  308. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/switch.py +0 -0
  309. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/text.py +0 -0
  310. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/__init__.py +0 -0
  311. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/binary.py +0 -0
  312. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/numeric.py +0 -0
  313. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/text.py +0 -0
  314. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/__init__.py +0 -0
  315. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/binary.py +0 -0
  316. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/numeric.py +0 -0
  317. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/modbus/utils.py +0 -0
  318. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/__init__.py +0 -0
  319. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/actions.py +0 -0
  320. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/events.py +0 -0
  321. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/files.py +0 -0
  322. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/logs.py +0 -0
  323. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/mqtt.py +0 -0
  324. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/models/state.py +0 -0
  325. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/runner.py +0 -0
  326. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/actions.yaml +0 -0
  327. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/actions_sensor.yaml +0 -0
  328. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/actions_switch.yaml +0 -0
  329. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/condition.yaml +0 -0
  330. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/filters.yaml +0 -0
  331. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/filters_adc.yaml +0 -0
  332. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/id.yaml +0 -0
  333. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/remote_devices.yaml +0 -0
  334. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/remote_inputs.yaml +0 -0
  335. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/remote_outputs.yaml +0 -0
  336. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/schema.yaml +0 -0
  337. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/temp_unit.yaml +0 -0
  338. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/schema/update_interval.yaml +0 -0
  339. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/action_validation.py +0 -0
  340. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/app.py +0 -0
  341. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/dashboard_cards.py +0 -0
  342. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  343. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  344. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  345. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  346. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css +0 -0
  347. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  348. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  349. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  350. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  351. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  352. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  353. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  354. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  355. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  356. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio.svg +0 -0
  357. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  358. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  359. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  360. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  361. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  362. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  363. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  364. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  365. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  366. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  367. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  368. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  369. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  370. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  371. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  372. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  373. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  374. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  375. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  376. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  377. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  378. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  379. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  380. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  381. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  382. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  383. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  384. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  385. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  386. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  387. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  388. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  389. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  390. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  391. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/middleware/__init__.py +0 -0
  392. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/middleware/auth.py +0 -0
  393. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/__init__.py +0 -0
  394. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/auth.py +0 -0
  395. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/caddy.py +0 -0
  396. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/can.py +0 -0
  397. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/config.py +0 -0
  398. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/covers.py +0 -0
  399. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/migrations.py +0 -0
  400. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/modbus.py +0 -0
  401. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/outputs.py +0 -0
  402. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/remote_devices.py +0 -0
  403. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/sensors.py +0 -0
  404. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/system.py +0 -0
  405. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/templates.py +0 -0
  406. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/timezone_sudoers.py +0 -0
  407. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/tools.py +0 -0
  408. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/routes/update.py +0 -0
  409. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/adc.schema.json +0 -0
  410. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/areas.schema.json +0 -0
  411. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  412. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/boneio.schema.json +0 -0
  413. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/can.schema.json +0 -0
  414. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/config.schema.json +0 -0
  415. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/cover.schema.json +0 -0
  416. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/dallas.schema.json +0 -0
  417. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/ds2482.schema.json +0 -0
  418. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/event.schema.json +0 -0
  419. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/ina219.schema.json +0 -0
  420. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/irrigation.schema.json +0 -0
  421. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/lm75.schema.json +0 -0
  422. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/logger.schema.json +0 -0
  423. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/lox_udp.schema.json +0 -0
  424. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/mcp23017.schema.json +0 -0
  425. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/mcp9808.schema.json +0 -0
  426. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/modbus.schema.json +0 -0
  427. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  428. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/mqtt.schema.json +0 -0
  429. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/oled.schema.json +0 -0
  430. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/output.schema.json +0 -0
  431. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/output_group.schema.json +0 -0
  432. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/pca9685.schema.json +0 -0
  433. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/pcf8575.schema.json +0 -0
  434. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_devices.schema.json +0 -0
  435. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  436. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  437. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/sensor.schema.json +0 -0
  438. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/template.schema.json +0 -0
  439. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  440. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/schema/web.schema.json +0 -0
  441. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/services/__init__.py +0 -0
  442. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/services/logs.py +0 -0
  443. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/web_server.py +0 -0
  444. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio/webui/websocket_manager.py +0 -0
  445. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio.egg-info/dependency_links.txt +0 -0
  446. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio.egg-info/entry_points.txt +0 -0
  447. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio.egg-info/requires.txt +0 -0
  448. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/boneio.egg-info/top_level.txt +0 -0
  449. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/pyproject.toml +0 -0
  450. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/setup.cfg +0 -0
  451. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/setup.py +0 -0
  452. {boneio-1.4.0.dev12 → boneio-1.4.0.dev13}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.4.0.dev12
3
+ Version: 1.4.0.dev13
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
@@ -262,43 +262,62 @@ class IrrigationController:
262
262
  def _eligible_zones(self) -> list[tuple[int, IrrigationZone]]:
263
263
  """Determine which zones are eligible to run in this cycle.
264
264
 
265
+ This is a **pure** function — it does NOT modify skip counters.
266
+ Use :meth:`_apply_skip_counters` once at the start of a scheduled
267
+ cycle to advance counters.
268
+
265
269
  Uses a counter-based system: each zone has a skip counter that
266
270
  increments every scheduled cycle. When the counter reaches
267
271
  run_every_n - 1, the zone is eligible and the counter resets.
268
- Manual starts do not affect the counter.
269
272
  """
270
273
  eligible: list[tuple[int, IrrigationZone]] = []
271
274
  for idx, zone in self._ordered_zones():
272
275
  if not zone.enabled:
273
- _LOGGER.debug("Irrigation %s: zone %s skipped (disabled)", self.id, zone.id)
274
276
  continue
275
277
  if zone.run_every_n <= 1:
276
- # run_every_n=1 means run every time
277
278
  eligible.append((idx, zone))
278
279
  continue
279
280
  counter_key = f"zone/{zone.id}/skip_count"
280
281
  skip_count = int(self._get(counter_key, 0))
281
282
  if skip_count >= zone.run_every_n - 1:
283
+ eligible.append((idx, zone))
284
+ return eligible
285
+
286
+ def _apply_skip_counters(self) -> None:
287
+ """Advance skip counters for all zones at the start of a scheduled cycle.
288
+
289
+ For each enabled zone with ``run_every_n > 1``:
290
+ - If the zone IS eligible (skip_count >= run_every_n - 1),
291
+ reset counter to 0 (zone will run this cycle).
292
+ - If the zone is NOT eligible, increment the counter.
293
+
294
+ Must be called **exactly once** per scheduled cycle, before
295
+ ``_eligible_zones()`` is used to build the run list.
296
+ """
297
+ for _idx, zone in self._ordered_zones():
298
+ if not zone.enabled or zone.run_every_n <= 1:
299
+ continue
300
+ counter_key = f"zone/{zone.id}/skip_count"
301
+ skip_count = int(self._get(counter_key, 0))
302
+ if skip_count >= zone.run_every_n - 1:
303
+ # Zone is eligible — reset counter
304
+ self._save(counter_key, 0)
282
305
  _LOGGER.debug(
283
- "Irrigation %s: zone %s eligible (skip_count=%d >= %d)",
306
+ "Irrigation %s: zone %s counter reset (was %d, eligible)",
284
307
  self.id,
285
308
  zone.id,
286
309
  skip_count,
287
- zone.run_every_n - 1,
288
310
  )
289
- eligible.append((idx, zone))
290
- # Reset counter — will be saved when zone finishes in _advance_to_next_zone
291
311
  else:
292
312
  skip_count += 1
293
313
  self._save(counter_key, skip_count)
294
314
  _LOGGER.debug(
295
- "Irrigation %s: zone %s NOT eligible (skip_count=%d < %d)",
315
+ "Irrigation %s: zone %s counter incremented to %d/%d",
296
316
  self.id,
297
317
  zone.id,
298
318
  skip_count,
299
319
  zone.run_every_n - 1,
300
320
  )
301
- return eligible
302
321
 
303
322
  async def publish_all_states(self) -> None:
304
323
  controller_state = ON if self._state in (ControllerState.RUNNING, ControllerState.PAUSED) else OFF
@@ -346,7 +365,23 @@ class IrrigationController:
346
365
  active,
347
366
  self._active_zone_idx,
348
367
  )
349
- self._publish(self._zone_state_topic(zone.id), {"state": active})
368
+ zone_payload: dict[str, Any] = {"state": active}
369
+ # Add next_run attributes for zones with run_every_n > 1
370
+ if zone.run_every_n > 1:
371
+ zone_next_dt = self._compute_zone_next_run_time(zone)
372
+ counter_key = f"zone/{zone.id}/skip_count"
373
+ skip_count = int(self._get(counter_key, 0))
374
+ zone_payload["run_every_n"] = zone.run_every_n
375
+ zone_payload["skip_count"] = skip_count
376
+ if zone_next_dt is not None:
377
+ local_tz = _local_now().tzinfo
378
+ next_local = zone_next_dt.astimezone(local_tz)
379
+ zone_payload["next_run_iso"] = zone_next_dt.isoformat()
380
+ zone_payload["next_run_pretty"] = next_local.strftime("%d %b %Y, %H:%M")
381
+ else:
382
+ zone_payload["next_run_iso"] = ""
383
+ zone_payload["next_run_pretty"] = ""
384
+ self._publish(self._zone_state_topic(zone.id), zone_payload)
350
385
  self._publish(
351
386
  self._setting_state_topic(f"zone/{zone.id}/enabled"),
352
387
  {"state": ON if zone.enabled else OFF},
@@ -464,7 +499,7 @@ class IrrigationController:
464
499
  _LOGGER.info("Irrigation %s skipped one full cycle", self.id)
465
500
  return
466
501
 
467
- await self._start_cycle_from_eligible()
502
+ await self._start_cycle_from_eligible(scheduled=True)
468
503
 
469
504
  async def start_single_zone(self, zone_id: str) -> None:
470
505
  _LOGGER.debug(
@@ -502,8 +537,17 @@ class IrrigationController:
502
537
  _LOGGER.debug("Irrigation %s calling _start_zone(%d) for zone '%s'", self.id, match_idx, zone_id)
503
538
  await self._start_zone(match_idx)
504
539
 
505
- async def _start_cycle_from_eligible(self) -> None:
540
+ async def _start_cycle_from_eligible(self, scheduled: bool = False) -> None:
541
+ """Build the eligible zone list and start the first zone.
542
+
543
+ When ``scheduled`` is True (i.e. triggered by the daily schedule,
544
+ not a repeat), skip counters are advanced **after** reading
545
+ eligibility so that the current counter values decide this cycle
546
+ and the increments prepare counters for the next one.
547
+ """
506
548
  eligible = self._eligible_zones()
549
+ if scheduled:
550
+ self._apply_skip_counters()
507
551
  _LOGGER.debug(
508
552
  "Irrigation %s _start_cycle_from_eligible: %d eligible zones: %s",
509
553
  self.id,
@@ -535,9 +579,6 @@ class IrrigationController:
535
579
 
536
580
  finished_idx = self._active_zone_idx
537
581
  finished_zone = self._zones[finished_idx]
538
- # Reset skip counter for scheduled runs only (manual starts don't affect counters)
539
- if not self._single_zone_mode:
540
- self._save(f"zone/{finished_zone.id}/skip_count", 0)
541
582
 
542
583
  if self._single_zone_mode:
543
584
  _LOGGER.debug("Irrigation %s: single zone mode complete for zone '%s'", self.id, finished_zone.id)
@@ -1032,6 +1073,46 @@ class IrrigationController:
1032
1073
  earliest = candidate
1033
1074
  return earliest
1034
1075
 
1076
+ def _compute_zone_next_run_time(self, zone: IrrigationZone) -> datetime | None:
1077
+ """Compute when a specific zone will actually run next.
1078
+
1079
+ Accounts for ``run_every_n``: if the zone needs 2 more skipped
1080
+ cycles before it's eligible, this returns the fire time of the
1081
+ (skip_remaining + 1)th upcoming schedule.
1082
+
1083
+ Args:
1084
+ zone: The irrigation zone to compute for.
1085
+
1086
+ Returns:
1087
+ Timezone-aware UTC datetime of the zone's next actual run,
1088
+ or None if no schedules are configured or the controller
1089
+ is in standby or the zone is disabled.
1090
+ """
1091
+ if not self._schedule or self._standby or not zone.enabled:
1092
+ return None
1093
+
1094
+ if zone.run_every_n <= 1:
1095
+ # Runs every cycle — same as controller next_run_time
1096
+ return self._compute_next_run_time()
1097
+
1098
+ counter_key = f"zone/{zone.id}/skip_count"
1099
+ skip_count = int(self._get(counter_key, 0))
1100
+ remaining_skips = max(0, (zone.run_every_n - 1) - skip_count)
1101
+
1102
+ # The zone will run on the (remaining_skips + 1)th cycle
1103
+ cycles_until_run = remaining_skips + 1
1104
+
1105
+ # Find the Nth fire time across all schedules
1106
+ # Strategy: collect fire times from all schedules, sort, pick Nth
1107
+ earliest: datetime | None = None
1108
+ for schedule in self._schedule:
1109
+ time_str = schedule.get("time", "06:00")
1110
+ days = str(schedule.get("days", "daily")).strip().lower()
1111
+ candidate = _nth_fire_time(time_str, days, n=cycles_until_run)
1112
+ if earliest is None or candidate < earliest:
1113
+ earliest = candidate
1114
+ return earliest
1115
+
1035
1116
  def start_schedules(self) -> None:
1036
1117
  self.stop_schedules()
1037
1118
  for idx, schedule in enumerate(self._schedule):
@@ -1071,17 +1152,25 @@ def _local_now() -> datetime:
1071
1152
  def _next_fire_time(time_str: str, days: str) -> datetime:
1072
1153
  """Compute next fire time for a schedule entry.
1073
1154
 
1155
+ Shorthand for ``_nth_fire_time(time_str, days, n=1)``.
1156
+ """
1157
+ return _nth_fire_time(time_str, days, n=1)
1158
+
1159
+
1160
+ def _nth_fire_time(time_str: str, days: str, n: int = 1) -> datetime:
1161
+ """Compute the Nth upcoming fire time for a schedule entry.
1162
+
1074
1163
  The user-configured ``time_str`` (e.g. "18:00") is in **local time**.
1075
- We build the candidate in the system's local timezone and then convert
1076
- to UTC so that comparisons with ``utcnow()`` and HA's
1077
- ``device_class: timestamp`` work correctly.
1164
+ We build candidates in the system's local timezone and then convert
1165
+ to UTC.
1078
1166
 
1079
1167
  Args:
1080
1168
  time_str: Schedule time in "HH:MM" format (local time).
1081
- days: Day filter string ("daily", "weekdays", "weekends", "mon,wed,fri", etc.).
1169
+ days: Day filter string ("daily", "weekdays", "weekends", etc.).
1170
+ n: Which occurrence to return (1 = next, 2 = the one after, etc.).
1082
1171
 
1083
1172
  Returns:
1084
- Next fire time as a timezone-aware UTC datetime.
1173
+ Nth fire time as a timezone-aware UTC datetime.
1085
1174
  """
1086
1175
  now_local = _local_now()
1087
1176
 
@@ -1093,8 +1182,9 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
1093
1182
  target_h, target_m = 6, 0
1094
1183
 
1095
1184
  allowed_days = _DAYS_MAP.get(days, _DAYS_MAP["daily"])
1185
+ found = 0
1096
1186
 
1097
- for plus_days in range(0, 8):
1187
+ for plus_days in range(0, 366):
1098
1188
  candidate_local = (now_local + timedelta(days=plus_days)).replace(
1099
1189
  hour=target_h,
1100
1190
  minute=target_m,
@@ -1102,10 +1192,12 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
1102
1192
  microsecond=0,
1103
1193
  )
1104
1194
  if candidate_local.weekday() in allowed_days and candidate_local > now_local:
1105
- # Convert to UTC for consistent comparison with utcnow()
1106
- return candidate_local.astimezone(dt.UTC)
1195
+ found += 1
1196
+ if found >= n:
1197
+ return candidate_local.astimezone(dt.UTC)
1107
1198
 
1108
- fallback_local = (now_local + timedelta(days=1)).replace(
1199
+ # Fallback (should never reach for n <= 365)
1200
+ fallback_local = (now_local + timedelta(days=n)).replace(
1109
1201
  hour=target_h,
1110
1202
  minute=target_m,
1111
1203
  second=0,
@@ -1113,3 +1205,4 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
1113
1205
  )
1114
1206
  return fallback_local.astimezone(dt.UTC)
1115
1207
 
1208
+
@@ -581,6 +581,14 @@ class IrrigationManager:
581
581
  ),
582
582
  )
583
583
 
584
+ # Remove stale per-zone next_run sensor (migrated to valve attributes)
585
+ if zone.run_every_n > 1:
586
+ self._manager.publish_ha_discovery(
587
+ id=f"{ctrl.id}_zone_{zone.id}_next_run",
588
+ ha_type="sensor",
589
+ payload="",
590
+ )
591
+
584
592
  for idx, _schedule in enumerate(ctrl._schedule):
585
593
  _pub(
586
594
  id=f"{ctrl.id}_schedule_{idx}_skip",
@@ -439,6 +439,10 @@ def ha_irrigation_valve_message(
439
439
  msg["state_topic"] = f"{topic}/{IRRIGATION}/{ctrl_id}/{suffix}"
440
440
  msg["command_topic"] = f"{topic}/cmd/{IRRIGATION}/{ctrl_id}/{suffix}/set"
441
441
  msg["value_template"] = "{{ value_json.state }}"
442
+ msg["json_attributes_topic"] = f"{topic}/{IRRIGATION}/{ctrl_id}/{suffix}"
443
+ msg["json_attributes_template"] = (
444
+ "{{ value_json | tojson }}"
445
+ )
442
446
  msg["icon"] = "mdi:sprinkler-variant"
443
447
  return msg
444
448
 
@@ -105,8 +105,10 @@
105
105
  "name": "Filter reset command",
106
106
  "address": 24,
107
107
  "write_address": 24,
108
- "entity_type": "writeable_sensor_discrete",
109
- "value_type": "S_WORD"
108
+ "entity_type": "writeable_binary_sensor_discrete",
109
+ "value_type": "S_WORD",
110
+ "payload_on": "1",
111
+ "payload_off": "0"
110
112
  }
111
113
  ]
112
114
  },
@@ -182,7 +184,7 @@
182
184
  {
183
185
  "name": "Operating mode",
184
186
  "source": "operating_mode_number",
185
- "entity_type": "select",
187
+ "entity_type": "text_sensor",
186
188
  "x_mapping": {
187
189
  "0": "Off",
188
190
  "1": "Ventilation",
@@ -213,6 +215,72 @@
213
215
  "1": "Summer"
214
216
  }
215
217
  },
218
+ {
219
+ "name": "Ventilation switch",
220
+ "source": "ventilation",
221
+ "entity_type": "switch",
222
+ "x_mapping": {
223
+ "0": "OFF",
224
+ "1": "ON"
225
+ },
226
+ "payload_off": "OFF",
227
+ "payload_on": "ON"
228
+ },
229
+ {
230
+ "name": "Dehumidification switch",
231
+ "source": "dehumidifier",
232
+ "entity_type": "switch",
233
+ "x_mapping": {
234
+ "0": "OFF",
235
+ "1": "ON"
236
+ },
237
+ "payload_off": "OFF",
238
+ "payload_on": "ON"
239
+ },
240
+ {
241
+ "name": "Integration switch",
242
+ "source": "integration",
243
+ "entity_type": "switch",
244
+ "x_mapping": {
245
+ "0": "OFF",
246
+ "1": "ON"
247
+ },
248
+ "payload_off": "OFF",
249
+ "payload_on": "ON"
250
+ },
251
+ {
252
+ "name": "Recirculation switch",
253
+ "source": "recirculation",
254
+ "entity_type": "switch",
255
+ "x_mapping": {
256
+ "0": "OFF",
257
+ "1": "ON"
258
+ },
259
+ "payload_off": "OFF",
260
+ "payload_on": "ON"
261
+ },
262
+ {
263
+ "name": "Fan speed control",
264
+ "source": "fan_speed",
265
+ "entity_type": "select",
266
+ "x_mapping": {
267
+ "0": "Off",
268
+ "1": "Low",
269
+ "2": "Medium",
270
+ "3": "High"
271
+ }
272
+ },
273
+ {
274
+ "name": "Filter reset",
275
+ "source": "filter_reset_command",
276
+ "entity_type": "switch",
277
+ "x_mapping": {
278
+ "0": "OFF",
279
+ "1": "RESET"
280
+ },
281
+ "payload_off": "OFF",
282
+ "payload_on": "RESET"
283
+ },
216
284
  {
217
285
  "name": "Alarm code",
218
286
  "source": "alarm_code_number",
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.4.0dev13"
@@ -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{Mt as l,Nt as u,at as d,f,ot as p,p as m,st as h,t as g}from"./useTranslation-BbOWxWUU.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)(f,{}):(0,b.jsx)(m,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(h,{}):(0,b.jsx)(p,{}):(0,b.jsx)(d,{})}),(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{Mt as l,Nt as u,at as d,f,ot as p,p as m,st as h,t as g}from"./useTranslation-DUpbl8sU.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)(f,{}):(0,b.jsx)(m,{})}),(0,b.jsx)(`span`,{className:`text-base-content/70`,children:e.type===`directory`?n?(0,b.jsx)(h,{}):(0,b.jsx)(p,{}):(0,b.jsx)(d,{})}),(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};