boneio 0.9.4.dev3__tar.gz → 0.9.5.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 (242) hide show
  1. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/PKG-INFO +1 -1
  2. boneio-0.9.4.dev3/boneio/boards/0.8/cover.yaml → boneio-0.9.5.dev1/boneio/boards/0.8/output_cover.yaml +32 -0
  3. boneio-0.9.5.dev1/boneio/example_config/all_binary_sensor.yaml +106 -0
  4. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/config.yaml +1 -1
  5. boneio-0.9.5.dev1/boneio/example_config/config_24_16.yaml +28 -0
  6. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/message_bus.py +9 -0
  7. boneio-0.9.5.dev1/boneio/helper/queue.py +58 -0
  8. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/yaml_util.py +11 -2
  9. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/mqtt_client.py +22 -15
  10. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/runner.py +1 -0
  11. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/schema.yaml +1 -1
  12. boneio-0.9.5.dev1/boneio/version.py +2 -0
  13. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/config.schema.json +1 -4
  14. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/pyproject.toml +1 -1
  15. boneio-0.9.4.dev3/boneio/helper/queue.py +0 -32
  16. boneio-0.9.4.dev3/boneio/version.py +0 -2
  17. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/LICENSE +0 -0
  18. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/README.md +0 -0
  19. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/__init__.py +0 -0
  20. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/boards/0.7/input.yaml +0 -0
  21. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  22. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/boards/0.8/input.yaml +0 -0
  23. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  24. /boneio-0.9.4.dev3/boneio/boards/0.8/cover_mix.yaml → /boneio-0.9.5.dev1/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  25. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/bonecli.py +0 -0
  26. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/const.py +0 -0
  27. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/cover.py +0 -0
  28. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/__init__.py +0 -0
  29. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/adc.yaml +0 -0
  30. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/binary_sensor.yaml +0 -0
  31. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/binary_sensor_v_0_7.yaml +0 -0
  32. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/cover.yaml +0 -0
  33. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/event.yaml +0 -0
  34. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/event_all.yaml +0 -0
  35. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/event_v_0_7.yaml +0 -0
  36. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/led32x4A.yaml +0 -0
  37. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/output24x16A.yaml +0 -0
  38. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/output24x16A_v0.3.yaml +0 -0
  39. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/output32x10A.yaml +0 -0
  40. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/output32x10A_new.yaml +0 -0
  41. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/example_config/output32x5A.yaml +0 -0
  42. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/fonts/danube__.ttf +0 -0
  43. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/group/__init__.py +0 -0
  44. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/group/output.py +0 -0
  45. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/__init__.py +0 -0
  46. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/async_updater.py +0 -0
  47. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/click_timer.py +0 -0
  48. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/config.py +0 -0
  49. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/events.py +0 -0
  50. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/exceptions.py +0 -0
  51. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/filter.py +0 -0
  52. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/gpio.py +0 -0
  53. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/gpiod.py +0 -0
  54. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/ha_discovery.py +0 -0
  55. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/loader.py +0 -0
  56. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/logger.py +0 -0
  57. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/mqtt.py +0 -0
  58. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/oled.py +0 -0
  59. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/onewire/W1ThermSensor.py +0 -0
  60. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/onewire/__init__.py +0 -0
  61. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/onewire/ds2482.py +0 -0
  62. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/onewire/onewire.py +0 -0
  63. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/pcf8575.py +0 -0
  64. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/schema_converter.py +0 -0
  65. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/sensor/ina_219_smbus.py +0 -0
  66. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/state_manager.py +0 -0
  67. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/stats.py +0 -0
  68. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/timeperiod.py +0 -0
  69. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/helper/util.py +0 -0
  70. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/input/__init__.py +0 -0
  71. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/input/gpio.py +0 -0
  72. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/input/gpio_new.py +0 -0
  73. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/manager.py +0 -0
  74. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/__init__.py +0 -0
  75. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/client.py +0 -0
  76. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/cwt.json +0 -0
  77. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/dts1964_3f.json +0 -0
  78. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/liquid-sensor.json +0 -0
  79. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/modbuscli.py +0 -0
  80. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/orno-or-we-517.json +0 -0
  81. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/pt100.json +0 -0
  82. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/r4dcb08.json +0 -0
  83. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sdm120.json +0 -0
  84. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sdm630.json +0 -0
  85. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sensor.py +0 -0
  86. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sht20.json +0 -0
  87. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sht30.json +0 -0
  88. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/single_sensor.py +0 -0
  89. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/socomec_e03.json +0 -0
  90. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/socomec_e23.json +0 -0
  91. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/sofar.json +0 -0
  92. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/modbus/utils.py +0 -0
  93. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/models/__init__.py +0 -0
  94. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/models/files.py +0 -0
  95. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/models/logs.py +0 -0
  96. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/oled.py +0 -0
  97. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/__init__.py +0 -0
  98. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/basic.py +0 -0
  99. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/gpio.py +0 -0
  100. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/mcp.py +0 -0
  101. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/pca.py +0 -0
  102. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/relay/pcf.py +0 -0
  103. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/actions.yaml +0 -0
  104. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/actions_sensor.yaml +0 -0
  105. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/actions_switch.yaml +0 -0
  106. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/filters.yaml +0 -0
  107. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/filters_adc.yaml +0 -0
  108. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/id.yaml +0 -0
  109. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/temp_unit.yaml +0 -0
  110. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/schema/update_interval.yaml +0 -0
  111. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/__init__.py +0 -0
  112. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/adc.py +0 -0
  113. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/gpio.py +0 -0
  114. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/gpio_new.py +0 -0
  115. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/ina219.py +0 -0
  116. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/serial_number.py +0 -0
  117. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/temp/__init__.py +0 -0
  118. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/temp/dallas.py +0 -0
  119. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/temp/lm75.py +0 -0
  120. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/sensor/temp/mcp9808.py +0 -0
  121. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/app.py +0 -0
  122. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/abap-BrgZPUOV.js +0 -0
  123. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/apex-DyP6w7ZV.js +0 -0
  124. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/azcli-BaLxmfj-.js +0 -0
  125. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/bat-CFOPXBzS.js +0 -0
  126. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/bicep-BfEKNvv3.js +0 -0
  127. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/cameligo-BFG1Mk7z.js +0 -0
  128. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/clojure-DTECt2xU.js +0 -0
  129. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  130. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/coffee-CDGzqUPQ.js +0 -0
  131. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/cpp-CLLBncYj.js +0 -0
  132. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/csharp-dUCx_-0o.js +0 -0
  133. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/csp-5Rap-vPy.js +0 -0
  134. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/css-D3h14YRZ.js +0 -0
  135. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/cssMode-CtnT2jQE.js +0 -0
  136. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/cypher-DrQuvNYM.js +0 -0
  137. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/dart-CFKIUWau.js +0 -0
  138. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/dockerfile-Zznr-cwX.js +0 -0
  139. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/ecl-Ce3n6wWz.js +0 -0
  140. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/editor.worker-D5ngByhL.js +0 -0
  141. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/elixir-deUWdS0T.js +0 -0
  142. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/flow9-i9-g7ZhI.js +0 -0
  143. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/freemarker2-DGuhXH41.js +0 -0
  144. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/fsharp-CzKuDChf.js +0 -0
  145. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/go-Cphgjts3.js +0 -0
  146. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/graphql-Cg7bfA9N.js +0 -0
  147. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/handlebars-DB9ioYEj.js +0 -0
  148. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/hcl-0cvrggvQ.js +0 -0
  149. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/html-B1N3G2t2.js +0 -0
  150. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/htmlMode-Bu4tsIzC.js +0 -0
  151. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/index-BLdVcyHp.js +0 -0
  152. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/index-CCgG6NMg.css +0 -0
  153. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/ini-Drc7WvVn.js +0 -0
  154. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/java-B_fMsGYe.js +0 -0
  155. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/javascript-Bc9neA1Z.js +0 -0
  156. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/json.worker-F0ZGA5Zk.js +0 -0
  157. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/jsonMode-CKQTb-28.js +0 -0
  158. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/julia-Bqgm2twL.js +0 -0
  159. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/kotlin-BSkB5QuD.js +0 -0
  160. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/less-BsTHnhdd.js +0 -0
  161. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/lexon-YWi4-JPR.js +0 -0
  162. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/liquid-CTaX0gqb.js +0 -0
  163. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/lua-nf6ki56Z.js +0 -0
  164. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/m3-Cpb6xl2v.js +0 -0
  165. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/markdown-DSZPf7rp.js +0 -0
  166. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/mdx-5o2ITl9M.js +0 -0
  167. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/mips-B_c3zf-v.js +0 -0
  168. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/msdax-rUNN04Wq.js +0 -0
  169. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/mysql-DDwshQtU.js +0 -0
  170. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/objective-c-B5zXfXm9.js +0 -0
  171. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/pascal-CXOwvkN_.js +0 -0
  172. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/pascaligo-Bc-ZgV77.js +0 -0
  173. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/perl-CwNk8-XU.js +0 -0
  174. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/pgsql-tGk8EFnU.js +0 -0
  175. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/php-CpIb_Oan.js +0 -0
  176. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/pla-B03wrqEc.js +0 -0
  177. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/postiats-BKlk5iyT.js +0 -0
  178. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/powerquery-Bhzvs7bI.js +0 -0
  179. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/powershell-Dd3NCNK9.js +0 -0
  180. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/protobuf-COyEY5Pt.js +0 -0
  181. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/pug-BaJupSGV.js +0 -0
  182. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/python-Db8FWkCf.js +0 -0
  183. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/qsharp-DXyYeYxl.js +0 -0
  184. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/r-CdQndTaG.js +0 -0
  185. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/razor-CLTS28q7.js +0 -0
  186. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/redis-CVwtpugi.js +0 -0
  187. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/redshift-25W9uPmb.js +0 -0
  188. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/restructuredtext-DfzH4Xui.js +0 -0
  189. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/ruby-Cp1zYvxS.js +0 -0
  190. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/rust-D5C2fndG.js +0 -0
  191. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/sb-CDntyWJ8.js +0 -0
  192. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/scala-BoFRg7Ot.js +0 -0
  193. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/scheme-Bio4gycK.js +0 -0
  194. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/scss-4Ik7cdeQ.js +0 -0
  195. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/shell-CX-rkNHf.js +0 -0
  196. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/solidity-Tw7wswEv.js +0 -0
  197. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/sophia-C5WLch3f.js +0 -0
  198. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/sparql-DHaeiCBh.js +0 -0
  199. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/sql-CCSDG5nI.js +0 -0
  200. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/st-pnP8ivHi.js +0 -0
  201. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/swift-DwJ7jVG9.js +0 -0
  202. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/systemverilog-B9Xyijhd.js +0 -0
  203. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/tcl-DnHyzjbg.js +0 -0
  204. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/tsMode-CrhZjPZD.js +0 -0
  205. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/twig-CPajHgWi.js +0 -0
  206. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/typescript-BEFA7MWI.js +0 -0
  207. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/typespec-D-MeaMDU.js +0 -0
  208. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/vb-DgyLZaXg.js +0 -0
  209. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/wgsl-BIv9DU6q.js +0 -0
  210. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/xml-z_iSgMVJ.js +0 -0
  211. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/yaml-3ScDl3Sa.js +0 -0
  212. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-C2uymlqn.js +0 -0
  213. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  214. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  215. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/frontend-dist/index.html +0 -0
  216. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/adc.schema.json +0 -0
  217. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  218. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
  219. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/cover.schema.json +0 -0
  220. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
  221. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
  222. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/event.schema.json +0 -0
  223. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
  224. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
  225. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/logger.schema.json +0 -0
  226. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  227. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  228. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
  229. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/modbus_sensors.schema.json +0 -0
  230. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
  231. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/oled.schema.json +0 -0
  232. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/output.schema.json +0 -0
  233. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
  234. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
  235. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  236. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
  237. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/schema/web.schema.json +0 -0
  238. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/web_server.py +0 -0
  239. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/boneio/webui/websocket_manager.py +0 -0
  240. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/tests/32_5_config.yaml +0 -0
  241. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/tests/bandit.yaml +0 -0
  242. {boneio-0.9.4.dev3 → boneio-0.9.5.dev1}/tests/relay_32_5.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: boneio
