boneio 1.6.0.dev2__tar.gz → 1.6.0.dev4__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 (735) hide show
  1. {boneio-1.6.0.dev2/boneio.egg-info → boneio-1.6.0.dev4}/PKG-INFO +3 -3
  2. boneio-1.6.0.dev4/boneio/core/config/provenance.py +114 -0
  3. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_util.py +173 -0
  4. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/action_conditions.py +206 -9
  5. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/manager.py +53 -3
  6. boneio-1.6.0.dev4/boneio/core/manager/scheduler.py +410 -0
  7. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/sensors.py +96 -0
  8. boneio-1.6.0.dev4/boneio/core/manager/sun.py +388 -0
  9. boneio-1.6.0.dev4/boneio/core/sensor/sun.py +301 -0
  10. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system_ops.py +50 -2
  11. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/conditions.py +55 -4
  12. boneio-1.6.0.dev4/boneio/core/utils/sun.py +440 -0
  13. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/interface.py +50 -1
  14. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/homeassistant.py +93 -0
  15. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/actions.py +27 -0
  16. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/MANIFEST.sha256 +4 -6
  17. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-migrate-v2 +80 -0
  18. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-system +320 -10
  19. boneio-1.6.0.dev4/boneio/migrations/assets/issue.d/10-boneio.issue +1 -0
  20. boneio-1.6.0.dev4/boneio/migrations/assets/sudoers/boneio +16 -0
  21. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.0.json +1 -1
  22. boneio-1.6.0.dev4/boneio/migrations/plans/1.3.0.sig +0 -0
  23. boneio-1.6.0.dev4/boneio/migrations/plans/1.4.0.json +1 -0
  24. boneio-1.6.0.dev4/boneio/migrations/plans/1.4.0.sig +1 -0
  25. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.10.json +1 -0
  26. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.10.sig +2 -0
  27. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.11.json +1 -0
  28. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.11.sig +2 -0
  29. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.12.json +1 -0
  30. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.12.sig +2 -0
  31. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.5.json +1 -1
  32. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.5.sig +2 -0
  33. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.8.json +1 -1
  34. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.8.sig +1 -0
  35. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.9.json +1 -0
  36. boneio-1.6.0.dev4/boneio/migrations/plans/1.6.9.sig +0 -0
  37. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/manifest.json +1 -1
  38. boneio-1.6.0.dev4/boneio/migrations/plans/manifest.sig +0 -0
  39. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/runner.py +26 -4
  40. boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +55 -0
  41. boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_11_drop_docker_group.py +41 -0
  42. boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_12_console_shows_ip.py +58 -0
  43. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +1 -1
  44. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +1 -1
  45. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_5_trust_transition.py +2 -2
  46. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +8 -6
  47. boneio-1.6.0.dev4/boneio/migrations/versions/v1_6_9_ntp_servers.py +64 -0
  48. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/runner.py +2 -0
  49. boneio-1.6.0.dev4/boneio/schema/condition.yaml +164 -0
  50. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/schema.yaml +228 -0
  51. boneio-1.6.0.dev4/boneio/version.py +2 -0
  52. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/action_validation.py +74 -2
  53. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/app.py +30 -1
  54. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/AccountsView-iveRbldx.js +1 -0
  55. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ActionFields-DdCxR8lP.js +1 -0
  56. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AppInitContext-D9IKihqu.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/AppInitContext-CsffdB9c.js +1 -1
  57. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/BackupSection-C1qj4qOG.js +1 -0
  58. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/BindingMatrix-Bj6KE0yY.js +1 -0
  59. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/DeviceControlSection-CPmqccka.js +1 -0
  60. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/DiagnosticsView-Bi1hrIcs.js +5 -0
  61. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EditItemDialog-BH1onHq0.js +66 -0
  62. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EntityCard-yD9_Hl71.js +1 -0
  63. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/EntityGrid-BDdmT0qN.js +1 -0
  64. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/FactoryResetSection-E3xtkFLr.js +1 -0
  65. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FormInputToggle-B_NTf6g-.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/FormInputToggle-Spiz-w7l.js +1 -1
  66. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/HaDashboardWizard-f8fMg8FC.js +1 -0
  67. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/HostnameSection-DrpKbp6I.js +1 -0
  68. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/InputsView-W99g8hSl.js +1 -0
  69. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/LocationSection-ZILUsfeR.js +2 -0
  70. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/LoggerForm-Chw9zm0N.js +1 -0
  71. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LongPressWrapper-K2sCXsb5.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/LongPressWrapper-BKkWvoC1.js +1 -1
  72. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/MigrationsSection-DSbw5UVz.js +1 -0
  73. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ModbusView-CdP0fXYx.js +1 -0
  74. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BYwPAyFi.js +1 -0
  75. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/NodeRedManagement-DRMiFlH2.js +1 -0
  76. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedView-D8E1Itvk.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/NodeRedView-Ct08K8xu.js +1 -1
  77. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/OutputsView-C9sDLF1P.js +1 -0
  78. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ScheduleSection-C2qLKNWR.js +1 -0
  79. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/SecurityView-DBkwBU2t.js +1 -0
  80. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/SensorView-DNtKJE4b.js +1 -0
  81. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/Sparkline-Cq-w3bbO.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/Sparkline-D-2-v-7o.js +1 -1
  82. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/SystemState-DbY5T6BB.js +2 -0
  83. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TemplatesView-6kNzVE3p.js +1 -0
  84. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TilePicker-jd3hKaoZ.js +1 -0
  85. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/TimezoneSection-BEuXBmWp.js +1 -0
  86. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/UISettings-DIcCTtXU.js +33 -0
  87. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/ViewToggle-B8OpHNHc.js +1 -0
  88. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/aiConfig-_hPXvgdY.js +2 -0
  89. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiWizardPrompt-BRgdilYB.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/aiWizardPrompt-Dc7dZBzw.js +1 -1
  90. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/coverUtils-Cf4Uxn2U.js +1 -0
  91. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/createLucideIcon-BEjh8B3y.js +1 -0
  92. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/fa-1N_Z7Z57.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/fa-BEzM11bH.js +1 -1
  93. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/gi-iTtpUjJp.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/gi-tOlGxC0X.js +1 -1
  94. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/index-1pLHiRke.js +20 -0
  95. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-DfcdKR51.css → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/index-lVrZSgFS.css +1 -1
  96. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/monaco-drkeoggn.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/monaco-C9XC2D1j.js +3 -3
  97. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/select-D3PIwbEj.js +1 -0
  98. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/tabs-box-DQ3qtHub.js → boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/tabs-box-Byn-MOyS.js +1 -1
  99. boneio-1.6.0.dev4/boneio/webui/frontend-dist/assets/utils-B6KiDbIe.js +1 -0
  100. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/index.html +6 -4
  101. {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev4/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +212 -4
  102. {boneio-1.6.0.dev2/boneio/webui → boneio-1.6.0.dev4/boneio/webui/frontend-dist}/schema/config.schema.json +2026 -29
  103. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/event.schema.json +742 -14
  104. boneio-1.6.0.dev4/boneio/webui/frontend-dist/schema/location.schema.json +48 -0
  105. boneio-1.6.0.dev4/boneio/webui/frontend-dist/schema/schedule.schema.json +1003 -0
  106. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/web.schema.json +22 -0
  107. boneio-1.6.0.dev4/boneio/webui/frontend-dist/sw.js +1 -0
  108. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/__init__.py +4 -0
  109. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_core.py +5 -1
  110. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/onboarding.py +18 -0
  111. boneio-1.6.0.dev4/boneio/webui/routes/schedule.py +75 -0
  112. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/sensors.py +16 -1
  113. boneio-1.6.0.dev4/boneio/webui/routes/sun.py +151 -0
  114. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/system.py +157 -19
  115. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/update.py +26 -38
  116. {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev4/boneio/webui}/schema/binary_sensor.schema.json +212 -4
  117. {boneio-1.6.0.dev2/boneio/webui/frontend-dist → boneio-1.6.0.dev4/boneio/webui}/schema/config.schema.json +2026 -29
  118. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/event.schema.json +742 -14
  119. boneio-1.6.0.dev4/boneio/webui/schema/location.schema.json +48 -0
  120. boneio-1.6.0.dev4/boneio/webui/schema/schedule.schema.json +1003 -0
  121. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/web.schema.json +22 -0
  122. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/security_headers.py +31 -3
  123. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4/boneio.egg-info}/PKG-INFO +3 -3
  124. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/SOURCES.txt +70 -38
  125. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/pyproject.toml +5 -2
  126. boneio-1.6.0.dev2/boneio/migrations/assets/sudoers/boneio +0 -15
  127. boneio-1.6.0.dev2/boneio/migrations/plans/1.3.0.sig +0 -1
  128. boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.json +0 -1
  129. boneio-1.6.0.dev2/boneio/migrations/plans/1.4.0.sig +0 -0
  130. boneio-1.6.0.dev2/boneio/migrations/plans/1.6.5.sig +0 -0
  131. boneio-1.6.0.dev2/boneio/migrations/plans/1.6.8.sig +0 -1
  132. boneio-1.6.0.dev2/boneio/migrations/plans/manifest.sig +0 -1
  133. boneio-1.6.0.dev2/boneio/schema/condition.yaml +0 -76
  134. boneio-1.6.0.dev2/boneio/version.py +0 -2
  135. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/AccountsView-p4dfo1BI.js +0 -1
  136. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BackupSection-CwWiIyYm.js +0 -1
  137. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/BindingMatrix-C5N7pHyw.js +0 -1
  138. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DeviceControlSection-CiAn0q3F.js +0 -1
  139. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/DiagnosticsView-CPTuMjVr.js +0 -5
  140. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EditItemDialog-D_97HEFm.js +0 -66
  141. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityCard-Bb1AOk78.js +0 -1
  142. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/EntityGrid-CljXU2ZD.js +0 -1
  143. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/FactoryResetSection-BAzLfqax.js +0 -1
  144. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HaDashboardWizard-ie0HCjfc.js +0 -1
  145. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/HostnameSection-DFipLyZg.js +0 -1
  146. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/InputsView-Dv2ynbYD.js +0 -1
  147. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/LoggerForm-UKzOi5ri.js +0 -5
  148. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MigrationsSection-DMp9cBmP.js +0 -1
  149. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/ModbusView-Cw5Mgatj.js +0 -1
  150. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DhFBnZZZ.js +0 -1
  151. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/NodeRedManagement-C9si33mc.js +0 -1
  152. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/OutputsView-BID1iUa3.js +0 -1
  153. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SecurityView-CMCqfNQs.js +0 -1
  154. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SensorView-DMMhavyC.js +0 -1
  155. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/SystemState-BcmUoX6A.js +0 -2
  156. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TemplatesView-0sksWoxA.js +0 -1
  157. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/TimezoneSection-DkaFIcW_.js +0 -1
  158. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/UISettings-Don7-C6Q.js +0 -33
  159. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/aiConfig-BAR1rHKB.js +0 -2
  160. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/index-C8RrYuNy.js +0 -16
  161. boneio-1.6.0.dev2/boneio/webui/frontend-dist/assets/select-Xn9nmZSE.js +0 -1
  162. boneio-1.6.0.dev2/boneio/webui/frontend-dist/sw.js +0 -1
  163. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/LICENSE +0 -0
  164. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/MANIFEST.in +0 -0
  165. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/README.md +0 -0
  166. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/__init__.py +0 -0
  167. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/input.yaml +0 -0
  168. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_24_16.yaml +0 -0
  169. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_32_10.yaml +0 -0
  170. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_32_5.yaml +0 -0
  171. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_cover.yaml +0 -0
  172. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  173. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/input.yaml +0 -0
  174. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_24_16.yaml +0 -0
  175. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_32_10.yaml +0 -0
  176. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_32_5.yaml +0 -0
  177. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_cover.yaml +0 -0
  178. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  179. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/input.yaml +0 -0
  180. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_24_16.yaml +0 -0
  181. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_32_10.yaml +0 -0
  182. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_32_5.yaml +0 -0
  183. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_cover.yaml +0 -0
  184. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  185. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/input.yaml +0 -0
  186. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_24_16.yaml +0 -0
  187. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_32_10.yaml +0 -0
  188. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_cover.yaml +0 -0
  189. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  190. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/input.yaml +0 -0
  191. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_24_16.yaml +0 -0
  192. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_32_10.yaml +0 -0
  193. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_cover.yaml +0 -0
  194. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  195. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/input.yaml +0 -0
  196. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_24_16.yaml +0 -0
  197. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_32_10.yaml +0 -0
  198. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_48_4.yaml +0 -0
  199. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_cover.yaml +0 -0
  200. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  201. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/input.yaml +0 -0
  202. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_24_16.yaml +0 -0
  203. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_32_10.yaml +0 -0
  204. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_48_4.yaml +0 -0
  205. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_cover.yaml +0 -0
  206. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  207. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/input.yaml +0 -0
  208. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_24_16.yaml +0 -0
  209. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_32_10.yaml +0 -0
  210. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_48_4.yaml +0 -0
  211. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_cover.yaml +0 -0
  212. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  213. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/bonecli.py +0 -0
  214. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/__init__.py +0 -0
  215. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/__init__.py +0 -0
  216. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/cover.py +0 -0
  217. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/remote.py +0 -0
  218. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/time_based.py +0 -0
  219. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/cover/venetian.py +0 -0
  220. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/group/__init__.py +0 -0
  221. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/group/output_group.py +0 -0
  222. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/__init__.py +0 -0
  223. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/binary_sensor.py +0 -0
  224. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/detectors.py +0 -0
  225. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/event.py +0 -0
  226. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/__init__.py +0 -0
  227. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/base.py +0 -0
  228. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/input/remote/esphome.py +0 -0
  229. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/__init__.py +0 -0
  230. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/controller.py +0 -0
  231. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/irrigation/water_source.py +0 -0
  232. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/__init__.py +0 -0
  233. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/basic.py +0 -0
  234. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/buzzer.py +0 -0
  235. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/mcp.py +0 -0
  236. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/pca.py +0 -0
  237. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/pcf.py +0 -0
  238. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/output/remote.py +0 -0
  239. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/sensor/__init__.py +0 -0
  240. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/sensor/virtual_energy.py +0 -0
  241. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/__init__.py +0 -0
  242. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/alarm_panel.py +0 -0
  243. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/gate_cover.py +0 -0
  244. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/components/template/thermostat.py +0 -0
  245. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/const.py +0 -0
  246. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/__init__.py +0 -0
  247. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/__init__.py +0 -0
  248. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/cli.py +0 -0
  249. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/hashing.py +0 -0
  250. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/migration.py +0 -0
  251. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/models.py +0 -0
  252. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/auth/store.py +0 -0
  253. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/__init__.py +0 -0
  254. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/__init__.py +0 -0
  255. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  256. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  257. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  258. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/registration.py +0 -0
  259. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/cloud/secrets.py +0 -0
  260. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/__init__.py +0 -0
  261. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/config_helper.py +0 -0
  262. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/input_bindings.py +0 -0
  263. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/__init__.py +0 -0
  264. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  265. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v2_transition.py +0 -0
  266. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  267. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
  268. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/package-lock.json +0 -0
  269. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/package.json +0 -0
  270. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/schema_converter.py +0 -0
  271. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/secret_masking.py +0 -0
  272. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_compat.py +0 -0
  273. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/config/yaml_patch.py +0 -0
  274. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/containers.py +0 -0
  275. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/diagnostics/__init__.py +0 -0
  276. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/diagnostics/collect.py +0 -0
  277. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/discovery.py +0 -0
  278. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/events/__init__.py +0 -0
  279. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/events/bus.py +0 -0
  280. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/__init__.py +0 -0
  281. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/canopen.py +0 -0
  282. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/covers.py +0 -0
  283. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/display.py +0 -0
  284. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/inputs.py +0 -0
  285. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/irrigation.py +0 -0
  286. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/modbus.py +0 -0
  287. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/outputs.py +0 -0
  288. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/remote.py +0 -0
  289. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/remote_input_registrar.py +0 -0
  290. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/security_alert.py +0 -0
  291. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/__init__.py +0 -0
  292. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/alarm.py +0 -0
  293. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/gate_cover.py +0 -0
  294. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates/thermostat.py +0 -0
  295. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/templates.py +0 -0
  296. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/manager/update.py +0 -0
  297. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/__init__.py +0 -0
  298. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/basic.py +0 -0
  299. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/basic_mqtt.py +0 -0
  300. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/composite.py +0 -0
  301. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/local.py +0 -0
  302. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/lox.py +0 -0
  303. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/mqtt.py +0 -0
  304. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/messaging/queue.py +0 -0
  305. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/net/__init__.py +0 -0
  306. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/net/discovery_guard.py +0 -0
  307. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/__init__.py +0 -0
  308. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/base.py +0 -0
  309. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/can.py +0 -0
  310. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/esphome.py +0 -0
  311. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/mqtt.py +0 -0
  312. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/wled.py +0 -0
  313. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/remote/wled_cache.py +0 -0
  314. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/__init__.py +0 -0
  315. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/framing.py +0 -0
  316. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/security/posture.py +0 -0
  317. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/__init__.py +0 -0
  318. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/base.py +0 -0
  319. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/sensor/system.py +0 -0
  320. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/state/__init__.py +0 -0
  321. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/state/manager.py +0 -0
  322. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/__init__.py +0 -0
  323. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/host_data.py +0 -0
  324. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/system/monitor.py +0 -0
  325. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/__init__.py +0 -0
  326. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/async_updater.py +0 -0
  327. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/filter.py +0 -0
  328. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/font_util.py +0 -0
  329. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/logger.py +0 -0
  330. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/overlay.py +0 -0
  331. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/timeperiod.py +0 -0
  332. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/core/utils/util.py +0 -0
  333. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/adc.yaml +0 -0
  334. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  335. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/config.yaml +0 -0
  336. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/event.yaml +0 -0
  337. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/mqtt.yaml +0 -0
  338. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  339. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/adc.yaml +0 -0
  340. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  341. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/config.yaml +0 -0
  342. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/event.yaml +0 -0
  343. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/mqtt.yaml +0 -0
  344. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  345. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/adc.yaml +0 -0
  346. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  347. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/config.yaml +0 -0
  348. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/event.yaml +0 -0
  349. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/mqtt.yaml +0 -0
  350. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  351. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/__init__.py +0 -0
  352. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/can_master.yaml +0 -0
  353. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/can_slave.yaml +0 -0
  354. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/adc.yaml +0 -0
  355. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  356. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/config.yaml +0 -0
  357. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/cover.yaml +0 -0
  358. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/event.yaml +0 -0
  359. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/mqtt.yaml +0 -0
  360. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover/outputCover.yaml +0 -0
  361. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/adc.yaml +0 -0
  362. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  363. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/config.yaml +0 -0
  364. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/cover.yaml +0 -0
  365. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/event.yaml +0 -0
  366. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  367. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  368. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/adc.yaml +0 -0
  369. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  370. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  371. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  372. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  373. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/event_all.yaml +0 -0
  374. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  375. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  376. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  377. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  378. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  379. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  380. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/exceptions.py +0 -0
  381. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/__init__.py +0 -0
  382. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/analog/__init__.py +0 -0
  383. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/analog/adc.py +0 -0
  384. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/__init__.py +0 -0
  385. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/bridge.py +0 -0
  386. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/client.py +0 -0
  387. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/node.py +0 -0
  388. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/node_id.py +0 -0
  389. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/can/test_od.py +0 -0
  390. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/__init__.py +0 -0
  391. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/early_oled.py +0 -0
  392. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  393. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/display/oled.py +0 -0
  394. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/__init__.py +0 -0
  395. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  396. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  397. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  398. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  399. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/__init__.py +0 -0
  400. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/base.py +0 -0
  401. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/gpio/input/manager.py +0 -0
  402. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/__init__.py +0 -0
  403. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/bus.py +0 -0
  404. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina219.py +0 -0
  405. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina219_driver.py +0 -0
  406. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina226.py +0 -0
  407. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/ina226_driver.py +0 -0
  408. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/mcp9808.py +0 -0
  409. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/i2c/pct2075.py +0 -0
  410. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/onewire/__init__.py +0 -0
  411. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/onewire/dallas.py +0 -0
  412. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/__init__.py +0 -0
  413. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  414. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/base.py +0 -0
  415. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  416. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  417. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/__init__.py +0 -0
  418. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/interlock.py +0 -0
  419. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/integration/lox_template.py +0 -0
  420. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/__init__.py +0 -0
  421. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/daemon.json +0 -0
  422. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  423. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  424. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
  425. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  426. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  427. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-containers +0 -0
  428. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
  429. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/journald/journald.conf +0 -0
  430. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
  431. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/migrations-recovery.pem +0 -0
  432. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/migrations.pem +0 -0
  433. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  434. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  435. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
  436. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
  437. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
  438. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
  439. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  440. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  441. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/boneio.service +0 -0
  442. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
  443. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
  444. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
  445. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
  446. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
  447. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/linger-marker +0 -0
  448. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  449. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  450. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  451. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  452. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  453. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  454. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  455. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  456. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  457. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  458. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.1.json +0 -0
  459. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.1.sig +0 -0
  460. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.2.json +0 -0
  461. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.3.2.sig +0 -0
  462. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.3.json +0 -0
  463. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.3.sig +0 -0
  464. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.4.json +0 -0
  465. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.4.4.sig +0 -0
  466. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.0.json +0 -0
  467. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.0.sig +0 -0
  468. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.1.json +0 -0
  469. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.1.sig +0 -0
  470. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.10.json +0 -0
  471. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.10.sig +0 -0
  472. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.11.json +0 -0
  473. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.11.sig +0 -0
  474. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.12.json +0 -0
  475. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.12.sig +0 -0
  476. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.13.json +0 -0
  477. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.13.sig +0 -0
  478. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.14.json +0 -0
  479. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.14.sig +0 -0
  480. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.15.json +0 -0
  481. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.15.sig +0 -0
  482. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.16.json +0 -0
  483. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.16.sig +0 -0
  484. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.17.json +0 -0
  485. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.17.sig +0 -0
  486. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.18.json +0 -0
  487. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.18.sig +0 -0
  488. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.2.json +0 -0
  489. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.2.sig +0 -0
  490. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.3.json +0 -0
  491. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.3.sig +0 -0
  492. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.4.json +0 -0
  493. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.4.sig +0 -0
  494. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.5.json +0 -0
  495. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.5.sig +0 -0
  496. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.6.json +0 -0
  497. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.6.sig +0 -0
  498. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.7.json +0 -0
  499. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.7.sig +0 -0
  500. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.8.json +0 -0
  501. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.8.sig +0 -0
  502. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.9.json +0 -0
  503. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.5.9.sig +0 -0
  504. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.0.json +0 -0
  505. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.0.sig +0 -0
  506. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.1.json +0 -0
  507. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.1.sig +0 -0
  508. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.2.json +0 -0
  509. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.2.sig +0 -0
  510. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.3.json +0 -0
  511. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.3.sig +0 -0
  512. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.4.json +0 -0
  513. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.4.sig +0 -0
  514. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.6.json +0 -0
  515. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.6.sig +0 -0
  516. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.7.json +0 -0
  517. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/plans/1.6.7.sig +0 -0
  518. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/__init__.py +0 -0
  519. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  520. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  521. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  522. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  523. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  524. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  525. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  526. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
  527. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
  528. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
  529. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
  530. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
  531. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
  532. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
  533. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
  534. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
  535. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  536. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  537. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  538. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  539. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
  540. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
  541. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
  542. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
  543. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
  544. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
  545. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
  546. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
  547. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
  548. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
  549. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/__init__.py +0 -0
  550. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/cli.py +0 -0
  551. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/client.py +0 -0
  552. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/coordinator.py +0 -0
  553. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/__init__.py +0 -0
  554. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  555. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  556. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  557. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  558. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  559. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  560. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  561. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  562. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
  563. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  564. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  565. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/thessla.json +0 -0
  566. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  567. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  568. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/inverters/sofar.json +0 -0
  569. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  570. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  571. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  572. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  573. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/cwt.json +0 -0
  574. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  575. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  576. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  577. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  578. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/pt100.json +0 -0
  579. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  580. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/sht20.json +0 -0
  581. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/devices/sensors/sht30.json +0 -0
  582. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/__init__.py +0 -0
  583. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/base.py +0 -0
  584. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/__init__.py +0 -0
  585. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/numeric.py +0 -0
  586. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/select.py +0 -0
  587. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/switch.py +0 -0
  588. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/derived/text.py +0 -0
  589. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/__init__.py +0 -0
  590. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/binary.py +0 -0
  591. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/numeric.py +0 -0
  592. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/sensor/text.py +0 -0
  593. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/__init__.py +0 -0
  594. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/binary.py +0 -0
  595. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/entities/writeable/numeric.py +0 -0
  596. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/mock_coordinator.py +0 -0
  597. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/modbus/utils.py +0 -0
  598. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/__init__.py +0 -0
  599. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/actions.py +0 -0
  600. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/events.py +0 -0
  601. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/files.py +0 -0
  602. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/logs.py +0 -0
  603. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/mqtt.py +0 -0
  604. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/models/state.py +0 -0
  605. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions.yaml +0 -0
  606. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions_sensor.yaml +0 -0
  607. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/actions_switch.yaml +0 -0
  608. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/filters.yaml +0 -0
  609. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/filters_adc.yaml +0 -0
  610. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/id.yaml +0 -0
  611. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_devices.yaml +0 -0
  612. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_inputs.yaml +0 -0
  613. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/remote_outputs.yaml +0 -0
  614. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/temp_unit.yaml +0 -0
  615. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/schema/update_interval.yaml +0 -0
  616. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/dashboard_cards.py +0 -0
  617. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/axios-uEi8e3Ln.js +0 -0
  618. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  619. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/chunk-QTnfLwEv.js +0 -0
  620. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  621. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  622. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/configCache-CLN4xEny.js +0 -0
  623. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  624. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  625. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
  626. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  627. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-DUFfd7ef.js +0 -0
  628. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/monaco-Dpn-hvLa.js +0 -0
  629. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  630. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/assets/yaml.worker-8qQfrID5.js +0 -0
  631. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  632. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  633. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio.svg +0 -0
  634. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  635. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  636. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  637. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  638. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  639. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  640. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  641. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  642. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  643. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
  644. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  645. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  646. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  647. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  648. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  649. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  650. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  651. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  652. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  653. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  654. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  655. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  656. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  657. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  658. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  659. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  660. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  661. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  662. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  663. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  664. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
  665. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/hvac_svg_templates.py +0 -0
  666. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/__init__.py +0 -0
  667. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/auth.py +0 -0
  668. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/csrf.py +0 -0
  669. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/middleware/policy.py +0 -0
  670. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/modbus_card_templates.py +0 -0
  671. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/rate_limit.py +0 -0
  672. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/accounts.py +0 -0
  673. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/auth.py +0 -0
  674. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/can.py +0 -0
  675. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config.py +0 -0
  676. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_actions.py +0 -0
  677. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_backups.py +0 -0
  678. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_discovery.py +0 -0
  679. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/config_files.py +0 -0
  680. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/covers.py +0 -0
  681. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/dashboard.py +0 -0
  682. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/dev_fake_device.py +0 -0
  683. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/diagnostics.py +0 -0
  684. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/irrigation.py +0 -0
  685. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/migrations.py +0 -0
  686. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/modbus.py +0 -0
  687. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/mqtt_reference.py +0 -0
  688. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/nodered.py +0 -0
  689. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/outputs.py +0 -0
  690. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/remote_devices.py +0 -0
  691. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/security.py +0 -0
  692. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/templates.py +0 -0
  693. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/timezone_sudoers.py +0 -0
  694. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/routes/tools.py +0 -0
  695. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/adc.schema.json +0 -0
  696. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/areas.schema.json +0 -0
  697. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/boneio.schema.json +0 -0
  698. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/can.schema.json +0 -0
  699. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/cover.schema.json +0 -0
  700. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/dallas.schema.json +0 -0
  701. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ds2482.schema.json +0 -0
  702. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ina219.schema.json +0 -0
  703. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/ina226.schema.json +0 -0
  704. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/irrigation.schema.json +0 -0
  705. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/lm75.schema.json +0 -0
  706. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/logger.schema.json +0 -0
  707. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/lox_udp.schema.json +0 -0
  708. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mcp23017.schema.json +0 -0
  709. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mcp9808.schema.json +0 -0
  710. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/modbus.schema.json +0 -0
  711. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  712. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/mqtt.schema.json +0 -0
  713. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/oled.schema.json +0 -0
  714. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/output.schema.json +0 -0
  715. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/output_group.schema.json +0 -0
  716. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/pca9685.schema.json +0 -0
  717. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/pcf8575.schema.json +0 -0
  718. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_devices.schema.json +0 -0
  719. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  720. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  721. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/sensor.schema.json +0 -0
  722. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/template.schema.json +0 -0
  723. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  724. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/services/__init__.py +0 -0
  725. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/services/logs.py +0 -0
  726. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/sudo_rate_limiter.py +0 -0
  727. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/web_server.py +0 -0
  728. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio/webui/websocket_manager.py +0 -0
  729. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/dependency_links.txt +0 -0
  730. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/entry_points.txt +0 -0
  731. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/requires.txt +0 -0
  732. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/boneio.egg-info/top_level.txt +0 -0
  733. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/setup.cfg +0 -0
  734. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/setup.py +0 -0
  735. {boneio-1.6.0.dev2 → boneio-1.6.0.dev4}/tests/test_py313_compatibility.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.6.0.dev2
