boneio 1.3.0.dev14__tar.gz → 1.3.0.dev17__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 (416) hide show
  1. {boneio-1.3.0.dev14/boneio.egg-info → boneio-1.3.0.dev17}/PKG-INFO +1 -1
  2. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/bonecli.py +4 -1
  3. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/irrigation/controller.py +67 -21
  4. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/sensor/virtual_energy.py +98 -77
  5. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/migrations/__init__.py +2 -1
  6. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/yaml_util.py +286 -234
  7. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/display.py +11 -1
  8. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/irrigation.py +3 -3
  9. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/manager.py +3 -0
  10. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/remote.py +191 -237
  11. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/sensors.py +282 -230
  12. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/update.py +9 -4
  13. boneio-1.3.0.dev17/boneio/core/messaging/__init__.py +21 -0
  14. boneio-1.3.0.dev17/boneio/core/messaging/composite.py +85 -0
  15. boneio-1.3.0.dev17/boneio/core/messaging/lox.py +221 -0
  16. boneio-1.3.0.dev17/boneio/core/messaging/loxone.py +181 -0
  17. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/messaging/mqtt.py +3 -0
  18. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/__init__.py +1 -1
  19. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/base.py +3 -3
  20. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/system/host_data.py +17 -0
  21. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/integration/homeassistant.py +9 -0
  22. boneio-1.3.0.dev17/boneio/integration/lox_template.py +243 -0
  23. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/events.py +17 -1
  24. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/runner.py +89 -64
  25. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/remote_devices.yaml +8 -8
  26. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/schema.yaml +39 -0
  27. boneio-1.3.0.dev17/boneio/version.py +2 -0
  28. boneio-1.3.0.dev14/boneio/webui/frontend-dist/assets/ConfigEditor-CrqODtD9.js → boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/ConfigEditor-QHQCOrq6.js +1 -1
  29. boneio-1.3.0.dev14/boneio/webui/frontend-dist/assets/index-CCPsr7-u.css → boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/index-BvmO3gdL.css +1 -1
  30. boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/index-Dzdilk6s.js +44 -0
  31. boneio-1.3.0.dev17/boneio/webui/frontend-dist/assets/useTranslation-DjBDGbAU.js +13 -0
  32. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/index.html +3 -3
  33. {boneio-1.3.0.dev14/boneio/webui → boneio-1.3.0.dev17/boneio/webui/frontend-dist}/schema/config.schema.json +80 -0
  34. boneio-1.3.0.dev17/boneio/webui/frontend-dist/schema/lox_udp.schema.json +64 -0
  35. {boneio-1.3.0.dev14/boneio/webui → boneio-1.3.0.dev17/boneio/webui/frontend-dist}/schema/mqtt.schema.json +22 -0
  36. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/sw.js +1 -1
  37. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/config.py +319 -262
  38. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/irrigation.py +43 -36
  39. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/modbus.py +4 -1
  40. {boneio-1.3.0.dev14/boneio/webui/frontend-dist → boneio-1.3.0.dev17/boneio/webui}/schema/config.schema.json +80 -0
  41. boneio-1.3.0.dev17/boneio/webui/schema/lox_udp.schema.json +64 -0
  42. {boneio-1.3.0.dev14/boneio/webui/frontend-dist → boneio-1.3.0.dev17/boneio/webui}/schema/mqtt.schema.json +22 -0
  43. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17/boneio.egg-info}/PKG-INFO +1 -1
  44. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio.egg-info/SOURCES.txt +10 -4
  45. boneio-1.3.0.dev14/boneio/core/messaging/__init__.py +0 -13
  46. boneio-1.3.0.dev14/boneio/version.py +0 -2
  47. boneio-1.3.0.dev14/boneio/webui/frontend-dist/assets/index-Cdw9RS1j.js +0 -39
  48. boneio-1.3.0.dev14/boneio/webui/frontend-dist/assets/useTranslation-xq1ST8U-.js +0 -13
  49. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/LICENSE +0 -0
  50. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/MANIFEST.in +0 -0
  51. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/README.md +0 -0
  52. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/__init__.py +0 -0
  53. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/input.yaml +0 -0
  54. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/output_24_16.yaml +0 -0
  55. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/output_32_10.yaml +0 -0
  56. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/output_32_5.yaml +0 -0
  57. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/output_cover.yaml +0 -0
  58. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  59. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/input.yaml +0 -0
  60. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/output_24_16.yaml +0 -0
  61. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/output_32_10.yaml +0 -0
  62. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/output_32_5.yaml +0 -0
  63. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/output_cover.yaml +0 -0
  64. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  65. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/input.yaml +0 -0
  66. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/output_24_16.yaml +0 -0
  67. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/output_32_10.yaml +0 -0
  68. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/output_32_5.yaml +0 -0
  69. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/output_cover.yaml +0 -0
  70. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  71. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.5/input.yaml +0 -0
  72. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.5/output_24_16.yaml +0 -0
  73. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.5/output_32_10.yaml +0 -0
  74. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.5/output_cover.yaml +0 -0
  75. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  76. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.6/input.yaml +0 -0
  77. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.6/output_24_16.yaml +0 -0
  78. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.6/output_32_10.yaml +0 -0
  79. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.6/output_cover.yaml +0 -0
  80. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  81. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/input.yaml +0 -0
  82. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/output_24_16.yaml +0 -0
  83. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/output_32_10.yaml +0 -0
  84. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/output_48_4.yaml +0 -0
  85. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/output_cover.yaml +0 -0
  86. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  87. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/input.yaml +0 -0
  88. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/output_24_16.yaml +0 -0
  89. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/output_32_10.yaml +0 -0
  90. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/output_48_4.yaml +0 -0
  91. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/output_cover.yaml +0 -0
  92. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  93. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/__init__.py +0 -0
  94. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/cover/__init__.py +0 -0
  95. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/cover/cover.py +0 -0
  96. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/cover/time_based.py +0 -0
  97. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/cover/venetian.py +0 -0
  98. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/group/__init__.py +0 -0
  99. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/group/output_group.py +0 -0
  100. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/input/__init__.py +0 -0
  101. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/input/binary_sensor.py +0 -0
  102. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/input/detectors.py +0 -0
  103. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/input/event.py +0 -0
  104. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/irrigation/__init__.py +0 -0
  105. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/irrigation/water_source.py +0 -0
  106. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/output/__init__.py +0 -0
  107. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/output/basic.py +0 -0
  108. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/output/mcp.py +0 -0
  109. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/output/pca.py +0 -0
  110. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/output/pcf.py +0 -0
  111. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/sensor/__init__.py +0 -0
  112. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/template/__init__.py +0 -0
  113. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/template/alarm_panel.py +0 -0
  114. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/template/gate_cover.py +0 -0
  115. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/components/template/thermostat.py +0 -0
  116. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/const.py +0 -0
  117. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/__init__.py +0 -0
  118. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/__init__.py +0 -0
  119. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/data/__init__.py +0 -0
  120. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  121. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  122. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  123. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/registration.py +0 -0
  124. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/cloud/secrets.py +0 -0
  125. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/__init__.py +0 -0
  126. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/config_helper.py +0 -0
  127. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  128. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/migrations/v2_transition.py +0 -0
  129. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/package-lock.json +0 -0
  130. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/package.json +0 -0
  131. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/config/schema_converter.py +0 -0
  132. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/discovery.py +0 -0
  133. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/events/__init__.py +0 -0
  134. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/events/bus.py +0 -0
  135. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/__init__.py +0 -0
  136. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/action_conditions.py +0 -0
  137. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/canopen.py +0 -0
  138. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/covers.py +0 -0
  139. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/inputs.py +0 -0
  140. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/modbus.py +0 -0
  141. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/outputs.py +0 -0
  142. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/templates/__init__.py +0 -0
  143. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/templates/alarm.py +0 -0
  144. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/templates/gate_cover.py +0 -0
  145. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/templates/thermostat.py +0 -0
  146. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/manager/templates.py +0 -0
  147. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/messaging/basic.py +0 -0
  148. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/messaging/basic_mqtt.py +0 -0
  149. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/messaging/local.py +0 -0
  150. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/messaging/queue.py +0 -0
  151. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/can.py +0 -0
  152. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/esphome.py +0 -0
  153. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/mqtt.py +0 -0
  154. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/remote/wled.py +0 -0
  155. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/sensor/__init__.py +0 -0
  156. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/sensor/base.py +0 -0
  157. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/sensor/system.py +0 -0
  158. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/state/__init__.py +0 -0
  159. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/state/manager.py +0 -0
  160. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/system/__init__.py +0 -0
  161. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/system/monitor.py +0 -0
  162. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/__init__.py +0 -0
  163. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/async_updater.py +0 -0
  164. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/conditions.py +0 -0
  165. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/filter.py +0 -0
  166. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/font_util.py +0 -0
  167. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/logger.py +0 -0
  168. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/timeperiod.py +0 -0
  169. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/core/utils/util.py +0 -0
  170. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/adc.yaml +0 -0
  171. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  172. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/config.yaml +0 -0
  173. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/event.yaml +0 -0
  174. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/mqtt.yaml +0 -0
  175. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  176. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/adc.yaml +0 -0
  177. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  178. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/config.yaml +0 -0
  179. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/event.yaml +0 -0
  180. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/mqtt.yaml +0 -0
  181. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  182. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/adc.yaml +0 -0
  183. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  184. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/config.yaml +0 -0
  185. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/event.yaml +0 -0
  186. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/mqtt.yaml +0 -0
  187. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  188. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/__init__.py +0 -0
  189. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/can_master.yaml +0 -0
  190. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/can_slave.yaml +0 -0
  191. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/adc.yaml +0 -0
  192. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  193. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/config.yaml +0 -0
  194. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/cover.yaml +0 -0
  195. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/event.yaml +0 -0
  196. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/mqtt.yaml +0 -0
  197. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover/outputCover.yaml +0 -0
  198. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/adc.yaml +0 -0
  199. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  200. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/config.yaml +0 -0
  201. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/cover.yaml +0 -0
  202. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/event.yaml +0 -0
  203. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  204. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  205. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/adc.yaml +0 -0
  206. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  207. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  208. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  209. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  210. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/event_all.yaml +0 -0
  211. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  212. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  213. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  214. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  215. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  216. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  217. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/exceptions.py +0 -0
  218. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/__init__.py +0 -0
  219. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/analog/__init__.py +0 -0
  220. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/analog/adc.py +0 -0
  221. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/__init__.py +0 -0
  222. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/bridge.py +0 -0
  223. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/client.py +0 -0
  224. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/interface.py +0 -0
  225. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/node.py +0 -0
  226. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/node_id.py +0 -0
  227. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/sudoers.py +0 -0
  228. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/can/test_od.py +0 -0
  229. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/display/__init__.py +0 -0
  230. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/display/early_oled.py +0 -0
  231. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  232. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/display/oled.py +0 -0
  233. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/__init__.py +0 -0
  234. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  235. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  236. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  237. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  238. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/input/__init__.py +0 -0
  239. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/input/base.py +0 -0
  240. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/gpio/input/manager.py +0 -0
  241. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/__init__.py +0 -0
  242. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/bus.py +0 -0
  243. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/ina219.py +0 -0
  244. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/ina219_driver.py +0 -0
  245. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/mcp9808.py +0 -0
  246. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/i2c/pct2075.py +0 -0
  247. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/onewire/__init__.py +0 -0
  248. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/onewire/bus.py +0 -0
  249. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/onewire/dallas.py +0 -0
  250. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/onewire/ds2482.py +0 -0
  251. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/sensor/__init__.py +0 -0
  252. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  253. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/sensor/temperature/base.py +0 -0
  254. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  255. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  256. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/integration/__init__.py +0 -0
  257. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/integration/interlock.py +0 -0
  258. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/__init__.py +0 -0
  259. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/cli.py +0 -0
  260. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/client.py +0 -0
  261. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/coordinator.py +0 -0
  262. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/__init__.py +0 -0
  263. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  264. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  265. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  266. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  267. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  268. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  269. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  270. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  271. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  272. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/inverters/sofar.json +0 -0
  273. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/inverters/thessla.json +0 -0
  274. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  275. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  276. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  277. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/other/wanas415.json +0 -0
  278. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  279. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/cwt.json +0 -0
  280. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  281. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  282. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  283. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  284. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  285. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/pt100.json +0 -0
  286. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/sht20.json +0 -0
  287. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/devices/sensors/sht30.json +0 -0
  288. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/__init__.py +0 -0
  289. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/base.py +0 -0
  290. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/derived/__init__.py +0 -0
  291. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/derived/numeric.py +0 -0
  292. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/derived/select.py +0 -0
  293. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/derived/switch.py +0 -0
  294. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/derived/text.py +0 -0
  295. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/sensor/__init__.py +0 -0
  296. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/sensor/binary.py +0 -0
  297. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/sensor/numeric.py +0 -0
  298. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/sensor/text.py +0 -0
  299. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/writeable/__init__.py +0 -0
  300. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/writeable/binary.py +0 -0
  301. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/entities/writeable/numeric.py +0 -0
  302. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/modbus/utils.py +0 -0
  303. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/__init__.py +0 -0
  304. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/actions.py +0 -0
  305. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/files.py +0 -0
  306. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/logs.py +0 -0
  307. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/mqtt.py +0 -0
  308. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/models/state.py +0 -0
  309. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/actions.yaml +0 -0
  310. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/actions_sensor.yaml +0 -0
  311. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/actions_switch.yaml +0 -0
  312. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/condition.yaml +0 -0
  313. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/filters.yaml +0 -0
  314. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/filters_adc.yaml +0 -0
  315. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/id.yaml +0 -0
  316. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/temp_unit.yaml +0 -0
  317. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/schema/update_interval.yaml +0 -0
  318. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/action_validation.py +0 -0
  319. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/app.py +0 -0
  320. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/aiConfig-DCT969oj.js +0 -0
  321. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/aiWizardPrompt-Dpts0jpN.js +0 -0
  322. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  323. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  324. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  325. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  326. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  327. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  328. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  329. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  330. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  331. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  332. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  333. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/boneio.svg +0 -0
  334. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  335. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  336. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  337. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  338. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  339. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  340. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  341. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  342. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  343. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  344. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  345. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  346. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  347. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  348. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  349. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  350. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  351. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  352. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  353. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  354. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  355. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  356. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  357. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  358. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  359. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  360. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  361. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  362. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  363. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/middleware/__init__.py +0 -0
  364. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/middleware/auth.py +0 -0
  365. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/__init__.py +0 -0
  366. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/auth.py +0 -0
  367. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/caddy.py +0 -0
  368. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/can.py +0 -0
  369. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/covers.py +0 -0
  370. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/outputs.py +0 -0
  371. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/remote_devices.py +0 -0
  372. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/sensors.py +0 -0
  373. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/system.py +0 -0
  374. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/templates.py +0 -0
  375. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/timezone_sudoers.py +0 -0
  376. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/tools.py +0 -0
  377. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/routes/update.py +0 -0
  378. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/adc.schema.json +0 -0
  379. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/areas.schema.json +0 -0
  380. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  381. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/boneio.schema.json +0 -0
  382. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/can.schema.json +0 -0
  383. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/cover.schema.json +0 -0
  384. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/dallas.schema.json +0 -0
  385. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/ds2482.schema.json +0 -0
  386. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/event.schema.json +0 -0
  387. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/ina219.schema.json +0 -0
  388. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/irrigation.schema.json +0 -0
  389. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/lm75.schema.json +0 -0
  390. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/logger.schema.json +0 -0
  391. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/mcp23017.schema.json +0 -0
  392. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/mcp9808.schema.json +0 -0
  393. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/modbus.schema.json +0 -0
  394. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  395. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/oled.schema.json +0 -0
  396. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/output.schema.json +0 -0
  397. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/output_group.schema.json +0 -0
  398. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/pca9685.schema.json +0 -0
  399. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/pcf8575.schema.json +0 -0
  400. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/remote_devices.schema.json +0 -0
  401. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/sensor.schema.json +0 -0
  402. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/template.schema.json +0 -0
  403. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  404. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/schema/web.schema.json +0 -0
  405. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/services/__init__.py +0 -0
  406. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/services/logs.py +0 -0
  407. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/web_server.py +0 -0
  408. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio/webui/websocket_manager.py +0 -0
  409. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio.egg-info/dependency_links.txt +0 -0
  410. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio.egg-info/entry_points.txt +0 -0
  411. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio.egg-info/requires.txt +0 -0
  412. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/boneio.egg-info/top_level.txt +0 -0
  413. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/pyproject.toml +0 -0
  414. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/setup.cfg +0 -0
  415. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/setup.py +0 -0
  416. {boneio-1.3.0.dev14 → boneio-1.3.0.dev17}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.3.0.dev14
