boneio 1.4.0.dev6__tar.gz → 1.4.0.dev7__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 (454) hide show
  1. {boneio-1.4.0.dev6/boneio.egg-info → boneio-1.4.0.dev7}/PKG-INFO +1 -1
  2. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/irrigation/controller.py +30 -0
  3. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/irrigation.py +42 -17
  4. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/integration/homeassistant.py +13 -3
  5. boneio-1.4.0.dev7/boneio/version.py +2 -0
  6. boneio-1.4.0.dev7/boneio/webui/dashboard_cards.py +280 -0
  7. boneio-1.4.0.dev7/boneio/webui/frontend-dist/assets/ConfigEditor-Cs0wqNzh.js +1 -0
  8. boneio-1.4.0.dev7/boneio/webui/frontend-dist/assets/index-DvzU3Ztp.js +100 -0
  9. boneio-1.4.0.dev6/boneio/webui/frontend-dist/assets/useTranslation-ChNIvF-0.js → boneio-1.4.0.dev7/boneio/webui/frontend-dist/assets/useTranslation-BbOWxWUU.js +8 -8
  10. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/index.html +2 -2
  11. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/sw.js +1 -1
  12. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/irrigation.py +147 -0
  13. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7/boneio.egg-info}/PKG-INFO +1 -1
  14. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio.egg-info/SOURCES.txt +4 -3
  15. boneio-1.4.0.dev6/boneio/version.py +0 -2
  16. boneio-1.4.0.dev6/boneio/webui/frontend-dist/assets/ConfigEditor-DyLbxOBb.js +0 -1
  17. boneio-1.4.0.dev6/boneio/webui/frontend-dist/assets/index-BbWOzth0.js +0 -100
  18. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/LICENSE +0 -0
  19. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/MANIFEST.in +0 -0
  20. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/README.md +0 -0
  21. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/__init__.py +0 -0
  22. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/input.yaml +0 -0
  23. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/output_24_16.yaml +0 -0
  24. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/output_32_10.yaml +0 -0
  25. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/output_32_5.yaml +0 -0
  26. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/output_cover.yaml +0 -0
  27. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  28. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/input.yaml +0 -0
  29. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/output_24_16.yaml +0 -0
  30. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/output_32_10.yaml +0 -0
  31. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/output_32_5.yaml +0 -0
  32. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/output_cover.yaml +0 -0
  33. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  34. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/input.yaml +0 -0
  35. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/output_24_16.yaml +0 -0
  36. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/output_32_10.yaml +0 -0
  37. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/output_32_5.yaml +0 -0
  38. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/output_cover.yaml +0 -0
  39. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  40. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.5/input.yaml +0 -0
  41. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.5/output_24_16.yaml +0 -0
  42. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.5/output_32_10.yaml +0 -0
  43. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.5/output_cover.yaml +0 -0
  44. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  45. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.6/input.yaml +0 -0
  46. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.6/output_24_16.yaml +0 -0
  47. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.6/output_32_10.yaml +0 -0
  48. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.6/output_cover.yaml +0 -0
  49. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  50. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/input.yaml +0 -0
  51. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/output_24_16.yaml +0 -0
  52. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/output_32_10.yaml +0 -0
  53. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/output_48_4.yaml +0 -0
  54. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/output_cover.yaml +0 -0
  55. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  56. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/input.yaml +0 -0
  57. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/output_24_16.yaml +0 -0
  58. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/output_32_10.yaml +0 -0
  59. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/output_48_4.yaml +0 -0
  60. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/output_cover.yaml +0 -0
  61. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  62. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/bonecli.py +0 -0
  63. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/__init__.py +0 -0
  64. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/cover/__init__.py +0 -0
  65. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/cover/cover.py +0 -0
  66. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/cover/time_based.py +0 -0
  67. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/cover/venetian.py +0 -0
  68. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/group/__init__.py +0 -0
  69. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/group/output_group.py +0 -0
  70. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/__init__.py +0 -0
  71. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/binary_sensor.py +0 -0
  72. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/detectors.py +0 -0
  73. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/event.py +0 -0
  74. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/remote/__init__.py +0 -0
  75. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/remote/base.py +0 -0
  76. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/input/remote/esphome.py +0 -0
  77. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/irrigation/__init__.py +0 -0
  78. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/irrigation/water_source.py +0 -0
  79. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/__init__.py +0 -0
  80. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/basic.py +0 -0
  81. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/mcp.py +0 -0
  82. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/pca.py +0 -0
  83. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/pcf.py +0 -0
  84. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/output/remote.py +0 -0
  85. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/sensor/__init__.py +0 -0
  86. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/sensor/virtual_energy.py +0 -0
  87. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/template/__init__.py +0 -0
  88. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/template/alarm_panel.py +0 -0
  89. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/template/gate_cover.py +0 -0
  90. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/components/template/thermostat.py +0 -0
  91. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/const.py +0 -0
  92. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/__init__.py +0 -0
  93. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/__init__.py +0 -0
  94. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/data/__init__.py +0 -0
  95. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  96. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  97. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  98. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/registration.py +0 -0
  99. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/cloud/secrets.py +0 -0
  100. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/__init__.py +0 -0
  101. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/config_helper.py +0 -0
  102. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/migrations/__init__.py +0 -0
  103. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  104. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/migrations/v2_transition.py +0 -0
  105. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/package-lock.json +0 -0
  106. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/package.json +0 -0
  107. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/schema_converter.py +0 -0
  108. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/config/yaml_util.py +0 -0
  109. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/discovery.py +0 -0
  110. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/events/__init__.py +0 -0
  111. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/events/bus.py +0 -0
  112. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/__init__.py +0 -0
  113. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/action_conditions.py +0 -0
  114. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/canopen.py +0 -0
  115. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/covers.py +0 -0
  116. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/display.py +0 -0
  117. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/inputs.py +0 -0
  118. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/manager.py +0 -0
  119. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/modbus.py +0 -0
  120. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/outputs.py +0 -0
  121. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/remote.py +0 -0
  122. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/remote_input_registrar.py +0 -0
  123. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/sensors.py +0 -0
  124. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/templates/__init__.py +0 -0
  125. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/templates/alarm.py +0 -0
  126. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/templates/gate_cover.py +0 -0
  127. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/templates/thermostat.py +0 -0
  128. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/templates.py +0 -0
  129. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/manager/update.py +0 -0
  130. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/__init__.py +0 -0
  131. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/basic.py +0 -0
  132. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/basic_mqtt.py +0 -0
  133. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/composite.py +0 -0
  134. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/local.py +0 -0
  135. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/lox.py +0 -0
  136. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/mqtt.py +0 -0
  137. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/messaging/queue.py +0 -0
  138. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/__init__.py +0 -0
  139. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/base.py +0 -0
  140. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/can.py +0 -0
  141. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/esphome.py +0 -0
  142. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/mqtt.py +0 -0
  143. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/remote/wled.py +0 -0
  144. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/sensor/__init__.py +0 -0
  145. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/sensor/base.py +0 -0
  146. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/sensor/system.py +0 -0
  147. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/state/__init__.py +0 -0
  148. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/state/manager.py +0 -0
  149. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/system/__init__.py +0 -0
  150. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/system/host_data.py +0 -0
  151. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/system/monitor.py +0 -0
  152. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/__init__.py +0 -0
  153. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/async_updater.py +0 -0
  154. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/conditions.py +0 -0
  155. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/filter.py +0 -0
  156. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/font_util.py +0 -0
  157. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/logger.py +0 -0
  158. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/timeperiod.py +0 -0
  159. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/core/utils/util.py +0 -0
  160. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/adc.yaml +0 -0
  161. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  162. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/config.yaml +0 -0
  163. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/event.yaml +0 -0
  164. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/mqtt.yaml +0 -0
  165. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  166. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/adc.yaml +0 -0
  167. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  168. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/config.yaml +0 -0
  169. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/event.yaml +0 -0
  170. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/mqtt.yaml +0 -0
  171. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  172. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/adc.yaml +0 -0
  173. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  174. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/config.yaml +0 -0
  175. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/event.yaml +0 -0
  176. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/mqtt.yaml +0 -0
  177. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  178. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/__init__.py +0 -0
  179. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/can_master.yaml +0 -0
  180. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/can_slave.yaml +0 -0
  181. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/adc.yaml +0 -0
  182. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  183. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/config.yaml +0 -0
  184. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/cover.yaml +0 -0
  185. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/event.yaml +0 -0
  186. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/mqtt.yaml +0 -0
  187. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover/outputCover.yaml +0 -0
  188. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/adc.yaml +0 -0
  189. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  190. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/config.yaml +0 -0
  191. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/cover.yaml +0 -0
  192. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/event.yaml +0 -0
  193. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  194. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  195. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/adc.yaml +0 -0
  196. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  197. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  198. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  199. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  200. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/event_all.yaml +0 -0
  201. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  202. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  203. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  204. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  205. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  206. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  207. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/exceptions.py +0 -0
  208. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/__init__.py +0 -0
  209. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/analog/__init__.py +0 -0
  210. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/analog/adc.py +0 -0
  211. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/__init__.py +0 -0
  212. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/bridge.py +0 -0
  213. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/client.py +0 -0
  214. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/interface.py +0 -0
  215. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/node.py +0 -0
  216. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/node_id.py +0 -0
  217. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/can/test_od.py +0 -0
  218. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/display/__init__.py +0 -0
  219. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/display/early_oled.py +0 -0
  220. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  221. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/display/oled.py +0 -0
  222. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/__init__.py +0 -0
  223. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  224. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  225. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  226. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  227. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/input/__init__.py +0 -0
  228. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/input/base.py +0 -0
  229. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/gpio/input/manager.py +0 -0
  230. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/__init__.py +0 -0
  231. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/bus.py +0 -0
  232. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/ina219.py +0 -0
  233. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/ina219_driver.py +0 -0
  234. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/mcp9808.py +0 -0
  235. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/i2c/pct2075.py +0 -0
  236. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/onewire/__init__.py +0 -0
  237. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/onewire/bus.py +0 -0
  238. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/onewire/dallas.py +0 -0
  239. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/onewire/ds2482.py +0 -0
  240. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/sensor/__init__.py +0 -0
  241. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  242. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/sensor/temperature/base.py +0 -0
  243. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  244. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  245. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/integration/__init__.py +0 -0
  246. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/integration/interlock.py +0 -0
  247. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/integration/lox_template.py +0 -0
  248. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/__init__.py +0 -0
  249. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/actions.py +0 -0
  250. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  251. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/docker/daemon.json +0 -0
  252. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  253. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  254. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  255. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/journald/journald.conf +0 -0
  256. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  257. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/sudoers/boneio +0 -0
  258. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  259. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/systemd/boneio.service +0 -0
  260. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  261. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  262. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  263. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  264. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  265. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  266. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  267. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  268. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  269. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/runner.py +0 -0
  270. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/versions/__init__.py +0 -0
  271. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  272. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  273. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  274. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  275. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/__init__.py +0 -0
  276. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/cli.py +0 -0
  277. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/client.py +0 -0
  278. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/coordinator.py +0 -0
  279. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/__init__.py +0 -0
  280. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  281. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  282. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  283. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  284. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  285. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  286. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  287. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  288. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  289. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  290. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/inverters/sofar.json +0 -0
  291. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/inverters/thessla.json +0 -0
  292. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  293. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  294. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  295. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/other/wanas415.json +0 -0
  296. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  297. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/cwt.json +0 -0
  298. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  299. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  300. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  301. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  302. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  303. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/pt100.json +0 -0
  304. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/sht20.json +0 -0
  305. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/devices/sensors/sht30.json +0 -0
  306. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/__init__.py +0 -0
  307. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/base.py +0 -0
  308. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/derived/__init__.py +0 -0
  309. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/derived/numeric.py +0 -0
  310. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/derived/select.py +0 -0
  311. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/derived/switch.py +0 -0
  312. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/derived/text.py +0 -0
  313. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/sensor/__init__.py +0 -0
  314. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/sensor/binary.py +0 -0
  315. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/sensor/numeric.py +0 -0
  316. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/sensor/text.py +0 -0
  317. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/writeable/__init__.py +0 -0
  318. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/writeable/binary.py +0 -0
  319. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/entities/writeable/numeric.py +0 -0
  320. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/modbus/utils.py +0 -0
  321. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/__init__.py +0 -0
  322. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/actions.py +0 -0
  323. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/events.py +0 -0
  324. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/files.py +0 -0
  325. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/logs.py +0 -0
  326. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/mqtt.py +0 -0
  327. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/models/state.py +0 -0
  328. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/runner.py +0 -0
  329. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/actions.yaml +0 -0
  330. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/actions_sensor.yaml +0 -0
  331. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/actions_switch.yaml +0 -0
  332. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/condition.yaml +0 -0
  333. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/filters.yaml +0 -0
  334. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/filters_adc.yaml +0 -0
  335. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/id.yaml +0 -0
  336. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/remote_devices.yaml +0 -0
  337. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/remote_inputs.yaml +0 -0
  338. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/remote_outputs.yaml +0 -0
  339. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/schema.yaml +0 -0
  340. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/temp_unit.yaml +0 -0
  341. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/schema/update_interval.yaml +0 -0
  342. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/action_validation.py +0 -0
  343. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/app.py +0 -0
  344. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  345. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  346. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  347. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  348. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css +0 -0
  349. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  350. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  351. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  352. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  353. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  354. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  355. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  356. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  357. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  358. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/boneio.svg +0 -0
  359. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  360. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  361. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  362. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  363. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  364. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  365. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  366. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  367. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  368. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  369. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  370. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  371. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  372. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  373. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  374. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  375. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  376. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  377. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  378. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  379. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  380. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  381. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  382. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  383. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  384. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  385. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  386. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  387. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  388. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  389. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  390. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  391. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  392. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  393. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/middleware/__init__.py +0 -0
  394. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/middleware/auth.py +0 -0
  395. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/__init__.py +0 -0
  396. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/auth.py +0 -0
  397. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/caddy.py +0 -0
  398. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/can.py +0 -0
  399. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/config.py +0 -0
  400. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/covers.py +0 -0
  401. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/migrations.py +0 -0
  402. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/modbus.py +0 -0
  403. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/outputs.py +0 -0
  404. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/remote_devices.py +0 -0
  405. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/sensors.py +0 -0
  406. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/system.py +0 -0
  407. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/templates.py +0 -0
  408. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/timezone_sudoers.py +0 -0
  409. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/tools.py +0 -0
  410. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/routes/update.py +0 -0
  411. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/adc.schema.json +0 -0
  412. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/areas.schema.json +0 -0
  413. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  414. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/boneio.schema.json +0 -0
  415. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/can.schema.json +0 -0
  416. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/config.schema.json +0 -0
  417. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/cover.schema.json +0 -0
  418. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/dallas.schema.json +0 -0
  419. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/ds2482.schema.json +0 -0
  420. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/event.schema.json +0 -0
  421. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/ina219.schema.json +0 -0
  422. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/irrigation.schema.json +0 -0
  423. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/lm75.schema.json +0 -0
  424. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/logger.schema.json +0 -0
  425. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/lox_udp.schema.json +0 -0
  426. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/mcp23017.schema.json +0 -0
  427. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/mcp9808.schema.json +0 -0
  428. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/modbus.schema.json +0 -0
  429. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  430. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/mqtt.schema.json +0 -0
  431. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/oled.schema.json +0 -0
  432. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/output.schema.json +0 -0
  433. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/output_group.schema.json +0 -0
  434. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/pca9685.schema.json +0 -0
  435. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/pcf8575.schema.json +0 -0
  436. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/remote_devices.schema.json +0 -0
  437. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  438. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  439. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/sensor.schema.json +0 -0
  440. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/template.schema.json +0 -0
  441. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  442. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/schema/web.schema.json +0 -0
  443. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/services/__init__.py +0 -0
  444. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/services/logs.py +0 -0
  445. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/web_server.py +0 -0
  446. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio/webui/websocket_manager.py +0 -0
  447. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio.egg-info/dependency_links.txt +0 -0
  448. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio.egg-info/entry_points.txt +0 -0
  449. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio.egg-info/requires.txt +0 -0
  450. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/boneio.egg-info/top_level.txt +0 -0
  451. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/pyproject.toml +0 -0
  452. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/setup.cfg +0 -0
  453. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/setup.py +0 -0
  454. {boneio-1.4.0.dev6 → boneio-1.4.0.dev7}/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.dev6
