boneIO 1.1.0.dev6__tar.gz → 1.2.0__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 (456) hide show
  1. {boneio-1.1.0.dev6/boneio.egg-info → boneio-1.2.0}/PKG-INFO +2 -2
  2. boneio-1.2.0/boneio/components/cover/__init__.py +5 -0
  3. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/cover.py +46 -8
  4. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/time_based.py +3 -3
  5. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/detectors.py +69 -8
  6. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/event.py +21 -1
  7. boneio-1.2.0/boneio/components/template/__init__.py +15 -0
  8. boneio-1.2.0/boneio/components/template/alarm_panel.py +755 -0
  9. boneio-1.2.0/boneio/components/template/gate_cover.py +456 -0
  10. boneio-1.2.0/boneio/components/template/thermostat.py +313 -0
  11. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/const.py +30 -0
  12. boneio-1.2.0/boneio/core/cloud/__init__.py +5 -0
  13. boneio-1.2.0/boneio/core/cloud/data/docker-compose-cloud.yaml +38 -0
  14. boneio-1.2.0/boneio/core/cloud/data/docker-compose.yaml +37 -0
  15. boneio-1.2.0/boneio/core/cloud/data/init-certs-cloud.sh +152 -0
  16. boneio-1.2.0/boneio/core/cloud/registration.py +539 -0
  17. boneio-1.2.0/boneio/core/cloud/secrets.py +56 -0
  18. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/config_helper.py +37 -1
  19. boneio-1.2.0/boneio/core/config/migrations/__init__.py +222 -0
  20. boneio-1.2.0/boneio/core/config/migrations/v1_proxy_port.py +75 -0
  21. boneio-1.2.0/boneio/core/config/migrations/v2_transition.py +109 -0
  22. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/schema_converter.py +3 -3
  23. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/yaml_util.py +150 -86
  24. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/events/bus.py +1 -0
  25. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/__init__.py +3 -0
  26. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/covers.py +75 -37
  27. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/inputs.py +118 -35
  28. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/manager.py +156 -131
  29. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/modbus.py +11 -1
  30. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/outputs.py +39 -15
  31. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/remote.py +109 -8
  32. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/sensors.py +140 -160
  33. boneio-1.2.0/boneio/core/manager/templates/__init__.py +283 -0
  34. boneio-1.2.0/boneio/core/manager/templates/alarm.py +300 -0
  35. boneio-1.2.0/boneio/core/manager/templates/gate_cover.py +242 -0
  36. boneio-1.2.0/boneio/core/manager/templates/thermostat.py +195 -0
  37. boneio-1.2.0/boneio/core/manager/templates.py +812 -0
  38. boneio-1.2.0/boneio/core/manager/update.py +641 -0
  39. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/mqtt.py +8 -6
  40. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/esphome.py +150 -24
  41. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/wled.py +7 -6
  42. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/host_data.py +2 -2
  43. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/timeperiod.py +51 -0
  44. boneio-1.2.0/boneio/example_config/__init__.py +0 -0
  45. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/oled.py +254 -7
  46. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/base.py +11 -0
  47. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/homeassistant.py +165 -3
  48. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/client.py +41 -4
  49. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/coordinator.py +37 -13
  50. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/r4dcb08.json +1 -1
  51. boneio-1.2.0/boneio/modbus/devices/sensors/boneio-edge-temp.json +50 -0
  52. boneio-1.2.0/boneio/modbus/devices/sensors/gdfs.json +35 -0
  53. boneio-1.2.0/boneio/modbus/devices/sensors/gdfx.json +41 -0
  54. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/logs.py +3 -1
  55. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/runner.py +29 -0
  56. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions.yaml +70 -8
  57. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/schema.yaml +319 -1
  58. boneio-1.2.0/boneio/version.py +2 -0
  59. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/app.py +100 -6
  60. boneio-1.2.0/boneio/webui/frontend-dist/assets/cssMode-DuLbOZGP.js +4 -0
  61. boneio-1.2.0/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +12 -0
  62. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/freemarker2-DXMvZO7c.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/freemarker2-DbD6A6sh.js +1 -1
  63. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/handlebars-DldmTvGn.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/handlebars-CTdnPo2i.js +1 -1
  64. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/html-BeFUXNc_.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/html-BZoYb7JD.js +1 -1
  65. boneio-1.2.0/boneio/webui/frontend-dist/assets/htmlMode-pUcd70MQ.js +4 -0
  66. boneio-1.2.0/boneio/webui/frontend-dist/assets/index-C77sf6bM.css +1 -0
  67. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/index-AE1j15fF.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/index-DeLJ1p9c.js +256 -256
  68. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/javascript-tD5AV0w8.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/javascript-By5E2Dlg.js +1 -1
  69. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +22 -22
  70. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/jsonMode-D8KZNSNi.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/jsonMode-ZwdsxjyQ.js +1 -1
  71. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/liquid-B4w537sW.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/liquid-DTSAXFsq.js +1 -1
  72. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/mdx-DB1izvJl.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/mdx-AOxBxyYF.js +1 -1
  73. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/python-CG6dl7EF.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/python-aHpP8PXg.js +1 -1
  74. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/razor-BqVac-Wv.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/razor-DlXazXnf.js +1 -1
  75. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/tsMode-CvBEEAxI.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/tsMode-Bg9vUHAv.js +1 -1
  76. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/typescript-BIvQiQJr.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/typescript-XXBI8V-E.js +1 -1
  77. boneio-1.2.0/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
  78. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/xml-BtFDS-MH.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/xml-C6ha-iag.js +1 -1
  79. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/yaml-D0Bwrhp9.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml-DMW4SkKa.js +1 -1
  80. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js → boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +200 -200
  81. boneio-1.2.0/boneio/webui/frontend-dist/boneio-192.png +0 -0
  82. boneio-1.2.0/boneio/webui/frontend-dist/boneio-512.png +0 -0
  83. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/index.html +9 -2
  84. {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/binary_sensor.schema.json +128 -6
  85. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/boneio.schema.json +9 -0
  86. {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/config.schema.json +1055 -37
  87. {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/cover.schema.json +1 -2
  88. {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/event.schema.json +471 -21
  89. {boneio-1.1.0.dev6/boneio/webui → boneio-1.2.0/boneio/webui/frontend-dist}/schema/modbus.schema.json +20 -0
  90. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/modbus_devices.schema.json +14 -2
  91. boneio-1.2.0/boneio/webui/frontend-dist/schema/template.schema.json +370 -0
  92. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/web.schema.json +43 -1
  93. boneio-1.2.0/boneio/webui/frontend-dist/sw.js +1 -0
  94. boneio-1.2.0/boneio/webui/frontend-dist/workbox-226dbdbf.js +1 -0
  95. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/__init__.py +4 -0
  96. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/config.py +75 -1
  97. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/covers.py +1 -2
  98. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/modbus.py +62 -0
  99. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/sensors.py +17 -0
  100. boneio-1.2.0/boneio/webui/routes/system.py +648 -0
  101. boneio-1.2.0/boneio/webui/routes/templates.py +195 -0
  102. boneio-1.2.0/boneio/webui/routes/tools.py +261 -0
  103. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/update.py +87 -133
  104. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/binary_sensor.schema.json +128 -6
  105. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/boneio.schema.json +9 -0
  106. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/config.schema.json +1055 -37
  107. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/cover.schema.json +1 -2
  108. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/event.schema.json +471 -21
  109. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/schema}/modbus.schema.json +20 -0
  110. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/modbus_devices.schema.json +14 -2
  111. boneio-1.2.0/boneio/webui/schema/template.schema.json +370 -0
  112. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/web.schema.json +43 -1
  113. boneio-1.2.0/boneio/webui/services/logs.py +361 -0
  114. {boneio-1.1.0.dev6 → boneio-1.2.0/boneio.egg-info}/PKG-INFO +2 -2
  115. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/SOURCES.txt +77 -47
  116. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/requires.txt +1 -1
  117. {boneio-1.1.0.dev6 → boneio-1.2.0}/pyproject.toml +2 -2
  118. boneio-1.1.0.dev6/boneio/components/cover/__init__.py +0 -6
  119. boneio-1.1.0.dev6/boneio/components/cover/previous.py +0 -354
  120. boneio-1.1.0.dev6/boneio/core/manager/update.py +0 -341
  121. boneio-1.1.0.dev6/boneio/version.py +0 -2
  122. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/cssMode-SLqjH3qK.js +0 -4
  123. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -12
  124. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/htmlMode-D4OnYTmf.js +0 -4
  125. boneio-1.1.0.dev6/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +0 -1
  126. boneio-1.1.0.dev6/boneio/webui/routes/system.py +0 -314
  127. boneio-1.1.0.dev6/boneio/webui/services/logs.py +0 -242
  128. {boneio-1.1.0.dev6 → boneio-1.2.0}/LICENSE +0 -0
  129. {boneio-1.1.0.dev6 → boneio-1.2.0}/MANIFEST.in +0 -0
  130. {boneio-1.1.0.dev6 → boneio-1.2.0}/README.md +0 -0
  131. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/__init__.py +0 -0
  132. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/input.yaml +0 -0
  133. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_24_16.yaml +0 -0
  134. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_32_10.yaml +0 -0
  135. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_32_5.yaml +0 -0
  136. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_cover.yaml +0 -0
  137. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  138. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/input.yaml +0 -0
  139. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_24_16.yaml +0 -0
  140. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_32_10.yaml +0 -0
  141. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_32_5.yaml +0 -0
  142. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_cover.yaml +0 -0
  143. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  144. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/input.yaml +0 -0
  145. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_24_16.yaml +0 -0
  146. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_32_10.yaml +0 -0
  147. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_32_5.yaml +0 -0
  148. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_cover.yaml +0 -0
  149. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  150. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/input.yaml +0 -0
  151. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_24_16.yaml +0 -0
  152. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_32_10.yaml +0 -0
  153. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_cover.yaml +0 -0
  154. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  155. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/input.yaml +0 -0
  156. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_24_16.yaml +0 -0
  157. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_32_10.yaml +0 -0
  158. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_cover.yaml +0 -0
  159. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  160. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/input.yaml +0 -0
  161. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_24_16.yaml +0 -0
  162. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_32_10.yaml +0 -0
  163. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_cover.yaml +0 -0
  164. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  165. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/input.yaml +0 -0
  166. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_24_16.yaml +0 -0
  167. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_32_10.yaml +0 -0
  168. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_cover.yaml +0 -0
  169. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  170. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/bonecli.py +0 -0
  171. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/__init__.py +0 -0
  172. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/cover/venetian.py +0 -0
  173. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/group/__init__.py +0 -0
  174. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/group/output_group.py +0 -0
  175. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/__init__.py +0 -0
  176. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/input/binary_sensor.py +0 -0
  177. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/__init__.py +0 -0
  178. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/basic.py +0 -0
  179. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/mcp.py +0 -0
  180. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/pca.py +0 -0
  181. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/output/pcf.py +0 -0
  182. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/sensor/__init__.py +0 -0
  183. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/components/sensor/virtual_energy.py +0 -0
  184. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/__init__.py +0 -0
  185. {boneio-1.1.0.dev6/boneio/example_config → boneio-1.2.0/boneio/core/cloud/data}/__init__.py +0 -0
  186. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/__init__.py +0 -0
  187. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/package-lock.json +0 -0
  188. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/config/package.json +0 -0
  189. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/discovery.py +0 -0
  190. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/events/__init__.py +0 -0
  191. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/manager/display.py +0 -0
  192. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/__init__.py +0 -0
  193. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/basic.py +0 -0
  194. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/basic_mqtt.py +0 -0
  195. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/local.py +0 -0
  196. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/messaging/queue.py +0 -0
  197. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/__init__.py +0 -0
  198. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/base.py +0 -0
  199. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/remote/mqtt.py +0 -0
  200. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/__init__.py +0 -0
  201. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/base.py +0 -0
  202. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/sensor/system.py +0 -0
  203. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/state/__init__.py +0 -0
  204. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/state/manager.py +0 -0
  205. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/__init__.py +0 -0
  206. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/system/monitor.py +0 -0
  207. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/__init__.py +0 -0
  208. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/async_updater.py +0 -0
  209. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/filter.py +0 -0
  210. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/font_util.py +0 -0
  211. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/logger.py +0 -0
  212. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/core/utils/util.py +0 -0
  213. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/adc.yaml +0 -0
  214. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  215. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/config.yaml +0 -0
  216. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/event.yaml +0 -0
  217. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/mqtt.yaml +0 -0
  218. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  219. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/adc.yaml +0 -0
  220. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  221. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/config.yaml +0 -0
  222. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/event.yaml +0 -0
  223. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/mqtt.yaml +0 -0
  224. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  225. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/adc.yaml +0 -0
  226. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  227. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/config.yaml +0 -0
  228. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/cover.yaml +0 -0
  229. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/event.yaml +0 -0
  230. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/mqtt.yaml +0 -0
  231. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover/outputCover.yaml +0 -0
  232. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/adc.yaml +0 -0
  233. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  234. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/config.yaml +0 -0
  235. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/cover.yaml +0 -0
  236. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/event.yaml +0 -0
  237. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  238. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  239. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/adc.yaml +0 -0
  240. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  241. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  242. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  243. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  244. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/event_all.yaml +0 -0
  245. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  246. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  247. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  248. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  249. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  250. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  251. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/exceptions.py +0 -0
  252. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/__init__.py +0 -0
  253. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/analog/__init__.py +0 -0
  254. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/analog/adc.py +0 -0
  255. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/__init__.py +0 -0
  256. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  257. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/__init__.py +0 -0
  258. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  259. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  260. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  261. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  262. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/__init__.py +0 -0
  263. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/gpio/input/manager.py +0 -0
  264. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/__init__.py +0 -0
  265. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/bus.py +0 -0
  266. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/ina219.py +0 -0
  267. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/ina219_driver.py +0 -0
  268. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/mcp9808.py +0 -0
  269. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/i2c/pct2075.py +0 -0
  270. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/__init__.py +0 -0
  271. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/bus.py +0 -0
  272. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/dallas.py +0 -0
  273. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/onewire/ds2482.py +0 -0
  274. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/__init__.py +0 -0
  275. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  276. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/base.py +0 -0
  277. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  278. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  279. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/__init__.py +0 -0
  280. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/integration/interlock.py +0 -0
  281. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/__init__.py +0 -0
  282. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/cli.py +0 -0
  283. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/__init__.py +0 -0
  284. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  285. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  286. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  287. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  288. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  289. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  290. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  291. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  292. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  293. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/inverters/sofar.json +0 -0
  294. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/inverters/thessla.json +0 -0
  295. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  296. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/other/wanas415.json +0 -0
  297. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/cwt.json +0 -0
  298. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  299. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  300. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  301. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/pt100.json +0 -0
  302. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/sht20.json +0 -0
  303. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/devices/sensors/sht30.json +0 -0
  304. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/__init__.py +0 -0
  305. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/base.py +0 -0
  306. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/__init__.py +0 -0
  307. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/numeric.py +0 -0
  308. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/select.py +0 -0
  309. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/switch.py +0 -0
  310. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/derived/text.py +0 -0
  311. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/__init__.py +0 -0
  312. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/binary.py +0 -0
  313. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/numeric.py +0 -0
  314. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/sensor/text.py +0 -0
  315. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/__init__.py +0 -0
  316. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/binary.py +0 -0
  317. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/entities/writeable/numeric.py +0 -0
  318. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/modbus/utils.py +0 -0
  319. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/__init__.py +0 -0
  320. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/actions.py +0 -0
  321. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/events.py +0 -0
  322. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/files.py +0 -0
  323. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/mqtt.py +0 -0
  324. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/models/state.py +0 -0
  325. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions_sensor.yaml +0 -0
  326. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/actions_switch.yaml +0 -0
  327. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/filters.yaml +0 -0
  328. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/filters_adc.yaml +0 -0
  329. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/id.yaml +0 -0
  330. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/remote_devices.yaml +0 -0
  331. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/temp_unit.yaml +0 -0
  332. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/schema/update_interval.yaml +0 -0
  333. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  334. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  335. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  336. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  337. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  338. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  339. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  340. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  341. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  342. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  343. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  344. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  345. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  346. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  347. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  348. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  349. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  350. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  351. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  352. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  353. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  354. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  355. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  356. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  357. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  358. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  359. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  360. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  361. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  362. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  363. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  364. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  365. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  366. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  367. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  368. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  369. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  370. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  371. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  372. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  373. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  374. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  375. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  376. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  377. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  378. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  379. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  380. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  381. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  382. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  383. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  384. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  385. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  386. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  387. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  388. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  389. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  390. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  391. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  392. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  393. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  394. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  395. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  396. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  397. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  398. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  399. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  400. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  401. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  402. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  403. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  404. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/boneio.svg +0 -0
  405. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  406. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/adc.schema.json +0 -0
  407. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/areas.schema.json +0 -0
  408. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/dallas.schema.json +0 -0
  409. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/ds2482.schema.json +0 -0
  410. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/ina219.schema.json +0 -0
  411. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/lm75.schema.json +0 -0
  412. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/logger.schema.json +0 -0
  413. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mcp23017.schema.json +0 -0
  414. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mcp9808.schema.json +0 -0
  415. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/mqtt.schema.json +0 -0
  416. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/oled.schema.json +0 -0
  417. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/output.schema.json +0 -0
  418. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/output_group.schema.json +0 -0
  419. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/pca9685.schema.json +0 -0
  420. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/pcf8575.schema.json +0 -0
  421. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/remote_devices.schema.json +0 -0
  422. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/sensor.schema.json +0 -0
  423. {boneio-1.1.0.dev6/boneio/webui/frontend-dist/schem → boneio-1.2.0/boneio/webui/frontend-dist/schema}/virtual_energy_sensor.schema.json +0 -0
  424. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/middleware/__init__.py +0 -0
  425. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/middleware/auth.py +0 -0
  426. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/auth.py +0 -0
  427. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/caddy.py +0 -0
  428. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/outputs.py +0 -0
  429. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/routes/remote_devices.py +0 -0
  430. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/adc.schema.json +0 -0
  431. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/areas.schema.json +0 -0
  432. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/dallas.schema.json +0 -0
  433. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/ds2482.schema.json +0 -0
  434. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/ina219.schema.json +0 -0
  435. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/lm75.schema.json +0 -0
  436. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/logger.schema.json +0 -0
  437. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mcp23017.schema.json +0 -0
  438. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mcp9808.schema.json +0 -0
  439. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/mqtt.schema.json +0 -0
  440. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/oled.schema.json +0 -0
  441. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/output.schema.json +0 -0
  442. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/output_group.schema.json +0 -0
  443. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/pca9685.schema.json +0 -0
  444. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/pcf8575.schema.json +0 -0
  445. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/remote_devices.schema.json +0 -0
  446. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/sensor.schema.json +0 -0
  447. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  448. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/services/__init__.py +0 -0
  449. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/web_server.py +0 -0
  450. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio/webui/websocket_manager.py +0 -0
  451. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/dependency_links.txt +0 -0
  452. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/entry_points.txt +0 -0
  453. {boneio-1.1.0.dev6 → boneio-1.2.0}/boneio.egg-info/top_level.txt +0 -0
  454. {boneio-1.1.0.dev6 → boneio-1.2.0}/setup.cfg +0 -0
  455. {boneio-1.1.0.dev6 → boneio-1.2.0}/setup.py +0 -0
  456. {boneio-1.1.0.dev6 → boneio-1.2.0}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.1.0.dev6
3
+ Version: 1.2.0
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
@@ -28,7 +28,7 @@ Requires-Dist: pydantic==2.11.9
28
28
  Requires-Dist: hypercorn==0.17.3
29
29
  Requires-Dist: websockets==15.0.1
30
30
  Requires-Dist: python-jose[cryptography]==3.5.0
31
- Requires-Dist: python-multipart==0.0.20
31
+ Requires-Dist: python-multipart==0.0.22
32
32
  Requires-Dist: qrcode==8.2
33
33
  Requires-Dist: gpiod==2.3.0
34
34
  Requires-Dist: requests==2.32.5
@@ -0,0 +1,5 @@
1
+ """Cover classes."""
2
+ from .time_based import TimeBasedCover
3
+ from .venetian import VenetianCover
4
+
5
+ __all__ = ["TimeBasedCover", "VenetianCover"]
@@ -16,11 +16,11 @@ from boneio.const import (
16
16
  OPEN,
17
17
  OPENING,
18
18
  )
19
- from boneio.core.events import EventBus, async_track_point_in_time, utcnow
19
+ from boneio.core.events import EventBus
20
20
  from boneio.core.messaging import BasicMqtt
21
21
  from boneio.core.utils import TimePeriod
22
22
  from boneio.models import CoverState, PositionDict
23
- from boneio.components.output import MCPOutput
23
+ from boneio.components.output import BasicOutput
24
24
  from boneio.models.events import CoverEvent
25
25
 
26
26
  _LOGGER = logging.getLogger(__name__)
@@ -30,8 +30,8 @@ class BaseCoverABC(ABC):
30
30
 
31
31
  @abstractmethod
32
32
  def __init__(self, id: str,
33
- open_relay: MCPOutput,
34
- close_relay: MCPOutput,
33
+ open_relay: BasicOutput,
34
+ close_relay: BasicOutput,
35
35
  state_save: Callable,
36
36
  open_time: TimePeriod,
37
37
  close_time: TimePeriod,
@@ -147,8 +147,8 @@ class BaseVenetianCoverABC:
147
147
 
148
148
  class BaseCover(BaseCoverABC, BasicMqtt):
149
149
  def __init__(self, id: str,
150
- open_relay: MCPOutput,
151
- close_relay: MCPOutput,
150
+ open_relay: BasicOutput,
151
+ close_relay: BasicOutput,
152
152
  state_save: Callable,
153
153
  open_time: TimePeriod,
154
154
  close_time: TimePeriod,
@@ -171,6 +171,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
171
171
  self._position = position
172
172
  self._initial_position = None
173
173
  self._current_operation = IDLE
174
+ self._last_operation = CLOSING
174
175
  _LOGGER.debug(
175
176
  "BaseCover %s initialized: open_time=%dms, close_time=%dms, initial_position=%d%%",
176
177
  id, self._open_time, self._close_time, position
@@ -207,6 +208,8 @@ class BaseCover(BaseCoverABC, BasicMqtt):
207
208
  # Send relay states to WebSocket (not MQTT - that's handled by output_type check)
208
209
  asyncio.create_task(self._open_relay.async_send_state())
209
210
  asyncio.create_task(self._close_relay.async_send_state())
211
+ if self._current_operation in (OPENING, CLOSING):
212
+ self._last_operation = self._current_operation
210
213
  self._current_operation = IDLE
211
214
  if not on_exit:
212
215
  self.send_state(self.state, self.json_position)
@@ -219,6 +222,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
219
222
  "Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms)",
220
223
  self._id, self._position, estimated_time_s, self._open_time
221
224
  )
225
+ self._last_operation = OPENING
222
226
  await self.run_cover(current_operation=OPENING)
223
227
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
224
228
 
@@ -230,6 +234,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
230
234
  "Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms)",
231
235
  self._id, self._position, estimated_time_s, self._close_time
232
236
  )
237
+ self._last_operation = CLOSING
233
238
  await self.run_cover(current_operation=CLOSING)
234
239
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
235
240
 
@@ -258,10 +263,16 @@ class BaseCover(BaseCoverABC, BasicMqtt):
258
263
 
259
264
  async def toggle(self) -> None:
260
265
  _LOGGER.debug("Toggle cover %s from input.", self._id)
261
- if self._position > 50:
266
+ if self._current_operation != IDLE:
267
+ await self.stop()
268
+ elif self._position >= 100:
262
269
  await self.close()
263
- else:
270
+ elif self._position <= 0:
264
271
  await self.open()
272
+ elif self._last_operation == CLOSING:
273
+ await self.open()
274
+ else:
275
+ await self.close()
265
276
 
266
277
  async def toggle_open(self) -> None:
267
278
  _LOGGER.debug("Toggle open cover %s from input.", self._id)
@@ -277,6 +288,33 @@ class BaseCover(BaseCoverABC, BasicMqtt):
277
288
  else:
278
289
  await self.close()
279
290
 
291
+ async def smart_toggle(self, always_open_till: int = 50) -> None:
292
+ """Smart toggle with position threshold.
293
+
294
+ If cover is moving → stop.
295
+ If position <= always_open_till → open (to 100%).
296
+ If position > always_open_till → normal toggle (based on last_operation).
297
+
298
+ Args:
299
+ always_open_till: Position threshold (0-100%). Below or equal this
300
+ value the cover will always open. Above it, normal toggle applies.
301
+ """
302
+ _LOGGER.debug(
303
+ "Smart toggle cover %s (position=%d%%, threshold=%d%%)",
304
+ self._id, self._position, always_open_till,
305
+ )
306
+ if self._current_operation != IDLE:
307
+ await self.stop()
308
+ elif self._position <= always_open_till:
309
+ await self.open()
310
+ elif self._position >= 100:
311
+ await self.close()
312
+ elif self._position <= 0:
313
+ await self.open()
314
+ elif self._last_operation == CLOSING:
315
+ await self.open()
316
+ else:
317
+ await self.close()
280
318
 
281
319
  @property
282
320
  def state(self) -> str:
@@ -10,7 +10,7 @@ from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
10
10
  from boneio.components.cover.cover import BaseCover
11
11
  from boneio.core.events import EventBus
12
12
  from boneio.core.utils import TimePeriod
13
- from boneio.components.output import MCPOutput
13
+ from boneio.components.output import BasicOutput
14
14
 
15
15
  _LOGGER = logging.getLogger(__name__)
16
16
  DEFAULT_RESTORED_STATE = {"position": 100}
@@ -19,8 +19,8 @@ class TimeBasedCover(BaseCover):
19
19
  """Time-based cover algorithm similar to ESPHome."""
20
20
  def __init__(
21
21
  self,
22
- open_relay: MCPOutput,
23
- close_relay: MCPOutput,
22
+ open_relay: BasicOutput,
23
+ close_relay: BasicOutput,
24
24
  state_save: Callable,
25
25
  open_time: TimePeriod,
26
26
  close_time: TimePeriod,
@@ -31,6 +31,7 @@ class ClickState:
31
31
  """State for tracking multi-click detection."""
32
32
  click_count: int = 0
33
33
  last_press_ts: float | None = None
34
+ last_press_loop_ts: float | None = None # Event loop time of last press (for duration calc)
34
35
  last_release_ts: float | None = None
35
36
  finalizer: asyncio.TimerHandle | None = None
36
37
  finalizer_scheduled_loop_ts: float | None = None
@@ -46,6 +47,7 @@ class ClickState:
46
47
  # Long hold periodic events
47
48
  long_hold_periodic_timer: asyncio.TimerHandle | None = None
48
49
  executed_long_actions: set[int] = field(default_factory=set) # Track which long actions already executed
50
+ last_repeat_times: dict[int, float] = field(default_factory=dict) # Track last execution time per repeat action index
49
51
 
50
52
 
51
53
  @dataclass
@@ -76,6 +78,7 @@ class MultiClickDetector:
76
78
  enable_triple_click: bool = False,
77
79
  name: str = "unknown",
78
80
  pin: str = "unknown",
81
+ max_long_press_seconds: float = 120.0,
79
82
  ):
80
83
  """Initialize multiclick detector.
81
84
 
@@ -91,6 +94,7 @@ class MultiClickDetector:
91
94
  enable_triple_click: Enable triple click detection (default: False)
92
95
  name: Name of the input
93
96
  pin: Pin name for logging
97
+ max_long_press_seconds: Safety timeout for long press in seconds (default: 120s)
94
98
  """
95
99
  self._loop = loop
96
100
  self._callback = callback
@@ -103,6 +107,7 @@ class MultiClickDetector:
103
107
  self._enable_triple_click = enable_triple_click
104
108
  self._name = name
105
109
  self._pin = pin
110
+ self._max_long_press_seconds = max_long_press_seconds
106
111
  self._state = ClickState()
107
112
 
108
113
  # Pre-compute which click types should be delayed in exclusive mode
@@ -356,13 +361,14 @@ class MultiClickDetector:
356
361
 
357
362
  def _detect_long_press(self) -> None:
358
363
  """Detect and report a long press and start periodic updates."""
359
- if not self._state.last_press_ts:
364
+ if not self._state.last_press_loop_ts:
360
365
  return
361
366
 
362
367
  # Reset executed actions for new long press
363
368
  self._state.executed_long_actions = set()
369
+ self._state.last_repeat_times = {}
364
370
 
365
- duration = self._loop.time() - self._state.last_press_ts
371
+ duration = self._loop.time() - self._state.last_press_loop_ts
366
372
 
367
373
  _LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
368
374
 
@@ -381,11 +387,24 @@ class MultiClickDetector:
381
387
 
382
388
  def _send_periodic_long_event(self) -> None:
383
389
  """Send periodic 'long' event with updated duration."""
384
- if not self._state.last_press_ts or self._state.last_release_ts:
390
+ if not self._state.last_press_loop_ts or self._state.last_release_ts:
385
391
  # Button released or invalid state
386
392
  return
387
393
 
388
- duration = self._loop.time() - self._state.last_press_ts
394
+ duration = self._loop.time() - self._state.last_press_loop_ts
395
+
396
+ # Safety timeout: stop periodic events if duration exceeds max
397
+ if duration > self._max_long_press_seconds:
398
+ _LOGGER.warning(
399
+ "Safety timeout: long press on %s (%s) exceeded %.0fs (duration=%.1fs). "
400
+ "Possible missed RELEASE event. Forcing stop.",
401
+ self._name,
402
+ self._pin,
403
+ self._max_long_press_seconds,
404
+ duration,
405
+ )
406
+ self._force_stop_long_press()
407
+ return
389
408
 
390
409
  _LOGGER.debug(
391
410
  "Periodic long event on %s (%s), duration=%.3fs",
@@ -402,6 +421,34 @@ class MultiClickDetector:
402
421
  0.2,
403
422
  self._send_periodic_long_event
404
423
  )
424
+
425
+ def _force_stop_long_press(self) -> None:
426
+ """Force stop a long press due to safety timeout (missed RELEASE).
427
+
428
+ Cleans up all long-press related state as if a RELEASE event occurred.
429
+ """
430
+ if self._state.long_hold_periodic_timer:
431
+ self._state.long_hold_periodic_timer.cancel()
432
+ self._state.long_hold_periodic_timer = None
433
+
434
+ if self._state.long_press_timer:
435
+ self._state.long_press_timer.cancel()
436
+ self._state.long_press_timer = None
437
+ self._state.long_press_scheduled_loop_ts = None
438
+
439
+ # Simulate release: use last_press_ts (kernel time) as base to stay
440
+ # consistent with debounce comparisons that use kernel timestamps
441
+ self._state.last_release_ts = self._state.last_press_ts or 0.0
442
+
443
+ # Reset long press action tracking
444
+ self._state.executed_long_actions = set()
445
+ self._state.last_repeat_times = {}
446
+
447
+ _LOGGER.info(
448
+ "Forced long press stop on %s (%s) - state cleaned up",
449
+ self._name,
450
+ self._pin,
451
+ )
405
452
 
406
453
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
407
454
  """Process a GPIO edge event and update click state.
@@ -433,6 +480,7 @@ class MultiClickDetector:
433
480
 
434
481
  _LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
435
482
  self._state.last_press_ts = timestamp_s
483
+ self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
436
484
  self._state.last_release_ts = None # Reset release timestamp for new press
437
485
 
438
486
  # Cancel any pending finalizer for a multi-click sequence
@@ -468,7 +516,7 @@ class MultiClickDetector:
468
516
  elif event.event_type is event.Type.RISING_EDGE:
469
517
  # Button released (RISING_EDGE on BeagleBone with pull-up)
470
518
 
471
- # Software debounce
519
+ # Software debounce (release-vs-release)
472
520
  if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
473
521
  delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
474
522
  _LOGGER.debug(
@@ -477,8 +525,20 @@ class MultiClickDetector:
477
525
  delta_ms,
478
526
  )
479
527
  return
528
+
529
+ # Cross-debounce: ignore release too close to press (bounce on rising edge)
530
+ if self._state.last_press_ts and (timestamp_s - self._state.last_press_ts) < self._debounce_seconds:
531
+ delta_ms = (timestamp_s - self._state.last_press_ts) * 1000
532
+ _LOGGER.debug(
533
+ "Ignoring bounced release on %s (%.3f ms since press, debounce %.3f ms)",
534
+ self._name,
535
+ delta_ms,
536
+ self._debounce_seconds * 1000,
537
+ )
538
+ return
480
539
 
481
- _LOGGER.debug("RELEASED: %s (%s)", self._name, self._pin)
540
+ press_duration_ms = (timestamp_s - self._state.last_press_ts) * 1000 if self._state.last_press_ts else 0
541
+ _LOGGER.debug("RELEASED: %s (%s) after %.1f ms", self._name, self._pin, press_duration_ms)
482
542
  self._state.last_release_ts = timestamp_s
483
543
 
484
544
  _LOGGER.debug(
@@ -496,8 +556,8 @@ class MultiClickDetector:
496
556
  # Note: The callback creates an async task, so we need to delay
497
557
  # the reset of executed_actions to allow the async handler to
498
558
  # read the current state before it's cleared
499
- if self._state.last_press_ts:
500
- duration = timestamp_s - self._state.last_press_ts
559
+ if self._state.last_press_loop_ts:
560
+ duration = self._loop.time() - self._state.last_press_loop_ts
501
561
  _LOGGER.debug(
502
562
  "Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
503
563
  self._name,
@@ -511,6 +571,7 @@ class MultiClickDetector:
511
571
  # need to give it time to start and read executed_long_actions.
512
572
  def reset_executed_actions():
513
573
  self._state.executed_long_actions = set()
574
+ self._state.last_repeat_times = {}
514
575
  _LOGGER.debug("Reset executed_long_actions for %s", self._name)
515
576
  self._loop.call_later(0.05, reset_executed_actions)
516
577
 
@@ -89,6 +89,12 @@ class GpioEventButton(GpioBaseClass):
89
89
  # Get enable_triple_click setting (default: False)
90
90
  enable_triple_click = kwargs.get('enable_triple_click', False)
91
91
 
92
+ # Safety timeout for long press (default: 120s)
93
+ max_long_press_seconds = _to_milliseconds(
94
+ kwargs.get('max_long_press_duration'),
95
+ 120 * 1000 # 120s default
96
+ ) / 1000.0
97
+
92
98
  # Create multiclick detector
93
99
  self._detector = MultiClickDetector(
94
100
  loop=self._loop,
@@ -102,6 +108,7 @@ class GpioEventButton(GpioBaseClass):
102
108
  enable_triple_click=enable_triple_click,
103
109
  name=self._name,
104
110
  pin=self._pin,
111
+ max_long_press_seconds=max_long_press_seconds,
105
112
  )
106
113
 
107
114
  # Register with GPIO manager
@@ -147,6 +154,8 @@ class GpioEventButton(GpioBaseClass):
147
154
  actions: dict | None = None,
148
155
  mqtt_sequences: dict | None = None,
149
156
  enable_triple_click: bool | None = None,
157
+ long_press_mqtt_mode: str | None = None,
158
+ max_long_press_duration: int | float | None = None,
150
159
  ) -> None:
151
160
  """Update timing parameters for click detection.
152
161
 
@@ -161,6 +170,8 @@ class GpioEventButton(GpioBaseClass):
161
170
  actions: Actions dict to determine enabled sequences
162
171
  mqtt_sequences: MQTT sequences dict to determine enabled sequences
163
172
  enable_triple_click: Enable triple click detection
173
+ long_press_mqtt_mode: 'single' or 'periodic' for MQTT long press events
174
+ max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
164
175
  """
165
176
  from boneio.const import CLICK_SEQUENCES
166
177
 
@@ -213,4 +224,13 @@ class GpioEventButton(GpioBaseClass):
213
224
  if seq_name == seq:
214
225
  self._detector._delay_click_types.add(first)
215
226
  break
216
- _LOGGER.debug("Updated enabled_sequences to %s for %s", enabled_sequences, self._name)
227
+ _LOGGER.debug("Updated enabled_sequences to %s for %s", enabled_sequences, self._name)
228
+
229
+ if max_long_press_duration is not None:
230
+ value_ms = _to_milliseconds(max_long_press_duration, 120 * 1000)
231
+ self._detector._max_long_press_seconds = value_ms / 1000.0
232
+ _LOGGER.debug("Updated max_long_press_duration to %dms for %s", value_ms, self._name)
233
+
234
+ if long_press_mqtt_mode is not None:
235
+ self._long_press_mqtt_mode = long_press_mqtt_mode
236
+ _LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
@@ -0,0 +1,15 @@
1
+ """Template components — composite virtual entities.
2
+
3
+ Combines existing boneIO primitives (inputs, outputs, sensors) into
4
+ higher-level Home Assistant entities (climate, alarm_control_panel, cover, etc.).
5
+ """
6
+
7
+ from boneio.components.template.thermostat import BoneIOThermostat
8
+ from boneio.components.template.alarm_panel import BoneIOAlarmPanel
9
+ from boneio.components.template.gate_cover import BoneIOGateCover
10
+
11
+ __all__ = [
12
+ "BoneIOThermostat",
13
+ "BoneIOAlarmPanel",
14
+ "BoneIOGateCover",
15
+ ]