3
- Version: 0.9.4.dev3
3
+ Version: 0.9.5.dev1
4
4
  Summary: Python App for BoneIO
5
5
  License: GNU General Public License v3.0
6
6
  Author-email: Paweł Szafer <pszafer@gmail.com>
@@ -9,129 +9,161 @@ output_mapping:
9
9
  kind: mcp
10
10
  mcp_id: mcp2
11
11
  pin: 7
12
+ output_type: none
12
13
  cover_01_down:
13
14
  kind: mcp
14
15
  mcp_id: mcp2
15
16
  pin: 6
17
+ output_type: none
16
18
  cover_02_up:
17
19
  kind: mcp
18
20
  mcp_id: mcp2
19
21
  pin: 5
22
+ output_type: none
20
23
  cover_02_down:
21
24
  kind: mcp
22
25
  mcp_id: mcp2
23
26
  pin: 4
27
+ output_type: none
24
28
  cover_03_up:
25
29
  kind: mcp
26
30
  mcp_id: mcp2
27
31
  pin: 3
32
+ output_type: none
28
33
  cover_03_down:
29
34
  kind: mcp
30
35
  mcp_id: mcp2
31
36
  pin: 2
37
+ output_type: none
32
38
  cover_04_up:
33
39
  kind: mcp
34
40
  mcp_id: mcp2
