boneio 1.5.0.dev41__tar.gz → 1.6.0.dev1__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 (535) hide show
  1. {boneio-1.5.0.dev41/boneio.egg-info → boneio-1.6.0.dev1}/PKG-INFO +1 -1
  2. boneio-1.6.0.dev1/boneio/components/cover/__init__.py +6 -0
  3. boneio-1.6.0.dev1/boneio/components/cover/remote.py +277 -0
  4. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/manager.py +138 -71
  5. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/esphome.py +38 -0
  6. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/integration/homeassistant.py +4 -1
  7. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/remote_outputs.yaml +2 -1
  8. boneio-1.6.0.dev1/boneio/version.py +2 -0
  9. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/BindingMatrix-BNqK7tIZ.js +1 -0
  10. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/ConfigEditor-set_Qoo1.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-BbAOE4qq.js +1 -1
  11. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EditItemDialog-C0WDUAld.js +66 -0
  12. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/EntityCard-D74vPKzA.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityCard-xdVpUoDY.js +1 -1
  13. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/EntityGrid-BN3hkCWK.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityGrid-gh0rv5_A.js +1 -1
  14. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/FormInputToggle-C3N_UWzy.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/FormInputToggle-B-viFZz5.js +1 -1
  15. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/InputsView-7BXiGozL.js +1 -0
  16. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/LogViewer-RefUkoWR.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/LogViewer-DoFcRAEu.js +2 -2
  17. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/ModbusView-Dwd3_KJS.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ModbusView-DX2BOSsr.js +1 -1
  18. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/NodeRedView--ogT6Dbm.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/NodeRedView-BdZeZ91F.js +1 -1
  19. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/OutputsView-BaZRxY6O.js +1 -0
  20. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/SensorView-C3kPKCFf.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SensorView-BS6L9UKi.js +1 -1
  21. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BBw56CUu.js +1 -0
  22. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SystemState-3DdCx89h.js +1 -0
  23. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/TemplatesView-C2wBfPOg.js +1 -0
  24. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/Tools-DX1geom0.js +14 -0
  25. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/UISettings-BAXtlmBZ.js +38 -0
  26. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/gi-7Mj_ioeM.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/gi-D-jcrHWa.js +1 -1
  27. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-B-isv7qh.js +6 -0
  28. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/index-FA3V0TxG.css → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-pwUtHTme.css +1 -1
  29. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/index.html +2 -2
  30. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +2 -1
  31. {boneio-1.5.0.dev41/boneio/webui → boneio-1.6.0.dev1/boneio/webui/frontend-dist}/schema/remote_outputs.schema.json +2 -1
  32. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/sw.js +1 -1
  33. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/remote_devices.py +88 -0
  34. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/config.schema.json +2 -1
  35. {boneio-1.5.0.dev41/boneio/webui/frontend-dist → boneio-1.6.0.dev1/boneio/webui}/schema/remote_outputs.schema.json +2 -1
  36. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1/boneio.egg-info}/PKG-INFO +1 -1
  37. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio.egg-info/SOURCES.txt +21 -20
  38. boneio-1.5.0.dev41/boneio/components/cover/__init__.py +0 -5
  39. boneio-1.5.0.dev41/boneio/version.py +0 -2
  40. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/BindingMatrix-nIxlEHTd.js +0 -1
  41. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/EditItemDialog-_53aIb2_.js +0 -66
  42. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/InputsView-B7on4rOh.js +0 -1
  43. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/OutputsView-BxFJRwd4.js +0 -1
  44. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/SudoPasswordDialog-DS-3pCx-.js +0 -1
  45. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/SystemState-CUmudnMp.js +0 -1
  46. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/TemplatesView-CFa1qlRa.js +0 -1
  47. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/Tools-CUS0azhR.js +0 -14
  48. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/UISettings-BWNODvh7.js +0 -38
  49. boneio-1.5.0.dev41/boneio/webui/frontend-dist/assets/index-N_Atf1i3.js +0 -6
  50. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/LICENSE +0 -0
  51. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/MANIFEST.in +0 -0
  52. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/README.md +0 -0
  53. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/__init__.py +0 -0
  54. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/input.yaml +0 -0
  55. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
  56. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
  57. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
  58. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
  59. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  60. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/input.yaml +0 -0
  61. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
  62. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
  63. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
  64. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
  65. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  66. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/input.yaml +0 -0
  67. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
  68. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
  69. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
  70. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
  71. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  72. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.5/input.yaml +0 -0
  73. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
  74. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
  75. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
  76. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  77. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.6/input.yaml +0 -0
  78. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
  79. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
  80. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
  81. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  82. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/input.yaml +0 -0
  83. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
  84. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  85. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
  86. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
  87. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  88. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/input.yaml +0 -0
  89. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
  90. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  91. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
  92. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
  93. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  94. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/input.yaml +0 -0
  95. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_24_16.yaml +0 -0
  96. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_32_10.yaml +0 -0
  97. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_48_4.yaml +0 -0
  98. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover.yaml +0 -0
  99. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  100. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/bonecli.py +0 -0
  101. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/__init__.py +0 -0
  102. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/cover/cover.py +0 -0
  103. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/cover/time_based.py +0 -0
  104. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/cover/venetian.py +0 -0
  105. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/group/__init__.py +0 -0
  106. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/group/output_group.py +0 -0
  107. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/__init__.py +0 -0
  108. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/binary_sensor.py +0 -0
  109. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/detectors.py +0 -0
  110. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/event.py +0 -0
  111. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/remote/__init__.py +0 -0
  112. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/remote/base.py +0 -0
  113. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/input/remote/esphome.py +0 -0
  114. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/irrigation/__init__.py +0 -0
  115. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/irrigation/controller.py +0 -0
  116. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/irrigation/water_source.py +0 -0
  117. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/__init__.py +0 -0
  118. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/basic.py +0 -0
  119. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/buzzer.py +0 -0
  120. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/mcp.py +0 -0
  121. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/pca.py +0 -0
  122. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/pcf.py +0 -0
  123. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/output/remote.py +0 -0
  124. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/sensor/__init__.py +0 -0
  125. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
  126. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/template/__init__.py +0 -0
  127. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/template/alarm_panel.py +0 -0
  128. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/template/gate_cover.py +0 -0
  129. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/components/template/thermostat.py +0 -0
  130. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/const.py +0 -0
  131. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/__init__.py +0 -0
  132. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/__init__.py +0 -0
  133. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/data/__init__.py +0 -0
  134. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  135. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  136. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  137. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/registration.py +0 -0
  138. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/cloud/secrets.py +0 -0
  139. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/__init__.py +0 -0
  140. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/config_helper.py +0 -0
  141. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/migrations/__init__.py +0 -0
  142. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  143. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
  144. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  145. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
  146. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/package-lock.json +0 -0
  147. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/package.json +0 -0
  148. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/schema_converter.py +0 -0
  149. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/yaml_compat.py +0 -0
  150. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/config/yaml_util.py +0 -0
  151. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/discovery.py +0 -0
  152. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/events/__init__.py +0 -0
  153. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/events/bus.py +0 -0
  154. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/__init__.py +0 -0
  155. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/action_conditions.py +0 -0
  156. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/canopen.py +0 -0
  157. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/covers.py +0 -0
  158. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/display.py +0 -0
  159. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/inputs.py +0 -0
  160. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/irrigation.py +0 -0
  161. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/modbus.py +0 -0
  162. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/outputs.py +0 -0
  163. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/remote.py +0 -0
  164. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/remote_input_registrar.py +0 -0
  165. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/sensors.py +0 -0
  166. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/templates/__init__.py +0 -0
  167. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/templates/alarm.py +0 -0
  168. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
  169. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
  170. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/templates.py +0 -0
  171. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/manager/update.py +0 -0
  172. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/__init__.py +0 -0
  173. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/basic.py +0 -0
  174. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
  175. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/composite.py +0 -0
  176. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/local.py +0 -0
  177. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/lox.py +0 -0
  178. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/mqtt.py +0 -0
  179. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/messaging/queue.py +0 -0
  180. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/__init__.py +0 -0
  181. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/base.py +0 -0
  182. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/can.py +0 -0
  183. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/mqtt.py +0 -0
  184. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/wled.py +0 -0
  185. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/remote/wled_cache.py +0 -0
  186. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/sensor/__init__.py +0 -0
  187. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/sensor/base.py +0 -0
  188. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/sensor/system.py +0 -0
  189. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/state/__init__.py +0 -0
  190. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/state/manager.py +0 -0
  191. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/system/__init__.py +0 -0
  192. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/system/host_data.py +0 -0
  193. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/system/monitor.py +0 -0
  194. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/__init__.py +0 -0
  195. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/async_updater.py +0 -0
  196. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/conditions.py +0 -0
  197. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/filter.py +0 -0
  198. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/font_util.py +0 -0
  199. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/logger.py +0 -0
  200. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/timeperiod.py +0 -0
  201. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/core/utils/util.py +0 -0
  202. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
  203. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  204. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/config.yaml +0 -0
  205. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/event.yaml +0 -0
  206. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
  207. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  208. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
  209. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  210. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/config.yaml +0 -0
  211. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/event.yaml +0 -0
  212. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
  213. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  214. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
  215. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  216. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/config.yaml +0 -0
  217. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/event.yaml +0 -0
  218. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
  219. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  220. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/__init__.py +0 -0
  221. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/can_master.yaml +0 -0
  222. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/can_slave.yaml +0 -0
  223. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/adc.yaml +0 -0
  224. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  225. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/config.yaml +0 -0
  226. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/cover.yaml +0 -0
  227. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/event.yaml +0 -0
  228. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
  229. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
  230. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
  231. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  232. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
  233. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
  234. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
  235. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  236. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  237. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
  238. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  239. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  240. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  241. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  242. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
  243. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  244. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  245. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  246. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  247. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  248. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  249. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/exceptions.py +0 -0
  250. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/__init__.py +0 -0
  251. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/analog/__init__.py +0 -0
  252. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/analog/adc.py +0 -0
  253. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/__init__.py +0 -0
  254. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/bridge.py +0 -0
  255. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/client.py +0 -0
  256. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/interface.py +0 -0
  257. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/node.py +0 -0
  258. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/node_id.py +0 -0
  259. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/can/test_od.py +0 -0
  260. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/display/__init__.py +0 -0
  261. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/display/early_oled.py +0 -0
  262. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  263. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/display/oled.py +0 -0
  264. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/__init__.py +0 -0
  265. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  266. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  267. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  268. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  269. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
  270. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/base.py +0 -0
  271. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
  272. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/__init__.py +0 -0
  273. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/bus.py +0 -0
  274. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219.py +0 -0
  275. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
  276. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226.py +0 -0
  277. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226_driver.py +0 -0
  278. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
  279. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
  280. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/onewire/__init__.py +0 -0
  281. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/onewire/dallas.py +0 -0
  282. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/sensor/__init__.py +0 -0
  283. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  284. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/base.py +0 -0
  285. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  286. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  287. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/integration/__init__.py +0 -0
  288. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/integration/interlock.py +0 -0
  289. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/integration/lox_template.py +0 -0
  290. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/__init__.py +0 -0
  291. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/actions.py +0 -0
  292. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  293. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
  294. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  295. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  296. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  297. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  298. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  299. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/journald/journald.conf +0 -0
  300. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  301. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  302. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
  303. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  304. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  305. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/boneio.service +0 -0
  306. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  307. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  308. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  309. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  310. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  311. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  312. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  313. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  314. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  315. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  316. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/runner.py +0 -0
  317. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/__init__.py +0 -0
  318. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  319. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  320. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  321. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  322. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  323. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  324. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  325. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  326. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  327. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  328. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  329. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/__init__.py +0 -0
  330. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/cli.py +0 -0
  331. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/client.py +0 -0
  332. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/coordinator.py +0 -0
  333. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/__init__.py +0 -0
  334. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  335. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  336. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  337. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  338. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  339. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  340. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  341. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  342. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  343. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  344. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/thessla.json +0 -0
  345. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  346. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  347. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
  348. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  349. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  350. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  351. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  352. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
  353. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  354. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  355. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  356. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  357. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
  358. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  359. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
  360. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
  361. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/__init__.py +0 -0
  362. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/base.py +0 -0
  363. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
  364. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
  365. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/select.py +0 -0
  366. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
  367. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/text.py +0 -0
  368. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
  369. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
  370. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
  371. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
  372. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
  373. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
  374. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
  375. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/mock_coordinator.py +0 -0
  376. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/modbus/utils.py +0 -0
  377. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/__init__.py +0 -0
  378. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/actions.py +0 -0
  379. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/events.py +0 -0
  380. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/files.py +0 -0
  381. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/logs.py +0 -0
  382. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/mqtt.py +0 -0
  383. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/models/state.py +0 -0
  384. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/runner.py +0 -0
  385. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/actions.yaml +0 -0
  386. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/actions_sensor.yaml +0 -0
  387. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/actions_switch.yaml +0 -0
  388. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/condition.yaml +0 -0
  389. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/filters.yaml +0 -0
  390. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/filters_adc.yaml +0 -0
  391. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/id.yaml +0 -0
  392. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/remote_devices.yaml +0 -0
  393. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/remote_inputs.yaml +0 -0
  394. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/schema.yaml +0 -0
  395. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/temp_unit.yaml +0 -0
  396. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/schema/update_interval.yaml +0 -0
  397. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/action_validation.py +0 -0
  398. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/app.py +0 -0
  399. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/dashboard_cards.py +0 -0
  400. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
  401. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
  402. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
  403. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  404. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  405. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/axios-DHUeYRnu.js +0 -0
  406. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  407. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  408. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  409. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/configCache-BAkc0Ye7.js +0 -0
  410. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  411. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  412. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  413. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  414. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  415. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
  416. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
  417. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  418. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  419. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  420. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
  421. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
  422. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  423. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
  424. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
  425. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  426. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  427. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  428. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  429. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  430. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  431. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  432. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  433. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  434. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  435. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  436. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  437. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  438. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  439. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  440. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  441. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
  442. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  443. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  444. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  445. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  446. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  447. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  448. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  449. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  450. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  451. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  452. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  453. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  454. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  455. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  456. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  457. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  458. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  459. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  460. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  461. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  462. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  463. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/hvac_svg_templates.py +0 -0
  464. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/middleware/__init__.py +0 -0
  465. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/middleware/auth.py +0 -0
  466. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/modbus_card_templates.py +0 -0
  467. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/__init__.py +0 -0
  468. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/auth.py +0 -0
  469. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/caddy.py +0 -0
  470. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/can.py +0 -0
  471. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config.py +0 -0
  472. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config_actions.py +0 -0
  473. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config_backups.py +0 -0
  474. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config_core.py +0 -0
  475. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config_discovery.py +0 -0
  476. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/config_files.py +0 -0
  477. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/covers.py +0 -0
  478. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/dashboard.py +0 -0
  479. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/dev_fake_device.py +0 -0
  480. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/irrigation.py +0 -0
  481. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/migrations.py +0 -0
  482. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/modbus.py +0 -0
  483. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/mqtt_reference.py +0 -0
  484. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/nodered.py +0 -0
  485. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/outputs.py +0 -0
  486. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/sensors.py +0 -0
  487. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/system.py +0 -0
  488. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/templates.py +0 -0
  489. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
  490. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/tools.py +0 -0
  491. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/routes/update.py +0 -0
  492. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/adc.schema.json +0 -0
  493. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/areas.schema.json +0 -0
  494. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  495. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
  496. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/can.schema.json +0 -0
  497. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/cover.schema.json +0 -0
  498. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
  499. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
  500. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/event.schema.json +0 -0
  501. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
  502. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/ina226.schema.json +0 -0
  503. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
  504. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
  505. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/logger.schema.json +0 -0
  506. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
  507. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  508. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  509. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
  510. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  511. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
  512. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/oled.schema.json +0 -0
  513. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/output.schema.json +0 -0
  514. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
  515. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
  516. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  517. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
  518. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  519. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
  520. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/template.schema.json +0 -0
  521. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  522. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/schema/web.schema.json +0 -0
  523. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/services/__init__.py +0 -0
  524. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/services/logs.py +0 -0
  525. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/sudo_rate_limiter.py +0 -0
  526. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/web_server.py +0 -0
  527. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio/webui/websocket_manager.py +0 -0
  528. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio.egg-info/dependency_links.txt +0 -0
  529. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio.egg-info/entry_points.txt +0 -0
  530. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio.egg-info/requires.txt +0 -0
  531. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/boneio.egg-info/top_level.txt +0 -0
  532. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/pyproject.toml +0 -0
  533. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/setup.cfg +0 -0
  534. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/setup.py +0 -0
  535. {boneio-1.5.0.dev41 → boneio-1.6.0.dev1}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.5.0.dev41
3
+ Version: 1.6.0.dev1
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
@@ -0,0 +1,6 @@
1
+ """Cover classes."""
2
+ from .remote import RemoteCoverOutput
3
+ from .time_based import TimeBasedCover
4
+ from .venetian import VenetianCover
5
+
6
+ __all__ = ["RemoteCoverOutput", "TimeBasedCover", "VenetianCover"]
@@ -0,0 +1,277 @@
1
+ """Remote cover output for covers on remote devices (ESPHome API).
2
+
3
+ ``RemoteCoverOutput`` provides a duck-type compatible interface with
4
+ :class:`TimeBasedCover` / :class:`VenetianCover` so that the conditions
5
+ system (``is_open`` / ``is_closed``), ``CoverManager.get_cover()``,
6
+ and WebSocket event emission work transparently with remote covers.
7
+
8
+ The actual hardware control is delegated to the parent
9
+ ``ESPHomeDeviceManager`` via ``control_cover()``.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ import time
16
+ from typing import TYPE_CHECKING, Any
17
+
18
+ from boneio.const import CLOSED, CLOSING, COVER, IDLE, OPEN, OPENING
19
+ from boneio.core.events import EventBus
20
+ from boneio.models import CoverState
21
+ from boneio.models.events import CoverEvent
22
+
23
+ if TYPE_CHECKING:
24
+ from boneio.core.messaging import MessageBus
25
+
26
+ _LOGGER = logging.getLogger(__name__)
27
+
28
+
29
+ class RemoteCoverOutput:
30
+ """Remote cover from ESPHome — duck-type compatible with local Cover.
31
+
32
+ Provides the same public interface that the condition evaluators and
33
+ the ``CoverManager`` expect:
34
+
35
+ - ``is_open`` / ``is_closed`` property for action conditions
36
+ - ``state`` / ``position`` / ``tilt`` for state reporting
37
+ - ``on_remote_state_change()`` callback from ESPHome subscription
38
+ - ``CoverEvent`` emission on EventBus for WebSocket clients
39
+
40
+ Args:
41
+ id: Entity identifier (usually ``{device_id}_{cover_id}``).
42
+ name: Human-readable display name.
43
+ device_id: ID of the remote device hosting this cover.
44
+ cover_id: Entity object_id on the remote device.
45
+ remote_source: Transport protocol (``esphome_api``).
46
+ event_bus: Central event bus for emitting ``CoverEvent`` objects.
47
+ kind: Cover device class (``blind``, ``shutter``, ``gate``, etc.).
48
+ show_in_ha: Whether to publish HA autodiscovery.
49
+ area: Optional HA area assignment.
50
+ """
51
+
52
+ # Duck-type compatibility with local covers
53
+ is_remote: bool = True
54
+
55
+ def __init__(
56
+ self,
57
+ *,
58
+ id: str,
59
+ name: str,
60
+ device_id: str,
61
+ cover_id: str,
62
+ remote_source: str,
63
+ event_bus: EventBus,
64
+ message_bus: MessageBus | None = None,
65
+ topic_prefix: str = "",
66
+ kind: str = "cover",
67
+ show_in_ha: bool = False,
68
+ area: str | None = None,
69
+ ) -> None:
70
+ self._id = id
71
+ self._name = name
72
+ self._device_id = device_id
73
+ self._cover_id = cover_id
74
+ self._remote_source = remote_source
75
+ self._event_bus = event_bus
76
+ self._message_bus: MessageBus | None = message_bus
77
+ self._send_topic = f"{topic_prefix}/{COVER}/{id}" if topic_prefix else ""
78
+ self._kind = kind
79
+ self.show_in_ha = show_in_ha
80
+ self.area: str | None = area
81
+
82
+ # State tracking
83
+ self._position: int = 0 # 0=closed, 100=open
84
+ self._tilt: int = 0
85
+ self._current_operation: str = IDLE
86
+ self._last_timestamp: float = 0.0
87
+ self._available: bool = False
88
+
89
+ # Reference to remote device manager — set by registration.
90
+ self._device_manager: Any = None
91
+ self._remote_devices_ref: Any = None
92
+
93
+ # ------------------------------------------------------------------
94
+ # Public properties (duck-type compatible with TimeBasedCover)
95
+ # ------------------------------------------------------------------
96
+
97
+ @property
98
+ def id(self) -> str:
99
+ """Entity identifier."""
100
+ return self._id
101
+
102
+ @property
103
+ def name(self) -> str:
104
+ """Human-readable name."""
105
+ return self._name
106
+
107
+ @property
108
+ def kind(self) -> str:
109
+ """Cover device class (blind, shutter, gate, etc.)."""
110
+ return self._kind
111
+
112
+ @property
113
+ def state(self) -> str:
114
+ """Current state as string (open/closed/opening/closing)."""
115
+ if self._current_operation == OPENING:
116
+ return OPENING
117
+ elif self._current_operation == CLOSING:
118
+ return CLOSING
119
+ else:
120
+ return CLOSED if self._position == 0 else OPEN
121
+
122
+ @property
123
+ def is_open(self) -> bool:
124
+ """True when cover position > 0 (not fully closed)."""
125
+ return self._position > 0
126
+
127
+ @property
128
+ def is_closed(self) -> bool:
129
+ """True when cover is fully closed (position == 0)."""
130
+ return self._position == 0
131
+
132
+ @property
133
+ def position(self) -> int:
134
+ """Current cover position (0-100)."""
135
+ return self._position
136
+
137
+ @property
138
+ def tilt(self) -> int:
139
+ """Current tilt position (0-100)."""
140
+ return self._tilt
141
+
142
+ @property
143
+ def current_operation(self) -> str:
144
+ """Current operation (idle/opening/closing)."""
145
+ return self._current_operation
146
+
147
+ @property
148
+ def last_timestamp(self) -> float:
149
+ """Timestamp of last state update."""
150
+ return self._last_timestamp
151
+
152
+ # ------------------------------------------------------------------
153
+ # Remote state callback
154
+ # ------------------------------------------------------------------
155
+
156
+ def on_remote_state_change(self, state_dict: dict[str, Any]) -> None:
157
+ """Called by ESPHome device manager when cover state changes.
158
+
159
+ Args:
160
+ state_dict: Cover state from ESPHome containing:
161
+ - position: float (0.0-1.0)
162
+ - tilt: float | None
163
+ - current_operation: int (0=IDLE, 1=OPENING, 2=CLOSING)
164
+ """
165
+ position_raw = state_dict.get("position")
166
+ if position_raw is not None:
167
+ self._position = round(float(position_raw) * 100)
168
+
169
+ tilt_raw = state_dict.get("tilt")
170
+ if tilt_raw is not None:
171
+ self._tilt = round(float(tilt_raw) * 100)
172
+
173
+ current_op_int = state_dict.get("current_operation", 0)
174
+ if current_op_int == 1:
175
+ self._current_operation = OPENING
176
+ elif current_op_int == 2:
177
+ self._current_operation = CLOSING
178
+ else:
179
+ self._current_operation = IDLE
180
+
181
+ self._last_timestamp = time.time()
182
+ self._available = True
183
+
184
+ _LOGGER.debug(
185
+ "Remote cover '%s' state: position=%d%%, tilt=%d%%, operation=%s",
186
+ self._id,
187
+ self._position,
188
+ self._tilt,
189
+ self._current_operation,
190
+ )
191
+
192
+ # Emit CoverEvent for WebSocket clients
193
+ self._emit_cover_event()
194
+
195
+ def _emit_cover_event(self) -> None:
196
+ """Emit a CoverEvent on the event bus."""
197
+ event = CoverState(
198
+ id=self._id,
199
+ name=self._name,
200
+ state=self.state,
201
+ kind=self._kind,
202
+ timestamp=self._last_timestamp,
203
+ current_operation=self._current_operation,
204
+ position=self._position,
205
+ tilt=self._tilt,
206
+ )
207
+ self._event_bus.trigger_event(CoverEvent(entity_id=self._id, state=event))
208
+
209
+ # ------------------------------------------------------------------
210
+ # Device manager resolution (lazy — same pattern as RemoteOutputBase)
211
+ # ------------------------------------------------------------------
212
+
213
+ def _resolve_device_manager(self) -> bool:
214
+ """Try to resolve device manager lazily from remote_devices reference.
215
+
216
+ Returns:
217
+ ``True`` if device manager is now available.
218
+ """
219
+ if self._device_manager is not None:
220
+ return True
221
+ if self._remote_devices_ref is None:
222
+ return False
223
+ device = self._remote_devices_ref.get_device(self._device_id)
224
+ if device is not None:
225
+ self._device_manager = device
226
+ self._remote_devices_ref = None
227
+ self._register_state_callback()
228
+ _LOGGER.info(
229
+ "Lazily resolved device manager for remote cover '%s' (device '%s')",
230
+ self._id,
231
+ self._device_id,
232
+ )
233
+ return True
234
+ return False
235
+
236
+ def _register_state_callback(self) -> None:
237
+ """Register a cover state change callback on the device manager.
238
+
239
+ Called after device manager is resolved (lazy or immediate).
240
+ ESPHome devices will call back on cover state changes.
241
+ Also syncs current state from the device if available.
242
+ """
243
+ if self._device_manager is None:
244
+ return
245
+ register_fn = getattr(self._device_manager, "register_cover_callback", None)
246
+ if register_fn is not None:
247
+ register_fn(self._cover_id, self.on_remote_state_change)
248
+ _LOGGER.debug(
249
+ "Registered cover callback for remote cover '%s' on device '%s'",
250
+ self._id,
251
+ self._device_id,
252
+ )
253
+
254
+ # Sync initial state from device's current known states
255
+ self._sync_initial_state()
256
+
257
+ def _sync_initial_state(self) -> None:
258
+ """Sync initial state from ESPHome device's cached cover states."""
259
+ if self._device_manager is None:
260
+ return
261
+
262
+ cover_states: dict[str, dict[str, Any]] = getattr(
263
+ self._device_manager, "_cover_states", {}
264
+ )
265
+ if self._cover_id in cover_states:
266
+ self.on_remote_state_change(cover_states[self._cover_id])
267
+ _LOGGER.debug(
268
+ "Synced initial cover state for '%s': position=%d%%",
269
+ self._id,
270
+ self._position,
271
+ )
272
+
273
+ def __repr__(self) -> str:
274
+ return (
275
+ f"RemoteCoverOutput(id={self._id!r}, device={self._device_id!r}, "
276
+ f"cover={self._cover_id!r}, position={self._position})"
277
+ )
@@ -54,6 +54,7 @@ from boneio.core.messaging import MessageBus
54
54
  from boneio.core.state import StateManager
55
55
  from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
56
56
  from boneio.components.output.remote import RemoteOutputBase
57
+ from boneio.components.cover.remote import RemoteCoverOutput
57
58
  from boneio.core.remote.wled import WLEDRemoteDevice
58
59
  from boneio.hardware.i2c.bus import SMBus2I2C
59
60
  from boneio.migrations import MigrationRunner
@@ -1401,100 +1402,166 @@ class Manager:
1401
1402
  dur_unit = str(out_cfg.get("duration_unit", "s"))
1402
1403
 
1403
1404
  # Check for duplicates
1404
- if self.outputs.get_output(entity_id) is not None:
1405
+ if output_type == "cover":
1406
+ if self.covers.get_cover(entity_id) is not None:
1407
+ _LOGGER.warning(
1408
+ "Remote cover '%s' conflicts with existing cover, skipping",
1409
+ entity_id,
1410
+ )
1411
+ continue
1412
+ elif self.outputs.get_output(entity_id) is not None:
1405
1413
  _LOGGER.warning(
1406
1414
  "Remote output '%s' conflicts with existing output, skipping",
1407
1415
  entity_id,
1408
1416
  )
1409
1417
  continue
1410
1418
 
1411
- # Determine brightness support from device entity data
1412
- sup_brightness = False
1413
- if output_type == "light":
1419
+ if output_type == "cover":
1420
+ # ── Cover path ──────────────────────────────────────────
1421
+ # Determine cover kind from device entity data
1422
+ cover_kind = "cover"
1414
1423
  device = self.remote_devices.get_device(device_id)
1415
1424
  if device is not None:
1416
- # WLED: all outputs support brightness
1417
- if isinstance(device, WLEDRemoteDevice):
1418
- sup_brightness = True
1419
- else:
1420
- # ESPHome: check _lights list for supports_brightness flag
1421
- lights_list: list[dict] = getattr(device, "_lights", [])
1422
- for light in lights_list:
1423
- if light.get("id") == output_id:
1424
- sup_brightness = bool(light.get("supports_brightness", False))
1425
- break
1426
-
1427
- remote_output = RemoteOutputBase(
1428
- id=entity_id,
1429
- name=name,
1430
- device_id=device_id,
1431
- output_id=output_id,
1432
- remote_source=remote_source,
1433
- event_bus=self._event_bus,
1434
- message_bus=self._message_bus,
1435
- topic_prefix=self._topic_prefix,
1436
- output_type=output_type,
1437
- show_in_ha=show_in_ha,
1438
- area=area,
1439
- on_disconnect=on_disconnect,
1440
- interlock_manager=self.outputs._interlock_manager,
1441
- interlock_groups=interlock_groups,
1442
- enforce_interlock=enforce_interlock,
1443
- momentary_turn_on=momentary_turn_on,
1444
- momentary_turn_off=momentary_turn_off,
1445
- adjustable_duration=adjustable_duration_enabled,
1446
- duration_default=dur_default,
1447
- duration_min=dur_min,
1448
- duration_max=dur_max,
1449
- duration_unit=dur_unit,
1450
- supports_brightness=sup_brightness,
1451
- )
1425
+ covers_list: list[dict] = getattr(device, "_covers_list", [])
1426
+ for cv in covers_list:
1427
+ if cv.get("id") == output_id:
1428
+ cover_kind = cv.get("kind", "cover") or "cover"
1429
+ break
1430
+
1431
+ remote_cover = RemoteCoverOutput(
1432
+ id=entity_id,
1433
+ name=name,
1434
+ device_id=device_id,
1435
+ cover_id=output_id,
1436
+ remote_source=remote_source,
1437
+ event_bus=self._event_bus,
1438
+ message_bus=self._message_bus,
1439
+ topic_prefix=self._topic_prefix,
1440
+ kind=cover_kind,
1441
+ show_in_ha=show_in_ha,
1442
+ area=area,
1443
+ )
1452
1444
 
