boneio 1.5.0.dev32__tar.gz → 1.5.0.dev34__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 (521) hide show
  1. {boneio-1.5.0.dev32/boneio.egg-info → boneio-1.5.0.dev34}/PKG-INFO +1 -1
  2. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_24_16.yaml +2 -0
  3. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_32_10.yaml +2 -0
  4. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/const.py +1 -0
  5. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/display.py +2 -2
  6. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/outputs.py +5 -3
  7. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/sensors.py +95 -1
  8. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/mcp23017.py +74 -13
  9. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/__init__.py +4 -1
  10. boneio-1.5.0.dev34/boneio/hardware/i2c/ina226.py +260 -0
  11. boneio-1.5.0.dev34/boneio/hardware/i2c/ina226_driver.py +309 -0
  12. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/runner.py +2 -0
  13. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/schema.yaml +44 -0
  14. boneio-1.5.0.dev34/boneio/version.py +2 -0
  15. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/app.py +17 -0
  16. {boneio-1.5.0.dev32/boneio/webui → boneio-1.5.0.dev34/boneio/webui/frontend-dist}/schema/config.schema.json +124 -0
  17. boneio-1.5.0.dev34/boneio/webui/frontend-dist/schema/ina226.schema.json +109 -0
  18. {boneio-1.5.0.dev32/boneio/webui → boneio-1.5.0.dev34/boneio/webui/frontend-dist}/schema/mcp23017.schema.json +21 -0
  19. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/sensors.py +10 -0
  20. {boneio-1.5.0.dev32/boneio/webui/frontend-dist → boneio-1.5.0.dev34/boneio/webui}/schema/config.schema.json +124 -0
  21. boneio-1.5.0.dev34/boneio/webui/schema/ina226.schema.json +109 -0
  22. {boneio-1.5.0.dev32/boneio/webui/frontend-dist → boneio-1.5.0.dev34/boneio/webui}/schema/mcp23017.schema.json +21 -0
  23. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34/boneio.egg-info}/PKG-INFO +1 -1
  24. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/SOURCES.txt +4 -0
  25. boneio-1.5.0.dev32/boneio/version.py +0 -2
  26. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/LICENSE +0 -0
  27. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/MANIFEST.in +0 -0
  28. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/README.md +0 -0
  29. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/__init__.py +0 -0
  30. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/input.yaml +0 -0
  31. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_24_16.yaml +0 -0
  32. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_32_10.yaml +0 -0
  33. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_32_5.yaml +0 -0
  34. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_cover.yaml +0 -0
  35. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  36. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/input.yaml +0 -0
  37. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_24_16.yaml +0 -0
  38. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_32_10.yaml +0 -0
  39. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_32_5.yaml +0 -0
  40. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_cover.yaml +0 -0
  41. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  42. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/input.yaml +0 -0
  43. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_24_16.yaml +0 -0
  44. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_32_10.yaml +0 -0
  45. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_32_5.yaml +0 -0
  46. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_cover.yaml +0 -0
  47. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  48. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/input.yaml +0 -0
  49. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_24_16.yaml +0 -0
  50. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_32_10.yaml +0 -0
  51. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_cover.yaml +0 -0
  52. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  53. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/input.yaml +0 -0
  54. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_24_16.yaml +0 -0
  55. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_32_10.yaml +0 -0
  56. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_cover.yaml +0 -0
  57. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  58. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/input.yaml +0 -0
  59. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_24_16.yaml +0 -0
  60. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_32_10.yaml +0 -0
  61. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_48_4.yaml +0 -0
  62. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_cover.yaml +0 -0
  63. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  64. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/input.yaml +0 -0
  65. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_24_16.yaml +0 -0
  66. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_32_10.yaml +0 -0
  67. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_48_4.yaml +0 -0
  68. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_cover.yaml +0 -0
  69. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  70. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/input.yaml +0 -0
  71. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_48_4.yaml +0 -0
  72. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_cover.yaml +0 -0
  73. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  74. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/bonecli.py +0 -0
  75. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/__init__.py +0 -0
  76. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/__init__.py +0 -0
  77. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/cover.py +0 -0
  78. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/time_based.py +0 -0
  79. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/cover/venetian.py +0 -0
  80. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/group/__init__.py +0 -0
  81. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/group/output_group.py +0 -0
  82. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/__init__.py +0 -0
  83. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/binary_sensor.py +0 -0
  84. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/detectors.py +0 -0
  85. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/event.py +0 -0
  86. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/__init__.py +0 -0
  87. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/base.py +0 -0
  88. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/input/remote/esphome.py +0 -0
  89. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/__init__.py +0 -0
  90. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/controller.py +0 -0
  91. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/irrigation/water_source.py +0 -0
  92. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/__init__.py +0 -0
  93. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/basic.py +0 -0
  94. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/buzzer.py +0 -0
  95. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/mcp.py +0 -0
  96. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/pca.py +0 -0
  97. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/pcf.py +0 -0
  98. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/output/remote.py +0 -0
  99. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/sensor/__init__.py +0 -0
  100. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/sensor/virtual_energy.py +0 -0
  101. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/__init__.py +0 -0
  102. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/alarm_panel.py +0 -0
  103. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/gate_cover.py +0 -0
  104. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/components/template/thermostat.py +0 -0
  105. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/__init__.py +0 -0
  106. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/__init__.py +0 -0
  107. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/__init__.py +0 -0
  108. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  109. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  110. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  111. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/registration.py +0 -0
  112. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/cloud/secrets.py +0 -0
  113. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/__init__.py +0 -0
  114. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/config_helper.py +0 -0
  115. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/__init__.py +0 -0
  116. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  117. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v2_transition.py +0 -0
  118. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  119. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/package-lock.json +0 -0
  120. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/package.json +0 -0
  121. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/schema_converter.py +0 -0
  122. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/yaml_compat.py +0 -0
  123. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/config/yaml_util.py +0 -0
  124. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/discovery.py +0 -0
  125. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/events/__init__.py +0 -0
  126. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/events/bus.py +0 -0
  127. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/__init__.py +0 -0
  128. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/action_conditions.py +0 -0
  129. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/canopen.py +0 -0
  130. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/covers.py +0 -0
  131. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/inputs.py +0 -0
  132. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/irrigation.py +0 -0
  133. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/manager.py +0 -0
  134. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/modbus.py +0 -0
  135. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/remote.py +0 -0
  136. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/remote_input_registrar.py +0 -0
  137. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/__init__.py +0 -0
  138. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/alarm.py +0 -0
  139. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/gate_cover.py +0 -0
  140. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates/thermostat.py +0 -0
  141. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/templates.py +0 -0
  142. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/manager/update.py +0 -0
  143. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/__init__.py +0 -0
  144. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/basic.py +0 -0
  145. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/basic_mqtt.py +0 -0
  146. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/composite.py +0 -0
  147. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/local.py +0 -0
  148. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/lox.py +0 -0
  149. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/mqtt.py +0 -0
  150. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/messaging/queue.py +0 -0
  151. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/__init__.py +0 -0
  152. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/base.py +0 -0
  153. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/can.py +0 -0
  154. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/esphome.py +0 -0
  155. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/mqtt.py +0 -0
  156. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/wled.py +0 -0
  157. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/remote/wled_cache.py +0 -0
  158. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/__init__.py +0 -0
  159. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/base.py +0 -0
  160. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/sensor/system.py +0 -0
  161. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/state/__init__.py +0 -0
  162. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/state/manager.py +0 -0
  163. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/__init__.py +0 -0
  164. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/host_data.py +0 -0
  165. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/system/monitor.py +0 -0
  166. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/__init__.py +0 -0
  167. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/async_updater.py +0 -0
  168. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/conditions.py +0 -0
  169. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/filter.py +0 -0
  170. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/font_util.py +0 -0
  171. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/logger.py +0 -0
  172. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/timeperiod.py +0 -0
  173. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/core/utils/util.py +0 -0
  174. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/adc.yaml +0 -0
  175. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  176. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/config.yaml +0 -0
  177. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/event.yaml +0 -0
  178. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/mqtt.yaml +0 -0
  179. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  180. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/adc.yaml +0 -0
  181. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  182. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/config.yaml +0 -0
  183. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/event.yaml +0 -0
  184. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/mqtt.yaml +0 -0
  185. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  186. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/adc.yaml +0 -0
  187. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  188. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/config.yaml +0 -0
  189. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/event.yaml +0 -0
  190. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/mqtt.yaml +0 -0
  191. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  192. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/__init__.py +0 -0
  193. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/can_master.yaml +0 -0
  194. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/can_slave.yaml +0 -0
  195. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/adc.yaml +0 -0
  196. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  197. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/config.yaml +0 -0
  198. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/cover.yaml +0 -0
  199. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/event.yaml +0 -0
  200. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/mqtt.yaml +0 -0
  201. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover/outputCover.yaml +0 -0
  202. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/adc.yaml +0 -0
  203. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  204. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/config.yaml +0 -0
  205. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/cover.yaml +0 -0
  206. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/event.yaml +0 -0
  207. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  208. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  209. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/adc.yaml +0 -0
  210. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  211. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  212. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  213. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  214. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/event_all.yaml +0 -0
  215. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  216. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  217. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  218. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  219. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  220. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  221. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/exceptions.py +0 -0
  222. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/__init__.py +0 -0
  223. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/analog/__init__.py +0 -0
  224. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/analog/adc.py +0 -0
  225. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/__init__.py +0 -0
  226. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/bridge.py +0 -0
  227. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/client.py +0 -0
  228. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/interface.py +0 -0
  229. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/node.py +0 -0
  230. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/node_id.py +0 -0
  231. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/can/test_od.py +0 -0
  232. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/__init__.py +0 -0
  233. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/early_oled.py +0 -0
  234. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  235. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/display/oled.py +0 -0
  236. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/__init__.py +0 -0
  237. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  238. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  239. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  240. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/__init__.py +0 -0
  241. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/base.py +0 -0
  242. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/gpio/input/manager.py +0 -0
  243. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/bus.py +0 -0
  244. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/ina219.py +0 -0
  245. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/ina219_driver.py +0 -0
  246. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/mcp9808.py +0 -0
  247. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/i2c/pct2075.py +0 -0
  248. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/onewire/__init__.py +0 -0
  249. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/onewire/dallas.py +0 -0
  250. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/__init__.py +0 -0
  251. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  252. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/base.py +0 -0
  253. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  254. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  255. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/__init__.py +0 -0
  256. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/homeassistant.py +0 -0
  257. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/interlock.py +0 -0
  258. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/integration/lox_template.py +0 -0
  259. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/__init__.py +0 -0
  260. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/actions.py +0 -0
  261. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  262. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/daemon.json +0 -0
  263. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  264. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  265. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  266. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  267. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  268. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/journald/journald.conf +0 -0
  269. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  270. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  271. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/sudoers/boneio +0 -0
  272. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  273. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  274. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/boneio.service +0 -0
  275. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  276. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  277. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  278. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  279. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  280. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  281. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  282. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  283. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  284. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  285. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/runner.py +0 -0
  286. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/__init__.py +0 -0
  287. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  288. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  289. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  290. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  291. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  292. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  293. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  294. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  295. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  296. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  297. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  298. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/__init__.py +0 -0
  299. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/cli.py +0 -0
  300. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/client.py +0 -0
  301. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/coordinator.py +0 -0
  302. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/__init__.py +0 -0
  303. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  304. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  305. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  306. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  307. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  308. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  309. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  310. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  311. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  312. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  313. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/thessla.json +0 -0
  314. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  315. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  316. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/inverters/sofar.json +0 -0
  317. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  318. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  319. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  320. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  321. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/cwt.json +0 -0
  322. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  323. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  324. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  325. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  326. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/pt100.json +0 -0
  327. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  328. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/sht20.json +0 -0
  329. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/devices/sensors/sht30.json +0 -0
  330. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/__init__.py +0 -0
  331. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/base.py +0 -0
  332. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/__init__.py +0 -0
  333. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/numeric.py +0 -0
  334. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/select.py +0 -0
  335. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/switch.py +0 -0
  336. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/derived/text.py +0 -0
  337. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/__init__.py +0 -0
  338. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/binary.py +0 -0
  339. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/numeric.py +0 -0
  340. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/sensor/text.py +0 -0
  341. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/__init__.py +0 -0
  342. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/binary.py +0 -0
  343. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/entities/writeable/numeric.py +0 -0
  344. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/mock_coordinator.py +0 -0
  345. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/modbus/utils.py +0 -0
  346. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/__init__.py +0 -0
  347. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/actions.py +0 -0
  348. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/events.py +0 -0
  349. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/files.py +0 -0
  350. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/logs.py +0 -0
  351. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/mqtt.py +0 -0
  352. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/models/state.py +0 -0
  353. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions.yaml +0 -0
  354. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions_sensor.yaml +0 -0
  355. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/actions_switch.yaml +0 -0
  356. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/condition.yaml +0 -0
  357. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/filters.yaml +0 -0
  358. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/filters_adc.yaml +0 -0
  359. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/id.yaml +0 -0
  360. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_devices.yaml +0 -0
  361. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_inputs.yaml +0 -0
  362. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/remote_outputs.yaml +0 -0
  363. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/temp_unit.yaml +0 -0
  364. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/schema/update_interval.yaml +0 -0
  365. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/action_validation.py +0 -0
  366. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/dashboard_cards.py +0 -0
  367. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/BindingMatrix-LxACKGJk.js +0 -0
  368. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ConfigEditor-Db9Hv4K7.js +0 -0
  369. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EditItemDialog-BBgUejNu.js +0 -0
  370. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EntityCard-V_dIvm7h.js +0 -0
  371. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/EntityGrid-CSg0J6S3.js +0 -0
  372. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/FormInputToggle-jYwQBCms.js +0 -0
  373. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
  374. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/InputsView--0TitNzt.js +0 -0
  375. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/LogViewer-0bOsZFY4.js +0 -0
  376. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
  377. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ModbusView-B65zWo-u.js +0 -0
  378. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/NodeRedView-4hx1AtCh.js +0 -0
  379. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/OutputsView-feRbZLV7.js +0 -0
  380. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SensorView-BI9r6Khx.js +0 -0
  381. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
  382. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SudoPasswordDialog-CdKObBJL.js +0 -0
  383. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/SystemState-Xwy9Q9yE.js +0 -0
  384. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/TemplatesView-BZPOKY7l.js +0 -0
  385. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/Tools--HWg7Etd.js +0 -0
  386. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/UISettings-DrOjn7rw.js +0 -0
  387. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  388. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  389. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  390. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  391. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  392. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  393. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/fa-C9nnJsGR.js +0 -0
  394. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  395. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/gi-DFg4IokC.js +0 -0
  396. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  397. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/index-Co9Pvhx4.css +0 -0
  398. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/index-DIN8b655.js +0 -0
  399. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  400. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
  401. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
  402. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  403. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  404. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  405. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
  406. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
  407. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  408. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/useTranslation-Dy6J9cmj.js +0 -0
  409. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
  410. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
  411. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  412. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  413. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  414. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  415. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio.svg +0 -0
  416. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  417. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/index.html +0 -0
  418. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  419. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  420. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  421. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  422. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  423. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  424. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  425. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  426. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  427. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  428. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  429. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  430. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  431. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  432. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  433. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  434. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  435. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  436. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  437. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  438. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  439. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  440. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  441. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  442. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  443. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  444. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  445. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  446. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  447. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  448. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/sw.js +0 -0
  449. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  450. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/hvac_svg_templates.py +0 -0
  451. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/middleware/__init__.py +0 -0
  452. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/middleware/auth.py +0 -0
  453. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/modbus_card_templates.py +0 -0
  454. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/__init__.py +0 -0
  455. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/auth.py +0 -0
  456. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/caddy.py +0 -0
  457. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/can.py +0 -0
  458. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config.py +0 -0
  459. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_actions.py +0 -0
  460. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_backups.py +0 -0
  461. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_core.py +0 -0
  462. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_discovery.py +0 -0
  463. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/config_files.py +0 -0
  464. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/covers.py +0 -0
  465. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/dashboard.py +0 -0
  466. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/dev_fake_device.py +0 -0
  467. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/irrigation.py +0 -0
  468. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/migrations.py +0 -0
  469. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/modbus.py +0 -0
  470. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/mqtt_reference.py +0 -0
  471. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/nodered.py +0 -0
  472. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/outputs.py +0 -0
  473. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/remote_devices.py +0 -0
  474. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/system.py +0 -0
  475. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/templates.py +0 -0
  476. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/timezone_sudoers.py +0 -0
  477. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/tools.py +0 -0
  478. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/routes/update.py +0 -0
  479. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/adc.schema.json +0 -0
  480. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/areas.schema.json +0 -0
  481. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  482. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/boneio.schema.json +0 -0
  483. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/can.schema.json +0 -0
  484. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/cover.schema.json +0 -0
  485. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/dallas.schema.json +0 -0
  486. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/ds2482.schema.json +0 -0
  487. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/event.schema.json +0 -0
  488. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/ina219.schema.json +0 -0
  489. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/irrigation.schema.json +0 -0
  490. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/lm75.schema.json +0 -0
  491. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/logger.schema.json +0 -0
  492. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/lox_udp.schema.json +0 -0
  493. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/mcp9808.schema.json +0 -0
  494. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/modbus.schema.json +0 -0
  495. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  496. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/mqtt.schema.json +0 -0
  497. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/oled.schema.json +0 -0
  498. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/output.schema.json +0 -0
  499. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/output_group.schema.json +0 -0
  500. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/pca9685.schema.json +0 -0
  501. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/pcf8575.schema.json +0 -0
  502. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_devices.schema.json +0 -0
  503. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  504. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  505. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/sensor.schema.json +0 -0
  506. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/template.schema.json +0 -0
  507. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  508. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/schema/web.schema.json +0 -0
  509. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/services/__init__.py +0 -0
  510. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/services/logs.py +0 -0
  511. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/sudo_rate_limiter.py +0 -0
  512. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/web_server.py +0 -0
  513. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio/webui/websocket_manager.py +0 -0
  514. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/dependency_links.txt +0 -0
  515. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/entry_points.txt +0 -0
  516. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/requires.txt +0 -0
  517. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/boneio.egg-info/top_level.txt +0 -0
  518. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/pyproject.toml +0 -0
  519. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/setup.cfg +0 -0
  520. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/setup.py +0 -0
  521. {boneio-1.5.0.dev32 → boneio-1.5.0.dev34}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.5.0.dev32