35
41
  pin: 1
42
+ output_type: none
36
43
  cover_04_down:
37
44
  kind: mcp
38
45
  mcp_id: mcp2
39
46
  pin: 0
47
+ output_type: none
40
48
  cover_05_up:
41
49
  kind: mcp
42
50
  mcp_id: mcp1
43
51
  pin: 7
52
+ output_type: none
44
53
  cover_05_down:
45
54
  kind: mcp
46
55
  mcp_id: mcp1
47
56
  pin: 6
57
+ output_type: none
48
58
  cover_06_up:
49
59
  kind: mcp
50
60
  mcp_id: mcp1
51
61
  pin: 5
62
+ output_type: none
52
63
  cover_06_down:
53
64
  kind: mcp
54
65
  mcp_id: mcp1
55
66
  pin: 4
67
+ output_type: none
56
68
  cover_07_up:
57
69
  kind: mcp
58
70
  mcp_id: mcp1
59
71
  pin: 3
72
+ output_type: none
60
73
  cover_07_down:
61
74
  kind: mcp
62
75
  mcp_id: mcp1
63
76
  pin: 2
77
+ output_type: none
64
78
  cover_08_up:
65
79
  kind: mcp
66
80
  mcp_id: mcp1
67
81
  pin: 1
82
+ output_type: none
68
83
  cover_08_down:
