boneio 1.4.0.dev13__tar.gz → 1.4.1__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 (453) hide show
  1. {boneio-1.4.0.dev13/boneio.egg-info → boneio-1.4.1}/PKG-INFO +1 -1
  2. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/controller.py +7 -0
  3. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/registration.py +44 -7
  4. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/inputs.py +71 -21
  5. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/base.py +7 -2
  6. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/system.py +24 -8
  7. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/oled.py +1 -1
  8. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/homeassistant.py +14 -4
  9. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/state.py +1 -0
  10. boneio-1.4.1/boneio/version.py +2 -0
  11. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/app.py +17 -0
  12. boneio-1.4.1/boneio/webui/frontend-dist/assets/index-2vKidlTz.js +100 -0
  13. boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/index-jCTJrr8b.css → boneio-1.4.1/boneio/webui/frontend-dist/assets/index-BXbDdVbb.css +1 -1
  14. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/index.html +2 -2
  15. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/sw.js +1 -1
  16. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/irrigation.py +16 -5
  17. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/sensors.py +5 -2
  18. {boneio-1.4.0.dev13 → boneio-1.4.1/boneio.egg-info}/PKG-INFO +1 -1
  19. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/SOURCES.txt +2 -2
  20. boneio-1.4.0.dev13/boneio/version.py +0 -2
  21. boneio-1.4.0.dev13/boneio/webui/frontend-dist/assets/index-CEComJE_.js +0 -100
  22. {boneio-1.4.0.dev13 → boneio-1.4.1}/LICENSE +0 -0
  23. {boneio-1.4.0.dev13 → boneio-1.4.1}/MANIFEST.in +0 -0
  24. {boneio-1.4.0.dev13 → boneio-1.4.1}/README.md +0 -0
  25. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/__init__.py +0 -0
  26. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/input.yaml +0 -0
  27. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_24_16.yaml +0 -0
  28. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_32_10.yaml +0 -0
  29. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_32_5.yaml +0 -0
  30. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_cover.yaml +0 -0
  31. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  32. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/input.yaml +0 -0
  33. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_24_16.yaml +0 -0
  34. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_32_10.yaml +0 -0
  35. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_32_5.yaml +0 -0
  36. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_cover.yaml +0 -0
  37. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  38. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/input.yaml +0 -0
  39. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_24_16.yaml +0 -0
  40. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_32_10.yaml +0 -0
  41. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_32_5.yaml +0 -0
  42. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_cover.yaml +0 -0
  43. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  44. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/input.yaml +0 -0
  45. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_24_16.yaml +0 -0
  46. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_32_10.yaml +0 -0
  47. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_cover.yaml +0 -0
  48. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  49. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/input.yaml +0 -0
  50. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_24_16.yaml +0 -0
  51. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_32_10.yaml +0 -0
  52. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_cover.yaml +0 -0
  53. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  54. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/input.yaml +0 -0
  55. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_24_16.yaml +0 -0
  56. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  57. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_48_4.yaml +0 -0
  58. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_cover.yaml +0 -0
  59. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  60. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/input.yaml +0 -0
  61. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_24_16.yaml +0 -0
  62. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  63. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_48_4.yaml +0 -0
  64. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_cover.yaml +0 -0
  65. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  66. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/bonecli.py +0 -0
  67. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/__init__.py +0 -0
  68. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/__init__.py +0 -0
  69. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/cover.py +0 -0
  70. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/time_based.py +0 -0
  71. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/cover/venetian.py +0 -0
  72. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/group/__init__.py +0 -0
  73. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/group/output_group.py +0 -0
  74. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/__init__.py +0 -0
  75. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/binary_sensor.py +0 -0
  76. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/detectors.py +0 -0
  77. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/event.py +0 -0
  78. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/__init__.py +0 -0
  79. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/base.py +0 -0
  80. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/input/remote/esphome.py +0 -0
  81. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/__init__.py +0 -0
  82. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/irrigation/water_source.py +0 -0
  83. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/__init__.py +0 -0
  84. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/basic.py +0 -0
  85. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/mcp.py +0 -0
  86. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/pca.py +0 -0
  87. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/pcf.py +0 -0
  88. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/output/remote.py +0 -0
  89. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/sensor/__init__.py +0 -0
  90. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/sensor/virtual_energy.py +0 -0
  91. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/__init__.py +0 -0
  92. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/alarm_panel.py +0 -0
  93. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/gate_cover.py +0 -0
  94. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/components/template/thermostat.py +0 -0
  95. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/const.py +0 -0
  96. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/__init__.py +0 -0
  97. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/__init__.py +0 -0
  98. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/__init__.py +0 -0
  99. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  100. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  101. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  102. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/cloud/secrets.py +0 -0
  103. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/__init__.py +0 -0
  104. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/config_helper.py +0 -0
  105. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/__init__.py +0 -0
  106. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  107. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/migrations/v2_transition.py +0 -0
  108. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/package-lock.json +0 -0
  109. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/package.json +0 -0
  110. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/schema_converter.py +0 -0
  111. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/config/yaml_util.py +0 -0
  112. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/discovery.py +0 -0
  113. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/events/__init__.py +0 -0
  114. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/events/bus.py +0 -0
  115. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/__init__.py +0 -0
  116. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/action_conditions.py +0 -0
  117. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/canopen.py +0 -0
  118. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/covers.py +0 -0
  119. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/display.py +0 -0
  120. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/irrigation.py +0 -0
  121. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/manager.py +0 -0
  122. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/modbus.py +0 -0
  123. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/outputs.py +0 -0
  124. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/remote.py +0 -0
  125. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/remote_input_registrar.py +0 -0
  126. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/sensors.py +0 -0
  127. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/__init__.py +0 -0
  128. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/alarm.py +0 -0
  129. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/gate_cover.py +0 -0
  130. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates/thermostat.py +0 -0
  131. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/templates.py +0 -0
  132. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/manager/update.py +0 -0
  133. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/__init__.py +0 -0
  134. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/basic.py +0 -0
  135. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/basic_mqtt.py +0 -0
  136. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/composite.py +0 -0
  137. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/local.py +0 -0
  138. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/lox.py +0 -0
  139. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/mqtt.py +0 -0
  140. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/messaging/queue.py +0 -0
  141. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/__init__.py +0 -0
  142. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/base.py +0 -0
  143. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/can.py +0 -0
  144. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/esphome.py +0 -0
  145. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/mqtt.py +0 -0
  146. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/remote/wled.py +0 -0
  147. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/sensor/__init__.py +0 -0
  148. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/state/__init__.py +0 -0
  149. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/state/manager.py +0 -0
  150. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/__init__.py +0 -0
  151. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/host_data.py +0 -0
  152. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/system/monitor.py +0 -0
  153. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/__init__.py +0 -0
  154. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/async_updater.py +0 -0
  155. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/conditions.py +0 -0
  156. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/filter.py +0 -0
  157. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/font_util.py +0 -0
  158. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/logger.py +0 -0
  159. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/timeperiod.py +0 -0
  160. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/core/utils/util.py +0 -0
  161. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/adc.yaml +0 -0
  162. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  163. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/config.yaml +0 -0
  164. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/event.yaml +0 -0
  165. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/mqtt.yaml +0 -0
  166. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  167. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/adc.yaml +0 -0
  168. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  169. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/config.yaml +0 -0
  170. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/event.yaml +0 -0
  171. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/mqtt.yaml +0 -0
  172. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  173. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/adc.yaml +0 -0
  174. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  175. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/config.yaml +0 -0
  176. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/event.yaml +0 -0
  177. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/mqtt.yaml +0 -0
  178. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  179. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/__init__.py +0 -0
  180. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/can_master.yaml +0 -0
  181. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/can_slave.yaml +0 -0
  182. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/adc.yaml +0 -0
  183. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  184. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/config.yaml +0 -0
  185. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/cover.yaml +0 -0
  186. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/event.yaml +0 -0
  187. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/mqtt.yaml +0 -0
  188. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover/outputCover.yaml +0 -0
  189. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/adc.yaml +0 -0
  190. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  191. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/config.yaml +0 -0
  192. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/cover.yaml +0 -0
  193. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/event.yaml +0 -0
  194. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  195. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  196. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/adc.yaml +0 -0
  197. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  198. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  199. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  200. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  201. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/event_all.yaml +0 -0
  202. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  203. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  204. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  205. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  206. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  207. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  208. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/exceptions.py +0 -0
  209. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/__init__.py +0 -0
  210. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/analog/__init__.py +0 -0
  211. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/analog/adc.py +0 -0
  212. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/__init__.py +0 -0
  213. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/bridge.py +0 -0
  214. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/client.py +0 -0
  215. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/interface.py +0 -0
  216. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/node.py +0 -0
  217. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/node_id.py +0 -0
  218. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/can/test_od.py +0 -0
  219. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/__init__.py +0 -0
  220. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/early_oled.py +0 -0
  221. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  222. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/__init__.py +0 -0
  223. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  224. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  225. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  226. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  227. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/__init__.py +0 -0
  228. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/base.py +0 -0
  229. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/gpio/input/manager.py +0 -0
  230. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/__init__.py +0 -0
  231. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/bus.py +0 -0
  232. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/ina219.py +0 -0
  233. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/ina219_driver.py +0 -0
  234. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/mcp9808.py +0 -0
  235. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/i2c/pct2075.py +0 -0
  236. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/__init__.py +0 -0
  237. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/bus.py +0 -0
  238. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/dallas.py +0 -0
  239. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/onewire/ds2482.py +0 -0
  240. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/__init__.py +0 -0
  241. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  242. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/base.py +0 -0
  243. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  244. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  245. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/__init__.py +0 -0
  246. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/interlock.py +0 -0
  247. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/integration/lox_template.py +0 -0
  248. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/__init__.py +0 -0
  249. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/actions.py +0 -0
  250. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  251. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/daemon.json +0 -0
  252. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  253. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  254. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  255. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/journald/journald.conf +0 -0
  256. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  257. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/sudoers/boneio +0 -0
  258. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  259. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/boneio.service +0 -0
  260. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  261. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  262. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  263. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  264. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  265. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  266. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  267. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  268. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  269. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/runner.py +0 -0
  270. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/__init__.py +0 -0
  271. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  272. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  273. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  274. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  275. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/__init__.py +0 -0
  276. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/cli.py +0 -0
  277. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/client.py +0 -0
  278. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/coordinator.py +0 -0
  279. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/__init__.py +0 -0
  280. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  281. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  282. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  283. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  284. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  285. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  286. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  287. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  288. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  289. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  290. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/inverters/sofar.json +0 -0
  291. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/inverters/thessla.json +0 -0
  292. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  293. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  294. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  295. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/other/wanas415.json +0 -0
  296. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  297. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/cwt.json +0 -0
  298. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  299. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  300. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  301. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  302. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  303. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/pt100.json +0 -0
  304. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/sht20.json +0 -0
  305. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/devices/sensors/sht30.json +0 -0
  306. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/__init__.py +0 -0
  307. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/base.py +0 -0
  308. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/__init__.py +0 -0
  309. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/numeric.py +0 -0
  310. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/select.py +0 -0
  311. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/switch.py +0 -0
  312. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/derived/text.py +0 -0
  313. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/__init__.py +0 -0
  314. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/binary.py +0 -0
  315. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/numeric.py +0 -0
  316. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/sensor/text.py +0 -0
  317. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/__init__.py +0 -0
  318. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/binary.py +0 -0
  319. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/entities/writeable/numeric.py +0 -0
  320. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/modbus/utils.py +0 -0
  321. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/__init__.py +0 -0
  322. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/actions.py +0 -0
  323. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/events.py +0 -0
  324. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/files.py +0 -0
  325. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/logs.py +0 -0
  326. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/models/mqtt.py +0 -0
  327. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/runner.py +0 -0
  328. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions.yaml +0 -0
  329. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions_sensor.yaml +0 -0
  330. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/actions_switch.yaml +0 -0
  331. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/condition.yaml +0 -0
  332. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/filters.yaml +0 -0
  333. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/filters_adc.yaml +0 -0
  334. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/id.yaml +0 -0
  335. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_devices.yaml +0 -0
  336. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_inputs.yaml +0 -0
  337. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/remote_outputs.yaml +0 -0
  338. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/schema.yaml +0 -0
  339. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/temp_unit.yaml +0 -0
  340. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/schema/update_interval.yaml +0 -0
  341. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/action_validation.py +0 -0
  342. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/dashboard_cards.py +0 -0
  343. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +0 -0
  344. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  345. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  346. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  347. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  348. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  349. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  350. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  351. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  352. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +0 -0
  353. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  354. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  355. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  356. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  357. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  358. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  359. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  360. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  361. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  362. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  363. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  364. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  365. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  366. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  367. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  368. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  369. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  370. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  371. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  372. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  373. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  374. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  375. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  376. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  377. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  378. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  379. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  380. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  381. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  382. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  383. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  384. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  385. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  386. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  387. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  388. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  389. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  390. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  391. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  392. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  393. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/middleware/__init__.py +0 -0
  394. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/middleware/auth.py +0 -0
  395. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/__init__.py +0 -0
  396. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/auth.py +0 -0
  397. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/caddy.py +0 -0
  398. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/can.py +0 -0
  399. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/config.py +0 -0
  400. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/covers.py +0 -0
  401. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/migrations.py +0 -0
  402. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/modbus.py +0 -0
  403. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/outputs.py +0 -0
  404. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/remote_devices.py +0 -0
  405. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/system.py +0 -0
  406. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/templates.py +0 -0
  407. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/timezone_sudoers.py +0 -0
  408. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/tools.py +0 -0
  409. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/routes/update.py +0 -0
  410. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/adc.schema.json +0 -0
  411. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/areas.schema.json +0 -0
  412. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  413. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/boneio.schema.json +0 -0
  414. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/can.schema.json +0 -0
  415. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/config.schema.json +0 -0
  416. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/cover.schema.json +0 -0
  417. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/dallas.schema.json +0 -0
  418. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/ds2482.schema.json +0 -0
  419. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/event.schema.json +0 -0
  420. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/ina219.schema.json +0 -0
  421. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/irrigation.schema.json +0 -0
  422. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/lm75.schema.json +0 -0
  423. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/logger.schema.json +0 -0
  424. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/lox_udp.schema.json +0 -0
  425. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  426. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  427. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/modbus.schema.json +0 -0
  428. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  429. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/mqtt.schema.json +0 -0
  430. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/oled.schema.json +0 -0
  431. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/output.schema.json +0 -0
  432. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/output_group.schema.json +0 -0
  433. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/pca9685.schema.json +0 -0
  434. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  435. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_devices.schema.json +0 -0
  436. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  437. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  438. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/sensor.schema.json +0 -0
  439. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/template.schema.json +0 -0
  440. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  441. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/schema/web.schema.json +0 -0
  442. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/services/__init__.py +0 -0
  443. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/services/logs.py +0 -0
  444. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/web_server.py +0 -0
  445. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio/webui/websocket_manager.py +0 -0
  446. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/dependency_links.txt +0 -0
  447. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/entry_points.txt +0 -0
  448. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/requires.txt +0 -0
  449. {boneio-1.4.0.dev13 → boneio-1.4.1}/boneio.egg-info/top_level.txt +0 -0
  450. {boneio-1.4.0.dev13 → boneio-1.4.1}/pyproject.toml +0 -0
  451. {boneio-1.4.0.dev13 → boneio-1.4.1}/setup.cfg +0 -0
  452. {boneio-1.4.0.dev13 → boneio-1.4.1}/setup.py +0 -0
  453. {boneio-1.4.0.dev13 → boneio-1.4.1}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.4.0.dev13