3
+ Version: 1.6.0.dev4
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
7
7
  Project-URL: Homepage, https://boneio.eu
8
- Project-URL: Repository, https://github.com/boneIO-eu/app_bbb
8
+ Project-URL: Repository, https://github.com/boneIO-eu/app_black
9
9
  Project-URL: Documentation, https://boneio.eu/docs/intro/
10
- Project-URL: Changelog, https://github.com/boneIO-eu/app_bbb/releases
10
+ Project-URL: Changelog, https://github.com/boneIO-eu/app_black/releases
11
11
  Requires-Python: >=3.13
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
@@ -0,0 +1,114 @@
1
+ """Tell a freshly flashed controller from one that has been in service.
2
+
3
+ The first-run wizard has two steps that are only appropriate on a blank
4
+ device. The import step offers to restore a configuration, which on a device
5
+ that already has one reads as "yours is gone". The devices step is worse than
6
+ misleading: it replaces the whole ``event`` section, so a controller with fifty
7
+ configured inputs loses them to a wizard its owner opened only to create an
8
+ account.
9
+
10
+ So the question has to be answered before those steps are offered, and the two
11
+ ways of getting it wrong are not equally bad:
12
+
13
+ * Treating an upgraded device as fresh costs the owner their configuration.
14
+ * Treating a fresh device as upgraded costs them a step in a wizard; they
15
+ can still import and bind inputs from the normal interface afterwards.
16
+
17
+ This module is therefore written to answer "is it fresh" and to say no when it
18
+ cannot tell. Freshness has to be demonstrated, not assumed.
19
+
20
+ The demonstration is that the configuration is still the factory one. The image
21
+ copies a variant out of ``~/.cache/boneio_configs/<variant>/`` verbatim, and
22
+ per-device work touches only ``mqtt.yaml`` (the broker password), so a
23
+ controller nobody has configured yet still has a ``config.yaml`` byte-identical
24
+ to its template.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import logging
30
+ import os
31
+ from pathlib import Path
32
+
33
+ _LOGGER = logging.getLogger(__name__)
34
+
35
+ #: Where the image leaves the per-variant templates it seeded the device from.
36
+ FACTORY_TEMPLATE_DIR = Path.home() / ".cache" / "boneio_configs"
37
+
38
+
39
+ def _digest(path: Path) -> bytes | None:
40
+ """Read a file for comparison.
41
+
42
+ Args:
43
+ path: File to read.
44
+
45
+ Returns:
46
+ Its contents, or None when it cannot be read.
47
+ """
48
+ try:
49
+ return path.read_bytes()
50
+ except OSError:
51
+ return None
52
+
53
+
54
+ def looks_factory_fresh(
55
+ config_path: str | os.PathLike[str],
56
+ template_dir: str | os.PathLike[str] | None = None,
57
+ ) -> bool:
58
+ """Whether this device still carries an untouched factory configuration.
59
+
60
+ Args:
61
+ config_path: The device's ``config.yaml``.
62
+ template_dir: Where the per-variant templates live. Defaults to
63
+ :data:`FACTORY_TEMPLATE_DIR`.
64
+
65
+ Returns:
66
+ True only when freshness can be positively shown: there is no
67
+ configuration at all, or the configuration is identical to one of the
68
+ templates the image ships. False whenever the answer is not certain.
69
+ """
70
+ config = Path(config_path)
71
+ current = _digest(config)
72
+ if current is None:
73
+ # Nothing to lose, and nothing that an import could overwrite.
74
+ _LOGGER.debug("No configuration at %s — treating the device as fresh", config)
75
+ return True
76
+
77
+ root = Path(template_dir) if template_dir is not None else FACTORY_TEMPLATE_DIR
78
+ try:
79
+ variants = sorted(p for p in root.iterdir() if p.is_dir())
80
+ except OSError:
81
+ # No templates to compare against: the honest answer is "cannot tell",
82
+ # and the safe reading of that is "assume it has been configured".
83
+ _LOGGER.debug("No factory templates under %s — assuming configured", root)
84
+ return False
85
+
86
+ for variant in variants:
87
+ if current == _digest(variant / "config.yaml"):
88
+ _LOGGER.debug("Configuration matches the %s template", variant.name)
89
+ return True
90
+
91
+ return False
92
+
93
+
94
+ def was_configured_before(
95
+ config_path: str | os.PathLike[str],
96
+ had_legacy_auth: bool = False,
97
+ template_dir: str | os.PathLike[str] | None = None,
98
+ ) -> bool:
99
+ """Whether the wizard should skip the steps that assume a blank device.
100
+
101
+ Args:
102
+ config_path: The device's ``config.yaml``.
103
+ had_legacy_auth: Whether a pre-1.6 ``web.auth`` block was found. It
104
+ proves the device is not fresh, but its absence proves nothing —
105
+ most 1.5.x controllers never had web authentication at all, which
106
+ is exactly the case this used to get wrong.
107
+ template_dir: Passed through to :func:`looks_factory_fresh`.
108
+
109
+ Returns:
110
+ True when the device already has a configuration of its own.
111
+ """
112
+ if had_legacy_auth:
113
+ return True
114
+ return not looks_factory_fresh(config_path, template_dir)
@@ -773,6 +773,179 @@ class CustomValidator(Validator):
773
773
  kwarg = unit_to_kwarg[one_of(*unit_to_kwarg)(unit_str)]
774
774
  return TimePeriod(**{kwarg: float(match.group(1))})
775
775
 
776
+ def _normalize_coerce_sun_offset(self, value) -> float:
777
+ """Parse a signed offset from a sun anchor into seconds.
778
+
779
+ Unlike ``positive_time_period`` this must accept negative values —
780
+ "half an hour before sunset" is the whole point — and it returns plain
781
+ seconds rather than a TimePeriod, because the only thing that ever
782
+ happens to it is being added to a datetime.
783
+
784
+ A bare number means **seconds**, not milliseconds. That differs from
785
+ ``positive_time_period`` deliberately: a sun offset measured in
786
+ milliseconds would be meaningless, and the frontend always sends a unit.
787
+
788
+ Args:
789
+ value: ``"-30min"``, ``"1h"``, ``"45s"``, or a number of seconds.
790
+
791
+ Returns:
792
+ The offset in seconds, negative for "before".
793
+
794
+ Raises:
795
+ ConfigurationException: If the value cannot be read as an offset.
796
+ """
797
+ if value is None or value == "":
798
+ return 0.0
799
+ if isinstance(value, bool):
800
+ raise ConfigurationException(f"Expected a sun offset, got {value!r}")
801
+ if isinstance(value, (int, float)):
802
+ return float(value)
803
+
804
+ text = str(value).strip().lower()
805
+ if not text:
806
+ return 0.0
807
+
808
+ match = re.match(r"^([-+]?[0-9]*\.?[0-9]+)\s*(\w*)$", text)
809
+ if match is None:
810
+ raise ConfigurationException(
811
+ f"Expected an offset like '-30min', '15m' or '1h', got {value!r}"
812
+ )
813
+
814
+ unit_to_seconds = {
815
+ "": 1.0,
816
+ "s": 1.0,
817
+ "sec": 1.0,
818
+ "secs": 1.0,
819
+ "second": 1.0,
820
+ "seconds": 1.0,
821
+ "m": 60.0,
822
+ "min": 60.0,
823
+ "mins": 60.0,
824
+ "minute": 60.0,
825
+ "minutes": 60.0,
826
+ "h": 3600.0,
827
+ "hour": 3600.0,
828
+ "hours": 3600.0,
829
+ }
830
+ unit = match.group(2)
831
+ if unit not in unit_to_seconds:
832
+ raise ConfigurationException(
833
+ f"Unknown unit {unit!r} in sun offset {value!r}. Use s, min or h."
834
+ )
835
+ return float(match.group(1)) * unit_to_seconds[unit]
836
+
837
+ def _check_with_schedule_shape(self, field, value):
838
+ """Reject a schedule whose trigger does not match its own type.
839
+
840
+ Cerberus can require a dict and check each field on its own, but not
841
+ "a sun trigger needs an event and a time trigger needs a time". Left to
842
+ runtime the symptom is a schedule that quietly never fires, which is
843
+ the hardest kind of misconfiguration to notice.
844
+ """
845
+ if not isinstance(value, dict):
846
+ return
847
+
848
+ trigger = value.get("trigger") or {}
849
+ kind = trigger.get("type", "sun")
850
+
851
+ if kind == "sun":
852
+ from boneio.core.utils.sun import ANCHOR_NAMES
853
+
854
+ event = trigger.get("event")
855
+ if not event:
856
+ self._error( # type: ignore[attr-defined]
857
+ field, "A sun trigger needs an 'event', e.g. sunset or civil_dusk."
858
+ )
859
+ elif event not in ANCHOR_NAMES:
860
+ self._error( # type: ignore[attr-defined]
861
+ field,
862
+ f"Unknown sun event {event!r}. "
863
+ f"Expected one of: {', '.join(sorted(ANCHOR_NAMES))}.",
864
+ )
865
+ if trigger.get("at"):
866
+ self._error( # type: ignore[attr-defined]
867
+ field, "'at' belongs to a time trigger, not a sun trigger."
868
+ )
869
+ elif kind == "time":
870
+ if not trigger.get("at"):
871
+ self._error( # type: ignore[attr-defined]
872
+ field, "A time trigger needs 'at' in HH:MM."
873
+ )
874
+ if trigger.get("event"):
875
+ self._error( # type: ignore[attr-defined]
876
+ field, "'event' belongs to a sun trigger, not a time trigger."
877
+ )
878
+
879
+ if not value.get("actions"):
880
+ self._error( # type: ignore[attr-defined]
881
+ field, "A schedule with no actions would fire and do nothing."
882
+ )
883
+
884
+ def _check_with_condition_shape(self, field, value):
885
+ """Reject a condition whose fields do not match its own type.
886
+
887
+ Cerberus can say "this is a dict of allowed keys" but not "a sun
888
+ condition is one of three shapes and never a mixture". Without this a
889
+ typo like ``type: sun`` with ``after: "05:00"`` reaches runtime, where
890
+ the only symptom is an action that silently never fires.
891
+ """
892
+ if not isinstance(value, dict):
893
+ return
894
+ if value.get("type") != "sun":
895
+ return
896
+
897
+ from boneio.core.utils.sun import ANCHOR_NAMES, PHASE_NAMES
898
+
899
+ window = [key for key in ("after", "before") if value.get(key)]
900
+ phase = value.get("phase")
901
+ elevation = [key for key in ("above", "below") if value.get(key) is not None]
902
+
903
+ modes = [bool(window), bool(phase), bool(elevation)]
904
+ if sum(modes) == 0:
905
+ self._error( # type: ignore[attr-defined]
906
+ field,
907
+ "A sun condition needs one of: after/before (anchors), "
908
+ "phase, or above/below (elevation in degrees).",
909
+ )
910
+ return
911
+ if sum(modes) > 1:
912
+ self._error( # type: ignore[attr-defined]
913
+ field,
914
+ "A sun condition must use only one of after/before, phase, or "
915
+ "above/below — not a mixture.",
916
+ )
917
+ return
918
+
919
+ for key in ("after", "before"):
920
+ anchor = value.get(key)
921
+ if anchor and anchor not in ANCHOR_NAMES:
922
+ self._error( # type: ignore[attr-defined]
923
+ field,
924
+ f"Unknown sun anchor {anchor!r} in '{key}'. "
925
+ f"Expected one of: {', '.join(sorted(ANCHOR_NAMES))}.",
926
+ )
927
+
928
+ for key, other in (("after_offset", "after"), ("before_offset", "before")):
929
+ if value.get(key) and not value.get(other):
930
+ self._error( # type: ignore[attr-defined]
931
+ field, f"'{key}' has no effect without '{other}'."
932
+ )
933
+
934
+ if phase and phase not in PHASE_NAMES:
935
+ self._error( # type: ignore[attr-defined]
936
+ field,
937
+ f"Unknown sun phase {phase!r}. "
938
+ f"Expected one of: {', '.join(sorted(PHASE_NAMES))}.",
939
+ )
940
+
941
+ above, below = value.get("above"), value.get("below")
942
+ if above is not None and below is not None and above >= below:
943
+ self._error( # type: ignore[attr-defined]
944
+ field,
945
+ f"'above' ({above}) must be lower than 'below' ({below}); "
946
+ "the pair describes a band of elevations.",
947
+ )
948
+
776
949
  def _lookup_field(self, path: str) -> tuple:
777
950
  """
