boneio 1.4.0.dev11__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.dev11/boneio.egg-info → boneio-1.4.0.dev13}/PKG-INFO +1 -1
  2. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/irrigation/controller.py +141 -21
  3. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/irrigation.py +8 -0
  4. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/integration/homeassistant.py +4 -0
  5. {boneio-1.4.0.dev11 → 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.dev11/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.dev11/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.dev11/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.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/index.html +2 -2
  11. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/sw.js +1 -1
  12. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/irrigation.py +3 -1
  13. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13/boneio.egg-info}/PKG-INFO +1 -1
  14. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio.egg-info/SOURCES.txt +3 -3
  15. boneio-1.4.0.dev11/boneio/version.py +0 -2
  16. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/LICENSE +0 -0
  17. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/MANIFEST.in +0 -0
  18. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/README.md +0 -0
  19. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/__init__.py +0 -0
  20. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/input.yaml +0 -0
  21. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_24_16.yaml +0 -0
  22. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_32_10.yaml +0 -0
  23. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_32_5.yaml +0 -0
  24. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_cover.yaml +0 -0
  25. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  26. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/input.yaml +0 -0
  27. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_24_16.yaml +0 -0
  28. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_32_10.yaml +0 -0
  29. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_32_5.yaml +0 -0
  30. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_cover.yaml +0 -0
  31. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  32. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/input.yaml +0 -0
  33. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_24_16.yaml +0 -0
  34. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_32_10.yaml +0 -0
  35. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_32_5.yaml +0 -0
  36. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_cover.yaml +0 -0
  37. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  38. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.5/input.yaml +0 -0
  39. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_24_16.yaml +0 -0
  40. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_32_10.yaml +0 -0
  41. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_cover.yaml +0 -0
  42. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  43. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.6/input.yaml +0 -0
  44. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_24_16.yaml +0 -0
  45. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_32_10.yaml +0 -0
  46. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_cover.yaml +0 -0
  47. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  48. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/input.yaml +0 -0
  49. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_24_16.yaml +0 -0
  50. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_32_10.yaml +0 -0
  51. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_48_4.yaml +0 -0
  52. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_cover.yaml +0 -0
  53. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  54. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/input.yaml +0 -0
  55. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_24_16.yaml +0 -0
  56. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_32_10.yaml +0 -0
  57. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_48_4.yaml +0 -0
  58. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_cover.yaml +0 -0
  59. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  60. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/bonecli.py +0 -0
  61. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/__init__.py +0 -0
  62. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/cover/__init__.py +0 -0
  63. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/cover/cover.py +0 -0
  64. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/cover/time_based.py +0 -0
  65. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/cover/venetian.py +0 -0
  66. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/group/__init__.py +0 -0
  67. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/group/output_group.py +0 -0
  68. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/__init__.py +0 -0
  69. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/binary_sensor.py +0 -0
  70. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/detectors.py +0 -0
  71. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/event.py +0 -0
  72. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/remote/__init__.py +0 -0
  73. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/remote/base.py +0 -0
  74. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/input/remote/esphome.py +0 -0
  75. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/irrigation/__init__.py +0 -0
  76. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/irrigation/water_source.py +0 -0
  77. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/__init__.py +0 -0
  78. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/basic.py +0 -0
  79. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/mcp.py +0 -0
  80. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/pca.py +0 -0
  81. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/pcf.py +0 -0
  82. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/output/remote.py +0 -0
  83. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/sensor/__init__.py +0 -0
  84. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/sensor/virtual_energy.py +0 -0
  85. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/template/__init__.py +0 -0
  86. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/template/alarm_panel.py +0 -0
  87. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/template/gate_cover.py +0 -0
  88. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/components/template/thermostat.py +0 -0
  89. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/const.py +0 -0
  90. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/__init__.py +0 -0
  91. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/__init__.py +0 -0
  92. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/data/__init__.py +0 -0
  93. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  94. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  95. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  96. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/registration.py +0 -0
  97. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/cloud/secrets.py +0 -0
  98. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/__init__.py +0 -0
  99. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/config_helper.py +0 -0
  100. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/migrations/__init__.py +0 -0
  101. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  102. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/migrations/v2_transition.py +0 -0
  103. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/package-lock.json +0 -0
  104. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/package.json +0 -0
  105. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/schema_converter.py +0 -0
  106. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/config/yaml_util.py +0 -0
  107. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/discovery.py +0 -0
  108. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/events/__init__.py +0 -0
  109. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/events/bus.py +0 -0
  110. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/__init__.py +0 -0
  111. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/action_conditions.py +0 -0
  112. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/canopen.py +0 -0
  113. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/covers.py +0 -0
  114. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/display.py +0 -0
  115. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/inputs.py +0 -0
  116. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/manager.py +0 -0
  117. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/modbus.py +0 -0
  118. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/outputs.py +0 -0
  119. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/remote.py +0 -0
  120. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/remote_input_registrar.py +0 -0
  121. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/sensors.py +0 -0
  122. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/templates/__init__.py +0 -0
  123. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/templates/alarm.py +0 -0
  124. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/templates/gate_cover.py +0 -0
  125. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/templates/thermostat.py +0 -0
  126. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/templates.py +0 -0
  127. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/manager/update.py +0 -0
  128. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/__init__.py +0 -0
  129. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/basic.py +0 -0
  130. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/basic_mqtt.py +0 -0
  131. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/composite.py +0 -0
  132. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/local.py +0 -0
  133. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/lox.py +0 -0
  134. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/mqtt.py +0 -0
  135. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/messaging/queue.py +0 -0
  136. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/__init__.py +0 -0
  137. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/base.py +0 -0
  138. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/can.py +0 -0
  139. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/esphome.py +0 -0
  140. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/mqtt.py +0 -0
  141. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/remote/wled.py +0 -0
  142. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/sensor/__init__.py +0 -0
  143. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/sensor/base.py +0 -0
  144. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/sensor/system.py +0 -0
  145. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/state/__init__.py +0 -0
  146. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/state/manager.py +0 -0
  147. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/system/__init__.py +0 -0
  148. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/system/host_data.py +0 -0
  149. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/system/monitor.py +0 -0
  150. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/__init__.py +0 -0
  151. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/async_updater.py +0 -0
  152. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/conditions.py +0 -0
  153. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/filter.py +0 -0
  154. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/font_util.py +0 -0
  155. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/logger.py +0 -0
  156. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/timeperiod.py +0 -0
  157. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/core/utils/util.py +0 -0
  158. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/adc.yaml +0 -0
  159. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  160. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/config.yaml +0 -0
  161. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/event.yaml +0 -0
  162. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/mqtt.yaml +0 -0
  163. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  164. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/adc.yaml +0 -0
  165. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  166. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/config.yaml +0 -0
  167. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/event.yaml +0 -0
  168. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/mqtt.yaml +0 -0
  169. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  170. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/adc.yaml +0 -0
  171. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  172. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/config.yaml +0 -0
  173. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/event.yaml +0 -0
  174. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/mqtt.yaml +0 -0
  175. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  176. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/__init__.py +0 -0
  177. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/can_master.yaml +0 -0
  178. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/can_slave.yaml +0 -0
  179. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/adc.yaml +0 -0
  180. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  181. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/config.yaml +0 -0
  182. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/cover.yaml +0 -0
  183. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/event.yaml +0 -0
  184. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/mqtt.yaml +0 -0
  185. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover/outputCover.yaml +0 -0
  186. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/adc.yaml +0 -0
  187. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  188. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/config.yaml +0 -0
  189. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/cover.yaml +0 -0
  190. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/event.yaml +0 -0
  191. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  192. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  193. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/adc.yaml +0 -0
  194. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  195. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  196. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  197. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  198. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/event_all.yaml +0 -0
  199. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  200. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  201. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  202. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  203. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  204. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  205. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/exceptions.py +0 -0
  206. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/__init__.py +0 -0
  207. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/analog/__init__.py +0 -0
  208. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/analog/adc.py +0 -0
  209. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/__init__.py +0 -0
  210. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/bridge.py +0 -0
  211. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/client.py +0 -0
  212. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/interface.py +0 -0
  213. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/node.py +0 -0
  214. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/node_id.py +0 -0
  215. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/can/test_od.py +0 -0
  216. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/display/__init__.py +0 -0
  217. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/display/early_oled.py +0 -0
  218. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  219. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/display/oled.py +0 -0
  220. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/__init__.py +0 -0
  221. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  222. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  223. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  224. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  225. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/__init__.py +0 -0
  226. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/base.py +0 -0
  227. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/gpio/input/manager.py +0 -0
  228. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/__init__.py +0 -0
  229. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/bus.py +0 -0
  230. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/ina219.py +0 -0
  231. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/ina219_driver.py +0 -0
  232. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/mcp9808.py +0 -0
  233. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/i2c/pct2075.py +0 -0
  234. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/onewire/__init__.py +0 -0
  235. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/onewire/bus.py +0 -0
  236. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/onewire/dallas.py +0 -0
  237. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/onewire/ds2482.py +0 -0
  238. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/sensor/__init__.py +0 -0
  239. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  240. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/base.py +0 -0
  241. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  242. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  243. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/integration/__init__.py +0 -0
  244. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/integration/interlock.py +0 -0
  245. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/integration/lox_template.py +0 -0
  246. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/__init__.py +0 -0
  247. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/actions.py +0 -0
  248. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  249. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/daemon.json +0 -0
  250. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  251. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  252. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  253. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/journald/journald.conf +0 -0
  254. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  255. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/sudoers/boneio +0 -0
  256. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  257. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/boneio.service +0 -0
  258. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  259. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  260. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  261. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  262. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  263. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  264. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  265. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  266. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  267. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/runner.py +0 -0
  268. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/versions/__init__.py +0 -0
  269. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  270. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  271. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  272. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  273. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/__init__.py +0 -0
  274. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/cli.py +0 -0
  275. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/client.py +0 -0
  276. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/coordinator.py +0 -0
  277. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/__init__.py +0 -0
  278. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  279. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  280. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  281. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  282. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  283. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  284. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  285. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  286. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  287. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/inverters/sofar.json +0 -0
  288. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/inverters/thessla.json +0 -0
  289. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  290. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  291. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  292. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/other/wanas415.json +0 -0
  293. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  294. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/cwt.json +0 -0
  295. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  296. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  297. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  298. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  299. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  300. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/pt100.json +0 -0
  301. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/sht20.json +0 -0
  302. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/devices/sensors/sht30.json +0 -0
  303. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/__init__.py +0 -0
  304. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/base.py +0 -0
  305. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/__init__.py +0 -0
  306. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/numeric.py +0 -0
  307. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/select.py +0 -0
  308. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/switch.py +0 -0
  309. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/derived/text.py +0 -0
  310. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/__init__.py +0 -0
  311. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/binary.py +0 -0
  312. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/numeric.py +0 -0
  313. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/sensor/text.py +0 -0
  314. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/__init__.py +0 -0
  315. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/binary.py +0 -0
  316. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/entities/writeable/numeric.py +0 -0
  317. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/modbus/utils.py +0 -0
  318. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/__init__.py +0 -0
  319. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/actions.py +0 -0
  320. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/events.py +0 -0
  321. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/files.py +0 -0
  322. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/logs.py +0 -0
  323. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/mqtt.py +0 -0
  324. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/models/state.py +0 -0
  325. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/runner.py +0 -0
  326. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/actions.yaml +0 -0
  327. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/actions_sensor.yaml +0 -0
  328. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/actions_switch.yaml +0 -0
  329. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/condition.yaml +0 -0
  330. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/filters.yaml +0 -0
  331. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/filters_adc.yaml +0 -0
  332. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/id.yaml +0 -0
  333. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/remote_devices.yaml +0 -0
  334. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/remote_inputs.yaml +0 -0
  335. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/remote_outputs.yaml +0 -0
  336. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/schema.yaml +0 -0
  337. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/temp_unit.yaml +0 -0
  338. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/schema/update_interval.yaml +0 -0
  339. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/action_validation.py +0 -0
  340. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/app.py +0 -0
  341. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/dashboard_cards.py +0 -0
  342. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  343. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  344. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  345. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  346. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css +0 -0
  347. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  348. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  349. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  350. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  351. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  352. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  353. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  354. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  355. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  356. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio.svg +0 -0
  357. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  358. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  359. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  360. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  361. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  362. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  363. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  364. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  365. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  366. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  367. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  368. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  369. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  370. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  371. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  372. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  373. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  374. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  375. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  376. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  377. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  378. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  379. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  380. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  381. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  382. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  383. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  384. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  385. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  386. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  387. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  388. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  389. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  390. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  391. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/middleware/__init__.py +0 -0
  392. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/middleware/auth.py +0 -0
  393. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/__init__.py +0 -0
  394. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/auth.py +0 -0
  395. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/caddy.py +0 -0
  396. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/can.py +0 -0
  397. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/config.py +0 -0
  398. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/covers.py +0 -0
  399. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/migrations.py +0 -0
  400. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/modbus.py +0 -0
  401. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/outputs.py +0 -0
  402. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/remote_devices.py +0 -0
  403. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/sensors.py +0 -0
  404. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/system.py +0 -0
  405. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/templates.py +0 -0
  406. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/timezone_sudoers.py +0 -0
  407. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/tools.py +0 -0
  408. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/routes/update.py +0 -0
  409. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/adc.schema.json +0 -0
  410. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/areas.schema.json +0 -0
  411. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  412. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/boneio.schema.json +0 -0
  413. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/can.schema.json +0 -0
  414. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/config.schema.json +0 -0
  415. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/cover.schema.json +0 -0
  416. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/dallas.schema.json +0 -0
  417. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/ds2482.schema.json +0 -0
  418. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/event.schema.json +0 -0
  419. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/ina219.schema.json +0 -0
  420. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/irrigation.schema.json +0 -0
  421. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/lm75.schema.json +0 -0
  422. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/logger.schema.json +0 -0
  423. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/lox_udp.schema.json +0 -0
  424. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/mcp23017.schema.json +0 -0
  425. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/mcp9808.schema.json +0 -0
  426. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/modbus.schema.json +0 -0
  427. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  428. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/mqtt.schema.json +0 -0
  429. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/oled.schema.json +0 -0
  430. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/output.schema.json +0 -0
  431. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/output_group.schema.json +0 -0
  432. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/pca9685.schema.json +0 -0
  433. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/pcf8575.schema.json +0 -0
  434. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_devices.schema.json +0 -0
  435. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  436. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  437. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/sensor.schema.json +0 -0
  438. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/template.schema.json +0 -0
  439. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  440. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/schema/web.schema.json +0 -0
  441. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/services/__init__.py +0 -0
  442. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/services/logs.py +0 -0
  443. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/web_server.py +0 -0
  444. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio/webui/websocket_manager.py +0 -0
  445. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio.egg-info/dependency_links.txt +0 -0
  446. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio.egg-info/entry_points.txt +0 -0
  447. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio.egg-info/requires.txt +0 -0
  448. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/boneio.egg-info/top_level.txt +0 -0
  449. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/pyproject.toml +0 -0
  450. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/setup.cfg +0 -0
  451. {boneio-1.4.0.dev11 → boneio-1.4.0.dev13}/setup.py +0 -0
  452. {boneio-1.4.0.dev11 → 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.dev11
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
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import datetime as dt
4
5
  import logging
5
6
  import time
6
7
  import traceback
@@ -261,43 +262,62 @@ class IrrigationController:
261
262
  def _eligible_zones(self) -> list[tuple[int, IrrigationZone]]:
262
263
  """Determine which zones are eligible to run in this cycle.
263
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
+
264
269
  Uses a counter-based system: each zone has a skip counter that
265
270
  increments every scheduled cycle. When the counter reaches
266
271
  run_every_n - 1, the zone is eligible and the counter resets.
267
- Manual starts do not affect the counter.
268
272
  """
269
273
  eligible: list[tuple[int, IrrigationZone]] = []
270
274
  for idx, zone in self._ordered_zones():
271
275
  if not zone.enabled:
272
- _LOGGER.debug("Irrigation %s: zone %s skipped (disabled)", self.id, zone.id)
273
276
  continue
274
277
  if zone.run_every_n <= 1:
275
- # run_every_n=1 means run every time
276
278
  eligible.append((idx, zone))
277
279
  continue
278
280
  counter_key = f"zone/{zone.id}/skip_count"
279
281
  skip_count = int(self._get(counter_key, 0))
280
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)
281
305
  _LOGGER.debug(
282
- "Irrigation %s: zone %s eligible (skip_count=%d >= %d)",
306
+ "Irrigation %s: zone %s counter reset (was %d, eligible)",
283
307
  self.id,
284
308
  zone.id,
285
309
  skip_count,
286
- zone.run_every_n - 1,
287
310
  )
