boneIO 1.1.0.dev3__tar.gz → 1.1.0.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. {boneio-1.1.0.dev3/boneio.egg-info → boneio-1.1.0.dev4}/PKG-INFO +1 -1
  2. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/config_helper.py +8 -0
  3. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/inputs.py +8 -0
  4. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/manager.py +20 -0
  5. boneio-1.1.0.dev4/boneio/core/manager/update.py +341 -0
  6. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/homeassistant.py +44 -0
  7. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/runner.py +1 -0
  8. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/schema.yaml +12 -0
  9. boneio-1.1.0.dev4/boneio/version.py +2 -0
  10. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/app.py +2 -0
  11. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/cssMode-D_Y1ZXCG.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/cssMode-CfBnHhQI.js +1 -1
  12. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/freemarker2-CzSRjwLP.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/freemarker2-Bh2BQpSG.js +1 -1
  13. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/handlebars-CZgWREM_.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/handlebars-D68RL95z.js +1 -1
  14. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/html-l_-Dx9v2.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/html-XKVYovyY.js +1 -1
  15. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/htmlMode-C94ufgZC.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/htmlMode-QT0rbnhL.js +1 -1
  16. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-BtWe9nS_.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/index-NKuu8fvk.js +5 -5
  17. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/javascript-CTWNFYCB.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/javascript-CxT2_Xcl.js +1 -1
  18. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/jsonMode-6lY0okwf.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/jsonMode-mhlSbJro.js +1 -1
  19. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/liquid-BpvwlD2T.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/liquid-D62PitRX.js +1 -1
  20. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/mdx-CLQNFljY.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/mdx-C5xjvE7q.js +1 -1
  21. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/python-Cq5ZYn3v.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/python-B5fpI3od.js +1 -1
  22. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/razor-kCTdL12M.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/razor-DaPtFLXE.js +1 -1
  23. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/tsMode-C1oHUIMn.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/tsMode-ltYtI_us.js +1 -1
  24. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/typescript-Bg5eEWu8.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/typescript-DwdFtOSo.js +1 -1
  25. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/xml-CMwCv6rv.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/xml-CiaIsyq7.js +1 -1
  26. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/yaml-CVxeQdw0.js → boneio-1.1.0.dev4/boneio/webui/frontend-dist/assets/yaml-DWYHE4pc.js +1 -1
  27. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/index.html +1 -1
  28. {boneio-1.1.0.dev3/boneio/webui/schema → boneio-1.1.0.dev4/boneio/webui/frontend-dist/schem}/config.schema.json +19 -6
  29. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mqtt.schema.json +13 -0
  30. {boneio-1.1.0.dev3/boneio/webui/schema → boneio-1.1.0.dev4/boneio/webui/frontend-dist/schem}/web.schema.json +6 -6
  31. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/update.py +42 -1
  32. {boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev4/boneio/webui/schema}/config.schema.json +19 -6
  33. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mqtt.schema.json +13 -0
  34. {boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev4/boneio/webui/schema}/web.schema.json +6 -6
  35. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4/boneio.egg-info}/PKG-INFO +1 -1
  36. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/SOURCES.txt +17 -16
  37. boneio-1.1.0.dev3/boneio/version.py +0 -2
  38. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/LICENSE +0 -0
  39. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/MANIFEST.in +0 -0
  40. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/README.md +0 -0
  41. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/__init__.py +0 -0
  42. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/input.yaml +0 -0
  43. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_24_16.yaml +0 -0
  44. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_32_10.yaml +0 -0
  45. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_32_5.yaml +0 -0
  46. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_cover.yaml +0 -0
  47. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  48. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/input.yaml +0 -0
  49. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_24_16.yaml +0 -0
  50. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_32_10.yaml +0 -0
  51. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_32_5.yaml +0 -0
  52. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_cover.yaml +0 -0
  53. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  54. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/input.yaml +0 -0
  55. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_24_16.yaml +0 -0
  56. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_32_10.yaml +0 -0
  57. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_32_5.yaml +0 -0
  58. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_cover.yaml +0 -0
  59. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  60. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/input.yaml +0 -0
  61. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_24_16.yaml +0 -0
  62. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_32_10.yaml +0 -0
  63. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_cover.yaml +0 -0
  64. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  65. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/input.yaml +0 -0
  66. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_24_16.yaml +0 -0
  67. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_32_10.yaml +0 -0
  68. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_cover.yaml +0 -0
  69. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  70. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/input.yaml +0 -0
  71. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_24_16.yaml +0 -0
  72. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_32_10.yaml +0 -0
  73. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_cover.yaml +0 -0
  74. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  75. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/input.yaml +0 -0
  76. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_24_16.yaml +0 -0
  77. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_32_10.yaml +0 -0
  78. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_cover.yaml +0 -0
  79. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  80. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/bonecli.py +0 -0
  81. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/__init__.py +0 -0
  82. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/__init__.py +0 -0
  83. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/cover.py +0 -0
  84. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/previous.py +0 -0
  85. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/time_based.py +0 -0
  86. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/cover/venetian.py +0 -0
  87. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/group/__init__.py +0 -0
  88. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/group/output_group.py +0 -0
  89. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/__init__.py +0 -0
  90. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/binary_sensor.py +0 -0
  91. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/detectors.py +0 -0
  92. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/input/event.py +0 -0
  93. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/__init__.py +0 -0
  94. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/basic.py +0 -0
  95. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/mcp.py +0 -0
  96. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/pca.py +0 -0
  97. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/output/pcf.py +0 -0
  98. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/sensor/__init__.py +0 -0
  99. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/components/sensor/virtual_energy.py +0 -0
  100. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/const.py +0 -0
  101. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/__init__.py +0 -0
  102. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/__init__.py +0 -0
  103. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/package-lock.json +0 -0
  104. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/package.json +0 -0
  105. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/schema_converter.py +0 -0
  106. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/config/yaml_util.py +0 -0
  107. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/discovery.py +0 -0
  108. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/events/__init__.py +0 -0
  109. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/events/bus.py +0 -0
  110. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/__init__.py +0 -0
  111. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/covers.py +0 -0
  112. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/display.py +0 -0
  113. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/modbus.py +0 -0
  114. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/outputs.py +0 -0
  115. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/remote.py +0 -0
  116. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/manager/sensors.py +0 -0
  117. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/__init__.py +0 -0
  118. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/basic.py +0 -0
  119. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/basic_mqtt.py +0 -0
  120. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/local.py +0 -0
  121. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/mqtt.py +0 -0
  122. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/messaging/queue.py +0 -0
  123. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/__init__.py +0 -0
  124. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/base.py +0 -0
  125. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/esphome.py +0 -0
  126. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/mqtt.py +0 -0
  127. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/remote/wled.py +0 -0
  128. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/__init__.py +0 -0
  129. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/base.py +0 -0
  130. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/sensor/system.py +0 -0
  131. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/state/__init__.py +0 -0
  132. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/state/manager.py +0 -0
  133. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/__init__.py +0 -0
  134. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/host_data.py +0 -0
  135. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/system/monitor.py +0 -0
  136. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/__init__.py +0 -0
  137. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/async_updater.py +0 -0
  138. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/filter.py +0 -0
  139. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/font_util.py +0 -0
  140. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/logger.py +0 -0
  141. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/timeperiod.py +0 -0
  142. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/core/utils/util.py +0 -0
  143. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/adc.yaml +0 -0
  144. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  145. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/config.yaml +0 -0
  146. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/event.yaml +0 -0
  147. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/mqtt.yaml +0 -0
  148. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  149. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/adc.yaml +0 -0
  150. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  151. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/config.yaml +0 -0
  152. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/event.yaml +0 -0
  153. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/mqtt.yaml +0 -0
  154. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  155. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/__init__.py +0 -0
  156. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/adc.yaml +0 -0
  157. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  158. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/config.yaml +0 -0
  159. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/cover.yaml +0 -0
  160. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/event.yaml +0 -0
  161. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/mqtt.yaml +0 -0
  162. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover/outputCover.yaml +0 -0
  163. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/adc.yaml +0 -0
  164. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  165. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/config.yaml +0 -0
  166. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/cover.yaml +0 -0
  167. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/event.yaml +0 -0
  168. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  169. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  170. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/adc.yaml +0 -0
  171. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  172. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  173. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  174. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  175. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/event_all.yaml +0 -0
  176. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  177. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  178. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  179. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  180. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  181. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  182. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/exceptions.py +0 -0
  183. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/__init__.py +0 -0
  184. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/analog/__init__.py +0 -0
  185. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/analog/adc.py +0 -0
  186. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/__init__.py +0 -0
  187. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  188. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/display/oled.py +0 -0
  189. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/__init__.py +0 -0
  190. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  191. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  192. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  193. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  194. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/__init__.py +0 -0
  195. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/base.py +0 -0
  196. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/gpio/input/manager.py +0 -0
  197. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/__init__.py +0 -0
  198. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/bus.py +0 -0
  199. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/ina219.py +0 -0
  200. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/ina219_driver.py +0 -0
  201. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/mcp9808.py +0 -0
  202. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/i2c/pct2075.py +0 -0
  203. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/__init__.py +0 -0
  204. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/bus.py +0 -0
  205. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/dallas.py +0 -0
  206. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/onewire/ds2482.py +0 -0
  207. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/__init__.py +0 -0
  208. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  209. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/base.py +0 -0
  210. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  211. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  212. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/__init__.py +0 -0
  213. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/integration/interlock.py +0 -0
  214. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/__init__.py +0 -0
  215. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/cli.py +0 -0
  216. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/client.py +0 -0
  217. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/coordinator.py +0 -0
  218. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/__init__.py +0 -0
  219. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  220. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  221. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  222. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  223. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  224. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  225. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  226. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/inverters/sofar.json +0 -0
  227. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/inverters/thessla.json +0 -0
  228. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  229. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/other/wanas415.json +0 -0
  230. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/cwt.json +0 -0
  231. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  232. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  233. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  234. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/pt100.json +0 -0
  235. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/sht20.json +0 -0
  236. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/devices/sensors/sht30.json +0 -0
  237. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/__init__.py +0 -0
  238. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/base.py +0 -0
  239. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/__init__.py +0 -0
  240. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/numeric.py +0 -0
  241. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/select.py +0 -0
  242. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/switch.py +0 -0
  243. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/derived/text.py +0 -0
  244. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/__init__.py +0 -0
  245. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/binary.py +0 -0
  246. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/numeric.py +0 -0
  247. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/sensor/text.py +0 -0
  248. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/__init__.py +0 -0
  249. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/binary.py +0 -0
  250. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/entities/writeable/numeric.py +0 -0
  251. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/modbus/utils.py +0 -0
  252. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/__init__.py +0 -0
  253. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/actions.py +0 -0
  254. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/events.py +0 -0
  255. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/files.py +0 -0
  256. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/logs.py +0 -0
  257. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/mqtt.py +0 -0
  258. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/models/state.py +0 -0
  259. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions.yaml +0 -0
  260. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions_sensor.yaml +0 -0
  261. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/actions_switch.yaml +0 -0
  262. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/filters.yaml +0 -0
  263. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/filters_adc.yaml +0 -0
  264. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/id.yaml +0 -0
  265. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/remote_devices.yaml +0 -0
  266. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/temp_unit.yaml +0 -0
  267. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/schema/update_interval.yaml +0 -0
  268. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  269. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  270. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  271. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  272. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  273. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  274. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  275. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  276. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  277. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  278. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  279. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  280. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  281. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  282. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  283. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  284. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  285. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  286. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  287. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  288. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  289. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  290. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  291. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  292. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +0 -0
  293. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  294. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  295. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  296. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  297. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  298. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  299. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  300. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  301. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  302. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  303. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  304. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  305. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  306. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  307. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  308. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  309. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  310. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  311. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  312. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  313. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  314. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  315. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  316. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  317. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  318. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  319. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  320. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  321. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  322. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  323. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  324. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  325. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  326. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  327. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  328. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  329. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  330. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  331. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  332. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  333. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  334. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  335. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  336. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  337. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  338. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  339. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  340. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  341. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  342. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  343. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/boneio.svg +0 -0
  344. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  345. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
  346. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
  347. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +0 -0
  348. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
  349. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
  350. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  351. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
  352. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/event.schema.json +0 -0
  353. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
  354. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
  355. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  356. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
  357. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
  358. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
  359. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +0 -0
  360. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
  361. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
  362. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
  363. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
  364. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
  365. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -0
  366. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
  367. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
  368. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/middleware/__init__.py +0 -0
  369. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/middleware/auth.py +0 -0
  370. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/__init__.py +0 -0
  371. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/auth.py +0 -0
  372. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/caddy.py +0 -0
  373. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/config.py +0 -0
  374. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/covers.py +0 -0
  375. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/modbus.py +0 -0
  376. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/outputs.py +0 -0
  377. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/remote_devices.py +0 -0
  378. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/sensors.py +0 -0
  379. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/routes/system.py +0 -0
  380. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/adc.schema.json +0 -0
  381. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/areas.schema.json +0 -0
  382. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  383. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/boneio.schema.json +0 -0
  384. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/cover.schema.json +0 -0
  385. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/dallas.schema.json +0 -0
  386. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/ds2482.schema.json +0 -0
  387. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/event.schema.json +0 -0
  388. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/ina219.schema.json +0 -0
  389. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/lm75.schema.json +0 -0
  390. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/logger.schema.json +0 -0
  391. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mcp23017.schema.json +0 -0
  392. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/mcp9808.schema.json +0 -0
  393. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/modbus.schema.json +0 -0
  394. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  395. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/oled.schema.json +0 -0
  396. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/output.schema.json +0 -0
  397. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/output_group.schema.json +0 -0
  398. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/pca9685.schema.json +0 -0
  399. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/pcf8575.schema.json +0 -0
  400. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/remote_devices.schema.json +0 -0
  401. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/sensor.schema.json +0 -0
  402. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  403. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/services/__init__.py +0 -0
  404. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/services/logs.py +0 -0
  405. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/web_server.py +0 -0
  406. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio/webui/websocket_manager.py +0 -0
  407. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/dependency_links.txt +0 -0
  408. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/entry_points.txt +0 -0
  409. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/requires.txt +0 -0
  410. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/boneio.egg-info/top_level.txt +0 -0
  411. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/pyproject.toml +0 -0
  412. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/setup.cfg +0 -0
  413. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/setup.py +0 -0
  414. {boneio-1.1.0.dev3 → boneio-1.1.0.dev4}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.1.0.dev3