778
951
  Implement relative paths with dot (.) notation, following Python
@@ -8,6 +8,8 @@ Optimisations over the generic conditions.py:
8
8
  - datetime.now() is called ONCE per execute_actions() batch
9
9
  - time/date strings are parsed once (at config load) rather than each press
10
10
  - state_resolver results can be cached within an evaluation cycle
11
+ - sun conditions hold the provider, which caches a day of anchors, so a
12
+ button press reads two datetimes instead of computing ephemerides
11
13
  - dedicated logger `boneio.action_conditions` for easy filtering
12
14
 
13
15
  Usage:
@@ -21,9 +23,14 @@ from __future__ import annotations
21
23
 
22
24
  import logging
23
25
  from collections.abc import Callable
24
- from datetime import datetime
26
+ from datetime import datetime, timedelta
25
27
  from datetime import time as dt_time
26
- from typing import Any
28
+ from typing import TYPE_CHECKING, Any
29
+
30
+ from boneio.core.utils import sun as sun_utils
31
+
32
+ if TYPE_CHECKING:
33
+ from boneio.core.manager.sun import SunProvider
27
34
 
28
35
  _LOGGER = logging.getLogger("boneio.action_conditions")
29
36
 
@@ -90,6 +97,170 @@ class _DateCondition:
90
97
  return True