69
84
  kind: mcp
70
85
  mcp_id: mcp1
71
86
  pin: 0
87
+ output_type: none
72
88
  cover_09_up:
73
89
  kind: mcp
74
90
  mcp_id: mcp2
75
91
  pin: 8
92
+ output_type: none
76
93
  cover_09_down:
77
94
  kind: mcp
78
95
  mcp_id: mcp2
79
96
  pin: 9
97
+ output_type: none
80
98
  cover_10_up:
81
99
  kind: mcp
82
100
  mcp_id: mcp2
83
101
  pin: 10
102
+ output_type: none
84
103
  cover_10_down:
85
104
  kind: mcp
86
105
  mcp_id: mcp2
87
106
  pin: 11
107
+ output_type: none
88
108
  cover_11_up:
89
109
  kind: mcp
90
110
  mcp_id: mcp2
91
111
  pin: 12
112
+ output_type: none
92
113
  cover_11_down:
93
114
  kind: mcp
94
115
  mcp_id: mcp2
95
116
  pin: 13
117
+ output_type: none
96
118
  cover_12_up:
97
119
  kind: mcp
98
120
  mcp_id: mcp2
99
121
  pin: 14
122
+ output_type: none
100
123
  cover_12_down:
101
124
  kind: mcp
102
125
  mcp_id: mcp2
103
126
  pin: 15
127
+ output_type: none
104
128
  cover_13_up:
105
129
  kind: mcp
106
130
  mcp_id: mcp1
