boneIO 1.0.0.dev16__tar.gz → 1.0.0.dev17__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 (416) hide show
  1. {boneio-1.0.0.dev16/boneio.egg-info → boneio-1.0.0.dev17}/PKG-INFO +1 -1
  2. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/binary_sensor.py +51 -9
  3. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/detectors.py +88 -11
  4. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/event.py +39 -1
  5. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/sensor/__init__.py +0 -2
  6. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/const.py +21 -1
  7. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/__init__.py +0 -2
  8. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/config_helper.py +40 -3
  9. boneio-1.0.0.dev17/boneio/core/discovery.py +215 -0
  10. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/inputs.py +15 -7
  11. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/manager.py +163 -21
  12. boneio-1.0.0.dev17/boneio/core/manager/remote.py +526 -0
  13. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/mqtt.py +4 -1
  14. boneio-1.0.0.dev17/boneio/core/remote/__init__.py +17 -0
  15. boneio-1.0.0.dev17/boneio/core/remote/base.py +190 -0
  16. boneio-1.0.0.dev17/boneio/core/remote/mqtt.py +228 -0
  17. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/__init__.py +2 -0
  18. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/host_data.py +1 -1
  19. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/system/monitor.py +27 -0
  20. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/oled.py +1 -1
  21. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/mcp23017.py +15 -5
  22. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/base.py +0 -17
  23. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/manager.py +2 -1
  24. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/homeassistant.py +13 -9
  25. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/coordinator.py +1 -1
  26. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/base.py +1 -1
  27. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/events.py +2 -0
  28. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/runner.py +13 -3
  29. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions.yaml +43 -8
  30. boneio-1.0.0.dev17/boneio/schema/remote_devices.yaml +238 -0
  31. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/schema.yaml +38 -5
  32. boneio-1.0.0.dev17/boneio/version.py +2 -0
  33. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/app.py +4 -0
  34. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/cssMode-QxydMKp3.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/cssMode-QoOqCovH.js +1 -1
  35. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/freemarker2-CqZTNGBJ.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/freemarker2-B-dpyTDW.js +1 -1
  36. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/handlebars-D3pxJE9P.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/handlebars-B5mgUJF9.js +1 -1
  37. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/html-BLDqv33U.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/html-D9OGQIEe.js +1 -1
  38. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/htmlMode-DsQz2ysT.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/htmlMode-D4Ix6mpf.js +1 -1
  39. boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/index-B4aCO-vf.css +1 -0
  40. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/index-COdHWIXk.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/index-BDaGsK_8.js +243 -231
  41. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/javascript-d4IlOeDI.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/javascript-DI0FFRvY.js +1 -1
  42. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/jsonMode-C-OVwgai.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/jsonMode-O-uA0ySa.js +1 -1
  43. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/liquid-BT-XduC3.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/liquid-DiK6mCoW.js +1 -1
  44. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/mdx-DUyJy2Gq.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/mdx-sdao5Kao.js +1 -1
  45. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/python-HIqJekKB.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/python-DOkyOwvp.js +1 -1
  46. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/razor-BXb9QAir.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/razor-BP6jWEuB.js +1 -1
  47. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/tsMode-BJ3LU2EO.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/tsMode-CIxSemvA.js +1 -1
  48. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/typescript-CR2wc4Px.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/typescript-CrL1nAsH.js +1 -1
  49. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/xml-BmZ15-A-.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/xml-BE8YmEl_.js +1 -1
  50. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/yaml-D12QiiRL.js → boneio-1.0.0.dev17/boneio/webui/frontend-dist/assets/yaml-CAzZpYpL.js +1 -1
  51. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/index.html +2 -2
  52. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/adc.schema.json +8 -8
  53. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/areas.schema.json +4 -4
  54. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +70 -28
  55. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -2
  56. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/config.schema.json +1165 -306
  57. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/cover.schema.json +4 -4
  58. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/ds2482.schema.json +4 -4
  59. boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem/event.schema.json +1350 -0
  60. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/ina219.schema.json +14 -14
  61. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/lm75.schema.json +10 -10
  62. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/logger.schema.json +2 -2
  63. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +6 -6
  64. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +10 -10
  65. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/modbus.schema.json +8 -8
  66. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +22 -22
  67. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/mqtt.schema.json +50 -11
  68. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/oled.schema.json +8 -8
  69. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/output.schema.json +10 -10
  70. {boneio-1.0.0.dev16/boneio/webui/schema → boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem}/output_group.schema.json +6 -6
  71. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/pca9685.schema.json +6 -6
  72. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +6 -6
  73. boneio-1.0.0.dev17/boneio/webui/frontend-dist/schem/remote_devices.schema.json +135 -0
  74. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/sensor.schema.json +8 -8
  75. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +4 -4
  76. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/web.schema.json +8 -8
  77. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/__init__.py +2 -0
  78. boneio-1.0.0.dev17/boneio/webui/routes/remote_devices.py +248 -0
  79. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/adc.schema.json +8 -8
  80. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/areas.schema.json +4 -4
  81. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/binary_sensor.schema.json +70 -28
  82. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/boneio.schema.json +2 -2
  83. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/config.schema.json +1165 -306
  84. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/cover.schema.json +4 -4
  85. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/ds2482.schema.json +4 -4
  86. boneio-1.0.0.dev17/boneio/webui/schema/event.schema.json +1350 -0
  87. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/ina219.schema.json +14 -14
  88. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/lm75.schema.json +10 -10
  89. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/logger.schema.json +2 -2
  90. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/mcp23017.schema.json +6 -6
  91. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/mcp9808.schema.json +10 -10
  92. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/modbus.schema.json +8 -8
  93. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/modbus_devices.schema.json +22 -22
  94. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/mqtt.schema.json +50 -11
  95. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/oled.schema.json +8 -8
  96. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/output.schema.json +10 -10
  97. {boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem → boneio-1.0.0.dev17/boneio/webui/schema}/output_group.schema.json +6 -6
  98. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/pca9685.schema.json +6 -6
  99. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/pcf8575.schema.json +6 -6
  100. boneio-1.0.0.dev17/boneio/webui/schema/remote_devices.schema.json +135 -0
  101. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/sensor.schema.json +8 -8
  102. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/virtual_energy_sensor.schema.json +4 -4
  103. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/web.schema.json +8 -8
  104. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17/boneio.egg-info}/PKG-INFO +1 -1
  105. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/SOURCES.txt +26 -19
  106. boneio-1.0.0.dev16/boneio/components/sensor/system.py +0 -100
  107. boneio-1.0.0.dev16/boneio/core/config/loader.py +0 -38
  108. boneio-1.0.0.dev16/boneio/version.py +0 -2
  109. boneio-1.0.0.dev16/boneio/webui/frontend-dist/assets/index-DVtWGohA.css +0 -1
  110. boneio-1.0.0.dev16/boneio/webui/frontend-dist/schem/event.schema.json +0 -701
  111. boneio-1.0.0.dev16/boneio/webui/schema/event.schema.json +0 -701
  112. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/LICENSE +0 -0
  113. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/MANIFEST.in +0 -0
  114. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/README.md +0 -0
  115. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/__init__.py +0 -0
  116. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/input.yaml +0 -0
  117. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_24_16.yaml +0 -0
  118. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_32_10.yaml +0 -0
  119. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_32_5.yaml +0 -0
  120. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_cover.yaml +0 -0
  121. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  122. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/input.yaml +0 -0
  123. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_24_16.yaml +0 -0
  124. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_32_10.yaml +0 -0
  125. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_32_5.yaml +0 -0
  126. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_cover.yaml +0 -0
  127. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  128. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/input.yaml +0 -0
  129. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_24_16.yaml +0 -0
  130. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_32_10.yaml +0 -0
  131. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_32_5.yaml +0 -0
  132. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_cover.yaml +0 -0
  133. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  134. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/input.yaml +0 -0
  135. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_24_16.yaml +0 -0
  136. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_32_10.yaml +0 -0
  137. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_cover.yaml +0 -0
  138. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  139. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/input.yaml +0 -0
  140. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_24_16.yaml +0 -0
  141. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_32_10.yaml +0 -0
  142. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_cover.yaml +0 -0
  143. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  144. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/input.yaml +0 -0
  145. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_24_16.yaml +0 -0
  146. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_32_10.yaml +0 -0
  147. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_cover.yaml +0 -0
  148. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  149. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/input.yaml +0 -0
  150. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_24_16.yaml +0 -0
  151. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_32_10.yaml +0 -0
  152. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_cover.yaml +0 -0
  153. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  154. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/bonecli.py +0 -0
  155. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/__init__.py +0 -0
  156. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/__init__.py +0 -0
  157. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/cover.py +0 -0
  158. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/previous.py +0 -0
  159. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/time_based.py +0 -0
  160. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/cover/venetian.py +0 -0
  161. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/group/__init__.py +0 -0
  162. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/group/output_group.py +0 -0
  163. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/input/__init__.py +0 -0
  164. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/__init__.py +0 -0
  165. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/basic.py +0 -0
  166. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/mcp.py +0 -0
  167. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/pca.py +0 -0
  168. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/output/pcf.py +0 -0
  169. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/components/sensor/virtual_energy.py +0 -0
  170. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/__init__.py +0 -0
  171. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/package-lock.json +0 -0
  172. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/package.json +0 -0
  173. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/schema_converter.py +0 -0
  174. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/config/yaml_util.py +0 -0
  175. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/events/__init__.py +0 -0
  176. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/events/bus.py +0 -0
  177. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/__init__.py +0 -0
  178. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/covers.py +0 -0
  179. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/display.py +0 -0
  180. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/modbus.py +0 -0
  181. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/outputs.py +0 -0
  182. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/manager/sensors.py +0 -0
  183. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/__init__.py +0 -0
  184. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/basic.py +0 -0
  185. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/basic_mqtt.py +0 -0
  186. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/local.py +0 -0
  187. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/messaging/queue.py +0 -0
  188. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/__init__.py +0 -0
  189. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/base.py +0 -0
  190. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/sensor/system.py +0 -0
  191. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/state/__init__.py +0 -0
  192. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/state/manager.py +0 -0
  193. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/__init__.py +0 -0
  194. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/async_updater.py +0 -0
  195. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/filter.py +0 -0
  196. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/font_util.py +0 -0
  197. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/logger.py +0 -0
  198. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/timeperiod.py +0 -0
  199. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/core/utils/util.py +0 -0
  200. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/adc.yaml +0 -0
  201. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  202. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/config.yaml +0 -0
  203. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/event.yaml +0 -0
  204. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/mqtt.yaml +0 -0
  205. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  206. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/adc.yaml +0 -0
  207. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  208. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/config.yaml +0 -0
  209. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/event.yaml +0 -0
  210. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/mqtt.yaml +0 -0
  211. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  212. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/__init__.py +0 -0
  213. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/adc.yaml +0 -0
  214. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  215. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/config.yaml +0 -0
  216. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/cover.yaml +0 -0
  217. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/event.yaml +0 -0
  218. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/mqtt.yaml +0 -0
  219. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover/outputCover.yaml +0 -0
  220. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/adc.yaml +0 -0
  221. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  222. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/config.yaml +0 -0
  223. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/cover.yaml +0 -0
  224. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/event.yaml +0 -0
  225. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  226. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  227. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/adc.yaml +0 -0
  228. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  229. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  230. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  231. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  232. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/event_all.yaml +0 -0
  233. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  234. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  235. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  236. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  237. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  238. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  239. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/exceptions.py +0 -0
  240. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/__init__.py +0 -0
  241. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/analog/__init__.py +0 -0
  242. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/analog/adc.py +0 -0
  243. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/__init__.py +0 -0
  244. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  245. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/__init__.py +0 -0
  246. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  247. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  248. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  249. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/gpio/input/__init__.py +0 -0
  250. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/__init__.py +0 -0
  251. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/bus.py +0 -0
  252. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/ina219.py +0 -0
  253. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/ina219_driver.py +0 -0
  254. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/mcp9808.py +0 -0
  255. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/i2c/pct2075.py +0 -0
  256. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/__init__.py +0 -0
  257. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/bus.py +0 -0
  258. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/dallas.py +0 -0
  259. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/onewire/ds2482.py +0 -0
  260. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/__init__.py +0 -0
  261. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  262. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/base.py +0 -0
  263. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  264. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  265. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/__init__.py +0 -0
  266. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/integration/interlock.py +0 -0
  267. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/__init__.py +0 -0
  268. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/cli.py +0 -0
  269. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/client.py +0 -0
  270. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/__init__.py +0 -0
  271. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  272. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  273. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  274. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  275. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  276. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  277. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  278. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/inverters/sofar.json +0 -0
  279. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/inverters/thessla.json +0 -0
  280. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  281. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/other/wanas415.json +0 -0
  282. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/cwt.json +0 -0
  283. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  284. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  285. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/pt100.json +0 -0
  286. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/sht20.json +0 -0
  287. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/devices/sensors/sht30.json +0 -0
  288. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/__init__.py +0 -0
  289. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/__init__.py +0 -0
  290. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/numeric.py +0 -0
  291. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/select.py +0 -0
  292. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/switch.py +0 -0
  293. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/derived/text.py +0 -0
  294. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/__init__.py +0 -0
  295. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/binary.py +0 -0
  296. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/numeric.py +0 -0
  297. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/sensor/text.py +0 -0
  298. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/__init__.py +0 -0
  299. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/binary.py +0 -0
  300. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/entities/writeable/numeric.py +0 -0
  301. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/modbus/utils.py +0 -0
  302. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/__init__.py +0 -0
  303. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/actions.py +0 -0
  304. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/files.py +0 -0
  305. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/logs.py +0 -0
  306. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/mqtt.py +0 -0
  307. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/models/state.py +0 -0
  308. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions_sensor.yaml +0 -0
  309. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/actions_switch.yaml +0 -0
  310. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/filters.yaml +0 -0
  311. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/filters_adc.yaml +0 -0
  312. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/id.yaml +0 -0
  313. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/temp_unit.yaml +0 -0
  314. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/schema/update_interval.yaml +0 -0
  315. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  316. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  317. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  318. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  319. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  320. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  321. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  322. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  323. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  324. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  325. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  326. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  327. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  328. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  329. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  330. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  331. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  332. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  333. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  334. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  335. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  336. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  337. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  338. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  339. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  340. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  341. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  342. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  343. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  344. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  345. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  346. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  347. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  348. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  349. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  350. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  351. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  352. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  353. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  354. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  355. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  356. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  357. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  358. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  359. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  360. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  361. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  362. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  363. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  364. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  365. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  366. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  367. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  368. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  369. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  370. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  371. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  372. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  373. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  374. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  375. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  376. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  377. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  378. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  379. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  380. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  381. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  382. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  383. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  384. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  385. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  386. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  387. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  388. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  389. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/boneio.svg +0 -0
  390. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  391. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  392. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/middleware/__init__.py +0 -0
  393. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/middleware/auth.py +0 -0
  394. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/auth.py +0 -0
  395. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/caddy.py +0 -0
  396. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/config.py +0 -0
  397. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/covers.py +0 -0
  398. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/modbus.py +0 -0
  399. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/outputs.py +0 -0
  400. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/sensors.py +0 -0
  401. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/system.py +0 -0
  402. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/routes/update.py +0 -0
  403. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/schema/dallas.schema.json +0 -0
  404. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/services/__init__.py +0 -0
  405. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/services/logs.py +0 -0
  406. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/web_server.py +0 -0
  407. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio/webui/websocket_manager.py +0 -0
  408. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/dependency_links.txt +0 -0
  409. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/entry_points.txt +0 -0
  410. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/requires.txt +0 -0
  411. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/boneio.egg-info/top_level.txt +0 -0
  412. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/pyproject.toml +0 -0
  413. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/setup.cfg +0 -0
  414. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/setup.py +0 -0
  415. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/tests/test_i2c_smbus2.py +0 -0
  416. {boneio-1.0.0.dev16 → boneio-1.0.0.dev17}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.0.0.dev16