91
98
 
92
99
 
100
+ class _SunCondition:
101
+ """Pre-parsed sun condition: a window between anchors, a phase, or an angle.
102
+
103
+ Nothing is computed here at compile time. Anchor *times* change every day,
104
+ so the only thing worth pre-resolving is which anchors were asked for; the
105
+ provider hands back a cached day at evaluation time.
106
+ """
107
+
108
+ __slots__ = (
109
+ "mode",
110
+ "after",
111
+ "after_offset",
112
+ "before",
113
+ "before_offset",
114
+ "phase",
115
+ "above",
116
+ "below",
117
+ "_provider",
118
+ "_warned",
119
+ )
120
+
121
+ def __init__(
122
+ self,
123
+ provider: SunProvider | None,
124
+ *,
125
+ after: str | None = None,
126
+ after_offset: float = 0.0,
127
+ before: str | None = None,
128
+ before_offset: float = 0.0,
129
+ phase: str | None = None,
130
+ above: float | None = None,
131
+ below: float | None = None,
132
+ ) -> None:
133
+ self._provider = provider
134
+ self._warned = False
135
+ self.after = after
136
+ self.after_offset = after_offset
137
+ self.before = before
138
+ self.before_offset = before_offset
139
+ self.phase = phase
140
+ self.above = above
141
+ self.below = below
142
+ if phase:
143
+ self.mode = "phase"
144
+ elif above is not None or below is not None:
145
+ self.mode = "elevation"
146
+ else:
147
+ self.mode = "window"
148
+
149
+ # -- anchor resolution ------------------------------------------------
150
+
151
+ def _resolve(
152
+ self,
153
+ name: str,
154
+ offset: float,
155
+ now: datetime,
156
+ anchors: dict[str, datetime | None],
157
+ day_start: datetime,
158
+ day_end: datetime,
159
+ ) -> datetime:
160
+ """Turn an anchor name into an instant, polar days included.
161
+
162
+ A missing anchor is not "unknown" — it means the Sun stayed on one side
163
+ of that angle all day, and which side decides whether the bound should
164
+ collapse to the start or the end of the day. Getting this backwards is
165
+ how a window meant to mean "while it is dark" ends up covering a polar
166
+ summer.
167
+ """
168
+ moment = anchors.get(name)
169
+ if moment is not None:
170
+ return moment + timedelta(seconds=offset)
171
+
172
+ threshold, rising = sun_utils.ANCHORS.get(name, (None, True))
173
+ if threshold is None or self._provider is None:
174
+ return day_end
175
+
176
+ # `now`, not the wall clock: the day being asked about is the one the
177
+ # anchors came from, which is not necessarily today.
178
+ state = self._provider.threshold_state(threshold, now)
179
+ if state == "always_above":
180
+ # The Sun is permanently past this angle: a crossing upward is
181
+ # behind us, a crossing downward is still ahead.
182
+ return day_start if rising else day_end
183
+ if state == "always_below":
184
+ return day_end if rising else day_start
185
+ return day_end
186
+
187
+ # -- evaluation -------------------------------------------------------
188
+
189
+ def evaluate(self, now: datetime) -> bool:
190
+ """Check *now* against this condition.
191
+
192
+ Returns:
193
+ True when the condition holds. Also True when the Sun's position
194
+ cannot be known — no ``location:``, or a clock that has not been
195
+ set — which matches how every other condition treats a
196
+ configuration error: it does not block the action. The web UI
197
+ refuses to save a sun condition without a location, so this path
198
+ means something changed underneath a running device.
199
+ """
200
+ provider = self._provider
201
+ if provider is None or not provider.ready(now):
202
+ if not self._warned:
203
+ self._warned = True
204
+ _LOGGER.error(
205
+ "Sun condition cannot be evaluated (no location, or the "
206
+ "clock is not set yet) — allowing the action."
207
+ )
208
+ return True
209
+
210
+ if self.mode == "phase":
211
+ return bool(provider.in_phase(self.phase, now))
212
+
213
+ if self.mode == "elevation":
214
+ elevation = provider.elevation(now)
215
+ if elevation is None:
216
+ return True
217
+ if self.above is not None and elevation <= self.above:
218
+ return False
219
+ return not (self.below is not None and elevation >= self.below)
220
+
221
+ anchors = provider.anchors(now)
222
+ if not anchors:
223
+ return True
224
+
225
+ local = now.astimezone(provider.timezone)
226
+ day_start = local.replace(hour=0, minute=0, second=0, microsecond=0)
227
+ day_end = day_start + timedelta(days=1)
228
+
229
+ start = (
230
+ self._resolve(
231
+ self.after, self.after_offset, now, anchors, day_start, day_end
232
+ )
233
+ if self.after
234
+ else None
235
+ )
236
+ end = (
237
+ self._resolve(
238
+ self.before, self.before_offset, now, anchors, day_start, day_end
239
+ )
240
+ if self.before
241
+ else None
242
+ )
243
+
244
+ if start is not None and end is not None:
245
+ if start <= end:
246
+ return start <= now < end
247
+ # Crosses midnight, e.g. sunset → sunrise. Same rule as a time
248
+ # window, and the same rule that makes a polar-night window empty.
249
+ return now >= start or now < end
250
+ if start is not None:
251
+ return now >= start
252
+ if end is not None:
253
+ return now < end
254
+ return True
255
+
256
+ def __repr__(self) -> str: # pragma: no cover - diagnostics only
257
+ if self.mode == "phase":
258
+ return f"<sun phase={self.phase}>"
259
+ if self.mode == "elevation":
260
+ return f"<sun above={self.above} below={self.below}>"
261
+ return f"<sun {self.after}+{self.after_offset:g}s .. {self.before}+{self.before_offset:g}s>"
262
+
263
+
93
264
  class _StateCondition:
94
265
  """Pre-parsed state condition with compile-time resolved evaluator.
95
266
 
@@ -190,7 +361,7 @@ class _ConditionGroup:
190
361
 
191
362
  def __init__(
192
363
  self,
193
- items: list[_TimeCondition | _DateCondition | _StateCondition],
364
+ items: list[_TimeCondition | _DateCondition | _StateCondition | _SunCondition],
194
365
  use_all: bool,
195
366
  ) -> None:
196
367
  self.items = items
@@ -212,7 +383,7 @@ class _ConditionGroup:
212
383
 
213
384
 
214
385
  def _eval_single(
215
- cond: _TimeCondition | _DateCondition | _StateCondition,
386
+ cond: _TimeCondition | _DateCondition | _StateCondition | _SunCondition,
216
387
  now: datetime,
217
388
  state_resolver: Callable[[str, str], Any] | None,
218
389
  ) -> bool:
@@ -221,6 +392,8 @@ def _eval_single(
221
392
  return cond.evaluate(now)
222
393
  if isinstance(cond, _DateCondition):
223
394
  return cond.evaluate(now)
395
+ if isinstance(cond, _SunCondition):
396
+ return cond.evaluate(now)
224
397
  if isinstance(cond, _StateCondition):
225
398
  return cond.evaluate(state_resolver)
226
399
  return True
@@ -248,13 +421,32 @@ def _parse_date(s: str) -> tuple[int, int]:
248
421
  raise ValueError(f"Invalid date format: '{s}'")
249
422
 
250
423
 
251
- def _compile_single(raw: dict) -> _TimeCondition | _DateCondition | _StateCondition | None:
424
+ def _compile_single(
425
+ raw: dict,
426
+ sun_provider: SunProvider | None = None,
427
+ ) -> _TimeCondition | _DateCondition | _StateCondition | _SunCondition | None:
252
428
  """Compile a single condition dict into a fast evaluator.