3
+ Version: 1.1.0.dev4
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
@@ -45,6 +45,7 @@ class ConfigHelper:
45
45
  config_file_path: str | None = None,
46
46
  send_boneio_autodiscovery: bool = True,
47
47
  receive_boneio_autodiscovery: bool = True,
48
+ update_channel: str = "stable",
48
49
  ):
49
50
  self._name = name
50
51
 
@@ -63,6 +64,7 @@ class ConfigHelper:
63
64
  self._ha_discovery_prefix = ha_discovery_prefix
64
65
  self._send_boneio_autodiscovery = send_boneio_autodiscovery
65
66
  self._receive_boneio_autodiscovery = receive_boneio_autodiscovery
67
+ self._update_channel = update_channel
66
68
  self._device_type = device_type
67
69
  self._web_port = web_port
68
70
  self._proxy_port = proxy_port
@@ -79,6 +81,7 @@ class ConfigHelper:
79
81
  TEXT_SENSOR: {},
80
82
  SELECT: {},
81
83
  NUMERIC: {},
84
+ "update": {}
82
85
  }
83
86
  self.manager_ready: bool = False
84
87
  self._network_info = network_info
@@ -181,6 +184,11 @@ class ConfigHelper:
181
184
  """Check if BoneIO autodiscovery receiving is enabled."""
182
185
  return self._receive_boneio_autodiscovery
183
186
 
187
+ @property
188
+ def update_channel(self) -> str:
189
+ """Get update channel (stable or dev)."""
190
+ return self._update_channel
191
+
184
192
  @property
185
193
  def device_type(self) -> str:
186
194
  return self._device_type
@@ -687,6 +687,14 @@ class InputManager:
687
687
  # Send event to MQTT for Home Assistant
688
688
  self._publish_input_event_to_mqtt(input_instance, event)
689
689
 
690
+ # If publish_only is set, skip action execution (used for initial state sync)
691
+ if event.publish_only:
692
+ _LOGGER.debug(
693
+ "Skipping action execution for %s (publish_only=True)",
694
+ event.entity_id
695
+ )
696
+ return
697
+
690
698
  # Execute actions with duration threshold support
691
699
  if actions and event.click_type == LONG:
692
700
  # Get executed_actions from detector state
@@ -39,6 +39,7 @@ from boneio.core.manager.modbus import ModbusManager
39
39
  from boneio.core.manager.outputs import OutputManager
40
40
  from boneio.core.manager.sensors import SensorManager
41
41
  from boneio.core.manager.remote import RemoteDeviceManager
42
+ from boneio.core.manager.update import UpdateManager
42
43
  from boneio.core.discovery import BlackDiscoveryPublisher
43
44
  from boneio.core.messaging import MessageBus
44
45
  from boneio.core.state import StateManager
@@ -204,6 +205,11 @@ class Manager:
204
205
  message_bus=message_bus,
205
206
  )
206
207
 
208
+ # 9. UpdateManager (checks for software updates and publishes to HA)
209
+ self.update_manager = UpdateManager(
210
+ manager=self,
211
+ )
212
+
207
213
  # Configure virtual energy sensors (must be after outputs are initialized)
208
214
  self.sensors.configure_virtual_energy_sensors()
209
215
 
@@ -323,6 +329,7 @@ class Manager:
323
329
  await self.sensors.send_ha_autodiscovery()
324
330
  await self.modbus.send_ha_autodiscovery()
325
331
  await self.display.send_ha_autodiscovery()
332
+ await self.update_manager.send_ha_autodiscovery()
326
333
 
327
334
  def send_ha_autodiscovery(
328
335
  self,
@@ -380,6 +387,9 @@ class Manager:
380
387
  availability_msg_func = ha_cover_availabilty_message
381
388
  elif ha_type == BUTTON:
382
389
  availability_msg_func = ha_button_availabilty_message
390
+ elif ha_type == "update":
391
+ from boneio.integration.homeassistant import ha_update_availability_message
392
+ availability_msg_func = ha_update_availability_message
383
393
 
384
394
  # Use availability_msg_func from kwargs if provided (for sensors)
385
395
  if 'availability_msg_func' in kwargs:
@@ -400,6 +410,16 @@ class Manager:
400
410
  )
401
411
  self.send_message(topic=topic, payload=payload, retain=True)
402
412
 
413
+ async def _handle_update_install_command(self, topic: str, payload: str) -> None:
414
+ """Handle update install command from Home Assistant.
415
+
416
+ Args:
417
+ topic: MQTT topic
418
+ payload: MQTT payload (should be "INSTALL")
419
+ """
420
+ _LOGGER.info("Received update install command: %s", payload)
421
+ await self.update_manager.handle_install_command(payload)
422
+
403
423
  def parse_actions(self, pin: str, actions: dict) -> dict:
404
424
  """Parse actions configuration.
405
425
 
@@ -0,0 +1,341 @@
1
+ """Update manager for checking and publishing software updates to Home Assistant.
2
+
3
+ This module manages periodic checking of software updates from GitHub
4
+ and publishes the update status to Home Assistant via MQTT.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import logging
11
+ from typing import TYPE_CHECKING
12
+
13
+ from boneio.core.utils.async_updater import AsyncUpdater
14
+ from boneio.core.utils.timeperiod import TimePeriod
15
+ from boneio.version import __version__
16
+
17
+ if TYPE_CHECKING:
18
+ from boneio.core.manager import Manager
19
+
20
+ _LOGGER = logging.getLogger(__name__)
21
+
22
+
23
+ class UpdateManager(AsyncUpdater):
24
+ """Manages software update checking and MQTT publishing.
25
+
26
+ This manager:
27
+ - Checks for updates from GitHub periodically (default: 4 hours)
28
+ - Caches results to avoid rate limiting
29
+ - Publishes update state to MQTT for Home Assistant
30
+ - Supports on-demand update checks from frontend
31
+ """
32
+
33
+ def __init__(
34
+ self,
35
+ manager: Manager,
36
+ update_interval: TimePeriod | None = None,
37
+ ):
38
+ """Initialize UpdateManager.
39
+
40
+ Args:
41
+ manager: Parent Manager instance
42
+ update_interval: Time between update checks (default: 4 hours)
43
+ """
44
+ self.id = "update_manager"
45
+ self._manager = manager
46
+
47
+ # Update check interval (default: 4 hours)
48
+ if update_interval is None:
49
+ update_interval = TimePeriod(hours=4)
50
+
51
+ # Cache for update info to avoid excessive GitHub API calls
52
+ self._last_check_result: dict | None = None
53
+ self._last_published_state: str | None = None
54
+ self._ha_discovery_sent: bool = False
55
+
56
+ # Initialize AsyncUpdater (starts periodic task)
57
+ super().__init__(manager=manager, update_interval=update_interval)
58
+
59
+ _LOGGER.info(
60
+ "UpdateManager initialized (check interval: %s)",
61
+ update_interval
62
+ )
63
+
64
+ async def async_update(self, timestamp: float) -> float | None:
65
+ """Perform periodic update check.
66
+
67
+ Args:
68
+ timestamp: Current timestamp
69
+
70
+ Returns:
71
+ Optional custom update interval in seconds
72
+ """
73
+ # Send HA discovery on first update (MQTT is connected by then)
74
+ if not self._ha_discovery_sent:
75
+ await self.send_ha_autodiscovery()
76
+ self._ha_discovery_sent = True
77
+
78
+ _LOGGER.debug("Checking for software updates...")
79
+
80
+ try:
81
+ # Check for updates from GitHub
82
+ update_info = await self._check_update_from_github()
83
+
84
+ if update_info and update_info.get("status") == "success":
85
+ # Publish state to MQTT
86
+ await self._publish_state_to_mqtt(update_info)
87
+ else:
88
+ _LOGGER.warning(
89
+ "Update check failed: %s",
90
+ update_info.get("message", "Unknown error") if update_info else "No response"
91
+ )
92
+ except Exception as e:
93
+ _LOGGER.error("Error during update check: %s", e, exc_info=True)
94
+
95
+ # Return None to use default interval
96
+ return None
97
+
98
+ async def _check_update_from_github(self) -> dict | None:
99
+ """Check for updates from GitHub releases.
100
+
101
+ This method reuses the logic from /api/check_update endpoint.
102
+
103
+ Returns:
104
+ Update information dict or None on error
105
+ """
106
+ current_version = __version__
107
+
108
+ try:
109
+ import requests
110
+ except ImportError:
111
+ _LOGGER.error("Package 'requests' is not installed")
112
+ return {
113
+ "status": "error",
114
+ "message": "Package 'requests' is not installed",
115
+ "current_version": current_version
116
+ }
117
+
118
+ try:
119
+ from packaging import version
120
+ except ImportError:
121
+ _LOGGER.error("Package 'packaging' is not installed")
122
+ return {
123
+ "status": "error",
124
+ "message": "Package 'packaging' is not installed",
125
+ "current_version": current_version
126
+ }
127
+
128
+ try:
129
+ repo = "boneIO-eu/app_black"
130
+ api_url = f'https://api.github.com/repos/{repo}/releases'
131
+ response = requests.get(api_url, timeout=10)
132
+
133
+ if response.status_code != 200:
134
+ return {
135
+ "status": "error",
136
+ "message": f"GitHub API error: {response.status_code}",
137
+ "current_version": current_version
138
+ }
139
+
140
+ releases = response.json()
141
+
142
+ if not releases:
143
+ return {
144
+ "status": "error",
145
+ "message": "No releases found on GitHub",
146
+ "current_version": current_version
147
+ }
148
+
149
+ # Find latest stable and prerelease versions
150
+ latest_stable = None
151
+ latest_prerelease = None
152
+
153
+ for release in releases:
154
+ tag = release['tag_name']
155
+ ver_str = tag[1:] if tag.startswith('v') else tag
156
+
157
+ # Skip v0.x versions (Debian 10, incompatible)
158
+ if tag.startswith("v0."):
159
+ continue
160
+
161
+ is_prerelease = release.get('prerelease', False)
162
+
163
+ if not is_prerelease:
164
+ ver_lower = ver_str.lower()
165
+ is_prerelease = any(x in ver_lower for x in ['dev', 'alpha', 'beta', 'rc'])
166
+
167
+ ver_info = {
168
+ "version": ver_str,
169
+ "is_prerelease": is_prerelease,
170
+ "release_url": release['html_url'],
171
+ "published_at": release['published_at'],
172
+ "release_notes": release.get('body', '')[:255], # Max 255 chars for HA
173
+ }
174
+
175
+ if not is_prerelease and latest_stable is None:
176
+ latest_stable = ver_info
177
+ if is_prerelease and latest_prerelease is None:
178
+ latest_prerelease = ver_info
179
+
180
+ # Stop after finding both
181
+ if latest_stable and latest_prerelease:
182
+ break
183
+
184
+ # Determine which version to recommend based on update_channel setting
185
+ update_channel = self._manager._config_helper.update_channel
186
+
187
+ if update_channel == "dev":
188
+ # Dev channel: prefer prerelease, fallback to stable
189
+ recommended = latest_prerelease or latest_stable
190
+ else:
191
+ # Stable channel (default): only stable releases
192
+ recommended = latest_stable
193
+
194
+ if not recommended:
195
+ return {
196
+ "status": "error",
197
+ "message": "No suitable release found",
198
+ "current_version": current_version
199
+ }
200
+
201
+ # Check if update is available
202
+ is_update_available = False
203
+ try:
204
+ current_parsed = version.parse(current_version)
205
+ recommended_parsed = version.parse(recommended["version"])
206
+ is_update_available = recommended_parsed > current_parsed
207
+ except Exception as e:
208
+ _LOGGER.warning("Error parsing versions: %s", e)
209
+
210
+ result = {
211
+ "status": "success",
212
+ "current_version": current_version,
213
+ "latest_version": recommended["version"],
214
+ "update_available": is_update_available,
215
+ "release_url": recommended["release_url"],
216
+ "release_notes": recommended.get("release_notes", ""),
217
+ "is_prerelease": recommended["is_prerelease"],
218
+ }
219
+
220
+ # Cache result
221
+ self._last_check_result = result
222
+
223
+ return result
224
+
225
+ except Exception as e:
226
+ _LOGGER.error("Error checking for updates: %s", e, exc_info=True)
227
+ return {
228
+ "status": "error",
229
+ "message": f"Error: {str(e)}",
230
+ "current_version": current_version
231
+ }
232
+
233
+ async def _publish_state_to_mqtt(self, update_info: dict) -> None:
234
+ """Publish update state to MQTT for Home Assistant.
235
+
236
+ Args:
237
+ update_info: Update information from GitHub check
238
+ """
239
+ if update_info.get("status") != "success":
240
+ return
241
+
242
+ current_version = update_info.get("current_version", __version__)
243
+ latest_version = update_info.get("latest_version", current_version)
244
+
245
+ # Build state payload (JSON format for HA Update entity)
246
+ state_payload = {
247
+ "installed_version": current_version,
248
+ "latest_version": latest_version,
249
+ "title": "boneIO Black Firmware",
250
+ "release_url": update_info.get("release_url", ""),
251
+ "release_summary": update_info.get("release_notes", "")[:255], # HA limit
252
+ }
253
+
254
+ # Add entity_picture (boneIO logo from HA brands)
255
+ state_payload["entity_picture"] = "http://boneio.eu/logo_fb_circle.png"
256
+
257
+ # Convert to JSON
258
+ payload_json = json.dumps(state_payload)
259
+
260
+ # Only publish if state changed (avoid unnecessary MQTT traffic)
261
+ if payload_json == self._last_published_state:
262
+ _LOGGER.debug("Update state unchanged, skipping MQTT publish")
263
+ return
264
+
265
+ # Publish to MQTT
266
+ topic_prefix = self._manager._config_helper.topic_prefix
267
+ state_topic = f"{topic_prefix}/update/state"
268
+
269
+ self._manager.send_message(
270
+ topic=state_topic,
271
+ payload=payload_json,
272
+ retain=True,
273
+ )
274
+
275
+ self._last_published_state = payload_json
276
+
277
+ _LOGGER.info(
278
+ "Published update state to MQTT: %s -> %s (update available: %s)",
279
+ current_version,
280
+ latest_version,
281
+ update_info.get("update_available", False)
282
+ )
283
+
284
+ def get_last_check_result(self) -> dict | None:
285
+ """Get the last update check result.
286
+
287
+ Returns:
288
+ Last check result dict or None if no check performed yet
289
+ """
290
+ return self._last_check_result
291
+
292
+ async def handle_install_command(self, payload: str) -> None:
293
+ """Handle install command from Home Assistant.
294
+
295
+ This is called when HA sends a message to the command topic.
296
+
297
+ Args:
298
+ payload: MQTT payload (should be "INSTALL")
299
+ """
300
+ if payload != "INSTALL":
301
+ _LOGGER.warning("Invalid install command payload: %s", payload)
302
+ return
303
+
304
+ _LOGGER.info("Received install command from Home Assistant")
305
+
306
+ # Check if update is available
307
+ if not self._last_check_result:
308
+ _LOGGER.warning("No update check result available, checking now...")
309
+ await self.async_update(timestamp=0)
310
+
311
+ if not self._last_check_result or not self._last_check_result.get("update_available"):
312
+ _LOGGER.warning("No update available to install")
313
+ return
314
+
315
+ # Trigger update via existing update endpoint
316
+ # Note: This requires the update API to be accessible
317
+ # The actual installation is handled by /api/update endpoint
318
+ _LOGGER.info(
319
+ "Update installation should be triggered via WebUI or API endpoint /api/update"
320
+ )
321
+
322
+ # TODO: Consider adding direct integration with update logic
323
+ # For now, users should use the WebUI to trigger updates
324
+
325
+ async def send_ha_autodiscovery(self) -> None:
326
+ """Send Home Assistant autodiscovery for Update entity."""
327
+ _LOGGER.debug("Sending HA autodiscovery for Update entity")
328
+
329
+ self._manager.send_ha_autodiscovery(
330
+ id="firmware",
331
+ name="Update",
332
+ ha_type="update",
333
+ )
334
+
335
+ # Subscribe to command topic for install commands
336
+ command_topic = f"{self._manager._topic_prefix}/update/install"
337
+ await self._manager._message_bus.subscribe_and_listen(
338
+ topic=command_topic,
339
+ callback=self._manager._handle_update_install_command
340
+ )
341
+ _LOGGER.info("Subscribed to update command topic: %s", command_topic)
@@ -661,3 +661,47 @@ def ha_cover_with_tilt_availabilty_message(
661
661
  "position_template": '{{ value_json.position }}',
662
662
  "tilt_status_template": '{{ value_json.tilt }}',
663
663
  }
664
+
665
+
666
+ def ha_update_availability_message(
667
+ id: str, name: str, config_helper: ConfigHelper, **kwargs
668
+ ) -> HomeAssistantDiscoveryMessage:
669
+ """Create Update availability topic for HA.
670
+
671
+ Args:
672
+ id: Entity ID
673
+ name: Entity name
674
+ config_helper: ConfigHelper instance
675
+ **kwargs: Additional fields (e.g., device_class, entity_category)
676
+
677
+ Returns:
678
+ HA discovery message for Update entity
679
+ """
680
+ topic = config_helper.topic_prefix
681
+
682
+ # Default kwargs for Update entity
683
+ default_kwargs = {
684
+ "device_class": "firmware",
685
+ "entity_category": "diagnostic",
686
+ }
687
+
688
+ msg = ha_availabilty_message(
689
+ device_type="update",
690
+ entity_type="update",
691
+ config_helper=config_helper,
692
+ id=id,
693
+ name=name,
694
+ **{**default_kwargs, **kwargs}
695
+ )
696
+
697
+ result = {
698
+ **msg,
699
+ "state_topic": f"{topic}/update/state",
700
+ "command_topic": f"{topic}/update/install",
701
+ "payload_install": "INSTALL",
702
+ "icon": "mdi:update",
703
+ }
704
+
705
+ _LOGGER.debug("Update HA discovery message: %s", result)
706
+
707
+ return result
@@ -120,6 +120,7 @@ async def async_run(
120
120
  config_file_path=config_file,
121
121
  send_boneio_autodiscovery=mqtt_config.get("send_boneio_autodiscovery", True),
122
122
  receive_boneio_autodiscovery=mqtt_config.get("receive_boneio_autodiscovery", True),
123
+ update_channel=mqtt_config.get("update_channel", "stable"),
123
124
  )
124
125
 
125
126
  # Load areas configuration
@@ -87,6 +87,18 @@ mqtt:
87
87
  description: |
88
88
  When enabled, this device subscribes to BoneIO autodiscovery topics
89
89
  (boneio/+/discovery/#) and automatically discovers neighboring BoneIO devices.
90
+ update_channel:
91
+ type: string
92
+ default: stable
93
+ allowed:
94
+ - stable
95
+ - dev
96
+ meta:
97
+ label: Update channel
98
+ description: |
99
+ Which releases to show in Home Assistant Update entity:
100
+ - stable: Only stable releases (recommended)
101
+ - dev: Include development/pre-release versions
90
102
 
91
103
  web:
92
104
  type: dict
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.1.0dev4"
@@ -153,6 +153,7 @@ from boneio.webui.routes import covers as covers_module
153
153
  from boneio.webui.routes import modbus as modbus_module
154
154
  from boneio.webui.routes import sensors as sensors_module
155
155
  from boneio.webui.routes import remote_devices as remote_devices_module
156
+ from boneio.webui.routes import update as update_module
156
157
 
157
158
  # Use dependency_overrides to replace the placeholder get_manager functions
158
159
  app.dependency_overrides[outputs_module.get_manager] = get_manager
@@ -160,6 +161,7 @@ app.dependency_overrides[covers_module.get_manager] = get_manager
160
161
  app.dependency_overrides[modbus_module.get_manager] = get_manager
161
162
  app.dependency_overrides[sensors_module.get_manager] = get_manager
162
163
  app.dependency_overrides[remote_devices_module.get_manager] = get_manager
164
+ app.dependency_overrides[update_module.get_manager] = get_manager
163
165
  system_module.set_config_helper_getter(get_config_helper)
164
166
 
165
167