3
+ Version: 1.0.0.dev17
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
@@ -4,9 +4,14 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
 
7
+ import time
8
+ from typing import cast
9
+
7
10
  from boneio.components.input.detectors import BinarySensorDetector
8
- from boneio.const import BinaryStateTypes, PRESSED, RELEASED
11
+ from boneio.const import BinaryStateTypes, ClickTypes, PRESSED, RELEASED
9
12
  from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
13
+ from boneio.models import InputState
14
+ from boneio.models.events import InputEvent
10
15
 
11
16
  _LOGGER = logging.getLogger(__name__)
12
17
 
@@ -51,24 +56,61 @@ class GpioInputBinarySensor(GpioBaseClass):
51
56
 
52
57
  # Send initial state if requested
53
58
  if kwargs.get("initial_send", False):
54
- self._loop.call_soon(self._send_initial_state)
59
+ self._loop.call_soon(callback=self._send_initial_state)
55
60
 
56
61
  def _send_initial_state(self) -> None:
57
62
  """Send initial state after setup."""
63
+ self.send_current_state()
64
+
65
+ def send_current_state(self) -> None:
66
+ """Send current state to MQTT without triggering actions.
67
+
68
+ This can be called on startup (if initial_send=True) or after config reload.
69
+ Only publishes state to MQTT broker, does not execute any configured actions.
70
+ """
58
71
  # Read current state from GPIO manager