253
429
 
254
- Returns None if the condition is invalid (logs a warning).
430
+ Args:
431
+ raw: One condition from the config.
432
+ sun_provider: The manager's provider, needed only by sun conditions.
433
+
434
+ Returns:
435
+ A compiled condition, or None if it is invalid (logs an error).
255
436
  """
256
437
  ctype = raw.get("type")
257
438
  try:
439
+ if ctype == "sun":
440
+ return _SunCondition(
441
+ sun_provider,
442
+ after=raw.get("after"),
443
+ after_offset=float(raw.get("after_offset") or 0.0),
444
+ before=raw.get("before"),
445
+ before_offset=float(raw.get("before_offset") or 0.0),
446
+ phase=raw.get("phase"),
447
+ above=None if raw.get("above") is None else float(raw["above"]),
448
+ below=None if raw.get("below") is None else float(raw["below"]),
449
+ )
258
450
  if ctype == "time":
259
451
  after = _parse_time(raw["after"]) if raw.get("after") else None
260
452
  before = _parse_time(raw["before"]) if raw.get("before") else None
@@ -283,7 +475,8 @@ def _compile_single(raw: dict) -> _TimeCondition | _DateCondition | _StateCondit
283
475
 
284
476
  def precompile_conditions(
285
477
  action_definition: dict,
286
- ) -> _ConditionGroup | _TimeCondition | _DateCondition | _StateCondition | None:
478
+ sun_provider: SunProvider | None = None,
479
+ ) -> _ConditionGroup | _TimeCondition | _DateCondition | _StateCondition | _SunCondition | None:
287
480
  """Pre-compile conditions from a parsed action definition.