3
+ Version: 1.5.0.dev34
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
@@ -1,8 +1,10 @@
1
1
  mcp23017:
2
2
  - id: mcp_left
3
3
  address: 35
4
+ inverted: true
4
5
  - id: mcp_right
5
6
  address: 36
7
+ inverted: true
6
8
  output_mapping:
7
9
  out_01:
8
10
  kind: mcp
@@ -1,8 +1,10 @@
1
1
  mcp23017:
2
2
  - id: mcp_left
3
3
  address: 35
4
+ inverted: true
4
5
  - id: mcp_right
5
6
  address: 36
7
+ inverted: true
6
8
  output_mapping:
7
9
  out_01:
8
10
  kind: mcp
@@ -219,6 +219,7 @@ def filter_cover_extra_data(action_name: str, extra_data: dict) -> dict:
219
219
 
220
220
 
221
221
  INA219 = "ina219"
222
+ INA226 = "ina226"
222
223
  VIRTUAL_ENERGY_SENSOR = "virtual_energy_sensor"
223
224
 
224
225
  # IRRIGATION CONSTS
@@ -153,8 +153,8 @@ class DisplayManager:
153
153
  else None
154
154
  ),
155
155
  ina219=(
156
- self._manager.sensors.get_ina219_sensors()[0]
157
- if self._manager.sensors.get_ina219_sensors()
156
+ (self._manager.sensors.get_ina219_sensors() or self._manager.sensors.get_ina226_sensors())[0]
157
+ if (self._manager.sensors.get_ina219_sensors() or self._manager.sensors.get_ina226_sensors())
158
158
  else None
159
159
  ),
160
160
  extra_sensors=extra_sensors,
@@ -185,9 +185,11 @@ class OutputManager:
185
185
  id = expander[ID] or expander[ADDRESS]
186
186
  address = expander[ADDRESS]
187
187
  try:
188
- expander_dict[id] = _EXPANDER_CLASS[exp_type](
189
- i2c=self._manager._i2cbusio, address=address, reset=False
190
- )
188
+ kwargs = {"i2c": self._manager._i2cbusio, "address": address, "reset": False}
189
+ if exp_type == MCP:
190
+ kwargs["inverted"] = expander.get("inverted", None)
191
+ kwargs["state_manager"] = getattr(self._manager, "_state_manager", None)
192
+ expander_dict[id] = _EXPANDER_CLASS[exp_type](**kwargs)
191
193
  sleep_time = expander.get(INIT_SLEEP, TimePeriod(seconds=0))
192
194
  if sleep_time.total_seconds > 0:
193
195
  _LOGGER.debug(
@@ -19,6 +19,7 @@ from boneio.const import (
19
19
  FILTERS,
20
20
  ID,
21
21
  INA219,
22
+ INA226,
22
23
  LM75,
23
24
  MCP_TEMP_9808,
24
25
  ON,
@@ -79,6 +80,7 @@ class SensorManager:
79
80
  self._manager = manager
80
81
  self._temp_sensors: list[PCT2075 | MCP9808 | DallasSensor] = []
81
82
  self._ina219_sensors = []
83
+ self._ina226_sensors = []
82
84
  self._adc_sensors = []
83
85
  self._dallas_sensors: list[DallasSensor] = []
84
86
  self._system_sensors = []
@@ -88,15 +90,17 @@ class SensorManager:
88
90
  # Configure all sensor types
89
91
  self._configure_temp_sensors(sensors=sensors)
90
92
  self._configure_ina219_sensors(sensors=sensors)
93
+ self._configure_ina226_sensors(sensors=sensors)
91
94
  self._configure_dallas_sensors(dallas=dallas, sensors=sensors.get(ONEWIRE))
92
95
  self._configure_adc(adc_list=adc)
93
96
  self._configure_system_sensors()
94
97
  # Note: virtual_energy_sensors are configured after outputs are ready
95
98
 
96
99
  _LOGGER.info(
97
- "SensorManager initialized with %d temp sensors, %d INA219, %d ADC, %d Dallas, %d system",
100
+ "SensorManager initialized with %d temp sensors, %d INA219, %d INA226, %d ADC, %d Dallas, %d system",
98
101
  len(self._temp_sensors),
99
102
  len(self._ina219_sensors),
103
+ len(self._ina226_sensors),
100
104
  len(self._adc_sensors),
101
105
  len(self._dallas_sensors),
102
106
  len(self._system_sensors),
@@ -251,6 +255,76 @@ class SensorManager:
251
255
  )
252
256
  return None
253
257
 
258
+ # -------------------------------------------------------------------------
259
+ # INA226 Power Sensors (boneIO v1.0)
260
+ # -------------------------------------------------------------------------
261
+
262
+ def _configure_ina226_sensors(self, sensors: dict) -> None:
263
+ """Configure INA226 power monitoring sensors.
264
+
265
+ Args:
266
+ sensors: Dictionary of sensor configurations
267
+ """
268
+ if not sensors.get(INA226):
269
+ return
270
+
271
+ for sensor_config in sensors[INA226]:
272
+ ina226 = self._create_ina226_sensor(config=sensor_config)
273
+ if ina226:
274
+ self._ina226_sensors.append(ina226)
275
+
276
+ def _create_ina226_sensor(self, config: dict):
277
+ """Create INA226 sensor instance.
278
+
279
+ Args:
280
+ config: Sensor configuration dictionary
281
+
282
+ Returns:
283
+ INA226 sensor instance or None on error
284
+ """
285
+ from boneio.hardware.i2c import INA226
286
+
287
+ address = config[ADDRESS]
288
+ id = config.get(ID, str(address)).replace(" ", "")
289
+
290
+ try:
291
+ ina226 = INA226(
292
+ id=id,
293
+ address=address,
294
+ sensors=config.get("sensors", []),
295
+ r_shunt=config.get("r_shunt", 0.05),
296
+ max_current=config.get("max_current", 1.5),
297
+ manager=self._manager,
298
+ message_bus=self._manager._message_bus,
299
+ topic_prefix=self._manager._topic_prefix,
300
+ update_interval=config.get(UPDATE_INTERVAL, TimePeriod(seconds=60)),
301
+ )
302
+ # Send HA autodiscovery for each sub-sensor
303
+ for sensor in ina226.sensors.values():
304
+ payload = ha_sensor_ina_availabilty_message(
305
+ id=sensor.id,
306
+ name=sensor.name,
307
+ config_helper=self._manager._config_helper,
308
+ unit_of_measurement=sensor.unit_of_measurement,
309
+ device_class=sensor.device_class,
310
+ )
311
+ self._manager.publish_ha_discovery(id=sensor.id, ha_type=SENSOR, payload=payload)
312
+ return ina226
313
+ except I2CError as err:
314
+ _LOGGER.error("Can't configure INA226 sensor: %s", err)
315
+ self._manager._hardware_errors.append(
316
+ {
317
+ "type": "sensor",
318
+ "sensor_type": "ina226",
319
+ "id": id,
320
+ "name": id,
321
+ "address": address,
322
+ "error": str(err),
323
+ "message": f"INA226 sensor at address 0x{address:02X}: {err}",
324
+ }
325
+ )
326
+ return None
327
+
254
328
  # -------------------------------------------------------------------------
255
329
  # Dallas 1-Wire Sensors
256
330
  # -------------------------------------------------------------------------
@@ -808,6 +882,14 @@ class SensorManager:
808
882
  """
809
883
  return self._ina219_sensors
810
884
 
885
+ def get_ina226_sensors(self) -> list:
886
+ """Get all INA226 sensors.
887
+
888
+ Returns:
889
+ List of INA226 sensors
890
+ """
891
+ return self._ina226_sensors
892
+
811
893
  def get_adc_sensors(self) -> list:
812
894
  """Get all ADC sensors.
813
895
 
@@ -1361,6 +1443,18 @@ class SensorManager:
1361
1443
  )
1362
1444
  self._manager.publish_ha_discovery(id=sub.id, ha_type=SENSOR, payload=payload)
1363
1445
 
1446
+ # INA226 power sensors
1447
+ for ina in self._ina226_sensors:
1448
+ for sub in ina.sensors.values():
1449
+ payload = ha_sensor_ina_availabilty_message(
1450
+ id=sub.id,
1451
+ name=sub.name,
1452
+ config_helper=self._manager._config_helper,
1453
+ unit_of_measurement=sub.unit_of_measurement,
1454
+ device_class=sub.device_class,
1455
+ )
1456
+ self._manager.publish_ha_discovery(id=sub.id, ha_type=SENSOR, payload=payload)
1457
+
1364
1458
  # Dallas 1-Wire sensors
1365
1459
  for sensor in self._dallas_sensors:
1366
1460
  payload = ha_sensor_temp_availabilty_message(
@@ -49,13 +49,22 @@ class MCP23017:
49
49
  pin0.switch_to_output(value=True)
50
50
  """
51
51
 
52
- def __init__(self, i2c: SMBus2I2C, address: int = 0x20, reset: bool = False):
52
+ def __init__(
53
+ self,
54
+ i2c: SMBus2I2C,
55
+ address: int = 0x20,
56
+ reset: bool = False,
57
+ inverted: bool | None = None,
58
+ state_manager: Any = None,
59
+ ):
53
60
  """Initialize MCP23017.
54
61
 
55
62
  Args:
56
63
  i2c: I2C bus instance (SMBus2I2C)
57
64
  address: I2C address of the device (default 0x20)
58
65
  reset: Reset flag (unused, for API compatibility with Adafruit library)
66
+ inverted: Active-LOW relay board flag (True=active-LOW, False=active-HIGH, None=auto-detect)
67
+ state_manager: Optional StateManager instance to persist/read auto-detected logic
59
68
 
60
69
  Raises:
61
70
  ValueError: If address is not in valid range (0x20-0x27)
@@ -67,6 +76,7 @@ class MCP23017:
67
76
 
68
77
  self._i2c = i2c
69
78
  self._address = address
79
+ self._state_manager = state_manager
70
80
 
71
81
  # Lock for thread-safe pin operations
72
82
  # This prevents race conditions when multiple outputs are switched simultaneously
@@ -89,13 +99,55 @@ class MCP23017:
89
99
  # Write to both registers for robustness in case of dirty startup
90
100
  self._write_register_unlocked(0x0A, 0x20) # SEQOP=1 (disabled), BANK=0
91
101
  self._write_register_unlocked(0x0B, 0x20) # Mirror register
102
+
103
+ # Read IODIR to check if this is cold boot (all inputs = 0xFF)
104
+ iodir_a = self._read_register_unlocked(IODIRA)
105
+ iodir_b = self._read_register_unlocked(IODIRB)
106
+ is_cold_boot = (iodir_a == 0xFF and iodir_b == 0xFF)
107
+
108
+ # Determine inverted state:
109
+ # 1. Config override
110
+ # 2. State manager persisted value
111
+ # 3. Auto-detection on cold boot (GPIO read)
112
+ # 4. Fallback (False)
113
+ state_key = f"mcp_0x{address:02x}_inverted"
114
+ if inverted is not None:
115
+ self._inverted = bool(inverted)
116
+ _LOGGER.info("MCP23017@0x%02X inverted set from config: %s", address, self._inverted)
117
+ elif state_manager and state_manager.get("hardware", state_key) is not None:
118
+ self._inverted = bool(state_manager.get("hardware", state_key))
119
+ _LOGGER.info("MCP23017@0x%02X inverted loaded from state: %s", address, self._inverted)
120
+ elif is_cold_boot:
121
+ gpio_a = self._read_register_unlocked(GPIOA)
122
+ gpio_b = self._read_register_unlocked(GPIOB)
123
+ self._inverted = (gpio_a == 0xFF and gpio_b == 0xFF)
124
+ _LOGGER.info(
125
+ "MCP23017@0x%02X auto-detected relay board logic: %s (GPIOA=0x%02X, GPIOB=0x%02X)",
126
+ address,
127
+ "active-LOW (inverted)" if self._inverted else "active-HIGH",
128
+ gpio_a,
129
+ gpio_b,
130
+ )
131
+ if state_manager:
132
+ state_manager.save_attribute("hardware", state_key, self._inverted)
133
+ else:
134
+ self._inverted = False
135
+ _LOGGER.info("MCP23017@0x%02X inverted fallback: False", address)
92
136
 
93
137
  # Read current output latch states from hardware to preserve relay states
94
- # This prevents momentary OFF state during application restart
95
- self._port_a_state = self._read_register_unlocked(OLATA)
96
- self._port_b_state = self._read_register_unlocked(OLATB)
138
+ if is_cold_boot and self._inverted:
139
+ # Cold boot with active-LOW relays: set all pins to HIGH (0xFF) before setting IODIR=0x00
140
+ # so relays stay OFF during initial output configuration
141
+ self._port_a_state = 0xFF
142
+ self._port_b_state = 0xFF
143
+ self._write_register_unlocked(OLATA, 0xFF)
144
+ self._write_register_unlocked(OLATB, 0xFF)
145
+ else:
146
+ self._port_a_state = self._read_register_unlocked(OLATA)
147
+ self._port_b_state = self._read_register_unlocked(OLATB)
148
+
97
149
  _LOGGER.debug(
98
- f"MCP23017@0x{address:02X} preserved states: "
150
+ f"MCP23017@0x{address:02X} preserved states (inverted={self._inverted}): "
99
151
  f"A=0b{self._port_a_state:08b}, B=0b{self._port_b_state:08b}"
100
152
  )
101
153
 
@@ -104,7 +156,7 @@ class MCP23017:
104
156
  self._write_register_unlocked(IODIRA, 0x00)
105
157
  self._write_register_unlocked(IODIRB, 0x00)
106
158
 
107
- _LOGGER.info(f"Initialized MCP23017 at address 0x{address:02X}")
159
+ _LOGGER.info(f"Initialized MCP23017 at address 0x{address:02X} (inverted={self._inverted})")
108
160
  finally:
109
161
  self._i2c.unlock()
110
162
 
@@ -191,6 +243,11 @@ class MCP23017:
191
243
  iodir &= ~(1 << pin_bit) # Clear bit = output
192
244
  self._write_register_unlocked(IODIRB, iodir)
193
245
 
246
+ @property
247
+ def inverted(self) -> bool:
248
+ """Check whether expander operates in inverted (active-LOW) mode."""
249
+ return self._inverted
250
+
194
251
  def _write_pin(self, pin_number: int, value: bool) -> None:
195
252
  """Write value to a pin using ATOMIC hardware Read-Modify-Write.
196
253
 
@@ -199,7 +256,7 @@ class MCP23017:
199
256
 
200
257
  Args:
201
258
  pin_number: Pin number (0-15)
202
- value: Output state (True=HIGH, False=LOW)
259
+ value: Output state (True=ON/HIGH logical, False=OFF/LOW logical)
203
260
  """
204
261
  with self._lock:
205
262
  # Rate limiting: ensure minimum delay between I2C operations
@@ -223,8 +280,11 @@ class MCP23017:
223
280
  # Read current state from hardware
224
281
  current_state = self._read_register_unlocked(reg)
225
282
 
283
+ # Account for active-LOW inverted logic
284
+ effective_value = not value if self._inverted else value
285
+
226
286
  # Calculate new state
227
- if value:
287
+ if effective_value:
228
288
  new_state = current_state | (1 << bit)
229
289
  else:
230
290
  new_state = current_state & ~(1 << bit)
@@ -232,7 +292,7 @@ class MCP23017:
232
292
  # Only write if state changed
233
293
  if new_state != current_state:
234
294
  _LOGGER.debug(
235
- f"MCP23017@0x{self._address:02X} pin {pin_number} -> {value}: "
295
+ f"MCP23017@0x{self._address:02X} pin {pin_number} -> {value} (phys={effective_value}): "
236
296
  f"{'OLATA' if pin_number < 8 else 'OLATB'} "
237
297
  f"0b{current_state:08b} -> 0b{new_state:08b}"
238
298
  )
@@ -277,23 +337,24 @@ class MCP23017:
277
337
  self._write_pin(pin_number, value)
278
338
 
279
339
  def get_pin_value(self, pin_number: int) -> bool:
280
- """Get current pin value.
340
+ """Get current logical pin value.
281
341
 
282
342
  Args:
283
343
  pin_number: Pin number (0-15)
284
344
 
285
345
  Returns:
286
- Current pin state
346
+ Current logical pin state (accounting for active-LOW inverted logic)
287
347
  """
288
348
  if not 0 <= pin_number <= 15:
289
349
  raise ValueError(f"Pin number must be 0-15, got {pin_number}")
290
350
 
291
351
  with self._lock:
292
352
  if pin_number < 8:
293
- return bool(self._port_a_state & (1 << pin_number))
353
+ raw_state = bool(self._port_a_state & (1 << pin_number))
294
354
  else:
295
355
  pin_bit = pin_number - 8
296
- return bool(self._port_b_state & (1 << pin_bit))
356
+ raw_state = bool(self._port_b_state & (1 << pin_bit))
357
+ return not raw_state if self._inverted else raw_state
297
358
 
298
359
  def verify_port_state(self) -> tuple[int, int]:
299
360
  """Read actual port states from hardware and compare with cached state.
@@ -3,11 +3,12 @@
3
3
  This module provides I2C bus support and I2C-based sensors:
4
4
  - SMBus2I2C wrapper for I2C communication
5
5
  - Temperature sensors (PCT2075/LM75, MCP9808)
6
- - Power monitoring (INA219)
6
+ - Power monitoring (INA219 for v0.8, INA226 for v1.0)
7
7
  """
8
8
 
9
9
  from boneio.hardware.i2c.bus import SMBus2I2C
10
10
  from boneio.hardware.i2c.ina219 import INA219, INA219Sensor
11
+ from boneio.hardware.i2c.ina226 import INA226, INA226Sensor
11
12
  from boneio.hardware.i2c.mcp9808 import MCP9808
12
13
  from boneio.hardware.i2c.pct2075 import PCT2075
13
14
 
@@ -20,4 +21,6 @@ __all__ = [
20
21
  # Power monitoring
21
22
  "INA219",
22
23
  "INA219Sensor",
24
+ "INA226",
25
+ "INA226Sensor",
23
26
  ]
@@ -0,0 +1,260 @@
1
+ """INA226 power monitoring sensor driver.
2
+
3
+ This module provides support for INA226 current/voltage/power monitoring sensor.
4
+ The INA226 is a high-side/low-side current shunt and power monitor with I2C
5
+ interface, used on boneIO Black v1.0 boards (replacing INA219 from v0.8).
6
+
7
+ Key improvements over INA219:
8
+ - Bus voltage range: 0–36V (vs 0–26V)
9
+ - Bus voltage resolution: 1.25 mV (vs 4 mV)
10
+ - Internal power register (no need for V×I computation)
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import logging
17
+ import time
18
+ from datetime import datetime
19
+
20
+ from boneio.const import SENSOR, STATE
21
+ from boneio.core.messaging import BasicMqtt
22
+ from boneio.core.utils import AsyncUpdater, Filter
23
+ from boneio.exceptions import I2CError
24
+ from boneio.hardware.i2c.ina226_driver import INA226_I2C
25
+ from boneio.models import SensorState
26
+ from boneio.models.events import SensorEvent
27
+
28
+ _LOGGER = logging.getLogger(__name__)
29
+
30
+ # Unit conversion for different measurement types
31
+ UNIT_CONVERTER = {"current": "A", "power": "W", "voltage": "V"}
32
+
33
+
34
+ class INA226Sensor(BasicMqtt, Filter):
35
+ """Single measurement from INA226 sensor.
36
+
37
+ This class represents one measurement type (current, voltage, or power)
38
+ from an INA226 sensor. Multiple INA226Sensor instances are typically
39
+ managed by a single INA226 coordinator.
40
+
41
+ Args:
42
+ device_class: Type of measurement ('current', 'voltage', or 'power')
43
+ filters: List of filter expressions to apply
44
+ state: Initial state value
45
+ **kwargs: Additional arguments (name, id, message_bus, etc.)
46
+ """
47
+
48
+ def __init__(
49
+ self, device_class: str, filters: list, state: float | None, **kwargs
50
+ ) -> None:
51
+ """Initialize INA226 sensor."""
52
+ super().__init__(topic_type=SENSOR, **kwargs)
53
+ self._unit_of_measurement = UNIT_CONVERTER[device_class]
54
+ self._device_class = device_class
55
+ self._filters = filters
56
+ self._raw_state = state
57
+ self._timestamp = time.time()
58
+ self._state = (
59
+ self._apply_filters(value=self._raw_state) if self._raw_state else None
60
+ )
61
+
62
+ @property
63
+ def raw_state(self) -> float | None:
64
+ """Get raw unfiltered state value.
65
+
66
+ Returns:
67
+ Raw measurement value or None
68
+ """
69
+ return self._raw_state
70
+
71
+ @raw_state.setter
72
+ def raw_state(self, value: float) -> None:
73
+ """Set raw state value.
74
+
75
+ Args:
76
+ value: New raw measurement value
77
+ """
78
+ self._raw_state = value
79
+
80
+ @property
81
+ def state(self) -> float | None:
82
+ """Get filtered state value.
83
+
84
+ Returns:
85
+ Filtered measurement value or None
86
+ """
87
+ return self._state
88
+
89
+ @property
90
+ def device_class(self) -> str:
91
+ """Get device class (measurement type).
92
+
93
+ Returns:
94
+ Device class string ('current', 'voltage', or 'power')
95
+ """
96
+ return self._device_class
97
+
98
+ @property
99
+ def unit_of_measurement(self) -> str:
100
+ """Get unit of measurement.
101
+
102
+ Returns:
103
+ Unit string ('A', 'V', or 'W')
104
+ """
105
+ return self._unit_of_measurement
106
+
107
+ @property
108
+ def last_timestamp(self) -> float:
109
+ """Get timestamp of last update.
110
+
111
+ Returns:
112
+ Unix timestamp
113
+ """
114
+ return self._timestamp
115
+
116
+ def update(self, timestamp: float) -> None:
117
+ """Update sensor state and publish to MQTT.
118
+
119
+ Args:
120
+ timestamp: Current timestamp
121
+ """
122
+ _state = self._apply_filters(value=self._raw_state) if self._raw_state else None
123
+ if not _state:
124
+ return
125
+ self._state = _state
126
+ self._timestamp = timestamp
127
+ self._message_bus.send_message(
128
+ topic=self._send_topic,
129
+ payload={STATE: self.state},
130
+ )
131
+
132
+
133
+ class INA226(AsyncUpdater):
134
+ """INA226 power monitoring sensor coordinator.
135
+
136
+ This class manages an INA226 sensor and its multiple measurement types
137
+ (current, voltage, power). It periodically reads values from the sensor
138
+ and updates individual INA226Sensor instances.
139
+
140
+ Features:
141
+ - High-side/low-side current sensing
142
+ - 0–36V bus voltage measurement (1.25 mV resolution)
143
+ - Internal power calculation (more accurate than V×I)
144
+ - I2C interface (address: 0x40–0x4F)
145
+ - 16-bit ADC with configurable averaging
146
+
147
+ Args:
148
+ address: I2C address of the sensor (default: 0x40)
149
+ id: Sensor identifier
150
+ sensors: List of sensor configurations (device_class, id, filters)
151
+ r_shunt: Shunt resistor value in Ohms (default: 0.05 for boneIO v1.0)
152
+ max_current: Maximum expected current in A (default: 1.5)
153
+ **kwargs: Additional arguments (manager, update_interval, etc.)
154
+ """
155
+
156
+ def __init__(
157
+ self,
158
+ address: int,
159
+ id: str,
160
+ sensors: list[dict] | None = None,
161
+ r_shunt: float = 0.05,
162
+ max_current: float = 1.5,
163
+ **kwargs,
164
+ ) -> None:
165
+ """Initialize INA226 sensor coordinator.
166
+
167
+ Raises:
168
+ I2CError: If sensor is not found or communication fails
169
+ """
170
+ if sensors is None:
171
+ sensors = []
172
+ self._loop = asyncio.get_event_loop()
173
+ self._sensors: dict[str, INA226Sensor] = {}
174
+ self._id = id
175
+
176
+ # Initialize hardware sensor with error handling
177
+ try:
178
+ self._ina = INA226_I2C(
179
+ address=address,
180
+ r_shunt=r_shunt,
181
+ max_current=max_current,
182
+ )
183
+ except OSError as err:
184
+ raise I2CError(
185
+ f"Failed to initialize INA226 at address 0x{address:02X}: {err}"
186
+ ) from err
187
+
188
+ # Create individual sensor instances for each measurement type
189
+ for sensor in sensors:
190
+ _name = sensor["id"]
191
+ _id = f"{id}{_name.replace(' ', '')}"
192
+ self._sensors[sensor["device_class"]] = INA226Sensor(
193
+ device_class=sensor["device_class"],
194
+ filters=sensor.get("filters", []),
195
+ state=None,
196
+ name=_name,
197
+ id=_id,
198
+ **kwargs,
199
+ )
200
+
201
+ AsyncUpdater.__init__(self, **kwargs)
202
+ _LOGGER.info(
203
+ "Configured INA226 on address 0x%02X with %d sensors "
204
+ "(R_SHUNT=%.3fΩ, I_max=%.1fA)",
205
+ address, len(self._sensors), r_shunt, max_current,
206
+ )
207
+
208
+ @property
209
+ def id(self) -> str:
210
+ """Get sensor coordinator ID.
211
+
212
+ Returns:
213
+ Coordinator identifier string
214
+ """
215
+ return self._id
216
+
217
+ @property
218
+ def sensors(self) -> dict[str, INA226Sensor]:
219
+ """Get dictionary of managed sensors.
220
+
221
+ Returns:
222
+ Dictionary mapping device_class to INA226Sensor instances
223
+ """
224
+ return self._sensors
225
+
226
+ async def async_update(self, timestamp: datetime) -> None:
227
+ """Read sensor values and update all managed sensors.
228
+
229
+ This method is called periodically by AsyncUpdater. It reads
230
+ current, voltage, and power from the INA226 and updates the
231
+ corresponding sensor instances.
232
+
233
+ Args:
234
+ timestamp: Current timestamp
235
+ """
236
+ for k, sensor in self._sensors.items():
237
+ try:
238
+ value = getattr(self._ina, k)
239
+ _LOGGER.debug(
240
+ "Fetched INA226 value: %s = %s %s",
241
+ k, value, sensor.unit_of_measurement,
242
+ )
243
+
244
+ if sensor.raw_state != value:
245
+ sensor.raw_state = value
246
+ sensor.update(timestamp=timestamp)
247
+
248
+ # Trigger event on EventBus
249
+ self.manager.event_bus.trigger_event(SensorEvent(
250
+ entity_id=sensor.id,
251
+ state=SensorState(
252
+ id=sensor.id,
253
+ name=sensor.name,
254
+ state=sensor.state,
255
+ unit=sensor.unit_of_measurement,
256
+ timestamp=sensor.last_timestamp,
257
+ ),
258
+ ))
259
+ except Exception as err:
260
+ _LOGGER.error("Error reading INA226 %s: %s", k, err)