3
+ Version: 1.4.1
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
@@ -691,6 +691,13 @@ class IrrigationController:
691
691
  self._active_zone_remaining_s = duration
692
692
  self._state = ControllerState.RUNNING
693
693
 
694
+ # Publish state immediately so the UI (frontend + HA) shows
695
+ # RUNNING right away, before any pump/valve delay sleeps.
696
+ # The timer has not been armed yet so zone_end_time will be
697
+ # empty, but a second publish happens after hardware activation.
698
+ self._run_start_utc = utcnow()
699
+ await self.publish_all_states()
700
+
694
701
  if src is not None:
695
702
  if src.pump_start_valve_delay_s > 0:
696
703
  # Source first (pump+valve), then zone valve after delay
@@ -300,20 +300,57 @@ class CloudRegistration:
300
300
  """
301
301
  Check if certificate needs to be refreshed.
302
302
 
303
+ Parses the actual X.509 Not After date from the PEM file using openssl.
304
+ Returns True if cert expires within 14 days or can't be parsed.
305
+
303
306
  Returns:
304
- True if cert is older than 30 days or doesn't exist
307
+ True if certificate should be refreshed
305
308
  """
306
309
  if not self._cert_exists():
307
310
  return True
308
311
 
309
312
  try:
310
- # Check cert file age
311
- import time
313
+ result = await asyncio.get_event_loop().run_in_executor(
314
+ None,
315
+ lambda: subprocess.run(
316
+ ["openssl", "x509", "-enddate", "-noout", "-in", str(CERT_FILE)],
317
+ capture_output=True,
318
+ text=True,
319
+ timeout=5,
320
+ ),
321
+ )
312
322
 
