boneio 1.4.0.dev1__tar.gz → 1.4.0.dev3__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.dev1/boneio.egg-info → boneio-1.4.0.dev3}/PKG-INFO +1 -1
  2. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/venetian.py +93 -5
  3. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/group/output_group.py +9 -2
  4. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/controller.py +88 -26
  5. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/water_source.py +39 -6
  6. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/basic.py +22 -28
  7. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/remote.py +6 -2
  8. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/inputs.py +43 -1
  9. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/irrigation.py +2 -0
  10. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/manager.py +267 -131
  11. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions.yaml +28 -0
  12. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/schema.yaml +46 -0
  13. boneio-1.4.0.dev3/boneio/version.py +2 -0
  14. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-D35Ov2Ei.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/ConfigEditor-B7qJAsAx.js +1 -1
  15. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/aiConfig-C2Ks7Xed.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/aiConfig-Dq5oh99L.js +1 -1
  16. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/aiWizardPrompt-yfvA94cl.js → boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/aiWizardPrompt-r-xmvrUB.js +1 -1
  17. boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/index-BVRhWldF.js +44 -0
  18. boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/index-D-R9QzIP.css +2 -0
  19. boneio-1.4.0.dev3/boneio/webui/frontend-dist/assets/useTranslation-VOFZRLzq.js +13 -0
  20. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/index.html +4 -4
  21. {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +60 -0
  22. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/config.schema.json +328 -0
  23. {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/cover.schema.json +22 -0
  24. {boneio-1.4.0.dev1/boneio/webui → boneio-1.4.0.dev3/boneio/webui/frontend-dist}/schema/event.schema.json +210 -0
  25. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/irrigation.schema.json +18 -0
  26. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/template.schema.json +18 -0
  27. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/sw.js +1 -1
  28. {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/binary_sensor.schema.json +60 -0
  29. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/config.schema.json +328 -0
  30. {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/cover.schema.json +22 -0
  31. {boneio-1.4.0.dev1/boneio/webui/frontend-dist → boneio-1.4.0.dev3/boneio/webui}/schema/event.schema.json +210 -0
  32. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/irrigation.schema.json +18 -0
  33. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/template.schema.json +18 -0
  34. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3/boneio.egg-info}/PKG-INFO +1 -1
  35. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/SOURCES.txt +6 -6
  36. boneio-1.4.0.dev1/boneio/version.py +0 -2
  37. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/index-DEwnXFJ3.js +0 -44
  38. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/index-DncHwhdn.css +0 -2
  39. boneio-1.4.0.dev1/boneio/webui/frontend-dist/assets/useTranslation-yM5lKQna.js +0 -13
  40. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/LICENSE +0 -0
  41. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/MANIFEST.in +0 -0
  42. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/README.md +0 -0
  43. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/__init__.py +0 -0
  44. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/input.yaml +0 -0
  45. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_24_16.yaml +0 -0
  46. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_32_10.yaml +0 -0
  47. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_32_5.yaml +0 -0
  48. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_cover.yaml +0 -0
  49. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  50. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/input.yaml +0 -0
  51. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_24_16.yaml +0 -0
  52. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_32_10.yaml +0 -0
  53. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_32_5.yaml +0 -0
  54. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_cover.yaml +0 -0
  55. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  56. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/input.yaml +0 -0
  57. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_24_16.yaml +0 -0
  58. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_32_10.yaml +0 -0
  59. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_32_5.yaml +0 -0
  60. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_cover.yaml +0 -0
  61. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  62. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/input.yaml +0 -0
  63. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_24_16.yaml +0 -0
  64. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_32_10.yaml +0 -0
  65. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_cover.yaml +0 -0
  66. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  67. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/input.yaml +0 -0
  68. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_24_16.yaml +0 -0
  69. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_32_10.yaml +0 -0
  70. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_cover.yaml +0 -0
  71. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  72. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/input.yaml +0 -0
  73. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_24_16.yaml +0 -0
  74. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_32_10.yaml +0 -0
  75. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_48_4.yaml +0 -0
  76. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_cover.yaml +0 -0
  77. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  78. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/input.yaml +0 -0
  79. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_24_16.yaml +0 -0
  80. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_32_10.yaml +0 -0
  81. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_48_4.yaml +0 -0
  82. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_cover.yaml +0 -0
  83. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  84. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/bonecli.py +0 -0
  85. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/__init__.py +0 -0
  86. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/__init__.py +0 -0
  87. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/cover.py +0 -0
  88. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/cover/time_based.py +0 -0
  89. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/group/__init__.py +0 -0
  90. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/__init__.py +0 -0
  91. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/binary_sensor.py +0 -0
  92. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/detectors.py +0 -0
  93. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/event.py +0 -0
  94. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/__init__.py +0 -0
  95. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/base.py +0 -0
  96. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/input/remote/esphome.py +0 -0
  97. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/irrigation/__init__.py +0 -0
  98. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/__init__.py +0 -0
  99. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/mcp.py +0 -0
  100. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/pca.py +0 -0
  101. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/output/pcf.py +0 -0
  102. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/sensor/__init__.py +0 -0
  103. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/sensor/virtual_energy.py +0 -0
  104. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/__init__.py +0 -0
  105. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/alarm_panel.py +0 -0
  106. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/gate_cover.py +0 -0
  107. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/components/template/thermostat.py +0 -0
  108. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/const.py +0 -0
  109. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/__init__.py +0 -0
  110. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/__init__.py +0 -0
  111. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/__init__.py +0 -0
  112. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  113. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  114. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  115. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/registration.py +0 -0
  116. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/cloud/secrets.py +0 -0
  117. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/__init__.py +0 -0
  118. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/config_helper.py +0 -0
  119. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/__init__.py +0 -0
  120. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  121. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/migrations/v2_transition.py +0 -0
  122. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/package-lock.json +0 -0
  123. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/package.json +0 -0
  124. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/schema_converter.py +0 -0
  125. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/config/yaml_util.py +0 -0
  126. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/discovery.py +0 -0
  127. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/events/__init__.py +0 -0
  128. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/events/bus.py +0 -0
  129. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/__init__.py +0 -0
  130. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/action_conditions.py +0 -0
  131. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/canopen.py +0 -0
  132. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/covers.py +0 -0
  133. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/display.py +0 -0
  134. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/modbus.py +0 -0
  135. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/outputs.py +0 -0
  136. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/remote.py +0 -0
  137. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/remote_input_registrar.py +0 -0
  138. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/sensors.py +0 -0
  139. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/__init__.py +0 -0
  140. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/alarm.py +0 -0
  141. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/gate_cover.py +0 -0
  142. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates/thermostat.py +0 -0
  143. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/templates.py +0 -0
  144. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/manager/update.py +0 -0
  145. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/__init__.py +0 -0
  146. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/basic.py +0 -0
  147. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/basic_mqtt.py +0 -0
  148. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/composite.py +0 -0
  149. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/local.py +0 -0
  150. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/lox.py +0 -0
  151. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/loxone.py +0 -0
  152. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/mqtt.py +0 -0
  153. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/messaging/queue.py +0 -0
  154. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/__init__.py +0 -0
  155. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/base.py +0 -0
  156. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/can.py +0 -0
  157. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/esphome.py +0 -0
  158. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/mqtt.py +0 -0
  159. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/remote/wled.py +0 -0
  160. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/__init__.py +0 -0
  161. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/base.py +0 -0
  162. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/sensor/system.py +0 -0
  163. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/state/__init__.py +0 -0
  164. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/state/manager.py +0 -0
  165. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/__init__.py +0 -0
  166. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/host_data.py +0 -0
  167. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/system/monitor.py +0 -0
  168. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/__init__.py +0 -0
  169. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/async_updater.py +0 -0
  170. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/conditions.py +0 -0
  171. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/filter.py +0 -0
  172. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/font_util.py +0 -0
  173. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/logger.py +0 -0
  174. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/timeperiod.py +0 -0
  175. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/core/utils/util.py +0 -0
  176. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/adc.yaml +0 -0
  177. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  178. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/config.yaml +0 -0
  179. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/event.yaml +0 -0
  180. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/mqtt.yaml +0 -0
  181. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  182. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/adc.yaml +0 -0
  183. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  184. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/config.yaml +0 -0
  185. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/event.yaml +0 -0
  186. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/mqtt.yaml +0 -0
  187. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  188. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/adc.yaml +0 -0
  189. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  190. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/config.yaml +0 -0
  191. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/event.yaml +0 -0
  192. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/mqtt.yaml +0 -0
  193. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  194. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/__init__.py +0 -0
  195. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/can_master.yaml +0 -0
  196. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/can_slave.yaml +0 -0
  197. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/adc.yaml +0 -0
  198. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  199. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/config.yaml +0 -0
  200. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/cover.yaml +0 -0
  201. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/event.yaml +0 -0
  202. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/mqtt.yaml +0 -0
  203. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover/outputCover.yaml +0 -0
  204. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/adc.yaml +0 -0
  205. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  206. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/config.yaml +0 -0
  207. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/cover.yaml +0 -0
  208. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/event.yaml +0 -0
  209. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  210. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  211. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/adc.yaml +0 -0
  212. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  213. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  214. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  215. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  216. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/event_all.yaml +0 -0
  217. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  218. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  219. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  220. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  221. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  222. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  223. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/exceptions.py +0 -0
  224. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/__init__.py +0 -0
  225. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/analog/__init__.py +0 -0
  226. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/analog/adc.py +0 -0
  227. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/__init__.py +0 -0
  228. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/bridge.py +0 -0
  229. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/client.py +0 -0
  230. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/interface.py +0 -0
  231. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/node.py +0 -0
  232. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/node_id.py +0 -0
  233. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/can/test_od.py +0 -0
  234. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/__init__.py +0 -0
  235. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/early_oled.py +0 -0
  236. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  237. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/display/oled.py +0 -0
  238. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/__init__.py +0 -0
  239. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  240. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  241. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  242. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  243. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/__init__.py +0 -0
  244. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/base.py +0 -0
  245. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/gpio/input/manager.py +0 -0
  246. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/__init__.py +0 -0
  247. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/bus.py +0 -0
  248. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/ina219.py +0 -0
  249. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/ina219_driver.py +0 -0
  250. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/mcp9808.py +0 -0
  251. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/i2c/pct2075.py +0 -0
  252. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/__init__.py +0 -0
  253. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/bus.py +0 -0
  254. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/dallas.py +0 -0
  255. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/onewire/ds2482.py +0 -0
  256. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/__init__.py +0 -0
  257. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  258. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/base.py +0 -0
  259. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  260. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  261. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/__init__.py +0 -0
  262. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/homeassistant.py +0 -0
  263. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/interlock.py +0 -0
  264. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/integration/lox_template.py +0 -0
  265. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/__init__.py +0 -0
  266. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/actions.py +0 -0
  267. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  268. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/daemon.json +0 -0
  269. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  270. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  271. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  272. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/journald/journald.conf +0 -0
  273. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  274. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/sudoers/boneio +0 -0
  275. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  276. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/boneio.service +0 -0
  277. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  278. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  279. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  280. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  281. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  282. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  283. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  284. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  285. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  286. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/runner.py +0 -0
  287. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/__init__.py +0 -0
  288. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  289. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  290. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  291. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  292. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/__init__.py +0 -0
  293. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/cli.py +0 -0
  294. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/client.py +0 -0
  295. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/coordinator.py +0 -0
  296. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/__init__.py +0 -0
  297. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  298. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  299. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  300. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  301. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  302. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  303. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  304. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  305. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  306. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/inverters/sofar.json +0 -0
  307. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/inverters/thessla.json +0 -0
  308. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  309. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  310. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  311. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/other/wanas415.json +0 -0
  312. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  313. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/cwt.json +0 -0
  314. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  315. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  316. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  317. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  318. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  319. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/pt100.json +0 -0
  320. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/sht20.json +0 -0
  321. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/devices/sensors/sht30.json +0 -0
  322. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/__init__.py +0 -0
  323. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/base.py +0 -0
  324. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/__init__.py +0 -0
  325. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/numeric.py +0 -0
  326. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/select.py +0 -0
  327. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/switch.py +0 -0
  328. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/derived/text.py +0 -0
  329. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/__init__.py +0 -0
  330. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/binary.py +0 -0
  331. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/numeric.py +0 -0
  332. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/sensor/text.py +0 -0
  333. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/__init__.py +0 -0
  334. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/binary.py +0 -0
  335. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/entities/writeable/numeric.py +0 -0
  336. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/modbus/utils.py +0 -0
  337. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/__init__.py +0 -0
  338. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/actions.py +0 -0
  339. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/events.py +0 -0
  340. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/files.py +0 -0
  341. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/logs.py +0 -0
  342. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/mqtt.py +0 -0
  343. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/models/state.py +0 -0
  344. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/runner.py +0 -0
  345. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions_sensor.yaml +0 -0
  346. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/actions_switch.yaml +0 -0
  347. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/condition.yaml +0 -0
  348. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/filters.yaml +0 -0
  349. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/filters_adc.yaml +0 -0
  350. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/id.yaml +0 -0
  351. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_devices.yaml +0 -0
  352. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_inputs.yaml +0 -0
  353. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/remote_outputs.yaml +0 -0
  354. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/temp_unit.yaml +0 -0
  355. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/schema/update_interval.yaml +0 -0
  356. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/action_validation.py +0 -0
  357. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/app.py +0 -0
  358. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  359. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  360. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  361. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  362. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  363. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  364. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  365. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  366. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  367. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  368. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  369. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio.svg +0 -0
  370. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  371. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  372. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  373. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  374. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  375. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  376. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  377. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  378. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  379. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  380. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  381. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  382. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  383. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  384. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  385. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  386. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  387. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  388. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  389. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  390. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  391. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  392. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  393. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  394. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  395. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  396. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  397. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  398. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/middleware/__init__.py +0 -0
  399. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/middleware/auth.py +0 -0
  400. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/__init__.py +0 -0
  401. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/auth.py +0 -0
  402. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/caddy.py +0 -0
  403. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/can.py +0 -0
  404. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/config.py +0 -0
  405. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/covers.py +0 -0
  406. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/irrigation.py +0 -0
  407. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/migrations.py +0 -0
  408. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/modbus.py +0 -0
  409. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/outputs.py +0 -0
  410. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/remote_devices.py +0 -0
  411. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/sensors.py +0 -0
  412. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/system.py +0 -0
  413. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/templates.py +0 -0
  414. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/timezone_sudoers.py +0 -0
  415. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/tools.py +0 -0
  416. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/routes/update.py +0 -0
  417. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/adc.schema.json +0 -0
  418. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/areas.schema.json +0 -0
  419. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/boneio.schema.json +0 -0
  420. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/can.schema.json +0 -0
  421. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/dallas.schema.json +0 -0
  422. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/ds2482.schema.json +0 -0
  423. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/ina219.schema.json +0 -0
  424. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/lm75.schema.json +0 -0
  425. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/logger.schema.json +0 -0
  426. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/lox_udp.schema.json +0 -0
  427. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mcp23017.schema.json +0 -0
  428. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mcp9808.schema.json +0 -0
  429. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/modbus.schema.json +0 -0
  430. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  431. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/mqtt.schema.json +0 -0
  432. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/oled.schema.json +0 -0
  433. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/output.schema.json +0 -0
  434. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/output_group.schema.json +0 -0
  435. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/pca9685.schema.json +0 -0
  436. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/pcf8575.schema.json +0 -0
  437. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_devices.schema.json +0 -0
  438. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  439. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  440. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/sensor.schema.json +0 -0
  441. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  442. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/schema/web.schema.json +0 -0
  443. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/services/__init__.py +0 -0
  444. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/services/logs.py +0 -0
  445. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/web_server.py +0 -0
  446. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio/webui/websocket_manager.py +0 -0
  447. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/dependency_links.txt +0 -0
  448. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/entry_points.txt +0 -0
  449. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/requires.txt +0 -0
  450. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/boneio.egg-info/top_level.txt +0 -0
  451. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/pyproject.toml +0 -0
  452. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/setup.cfg +0 -0
  453. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/setup.py +0 -0
  454. {boneio-1.4.0.dev1 → boneio-1.4.0.dev3}/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.dev1
3
+ Version: 1.4.0.dev3
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
@@ -25,8 +25,18 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
25
25
  tilt_duration: TimePeriod, # ms
26
26
  actuator_activation_duration: TimePeriod, # ms
27
27
  restored_state: dict = DEFAULT_RESTORED_STATE,
28
+ tilt_restore_after_close: bool = False,
28
29
  **kwargs,
29
30
  ) -> None:
31
+ """Initialize venetian cover.
32
+
33
+ Args:
34
+ tilt_duration: Duration for full tilt movement.
35
+ actuator_activation_duration: Actuator activation time (unused).
36
+ restored_state: Persisted position/tilt from disk.
37
+ tilt_restore_after_close: If True, restore previous tilt
38
+ position after closing the cover.
39
+ """
30
40
  self._tilt_duration = tilt_duration.total_milliseconds # Czas trwania ruchu lameli
31
41
  self._initial_tilt_position = float(restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"]))
32
42
 
@@ -34,9 +44,9 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
34
44
  # --- TILT ---
35
45
  self._tilt_position = float(restored_state.get("tilt", DEFAULT_RESTORED_STATE["tilt"]))
36
46
 
37
- # self._actuator_activation_duration = (
38
- # actuator_activation_duration.total_milliseconds
39
- # ) # ms
47
+ self._tilt_restore_after_close = tilt_restore_after_close
48
+ self._tilt_before_close: float | None = None
49
+
40
50
  self._last_tilt_update = 0.0
41
51
 
42
52
  super().__init__(
@@ -44,13 +54,15 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
44
54
  **kwargs,
45
55
  )
46
56
  _LOGGER.debug(
47
- "VenetianCover %s initialized: open_time=%dms, close_time=%dms, tilt_duration=%dms, position=%d%%, tilt=%d%%",
57
+ "VenetianCover %s initialized: open_time=%dms, close_time=%dms, tilt_duration=%dms, "
58
+ "position=%d%%, tilt=%d%%, tilt_restore=%s",
48
59
  self._id,
49
60
  self._open_time,
50
61
  self._close_time,
51
62
  self._tilt_duration,
52
63
  position,
53
64
  self._tilt_position,
65
+ self._tilt_restore_after_close,
54
66
  )
55
67
 
56
68
  def _move_cover(
@@ -168,6 +180,30 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
168
180
  self._loop.call_soon_threadsafe(self.send_state_and_save, self.json_position)
169
181
  self._last_update_time = time.monotonic() # Upewnij się, że aktualizacja jest wysłana na końcu ruchu
170
182
 
183
+ # Tilt restore: schedule tilt recovery on the event loop.
184
+ # Skip when position reached 0% (fully closed) or 100% (fully open)
185
+ # — at extremes, restoring tilt contradicts user intent.
186
+ if self._tilt_restore_after_close and self._tilt_before_close is not None:
187
+ restore_tilt = self._tilt_before_close
188
+ self._tilt_before_close = None
189
+ at_extreme = self._position <= 0 or self._position >= 100
190
+ if not at_extreme and restore_tilt > 0 and abs(self._tilt_position - restore_tilt) >= 1:
191
+ _LOGGER.info(
192
+ "VenetianCover %s: restoring tilt from %d%% to %d%%",
193
+ self._id,
194
+ round(self._tilt_position),
195
+ round(restore_tilt),
196
+ )
197
+ self._loop.call_soon_threadsafe(
198
+ lambda t=restore_tilt: asyncio.ensure_future(self.set_tilt(int(round(t))))
199
+ )
200
+ elif at_extreme:
201
+ _LOGGER.debug(
202
+ "VenetianCover %s: skipping tilt restore at extreme position %d%%",
203
+ self._id,
204
+ round(self._position),
205
+ )
206
+
171
207
  async def set_tilt(self, tilt_position: int) -> None:
172
208
  """Setting tilt position."""
173
209
  if not 0 <= tilt_position <= 100:
@@ -261,12 +297,62 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
261
297
  )
262
298
  await self.set_tilt(tilt_position=0)
263
299
 
300
+ def _save_tilt_for_restore(self) -> None:
301
+ """Save current tilt position for later restoration.
302
+
303
+ Called before any closing movement when tilt_restore_after_close
304
+ is enabled. Clears saved value if tilt is already at 0%.
305
+ """
306
+ if self._tilt_restore_after_close and self._tilt_position > 0:
307
+ self._tilt_before_close = self._tilt_position
308
+ _LOGGER.debug(
309
+ "VenetianCover %s: saving tilt=%d%% before close",
310
+ self._id,
311
+ round(self._tilt_position),
312
+ )
313
+ else:
314
+ self._tilt_before_close = None
315
+
316
+ async def close(self) -> None:
317
+ """Close venetian cover.
318
+
319
+ If tilt_restore_after_close is enabled, saves the current tilt
320
+ position so it can be restored after the closing movement finishes.
321
+ """
322
+ self._save_tilt_for_restore()
323
+ await super().close()
324
+
325
+ async def set_cover_position(self, position: int) -> None:
326
+ """Set cover position with tilt restore support.
327
+
328
+ When moving to a lower position (closing direction) and
329
+ tilt_restore_after_close is enabled, saves the current tilt
330
+ so it can be restored after the movement finishes.
331
+
332
+ Args:
333
+ position: Target position (0-100).
334
+ """
335
+ if position < self._position:
336
+ self._save_tilt_for_restore()
337
+ else:
338
+ self._tilt_before_close = None
339
+ await super().set_cover_position(position)
340
+
341
+ async def open(self) -> None:
342
+ """Open venetian cover.
343
+
344
+ Clears any saved tilt-before-close value since opening
345
+ resets the tilt to 100% naturally.
346
+ """
347
+ self._tilt_before_close = None
348
+ await super().open()
349
+
264
350
  def update_config_times(self, config: dict) -> None:
265
351
  """Update cover timing configuration.
266
352
 
267
353
  Args:
268
354
  config: Dictionary with timing values as TimePeriod objects.
269
- Keys: open_time, close_time, tilt_duration
355
+ Keys: open_time, close_time, tilt_duration, tilt_restore_after_close
270
356
  """
271
357
  if "open_time" in config:
272
358
  self._open_time = config["open_time"].total_milliseconds
@@ -274,6 +360,8 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
274
360
  self._close_time = config["close_time"].total_milliseconds
275
361
  if "tilt_duration" in config and config["tilt_duration"]:
276
362
  self._tilt_duration = config["tilt_duration"].total_milliseconds
363
+ if "tilt_restore_after_close" in config:
364
+ self._tilt_restore_after_close = bool(config["tilt_restore_after_close"])
277
365
 
278
366
  async def run_cover(
279
367
  self,
@@ -84,7 +84,7 @@ class OutputGroup(BasicOutput):
84
84
  self._state = state
85
85
  self._loop.create_task(self.async_send_state())
86
86
 
87
- async def async_turn_on(self, timestamp=None) -> None:
87
+ async def async_turn_on(self, timestamp=None) -> bool:
88
88
  """Turn on all members in the group.
89
89
 
90
90
  Executes turn_on sequentially to prevent I2C bus contention
@@ -92,9 +92,16 @@ class OutputGroup(BasicOutput):
92
92
 
93
93
  Args:
94
94
  timestamp: Optional timestamp for the operation
95
+
96
+ Returns:
97
+ True if all members were turned on, False if any was blocked.
95
98
  """
99
+ all_ok = True
96
100
  for x in self._group_members:
97
- await x.async_turn_on(timestamp=timestamp)
101
+ result = await x.async_turn_on(timestamp=timestamp)
102
+ if not result:
103
+ all_ok = False
104
+ return all_ok
98
105
 
99
106
  async def async_turn_off(self, timestamp=None) -> None:
100
107
  """Turn off all members in the group.
@@ -107,15 +107,15 @@ class IrrigationController:
107
107
  self._schedule = schedule or []
108
108
  self._water_sources = water_sources or []
109
109
  self._active_water_source_idx: int = 0
110
- self._valve_open_delay_s = max(0, int(valve_open_delay_s))
111
- self._valve_overlap_s = max(0, int(valve_overlap_s))
110
+ self._valve_open_delay_s = max(0, valve_open_delay_s)
111
+ self._valve_overlap_s = max(0, valve_overlap_s)
112
112
  self._standby = standby
113
113
 
114
114
  self._state = ControllerState.IDLE
115
115
  self._auto_advance = auto_advance
116
116
  self._reverse = reverse
117
- self._multiplier = max(0.1, float(multiplier))
118
- self._repeat = max(0, int(repeat))
117
+ self._multiplier = max(0.1, multiplier)
118
+ self._repeat = max(0, repeat)
119
119
  self._skip_next_run = False
120
120
 
121
121
  self._zone_timer_cancel = None
@@ -526,7 +526,7 @@ class IrrigationController:
526
526
  await self._stop_current_zone()
527
527
  self._active_zone_idx = next_idx
528
528
  duration = self._scaled_duration(next_zone.run_duration)
529
- self._active_zone_remaining_s = max(1, int(duration))
529
+ self._active_zone_remaining_s = max(1, duration)
530
530
  self._run_start_utc = utcnow()
531
531
  self._arm_zone_timer(self._active_zone_remaining_s)
532
532
  await self.publish_all_states()
@@ -564,6 +564,9 @@ class IrrigationController:
564
564
 
565
565
  Activates the water source outputs (if any), then opens the zone valve,
566
566
  respecting per-source pump timing delays.
567
+
568
+ If any output is blocked by an interlock, the controller shuts down
569
+ and publishes an interlock fault notification.
567
570
  """
568
571
  if idx < 0 or idx >= len(self._zones):
569
572
  _LOGGER.error("Irrigation %s _start_zone: invalid index %d (zones=%d)", self.id, idx, len(self._zones))
@@ -571,7 +574,7 @@ class IrrigationController:
571
574
 
572
575
  zone = self._zones[idx]
573
576
  duration = override_duration if override_duration is not None else self._scaled_duration(zone.run_duration)
574
- duration = max(1, int(duration))
577
+ duration = max(1, duration)
575
578
  src = self.active_water_source
576
579
 
577
580
  _LOGGER.debug(
@@ -594,7 +597,10 @@ class IrrigationController:
594
597
  _LOGGER.debug(
595
598
  "Irrigation %s: source '%s' ON, then wait %ds", self.id, src.id, src.pump_start_valve_delay_s
596
599
  )
597
- await self._activate_source()
600
+ source_ok = await self._activate_source()
601
+ if not source_ok:
602
+ await self._handle_interlock_fault(zone.id, src.id)
603
+ return
598
604
  await asyncio.sleep(src.pump_start_valve_delay_s)
599
605
  elif src.pump_start_pump_delay_s > 0:
600
606
  # Zone valve first, then source after delay
@@ -605,13 +611,21 @@ class IrrigationController:
605
611
  src.pump_start_pump_delay_s,
606
612
  )
607
613
  try:
608
- await zone.valve.async_turn_on(timestamp=time.time())
614
+ valve_ok = await zone.valve.async_turn_on(timestamp=time.time())
615
+ if not valve_ok:
616
+ await self._handle_interlock_fault(zone.id, src.id)
617
+ return
609
618
  except Exception as err:
610
619
  _LOGGER.error("Failed to turn on zone %s: %s", zone.id, err)
611
620
  await self.shutdown()
612
621
  return
613
622
  await asyncio.sleep(src.pump_start_pump_delay_s)
614
- await self._activate_source()
623
+ source_ok = await self._activate_source()
624
+ if not source_ok:
625
+ # Valve was already ON — turn it off before shutting down
626
+ await zone.valve.async_turn_off(timestamp=time.time())
627
+ await self._handle_interlock_fault(zone.id, src.id)
628
+ return
615
629
  try:
616
630
  self._run_start_utc = utcnow()
617
631
  self._arm_zone_timer(duration)
@@ -629,13 +643,20 @@ class IrrigationController:
629
643
  else:
630
644
  # No delay — activate source, then optional valve_open_delay
631
645
  _LOGGER.debug("Irrigation %s: source '%s' ON (no delay)", self.id, src.id)
632
- await self._activate_source()
646
+ source_ok = await self._activate_source()
647
+ if not source_ok:
648
+ await self._handle_interlock_fault(zone.id, src.id)
649
+ return
633
650
  if self._valve_open_delay_s > 0:
634
651
  await asyncio.sleep(self._valve_open_delay_s)
635
652
 
636
653
  try:
637
654
  _LOGGER.debug("Irrigation %s: turning ON valve %s", self.id, zone.valve.id)
638
- await zone.valve.async_turn_on(timestamp=time.time())
655
+ valve_ok = await zone.valve.async_turn_on(timestamp=time.time())
656
+ if not valve_ok:
657
+ await self._deactivate_source()
658
+ await self._handle_interlock_fault(zone.id, src.id if src else None)
659
+ return
639
660
  _LOGGER.debug("Irrigation %s: valve %s turned ON successfully", self.id, zone.valve.id)
640
661
  except Exception as err:
641
662
  _LOGGER.error("Failed to turn on zone %s valve %s: %s", zone.id, zone.valve.id, err, exc_info=True)
@@ -667,16 +688,21 @@ class IrrigationController:
667
688
  except Exception as err:
668
689
  _LOGGER.error("Failed to turn off zone %s: %s", zone.id, err)
669
690
 
670
- async def _activate_source(self) -> None:
671
- """Turn ON all outputs of the active water source."""
691
+ async def _activate_source(self) -> bool:
692
+ """Turn ON all outputs of the active water source.
693
+
694
+ Returns:
695
+ True if source was activated, False if blocked by interlock.
696
+ """
672
697
  src = self.active_water_source
673
698
  if src is None:
674
- return
699
+ return True
675
700
  try:
676
701
  _LOGGER.debug("Irrigation %s: activating source '%s' outputs=%s", self.id, src.id, src.output_ids)
677
- await src.activate(timestamp=time.time())
702
+ return await src.activate(timestamp=time.time())
678
703
  except Exception as err:
679
704
  _LOGGER.error("Failed to activate water source '%s' for %s: %s", src.id, self.id, err)
705
+ return False
680
706
 
681
707
  async def _deactivate_source(self) -> None:
682
708
  """Turn OFF all outputs of the active water source."""
@@ -689,6 +715,42 @@ class IrrigationController:
689
715
  except Exception as err:
690
716
  _LOGGER.error("Failed to deactivate water source '%s' for %s: %s", src.id, self.id, err)
691
717
 
718
+ async def _handle_interlock_fault(self, zone_id: str, source_id: str | None) -> None:
719
+ """Handle interlock-blocked activation.
720
+
721
+ Shuts down the controller and publishes a fault notification via MQTT
722
+ so that Home Assistant (or other consumers) can alert the user.
723
+
724
+ Args:
725
+ zone_id: ID of the zone that was being started.
726
+ source_id: ID of the water source (if any) whose output was blocked.
727
+ """
728
+ source_info = f" (source '{source_id}')" if source_id else ""
729
+ _LOGGER.error(
730
+ "Irrigation %s: INTERLOCK FAULT — could not start zone '%s'%s. "
731
+ "Another controller or output in the same interlock group is active. Shutting down.",
732
+ self.id,
733
+ zone_id,
734
+ source_info,
735
+ )
736
+
737
+ # Publish fault notification on MQTT
738
+ fault_payload = {
739
+ "fault": "interlock_blocked",
740
+ "controller": self.id,
741
+ "zone": zone_id,
742
+ "source": source_id or "",
743
+ "message": f"Irrigation '{self.name}' stopped: output blocked by interlock (zone: {zone_id})",
744
+ }
745
+ self._publish(
746
+ f"{self._topic_prefix}/{IRRIGATION}/{self.id}/fault",
747
+ fault_payload,
748
+ retain=False,
749
+ )
750
+
751
+ await self.shutdown()
752
+ await self.publish_all_states()
753
+
692
754
  async def _handle_pump_stop_sequence(self) -> None:
693
755
  """Handle pump stop timing according to active water source's delays."""
694
756
  src = self.active_water_source
@@ -706,7 +768,7 @@ class IrrigationController:
706
768
  await self._deactivate_source()
707
769
 
708
770
  def _scaled_duration(self, seconds: int) -> int:
709
- return int(max(1, round(seconds * self._multiplier)))
771
+ return max(1, round(seconds * self._multiplier))
710
772
 
711
773
  def _current_zone_duration_seconds(self) -> int:
712
774
  if self._active_zone_idx is None:
@@ -727,7 +789,7 @@ class IrrigationController:
727
789
 
728
790
  def _arm_zone_timer(self, seconds: int) -> None:
729
791
  self._cancel_zone_timer()
730
- point = utcnow() + timedelta(seconds=max(1, int(seconds)))
792
+ point = utcnow() + timedelta(seconds=max(1, seconds))
731
793
  self._zone_timer_cancel = async_track_point_in_time(
732
794
  loop=self._event_bus._loop,
733
795
  job=self._zone_timer_callback,
@@ -781,42 +843,42 @@ class IrrigationController:
781
843
  await self.publish_all_states()
782
844
 
783
845
  async def set_auto_advance(self, value: bool) -> None:
784
- self._auto_advance = bool(value)
846
+ self._auto_advance = value
785
847
  self._save("auto_advance", self._auto_advance)
786
848
  await self.publish_all_states()
787
849
 
788
850
  async def set_reverse(self, value: bool) -> None:
789
- self._reverse = bool(value)
851
+ self._reverse = value
790
852
  self._save("reverse", self._reverse)
791
853
  await self.publish_all_states()
792
854
 
793
855
  async def set_standby(self, value: bool) -> None:
794
- self._standby = bool(value)
856
+ self._standby = value
795
857
  self._save("standby", self._standby)
796
858
  if self._standby and self._state in (ControllerState.RUNNING, ControllerState.PAUSED):
797
859
  await self.shutdown()
798
860
  await self.publish_all_states()
799
861
 
800
862
  async def set_multiplier(self, value: float) -> None:
801
- self._multiplier = max(0.1, float(value))
863
+ self._multiplier = max(0.1, value)
802
864
  self._save("multiplier", self._multiplier)
803
865
  await self.publish_all_states()
804
866
 
805
867
  async def set_repeat(self, value: int) -> None:
806
- self._repeat = max(0, int(value))
868
+ self._repeat = max(0, value)
807
869
  self._save("repeat", self._repeat)
808
870
  await self.publish_all_states()
809
871
 
810
872
  async def set_zone_enabled(self, zone_id: str, value: bool) -> None:
811
873
  for zone in self._zones:
812
874
  if zone.id == zone_id:
813
- zone.enabled = bool(value)
875
+ zone.enabled = value
814
876
  self._save(f"zone/{zone.id}/enabled", zone.enabled)
815
877
  break
816
878
  await self.publish_all_states()
817
879
 
818
880
  async def set_skip_next_run(self, value: bool) -> None:
819
- self._skip_next_run = bool(value)
881
+ self._skip_next_run = value
820
882
  self._save("skip_next_run", self._skip_next_run)
821
883
  await self.publish_all_states()
822
884
 
@@ -838,8 +900,8 @@ class IrrigationController:
838
900
  async def set_schedule_skip(self, schedule_idx: int, value: bool) -> None:
839
901
  if schedule_idx < 0 or schedule_idx >= len(self._schedule):
840
902
  return
841
- self._schedule[schedule_idx]["skip"] = bool(value)
842
- self._save(f"schedule/{schedule_idx}/skip", bool(value))
903
+ self._schedule[schedule_idx]["skip"] = value
904
+ self._save(f"schedule/{schedule_idx}/skip", value)
843
905
  await self.publish_all_states()
844
906
 
845
907
  def start_schedules(self) -> None:
@@ -2,11 +2,12 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import asyncio
5
6
  from dataclasses import dataclass, field
6
7
  from typing import TYPE_CHECKING, Any
7
8
 
8
9
  if TYPE_CHECKING:
9
- from boneio.components.template import BasicOutput
10
+ from boneio.components.output.basic import BasicOutput
10
11
 
11
12
 
12
13
  @dataclass
@@ -16,14 +17,20 @@ class WaterSource:
16
17
  A water source defines which physical outputs (valves, pumps) need to be
17
18
  activated to supply water from this particular source.
18
19
 
20
+ When multiple outputs are defined and output_start_delay_s > 0,
21
+ outputs are activated sequentially (in order) with the specified delay
22
+ between each. On deactivation, outputs are turned off in reverse order.
23
+
19
24
  Example sources:
20
25
  - City water: single valve (OUT_06)
21
- - Rainwater: valve (OUT_07) + pump (OUT_08) with pump delays
26
+ - Rainwater: valve (OUT_07) + pump (OUT_08) with 2s sequential delay
22
27
 
23
28
  Attributes:
24
29
  id: Unique identifier for this water source.
25
30
  name: Human-readable name.
26
31
  outputs: List of outputs to activate when this source is selected.
32
+ output_start_delay_s: Seconds to wait between activating each output (sequential ON).
33
+ output_stop_delay_s: Seconds to wait between deactivating each output (sequential OFF, reverse order).
27
34
  pump_start_pump_delay_s: Seconds to wait after opening valve before starting pump.
28
35
  pump_start_valve_delay_s: Seconds to wait after starting pump before opening zone valve.
29
36
  pump_stop_pump_delay_s: Seconds to wait after closing zone valve before stopping pump.
@@ -34,31 +41,57 @@ class WaterSource:
34
41
  id: str
35
42
  name: str
36
43
  outputs: list[BasicOutput] = field(default_factory=list)
44
+ output_start_delay_s: int = 0
45
+ output_stop_delay_s: int = 0
37
46
  pump_start_pump_delay_s: int = 0
38
47
  pump_start_valve_delay_s: int = 0
39
48
  pump_stop_pump_delay_s: int = 0
40
49
  pump_stop_valve_delay_s: int = 0
41
50
  pump_switch_off_during_valve_open_delay: bool = False
42
51
 
43
- async def activate(self, timestamp: float) -> None:
52
+ async def activate(self, timestamp: float) -> bool:
44
53
  """Turn ON all outputs for this water source.
45
54
 
55
+ When output_start_delay_s > 0, outputs are activated sequentially
56
+ (first to last) with the configured delay between each one.
57
+
58
+ If any output is blocked by an interlock, all already-activated
59
+ outputs are rolled back (turned off in reverse order).
60
+
46
61
  Args:
47
62
  timestamp: Current timestamp for relay control.
63
+
64
+ Returns:
65
+ True if all outputs were activated, False if any was blocked.
48
66
  """
49
- for output in self.outputs:
50
- await output.async_turn_on(timestamp=timestamp)
67
+ for i, output in enumerate(self.outputs):
68
+ result = await output.async_turn_on(timestamp=timestamp)
69
+ if not result:
70
+ # Rollback: turn off already-activated outputs in reverse
71
+ for j in range(i - 1, -1, -1):
72
+ await self.outputs[j].async_turn_off(timestamp=timestamp)
73
+ return False
74
+ if self.output_start_delay_s > 0 and i < len(self.outputs) - 1:
75
+ await asyncio.sleep(self.output_start_delay_s)
76
+ return True
51
77
 
52
78
  async def deactivate(self, timestamp: float) -> None:
53
79
  """Turn OFF all outputs for this water source.
54
80
 
81
+ When output_stop_delay_s > 0, outputs are deactivated in reverse
82
+ order (last to first) with the configured delay between each one.
83
+
55
84
  Args:
56
85
  timestamp: Current timestamp for relay control.
57
86
  """
58
- for output in self.outputs:
87
+ reversed_outputs = list(reversed(self.outputs))
88
+ for i, output in enumerate(reversed_outputs):
59
89
  await output.async_turn_off(timestamp=timestamp)
90
+ if self.output_stop_delay_s > 0 and i < len(reversed_outputs) - 1:
91
+ await asyncio.sleep(self.output_stop_delay_s)
60
92
 
61
93
  @property
62
94
  def output_ids(self) -> list[str]:
63
95
  """Return list of output IDs for display/logging."""
64
96
  return [o.id for o in self.outputs]
97
+