288
- eligible.append((idx, zone))
289
- # Reset counter — will be saved when zone finishes in _advance_to_next_zone
290
311
  else:
291
312
  skip_count += 1
292
313
  self._save(counter_key, skip_count)
293
314
  _LOGGER.debug(
294
- "Irrigation %s: zone %s NOT eligible (skip_count=%d < %d)",
315
+ "Irrigation %s: zone %s counter incremented to %d/%d",
295
316
  self.id,
296
317
  zone.id,
297
318
  skip_count,
298
319
  zone.run_every_n - 1,
299
320
  )
300
- return eligible
301
321
 
302
322
  async def publish_all_states(self) -> None:
303
323
  controller_state = ON if self._state in (ControllerState.RUNNING, ControllerState.PAUSED) else OFF
@@ -345,7 +365,23 @@ class IrrigationController:
345
365
  active,
346
366
  self._active_zone_idx,
347
367
  )
348
- 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)
349
385
  self._publish(
350
386
  self._setting_state_topic(f"zone/{zone.id}/enabled"),
351
387
  {"state": ON if zone.enabled else OFF},
@@ -463,7 +499,7 @@ class IrrigationController:
463
499
  _LOGGER.info("Irrigation %s skipped one full cycle", self.id)
464
500
  return
465
501
 
466
- await self._start_cycle_from_eligible()
502
+ await self._start_cycle_from_eligible(scheduled=True)
467
503
 
468
504
  async def start_single_zone(self, zone_id: str) -> None:
469
505
  _LOGGER.debug(
@@ -501,8 +537,17 @@ class IrrigationController:
501
537
  _LOGGER.debug("Irrigation %s calling _start_zone(%d) for zone '%s'", self.id, match_idx, zone_id)
502
538
  await self._start_zone(match_idx)
503
539
 
504
- 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
+ """
505
548
  eligible = self._eligible_zones()
549
+ if scheduled:
550
+ self._apply_skip_counters()
506
551
  _LOGGER.debug(
507
552
  "Irrigation %s _start_cycle_from_eligible: %d eligible zones: %s",
508
553
  self.id,
@@ -534,9 +579,6 @@ class IrrigationController:
534
579
 
535
580
  finished_idx = self._active_zone_idx
536
581
  finished_zone = self._zones[finished_idx]
537
- # Reset skip counter for scheduled runs only (manual starts don't affect counters)
538
- if not self._single_zone_mode:
539
- self._save(f"zone/{finished_zone.id}/skip_count", 0)
540
582
 
541
583
  if self._single_zone_mode:
542
584
  _LOGGER.debug("Irrigation %s: single zone mode complete for zone '%s'", self.id, finished_zone.id)
@@ -1031,6 +1073,46 @@ class IrrigationController:
1031
1073
  earliest = candidate
1032
1074
  return earliest
1033
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
+
1034
1116
  def start_schedules(self) -> None:
1035
1117
  self.stop_schedules()
1036
1118
  for idx, schedule in enumerate(self._schedule):
@@ -1058,9 +1140,40 @@ class IrrigationController:
1058
1140
 
1059
1141
  await self.start_full_cycle()
1060
1142
 
1143
+ def _local_now() -> datetime:
1144
+ """Return the current time in the system's local timezone.
1145
+
1146
+ Extracted as a module-level function so tests can mock it easily.
1147
+ """
1148
+ local_tz = dt.datetime.now().astimezone().tzinfo
1149
+ return dt.datetime.now(local_tz)
1150
+
1061
1151
 
1062
1152
  def _next_fire_time(time_str: str, days: str) -> datetime:
1063
- now = utcnow()
1153
+ """Compute next fire time for a schedule entry.
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
+
1163
+ The user-configured ``time_str`` (e.g. "18:00") is in **local time**.
1164
+ We build candidates in the system's local timezone and then convert
1165
+ to UTC.
1166
+
1167
+ Args:
1168
+ time_str: Schedule time in "HH:MM" format (local time).
1169
+ days: Day filter string ("daily", "weekdays", "weekends", etc.).
1170
+ n: Which occurrence to return (1 = next, 2 = the one after, etc.).
1171
+
1172
+ Returns:
1173
+ Nth fire time as a timezone-aware UTC datetime.
1174
+ """
1175
+ now_local = _local_now()
1176
+
1064
1177
  try:
1065
1178
  hh, mm = time_str.split(":", 1)
1066
1179
  target_h = int(hh)
@@ -1069,20 +1182,27 @@ def _next_fire_time(time_str: str, days: str) -> datetime:
1069
1182
  target_h, target_m = 6, 0
1070
1183
 
1071
1184
  allowed_days = _DAYS_MAP.get(days, _DAYS_MAP["daily"])
1185
+ found = 0
1072
1186
 
1073
- for plus_days in range(0, 8):
1074
- candidate = (now + timedelta(days=plus_days)).replace(
1187
+ for plus_days in range(0, 366):
1188
+ candidate_local = (now_local + timedelta(days=plus_days)).replace(
1075
1189
  hour=target_h,
1076
1190
  minute=target_m,
1077
1191
  second=0,
1078
1192
  microsecond=0,
1079
1193
  )
1080
- if candidate.weekday() in allowed_days and candidate > now:
1081
- return candidate
1194
+ if candidate_local.weekday() in allowed_days and candidate_local > now_local:
1195
+ found += 1
1196
+ if found >= n:
1197
+ return candidate_local.astimezone(dt.UTC)
1082
1198
 
1083
- return (now + timedelta(days=1)).replace(
1199
+ # Fallback (should never reach for n <= 365)
1200
+ fallback_local = (now_local + timedelta(days=n)).replace(
1084
1201
  hour=target_h,
1085
1202
  minute=target_m,
1086
1203
  second=0,
1087
1204
  microsecond=0,
1088
1205
  )
1206
+ return fallback_local.astimezone(dt.UTC)
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};