313
- cert_age = time.time() - CERT_FILE.stat().st_mtime
314
- # Refresh if older than 30 days
315
- return cert_age > (30 * 24 * 3600)
316
- except Exception:
323
+ if result.returncode != 0:
324
+ _LOGGER.warning("Failed to read cert expiry: %s", result.stderr.strip())
325
+ return True
326
+
327
+ # Output format: "notAfter=Jun 3 12:00:00 2026 GMT"
328
+ line = result.stdout.strip()
329
+ date_str = line.split("=", 1)[1]
330
+
331
+ from datetime import datetime, timezone
332
+
333
+ expiry = datetime.strptime(date_str, "%b %d %H:%M:%S %Y %Z").replace(
334
+ tzinfo=timezone.utc
335
+ )
336
+ now = datetime.now(tz=timezone.utc)
337
+ days_left = (expiry - now).total_seconds() / 86400
338
+
339
+ _LOGGER.debug(
340
+ "SSL certificate expires: %s (%.1f days left)", expiry.isoformat(), days_left
341
+ )
342
+
343
+ # Refresh if expiring within 14 days
344
+ if days_left < 14:
345
+ _LOGGER.info(
346
+ "SSL certificate expires in %.1f days, refreshing", days_left
347
+ )
348
+ return True
349
+
350
+ return False
351
+
352
+ except Exception as e:
353
+ _LOGGER.warning("Error checking cert expiry, forcing refresh: %s", e)
317
354
  return True