59
- from boneio.hardware.gpio.input.base import read_input
60
- current_value = read_input(self._pin)
72
+ gpio_manager = get_gpio_manager(loop=self._loop)
73
+ current_value = gpio_manager.read_value(self._pin)
61
74
 
62
75
  # Determine state based on inversion
63
76
  is_pressed = not current_value if not self._inverted else current_value
64
77
  state_str = PRESSED if is_pressed else RELEASED
65
78
 
66
- _LOGGER.debug("Sending initial state for %s: %s", self._name, state_str)
67
- self.press_callback(
68
- click_type=state_str,
69
- duration=None,
70
- start_time=0.0,
79
+ _LOGGER.debug("Publishing current state for %s: %s (publish_only)", self._name, state_str)
80
+
81
+ # Use publish_only=True to send to MQTT without executing actions
82
+ self._publish_state_only(state_str)
83
+
84
+ def _publish_state_only(self, state_str: str) -> None:
85
+ """Publish state to MQTT without triggering actions.
86
+
87
+ Creates an InputEvent with publish_only=True flag, which tells
88
+ the InputManager to only publish to MQTT without executing actions.
89
+
90
+ Args:
91
+ state_str: State string (PRESSED or RELEASED)
92
+ """
93
+ timestamp = time.time()
94
+
95
+ # Create event state
96
+ event_state = InputState(
97
+ name=self.name,
98
+ pin=self._pin,
99
+ state=state_str,
100
+ type=self.input_type,
101
+ timestamp=timestamp,
102
+ boneio_input=self.boneio_input,
103
+ area=self.area,
71
104
  )
105
+
106
+ # Trigger event with publish_only=True
107
+ self._event_bus.trigger_event(InputEvent(
108
+ entity_id=self.id,
109
+ click_type=cast(ClickTypes, state_str),
110
+ duration=None,
111
+ state=event_state,
112
+ publish_only=True,
113
+ ))
72
114
 
73
115
  def _on_state_changed(self, state: BinaryStateTypes, timestamp: float) -> None:
74
116
  """Called by BinarySensorDetector when state changes.
@@ -6,10 +6,22 @@ import asyncio
6
6
  import logging
7
7
  from collections.abc import Callable
8
8
  from dataclasses import dataclass
9
+ from typing import cast
9
10
 
10
11
  import gpiod
11
12
 
12
- from boneio.const import BinaryStateTypes, ClickTypes, DOUBLE, LONG, PRESSED, RELEASED, SINGLE
13
+ from boneio.const import (
14
+ BinaryStateTypes,
15
+ ClickTypes,
16
+ CLICK_SEQUENCES,
17
+ DEFAULT_SEQUENCE_WINDOW_MS,
18
+ DOUBLE,
19
+ LONG,
20
+ PRESSED,
21
+ RELEASED,
22
+ SINGLE,
23
+ TRIPLE,
24
+ )
13
25
 
14
26
  _LOGGER = logging.getLogger(__name__)
15
27
 
@@ -24,6 +36,9 @@ class ClickState:
24
36
  finalizer_scheduled_loop_ts: float | None = None
25
37
  long_press_timer: asyncio.TimerHandle | None = None
26
38
  long_press_scheduled_loop_ts: float | None = None
39
+ # Sequence tracking
40
+ last_click_type: str | None = None
41
+ last_click_time: float | None = None
27
42
 
28
43
 
29
44
  @dataclass
@@ -35,8 +50,9 @@ class BinarySensorState:
35
50
 
36
51
 
37
52
  class MultiClickDetector:
38
- """Detects single, double, and long-press events with software debounce.
53
+ """Detects single, double, triple, long-press events and sequences with software debounce.
39
54
 
55
+ Supports sequence detection like double_then_long, single_then_long, etc.
40
56
  Based on multiclick_detector.py from tests.
41
57
  """
42
58
 
@@ -47,6 +63,7 @@ class MultiClickDetector:
47
63
  debounce_ms: float = 50.0,
48
64
  multiclick_window_ms: float = 220.0,
49
65
  hold_threshold_ms: float = 400.0,
66
+ sequence_window_ms: float = DEFAULT_SEQUENCE_WINDOW_MS,
50
67
  name: str = "unknown",
51
68
  pin: str = "unknown",
52
69
  ):