107
131
  pin: 8
132
+ output_type: none
108
133
  cover_13_down:
109
134
  kind: mcp
110
135
  mcp_id: mcp1
111
136
  pin: 9
137
+ output_type: none
112
138
  cover_14_up:
113
139
  kind: mcp
114
140
  mcp_id: mcp1
115
141
  pin: 10
142
+ output_type: none
116
143
  cover_14_down:
117
144
  kind: mcp
118
145
  mcp_id: mcp1
119
146
  pin: 11
147
+ output_type: none
120
148
  cover_15_up:
121
149
  kind: mcp
122
150
  mcp_id: mcp1
123
151
  pin: 12
152
+ output_type: none
124
153
  cover_15_down:
125
154
  kind: mcp
126
155
  mcp_id: mcp1
127
156
  pin: 13
157
+ output_type: none
128
158
  cover_16_up:
129
159
  kind: mcp
130
160
  mcp_id: mcp1
131
161
  pin: 14
162
+ output_type: none
132
163
  cover_16_down:
133
164
  kind: mcp
134
165
  mcp_id: mcp1
135
166
  pin: 15
167
+ output_type: none
136
168
 
137
169
 
@@ -0,0 +1,106 @@
1
+ - id: IN_01
2
+ boneio_input: IN_01
3
+ actions:
4
+ pressed:
5
+ - action: output
6
+ pin: OUT_01
7
+ - id: IN_02
8
+ boneio_input: IN_02
9
+ actions:
10
+ pressed:
11
+ - action: output
12
+ pin: OUT_02
13
+ # - id: IN_03
14
+ # boneio_input: IN_03
15
+ # - id: IN_04
16
+ # boneio_input: IN_04
17
+ # - id: IN_05
18
+ # boneio_input: IN_05
19
+ # - id: IN_06
20
+ # boneio_input: IN_06
21
+ # - id: IN_07
22
+ # boneio_input: IN_07
23
+ # - id: IN_08
24
+ # boneio_input: IN_08
25
+ # - id: IN_09
26
+ # boneio_input: IN_09
27
+ # - id: IN_10
28
+ # boneio_input: IN_10
29
+ # - id: IN_11
30
+ # boneio_input: IN_11
31
+ # - id: IN_12
32
+ # boneio_input: IN_12
33
+ # - id: IN_13
34
+ # boneio_input: IN_13
35
+ # - id: IN_14
36
+ # boneio_input: IN_14
37
+ # - id: IN_15
38
+ # boneio_input: IN_15
39
+ # - id: IN_16
40
+ # boneio_input: IN_16
41
+ # - id: IN_17
42
+ # boneio_input: IN_17
43
+ # - id: IN_18
44
+ # boneio_input: IN_18
45
+ # - id: IN_19
46
+ # boneio_input: IN_19
47
+ # - id: IN_20
48
+ # boneio_input: IN_20
49
+ # - id: IN_21
50
+ # boneio_input: IN_21
51
+ # - id: IN_22
52
+ # boneio_input: IN_22
53
+ # - id: IN_23
54
+ # boneio_input: IN_23
55
+ # - id: IN_24
56
+ # boneio_input: IN_24
57
+ # - id: IN_25
58
+ # boneio_input: IN_25
59
+ # - id: IN_26
60
+ # boneio_input: IN_26
61
+ # - id: IN_27
62
+ # boneio_input: IN_27
63
+ # - id: IN_28
64
+ # boneio_input: IN_28
65
+ # - id: IN_29
66
+ # boneio_input: IN_29
67
+ # - id: IN_30
68
+ # boneio_input: IN_30
69
+ # - id: IN_31
70
+ # boneio_input: IN_31
71
+ # - id: IN_32
72
+ # boneio_input: IN_32
73
+ # - id: IN_33
74
+ # boneio_input: IN_33
75
+ # - id: IN_34
76
+ # boneio_input: IN_34
77
+ # - id: IN_35
78
+ # boneio_input: IN_35
79
+ # - id: IN_36
80
+ # boneio_input: IN_36
81
+ # - id: IN_37
82
+ # boneio_input: IN_37
83
+ # - id: IN_38
84
+ # boneio_input: IN_38
85
+ # - id: IN_39
86
+ # boneio_input: IN_39
87
+ # - id: IN_40
88
+ # boneio_input: IN_40
89
+ # - id: IN_41
90
+ # boneio_input: IN_41
91
+ # - id: IN_42
92
+ # boneio_input: IN_42
93
+ # - id: IN_43
94
+ # boneio_input: IN_43
95
+ # - id: IN_44
96
+ # boneio_input: IN_44
97
+ # - id: IN_45
98
+ # boneio_input: IN_45
99
+ # - id: IN_46
100
+ # boneio_input: IN_46
101
+ # - id: IN_47
102
+ # boneio_input: IN_47
103
+ # - id: IN_48
104
+ # boneio_input: IN_48
105
+ # - id: IN_49
106
+ # boneio_input: IN_49
@@ -15,7 +15,7 @@ lm75:
15
15
  event: !include event.yaml
