boneIO 1.0.0.dev19__tar.gz → 1.0.0.dev21__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.dev19/boneio.egg-info → boneio-1.0.0.dev21}/PKG-INFO +3 -1
  2. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/config_helper.py +10 -2
  3. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/manager.py +19 -2
  4. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/modbus.py +15 -1
  5. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/remote.py +171 -16
  6. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/basic.py +3 -2
  7. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/local.py +2 -2
  8. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/mqtt.py +4 -1
  9. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/__init__.py +13 -1
  10. boneio-1.0.0.dev21/boneio/core/remote/esphome.py +1022 -0
  11. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/__init__.py +0 -2
  12. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/homeassistant.py +174 -101
  13. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/coordinator.py +75 -11
  14. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/base.py +17 -7
  15. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/select.py +7 -3
  16. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/text.py +8 -4
  17. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/binary.py +8 -3
  18. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/text.py +8 -4
  19. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/binary.py +9 -4
  20. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/numeric.py +18 -8
  21. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/runner.py +15 -1
  22. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions.yaml +30 -4
  23. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/remote_devices.yaml +157 -34
  24. boneio-1.0.0.dev21/boneio/version.py +2 -0
  25. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/cssMode-CTusuhtw.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/cssMode-Cf6c8Rak.js +1 -1
  26. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/freemarker2-Dz7M_8pc.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/freemarker2-Dx0BWjru.js +1 -1
  27. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/handlebars-DJ83W6ke.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/handlebars-BTuLZVfx.js +1 -1
  28. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/html-C31TNwrw.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/html-BB3T_3_K.js +1 -1
  29. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/htmlMode-N9a7dHJ-.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/htmlMode-yP62Fr3K.js +1 -1
  30. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/index-DjwH-58l.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/index-GG4_twIa.js +216 -216
  31. boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/index-cAyuaVJ4.css +1 -0
  32. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/javascript-iwXLowO6.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/javascript-fCd4TqkY.js +1 -1
  33. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/jsonMode-CVxVF5Xf.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/jsonMode-CChUrnET.js +1 -1
  34. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/liquid-CbbScCDs.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/liquid-DdLOtKyT.js +1 -1
  35. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/mdx-uKMATDKf.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/mdx-wnkV-3mF.js +1 -1
  36. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/python-BKXaD8Q4.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/python-BU1BlHpX.js +1 -1
  37. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/razor-BUeWte8D.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/razor-DNgLOtn7.js +1 -1
  38. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/tsMode-L9m-RlpT.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/tsMode-CINGfPlt.js +1 -1
  39. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/typescript-gH6eiNnh.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/typescript-CkWSk1mf.js +1 -1
  40. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/xml-Bg4W8niF.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/xml-DlZcKj6v.js +1 -1
  41. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/yaml-B39PGswj.js → boneio-1.0.0.dev21/boneio/webui/frontend-dist/assets/yaml-CDmetGCQ.js +1 -1
  42. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/index.html +2 -2
  43. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/adc.schema.json +4 -4
  44. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/areas.schema.json +2 -2
  45. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +48 -8
  46. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/config.schema.json +579 -97
  47. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/cover.schema.json +2 -2
  48. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/ds2482.schema.json +2 -2
  49. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/event.schema.json +163 -23
  50. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/ina219.schema.json +6 -6
  51. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/lm75.schema.json +4 -4
  52. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +2 -2
  53. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +4 -4
  54. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +6 -6
  55. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/oled.schema.json +4 -4
  56. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/output.schema.json +4 -4
  57. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
  58. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/pca9685.schema.json +2 -2
  59. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +2 -2
  60. boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem/remote_devices.schema.json +437 -0
  61. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/sensor.schema.json +4 -4
  62. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +2 -2
  63. {boneio-1.0.0.dev19/boneio/webui/schema → boneio-1.0.0.dev21/boneio/webui/frontend-dist/schem}/web.schema.json +5 -5
  64. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/config.py +38 -1
  65. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/remote_devices.py +102 -1
  66. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/system.py +7 -4
  67. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/adc.schema.json +4 -4
  68. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/areas.schema.json +2 -2
  69. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/binary_sensor.schema.json +48 -8
  70. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/config.schema.json +579 -97
  71. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/cover.schema.json +2 -2
  72. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/ds2482.schema.json +2 -2
  73. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/event.schema.json +163 -23
  74. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/ina219.schema.json +6 -6
  75. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/lm75.schema.json +4 -4
  76. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mcp23017.schema.json +2 -2
  77. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mcp9808.schema.json +4 -4
  78. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/modbus_devices.schema.json +6 -6
  79. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/oled.schema.json +4 -4
  80. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/output.schema.json +4 -4
  81. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/output_group.schema.json +4 -4
  82. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/pca9685.schema.json +2 -2
  83. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/pcf8575.schema.json +2 -2
  84. boneio-1.0.0.dev21/boneio/webui/schema/remote_devices.schema.json +437 -0
  85. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/sensor.schema.json +4 -4
  86. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
  87. {boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev21/boneio/webui/schema}/web.schema.json +5 -5
  88. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21/boneio.egg-info}/PKG-INFO +3 -1
  89. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/SOURCES.txt +18 -17
  90. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/requires.txt +2 -0
  91. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/pyproject.toml +3 -1
  92. boneio-1.0.0.dev19/boneio/version.py +0 -2
  93. boneio-1.0.0.dev19/boneio/webui/frontend-dist/assets/index-BnfQOkAm.css +0 -1
  94. boneio-1.0.0.dev19/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -135
  95. boneio-1.0.0.dev19/boneio/webui/schema/remote_devices.schema.json +0 -135
  96. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/LICENSE +0 -0
  97. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/MANIFEST.in +0 -0
  98. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/README.md +0 -0
  99. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/__init__.py +0 -0
  100. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/input.yaml +0 -0
  101. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_24_16.yaml +0 -0
  102. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_32_10.yaml +0 -0
  103. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_32_5.yaml +0 -0
  104. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_cover.yaml +0 -0
  105. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  106. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/input.yaml +0 -0
  107. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_24_16.yaml +0 -0
  108. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_32_10.yaml +0 -0
  109. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_32_5.yaml +0 -0
  110. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_cover.yaml +0 -0
  111. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  112. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/input.yaml +0 -0
  113. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_24_16.yaml +0 -0
  114. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_32_10.yaml +0 -0
  115. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_32_5.yaml +0 -0
  116. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_cover.yaml +0 -0
  117. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  118. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/input.yaml +0 -0
  119. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_24_16.yaml +0 -0
  120. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_32_10.yaml +0 -0
  121. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_cover.yaml +0 -0
  122. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  123. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/input.yaml +0 -0
  124. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_24_16.yaml +0 -0
  125. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_32_10.yaml +0 -0
  126. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_cover.yaml +0 -0
  127. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  128. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/input.yaml +0 -0
  129. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_24_16.yaml +0 -0
  130. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_32_10.yaml +0 -0
  131. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_cover.yaml +0 -0
  132. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  133. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/input.yaml +0 -0
  134. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_24_16.yaml +0 -0
  135. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_32_10.yaml +0 -0
  136. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_cover.yaml +0 -0
  137. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  138. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/bonecli.py +0 -0
  139. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/__init__.py +0 -0
  140. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/__init__.py +0 -0
  141. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/cover.py +0 -0
  142. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/previous.py +0 -0
  143. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/time_based.py +0 -0
  144. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/cover/venetian.py +0 -0
  145. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/group/__init__.py +0 -0
  146. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/group/output_group.py +0 -0
  147. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/__init__.py +0 -0
  148. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/binary_sensor.py +0 -0
  149. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/detectors.py +0 -0
  150. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/input/event.py +0 -0
  151. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/__init__.py +0 -0
  152. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/basic.py +0 -0
  153. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/mcp.py +0 -0
  154. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/pca.py +0 -0
  155. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/output/pcf.py +0 -0
  156. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/sensor/__init__.py +0 -0
  157. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/components/sensor/virtual_energy.py +0 -0
  158. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/const.py +0 -0
  159. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/__init__.py +0 -0
  160. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/__init__.py +0 -0
  161. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/package-lock.json +0 -0
  162. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/package.json +0 -0
  163. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/schema_converter.py +0 -0
  164. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/config/yaml_util.py +0 -0
  165. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/discovery.py +0 -0
  166. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/events/__init__.py +0 -0
  167. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/events/bus.py +0 -0
  168. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/__init__.py +0 -0
  169. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/covers.py +0 -0
  170. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/display.py +0 -0
  171. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/inputs.py +0 -0
  172. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/outputs.py +0 -0
  173. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/manager/sensors.py +0 -0
  174. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/__init__.py +0 -0
  175. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/basic_mqtt.py +0 -0
  176. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/messaging/queue.py +0 -0
  177. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/base.py +0 -0
  178. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/remote/mqtt.py +0 -0
  179. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/__init__.py +0 -0
  180. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/base.py +0 -0
  181. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/sensor/system.py +0 -0
  182. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/state/__init__.py +0 -0
  183. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/state/manager.py +0 -0
  184. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/__init__.py +0 -0
  185. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/host_data.py +0 -0
  186. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/system/monitor.py +0 -0
  187. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/__init__.py +0 -0
  188. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/async_updater.py +0 -0
  189. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/filter.py +0 -0
  190. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/font_util.py +0 -0
  191. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/logger.py +0 -0
  192. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/timeperiod.py +0 -0
  193. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/core/utils/util.py +0 -0
  194. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/adc.yaml +0 -0
  195. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  196. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/config.yaml +0 -0
  197. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/event.yaml +0 -0
  198. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/mqtt.yaml +0 -0
  199. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  200. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/adc.yaml +0 -0
  201. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  202. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/config.yaml +0 -0
  203. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/event.yaml +0 -0
  204. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/mqtt.yaml +0 -0
  205. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  206. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/__init__.py +0 -0
  207. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/adc.yaml +0 -0
  208. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  209. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/config.yaml +0 -0
  210. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/cover.yaml +0 -0
  211. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/event.yaml +0 -0
  212. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/mqtt.yaml +0 -0
  213. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover/outputCover.yaml +0 -0
  214. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/adc.yaml +0 -0
  215. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  216. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/config.yaml +0 -0
  217. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/cover.yaml +0 -0
  218. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/event.yaml +0 -0
  219. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  220. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  221. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/adc.yaml +0 -0
  222. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  223. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  224. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  225. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  226. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/event_all.yaml +0 -0
  227. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  228. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  229. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  230. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  231. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  232. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  233. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/exceptions.py +0 -0
  234. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/__init__.py +0 -0
  235. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/analog/__init__.py +0 -0
  236. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/analog/adc.py +0 -0
  237. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/__init__.py +0 -0
  238. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  239. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/display/oled.py +0 -0
  240. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/__init__.py +0 -0
  241. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  242. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  243. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  244. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  245. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/__init__.py +0 -0
  246. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/base.py +0 -0
  247. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/gpio/input/manager.py +0 -0
  248. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/__init__.py +0 -0
  249. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/bus.py +0 -0
  250. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/ina219.py +0 -0
  251. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/ina219_driver.py +0 -0
  252. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/mcp9808.py +0 -0
  253. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/i2c/pct2075.py +0 -0
  254. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/__init__.py +0 -0
  255. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/bus.py +0 -0
  256. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/dallas.py +0 -0
  257. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/onewire/ds2482.py +0 -0
  258. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/__init__.py +0 -0
  259. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  260. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/base.py +0 -0
  261. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  262. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  263. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/integration/interlock.py +0 -0
  264. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/__init__.py +0 -0
  265. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/cli.py +0 -0
  266. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/client.py +0 -0
  267. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/__init__.py +0 -0
  268. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  269. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  270. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  271. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  272. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  273. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  274. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  275. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/inverters/sofar.json +0 -0
  276. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/inverters/thessla.json +0 -0
  277. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  278. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/other/wanas415.json +0 -0
  279. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/cwt.json +0 -0
  280. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  281. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  282. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/pt100.json +0 -0
  283. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/sht20.json +0 -0
  284. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/devices/sensors/sht30.json +0 -0
  285. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/__init__.py +0 -0
  286. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/__init__.py +0 -0
  287. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/numeric.py +0 -0
  288. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/derived/switch.py +0 -0
  289. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/__init__.py +0 -0
  290. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/sensor/numeric.py +0 -0
  291. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/entities/writeable/__init__.py +0 -0
  292. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/modbus/utils.py +0 -0
  293. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/__init__.py +0 -0
  294. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/actions.py +0 -0
  295. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/events.py +0 -0
  296. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/files.py +0 -0
  297. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/logs.py +0 -0
  298. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/mqtt.py +0 -0
  299. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/models/state.py +0 -0
  300. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions_sensor.yaml +0 -0
  301. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/actions_switch.yaml +0 -0
  302. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/filters.yaml +0 -0
  303. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/filters_adc.yaml +0 -0
  304. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/id.yaml +0 -0
  305. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/schema.yaml +0 -0
  306. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/temp_unit.yaml +0 -0
  307. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/schema/update_interval.yaml +0 -0
  308. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/app.py +0 -0
  309. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  310. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  311. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  312. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  313. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  314. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  315. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  316. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  317. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  318. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  319. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  320. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  321. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  322. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  323. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  324. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  325. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  326. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  327. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  328. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  329. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  330. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  331. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  332. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  333. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  334. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  335. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  336. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  337. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  338. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  339. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  340. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  341. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  342. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  343. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  344. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  345. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  346. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  347. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  348. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  349. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  350. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  351. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  352. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  353. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  354. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  355. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  356. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  357. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  358. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  359. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  360. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  361. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  362. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  363. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  364. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  365. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  366. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  367. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  368. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  369. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  370. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  371. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  372. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  373. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  374. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  375. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  376. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  377. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  378. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  379. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  380. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  381. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  382. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  383. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/boneio.svg +0 -0
  384. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  385. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
  386. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  387. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  388. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
  389. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
  390. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/middleware/__init__.py +0 -0
  391. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/middleware/auth.py +0 -0
  392. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/__init__.py +0 -0
  393. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/auth.py +0 -0
  394. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/caddy.py +0 -0
  395. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/covers.py +0 -0
  396. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/modbus.py +0 -0
  397. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/outputs.py +0 -0
  398. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/sensors.py +0 -0
  399. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/routes/update.py +0 -0
  400. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/boneio.schema.json +0 -0
  401. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/dallas.schema.json +0 -0
  402. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/logger.schema.json +0 -0
  403. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/modbus.schema.json +0 -0
  404. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/schema/mqtt.schema.json +0 -0
  405. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/services/__init__.py +0 -0
  406. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/services/logs.py +0 -0
  407. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/web_server.py +0 -0
  408. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio/webui/websocket_manager.py +0 -0
  409. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/dependency_links.txt +0 -0
  410. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/entry_points.txt +0 -0
  411. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/boneio.egg-info/top_level.txt +0 -0
  412. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/setup.cfg +0 -0
  413. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/setup.py +0 -0
  414. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/tests/test_i2c_smbus2.py +0 -0
  415. {boneio-1.0.0.dev19 → boneio-1.0.0.dev21}/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.dev19
3
+ Version: 1.0.0.dev21
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:
@@ -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
 
@@ -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
@@ -44,6 +46,7 @@ class RemoteDeviceManager:
44
46
  message_bus: MessageBus | None = None,
45
47
  remote_devices_config: list[dict[str, Any]] | None = None,
46
48
  own_serial: str | None = None,
49
+ name: str | None = None,
47
50
  ) -> None:
48
51
  """Initialize remote device manager.
49
52
 
@@ -55,6 +58,7 @@ class RemoteDeviceManager:
55
58
  self._message_bus = message_bus
56
59
  self._devices: dict[str, RemoteDevice] = {}
57
60
  self._own_serial = own_serial
61
+ self._name = name
58
62
  # Track autodiscovered devices separately from configured ones
59
63
  self._autodiscovered_devices: dict[str, MQTTRemoteDevice] = {}
60
64
  # Track devices that manage this boneIO (received via discovery/managed_by topic)
@@ -111,8 +115,7 @@ class RemoteDeviceManager:
111
115
 
112
116
  # Build payload with our device info
113
117
  payload = json.dumps({
114
- "id": self._own_serial,
115
- "name": self._own_serial, # Will be updated with actual name if available
118
+ "name": self._name or self._own_serial,
116
119
  "serial": self._own_serial,
117
120
  })
118
121
 
@@ -172,8 +175,7 @@ class RemoteDeviceManager:
172
175
  _LOGGER.warning("ESPHome UDP protocol not yet implemented for device '%s'", device_id)
173
176
  return None
174
177
  elif protocol == RemoteDeviceProtocol.ESPHOME_API:
175
- _LOGGER.warning("ESPHome API protocol not yet implemented for device '%s'", device_id)
176
- return None
178
+ return self._create_esphome_device(device_id, name, config)
177
179
  else:
178
180
  _LOGGER.error("Unsupported protocol '%s' for device '%s'", protocol, device_id)
179
181
  return None
@@ -208,6 +210,103 @@ class RemoteDeviceManager:
208
210
  covers=covers,
209
211
  )
210
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
+
211
310
  def get_device(self, device_id: str) -> RemoteDevice | None:
212
311
  """Get remote device by ID.