@@ -58,6 +75,7 @@ class MultiClickDetector:
58
75
  debounce_ms: Debounce time in milliseconds
59
76
  multiclick_window_ms: Window for double-click detection
60
77
  hold_threshold_ms: Time threshold for long press
78
+ sequence_window_ms: Window for sequence detection (e.g., double_then_long)
61
79
  name: Name of the input
62
80
  pin: Pin name for logging
63
81
  """
@@ -66,6 +84,7 @@ class MultiClickDetector:
66
84
  self._debounce_seconds = debounce_ms / 1000.0
67
85
  self._multiclick_window = multiclick_window_ms / 1000.0
68
86
  self._hold_threshold = hold_threshold_ms / 1000.0
87
+ self._sequence_window = sequence_window_ms / 1000.0
69
88
  self._name = name
70
89
  self._pin = pin
71
90
  self._state = ClickState()
@@ -80,19 +99,80 @@ class MultiClickDetector:
80
99
  elif count == 2:
81
100
  click_type = DOUBLE
82
101
  _LOGGER.info("Detected DOUBLE click on %s (%s)", self._name, self._pin)
102
+ elif count == 3:
103
+ click_type = TRIPLE
104
+ _LOGGER.info("Detected TRIPLE click on %s (%s)", self._name, self._pin)
83
105
  else:
84
- click_type = SINGLE # Fallback for 3+ clicks
106
+ click_type = SINGLE # Fallback for 4+ clicks
85
107
  _LOGGER.info("Detected %d clicks on %s (%s), treating as SINGLE", count, self._name, self._pin)
86
108
 
87
109
  self._state.click_count = 0
88
110
  self._state.finalizer = None
89
111
  self._state.finalizer_scheduled_loop_ts = None
90
112
 
91
- # Call the callback
113
+ # Emit the click
114
+ self._emit_click(click_type, None)
115
+
116
+ def _emit_click(self, click_type: ClickTypes, duration: float | None) -> None:
117
+ """Emit a click event, checking for sequences first.
118
+
119
+ Args:
120
+ click_type: The detected click type (single, double, triple, long)
121
+ duration: Duration of the click (for long press)
122
+ """
123
+ current_time = self._loop.time()
124
+
125
+ # Check if this click forms a sequence with the previous one
126
+ sequence_type = self._check_sequence(click_type, current_time)
127
+ if sequence_type:
128
+ _LOGGER.info(
129
+ "Detected sequence %s on %s (%s)",
130
+ sequence_type.upper(), self._name, self._pin
131
+ )
132
+ try:
133
+ self._callback(sequence_type, duration)
134
+ except Exception as exc:
135
+ _LOGGER.error("Error in sequence callback for %s: %s", self._name, exc, exc_info=True)
136
+
137
+ # Always emit the basic click type
92
138
  try:
93
- self._callback(click_type, None)
139
+ self._callback(click_type, duration)
94
140
  except Exception as exc:
95
- _LOGGER.error("Error in multiclick callback for %s: %s", self._name, exc, exc_info=True)
141
+ _LOGGER.error("Error in click callback for %s: %s", self._name, exc, exc_info=True)
142
+
143
+ # Remember this click for potential sequence detection
144
+ self._state.last_click_type = click_type
145
+ self._state.last_click_time = current_time
146
+
147
+ def _check_sequence(self, current_click: ClickTypes, current_time: float) -> ClickTypes | None:
148
+ """Check if current click forms a sequence with previous click.
149
+
150
+ Args:
151
+ current_click: Current click type
152
+ current_time: Current timestamp
153
+
154
+ Returns:
155
+ Sequence type if detected, None otherwise
156
+ """
157
+ if not self._state.last_click_type or not self._state.last_click_time:
158
+ return None
159
+
160
+ elapsed = current_time - self._state.last_click_time
161
+ if elapsed > self._sequence_window:
162
+ # Too much time passed, no sequence - this is normal behavior
163
+ return None
164
+
165
+ # Look up sequence in mapping
166
+ sequence_key = (self._state.last_click_type, current_click)
167
+ sequence_type = CLICK_SEQUENCES.get(sequence_key)
168
+
169
+ if sequence_type:
170
+ # Clear sequence state to prevent chaining
171
+ self._state.last_click_type = None
172
+ self._state.last_click_time = None
173
+ return cast(ClickTypes, sequence_type)
174
+
175
+ return None
96
176
 
97
177
  def _detect_long_press(self) -> None:
98
178
  """Detect and report a long press."""
@@ -106,11 +186,8 @@ class MultiClickDetector:
106
186
  self._state.long_press_timer = None
107
187
  self._state.long_press_scheduled_loop_ts = None
108
188
 
109
- # Call the callback
110
- try:
111
- self._callback(LONG, duration)
112
- except Exception as exc:
113
- _LOGGER.error("Error in long press callback for %s: %s", self._name, exc, exc_info=True)
189
+ # Emit the long press (may also trigger sequence)
190
+ self._emit_click(LONG, duration)
114
191
 
115
192
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
116
193
  """Process a GPIO edge event and update click state.
@@ -15,6 +15,7 @@ _LOGGER = logging.getLogger(__name__)
15
15
  # DEFAULT TIMINGS FOR BUTTONS (can be overridden in config)
16
16
  DEFAULT_DOUBLE_CLICK_DURATION_MS = 220
17
17
  DEFAULT_LONG_PRESS_DURATION_MS = 400
18
+ DEFAULT_SEQUENCE_WINDOW_MS = 500
18
19
 
19
20
 
20
21
  def _to_milliseconds(value, default_ms: int) -> int:
@@ -45,6 +46,7 @@ class GpioEventButton(GpioBaseClass):
45
46
  Args:
46
47
  double_click_duration: Time window in ms to detect double click (default: 220ms)
47
48
  long_press_duration: Time in ms to detect long press (default: 400ms)
49
+ sequence_window_duration: Time window in ms to detect sequences (default: 500ms)
48
50
  **kwargs: Additional arguments passed to GpioBaseClass
49
51
  """
50
52
  super().__init__(**kwargs)
@@ -58,6 +60,10 @@ class GpioEventButton(GpioBaseClass):
58
60
  kwargs.get('long_press_duration'),
59
61
  DEFAULT_LONG_PRESS_DURATION_MS
60
62
  )
63
+ sequence_window_duration = _to_milliseconds(
64
+ kwargs.get('sequence_window_duration'),
65
+ DEFAULT_SEQUENCE_WINDOW_MS
66
+ )
61
67
 
62
68
  # Create multiclick detector
63
69
  self._detector = MultiClickDetector(
@@ -66,6 +72,7 @@ class GpioEventButton(GpioBaseClass):
66
72
  debounce_ms=self._bounce_time * 1000, # Convert to ms
67
73
  multiclick_window_ms=double_click_duration,
68
74
  hold_threshold_ms=long_press_duration,
75
+ sequence_window_ms=sequence_window_duration,
69
76
  name=self._name,
70
77
  pin=self._pin,
71
78
  )
@@ -102,4 +109,35 @@ class GpioEventButton(GpioBaseClass):
102
109
  click_type=click_type,
103
110
  duration=duration,
104
111
  start_time=start_time,
105
- )
112
+ )
113
+
114
+ def update_timings(
115
+ self,
116
+ double_click_duration: int | float | None = None,
117
+ long_press_duration: int | float | None = None,
118
+ sequence_window_duration: int | float | None = None,
119
+ ) -> None:
120
+ """Update timing parameters for click detection.
121
+
122
+ This method allows updating timing parameters at runtime without
123
+ recreating the detector. Useful for config reload.
124
+
125
+ Args:
126
+ double_click_duration: Time window in ms to detect double click
127
+ long_press_duration: Time in ms to detect long press
128
+ sequence_window_duration: Time window in ms to detect sequences
129
+ """
130
+ if double_click_duration is not None:
131
+ value_ms = _to_milliseconds(double_click_duration, DEFAULT_DOUBLE_CLICK_DURATION_MS)
132
+ self._detector._multiclick_window = value_ms / 1000.0
133
+ _LOGGER.debug("Updated double_click_duration to %dms for %s", value_ms, self._name)
134
+
135
+ if long_press_duration is not None:
136
+ value_ms = _to_milliseconds(long_press_duration, DEFAULT_LONG_PRESS_DURATION_MS)
137
+ self._detector._hold_threshold = value_ms / 1000.0
138
+ _LOGGER.debug("Updated long_press_duration to %dms for %s", value_ms, self._name)
139
+
140
+ if sequence_window_duration is not None:
141
+ value_ms = _to_milliseconds(sequence_window_duration, DEFAULT_SEQUENCE_WINDOW_MS)
142
+ self._detector._sequence_window = value_ms / 1000.0
143
+ _LOGGER.debug("Updated sequence_window_duration to %dms for %s", value_ms, self._name)
@@ -4,10 +4,8 @@ This module provides high-level sensor components that combine
4
4
  hardware drivers with business logic.
5
5
  """
6
6
 
7
- from boneio.components.sensor.system import SerialNumberSensor
8
7
  from boneio.components.sensor.virtual_energy import VirtualEnergySensor
9
8
 
10
9
  __all__ = [
11
- "SerialNumberSensor",
12
10
  "VirtualEnergySensor",
13
11
  ]
@@ -24,6 +24,8 @@ ACTIONS = "actions"
24
24
  ACTION = "action"
25
25
  OUTPUT_OVER_MQTT = "output_over_mqtt"
26
26
  COVER_OVER_MQTT = "cover_over_mqtt"
27
+ REMOTE_OUTPUT = "remote_output"
28
+ REMOTE_COVER = "remote_cover"
27
29
  SWITCH = "switch"
28
30
  LIGHT = "light"
29
31
  BUTTON = "button"
@@ -81,6 +83,7 @@ WHITE = "white"
81
83
  INPUT = "input"
82
84
  SINGLE = "single"
83
85
  DOUBLE = "double"
86
+ TRIPLE = "triple"
84
87
  LONG = "long"
85
88
  PRESSED = "pressed"
86
89
  RELEASED = "released"
@@ -143,7 +146,24 @@ CLOSE = "close"
143
146
  STOP = "stop"
144
147
 
145
148
  # TYPING
146
- ClickTypes = Literal["single", "double", "long", "pressed", "released"]
149
+ # Basic click types + sequence aliases
150
+ ClickTypes = Literal[
151
+ "single", "double", "triple", "long", "pressed", "released",
152
+ # Sequence aliases
153
+ "double_then_long", # double click followed by long press
154
+ "single_then_long", # single click followed by long press
155
+ "double_then_single", # double click followed by single click
156
+ ]
157
+
158
+ # Sequence definitions for MultiClickDetector
159
+ CLICK_SEQUENCES: dict[tuple[str, str], str] = {
160
+ ("double", "long"): "double_then_long",
161
+ ("single", "long"): "single_then_long",
162
+ ("double", "single"): "double_then_single",
163
+ }
164
+
165
+ # Default window for sequence detection (ms)
166
+ DEFAULT_SEQUENCE_WINDOW_MS = 500
147
167
  BinaryStateTypes = Literal["pressed", "released"]
148
168
  OledDataTypes = Literal[UPTIME, NETWORK, CPU, DISK, MEMORY, SWAP, OUTPUT]
149
169
  InputTypes = Literal[INPUT, INPUT_SENSOR]
@@ -1,12 +1,10 @@
1
1
  """Configuration management modules."""
2
2
 
3
3
  from boneio.core.config.config_helper import ConfigHelper
4
- from boneio.core.config.loader import create_serial_number_sensor
5
4
  from boneio.core.config.yaml_util import clear_config_cache, load_config_from_file
6
5
 
7
6
  __all__ = [
8
7
  "ConfigHelper",
9
8
  "clear_config_cache",
10
- "create_serial_number_sensor",
11
9
  "load_config_from_file",
12
10
  ]
@@ -23,6 +23,7 @@ from boneio.const import (
23
23
  VALVE,
24
24
  )
25
25
  from boneio.core.utils.util import sanitize_mqtt_topic
26
+ from boneio.core.system import get_serial_from_mac
26
27
 
27
28
  _LOGGER = logging.getLogger(__name__)
28
29
 
@@ -30,7 +31,6 @@ _LOGGER = logging.getLogger(__name__)
30
31
  class ConfigHelper:
31
32
  def __init__(
32
33
  self,
33
- topic_prefix: str,
34
34
  name: str = BONEIO,
35
35
  device_type: str = "boneIO Black",
36
36
  ha_discovery: bool = True,
@@ -40,12 +40,26 @@ class ConfigHelper:
40
40
  web_port: int = 8090,
41
41
  proxy_port: int | None = None,
42
42
  config_file_path: str | None = None,
43
+ send_boneio_autodiscovery: bool = True,
44
+ receive_boneio_autodiscovery: bool = True,
43
45
  ):