16
16
  binary_sensor: !include binary_sensor.yaml
17
17
 
18
- output: !include output32x5A.yaml
18
+ output: !include output32x10A_new.yaml
19
19
 
20
20
  boneio:
21
21
  name: "boneIO Black 32x10A"
@@ -0,0 +1,28 @@
1
+ mqtt:
2
+ host: hostname
3
+ username: mqtt
4
+ password: password
5
+ topic_prefix: boneiohome
6
+ ha_discovery:
7
+ enabled: yes
8
+
9
+ oled:
10
+ enabled: yes
11
+
12
+ lm75:
13
+ - id: temp
14
+ address: 0x48
15
+
16
+ mcp23017:
17
+ - id: mcp1
18
+ address: 0x20
19
+ - id: mcp2
20
+ address: 0x21
21
+
22
+ event: !include event.yaml
23
+ binary_sensor: !include binary_sensor.yaml
24
+
25
+ output: !include output24x16A.yaml
26
+
27
+
28
+ # adc: !include adc.yaml Uncomment only if needed.
@@ -32,6 +32,11 @@ class MessageBus(ABC):
32
32
  """Set manager."""
33
33
  pass
34
34
 
35
+ @abstractmethod
36
+ async def announce_offline(self) -> None:
37
+ """Announce that the device is offline."""
38
+ pass
39
+
35
40
  class LocalMessageBus(MessageBus):
36
41
  """Local message bus that doesn't use MQTT."""
37
42
 
@@ -81,3 +86,7 @@ class LocalMessageBus(MessageBus):
81
86
  def set_manager(self, manager: Manager) -> None:
82
87
  """Set manager."""
83
88
  self._manager = manager
89
+
90
+ async def announce_offline(self) -> None:
91
+ """Announce that the device is offline."""
92
+ pass
@@ -0,0 +1,58 @@
1
+ """
2
+ Special unique implementation of asyncio.Queue for boneIO.
3
+ If MQTT is down then regular queue can append multiple ON/OFF for same topic.
4
+ After re-connection it would send all messages. It's not necessary, last payload of same topic is enough.
5
+ """
6
+ import asyncio
7
+ from typing import Any, Dict, Tuple
8
+
9
+
10
+ class UniqueQueue(asyncio.Queue):
11
+ """Unique implementation of asyncio.Queue that handles MQTT connection state."""
12
+
13
+ def __init__(self, maxsize: int = 0):
14
+ """Initialize the queue."""
15
+ super().__init__(maxsize=maxsize)
16
+ self._unique_items: Dict[str, Tuple[Any, ...]] = {}
17
+ self._is_connected = False
18
+
19
+ def set_connected(self, state: bool) -> None:
20
+ """Set the connection state."""
21
+ self._is_connected = state
22
+
23
+ def _init(self, maxsize: int) -> None:
24
+ """Initialize the internal queue storage."""
25
+ super()._init(maxsize=maxsize)
26
+ self._unique_items = {}
27
+
28
+ def _put(self, item: Tuple[str, Any, bool]) -> None:
29
+ """Put an item into the queue.
30
+
31
+ If MQTT is not connected:
32
+ - If topic exists, replace the old message
33
+ - If topic doesn't exist, add new message
34
+ If MQTT is connected:
35
+ - Add all messages to queue
36
+
37
+ Args:
38
+ item: Tuple of (topic, payload, retain)
39
+ """
40
+ topic = item[0]
41
+
42
+ if not self._is_connected:
43
+ # When disconnected, replace existing messages for same topic
44
+ if topic in self._unique_items:
45
+ self._queue.remove(self._unique_items[topic])
46
+ super()._put(item)
47
+ self._unique_items[topic] = item
48
+ else:
49
+ # When connected, queue all messages
50
+ super()._put(item)
51
+ self._unique_items[topic] = item
52
+
53
+ def _get(self) -> Tuple[str, Any, bool]:
54
+ """Get an item from the queue and remove it from unique items tracking."""
55
+ item = super()._get()
56
+ if item[0] in self._unique_items:
57
+ del self._unique_items[item[0]]
58
+ return item
@@ -275,7 +275,16 @@ def merge_board_config(config: dict) -> dict:
275
275
  # Merge mapped output with user config, preserving user-specified values