3
+ Version: 1.4.0.dev7
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
@@ -76,6 +76,7 @@ class IrrigationController:
76
76
  auto_advance: bool = True,
77
77
  reverse: bool = False,
78
78
  pause_timeout_s: int = 1800,
79
+ area_id: str | None = None,
79
80
  ) -> None:
80
81
  """Initialize irrigation controller.
81
82
 
@@ -101,6 +102,7 @@ class IrrigationController:
101
102
  """
102
103
  self.id = id
103
104
  self.name = name
105
+ self.area_id = area_id
104
106
  self._topic_prefix = topic_prefix
105
107
  self._message_bus = message_bus
106
108
  self._event_bus = event_bus
@@ -370,6 +372,16 @@ class IrrigationController:
370
372
  {"value": end_time_value},
371
373
  )
372
374
 
375
+ # Publish next scheduled run time
376
+ next_run_value = ""
377
+ next_run_dt = self._compute_next_run_time()
378
+ if next_run_dt is not None:
379
+ next_run_value = next_run_dt.isoformat()
380
+ self._publish(
381
+ self._setting_state_topic("next_run_time"),
382
+ {"value": next_run_value},
383
+ )
384
+
373
385
  async def shutdown(self) -> None:
374
386
  _LOGGER.debug(
375
387
  "Irrigation %s shutdown called (state=%s, active_zone=%s). Caller: %s",
@@ -1001,6 +1013,24 @@ class IrrigationController:
1001
1013
  self._save(f"schedule/{schedule_idx}/skip", value)
1002
1014
  await self.publish_all_states()
1003
1015
 
1016
+ def _compute_next_run_time(self) -> datetime | None:
1017
+ """Compute the next scheduled run time across all schedules.
1018
+
1019
+ Returns the earliest upcoming fire time, or None if no schedules
1020
+ are configured or the controller is in standby.
1021
+ """
1022
+ if not self._schedule or self._standby:
1023
+ return None
1024
+
1025
+ earliest: datetime | None = None
1026
+ for schedule in self._schedule:
1027
+ time_str = schedule.get("time", "06:00")
1028
+ days = str(schedule.get("days", "daily")).strip().lower()
1029
+ candidate = _next_fire_time(time_str, days)
1030
+ if earliest is None or candidate < earliest:
1031
+ earliest = candidate
1032
+ return earliest
1033
+
1004
1034
  def start_schedules(self) -> None:
1005
1035
  self.stop_schedules()
1006
1036
  for idx, schedule in enumerate(self._schedule):
@@ -10,6 +10,7 @@ from boneio.components.irrigation import IrrigationController, IrrigationZone, W
10
10
  from boneio.const import NEXT_VALVE, ON, PAUSE, RESUME
11
11
  from boneio.core.utils.timeperiod import parse_time_to_seconds
12
12
  from boneio.integration.homeassistant import (
13
+ _ha_irrigation_device,
13
14
  ha_irrigation_button_message,
14
15
  ha_irrigation_event_message,
15
16
  ha_irrigation_main_switch_message,
@@ -93,6 +94,7 @@ class IrrigationManager:
93
94
  auto_advance=bool(cfg.get("auto_advance", True)),
94
95
  reverse=bool(cfg.get("reverse", False)),
95
96
  pause_timeout_s=int(parse_time_to_seconds(cfg.get("pause_timeout"), 1800)),
97
+ area_id=cfg.get("area"),
96
98
  )
97
99
 
98
100
  def _build_zone(self, zone_cfg: dict[str, Any]) -> IrrigationZone | None:
@@ -383,14 +385,23 @@ class IrrigationManager:
383
385
 
384
386
  def _publish_discovery(self, ctrl: IrrigationController) -> None:
385
387
  cfg = self._manager.config_helper
388
+ # Resolve area name for HA suggested_area
389
+ area_name = cfg.get_area_name(ctrl.area_id) if ctrl.area_id else None
390
+ device = _ha_irrigation_device(ctrl.id, ctrl.name, cfg, area=ctrl.area_id, area_name=area_name)
386
391
 
387
- self._manager.publish_ha_discovery(
392
+ def _pub(id: str, ha_type: str, payload: dict | str) -> None:
393
+ """Publish discovery with area-enriched device info."""
394
+ if isinstance(payload, dict) and "device" in payload:
395
+ payload["device"] = device
396
+ self._manager.publish_ha_discovery(id=id, ha_type=ha_type, payload=payload)
397
+
398
+ _pub(
388
399
  id=f"{ctrl.id}",
389
400
  ha_type="switch",
390
401
  payload=ha_irrigation_main_switch_message(ctrl.id, ctrl.name, cfg),
391
402
  )
392
403
 
393
- self._manager.publish_ha_discovery(
404
+ _pub(
394
405
  id=f"{ctrl.id}_auto_advance",
395
406
  ha_type="switch",
396
407
  payload=ha_irrigation_switch_message(
@@ -402,7 +413,7 @@ class IrrigationManager:
402
413
  ),
403
414
  )
404
415
 
405
- self._manager.publish_ha_discovery(
416
+ _pub(
406
417
  id=f"{ctrl.id}_reverse",
407
418
  ha_type="switch",
408
419
  payload=ha_irrigation_switch_message(
@@ -414,7 +425,7 @@ class IrrigationManager:
414
425
  ),
415
426
  )
416
427
 
417
- self._manager.publish_ha_discovery(
428
+ _pub(
418
429
  id=f"{ctrl.id}_skip_next_run",
419
430
  ha_type="switch",
420
431
  payload=ha_irrigation_switch_message(
@@ -426,7 +437,7 @@ class IrrigationManager:
426
437
  ),
427
438
  )
428
439
 
429
- self._manager.publish_ha_discovery(
440
+ _pub(
430
441
  id=f"{ctrl.id}_standby",
431
442
  ha_type="switch",
432
443
  payload=ha_irrigation_switch_message(
@@ -438,7 +449,7 @@ class IrrigationManager:
438
449
  ),
439
450
  )
440
451
 
441
- self._manager.publish_ha_discovery(
452
+ _pub(
442
453
  id=f"{ctrl.id}_multiplier",
443
454
  ha_type="number",
444
455
  payload=ha_irrigation_number_message(
@@ -454,7 +465,7 @@ class IrrigationManager:
454
465
  ),
455
466
  )
456
467
 
457
- self._manager.publish_ha_discovery(
468
+ _pub(
458
469
  id=f"{ctrl.id}_repeat",
459
470
  ha_type="number",
460
471
  payload=ha_irrigation_number_message(
@@ -470,7 +481,7 @@ class IrrigationManager:
470
481
  ),
471
482
  )
472
483
 
473
- self._manager.publish_ha_discovery(
484
+ _pub(
474
485
  id=f"{ctrl.id}_next_valve",
475
486
  ha_type="button",
476
487
  payload=ha_irrigation_button_message(
@@ -483,7 +494,7 @@ class IrrigationManager:
483
494
  ),
484
495
  )
485
496
 
486
- self._manager.publish_ha_discovery(
497
+ _pub(
487
498
  id=f"{ctrl.id}_pause",
488
499
  ha_type="button",
489
500
  payload=ha_irrigation_button_message(
@@ -496,7 +507,7 @@ class IrrigationManager:
496
507
  ),
497
508
  )
498
509
 
499
- self._manager.publish_ha_discovery(
510
+ _pub(
500
511
  id=f"{ctrl.id}_resume",
501
512
  ha_type="button",
502
513
  payload=ha_irrigation_button_message(
@@ -516,7 +527,7 @@ class IrrigationManager:
516
527
  ha_type="switch",
517
528
  payload="",
518
529
  )
519
- self._manager.publish_ha_discovery(
530
+ _pub(
520
531
  id=f"{ctrl.id}_zone_{zone.id}",
521
532
  ha_type="valve",
522
533
  payload=ha_irrigation_valve_message(
@@ -528,7 +539,7 @@ class IrrigationManager:
528
539
  ),
529
540
  )
530
541
 
531
- self._manager.publish_ha_discovery(
542
+ _pub(
532
543
  id=f"{ctrl.id}_zone_{zone.id}_enabled",
533
544
  ha_type="switch",
534
545
  payload=ha_irrigation_switch_message(
@@ -540,7 +551,7 @@ class IrrigationManager:
540
551
  ),
541
552
  )
542
553
 
543
- self._manager.publish_ha_discovery(
554
+ _pub(
544
555
  id=f"{ctrl.id}_zone_{zone.id}_duration",
545
556
  ha_type="number",
546
557
  payload=ha_irrigation_number_message(
@@ -557,7 +568,7 @@ class IrrigationManager:
557
568
  )
558
569
 
559
570
  for idx, _schedule in enumerate(ctrl._schedule):
560
- self._manager.publish_ha_discovery(
571
+ _pub(
561
572
  id=f"{ctrl.id}_schedule_{idx}_skip",
562
573
  ha_type="switch",
563
574
  payload=ha_irrigation_switch_message(
@@ -570,7 +581,7 @@ class IrrigationManager:
570
581
  )
571
582
 
572
583
  # Zone end time sensor — HA shows countdown automatically
573
- self._manager.publish_ha_discovery(
584
+ _pub(
574
585
  id=f"{ctrl.id}_zone_end_time",
575
586
  ha_type="sensor",
576
587
  payload=ha_irrigation_timestamp_sensor_message(
@@ -582,9 +593,23 @@ class IrrigationManager:
582
593
  ),
583
594
  )
584
595
 
596
+ # Next scheduled run time sensor
597
+ _pub(
598
+ id=f"{ctrl.id}_next_run_time",
599
+ ha_type="sensor",
600
+ payload=ha_irrigation_timestamp_sensor_message(
601
+ ctrl.id,
602
+ ctrl.name,
603
+ suffix="next_run_time",
604
+ name=f"{ctrl.name} Next Run",
605
+ config_helper=cfg,
606
+ icon="mdi:calendar-clock",
607
+ ),
608
+ )
609
+
585
610
  # Water source select — only when multiple sources exist
586
611
  if len(ctrl.water_sources) > 1:
587
- self._manager.publish_ha_discovery(
612
+ _pub(
588
613
  id=f"{ctrl.id}_water_source",
589
614
  ha_type="select",
590
615
  payload=ha_irrigation_select_message(
@@ -596,7 +621,7 @@ class IrrigationManager:
596
621
  )
597
622
 
598
623
  # Event entity — fires on interlock faults, cycle completions, etc.
599
- self._manager.publish_ha_discovery(
624
+ _pub(
600
625
  id=f"{ctrl.id}_event",
601
626
  ha_type="event",
602
627
  payload=ha_irrigation_event_message(
@@ -283,11 +283,17 @@ def ha_button_availabilty_message(
283
283
  return msg
284
284
 
285
285
 
286
- def _ha_irrigation_device(ctrl_id: str, ctrl_name: str, config_helper: ConfigHelper) -> dict[str, Any]:
286
+ def _ha_irrigation_device(
287
+ ctrl_id: str,
288
+ ctrl_name: str,
289
+ config_helper: ConfigHelper,
290
+ area: str | None = None,
291
+ area_name: str | None = None,
292
+ ) -> dict[str, Any]:
287
293
  """Create HA child-device metadata for one irrigation controller."""
288
294
  topic = config_helper.topic_prefix
289
295
  model = f"boneIO Black {config_helper.device_type.title().replace('X', 'x')}"
290
- return {
296
+ device: dict[str, Any] = {
291
297
  "identifiers": [f"{topic}_{IRRIGATION}_{ctrl_id}"],
292
298
  "manufacturer": "boneIO",
293
299
  "model": model,
@@ -297,6 +303,9 @@ def _ha_irrigation_device(ctrl_id: str, ctrl_name: str, config_helper: ConfigHel
297
303
  "sw_version": __version__,
298
304
  "via_device": topic,
299
305
  }
306
+ if area_name:
307
+ device["suggested_area"] = area_name
308
+ return device
300
309
 
301
310
 
302
311
  def ha_irrigation_main_switch_message(
@@ -440,6 +449,7 @@ def ha_irrigation_timestamp_sensor_message(
440
449
  suffix: str,
441
450
  name: str,
442
451
  config_helper: ConfigHelper,
452
+ icon: str = "mdi:timer-sand",
443
453
  ) -> dict[str, Any]:
444
454
  """Create timestamp sensor discovery for irrigation countdown.
445
455
 
@@ -457,7 +467,7 @@ def ha_irrigation_timestamp_sensor_message(
457
467
  msg["state_topic"] = f"{topic}/{IRRIGATION}/{ctrl_id}/{suffix}"
458
468
  msg["value_template"] = "{{ value_json.value }}"
459
469
  msg["device_class"] = "timestamp"
460
- msg["icon"] = "mdi:timer-sand"
470
+ msg["icon"] = icon
461
471
  return msg
462
472
 
463
473
 
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.4.0dev7"
@@ -0,0 +1,280 @@
1
+ """Reusable Home Assistant dashboard card builders.
2
+
3
+ Generic building blocks for generating HA Lovelace dashboard YAML.
4
+ Not tied to any specific domain — can be used for irrigation, covers,
5
+ lights, etc.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+
12
+ import yaml
13
+
14
+
15
+ # ─── Entity ID ────────────────────────────────────────────────────────────
16
+
17
+
18
+ def build_entity_id(
19
+ serial: str,
20
+ entity_type: str,
21
+ prefix: str,
22
+ entity_id: str,
23
+ suffix: str = "",
24
+ ) -> str:
25
+ """Build a Home Assistant entity ID.
26
+
27
+ Pattern: ``{entity_type}.{serial}_{prefix}_{entity_id}[_{suffix}]``
28
+
29
+ Args:
30
+ serial: Device serial number (e.g. ``'blk3361e9'``).
31
+ entity_type: HA entity type (``switch``, ``valve``, ``sensor``, …).
32
+ prefix: Domain prefix (e.g. ``'irrigation'``, ``'cover'``).
33
+ entity_id: Main entity identifier.
34
+ suffix: Optional extra suffix appended after entity_id.
35
+
36
+ Returns:
37
+ Full entity ID (e.g. ``switch.blk3361e9_irrigation_garden_main``).
38
+ """
39
+ base = f"{prefix}_{entity_id}"
40
+ if suffix:
41
+ base = f"{base}_{suffix}"
42
+ return f"{entity_type}.{serial}_{base}"
43
+
44
+
45
+ # ─── Card primitives ──────────────────────────────────────────────────────
46
+
47
+
48
+ def entity_badge(entity: str) -> dict[str, Any]:
49
+ """Create an entity badge for use in heading cards.
50
+
51
+ Args:
52
+ entity: Full HA entity ID.
53
+
54
+ Returns:
55
+ Badge dict with ``type``, ``show_state``, ``show_icon``, ``entity``.
56
+ """
57
+ return {
58
+ "type": "entity",
59
+ "show_state": True,
60
+ "show_icon": True,
61
+ "entity": entity,
62
+ }
63
+
64
+
65
+ def heading_card(
66
+ heading: str,
67
+ style: str = "title",
68
+ badges: list[dict[str, Any]] | None = None,
69
+ ) -> dict[str, Any]:
70
+ """Create a heading card.
71
+
72
+ Args:
73
+ heading: Heading text (may include emoji).
74
+ style: ``'title'`` or ``'subtitle'``.
75
+ badges: Optional list of badge dicts.
76
+
77
+ Returns:
78
+ Heading card dict.
79
+ """
80
+ card: dict[str, Any] = {
81
+ "type": "heading",
82
+ "heading_style": style,
83
+ "heading": heading,
84
+ }
85
+ if badges:
86
+ card["badges"] = badges
87
+ return card
88
+
89
+
90
+ def tile_card(
91
+ entity: str,
92
+ name: str,
93
+ icon: str,
94
+ *,
95
+ state_content: list[str] | None = None,
96
+ vertical: bool = False,
97
+ tap_action: str = "toggle",
98
+ hold_action: str = "more-info",
99
+ icon_tap_action: str = "more-info",
100
+ features: list[dict[str, Any]] | None = None,
101
+ features_position: str = "bottom",
102
+ ) -> dict[str, Any]:
103
+ """Create a tile card.
104
+
105
+ Args:
106
+ entity: Full HA entity ID.
107
+ name: Display name.
108
+ icon: MDI icon string.
109
+ state_content: State lines to display.
110
+ vertical: Vertical layout.
111
+ tap_action: Tap action type.
112
+ hold_action: Hold action type.
113
+ icon_tap_action: Icon tap action type.
114
+ features: Optional features list.
115
+ features_position: Features position.
116
+
117
+ Returns:
118
+ Tile card dict.
119
+ """
120
+ card: dict[str, Any] = {
121
+ "type": "tile",
122
+ "entity": entity,
123
+ "name": name,
124
+ "icon": icon,
125
+ }
126
+ if state_content:
127
+ card["state_content"] = state_content
128
+ card["vertical"] = vertical
129
+ card["tap_action"] = {"action": tap_action}
130
+ card["hold_action"] = {"action": hold_action}
131
+ card["icon_tap_action"] = {"action": icon_tap_action}
132
+ if features:
133
+ card["features"] = features
134
+ card["features_position"] = features_position
135
+ return card
136
+
137
+
138
+ def sensor_tile(
139
+ entity: str,
140
+ name: str,
141
+ icon: str,
142
+ *,
143
+ state_content: list[str] | None = None,
144
+ ) -> dict[str, Any]:
145
+ """Create a read-only sensor tile card (no actions).
146
+
147
+ Args:
148
+ entity: Full HA entity ID.
149
+ name: Display name.
150
+ icon: MDI icon string.
151
+ state_content: State lines to display.
152
+
153
+ Returns:
154
+ Tile card dict.
155
+ """
156
+ card: dict[str, Any] = {
157
+ "type": "tile",
158
+ "entity": entity,
159
+ "name": name,
160
+ "icon": icon,
161
+ }
162
+ if state_content:
163
+ card["state_content"] = state_content
164
+ return card
165
+
166
+
167
+ def slider_tile(
168
+ entity: str,
169
+ name: str,
170
+ icon: str = "mdi:timer-outline",
171
+ ) -> dict[str, Any]:
172
+ """Create a tile card with a numeric slider feature.
173
+
174
+ Args:
175
+ entity: Full HA entity ID (must be ``number.*``).
176
+ name: Display name.
177
+ icon: MDI icon string.
178
+
179
+ Returns:
180
+ Tile card dict with ``numeric-input`` slider.
181
+ """
182
+ return {
183
+ "type": "tile",
184
+ "entity": entity,
185
+ "name": name,
186
+ "icon": icon,
187
+ "features": [{"type": "numeric-input", "style": "slider"}],
188
+ }
189
+
190
+
191
+ def entities_card(
192
+ entities: list[str | dict[str, Any]],
193
+ title: str = "",
194
+ ) -> dict[str, Any]:
195
+ """Create an entities card.
196
+
197
+ Args:
198
+ entities: List of entity IDs or entity config dicts.
199
+ title: Optional card title.
200
+
201
+ Returns:
202
+ Entities card dict.
203
+ """
204
+ card: dict[str, Any] = {
205
+ "type": "entities",
206
+ "entities": entities,
207
+ }
208
+ if title:
209
+ card["title"] = title
210
+ return card
211
+
212
+
213
+ def button_card(
214
+ entity: str,
215
+ name: str,
216
+ icon: str,
217
+ *,
218
+ tap_action: str = "toggle",
219
+ ) -> dict[str, Any]:
220
+ """Create a button card.
221
+
222
+ Args:
223
+ entity: Full HA entity ID.
224
+ name: Display label.
225
+ icon: MDI icon string.
226
+ tap_action: Tap action type.
227
+
228
+ Returns:
229
+ Button card dict.
230
+ """
231
+ return {
232
+ "type": "button",
233
+ "entity": entity,
234
+ "name": name,
235
+ "icon": icon,
236
+ "tap_action": {"action": tap_action},
237
+ "show_name": True,
238
+ "show_icon": True,
239
+ }
240
+
241
+
242
+ def horizontal_stack(cards: list[dict[str, Any]]) -> dict[str, Any]:
243
+ """Create a horizontal-stack card.
244
+
245
+ Args:
246
+ cards: List of card dicts to stack horizontally.
247
+
248
+ Returns:
249
+ Horizontal-stack card dict.
250
+ """
251
+ return {
252
+ "type": "horizontal-stack",
253
+ "cards": cards,
254
+ }
255
+
256
+
257
+ # ─── YAML serialisation ──────────────────────────────────────────────────
258
+
259
+
260
+ def cards_to_yaml(cards: list[dict[str, Any]], *, grid: bool = True) -> str:
261
+ """Serialize a list of cards to HA-compatible YAML.
262
+
263
+ Args:
264
+ cards: List of card dicts.
265
+ grid: If True, wrap in a ``type: grid`` container.
266
+
267
+ Returns:
268
+ YAML string ready to paste into HA dashboard.
269
+ """
270
+ if grid:
271
+ dashboard: dict[str, Any] = {"type": "grid", "cards": cards}
272
+ else:
273
+ dashboard = {"cards": cards}
274
+
275
+ return yaml.dump(
276
+ dashboard,
277
+ default_flow_style=False,
278
+ allow_unicode=True,
279
+ sort_keys=False,
280
+ )
@@ -0,0 +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};