3
+ Version: 1.3.0.dev17
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
@@ -240,13 +240,16 @@ def run(
240
240
 
241
241
  try:
242
242
  _t1 = _time.monotonic()
243
- _config = load_config_from_file(config_file=config)
243
+ _config = load_config_from_file(
244
+ config_file=config, progress_callback=draw_status,
245
+ )
244
246
  _LOGGER.debug("[STARTUP TIMING] load_config_from_file: %.2fs", _time.monotonic() - _t1)
245
247
  if not _config:
246
248
  _LOGGER.error("Config not loaded. Exiting.")
247
249
  draw_config_error("Config file is empty or missing")
248
250
  return 1
249
251
  configure_logger(log_config=_config.get("logger") or {}, debug=debug)
252
+ draw_status("Importing modules...")
250
253
  # Granular timing of runner sub-imports to find the bottleneck
251
254
  _t_a = _time.monotonic()
252
255
  from boneio.const import ACTION
@@ -251,7 +251,10 @@ class IrrigationController:
251
251
  if skip_count >= zone.run_every_n - 1:
252
252
  _LOGGER.debug(
253
253
  "Irrigation %s: zone %s eligible (skip_count=%d >= %d)",
254
- self.id, zone.id, skip_count, zone.run_every_n - 1,
254
+ self.id,
255
+ zone.id,
256
+ skip_count,
257
+ zone.run_every_n - 1,
255
258
  )
256
259
  eligible.append((idx, zone))
257
260
  # Reset counter — will be saved when zone finishes in _advance_to_next_zone
@@ -260,7 +263,10 @@ class IrrigationController:
260
263
  self._save(counter_key, skip_count)
261
264
  _LOGGER.debug(
262
265
  "Irrigation %s: zone %s NOT eligible (skip_count=%d < %d)",
263
- self.id, zone.id, skip_count, zone.run_every_n - 1,
266
+ self.id,
267
+ zone.id,
268
+ skip_count,
269
+ zone.run_every_n - 1,
264
270
  )
265
271
  return eligible
266
272
 
@@ -268,7 +274,10 @@ class IrrigationController:
268
274
  controller_state = ON if self._state in (ControllerState.RUNNING, ControllerState.PAUSED) else OFF
269
275
  _LOGGER.debug(
270
276
  "Irrigation %s publish_all_states: controller=%s (state=%s, active_zone=%s)",
271
- self.id, controller_state, self._state.value, self._active_zone_idx,
277
+ self.id,
278
+ controller_state,
279
+ self._state.value,
280
+ self._active_zone_idx,
272
281
  )
273
282
  self._publish(self._state_topic(), {"state": controller_state})
274
283
  self._publish(
@@ -301,14 +310,18 @@ class IrrigationController:
301
310
  active = ON if self._active_zone_idx == idx and self._state == ControllerState.RUNNING else OFF
302
311
  _LOGGER.debug(
303
312
  "Irrigation %s: zone %s idx=%d active=%s (active_zone_idx=%s)",
304
- self.id, zone.id, idx, active, self._active_zone_idx,
313
+ self.id,
314
+ zone.id,
315
+ idx,
316
+ active,
317
+ self._active_zone_idx,
305
318
  )
306
319
  self._publish(self._zone_state_topic(zone.id), {"state": active})
307
320
  self._publish(
308
321
  self._setting_state_topic(f"zone/{zone.id}/enabled"),
309
322
  {"state": ON if zone.enabled else OFF},
310
323
  )
311
- self._publish(self._zone_duration_topic(zone.id), {"value": zone.run_duration})
324
+ self._publish(self._zone_duration_topic(zone.id), {"value": max(1, round(zone.run_duration / 60))})
312
325
 
313
326
  for idx, sched in enumerate(self._schedule):
314
327
  self._publish(
@@ -333,7 +346,9 @@ class IrrigationController:
333
346
  async def shutdown(self) -> None:
334
347
  _LOGGER.debug(
335
348
  "Irrigation %s shutdown called (state=%s, active_zone=%s). Caller: %s",
336
- self.id, self._state.value, self._active_zone_idx,
349
+ self.id,
350
+ self._state.value,
351
+ self._active_zone_idx,
337
352
  "".join(traceback.format_stack(limit=5)),
338
353
  )
339
354
  self.stop_schedules()
@@ -378,7 +393,10 @@ class IrrigationController:
378
393
  async def start_full_cycle(self) -> None:
379
394
  _LOGGER.debug(
380
395
  "Irrigation %s start_full_cycle: state=%s standby=%s skip_next=%s",
381
- self.id, self._state.value, self._standby, self._skip_next_run,
396
+ self.id,
397
+ self._state.value,
398
+ self._standby,
399
+ self._skip_next_run,
382
400
  )
383
401
  if self._standby:
384
402
  _LOGGER.info("Irrigation %s is in standby mode, not starting", self.id)
@@ -403,7 +421,10 @@ class IrrigationController:
403
421
  async def start_single_zone(self, zone_id: str) -> None:
404
422
  _LOGGER.debug(
405
423
  "Irrigation %s start_single_zone('%s') state=%s standby=%s",
406
- self.id, zone_id, self._state.value, self._standby,
424
+ self.id,
425
+ zone_id,
426
+ self._state.value,
427
+ self._standby,
407
428
  )
408
429
  if self._standby:
409
430
  _LOGGER.info("Irrigation %s is in standby mode, not starting zone", self.id)
@@ -431,7 +452,8 @@ class IrrigationController:
431
452
  eligible = self._eligible_zones()
432
453
  _LOGGER.debug(
433
454
  "Irrigation %s _start_cycle_from_eligible: %d eligible zones: %s",
434
- self.id, len(eligible),
455
+ self.id,
456
+ len(eligible),
435
457
  [(idx, z.id) for idx, z in eligible],
436
458
  )
437
459
  if not eligible:
@@ -447,7 +469,10 @@ class IrrigationController:
447
469
  async def _advance_to_next_zone(self, force: bool = False) -> None:
448
470
  _LOGGER.debug(
449
471
  "Irrigation %s _advance_to_next_zone(force=%s) active_zone=%s single_zone=%s",
450
- self.id, force, self._active_zone_idx, self._single_zone_mode,
472
+ self.id,
473
+ force,
474
+ self._active_zone_idx,
475
+ self._single_zone_mode,
451
476
  )
452
477
  if self._active_zone_idx is None:
453
478
  _LOGGER.debug("Irrigation %s: no active zone, shutting down", self.id)
@@ -551,8 +576,12 @@ class IrrigationController:
551
576
 
552
577
  _LOGGER.debug(
553
578
  "Irrigation %s _start_zone: idx=%d, zone=%s, valve=%s, duration=%ds, source=%s",
554
- self.id, idx, zone.id, zone.valve.id if zone.valve else 'NONE',
555
- duration, src.id if src else 'NONE',
579
+ self.id,
580
+ idx,
581
+ zone.id,
582
+ zone.valve.id if zone.valve else "NONE",
583
+ duration,
584
+ src.id if src else "NONE",
556
585
  )
557
586
 
558
587
  self._active_zone_idx = idx
@@ -562,12 +591,19 @@ class IrrigationController:
562
591
  if src is not None:
563
592
  if src.pump_start_valve_delay_s > 0:
564
593
  # Source first (pump+valve), then zone valve after delay
565
- _LOGGER.debug("Irrigation %s: source '%s' ON, then wait %ds", self.id, src.id, src.pump_start_valve_delay_s)
594
+ _LOGGER.debug(
595
+ "Irrigation %s: source '%s' ON, then wait %ds", self.id, src.id, src.pump_start_valve_delay_s
596
+ )
566
597
  await self._activate_source()
567
598
  await asyncio.sleep(src.pump_start_valve_delay_s)
568
599
  elif src.pump_start_pump_delay_s > 0:
569
600
  # Zone valve first, then source after delay
570
- _LOGGER.debug("Irrigation %s: zone valve ON first, then source '%s' after %ds", self.id, src.id, src.pump_start_pump_delay_s)
601
+ _LOGGER.debug(
602
+ "Irrigation %s: zone valve ON first, then source '%s' after %ds",
603
+ self.id,
604
+ src.id,
605
+ src.pump_start_pump_delay_s,
606
+ )
571
607
  try:
572
608
  await zone.valve.async_turn_on(timestamp=time.time())
573
609
  except Exception as err:
@@ -584,7 +620,10 @@ class IrrigationController:
584
620
  except BaseException as err:
585
621
  _LOGGER.error(
586
622
  "Irrigation %s: CRITICAL error after valve ON (pump delay path): %s (%s)",
587
- self.id, err, type(err).__name__, exc_info=True,
623
+ self.id,
624
+ err,
625
+ type(err).__name__,
626
+ exc_info=True,
588
627
  )
589
628
  return
590
629
  else:
@@ -612,7 +651,10 @@ class IrrigationController:
612
651
  except BaseException as err:
613
652
  _LOGGER.error(
614
653
  "Irrigation %s: CRITICAL error after valve ON: %s (%s)",
615
- self.id, err, type(err).__name__, exc_info=True,
654
+ self.id,
655
+ err,
656
+ type(err).__name__,
657
+ exc_info=True,
616
658
  )
617
659
 
618
660
  async def _stop_current_zone(self) -> None:
@@ -713,24 +755,28 @@ class IrrigationController:
713
755
 
714
756
  async def handle_zone_command(self, zone_id: str, payload: str) -> None:
715
757
  upper = payload.strip().upper()
716
- _LOGGER.debug("Irrigation %s handle_zone_command: zone='%s' payload='%s' → upper='%s'", self.id, zone_id, payload, upper)
758
+ _LOGGER.debug(
759
+ "Irrigation %s handle_zone_command: zone='%s' payload='%s' → upper='%s'", self.id, zone_id, payload, upper
760
+ )
717
761
  if upper == ON:
718
762
  await self.start_single_zone(zone_id)
719
763
  elif upper == OFF:
720
764
  await self.shutdown()
721
765
 
722
766
  async def handle_zone_duration_command(self, zone_id: str, payload: str) -> None:
767
+ """Handle duration change from HA (value in minutes)."""
723
768
  try:
724
- duration = int(float(payload))
769
+ minutes = int(float(payload))
725
770
  except (TypeError, ValueError):
726
771
  return
727
- if duration <= 0:
772
+ if minutes <= 0:
728
773
  return
729
774
 
775
+ duration_s = minutes * 60
730
776
  for zone in self._zones:
731
777
  if zone.id == zone_id:
732
- zone.run_duration = duration
733
- self._save(f"zone/{zone.id}/duration", duration)
778
+ zone.run_duration = duration_s
779
+ self._save(f"zone/{zone.id}/duration", duration_s)
734
780
  break
735
781
  await self.publish_all_states()
736
782
 
@@ -4,6 +4,7 @@ Creates virtual power/energy or water flow sensors linked to outputs.
4
4
  When the linked output is ON, the sensor calculates consumption based on
5
5
  configured power_usage or flow_rate.
6
6
  """
7
+
7
8
  from __future__ import annotations
8
9
 
9
10
  import asyncio
@@ -26,10 +27,10 @@ _LOGGER = logging.getLogger(__name__)
26
27
 
27
28
  class VirtualEnergySensor:
28
29
  """Virtual energy/water sensor linked to an output.
29
-
30
+
30
31
  Tracks energy consumption (Wh) or water consumption (L) based on
31
32
  configured power_usage (W) or flow_rate (L/h) when the linked output is ON.
32
-
33
+
33
34
  Args:
34
35
  id: Unique sensor identifier
35
36
  name: Display name for Home Assistant
@@ -68,23 +69,26 @@ class VirtualEnergySensor:
68
69
  self._power_usage = power_usage
69
70
  self._flow_rate = flow_rate
70
71
  self._area = area
71
-
72
+
72
73
  self._virtual_sensors_task = None
73
-
74
+
74
75
  # Counters
75
76
  self._energy_consumed_Wh = 0.0
76
77
  self._water_consumed_L = 0.0
77
- self._last_on_timestamp = time.time() if self._output.state == ON else None
78
-
78
+ self._last_on_timestamp = None
79
+
80
+ # State restore gate — prevents sending state=0 before
81
+ # the retained MQTT message with the real value is received.
82
+ self._restore_done = asyncio.Event()
83
+
79
84
  # MQTT topic for this sensor
80
85
  self._sensor_topic = f"{topic_prefix}/energy/{id}"
81
-
86
+
82
87
  # Subscribe to restore state from MQTT
83
88
  self._subscribe_restore_state()
84
-
89
+
85
90
  _LOGGER.info(
86
- "Initialized VirtualEnergySensor: id=%s, name=%s, output=%s, type=%s",
87
- id, name, output.id, sensor_type
91
+ "Initialized VirtualEnergySensor: id=%s, name=%s, output=%s, type=%s", id, name, output.id, sensor_type
88
92
  )
89
93
 
90
94
  @property
@@ -140,18 +144,34 @@ class VirtualEnergySensor:
140
144
  # Update one last time before stopping
141
145
  self._update_consumption()
142
146
  self._last_on_timestamp = None
143
-
147
+
144
148
  if self._virtual_sensors_task is not None:
145
149
  self._virtual_sensors_task.cancel()
146
150
  self._virtual_sensors_task = None
147
-
148
- # Send final state
149
- self._send_state()
151
+
152
+ # Send final state (only if restore is done)
153
+ if self._restore_done.is_set():
154
+ self._send_state()
150
155
  _LOGGER.debug("Stopped tracking for virtual sensor %s", self._id)
151
156
 
152
157
  async def _tracking_loop(self):
153
158
  """Periodically update and send state every 30 seconds while output is ON."""
154
159
  try:
160
+ # Wait for state restore before sending any state.
161
+ # This prevents overwriting the retained MQTT value with 0.
162
+ # Timeout of 5s ensures we don't hang if MQTT is down.
163
+ try:
164
+ await asyncio.wait_for(self._restore_done.wait(), timeout=5.0)
165
+ except TimeoutError:
166
+ _LOGGER.warning(
167
+ "State restore timeout for %s, starting with energy=%.4f Wh", self._id, self._energy_consumed_Wh
168
+ )
169
+ self._restore_done.set()
170
+
171
+ # Reset on_timestamp after restore so we don't count
172
+ # the time elapsed during the restore wait.
173
+ self._last_on_timestamp = time.time()
174
+
155
175
  while self._output.state == ON:
156
176
  self._update_consumption()
157
177
  self._send_state()
@@ -164,49 +184,42 @@ class VirtualEnergySensor:
164
184
  now = time.time()
165
185
  if self._output.state == ON and self._last_on_timestamp is not None:
166
186
  elapsed = now - self._last_on_timestamp
167
-
187
+
168
188
  if self._sensor_type == "power" and self._power_usage is not None:
169
189
  self._energy_consumed_Wh += (self._power_usage * elapsed) / 3600.0
170
- _LOGGER.debug(
171
- "Energy updated for %s: %.4f Wh",
172
- self._id, self._energy_consumed_Wh
173
- )
190
+ _LOGGER.debug("Energy updated for %s: %.4f Wh", self._id, self._energy_consumed_Wh)
174
191
  elif self._sensor_type == "water" and self._flow_rate is not None:
175
192
  self._water_consumed_L += (self._flow_rate * elapsed) / 3600.0
176
- _LOGGER.debug(
177
- "Water updated for %s: %.4f L",
178
- self._id, self._water_consumed_L
179
- )
180
-
193
+ _LOGGER.debug("Water updated for %s: %.4f L", self._id, self._water_consumed_L)
194
+
181
195
  self._last_on_timestamp = now
182
196
 
183
197
  def _subscribe_restore_state(self):
184
- """Subscribe to retained MQTT topic to restore state on startup."""
198
+ """Subscribe to retained MQTT topic to restore state on startup.
199
+
200
+ Sets _restore_done event when restore is complete (or if no retained
201
+ message is available). This gates _send_state() to prevent overwriting
202
+ the retained value with 0.
203
+ """
204
+
185
205
  async def on_message(_topic, payload):
186
206
  try:
187
207
  data = json.loads(payload)
188
208
  if isinstance(data, dict):
189
209
  if "energy" in data:
190
210
  self._energy_consumed_Wh = float(data["energy"])
191
- _LOGGER.info(
192
- "Restored energy state for %s: %.4f Wh",
193
- self._id, self._energy_consumed_Wh
194
- )
211
+ _LOGGER.info("Restored energy state for %s: %.4f Wh", self._id, self._energy_consumed_Wh)
195
212
  if "water" in data:
196
213
  self._water_consumed_L = float(data["water"])
197
- _LOGGER.info(
198
- "Restored water state for %s: %.4f L",
199
- self._id, self._water_consumed_L
200
- )
214
+ _LOGGER.info("Restored water state for %s: %.4f L", self._id, self._water_consumed_L)
201
215
  except Exception as e:
202
216
  _LOGGER.warning("Failed to restore state for %s: %s", self._id, e)
203
217
  finally:
218
+ self._restore_done.set()
204
219
  await self._message_bus.unsubscribe_and_stop_listen(self._sensor_topic)
205
-
220
+
206
221
  if self._message_bus is not None:
207
- asyncio.create_task(
208
- self._message_bus.subscribe_and_listen(self._sensor_topic, on_message)
209
- )
222
+ asyncio.create_task(self._message_bus.subscribe_and_listen(self._sensor_topic, on_message))
210
223
 
211
224
  def get_current_power(self) -> float:
212
225
  """Get current power usage in W (0 if output is OFF)."""
@@ -232,58 +245,66 @@ class VirtualEnergySensor:
232
245
  """Send current state to MQTT and EventBus (for WebSocket/frontend)."""
233
246
  payload = {}
234
247
  timestamp = int(time.time())
235
-
248
+
236
249
  if self._sensor_type == "power":
237
250
  payload["power"] = self.get_current_power()
238
251
  payload["energy"] = self.get_total_energy()
239
-
252
+
240
253
  # Send SensorEvents to frontend via EventBus
241
- self._event_bus.trigger_event(SensorEvent(
242
- entity_id=f"{self._id}_power",
243
- state=SensorState(
244
- id=f"{self._id}_power",
245
- name=f"{self._name} Power",
246
- state=self.get_current_power(),
247
- unit="W",
248
- timestamp=timestamp,
254
+ self._event_bus.trigger_event(
255
+ SensorEvent(
256
+ entity_id=f"{self._id}_power",
257
+ state=SensorState(
258
+ id=f"{self._id}_power",
259
+ name=f"{self._name} Power",
260
+ state=self.get_current_power(),
261
+ unit="W",
262
+ timestamp=timestamp,
263
+ ),
249
264
  )
250
- ))
251
- self._event_bus.trigger_event(SensorEvent(
252
- entity_id=f"{self._id}_energy",
253
- state=SensorState(
254
- id=f"{self._id}_energy",
255
- name=f"{self._name} Energy",
256
- state=self.get_total_energy(),
257
- unit="Wh",
258
- timestamp=timestamp,
265
+ )
266
+ self._event_bus.trigger_event(
267
+ SensorEvent(
268
+ entity_id=f"{self._id}_energy",
269
+ state=SensorState(
270
+ id=f"{self._id}_energy",
271
+ name=f"{self._name} Energy",
272
+ state=self.get_total_energy(),
273
+ unit="Wh",
274
+ timestamp=timestamp,
275
+ ),
259
276
  )
260
- ))
277
+ )
261
278
  elif self._sensor_type == "water":
262
279
  payload["volume_flow_rate"] = self.get_current_flow_rate()
263
280
  payload["water"] = self.get_total_water()
264
-
281
+
265
282
  # Send SensorEvents to frontend via EventBus
266
- self._event_bus.trigger_event(SensorEvent(
267
- entity_id=f"{self._id}_flow",
268
- state=SensorState(
269
- id=f"{self._id}_flow",
270
- name=f"{self._name} Flow Rate",
271
- state=self.get_current_flow_rate(),
272
- unit="L/h",
273
- timestamp=timestamp,
283
+ self._event_bus.trigger_event(
284
+ SensorEvent(
285
+ entity_id=f"{self._id}_flow",
286
+ state=SensorState(
287
+ id=f"{self._id}_flow",
288
+ name=f"{self._name} Flow Rate",
289
+ state=self.get_current_flow_rate(),
290
+ unit="L/h",
291
+ timestamp=timestamp,
292
+ ),
274
293
  )
275
- ))
276
- self._event_bus.trigger_event(SensorEvent(
277
- entity_id=f"{self._id}_water",
278
- state=SensorState(
279
- id=f"{self._id}_water",
280
- name=f"{self._name} Water",
281
- state=self.get_total_water(),
282
- unit="L",
283
- timestamp=timestamp,
294
+ )
295
+ self._event_bus.trigger_event(
296
+ SensorEvent(
297
+ entity_id=f"{self._id}_water",
298
+ state=SensorState(
299
+ id=f"{self._id}_water",
300
+ name=f"{self._name} Water",
301
+ state=self.get_total_water(),
302
+ unit="L",
303
+ timestamp=timestamp,
304
+ ),
284
305
  )
285
- ))
286
-
306
+ )
307
+
287
308
  self._message_bus.send_message(
288
309
  topic=self._sensor_topic,
289
310
  payload=payload,
@@ -17,7 +17,7 @@ from dataclasses import dataclass, field
17
17
  _LOGGER = logging.getLogger(__name__)
18
18
 
19
19
  # Current schema version — bump this when adding new migrations
20
- CURRENT_SCHEMA_VERSION = 2
20
+ CURRENT_SCHEMA_VERSION = 3
21
21
 
22
22
  # Minimum app version that introduced each schema version.
23
23
  # Used by the WebUI to warn before rolling back to an incompatible version.
@@ -25,6 +25,7 @@ SCHEMA_VERSION_APP_MAP: dict[int, str] = {
25
25
  0: "1.0.0", # original schema
26
26
  1: "1.2.0dev1", # proxy_port rename
27
27
  2: "1.3.0dev1", # transition timeperiod
28
+ 3: "1.3.0dev7", # irrigation section
28
29
  }
29
30
 
30
31