276
276
  input.update({k: v for k, v in mapped_input.items()})
277
277
 
278
-
278
+ elif "cover" in board_name:
279
+ _LOGGER.debug("Cover config detected without outputs config.")
280
+ output_mapping = board_config.get("output_mapping", {})
281
+ config["output"] = []
282
+ for key, value in output_mapping.items():
283
+ config["output"].append(
284
+ {
285
+ "id": key,
286
+ **value
287
+ })
279
288
  return config
280
289
 
281
290
 
@@ -336,7 +345,7 @@ class CustomValidator(Validator):
336
345
  """Validate that a field is required if a condition is met.
337
346
 
338
347
  The rule's arguments are validated against this schema:
339
- {'type': 'dict'}
348
+ {'type' : 'dict'}
340
349
  """
341
350
  if not required_if:
342
351
  return
@@ -19,10 +19,10 @@ from paho.mqtt.properties import Properties
19
19
  from paho.mqtt.subscribeoptions import SubscribeOptions
20
20
 
21
21
  from boneio.const import OFFLINE, PAHO, STATE
22
- from boneio.helper import UniqueQueue
23
22
  from boneio.helper.config import ConfigHelper
24
23
  from boneio.helper.events import GracefulExit
25
24
  from boneio.helper.message_bus import MessageBus
25
+ from boneio.helper.queue import UniqueQueue
26
26
  from boneio.manager import Manager
27
27
 
28
28
  _LOGGER = logging.getLogger(__name__)
@@ -166,6 +166,14 @@ class MQTTClient(MessageBus):
166
166
  await self.publish(*to_publish)
167
167
  self.publish_queue.task_done()
168
168
 
169
+ async def announce_offline(self) -> None:
170
+ """Announce that the device is offline."""
171
+ await self.publish(
172
+ topic=f"{self._config_helper.topic_prefix}/{STATE}",
173
+ payload=OFFLINE,
174
+ retain=True,
175
+ )
176
+
169
177
  async def start_client(self) -> None:
170
178
  """Keep the event loop alive and process any periodic tasks."""
171
179
  try:
@@ -174,7 +182,7 @@ class MQTTClient(MessageBus):
174
182
  await self._subscribe_manager(self._manager)
175
183
  except MqttError as err:
176
184
  self.reconnect_interval = min(
177
- self.reconnect_interval * 2, 600
185
+ self.reconnect_interval * 2, 60
178
186
  )
179
187
  _LOGGER.error(
180
188
  "MQTT error: %s. Reconnecting in %s seconds",
@@ -182,9 +190,11 @@ class MQTTClient(MessageBus):
182
190
  self.reconnect_interval,
183
191
  )
184
192
  self._connection_established = False
193
+ self.publish_queue.set_connected(False)
185
194
  await asyncio.sleep(self.reconnect_interval)
186
195
  self.create_client() # reset connect/reconnect futures
187
196
  except (asyncio.CancelledError, GracefulExit):
197
+ _LOGGER.info("MQTT client shutting down...")
188
198
  await self.asyncio_client.disconnect(timeout=1.0)
189
199
  # raise
190
200
 
@@ -194,21 +204,18 @@ class MQTTClient(MessageBus):
194
204
 