44
46
  self._name = name
45
- sanitized_topic_prefix = sanitize_mqtt_topic(topic_prefix) if topic_prefix else sanitize_mqtt_topic(name)
46
- self._topic_prefix = sanitized_topic_prefix
47
+
48
+ # Generate serial number from MAC - always required for topic prefix
49
+ self._serial_no = get_serial_from_mac(network_info)
50
+
51
+ # Build fixed topic prefix: boneio/blk_{serial}
52
+ # This is no longer configurable - always uses this format
53
+ if self._serial_no:
54
+ self._topic_prefix = f"boneio/{self._serial_no}"
55
+ else:
56
+ # Fallback if MAC not available (should rarely happen)
57
+ self._topic_prefix = "boneio/blk_unknown"
58
+ _LOGGER.warning("Could not determine serial number from MAC, using fallback topic prefix")
47
59
  self._ha_discovery = ha_discovery
48
60
  self._ha_discovery_prefix = ha_discovery_prefix
61
+ self._send_boneio_autodiscovery = send_boneio_autodiscovery
62
+ self._receive_boneio_autodiscovery = receive_boneio_autodiscovery
49
63
  self._device_type = device_type
50
64
  self._web_port = web_port
51
65
  self._proxy_port = proxy_port
@@ -115,11 +129,19 @@ class ConfigHelper:
115
129
  def web_port(self) -> int:
116
130
  return self._web_port
117
131
 
132
+ @property
133
+ def serial_number(self) -> str:
134
+ return self._serial_no
135
+
118
136
  @property
119
137
  def proxy_port(self) -> int | None:
120
138
  """Get nginx proxy port if configured."""
121
139
  return self._proxy_port
122
140
 
141
+ @property
142
+ def http_proto(self) -> str:
143
+ return "https" if self._proxy_port else "http"
144
+
123
145
  @property
124
146
  def ha_configuration_port(self) -> int:
125
147
  """Get port for HA discovery URL. Uses proxy_port if set, otherwise web_port."""
@@ -129,6 +151,11 @@ class ConfigHelper:
129
151
  def topic_prefix(self) -> str:
130
152
  return self._topic_prefix
131
153
 
154
+ @property
155
+ def serial_no(self) -> str:
156
+ """Get device serial number (e.g., 'blk_abc123')."""
157
+ return self._serial_no or "blk_unknown"
158
+
132
159
  @property
133
160
  def name(self) -> str:
134
161
  return self._name
@@ -141,6 +168,16 @@ class ConfigHelper:
141
168
  def ha_discovery_prefix(self) -> str:
142
169
  return self._ha_discovery_prefix
143
170
 
171
+ @property
172
+ def send_boneio_autodiscovery(self) -> bool:
173
+ """Check if BoneIO autodiscovery publishing is enabled."""
174
+ return self._send_boneio_autodiscovery
175
+
176
+ @property
177
+ def receive_boneio_autodiscovery(self) -> bool:
178
+ """Check if BoneIO autodiscovery receiving is enabled."""
179
+ return self._receive_boneio_autodiscovery
180
+
144
181
  @property
145
182
  def device_type(self) -> str:
146
183
  return self._device_type