288
481
 
289
482
  Call this once (at config load / parse_actions time) and store the
@@ -292,6 +485,9 @@ def precompile_conditions(
292
485
  Args:
293
486
  action_definition: A single action dict that may contain
294
487
  ``condition`` (single) or ``conditions`` (group).
488
+ sun_provider: The manager's :class:`SunProvider`. Held by reference, so
489
+ reconfiguring the location reaches conditions that were compiled
490
+ before the change without recompiling them.
295
491
 
296
492
  Returns:
297
493
  A compiled condition object, or None if there are no conditions.
@@ -300,7 +496,7 @@ def precompile_conditions(
300
496
  multi = action_definition.get("conditions")
301
497
 
302
498
  if single:
303
- return _compile_single(single)
499
+ return _compile_single(single, sun_provider)
304
500
 
305
501
  if multi:
306
502
  mode = multi.get("mode", "and")
@@ -309,7 +505,7 @@ def precompile_conditions(
309
505
  return None
310
506
  compiled = []
311
507
  for raw in cond_list:
312
- item = _compile_single(raw)
508
+ item = _compile_single(raw, sun_provider)
313
509
  if item is not None:
314
510
  compiled.append(item)
315
511
  if not compiled:
@@ -324,6 +520,7 @@ def should_execute_action(
324
520
  | _TimeCondition
325
521
  | _DateCondition
326
522
  | _StateCondition
523
+ | _SunCondition
327
524
  | None,
328
525
  now: datetime,
329
526
  state_resolver: Callable[[str, str], Any] | None = None,