195
205
  async def _subscribe_manager(self, manager: Manager) -> None:
196
206
  """Connect and subscribe to manager topics + host stats."""
197
- # Create a new future for this run
198
- self._cancel_future = asyncio.Future()
199
-
200
- async def wait_for_cancel():
201
- await self._cancel_future
202
- # When future completes, raise CancelledError to stop other tasks
203
- raise asyncio.CancelledError("Stop requested")
204
-
205
207
  async with AsyncExitStack() as stack:
206
- tasks: Set[asyncio.Task] = set()
207
-
208
- # Connect to the MQTT broker.
209
208
  await stack.enter_async_context(self.asyncio_client)
210
- # Reset the reconnect interval after successful connection.
211
- self.reconnect_interval = 1
209
+ self.publish_queue.set_connected(True)
210
+ # Create a new future for this run
211
+ self._cancel_future = asyncio.Future()
212
+
213
+ async def wait_for_cancel():
214
+ await self._cancel_future
215
+ # When future completes, raise CancelledError to stop other tasks
216
+ raise asyncio.CancelledError("Stop requested")
217
+
218
+ tasks: Set[asyncio.Task] = set()
212
219
 
213
220
  publish_task = asyncio.create_task(self._handle_publish())
214
221
  tasks.add(publish_task)
@@ -184,6 +184,7 @@ async def async_run(
184
184
 
185
185
  if shutdown_event.is_set():
186
186
  _LOGGER.info("Starting graceful shutdown...")
187
+ await message_bus.announce_offline()
187
188
  main_gather.cancel()
188
189
  try:
189
190
  await main_gather
@@ -1,6 +1,6 @@
1
1
  mqtt:
2
2
  type: dict
3
- required: True
3
+ required: False
4
4
  meta:
5
5
  label: "https://boneio.eu/docs/black/configuration/mqtt \n Mqtt section of boneIO Black configuration file. It handled connecting to mqtt broker, which then is connected to Home Assistant or other smart home system."
6
6
  schema:
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "0.9.5dev1"
@@ -2432,8 +2432,5 @@
2432
2432
  "description": "https://boneio.eu/docs/black/0.9.x-dev/configuration/boneio \n BoneIO configuration section. It's new section for boneIO Black. It enables you to use predefined device types. For now only 0.7 and 0.8 devices are supported.",
2433
2433
  "title": "Boneio"
2434
2434
  }
2435
- },
2436
- "required": [
2437
- "mqtt"
2438
- ]
2435
+ }
2439
2436
  }
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "qrcode==7.4.2",
36
36
  ]
37
37
  requires-python = ">=3.7"
38
- version = "0.9.4.dev3"
38
+ version = "0.9.5.dev1"
39
39
 
40
40
  [project.license]
41
41
  text = "GNU General Public License v3.0"
@@ -1,32 +0,0 @@
1
- """
2
- Special unique implementation of asyncio.Queue for boneIO.
3
- If MQTT is down then regular queue can append multiple ON/OFF for same topic.
4
- After re-connection it would send all messages. It's not necessary, last payload of same topic is enough.
5
- """
6
- import asyncio
7
-
8
-
9
- class UniqueQueue(asyncio.Queue):
10
- """Unique implementation of asyncio.Queue."""
11
-
12
- def _init(self, maxsize):
13
- """Create unique dict of tuple[0]."""
14
- super()._init(maxsize=maxsize)
15
- self._unique_set = {}
16
-
17
- def _put(self, item):
18
- """If item does not exists add it.
19
- If exists remove old one and put new one in the beginning of the queue."""
20
- if item[0] not in self._unique_set:
21
- super()._put(item)
22
- self._unique_set[item[0]] = item
23
- else:
24
- self._queue.remove(self._unique_set[item[0]])
25
- super()._put(item)
26
- self._unique_set[item[0]] = item
27
-
28
- def _get(self):
29
- """Get item and remove it."""
30
- item = super()._get()
31
- del self._unique_set[item[0]]
32
- return item
@@ -1,2 +0,0 @@
1
- # flake8: noqa
2
- __version__ = "0.9.4dev3"
File without changes
File without changes
File without changes
File without changes