1453
- # Register in shared interlock manager
1454
- if interlock_groups:
1455
- self.outputs._interlock_manager.register(remote_output, interlock_groups)
1456
-
1457
- # Set the device manager reference if the device is already loaded.
1458
- # ESPHome devices may not be in _devices yet (loaded in background),
1459
- # so _device_manager may remain None — resolved lazily in
1460
- # RemoteOutputBase.control_output() or when the device connects.
1461
- device = self.remote_devices.get_device(device_id)
1462
- if device is not None:
1463
- remote_output._device_manager = device
1464
- remote_output._register_state_callback()
1465
- else:
1466
- # Store reference to remote_devices so the output can
1467
- # resolve its device manager lazily when needed.
1468
- remote_output._remote_devices_ref = self.remote_devices
1469
- _LOGGER.debug(
1470
- "Remote output '%s': device '%s' not yet available, will resolve lazily",
1445
+ # Set the device manager reference if the device is already loaded.
1446
+ device = self.remote_devices.get_device(device_id)
1447
+ if device is not None:
1448
+ remote_cover._device_manager = device
1449
+ remote_cover._register_state_callback()
1450
+ else:
1451
+ remote_cover._remote_devices_ref = self.remote_devices
1452
+ _LOGGER.debug(
1453
+ "Remote cover '%s': device '%s' not yet available, will resolve lazily",
1454
+ entity_id,
1455
+ device_id,
1456
+ )
1457
+
1458
+ # Register in CoverManager so conditions and UI work
1459
+ self.covers._covers[entity_id] = remote_cover # type: ignore[assignment]
1460
+ _LOGGER.info(
1461
+ "Registered remote cover: id='%s' device='%s' cover='%s' kind='%s'",
1471
1462
  entity_id,
1472
1463
  device_id,
1464
+ output_id,
1465
+ cover_kind,
1473
1466
  )
1474
1467
 
1475
- # Register in OutputManager so it's available everywhere
1476
- self.outputs._outputs[entity_id] = remote_output # type: ignore[assignment]
1477
- _LOGGER.info(
1478
- "Registered remote output: id='%s' device='%s' output='%s' type='%s' interlock=%s",
1479
- entity_id,
1480
- device_id,
1481
- output_id,
1482
- output_type,
1483
- interlock_groups or "none",
1484
- )
1468
+ else:
1469
+ # ── Output path (switch / light / valve) ────────────────
1470
+ # Determine brightness support from device entity data
1471
+ sup_brightness = False
1472
+ if output_type == "light":
1473
+ device = self.remote_devices.get_device(device_id)
1474
+ if device is not None:
1475
+ # WLED: all outputs support brightness
1476
+ if isinstance(device, WLEDRemoteDevice):
1477
+ sup_brightness = True
1478
+ else:
1479
+ # ESPHome: check _lights list for supports_brightness flag
1480
+ lights_list: list[dict] = getattr(device, "_lights", [])
1481
+ for light in lights_list:
1482
+ if light.get("id") == output_id:
1483
+ sup_brightness = bool(light.get("supports_brightness", False))
1484
+ break
1485
+
1486
+ remote_output = RemoteOutputBase(
1487
+ id=entity_id,
1488
+ name=name,
1489
+ device_id=device_id,
1490
+ output_id=output_id,
1491
+ remote_source=remote_source,
1492
+ event_bus=self._event_bus,
1493
+ message_bus=self._message_bus,
1494
+ topic_prefix=self._topic_prefix,
1495
+ output_type=output_type,
1496
+ show_in_ha=show_in_ha,
1497
+ area=area,
1498
+ on_disconnect=on_disconnect,
1499
+ interlock_manager=self.outputs._interlock_manager,
1500
+ interlock_groups=interlock_groups,
1501
+ enforce_interlock=enforce_interlock,
1502
+ momentary_turn_on=momentary_turn_on,
1503
+ momentary_turn_off=momentary_turn_off,
1504
+ adjustable_duration=adjustable_duration_enabled,
1505
+ duration_default=dur_default,
1506
+ duration_min=dur_min,
1507
+ duration_max=dur_max,
1508
+ duration_unit=dur_unit,
1509
+ supports_brightness=sup_brightness,
1510
+ )
1511
+
1512
+ # Register in shared interlock manager
1513
+ if interlock_groups:
1514
+ self.outputs._interlock_manager.register(remote_output, interlock_groups)
1515
+
1516
+ # Set the device manager reference if the device is already loaded.
1517
+ # ESPHome devices may not be in _devices yet (loaded in background),
1518
+ # so _device_manager may remain None — resolved lazily in
1519
+ # RemoteOutputBase.control_output() or when the device connects.
1520
+ device = self.remote_devices.get_device(device_id)
1521
+ if device is not None:
1522
+ remote_output._device_manager = device
1523
+ remote_output._register_state_callback()
1524
+ else:
1525
+ # Store reference to remote_devices so the output can
1526
+ # resolve its device manager lazily when needed.
1527
+ remote_output._remote_devices_ref = self.remote_devices
1528
+ _LOGGER.debug(
1529
+ "Remote output '%s': device '%s' not yet available, will resolve lazily",
1530
+ entity_id,
1531
+ device_id,
1532
+ )
1533
+
1534
+ # Register in OutputManager so it's available everywhere
1535
+ self.outputs._outputs[entity_id] = remote_output # type: ignore[assignment]
1536
+ _LOGGER.info(
1537
+ "Registered remote output: id='%s' device='%s' output='%s' type='%s' interlock=%s",
1538
+ entity_id,
1539
+ device_id,
1540
+ output_id,
1541
+ output_type,
1542
+ interlock_groups or "none",
1543
+ )
1485
1544
 
1545
+ remote_output_count = sum(1 for o in self.outputs._outputs.values() if getattr(o, "is_remote", False))
1546
+ remote_cover_count = sum(1 for c in self.covers._covers.values() if getattr(c, "is_remote", False))
1486
1547
  _LOGGER.info(
1487
- "Remote outputs registered: %d total",
1488
- sum(1 for o in self.outputs._outputs.values() if getattr(o, "is_remote", False)),
1548
+ "Remote entities registered: %d outputs, %d covers",
1549
+ remote_output_count,
1550
+ remote_cover_count,
1489
1551
  )
1490
1552
 
1491
1553
  def unregister_remote_outputs(self) -> None:
1492
- """Remove all remote outputs from OutputManager."""
1554
+ """Remove all remote outputs and covers from their managers."""
1493
1555
  remote_ids = [oid for oid, o in self.outputs._outputs.items() if getattr(o, "is_remote", False)]
1494
1556
  for oid in remote_ids:
1495
1557
  del self.outputs._outputs[oid]
1496
1558
  _LOGGER.debug("Unregistered remote output: %s", oid)
1497
1559
 
1560
+ remote_cover_ids = [cid for cid, c in self.covers._covers.items() if getattr(c, "is_remote", False)]
1561
+ for cid in remote_cover_ids:
1562
+ del self.covers._covers[cid]
1563
+ _LOGGER.debug("Unregistered remote cover: %s", cid)
1564
+
1498
1565
  async def _reload_remote_outputs(self) -> None:
1499
1566
  """Reload only the remote_outputs section.
1500
1567
 
@@ -182,6 +182,10 @@ class ESPHomeRemoteDevice(RemoteDevice):
182
182
  # Keyed by entity_id → callable(new_state: bool, brightness: int | None)
183
183
  self._output_callbacks: dict[str, Any] = {}
184
184
 
185
+ # Callbacks for cover state changes.
186
+ # Keyed by cover_id → callable(state_dict: dict)
187
+ self._cover_callbacks: dict[str, Any] = {}
188
+
185
189
  # Load configured entities
186
190
  if switches:
187
191
  self._switches = switches
@@ -288,6 +292,29 @@ class ESPHomeRemoteDevice(RemoteDevice):
288
292
  """
289
293
  self._output_callbacks.pop(entity_id, None)
290
294
 
295
+ def register_cover_callback(self, cover_id: str, callback: Any) -> None:
296
+ """Register a callback for cover state changes.
297
+
298
+ Args:
299
+ cover_id: Cover object_id on this device.
300
+ callback: Callable(state_dict: dict) invoked on cover state change.
301
+ state_dict contains position, tilt, current_operation.
302
+ """
303
+ self._cover_callbacks[cover_id] = callback
304
+ _LOGGER.debug(
305
+ "Registered cover callback for '%s' on device '%s'",
306
+ cover_id,
307
+ self._name,
308
+ )
309
+
310
+ def unregister_cover_callback(self, cover_id: str) -> None:
311
+ """Remove a cover state callback.
312
+
313
+ Args:
314
+ cover_id: Cover object_id.
315
+ """
316
+ self._cover_callbacks.pop(cover_id, None)
317
+
291
318
  def has_light(self, entity_id: str) -> bool:
292
319
  """Check if entity_id is a light on this device.
293
320
 
@@ -531,6 +558,17 @@ class ESPHomeRemoteDevice(RemoteDevice):
531
558
  current_op,
532
559
  last_op,
533
560
  )
561
+ # Notify registered cover callback
562
+ cb = self._cover_callbacks.get(cover_id)
563
+ if cb is not None:
564
+ try:
565
+ cb(self._cover_states[cover_id])
566
+ except Exception as cb_err:
567
+ _LOGGER.error(
568
+ "Error in cover callback for '%s': %s",
569
+ cover_id,
570
+ cb_err,
571
+ )
534
572
  break
535
573
 
536
574
  elif isinstance(state, BinarySensorState):
@@ -175,6 +175,9 @@ def ha_availabilty_message(
175
175
  unique_id = f"{unique_id_prefix}_{device_type}{id}"
176
176
  default_entity_id = f"{entity_type}.{config_helper.serial_number}_{id}"
177
177
 
178
+ # Filter out None values — HA rejects fields like device_class: None
179
+ filtered_kwargs = {k: v for k, v in kwargs.items() if v is not None}
180
+
178
181
  return {
179
182
  "availability": [{"topic": f"{topic}/{STATE}"}],
180
183
  "optimistic": False,
@@ -184,7 +187,7 @@ def ha_availabilty_message(
184
187
  "unique_id": unique_id,
185
188
  "default_entity_id": default_entity_id,
186
189
  # "object_id": f"{topic}{device_type}{id}",
187
- **kwargs,
190
+ **filtered_kwargs,
188
191
  }
189
192
 
190
193
 
@@ -59,7 +59,7 @@ schema:
59
59
  type: string
60
60
  required: False
61
61
  default: "switch"
62
- allowed: ['switch', 'light', 'valve']
62
+ allowed: ['switch', 'light', 'valve', 'cover']
63
63
  meta:
64
64
  label: Output Type
65
65
  description: |
@@ -67,6 +67,7 @@ schema:
67
67
  - switch: Generic switch
68
68
  - light: Light entity
69
69
  - valve: Valve entity (for irrigation)
70
+ - cover: Cover entity (gate, blind, shutter)
70
71
  show_in_ha:
71
72
  type: boolean
72
73
  required: False
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.6.0.dev1"