213
312
 
@@ -232,13 +331,20 @@ class RemoteDeviceManager:
232
331
  device_id: str,
233
332
  output_id: str,
234
333
  action: str,
334
+ brightness: int | None = None,
335
+ transition: float | None = None,
235
336
  ) -> bool:
236
- """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.
237
341
 
238
342
  Args:
239
343
  device_id: ID of the remote device
240
- output_id: ID of the output to control
241
- 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
242
348
 
243
349
  Returns:
244
350
  True if command was sent successfully
@@ -248,6 +354,25 @@ class RemoteDeviceManager:
248
354
  _LOGGER.error("Remote device '%s' not found", device_id)
249
355
  return False
250
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
251
376
  return await device.control_output(
252
377
  output_id=output_id,
253
378
  action=action,
@@ -261,12 +386,14 @@ class RemoteDeviceManager:
261
386
  action: str,
262
387
  **kwargs,
263
388
  ) -> bool:
264
- """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.
265
392
 
266
393
  Args:
267
394
  device_id: ID of the remote device
268
395
  cover_id: ID of the cover to control
269
- action: Action to perform (OPEN, CLOSE, STOP, etc.)
396
+ action: Action to perform (OPEN, CLOSE, STOP, TOGGLE, etc.)
270
397
  **kwargs: Additional parameters (position, tilt_position)
271
398
 
272
399
  Returns:
@@ -277,6 +404,15 @@ class RemoteDeviceManager:
277
404
  _LOGGER.error("Remote device '%s' not found", device_id)
278
405
  return False
279
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
280
416
  return await device.control_cover(
281
417
  cover_id=cover_id,
282
418
  action=action,
@@ -352,7 +488,27 @@ class RemoteDeviceManager:
352
488
  device_id = parts[1] # e.g., "blk_abc123"
353
489
  discovery_type = parts[3] if len(parts) > 3 else None # e.g., "outputs", "covers", "device"
354
490
 
355
- # Skip our own device
491
+ # Handle managed_by BEFORE skipping own device check
492
+ # Topic: boneio/{our_device}/discovery/managed_by/{manager_serial}
493
+ # This is for messages TO our device, so device_id will be our serial
494
+ if discovery_type == "managed_by":
495
+ manager_serial = parts[4] if len(parts) > 4 else None
496
+ if manager_serial and self._own_serial != manager_serial:
497
+ try:
498
+ data = json.loads(payload) if payload else None
499
+ except json.JSONDecodeError as e:
500
+ _LOGGER.warning("Invalid JSON in managed_by payload: %s", e)
501
+ return
502
+ if data:
503
+ self.handle_managed_by_discovery(manager_serial, data)
504
+ else:
505
+ # Empty payload - remove managed_by entry
506
+ if manager_serial in self._managed_by_devices:
507
+ del self._managed_by_devices[manager_serial]
508
+ _LOGGER.info("Removed managed_by device: %s", manager_serial)
509
+ return
510
+
511
+ # Skip our own device (for other discovery types)
356
512
  if self._own_serial and device_id == self._own_serial:
357
513
  _LOGGER.debug("Ignoring discovery from own device: %s", device_id)
358
514
  return
@@ -385,12 +541,6 @@ class RemoteDeviceManager:
385
541
  self._handle_outputs_discovery(device_id, data)
386
542
  elif discovery_type == "covers":
387
543
  self._handle_covers_discovery(device_id, data)
388
- elif discovery_type == "managed_by":
389
- # Handle managed_by - this is for OUR device, not the sender
390
- # Topic: boneio/{our_device}/discovery/managed_by/{manager_serial}
391
- manager_serial = parts[4] if len(parts) > 4 else None
392
- if manager_serial:
393
- self.handle_managed_by_discovery(manager_serial, data)
394
544
  else:
395
545
  _LOGGER.debug("Ignoring discovery type '%s' for device %s", discovery_type, device_id)
396
546
 
@@ -570,6 +720,11 @@ class RemoteDeviceManager:
570
720
  Returns:
571
721
  Dictionary with autodiscovered devices information
572
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
+ )
573
728
  return {
574
729
  device_id: device.to_dict()
575
730
  for device_id, device in self._autodiscovered_devices.items()
@@ -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
  ]