318
355
 
319
356
  def update_ip(self, new_ip: str) -> None:
@@ -130,8 +130,16 @@ class InputManager:
130
130
  return False
131
131
  return False
132
132
 
133
- def configure_single_input(configure_sensor_func: Callable, gpio: dict) -> None:
134
- """Configure a single input (event or binary sensor)."""
133
+ def configure_single_input(
134
+ configure_sensor_func: Callable, gpio: dict, expected_class: type
135
+ ) -> None:
136
+ """Configure a single input (event or binary sensor).
137
+
138
+ Args:
139
+ configure_sensor_func: The _configure_event_sensor or _configure_binary_sensor method.
140
+ gpio: GPIO configuration dictionary.
141
+ expected_class: The expected class type (GpioEventButton or GpioInputBinarySensor).
142
+ """
135
143
  # Work on a copy to avoid modifying the cached config
136
144
  gpio_copy = gpio.copy()
137
145
 
@@ -149,6 +157,18 @@ class InputManager:
149
157
 
150
158
  existing_input = self._inputs.get(input_id, None) if reload_config else None
151
159
 
160
+ # Guard: if the existing input is a different class (type changed,
161
+ # e.g. event → binary_sensor), do NOT pass it as existing_input.
162
+ # A new object with the correct detector must be created instead.
163
+ if existing_input is not None and not isinstance(existing_input, expected_class):
164
+ _LOGGER.info(
165
+ "Input %s type changed from %s to %s, creating new input object",
166
+ input_id,
167
+ type(existing_input).__name__,
168
+ expected_class.__name__,
169
+ )
170
+ existing_input = None
171
+
152
172
  input_device = configure_sensor_func(
153
173
  gpio=gpio_copy,
154
174
  pin=pin,
@@ -172,14 +192,22 @@ class InputManager:
172
192
  # Configure event buttons
173
193
  for gpio in self._event_pins:
174
194
  try:
175
- configure_single_input(configure_sensor_func=self._configure_event_sensor, gpio=gpio)
195
+ configure_single_input(
196
+ configure_sensor_func=self._configure_event_sensor,
197
+ gpio=gpio,
198
+ expected_class=GpioEventButton,
199
+ )
176
200
  except GPIOInputException as err:
177
201
  _LOGGER.error("Failed to configure event input: %s", err)
178
202
 
179
203
  # Configure binary sensors
180
204
  for gpio in self._binary_pins:
181
205
  try:
182
- configure_single_input(configure_sensor_func=self._configure_binary_sensor, gpio=gpio)
206
+ configure_single_input(
207
+ configure_sensor_func=self._configure_binary_sensor,
208
+ gpio=gpio,
209
+ expected_class=GpioInputBinarySensor,
210
+ )
183
211
  except GPIOInputException as err:
184
212
  _LOGGER.error("Failed to configure binary sensor: %s", err)
185
213
 
@@ -490,21 +518,25 @@ class InputManager:
490
518
  # Get config from ConfigHelper (already reloaded by Manager)
491
519
  config = self._manager._config_helper.get_config()
492
520
 
493
- # Build map of new inputs from config (input_id -> {pin, area})
521
+ # Build map of new inputs from config (input_id -> {pin, area, ha_type})
494
522
  # Note: boneio_input is normalized to lowercase to match yaml_util.py behavior
495
523
  new_input_map: dict[str, dict] = {}
496
- for gpio in config.get(EVENT_ENTITY, []) + config.get(BINARY_SENSOR, []):
497
- pin = gpio.get("pin")
498
- # Determine input ID (same logic as in _configure_event_sensor/_configure_binary_sensor)
499
- if "id" in gpio:
500
- input_id = gpio["id"]
501
- elif "boneio_input" in gpio:
502
- input_id = gpio["boneio_input"].lower()
503
- elif pin:
504
- input_id = pin
505
- else:
506
- continue
507
- new_input_map[input_id] = {"pin": pin, "area": gpio.get("area")}
524
+ for ha_type, gpio_list in [
525
+ (EVENT_ENTITY, config.get(EVENT_ENTITY, [])),
526
+ (BINARY_SENSOR, config.get(BINARY_SENSOR, [])),
527
+ ]:
528
+ for gpio in gpio_list:
529
+ pin = gpio.get("pin")
530
+ # Determine input ID (same logic as in _configure_event_sensor/_configure_binary_sensor)
531
+ if "id" in gpio:
532
+ input_id = gpio["id"]
533
+ elif "boneio_input" in gpio:
534
+ input_id = gpio["boneio_input"].lower()
535
+ elif pin:
536
+ input_id = pin
537
+ else:
538
+ continue
539
+ new_input_map[input_id] = {"pin": pin, "area": gpio.get("area"), "ha_type": ha_type}
508
540
 
509
541
  # Find inputs to remove (in current config but not in new config)
510
542
  current_input_ids = set(self._inputs.keys())
@@ -512,12 +544,29 @@ class InputManager:
512
544
 
513
545
  inputs_to_remove = current_input_ids - new_input_ids
514
546
 
515
- _LOGGER.info(f"Input reload: current={current_input_ids}, new={new_input_ids}, to_remove={inputs_to_remove}")
547
+ _LOGGER.info("Input reload: current=%s, new=%s, to_remove=%s", current_input_ids, new_input_ids, inputs_to_remove)
548
+
549
+ # Detect inputs whose type changed (event <-> binary_sensor).
550
+ # These must be removed and re-created with the correct detector class.
551
+ inputs_type_changed: set[str] = set()
552
+ for input_id, new_info in new_input_map.items():
553
+ existing = self._inputs.get(input_id)
554
+ if existing is None:
555
+ continue
556
+ new_ha_type = new_info["ha_type"]
557
+ # GpioEventButton has input_type=INPUT, GpioInputBinarySensor has input_type=INPUT_SENSOR
558
+ if new_ha_type == EVENT_ENTITY and not isinstance(existing, GpioEventButton):
559
+ inputs_type_changed.add(input_id)
560
+ elif new_ha_type == BINARY_SENSOR and not isinstance(existing, GpioInputBinarySensor):
561
+ inputs_type_changed.add(input_id)
562
+
563
+ if inputs_type_changed:
564
+ _LOGGER.info("Input type changed for: %s — will recreate with new detector", inputs_type_changed)
516
565
 
517
566
  # Remove deleted inputs from internal state (GPIO pin stays registered - minimal overhead)
518
567
  ha_discovery_changed = False
519
568
 
520
- for input_id in inputs_to_remove:
569
+ for input_id in inputs_to_remove | inputs_type_changed:
521
570
  input_device = self._inputs.get(input_id)
522
571
  if input_device:
523
572
  old_area = getattr(input_device, "area", None)
@@ -528,7 +577,7 @@ class InputManager:
528
577
 
529
578
  # Remove from internal state (GPIO detector will be replaced by new input class)
530
579
  del self._inputs[input_id]
531
- _LOGGER.info(f"Removed input {input_id}")
580
+ _LOGGER.info("Removed input %s (type_changed=%s)", input_id, input_id in inputs_type_changed)
532
581
 
533
582
  # Check for area changes on remaining inputs
534
583
  for input_id, input_device in self._inputs.items():
@@ -537,7 +586,7 @@ class InputManager:
537
586
 
538
587
  if old_area != new_area:
539
588
  ha_discovery_changed = True
540
- _LOGGER.info(f"Input {input_id} area changed: {old_area} -> {new_area}, removing old HA Discovery")
589
+ _LOGGER.info("Input %s area changed: %s -> %s, removing old HA Discovery", input_id, old_area, new_area)
541
590
  self._remove_input_ha_discovery(input_id, old_area)
542
591
 
543
592
  # Wait for HA to process the removal before sending new discovery
@@ -547,6 +596,7 @@ class InputManager:
547
596
 
548
597
  # _configure_inputs with reload_config=True will:
549
598
  # - Update existing inputs (actions, area, name)
599
+ # - Create new inputs for type-changed entries (old objects removed above)
550
600
  # - Add new inputs if their GPIO pin is already registered
551
601
  self._configure_inputs(reload_config=True)
552
602
 
@@ -83,6 +83,7 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
83
83
 
84
84
  # Sensor state
85
85
  self._state: Any = None
86
+ self._attributes: dict[str, Any] = {}
86
87
  self._timestamp: float | None = None
87
88
  self._unit_of_measurement = unit_of_measurement or ""
88
89
 
@@ -135,10 +136,13 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
135
136
  """
136
137
  self._timestamp = timestamp
137
138
 
138
- # Send to MQTT
139
+ # Send to MQTT — include extra attributes if set by subclass
140
+ payload: dict[str, Any] = {STATE: self.state}
141
+ if self._attributes:
142
+ payload.update(self._attributes)
139
143
  self._message_bus.send_message(
140
144
  topic=self._send_topic,
141
- payload={STATE: self.state},
145
+ payload=payload,
142
146
  )
143
147
 
144
148
 
@@ -150,6 +154,7 @@ class BaseSensor(BasicMqtt, AsyncUpdater, Filter):
150
154
  state=self.state,
151
155
  unit=self.unit_of_measurement,
152
156
  timestamp=self.last_timestamp,
157
+ attributes=self._attributes if self._attributes else None,
153
158
  )
154
159
  ))
155
160
 
@@ -89,14 +89,17 @@ class DiskUsageSensor(BaseSensor):
89
89
 
90
90
  async def async_update(self, timestamp: float) -> None:
91
91
  """Fetch disk usage and publish to MQTT.
92
-
92
+
93
+ Publishes percentage as main state plus extra attributes
94
+ (disk_total_gib, disk_used_gib, disk_free_gib) for HA.
95
+
93
96
  Args:
94
97
  timestamp: Current timestamp
95
98
  """
96
99
  try:
97
100
  disk = psutil.disk_usage(self._mount_point)
98
101
  usage_percent = round(disk.percent, 1)
99
-
102
+
100
103
  _LOGGER.debug(
101
104
  "Disk usage for %s: %.1f%% (used: %d bytes, total: %d bytes)",
102
105
  self._mount_point,
@@ -104,10 +107,15 @@ class DiskUsageSensor(BaseSensor):
104
107
  disk.used,
105
108
  disk.total
106
109
  )
107
-
110
+
108
111
  self._state = usage_percent
112
+ self._attributes = {
113
+ "disk_total_gib": round(disk.total / (1024 ** 3), 2),
114
+ "disk_used_gib": round(disk.used / (1024 ** 3), 2),
115
+ "disk_free_gib": round(disk.free / (1024 ** 3), 2),
116
+ }
109
117
  self._publish_state(timestamp=timestamp)
110
-
118
+
111
119
  except Exception as err:
112
120
  _LOGGER.error("Error reading disk usage: %s", err)
113
121
 
@@ -161,24 +169,32 @@ class MemoryUsageSensor(BaseSensor):
161
169
 
162
170
  async def async_update(self, timestamp: float) -> None:
163
171
  """Fetch memory usage and publish to MQTT.
164
-
172
+
173
+ Publishes percentage as main state plus extra attributes
174
+ (memory_total_gib, memory_used_gib, memory_available_gib) for HA.
175
+
165
176
  Args:
166
177
  timestamp: Current timestamp
167
178
  """
168
179
  try:
169
180
  memory = psutil.virtual_memory()
170
181
  usage_percent = round(memory.percent, 1)
171
-
182
+
172
183
  _LOGGER.debug(
173
184
  "Memory usage: %.1f%% (used: %d bytes, total: %d bytes)",
174
185
  usage_percent,
175
186
  memory.used,
176
187
  memory.total
177
188
  )
178
-
189
+
179
190
  self._state = usage_percent
191
+ self._attributes = {
192
+ "memory_total_gib": round(memory.total / (1024 ** 3), 2),
193
+ "memory_used_gib": round(memory.used / (1024 ** 3), 2),
194
+ "memory_available_gib": round(memory.available / (1024 ** 3), 2),
195
+ }
180
196
  self._publish_state(timestamp=timestamp)
181
-
197
+
182
198
  except Exception as err:
183
199
  _LOGGER.error("Error reading memory usage: %s", err)
184
200
 
@@ -541,7 +541,7 @@ class Oled:
541
541
  else:
542
542
  self._next_screen()
543
543
 
544
- if not self._cancel_sleep_handle and self._sleep_timeout.total_seconds > 0:
544
+ if self._sleep_timeout.total_seconds > 0:
545
545
  self.start_sleep_timer()
546
546
 
547
547
  def _update_display(self) -> None:
@@ -776,7 +776,10 @@ def ha_sensor_system_availabilty_message(
776
776
  **kwargs
777
777
  ):
778
778
  """Create availability topic for system sensors (disk, memory, CPU).
779
-
779
+
780
+ Includes json_attributes_topic so HA picks up extra attributes
781
+ (e.g. disk_total_gb, memory_used_gb) from the same state topic.
782
+
780
783
  Args:
781
784
  id: Sensor ID
782
785
  name: Sensor name
@@ -785,7 +788,7 @@ def ha_sensor_system_availabilty_message(
785
788
  device_class: HA device class (optional)
786
789
  icon: MDI icon (optional)
787
790
  **kwargs: Additional fields
788
-
791
+
789
792
  Returns:
790
793
  HA discovery message dict
791
794
  """
@@ -801,12 +804,19 @@ def ha_sensor_system_availabilty_message(
801
804
  msg["state_class"] = "measurement"
802
805
  msg["value_template"] = "{{ value_json.state }}"
803
806
  msg["entity_category"] = "diagnostic"
804
-
807
+
808
+ # Expose extra attributes (e.g. disk_total_gb, memory_available_gb)
809
+ state_topic = msg.get("state_topic", f"{config_helper.topic_prefix}/{SENSOR}/{id}")
810
+ msg["json_attributes_topic"] = state_topic
811
+ msg["json_attributes_template"] = (
812
+ "{{ value_json | tojson }}"
813
+ )
814
+
805
815
  if device_class:
806
816
  msg["device_class"] = device_class
807
817
  if icon:
808
818
  msg["icon"] = icon
809
-
819
+
810
820
  return msg
811
821
 
812
822
 
@@ -69,6 +69,7 @@ class SensorState(BaseModel):
69
69
  state: float | str | None
70
70
  unit: str | None
71
71
  timestamp: float | None
72
+ attributes: dict[str, float | str | int | bool | None] | None = None
72
73
 
73
74
  class ModbusDeviceState(BaseModel):
74
75
  """Modbus device state model."""
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.4.1"
@@ -497,6 +497,23 @@ async def send_initial_states(
497
497
  except Exception as e:
498
498
  _LOGGER.error(f"Error preparing ADC sensor state: {type(e).__name__} - {e}")
499
499
 
500
+ # Send system sensor states (CPU, disk, memory)
501
+ for sensor in boneio_manager.sensors.get_system_sensors():
502
+ try:
503
+ sensor_state = SensorState(
504
+ id=sensor.id,
505
+ name=sensor.name,
506
+ state=sensor.state,
507
+ unit=sensor.unit_of_measurement,
508
+ timestamp=sensor.last_timestamp,
509
+ attributes=sensor._attributes if hasattr(sensor, "_attributes") and sensor._attributes else None,
510
+ )
511
+ update = SensorEvent(entity_id=sensor.id, state=sensor_state)
512
+ if not await send_state_update(update):
513
+ return False
514
+ except Exception as e:
515
+ _LOGGER.error(f"Error preparing system sensor state: {type(e).__name__} - {e}")
516
+
500
517
  # Send virtual energy sensor states
501
518
  for ve_sensor in boneio_manager.sensors.get_virtual_energy_sensors():
502
519
  try: