boneIO 1.0.0.dev20__tar.gz → 1.0.0.dev22__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 (415) hide show
  1. {boneio-1.0.0.dev20/boneio.egg-info → boneio-1.0.0.dev22}/PKG-INFO +3 -1
  2. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/time_based.py +14 -4
  3. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/venetian.py +8 -4
  4. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/binary_sensor.py +2 -2
  5. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/config_helper.py +10 -2
  6. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/display.py +18 -0
  7. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/manager.py +19 -2
  8. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/modbus.py +15 -1
  9. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/remote.py +147 -7
  10. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/sensors.py +20 -0
  11. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/basic.py +3 -2
  12. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/local.py +2 -2
  13. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/mqtt.py +4 -1
  14. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/__init__.py +13 -1
  15. boneio-1.0.0.dev22/boneio/core/remote/esphome.py +1022 -0
  16. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/oled.py +1 -1
  17. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/manager.py +39 -0
  18. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/ina219.py +12 -2
  19. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/base.py +1 -1
  20. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/__init__.py +0 -2
  21. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/homeassistant.py +174 -101
  22. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/coordinator.py +75 -11
  23. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/base.py +17 -7
  24. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/select.py +7 -3
  25. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/text.py +8 -4
  26. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/binary.py +8 -3
  27. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/text.py +8 -4
  28. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/binary.py +9 -4
  29. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/numeric.py +18 -8
  30. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/runner.py +16 -3
  31. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions.yaml +30 -4
  32. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/remote_devices.yaml +157 -34
  33. boneio-1.0.0.dev22/boneio/version.py +2 -0
  34. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/cssMode-e0s0S-AL.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/cssMode-CTEJXHUr.js +1 -1
  35. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/freemarker2-CWkMJ7Dx.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/freemarker2-DSCsQPcZ.js +1 -1
  36. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/handlebars-zUpC2ck8.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/handlebars-BxUcZhlf.js +1 -1
  37. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/html-2WKFlvIv.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/html-CeIuVMbE.js +1 -1
  38. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/htmlMode-DMvlWHlg.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/htmlMode-CPIPzTN0.js +1 -1
  39. boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/index-BODT6D6E.css +1 -0
  40. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/index-CZVHDDiR.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/index-BehXyBY8.js +252 -252
  41. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/javascript-1u9ejw2d.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/javascript-CpYki0-I.js +1 -1
  42. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/jsonMode-vTnsI9a9.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/jsonMode-D9XhtrDP.js +1 -1
  43. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/liquid-BnEFi6su.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/liquid-B00joeAd.js +1 -1
  44. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/mdx-CiaE4Hfr.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/mdx-DvdDUhMH.js +1 -1
  45. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/python-2FhK2A3H.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/python-CSHyK2oP.js +1 -1
  46. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/razor-mmdOzr3O.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/razor-CGXQVQhg.js +1 -1
  47. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/tsMode-aWDaZew7.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/tsMode-CaUDBDMJ.js +1 -1
  48. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/typescript-CP3BHqV0.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/typescript-DMGXfEu0.js +1 -1
  49. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/xml-afQscpJf.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/xml-D2UC847g.js +1 -1
  50. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/yaml-8Z7cC_Pk.js → boneio-1.0.0.dev22/boneio/webui/frontend-dist/assets/yaml-DfvHGUeZ.js +1 -1
  51. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/index.html +2 -2
  52. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/adc.schema.json +6 -6
  53. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/areas.schema.json +2 -2
  54. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +50 -10
  55. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -2
  56. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/config.schema.json +622 -140
  57. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/cover.schema.json +10 -10
  58. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/ds2482.schema.json +2 -2
  59. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/event.schema.json +171 -31
  60. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/ina219.schema.json +8 -8
  61. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/lm75.schema.json +6 -6
  62. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +4 -4
  63. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +6 -6
  64. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +10 -10
  65. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/oled.schema.json +6 -6
  66. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/output.schema.json +8 -8
  67. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
  68. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/pca9685.schema.json +4 -4
  69. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +4 -4
  70. boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem/remote_devices.schema.json +437 -0
  71. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/sensor.schema.json +6 -6
  72. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +2 -2
  73. {boneio-1.0.0.dev20/boneio/webui/schema → boneio-1.0.0.dev22/boneio/webui/frontend-dist/schem}/web.schema.json +2 -2
  74. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/config.py +173 -2
  75. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/remote_devices.py +102 -1
  76. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/update.py +253 -10
  77. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/adc.schema.json +6 -6
  78. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/areas.schema.json +2 -2
  79. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/binary_sensor.schema.json +50 -10
  80. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/boneio.schema.json +2 -2
  81. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/config.schema.json +622 -140
  82. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/cover.schema.json +10 -10
  83. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/ds2482.schema.json +2 -2
  84. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/event.schema.json +171 -31
  85. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/ina219.schema.json +8 -8
  86. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/lm75.schema.json +6 -6
  87. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mcp23017.schema.json +4 -4
  88. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mcp9808.schema.json +6 -6
  89. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/modbus_devices.schema.json +10 -10
  90. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/oled.schema.json +6 -6
  91. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/output.schema.json +8 -8
  92. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/output_group.schema.json +4 -4
  93. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/pca9685.schema.json +4 -4
  94. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/pcf8575.schema.json +4 -4
  95. boneio-1.0.0.dev22/boneio/webui/schema/remote_devices.schema.json +437 -0
  96. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/sensor.schema.json +6 -6
  97. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
  98. {boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev22/boneio/webui/schema}/web.schema.json +2 -2
  99. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22/boneio.egg-info}/PKG-INFO +3 -1
  100. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/SOURCES.txt +18 -17
  101. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/requires.txt +2 -0
  102. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/pyproject.toml +3 -1
  103. boneio-1.0.0.dev20/boneio/version.py +0 -2
  104. boneio-1.0.0.dev20/boneio/webui/frontend-dist/assets/index-B5sThJWr.css +0 -1
  105. boneio-1.0.0.dev20/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -135
  106. boneio-1.0.0.dev20/boneio/webui/schema/remote_devices.schema.json +0 -135
  107. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/LICENSE +0 -0
  108. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/MANIFEST.in +0 -0
  109. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/README.md +0 -0
  110. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/__init__.py +0 -0
  111. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/input.yaml +0 -0
  112. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_24_16.yaml +0 -0
  113. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_32_10.yaml +0 -0
  114. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_32_5.yaml +0 -0
  115. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_cover.yaml +0 -0
  116. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  117. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/input.yaml +0 -0
  118. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_24_16.yaml +0 -0
  119. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_32_10.yaml +0 -0
  120. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_32_5.yaml +0 -0
  121. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_cover.yaml +0 -0
  122. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  123. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/input.yaml +0 -0
  124. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_24_16.yaml +0 -0
  125. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_32_10.yaml +0 -0
  126. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_32_5.yaml +0 -0
  127. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_cover.yaml +0 -0
  128. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  129. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/input.yaml +0 -0
  130. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_24_16.yaml +0 -0
  131. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_32_10.yaml +0 -0
  132. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_cover.yaml +0 -0
  133. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  134. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/input.yaml +0 -0
  135. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_24_16.yaml +0 -0
  136. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_32_10.yaml +0 -0
  137. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_cover.yaml +0 -0
  138. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  139. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/input.yaml +0 -0
  140. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_24_16.yaml +0 -0
  141. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_32_10.yaml +0 -0
  142. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_cover.yaml +0 -0
  143. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  144. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/input.yaml +0 -0
  145. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_24_16.yaml +0 -0
  146. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_32_10.yaml +0 -0
  147. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_cover.yaml +0 -0
  148. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  149. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/bonecli.py +0 -0
  150. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/__init__.py +0 -0
  151. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/__init__.py +0 -0
  152. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/cover.py +0 -0
  153. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/cover/previous.py +0 -0
  154. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/group/__init__.py +0 -0
  155. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/group/output_group.py +0 -0
  156. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/__init__.py +0 -0
  157. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/detectors.py +0 -0
  158. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/input/event.py +0 -0
  159. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/__init__.py +0 -0
  160. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/basic.py +0 -0
  161. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/mcp.py +0 -0
  162. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/pca.py +0 -0
  163. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/output/pcf.py +0 -0
  164. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/sensor/__init__.py +0 -0
  165. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/components/sensor/virtual_energy.py +0 -0
  166. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/const.py +0 -0
  167. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/__init__.py +0 -0
  168. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/__init__.py +0 -0
  169. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/package-lock.json +0 -0
  170. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/package.json +0 -0
  171. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/schema_converter.py +0 -0
  172. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/config/yaml_util.py +0 -0
  173. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/discovery.py +0 -0
  174. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/events/__init__.py +0 -0
  175. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/events/bus.py +0 -0
  176. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/__init__.py +0 -0
  177. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/covers.py +0 -0
  178. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/inputs.py +0 -0
  179. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/manager/outputs.py +0 -0
  180. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/__init__.py +0 -0
  181. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/basic_mqtt.py +0 -0
  182. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/messaging/queue.py +0 -0
  183. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/base.py +0 -0
  184. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/remote/mqtt.py +0 -0
  185. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/__init__.py +0 -0
  186. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/base.py +0 -0
  187. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/sensor/system.py +0 -0
  188. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/state/__init__.py +0 -0
  189. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/state/manager.py +0 -0
  190. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/__init__.py +0 -0
  191. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/host_data.py +0 -0
  192. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/system/monitor.py +0 -0
  193. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/__init__.py +0 -0
  194. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/async_updater.py +0 -0
  195. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/filter.py +0 -0
  196. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/font_util.py +0 -0
  197. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/logger.py +0 -0
  198. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/timeperiod.py +0 -0
  199. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/core/utils/util.py +0 -0
  200. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/adc.yaml +0 -0
  201. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  202. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/config.yaml +0 -0
  203. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/event.yaml +0 -0
  204. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/mqtt.yaml +0 -0
  205. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  206. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/adc.yaml +0 -0
  207. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  208. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/config.yaml +0 -0
  209. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/event.yaml +0 -0
  210. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/mqtt.yaml +0 -0
  211. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  212. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/__init__.py +0 -0
  213. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/adc.yaml +0 -0
  214. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  215. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/config.yaml +0 -0
  216. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/cover.yaml +0 -0
  217. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/event.yaml +0 -0
  218. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/mqtt.yaml +0 -0
  219. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover/outputCover.yaml +0 -0
  220. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/adc.yaml +0 -0
  221. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  222. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/config.yaml +0 -0
  223. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/cover.yaml +0 -0
  224. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/event.yaml +0 -0
  225. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  226. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  227. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/adc.yaml +0 -0
  228. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  229. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  230. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  231. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  232. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/event_all.yaml +0 -0
  233. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  234. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  235. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  236. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  237. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  238. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  239. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/exceptions.py +0 -0
  240. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/__init__.py +0 -0
  241. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/analog/__init__.py +0 -0
  242. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/analog/adc.py +0 -0
  243. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/__init__.py +0 -0
  244. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  245. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/__init__.py +0 -0
  246. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  247. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  248. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  249. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  250. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/__init__.py +0 -0
  251. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/gpio/input/base.py +0 -0
  252. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/__init__.py +0 -0
  253. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/bus.py +0 -0
  254. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/ina219_driver.py +0 -0
  255. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/mcp9808.py +0 -0
  256. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/i2c/pct2075.py +0 -0
  257. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/__init__.py +0 -0
  258. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/bus.py +0 -0
  259. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/dallas.py +0 -0
  260. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/onewire/ds2482.py +0 -0
  261. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/__init__.py +0 -0
  262. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  263. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  264. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  265. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/integration/interlock.py +0 -0
  266. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/__init__.py +0 -0
  267. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/cli.py +0 -0
  268. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/client.py +0 -0
  269. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/__init__.py +0 -0
  270. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  271. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  272. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  273. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  274. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  275. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  276. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  277. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/inverters/sofar.json +0 -0
  278. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/inverters/thessla.json +0 -0
  279. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  280. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/other/wanas415.json +0 -0
  281. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/cwt.json +0 -0
  282. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  283. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  284. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/pt100.json +0 -0
  285. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/sht20.json +0 -0
  286. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/devices/sensors/sht30.json +0 -0
  287. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/__init__.py +0 -0
  288. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/__init__.py +0 -0
  289. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/numeric.py +0 -0
  290. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/derived/switch.py +0 -0
  291. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/__init__.py +0 -0
  292. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/sensor/numeric.py +0 -0
  293. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/entities/writeable/__init__.py +0 -0
  294. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/modbus/utils.py +0 -0
  295. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/__init__.py +0 -0
  296. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/actions.py +0 -0
  297. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/events.py +0 -0
  298. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/files.py +0 -0
  299. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/logs.py +0 -0
  300. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/mqtt.py +0 -0
  301. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/models/state.py +0 -0
  302. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions_sensor.yaml +0 -0
  303. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/actions_switch.yaml +0 -0
  304. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/filters.yaml +0 -0
  305. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/filters_adc.yaml +0 -0
  306. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/id.yaml +0 -0
  307. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/schema.yaml +0 -0
  308. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/temp_unit.yaml +0 -0
  309. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/schema/update_interval.yaml +0 -0
  310. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/app.py +0 -0
  311. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  312. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  313. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  314. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  315. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  316. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  317. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  318. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  319. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  320. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  321. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  322. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  323. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  324. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  325. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  326. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  327. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  328. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  329. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  330. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  331. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  332. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  333. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  334. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  335. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  336. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  337. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  338. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  339. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  340. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  341. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  342. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  343. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  344. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  345. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  346. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  347. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  348. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  349. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  350. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  351. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  352. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  353. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  354. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  355. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  356. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  357. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  358. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  359. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  360. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  361. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  362. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  363. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  364. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  365. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  366. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  367. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  368. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  369. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  370. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  371. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  372. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  373. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  374. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  375. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  376. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  377. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  378. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  379. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  380. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  381. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  382. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  383. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  384. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  385. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/boneio.svg +0 -0
  386. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  387. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  388. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  389. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
  390. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
  391. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/middleware/__init__.py +0 -0
  392. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/middleware/auth.py +0 -0
  393. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/__init__.py +0 -0
  394. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/auth.py +0 -0
  395. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/caddy.py +0 -0
  396. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/covers.py +0 -0
  397. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/modbus.py +0 -0
  398. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/outputs.py +0 -0
  399. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/sensors.py +0 -0
  400. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/routes/system.py +0 -0
  401. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/dallas.schema.json +0 -0
  402. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/logger.schema.json +0 -0
  403. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/modbus.schema.json +0 -0
  404. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/schema/mqtt.schema.json +0 -0
  405. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/services/__init__.py +0 -0
  406. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/services/logs.py +0 -0
  407. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/web_server.py +0 -0
  408. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio/webui/websocket_manager.py +0 -0
  409. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/dependency_links.txt +0 -0
  410. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/entry_points.txt +0 -0
  411. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/boneio.egg-info/top_level.txt +0 -0
  412. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/setup.cfg +0 -0
  413. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/setup.py +0 -0
  414. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/tests/test_i2c_smbus2.py +0 -0
  415. {boneio-1.0.0.dev20 → boneio-1.0.0.dev22}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.0.0.dev20
3
+ Version: 1.0.0.dev22
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
@@ -32,6 +32,8 @@ Requires-Dist: qrcode==8.2
32
32
  Requires-Dist: gpiod==2.3.0
33
33
  Requires-Dist: requests==2.32.5
34
34
  Requires-Dist: packaging==25.0
35
+ Requires-Dist: aioesphomeapi>=29.0.0
36
+ Requires-Dist: zeroconf>=0.148.0
35
37
  Dynamic: license-file
36
38
 
37
39
  Example usage:
@@ -41,7 +41,13 @@ class TimeBasedCover(BaseCover):
41
41
 
42
42
 
43
43
  def _move_cover(self, direction: str, duration: float, target_position: int | None = None):
44
- """Metoda uruchamiana w oddzielnym wątku do fizycznego ruchu rolety."""
44
+ """Run in sepearate thread.
45
+
46
+ Args:
47
+ direction: Direction of movement (OPEN or CLOSE)
48
+ duration: Full time for 0-100% movement in milliseconds
49
+ target_position: Optional target position (0-100)
50
+ """
45
51
  if direction == OPEN:
46
52
  relay = self._open_relay
47
53
  total_steps = 100 - self._position
@@ -56,18 +62,22 @@ class TimeBasedCover(BaseCover):
56
62
  self._loop.call_soon_threadsafe(lambda: self.send_state(self.state, self.json_position))
57
63
  return
58
64
 
65
+ # Calculate actual duration based on remaining distance
66
+ # duration is full time for 100% movement, scale it by actual distance to travel
67
+ actual_duration = duration * (total_steps / 100.0)
68
+
59
69
  relay.turn_on()
60
70
  start_time = time.monotonic()
61
71
 
62
72
  while not self._stop_event.is_set():
63
73
  current_time = time.monotonic() # Pobierz aktualny czas tylko raz na iterację
64
74
  elapsed_time = (current_time - start_time) * 1000 # Konwersja na milisekundy
65
- progress = elapsed_time / duration
75
+ progress = elapsed_time / actual_duration if actual_duration > 0 else 1.0
66
76
 
67
77
  if direction == OPEN:
68
- self._position = min(100.0, self._initial_position + progress * 100)
78
+ self._position = min(100.0, self._initial_position + progress * total_steps)
69
79
  elif direction == CLOSE:
70
- self._position = max(0.0, self._initial_position - progress * 100)
80
+ self._position = max(0.0, self._initial_position - progress * total_steps)
71
81
 
72
82
  self._last_timestamp = current_time # Użyj pobranego czasu
73
83
  if current_time - self._last_update_time >= 1:
@@ -97,6 +97,10 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
97
97
  )
98
98
  return
99
99
 
100
+ # Calculate actual duration based on remaining distance
101
+ # duration is full time for 100% movement, scale it by actual distance to travel
102
+ actual_duration = duration * (total_steps / 100.0)
103
+
100
104
  relay.turn_on()
101
105
  start_time = time.monotonic()
102
106
  progress = 0.0
@@ -116,15 +120,15 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
116
120
 
117
121
 
118
122
  if elapsed_time < needed_tilt_duration:
119
- tilt_progress = elapsed_time / needed_tilt_duration
123
+ tilt_progress = elapsed_time / needed_tilt_duration if needed_tilt_duration > 0 else 1.0
120
124
  progress = 0.0
121
125
  else:
122
126
  tilt_progress = 1.0
123
- progress = (elapsed_time - needed_tilt_duration) / duration
127
+ progress = (elapsed_time - needed_tilt_duration) / actual_duration if actual_duration > 0 else 1.0
124
128
 
125
129
  if direction == OPEN:
126
130
  # Obliczanie _position dla kierunku OPEN
127
- self._position = min(100.0, self._initial_position + progress * 100)
131
+ self._position = min(100.0, self._initial_position + progress * total_steps)
128
132
 
129
133
  # Obliczanie _tilt_position dla kierunku OPEN
130
134
  if target_tilt_position is not None:
@@ -135,7 +139,7 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
135
139
  )
136
140
  elif direction == CLOSE:
137
141
  # Obliczanie _position dla kierunku CLOSE
138
- self._position = max(0.0, self._initial_position - progress * 100)
142
+ self._position = max(0.0, self._initial_position - progress * total_steps)
139
143
 
140
144
  # Obliczanie _tilt_position dla kierunku CLOSE
141
145
  if target_tilt_position is not None:
@@ -54,9 +54,9 @@ class GpioInputBinarySensor(GpioBaseClass):
54
54
  _LOGGER.debug("Configured binary sensor %s on pin %s (inverted=%s)",
55
55
  self._name, self._pin, inverted)
56
56
 
57
- # Send initial state if requested
57
+ # Send initial state if requested - register callback to run after GPIO manager starts
58
58
  if kwargs.get("initial_send", False):
59
- self._loop.call_soon(callback=self._send_initial_state)
59
+ gpio_manager.register_on_start_callback(self._send_initial_state)
60
60
 
61
61
  def _send_initial_state(self) -> None:
62
62
  """Send initial state after setup."""
@@ -5,7 +5,10 @@ from __future__ import annotations
5
5
 
6
6
  import logging
7
7
  from _collections_abc import dict_values
8
- from typing import Any
8
+ from typing import Any, TYPE_CHECKING
9
+
10
+ if TYPE_CHECKING:
11
+ from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
9
12
 
10
13
  from boneio.const import (
11
14
  BINARY_SENSOR,
@@ -222,7 +225,12 @@ class ConfigHelper:
222
225
  def subscribe_topic(self) -> str:
223
226
  return f"{self.cmd_topic_prefix}+/+/#"
224
227
 
225
- def add_autodiscovery_msg(self, ha_type: str, topic: str, payload: str | dict | None):
228
+ def add_autodiscovery_msg(
229
+ self,
230
+ ha_type: str,
231
+ topic: str,
232
+ payload: str | dict[str, Any] | "HomeAssistantDiscoveryMessage" | None
233
+ ):
226
234
  """Add autodiscovery message."""
227
235
  self._autodiscovery_messages[ha_type][topic] = {"topic": topic, "payload": payload}
228
236
 
@@ -190,10 +190,28 @@ class DisplayManager:
190
190
 
191
191
  except (GPIOInputException, I2CError) as err:
192
192
  _LOGGER.error("Can't configure OLED display: %s", err)
193
+ # Store error in manager for WebUI display
194
+ self._manager._hardware_errors.append({
195
+ 'type': 'display',
196
+ 'id': 'oled',
197
+ 'name': 'OLED Display',
198
+ 'address': 0x3C,
199
+ 'error': str(err),
200
+ 'message': f"OLED display at address 0x3C: {err}",
201
+ })
193
202
  except ImportError as err:
194
203
  _LOGGER.error("Failed to import OLED modules: %s", err)
195
204
  except Exception as err:
196
205
  _LOGGER.error("Unexpected error configuring OLED: %s", err)
206
+ # Store error in manager for WebUI display
207
+ self._manager._hardware_errors.append({
208
+ 'type': 'display',
209
+ 'id': 'oled',
210
+ 'name': 'OLED Display',
211
+ 'address': 0x3C,
212
+ 'error': str(err),
213
+ 'message': f"OLED display: {err}",
214
+ })
197
215
 
198
216
  def get_oled(self) -> Any | None:
199
217
  """Get OLED display instance.
@@ -22,6 +22,8 @@ from boneio.const import (
22
22
  ONLINE,
23
23
  OUTPUT,
24
24
  OUTPUT_OVER_MQTT,
25
+ REMOTE_COVER,
26
+ REMOTE_OUTPUT,
25
27
  SET_BRIGHTNESS,
26
28
  STATE,
27
29
  cover_actions,
@@ -192,6 +194,7 @@ class Manager:
192
194
  message_bus=message_bus,
193
195
  remote_devices_config=remote_devices,
194
196
  own_serial=config_helper.serial_no,
197
+ name=self.config_helper.name
195
198
  )
196
199
 
197
200
  # 8. BlackDiscoveryPublisher (publishes device info for autodiscovery of neighboring BoneIO devices)
@@ -207,6 +210,20 @@ class Manager:
207
210
  # (removing duplicate registration here that caused double event handling)
208
211
 
209
212
  _LOGGER.info("Manager initialization complete")
213
+
214
+ async def stop(self) -> None:
215
+ """Stop manager async tasks.
216
+
217
+ This should be called during shutdown to cleanly stop:
218
+ - ESPHome connections
219
+ - Other async tasks
220
+ """
221
+ _LOGGER.info("Stopping manager async tasks")
222
+
223
+ # Stop ESPHome connections
224
+ await self.remote_devices.stop_all_connections()
225
+
226
+ _LOGGER.info("Manager async tasks stopped")
210
227
 
211
228
  @property
212
229
  def loop(self) -> asyncio.AbstractEventLoop:
@@ -521,7 +538,7 @@ class Manager:
521
538
  Args:
522
539
  actions: List of actions to execute
523
540
  """
524
- from boneio.const import REMOTE_OUTPUT, REMOTE_COVER
541
+
525
542
 
526
543
  start_time = time.time()
527
544
 
@@ -604,7 +621,7 @@ class Manager:
604
621
  )
605
622
 
606
623
  elif action == REMOTE_COVER:
607
- # Control cover on remote device
624
+ # Control cover on remote device (BoneIO MQTT or ESPHome API)
608
625
  remote_device_id = action_definition.get("remote_device")
609
626
  cover_id = action_definition.get("cover_id")
610
627
  action_cover = action_definition.get("action_cover", "TOGGLE")
@@ -131,7 +131,8 @@ class ModbusManager:
131
131
  model = device_config.get(MODEL, "")
132
132
 
133
133
  # Generate ID from address and model if not provided
134
- if device_config.get(ID):
134
+ has_custom_id = bool(device_config.get(ID))
135
+ if has_custom_id:
135
136
  device_id = str(device_config[ID]).replace(" ", "").lower()
136
137
  else:
137
138
  device_id = f"{address}_{model}".lower().replace(" ", "_")
@@ -160,6 +161,7 @@ class ModbusManager:
160
161
  sensors_filters=device_config.get("sensors_filters", {}),
161
162
  additional_data=additional_data,
162
163
  area=area,
164
+ has_custom_id=has_custom_id,
163
165
  )
164
166
  coordinators[device_id] = coordinator
165
167
  _LOGGER.info("Configured Modbus coordinator: %s", device_id)
@@ -358,6 +360,18 @@ class ModbusManager:
358
360
  new_coordinators = self._configure_modbus_coordinators(devices=configs_to_add)
359
361
  self._modbus_coordinators.update(new_coordinators)
360
362
  _LOGGER.info("Added/recreated %d Modbus devices", len(new_coordinators))
363
+
364
+ # Send online status for newly created/recreated coordinators
365
+ # This ensures the new availability topic gets the online status immediately
366
+ for coordinator in new_coordinators.values():
367
+ try:
368
+ await coordinator.send_online_status()
369
+ except Exception as err:
370
+ _LOGGER.error(
371
+ "Failed to send online status for coordinator %s: %s",
372
+ coordinator.id,
373
+ err
374
+ )
361
375
 
362
376
  _LOGGER.info(
363
377
  "Modbus devices reload complete: %d coordinators (removed=%d, added=%d, recreated=%d)",
@@ -6,6 +6,7 @@ Supports autodiscovery of neighboring BoneIO Black devices via MQTT.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import asyncio
9
10
  import json
10
11
  import logging
11
12
  from typing import TYPE_CHECKING, Any
@@ -16,6 +17,7 @@ from boneio.core.remote.base import (
16
17
  RemoteDeviceType,
17
18
  )
18
19
  from boneio.core.remote.mqtt import MQTTRemoteDevice
20
+ from boneio.core.remote.esphome import ESPHomeRemoteDevice, ESPHOME_API_AVAILABLE
19
21
 
20
22
  if TYPE_CHECKING:
21
23
  from boneio.core.messaging import MessageBus
@@ -173,8 +175,7 @@ class RemoteDeviceManager:
173
175
  _LOGGER.warning("ESPHome UDP protocol not yet implemented for device '%s'", device_id)
174
176
  return None
175
177
  elif protocol == RemoteDeviceProtocol.ESPHOME_API:
176
- _LOGGER.warning("ESPHome API protocol not yet implemented for device '%s'", device_id)
177
- return None
178
+ return self._create_esphome_device(device_id, name, config)
178
179
  else:
179
180
  _LOGGER.error("Unsupported protocol '%s' for device '%s'", protocol, device_id)
180
181
  return None
@@ -209,6 +210,103 @@ class RemoteDeviceManager:
209
210
  covers=covers,
210
211
  )
211
212
 
213
+ def _create_esphome_device(
214
+ self,
215
+ device_id: str,
216
+ name: str,
217
+ config: dict[str, Any],
218
+ ) -> ESPHomeRemoteDevice | None:
219
+ """Create ESPHome API remote device.
220
+
221
+ Args:
222
+ device_id: Device ID
223
+ name: Device name
224
+ config: Full device configuration
225
+
226
+ Returns:
227
+ ESPHomeRemoteDevice instance or None if creation failed
228
+ """
229
+ if not ESPHOME_API_AVAILABLE:
230
+ _LOGGER.error(
231
+ "aioesphomeapi not installed - cannot create ESPHome device '%s'",
232
+ device_id
233
+ )
234
+ return None
235
+
236
+ esphome_config = config.get("esphome_api", {})
237
+ host = esphome_config.get("host")
238
+
239
+ if not host:
240
+ _LOGGER.error("ESPHome device '%s' missing 'host' in esphome_api config", device_id)
241
+ return None
242
+
243
+ port = esphome_config.get("port", 6053)
244
+ password = esphome_config.get("password", "")
245
+ encryption_key = esphome_config.get("encryption_key", "")
246
+ switches = esphome_config.get("switches", [])
247
+ lights = esphome_config.get("lights", [])
248
+ covers = esphome_config.get("covers", [])
249
+
250
+ return ESPHomeRemoteDevice(
251
+ id=device_id,
252
+ name=name,
253
+ host=host,
254
+ port=port,
255
+ password=password,
256
+ encryption_key=encryption_key,
257
+ switches=switches,
258
+ lights=lights,
259
+ covers=covers,
260
+ )
261
+
262
+ async def start_all_connections(self, delay_seconds: float = 10.0) -> None:
263
+ """Start persistent connections for all ESPHome devices.
264
+
265
+ This should be called during application startup to establish
266
+ connections to all ESPHome devices with ReconnectLogic.
267
+
268
+ ESPHome connections are delayed to prioritize local device functionality
269
+ (GPIO, MQTT) over remote device connections.
270
+
271
+ Args:
272
+ delay_seconds: Seconds to wait before starting ESPHome connections
273
+ """
274
+ esphome_devices = [
275
+ (device_id, device)
276
+ for device_id, device in self._devices.items()
277
+ if isinstance(device, ESPHomeRemoteDevice)
278
+ ]
279
+
280
+ if not esphome_devices:
281
+ return
282
+
283
+ _LOGGER.info(
284
+ "Delaying ESPHome connections by %.1f seconds (found %d devices)",
285
+ delay_seconds, len(esphome_devices)
286
+ )
287
+ await asyncio.sleep(delay_seconds)
288
+
289
+ _LOGGER.info("Starting ESPHome connections...")
290
+ for device_id, device in esphome_devices:
291
+ try:
292
+ await device.start_connection()
293
+ _LOGGER.info("Started connection for ESPHome device '%s'", device_id)
294
+ except Exception as e:
295
+ _LOGGER.error("Failed to start connection for ESPHome device '%s': %s", device_id, e)
296
+
297
+ async def stop_all_connections(self) -> None:
298
+ """Stop all persistent connections.
299
+
300
+ This should be called during application shutdown.
301
+ """
302
+ for device_id, device in self._devices.items():
303
+ if isinstance(device, ESPHomeRemoteDevice):
304
+ try:
305
+ await device.disconnect()
306
+ _LOGGER.info("Stopped connection for ESPHome device '%s'", device_id)
307
+ except Exception as e:
308
+ _LOGGER.error("Failed to stop connection for ESPHome device '%s': %s", device_id, e)
309
+
212
310
  def get_device(self, device_id: str) -> RemoteDevice | None:
213
311
  """Get remote device by ID.
214
312
 
@@ -233,13 +331,20 @@ class RemoteDeviceManager:
233
331
  device_id: str,
234
332
  output_id: str,
235
333
  action: str,
334
+ brightness: int | None = None,
335
+ transition: float | None = None,
236
336
  ) -> bool:
237
- """Control output on remote device.
337
+ """Control output on remote device (BoneIO MQTT or ESPHome API).
338
+
339
+ Automatically detects device protocol and routes to appropriate method.
340
+ For ESPHome devices, output_id can be a switch or light entity.
238
341
 
239
342
  Args:
240
343
  device_id: ID of the remote device
241
- output_id: ID of the output to control
242
- action: Action to perform (ON, OFF, TOGGLE)
344
+ output_id: ID of the output/switch/light to control
345
+ action: Action to perform (ON, OFF, TOGGLE, BRIGHTNESS_UP, BRIGHTNESS_DOWN, SET_BRIGHTNESS)
346
+ brightness: Brightness level (0-255) - only for ESPHome lights
347
+ transition: Transition time in seconds - only for ESPHome lights
243
348
 
244
349
  Returns:
245
350
  True if command was sent successfully
@@ -249,6 +354,25 @@ class RemoteDeviceManager:
249
354
  _LOGGER.error("Remote device '%s' not found", device_id)
250
355
  return False
251
356
 
357
+ # For ESPHome devices, try to determine if it's a switch or light
358
+ if isinstance(device, ESPHomeRemoteDevice):
359
+ # Check if output_id is a light
360
+ if device.has_light(output_id):
361
+ _LOGGER.debug("Controlling ESPHome light '%s' on device '%s'", output_id, device_id)
362
+ return await device.control_light(
363
+ light_id=output_id,
364
+ action=action,
365
+ brightness=brightness,
366
+ transition=transition if transition is not None else 0.0,
367
+ )
368
+ # Otherwise treat as switch
369
+ _LOGGER.debug("Controlling ESPHome switch '%s' on device '%s'", output_id, device_id)
370
+ return await device.control_switch(
371
+ switch_id=output_id,
372
+ action=action,
373
+ )
374
+
375
+ # For MQTT devices, use standard control_output
252
376
  return await device.control_output(
253
377
  output_id=output_id,
254
378
  action=action,
@@ -262,12 +386,14 @@ class RemoteDeviceManager:
262
386
  action: str,
263
387
  **kwargs,
264
388
  ) -> bool:
265
- """Control cover on remote device.
389
+ """Control cover on remote device (BoneIO MQTT or ESPHome API).
390
+
391
+ Automatically detects device protocol and routes to appropriate method.
266
392
 
267
393
  Args:
268
394
  device_id: ID of the remote device
269
395
  cover_id: ID of the cover to control
270
- action: Action to perform (OPEN, CLOSE, STOP, etc.)
396
+ action: Action to perform (OPEN, CLOSE, STOP, TOGGLE, etc.)
271
397
  **kwargs: Additional parameters (position, tilt_position)
272
398
 
273
399
  Returns:
@@ -278,6 +404,15 @@ class RemoteDeviceManager:
278
404
  _LOGGER.error("Remote device '%s' not found", device_id)
279
405
  return False
280
406
 
407
+ # For ESPHome devices, use native API
408
+ if isinstance(device, ESPHomeRemoteDevice):
409
+ _LOGGER.debug("Controlling ESPHome cover '%s' on device '%s'", cover_id, device_id)
410
+ return await device.control_cover(
411
+ cover_id=cover_id,
412
+ action=action,
413
+ )
414
+
415
+ # For MQTT devices, use standard control_cover
281
416
  return await device.control_cover(
282
417
  cover_id=cover_id,
283
418
  action=action,
@@ -585,6 +720,11 @@ class RemoteDeviceManager:
585
720
  Returns:
586
721
  Dictionary with autodiscovered devices information
587
722
  """
723
+ _LOGGER.debug(
724
+ "autodiscovered_to_dict called, _autodiscovered_devices has %d items: %s",
725
+ len(self._autodiscovered_devices),
726
+ list(self._autodiscovered_devices.keys())
727
+ )
588
728
  return {
589
729
  device_id: device.to_dict()
590
730
  for device_id, device in self._autodiscovered_devices.items()
@@ -183,6 +183,16 @@ class SensorManager:
183
183
  return temp_sensor
184
184
  except I2CError as err:
185
185
  _LOGGER.error("Can't configure temp sensor %s: %s", name, err)
186
+ # Store error in manager for WebUI display
187
+ self._manager._hardware_errors.append({
188
+ 'type': 'sensor',
189
+ 'sensor_type': 'temperature',
190
+ 'id': id,
191
+ 'name': name,
192
+ 'address': config.get(ADDRESS),
193
+ 'error': str(err),
194
+ 'message': f"Temperature sensor {name} at address 0x{config.get(ADDRESS, 0):02X}: {err}",
195
+ })
186
196
  return None
187
197
 
188
198
  # -------------------------------------------------------------------------
@@ -240,6 +250,16 @@ class SensorManager:
240
250
  return ina219
241
251
  except I2CError as err:
242
252
  _LOGGER.error("Can't configure INA219 sensor: %s", err)
253
+ # Store error in manager for WebUI display
254
+ self._manager._hardware_errors.append({
255
+ 'type': 'sensor',
256
+ 'sensor_type': 'ina219',
257
+ 'id': id,
258
+ 'name': id,
259
+ 'address': address,
260
+ 'error': str(err),
261
+ 'message': f"INA219 sensor at address 0x{address:02X}: {err}",
262
+ })
243
263
  return None
244
264
 
245
265
  # -------------------------------------------------------------------------
@@ -3,11 +3,12 @@ from __future__ import annotations
3
3
 
4
4
  import logging
5
5
  from abc import ABC, abstractmethod
6
- from typing import TYPE_CHECKING
6
+ from typing import TYPE_CHECKING, Any
7
7
  from collections.abc import Awaitable, Callable
8
8
 
9
9
  if TYPE_CHECKING:
10
10
  from boneio.core.manager import Manager
11
+ from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
11
12
 
12
13
  _LOGGER = logging.getLogger(__name__)
13
14
 
@@ -18,7 +19,7 @@ class MessageBus(ABC):
18
19
  def send_message(
19
20
  self,
20
21
  topic: str,
21
- payload: str | int | dict[str, str | float | int | None] | None,
22
+ payload: str | int | dict[str, Any] | "HomeAssistantDiscoveryMessage" | None,
22
23
  retain: bool = False,
23
24
  qos: int = 0,
24
25
  ) -> None:
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  import logging
5
5
  from collections.abc import Callable
6
- from typing import TYPE_CHECKING, Optional
6
+ from typing import TYPE_CHECKING, Optional, Any
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from boneio.core.manager import Manager
@@ -26,7 +26,7 @@ class LocalMessageBus(MessageBus):
26
26
  def send_message(
27
27
  self,
28
28
  topic: str,
29
- payload: str | int | dict[str, str | float | int] | None,
29
+ payload: str | int | dict[str, Any] | None,
30
30
  retain: bool = False,
31
31
  qos: int = 0,
32
32
  ) -> None:
@@ -13,6 +13,9 @@ from collections.abc import Awaitable, Callable
13
13
  from contextlib import AsyncExitStack
14
14
  from typing import TYPE_CHECKING, Any, override
15
15
 
16
+ if TYPE_CHECKING:
17
+ from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
18
+
16
19
  from aiomqtt import Client as AsyncioClient
17
20
  from aiomqtt import MqttError, Will
18
21
  from paho.mqtt.properties import Properties
@@ -164,7 +167,7 @@ class MQTTClient(MessageBus):
164
167
  def send_message(
165
168
  self,
166
169
  topic: str,
167
- payload: str | int | bytes | dict[str, str | float | int] | None,
170
+ payload: str | int | bytes | dict[str, Any] | None,
168
171
  retain: bool = False,
169
172
  qos: int = 0,
170
173
  ) -> None:
@@ -2,16 +2,28 @@
2
2
 
3
3
  Supports multiple protocols:
4
4
  - MQTT: Standard MQTT communication (boneIO Black, ESPHome, etc.)
5
+ - ESPHome API: Native ESPHome API via TCP/IP
5
6
  - CAN: CAN bus communication (future)
6
7
  - Loxone: Loxone Miniserver integration (future)
7
- - ESPHome API: Native ESPHome API (future)
8
8
  """
9
9
 
10
10
  from boneio.core.remote.base import RemoteDevice, RemoteDeviceProtocol
11
11
  from boneio.core.remote.mqtt import MQTTRemoteDevice
12
+ from boneio.core.remote.esphome import (
13
+ ESPHomeRemoteDevice,
14
+ discover_esphome_entities,
15
+ scan_esphome_devices,
16
+ ESPHOME_API_AVAILABLE,
17
+ ZEROCONF_AVAILABLE,
18
+ )
12
19
 
13
20
  __all__ = [
14
21
  "RemoteDevice",
15
22
  "RemoteDeviceProtocol",
16
23
  "MQTTRemoteDevice",
24
+ "ESPHomeRemoteDevice",
25
+ "discover_esphome_entities",
26
+ "scan_esphome_devices",
27
+ "ESPHOME_API_AVAILABLE",
28
+ "ZEROCONF_AVAILABLE",
17
29
  ]