boneIO 1.2.0__tar.gz → 1.2.0.dev2__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 (455) hide show
  1. {boneio-1.2.0/boneio.egg-info → boneio-1.2.0.dev2}/PKG-INFO +1 -1
  2. boneio-1.2.0.dev2/boneio/components/cover/__init__.py +6 -0
  3. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/cover.py +8 -46
  4. boneio-1.2.0.dev2/boneio/components/cover/previous.py +354 -0
  5. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/time_based.py +3 -3
  6. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/detectors.py +8 -69
  7. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/event.py +1 -21
  8. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/const.py +0 -30
  9. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/init-certs-cloud.sh +11 -9
  10. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/registration.py +33 -67
  11. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/config_helper.py +1 -5
  12. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/schema_converter.py +3 -3
  13. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/yaml_util.py +86 -54
  14. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/events/bus.py +0 -1
  15. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/__init__.py +0 -3
  16. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/covers.py +37 -75
  17. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/inputs.py +35 -118
  18. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/manager.py +131 -156
  19. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/modbus.py +1 -11
  20. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/outputs.py +15 -39
  21. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/remote.py +8 -109
  22. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/sensors.py +160 -140
  23. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/update.py +17 -294
  24. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/mqtt.py +6 -8
  25. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/esphome.py +24 -150
  26. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/wled.py +6 -7
  27. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/host_data.py +2 -2
  28. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/timeperiod.py +0 -51
  29. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/oled.py +7 -254
  30. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/base.py +0 -11
  31. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/homeassistant.py +3 -165
  32. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/client.py +4 -41
  33. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/coordinator.py +13 -37
  34. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/r4dcb08.json +1 -1
  35. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/logs.py +1 -3
  36. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/runner.py +0 -2
  37. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions.yaml +8 -70
  38. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/schema.yaml +1 -289
  39. boneio-1.2.0.dev2/boneio/version.py +2 -0
  40. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/app.py +2 -27
  41. boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/cssMode-Cien7gk3.js +4 -0
  42. boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +12 -0
  43. boneio-1.2.0/boneio/webui/frontend-dist/assets/freemarker2-DbD6A6sh.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/freemarker2-DKeOvJUQ.js +1 -1
  44. boneio-1.2.0/boneio/webui/frontend-dist/assets/handlebars-CTdnPo2i.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/handlebars-DNnaxdWH.js +1 -1
  45. boneio-1.2.0/boneio/webui/frontend-dist/assets/html-BZoYb7JD.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/html-DXlp60y1.js +1 -1
  46. boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/htmlMode-BWwtqU6M.js +4 -0
  47. boneio-1.2.0/boneio/webui/frontend-dist/assets/index-DeLJ1p9c.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/index-C_xrObji.js +255 -255
  48. boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/index-jeVCQb5d.css +1 -0
  49. boneio-1.2.0/boneio/webui/frontend-dist/assets/javascript-By5E2Dlg.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/javascript-TNfhzQgr.js +1 -1
  50. boneio-1.2.0/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +22 -22
  51. boneio-1.2.0/boneio/webui/frontend-dist/assets/jsonMode-ZwdsxjyQ.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/jsonMode-gvQZVe-P.js +1 -1
  52. boneio-1.2.0/boneio/webui/frontend-dist/assets/liquid-DTSAXFsq.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/liquid-D9_Zvpcn.js +1 -1
  53. boneio-1.2.0/boneio/webui/frontend-dist/assets/mdx-AOxBxyYF.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/mdx-BqDp2PG-.js +1 -1
  54. boneio-1.2.0/boneio/webui/frontend-dist/assets/python-aHpP8PXg.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/python-lO3BnvZK.js +1 -1
  55. boneio-1.2.0/boneio/webui/frontend-dist/assets/razor-DlXazXnf.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/razor-M254lwEF.js +1 -1
  56. boneio-1.2.0/boneio/webui/frontend-dist/assets/tsMode-Bg9vUHAv.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/tsMode-D-skKu2E.js +1 -1
  57. boneio-1.2.0/boneio/webui/frontend-dist/assets/typescript-XXBI8V-E.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/typescript-CAFTqQSw.js +1 -1
  58. boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-vqzQaGvo.js +2 -0
  59. boneio-1.2.0/boneio/webui/frontend-dist/assets/xml-C6ha-iag.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/xml-BGBqYqhB.js +1 -1
  60. boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml-DMW4SkKa.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/yaml-CaDz2FIb.js +1 -1
  61. boneio-1.2.0/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js → boneio-1.2.0.dev2/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +200 -200
  62. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/index.html +2 -2
  63. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/adc.schema.json +6 -6
  64. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/areas.schema.json +2 -2
  65. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +38 -160
  66. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/boneio.schema.json +2 -11
  67. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/config.schema.json +343 -1319
  68. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/cover.schema.json +12 -11
  69. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/ds2482.schema.json +2 -2
  70. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/event.schema.json +129 -579
  71. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/ina219.schema.json +10 -10
  72. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/lm75.schema.json +8 -8
  73. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mcp23017.schema.json +6 -6
  74. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mcp9808.schema.json +8 -8
  75. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/modbus.schema.json +6 -26
  76. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/modbus_devices.schema.json +14 -26
  77. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/mqtt.schema.json +2 -2
  78. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/oled.schema.json +6 -6
  79. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/output.schema.json +12 -12
  80. {boneio-1.2.0/boneio/webui/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/output_group.schema.json +4 -4
  81. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/pca9685.schema.json +6 -6
  82. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/pcf8575.schema.json +6 -6
  83. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/remote_devices.schema.json +44 -44
  84. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/sensor.schema.json +6 -6
  85. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/virtual_energy_sensor.schema.json +2 -2
  86. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/web.schema.json +12 -12
  87. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/sw.js +1 -1
  88. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/__init__.py +0 -4
  89. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/config.py +1 -75
  90. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/covers.py +2 -1
  91. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/modbus.py +0 -62
  92. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/sensors.py +0 -17
  93. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/system.py +10 -227
  94. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/update.py +117 -60
  95. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/adc.schema.json +6 -6
  96. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/areas.schema.json +2 -2
  97. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/binary_sensor.schema.json +38 -160
  98. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/boneio.schema.json +2 -11
  99. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/config.schema.json +343 -1319
  100. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/cover.schema.json +12 -11
  101. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/ds2482.schema.json +2 -2
  102. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/event.schema.json +129 -579
  103. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/ina219.schema.json +10 -10
  104. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/lm75.schema.json +8 -8
  105. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/mcp23017.schema.json +6 -6
  106. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/mcp9808.schema.json +8 -8
  107. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/modbus.schema.json +6 -26
  108. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/modbus_devices.schema.json +14 -26
  109. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/mqtt.schema.json +2 -2
  110. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/oled.schema.json +6 -6
  111. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/output.schema.json +12 -12
  112. {boneio-1.2.0/boneio/webui/frontend-dist → boneio-1.2.0.dev2/boneio/webui}/schema/output_group.schema.json +4 -4
  113. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/pca9685.schema.json +6 -6
  114. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/pcf8575.schema.json +6 -6
  115. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/remote_devices.schema.json +44 -44
  116. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/sensor.schema.json +6 -6
  117. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +2 -2
  118. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/web.schema.json +12 -12
  119. boneio-1.2.0.dev2/boneio/webui/services/logs.py +242 -0
  120. {boneio-1.2.0 → boneio-1.2.0.dev2/boneio.egg-info}/PKG-INFO +1 -1
  121. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/SOURCES.txt +48 -67
  122. boneio-1.2.0/boneio/components/cover/__init__.py +0 -5
  123. boneio-1.2.0/boneio/components/template/__init__.py +0 -15
  124. boneio-1.2.0/boneio/components/template/alarm_panel.py +0 -755
  125. boneio-1.2.0/boneio/components/template/gate_cover.py +0 -456
  126. boneio-1.2.0/boneio/components/template/thermostat.py +0 -313
  127. boneio-1.2.0/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -38
  128. boneio-1.2.0/boneio/core/config/migrations/__init__.py +0 -222
  129. boneio-1.2.0/boneio/core/config/migrations/v1_proxy_port.py +0 -75
  130. boneio-1.2.0/boneio/core/config/migrations/v2_transition.py +0 -109
  131. boneio-1.2.0/boneio/core/manager/templates/__init__.py +0 -283
  132. boneio-1.2.0/boneio/core/manager/templates/alarm.py +0 -300
  133. boneio-1.2.0/boneio/core/manager/templates/gate_cover.py +0 -242
  134. boneio-1.2.0/boneio/core/manager/templates/thermostat.py +0 -195
  135. boneio-1.2.0/boneio/core/manager/templates.py +0 -812
  136. boneio-1.2.0/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -50
  137. boneio-1.2.0/boneio/modbus/devices/sensors/gdfs.json +0 -35
  138. boneio-1.2.0/boneio/modbus/devices/sensors/gdfx.json +0 -41
  139. boneio-1.2.0/boneio/version.py +0 -2
  140. boneio-1.2.0/boneio/webui/frontend-dist/assets/cssMode-DuLbOZGP.js +0 -4
  141. boneio-1.2.0/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -12
  142. boneio-1.2.0/boneio/webui/frontend-dist/assets/htmlMode-pUcd70MQ.js +0 -4
  143. boneio-1.2.0/boneio/webui/frontend-dist/assets/index-C77sf6bM.css +0 -1
  144. boneio-1.2.0/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -2
  145. boneio-1.2.0/boneio/webui/frontend-dist/schema/template.schema.json +0 -370
  146. boneio-1.2.0/boneio/webui/routes/templates.py +0 -195
  147. boneio-1.2.0/boneio/webui/routes/tools.py +0 -261
  148. boneio-1.2.0/boneio/webui/schema/template.schema.json +0 -370
  149. boneio-1.2.0/boneio/webui/services/logs.py +0 -361
  150. {boneio-1.2.0 → boneio-1.2.0.dev2}/LICENSE +0 -0
  151. {boneio-1.2.0 → boneio-1.2.0.dev2}/MANIFEST.in +0 -0
  152. {boneio-1.2.0 → boneio-1.2.0.dev2}/README.md +0 -0
  153. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/__init__.py +0 -0
  154. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/input.yaml +0 -0
  155. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
  156. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
  157. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
  158. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
  159. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  160. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/input.yaml +0 -0
  161. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
  162. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
  163. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
  164. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
  165. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  166. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/input.yaml +0 -0
  167. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
  168. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
  169. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
  170. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
  171. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  172. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/input.yaml +0 -0
  173. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
  174. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
  175. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
  176. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  177. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/input.yaml +0 -0
  178. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
  179. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
  180. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
  181. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  182. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/input.yaml +0 -0
  183. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
  184. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
  185. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
  186. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  187. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/input.yaml +0 -0
  188. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
  189. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
  190. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
  191. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  192. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/bonecli.py +0 -0
  193. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/__init__.py +0 -0
  194. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/cover/venetian.py +0 -0
  195. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/group/__init__.py +0 -0
  196. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/group/output_group.py +0 -0
  197. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/__init__.py +0 -0
  198. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/input/binary_sensor.py +0 -0
  199. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/__init__.py +0 -0
  200. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/basic.py +0 -0
  201. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/mcp.py +0 -0
  202. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/pca.py +0 -0
  203. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/output/pcf.py +0 -0
  204. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/sensor/__init__.py +0 -0
  205. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
  206. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/__init__.py +0 -0
  207. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/__init__.py +0 -0
  208. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/__init__.py +0 -0
  209. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  210. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/cloud/secrets.py +0 -0
  211. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/__init__.py +0 -0
  212. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/package-lock.json +0 -0
  213. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/config/package.json +0 -0
  214. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/discovery.py +0 -0
  215. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/events/__init__.py +0 -0
  216. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/manager/display.py +0 -0
  217. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/__init__.py +0 -0
  218. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/basic.py +0 -0
  219. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
  220. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/local.py +0 -0
  221. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/messaging/queue.py +0 -0
  222. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/__init__.py +0 -0
  223. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/base.py +0 -0
  224. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/remote/mqtt.py +0 -0
  225. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/__init__.py +0 -0
  226. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/base.py +0 -0
  227. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/sensor/system.py +0 -0
  228. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/state/__init__.py +0 -0
  229. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/state/manager.py +0 -0
  230. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/__init__.py +0 -0
  231. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/system/monitor.py +0 -0
  232. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/__init__.py +0 -0
  233. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/async_updater.py +0 -0
  234. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/filter.py +0 -0
  235. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/font_util.py +0 -0
  236. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/logger.py +0 -0
  237. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/core/utils/util.py +0 -0
  238. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
  239. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  240. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/config.yaml +0 -0
  241. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/event.yaml +0 -0
  242. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
  243. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  244. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
  245. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  246. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/config.yaml +0 -0
  247. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/event.yaml +0 -0
  248. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
  249. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  250. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/__init__.py +0 -0
  251. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/adc.yaml +0 -0
  252. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  253. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/config.yaml +0 -0
  254. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/cover.yaml +0 -0
  255. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/event.yaml +0 -0
  256. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
  257. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
  258. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
  259. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  260. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
  261. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
  262. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
  263. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  264. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  265. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
  266. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  267. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  268. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  269. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  270. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
  271. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  272. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  273. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  274. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  275. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  276. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  277. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/exceptions.py +0 -0
  278. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/__init__.py +0 -0
  279. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/analog/__init__.py +0 -0
  280. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/analog/adc.py +0 -0
  281. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/__init__.py +0 -0
  282. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  283. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/__init__.py +0 -0
  284. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  285. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  286. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  287. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  288. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
  289. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
  290. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/__init__.py +0 -0
  291. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/bus.py +0 -0
  292. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/ina219.py +0 -0
  293. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
  294. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
  295. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
  296. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/__init__.py +0 -0
  297. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/bus.py +0 -0
  298. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/dallas.py +0 -0
  299. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/onewire/ds2482.py +0 -0
  300. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/__init__.py +0 -0
  301. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  302. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
  303. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  304. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  305. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/__init__.py +0 -0
  306. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/integration/interlock.py +0 -0
  307. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/__init__.py +0 -0
  308. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/cli.py +0 -0
  309. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/__init__.py +0 -0
  310. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  311. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  312. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  313. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  314. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  315. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  316. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  317. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  318. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  319. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
  320. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/inverters/thessla.json +0 -0
  321. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  322. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/other/wanas415.json +0 -0
  323. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
  324. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  325. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  326. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  327. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
  328. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
  329. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
  330. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/__init__.py +0 -0
  331. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/base.py +0 -0
  332. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
  333. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
  334. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/select.py +0 -0
  335. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
  336. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/derived/text.py +0 -0
  337. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
  338. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
  339. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
  340. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
  341. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
  342. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
  343. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
  344. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/modbus/utils.py +0 -0
  345. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/__init__.py +0 -0
  346. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/actions.py +0 -0
  347. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/events.py +0 -0
  348. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/files.py +0 -0
  349. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/mqtt.py +0 -0
  350. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/models/state.py +0 -0
  351. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions_sensor.yaml +0 -0
  352. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/actions_switch.yaml +0 -0
  353. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/filters.yaml +0 -0
  354. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/filters_adc.yaml +0 -0
  355. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/id.yaml +0 -0
  356. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/remote_devices.yaml +0 -0
  357. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/temp_unit.yaml +0 -0
  358. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/schema/update_interval.yaml +0 -0
  359. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  360. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  361. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  362. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  363. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  364. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  365. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  366. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  367. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  368. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  369. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  370. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  371. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  372. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  373. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  374. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  375. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  376. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  377. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  378. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  379. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  380. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  381. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  382. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  383. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  384. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  385. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  386. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  387. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  388. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  389. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  390. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  391. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  392. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  393. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  394. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  395. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  396. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  397. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  398. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  399. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  400. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  401. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  402. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  403. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  404. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  405. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  406. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  407. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  408. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  409. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  410. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  411. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  412. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  413. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  414. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  415. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  416. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  417. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  418. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  419. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  420. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  421. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  422. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  423. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  424. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  425. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  426. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  427. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  428. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  429. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  430. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  431. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  432. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
  433. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  434. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/dallas.schema.json +0 -0
  435. {boneio-1.2.0/boneio/webui/frontend-dist/schema → boneio-1.2.0.dev2/boneio/webui/frontend-dist/schem}/logger.schema.json +0 -0
  436. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
  437. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/middleware/__init__.py +0 -0
  438. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/middleware/auth.py +0 -0
  439. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/auth.py +0 -0
  440. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/caddy.py +0 -0
  441. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/outputs.py +0 -0
  442. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/routes/remote_devices.py +0 -0
  443. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
  444. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/schema/logger.schema.json +0 -0
  445. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/services/__init__.py +0 -0
  446. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/web_server.py +0 -0
  447. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio/webui/websocket_manager.py +0 -0
  448. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/dependency_links.txt +0 -0
  449. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/entry_points.txt +0 -0
  450. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/requires.txt +0 -0
  451. {boneio-1.2.0 → boneio-1.2.0.dev2}/boneio.egg-info/top_level.txt +0 -0
  452. {boneio-1.2.0 → boneio-1.2.0.dev2}/pyproject.toml +0 -0
  453. {boneio-1.2.0 → boneio-1.2.0.dev2}/setup.cfg +0 -0
  454. {boneio-1.2.0 → boneio-1.2.0.dev2}/setup.py +0 -0
  455. {boneio-1.2.0 → boneio-1.2.0.dev2}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.2.0
3
+ Version: 1.2.0.dev2
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
@@ -0,0 +1,6 @@
1
+ """Cover classes."""
2
+ from .previous import PreviousCover
3
+ from .time_based import TimeBasedCover
4
+ from .venetian import VenetianCover
5
+
6
+ __all__ = ["TimeBasedCover", "PreviousCover", "VenetianCover"]
@@ -16,11 +16,11 @@ from boneio.const import (
16
16
  OPEN,
17
17
  OPENING,
18
18
  )
19
- from boneio.core.events import EventBus
19
+ from boneio.core.events import EventBus, async_track_point_in_time, utcnow
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 BasicOutput
23
+ from boneio.components.output import MCPOutput
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: BasicOutput,
34
- close_relay: BasicOutput,
33
+ open_relay: MCPOutput,
34
+ close_relay: MCPOutput,
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: BasicOutput,
151
- close_relay: BasicOutput,
150
+ open_relay: MCPOutput,
151
+ close_relay: MCPOutput,
152
152
  state_save: Callable,
153
153
  open_time: TimePeriod,
154
154
  close_time: TimePeriod,
@@ -171,7 +171,6 @@ 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
175
174
  _LOGGER.debug(
176
175
  "BaseCover %s initialized: open_time=%dms, close_time=%dms, initial_position=%d%%",
177
176
  id, self._open_time, self._close_time, position
@@ -208,8 +207,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
208
207
  # Send relay states to WebSocket (not MQTT - that's handled by output_type check)
209
208
  asyncio.create_task(self._open_relay.async_send_state())
210
209
  asyncio.create_task(self._close_relay.async_send_state())
211
- if self._current_operation in (OPENING, CLOSING):
212
- self._last_operation = self._current_operation
213
210
  self._current_operation = IDLE
214
211
  if not on_exit:
215
212
  self.send_state(self.state, self.json_position)
@@ -222,7 +219,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
222
219
  "Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms)",
223
220
  self._id, self._position, estimated_time_s, self._open_time
224
221
  )
225
- self._last_operation = OPENING
226
222
  await self.run_cover(current_operation=OPENING)
227
223
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
228
224
 
@@ -234,7 +230,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
234
230
  "Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms)",
235
231
  self._id, self._position, estimated_time_s, self._close_time
236
232
  )
237
- self._last_operation = CLOSING
238
233
  await self.run_cover(current_operation=CLOSING)
239
234
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
240
235
 
@@ -263,16 +258,10 @@ class BaseCover(BaseCoverABC, BasicMqtt):
263
258
 
264
259
  async def toggle(self) -> None:
265
260
  _LOGGER.debug("Toggle cover %s from input.", self._id)
266
- if self._current_operation != IDLE:
267
- await self.stop()
268
- elif self._position >= 100:
261
+ if self._position > 50:
269
262
  await self.close()
270
- elif self._position <= 0:
271
- await self.open()
272
- elif self._last_operation == CLOSING:
273
- await self.open()
274
263
  else:
275
- await self.close()
264
+ await self.open()
276
265
 
277
266
  async def toggle_open(self) -> None:
278
267
  _LOGGER.debug("Toggle open cover %s from input.", self._id)
@@ -288,33 +277,6 @@ class BaseCover(BaseCoverABC, BasicMqtt):
288
277
  else:
289
278
  await self.close()
290
279
 
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()
318
280
 
319
281
  @property
320
282
  def state(self) -> str:
@@ -0,0 +1,354 @@
1
+ """Cover module."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import logging
7
+ import time
8
+ from collections.abc import Callable
9
+
10
+ from boneio.components.output import MCPOutput
11
+ from boneio.const import (
12
+ CLOSE,
13
+ CLOSED,
14
+ CLOSING,
15
+ COVER,
16
+ IDLE,
17
+ OPEN,
18
+ OPENING,
19
+ STOP,
20
+ )
21
+ from boneio.core.events import EventBus
22
+ from boneio.core.utils import TimePeriod
23
+ from boneio.core.messaging import BasicMqtt
24
+ from boneio.models import CoverState
25
+ from boneio.models.events import CoverEvent
26
+
27
+ _LOGGER = logging.getLogger(__name__)
28
+ DEFAULT_RESTORED_STATE = {"position": 100}
29
+ COVER_COMMANDS = {
30
+ OPEN: "open_cover",
31
+ CLOSE: "close_cover",
32
+ STOP: "stop",
33
+ "toggle": "toggle",
34
+ "toggle_open": "toggle_open",
35
+ }
36
+
37
+
38
+ class RelayHelper:
39
+ """Relay helper for cover either open/close."""
40
+
41
+ def __init__(self, relay: MCPOutput, time: TimePeriod) -> None:
42
+ """Initialize helper."""
43
+ self._relay = relay
44
+ self._steps = 100 / time.total_seconds
45
+
46
+ @property
47
+ def relay(self) -> MCPOutput:
48
+ """Get relay."""
49
+ return self._relay
50
+
51
+ @property
52
+ def steps(self) -> int:
53
+ """Get steps for each time."""
54
+ return int(self._steps)
55
+
56
+
57
+ class PreviousCover(BasicMqtt):
58
+ """Cover class of boneIO"""
59
+
60
+ def __init__(
61
+ self,
62
+ id: str,
63
+ open_relay: MCPOutput,
64
+ close_relay: MCPOutput,
65
+ state_save: Callable,
66
+ open_time: TimePeriod,
67
+ close_time: TimePeriod,
68
+ event_bus: EventBus,
69
+ restored_state: dict = DEFAULT_RESTORED_STATE,
70
+ **kwargs,
71
+ ) -> None:
72
+ """Initialize cover class."""
73
+ self._loop = asyncio.get_event_loop()
74
+ self._id = id
75
+ super().__init__(id=id, name=id, topic_type=COVER, **kwargs)
76
+ self._lock = asyncio.Lock()
77
+ self._state_save = state_save
78
+ self._open = RelayHelper(relay=open_relay, time=open_time)
79
+ self._close = RelayHelper(relay=close_relay, time=close_time)
80
+ self._open_time = open_time
81
+ self._close_time = close_time
82
+ _LOGGER.debug(
83
+ "Cover %s initialized: open_time=%s (%dms), close_time=%s (%dms), open_steps=%d/s, close_steps=%d/s",
84
+ id, open_time, open_time.total_milliseconds, close_time, close_time.total_milliseconds,
85
+ self._open.steps, self._close.steps
86
+ )
87
+ self._set_position = None
88
+ self._current_operation = IDLE
89
+ self._position = float(restored_state.get("position", DEFAULT_RESTORED_STATE["position"]))
90
+ self._requested_closing = True
91
+ self._event_bus = event_bus
92
+ self._timer_handle = None
93
+ self._last_timestamp = 0.0
94
+ if self._position is None:
95
+ self._closed = True
96
+ else:
97
+ self._closed = self._position <= 0
98
+ self._event_bus.add_sigterm_listener(self.on_exit)
99
+ self._loop.call_soon_threadsafe(
100
+ self._loop.call_later,
101
+ 0.5,
102
+ self.send_state,
103
+ )
104
+
105
+ async def run_cover(
106
+ self,
107
+ current_operation: str,
108
+ ) -> None:
109
+ """Run cover engine."""
110
+ if self._current_operation != IDLE:
111
+ self._stop_cover()
112
+ self._current_operation = current_operation
113
+
114
+ def get_relays():
115
+ if current_operation == OPENING:
116
+ return (self._open.relay, self._close.relay)
117
+ else:
118
+ return (self._close.relay, self._open.relay)
119
+
120
+ (relay, inverted_relay) = get_relays()
121
+ async with self._lock:
122
+ if inverted_relay.is_active:
123
+ inverted_relay.turn_off()
124
+ self._timer_handle = self._event_bus.add_every_second_listener(
125
+ f"{COVER}{self.id}", self.listen_cover
126
+ )
127
+ relay.turn_on()
128
+
129
+ def on_exit(self) -> None:
130
+ """Stop on exit."""
131
+ self._stop_cover(on_exit=True)
132
+
133
+ @property
134
+ def state(self) -> str:
135
+ """Current state of cover."""
136
+ return CLOSED if self._closed else OPEN
137
+
138
+ async def stop(self) -> None:
139
+ """Public Stop cover graceful."""
140
+ _LOGGER.info("Stopping cover %s.", self._id)
141
+ if self._current_operation != IDLE:
142
+ self._stop_cover(on_exit=False)
143
+ await self.async_send_state()
144
+
145
+ async def async_send_state(self) -> None:
146
+ """Send state to Websocket on action asynchronously."""
147
+ self._last_timestamp = time.time()
148
+ event = CoverState(
149
+ id=self.id,
150
+ name=self.name,
151
+ state=self.state,
152
+ position=int(round(self._position, 0)),
153
+ kind=self.kind,
154
+ timestamp=self.last_timestamp,
155
+ current_operation=self._current_operation,
156
+ )
157
+ self._event_bus.trigger_event(CoverEvent(entity_id=self.id, state=event))
158
+
159
+ def send_state(self) -> None:
160
+ """Send state of cover to mqtt."""
161
+ self._message_bus.send_message(
162
+ topic=f"{self._send_topic}/state", payload=self.state
163
+ )
164
+ pos = round(self._position, 0)
165
+ self._message_bus.send_message(topic=f"{self._send_topic}/pos", payload={ "position": str(pos) })
166
+ self._state_save(value={"position": pos})
167
+
168
+ def _stop_cover(self, on_exit=False) -> None:
169
+ """Stop cover."""
170
+ self._open.relay.turn_off()
171
+ self._close.relay.turn_off()
172
+ if self._timer_handle is not None:
173
+ self._event_bus.remove_every_second_listener(f"{COVER}{self.id}")
174
+ self._timer_handle = None
175
+ self._set_position = None
176
+ if not on_exit:
177
+ self.send_state()
178
+ self._current_operation = IDLE
179
+
180
+ @property
181
+ def current_cover_position(self) -> int:
182
+ """Return the current position of the cover."""
183
+ return int(round(self._position, 0))
184
+
185
+ def listen_cover(self, *args) -> None:
186
+ """Listen for change in cover."""
187
+ if self._current_operation == IDLE:
188
+ return
189
+
190
+ def get_step():
191
+ """Get step for current operation."""
192
+ if self._requested_closing:
193
+ return -self._close.steps
194
+ else:
195
+ return self._open.steps
196
+
197
+ step = get_step()
198
+ self._position += step
199
+ rounded_pos = round(self._position, 0)
200
+ if self._set_position:
201
+ # Set position is only working for every 10%, so round to nearest 10.
202
+ # Except for start moving time
203
+ if (
204
+ self._requested_closing and rounded_pos < 95
205
+ ) or rounded_pos > 5:
206
+ rounded_pos = round(self._position, -1)
207
+ else:
208
+ if rounded_pos > 100:
209
+ rounded_pos = 100
210
+ elif rounded_pos < 0:
211
+ rounded_pos = 0
212
+ self._message_bus.send_message(topic=f"{self._send_topic}/pos", payload={"position": str(rounded_pos)})
213
+ asyncio.create_task(self.async_send_state())
214
+ if rounded_pos == self._set_position or (
215
+ self._set_position is None
216
+ and (rounded_pos >= 100 or rounded_pos <= 0)
217
+ ):
218
+ self._position = rounded_pos
219
+ self._closed = self.current_cover_position <= 0
220
+ self._stop_cover()
221
+ return
222
+
223
+ self._closed = self.current_cover_position <= 0
224
+
225
+ async def close_cover(self) -> None:
226
+ """Close cover."""
227
+ if self._position == 0:
228
+ return
229
+ if self._position is None:
230
+ self._closed = True
231
+ return
232
+ estimated_time_s = self._position / self._close.steps
233
+ _LOGGER.info(
234
+ "Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms, steps=%d/s)",
235
+ self._id, self._position, estimated_time_s, self._close_time.total_milliseconds, self._close.steps
236
+ )
237
+
238
+ self._requested_closing = True
239
+ self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
240
+ await self.run_cover(
241
+ current_operation=CLOSING,
242
+ )
243
+
244
+ async def open_cover(self) -> None:
245
+ """Open cover."""
246
+ if self._position == 100:
247
+ return
248
+ if self._position is None:
249
+ self._closed = False
250
+ return
251
+ estimated_time_s = (100 - self._position) / self._open.steps
252
+ _LOGGER.info(
253
+ "Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms, steps=%d/s)",
254
+ self._id, self._position, estimated_time_s, self._open_time.total_milliseconds, self._open.steps
255
+ )
256
+
257
+ self._requested_closing = False
258
+ self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
259
+ await self.run_cover(
260
+ current_operation=OPENING,
261
+ )
262
+
263
+ async def set_cover_position(self, position: int) -> None:
264
+ """Move cover to a specific position."""
265
+ set_position = round(position, -1)
266
+ if self._position == position or set_position == self._set_position:
267
+ return
268
+ if self._set_position:
269
+ self._stop_cover(on_exit=True)
270
+ self._set_position = set_position
271
+
272
+ self._requested_closing = set_position < self._position
273
+ current_operation = CLOSING if self._requested_closing else OPENING
274
+
275
+ # Calculate estimated time
276
+ position_diff = abs(self._position - set_position)
277
+ if self._requested_closing:
278
+ steps = self._close.steps
279
+ time_config = self._close_time
280
+ else:
281
+ steps = self._open.steps
282
+ time_config = self._open_time
283
+ estimated_time_s = position_diff / steps if steps > 0 else 0
284
+
285
+ _LOGGER.info(
286
+ "Setting cover %s position from %d%% to %d%% (%s). Estimated time: %.1fs (time_config=%dms, steps=%d/s)",
287
+ self._id, self._position, set_position, current_operation,
288
+ estimated_time_s, time_config.total_milliseconds, steps
289
+ )
290
+ self._message_bus.send_message(
291
+ topic=f"{self._send_topic}/state", payload=current_operation
292
+ )
293
+ await self.run_cover(
294
+ current_operation=current_operation,
295
+ )
296
+
297
+ async def open(self) -> None:
298
+ _LOGGER.debug("Opening cover %s.", self._id)
299
+ await self.open_cover()
300
+
301
+ async def close(self) -> None:
302
+ _LOGGER.debug("Closing cover %s.", self._id)
303
+ await self.close_cover()
304
+
305
+ async def toggle(self) -> None:
306
+ _LOGGER.debug("Toggle cover %s from input.", self._id)
307
+ if self.state == CLOSED:
308
+ await self.close()
309
+ else:
310
+ await self.open()
311
+
312
+ async def toggle_open(self) -> None:
313
+ _LOGGER.debug("Toggle open cover %s from input.", self._id)
314
+ if self._current_operation != IDLE:
315
+ await self.stop()
316
+ else:
317
+ await self.open()
318
+
319
+ async def toggle_close(self) -> None:
320
+ _LOGGER.debug("Toggle close cover %s from input.", self._id)
321
+ if self._current_operation != IDLE:
322
+ await self.stop()
323
+ else:
324
+ await self.close()
325
+
326
+ @property
327
+ def last_timestamp(self) -> float:
328
+ return self._last_timestamp
329
+
330
+ @property
331
+ def position(self) -> int:
332
+ return int(round(self._position, 0))
333
+
334
+ @property
335
+ def current_operation(self) -> str:
336
+ return self._current_operation
337
+
338
+ @property
339
+ def kind(self) -> str:
340
+ return "previous"
341
+
342
+ def update_config_times(self, config: dict) -> None:
343
+ """Update cover timing configuration.
344
+
345
+ Args:
346
+ config: Dictionary with timing values as TimePeriod objects.
347
+ Keys: open_time, close_time
348
+ """
349
+ if "open_time" in config:
350
+ self._open_time = config["open_time"]
351
+ self._open = RelayHelper(relay=self._open.relay, time=config["open_time"])
352
+ if "close_time" in config:
353
+ self._close_time = config["close_time"]
354
+ self._close = RelayHelper(relay=self._close.relay, time=config["close_time"])
@@ -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 BasicOutput
13
+ from boneio.components.output import MCPOutput
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: BasicOutput,
23
- close_relay: BasicOutput,
22
+ open_relay: MCPOutput,
23
+ close_relay: MCPOutput,
24
24
  state_save: Callable,
25
25
  open_time: TimePeriod,
26
26
  close_time: TimePeriod,
@@ -31,7 +31,6 @@ 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)
35
34
  last_release_ts: float | None = None
36
35
  finalizer: asyncio.TimerHandle | None = None
37
36
  finalizer_scheduled_loop_ts: float | None = None
@@ -47,7 +46,6 @@ class ClickState:
47
46
  # Long hold periodic events
48
47
  long_hold_periodic_timer: asyncio.TimerHandle | None = None
49
48
  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
51
49
 
52
50
 
53
51
  @dataclass
@@ -78,7 +76,6 @@ class MultiClickDetector:
78
76
  enable_triple_click: bool = False,
79
77
  name: str = "unknown",
80
78
  pin: str = "unknown",
81
- max_long_press_seconds: float = 120.0,
82
79
  ):
83
80
  """Initialize multiclick detector.
84
81
 
@@ -94,7 +91,6 @@ class MultiClickDetector:
94
91
  enable_triple_click: Enable triple click detection (default: False)
95
92
  name: Name of the input
96
93
  pin: Pin name for logging
97
- max_long_press_seconds: Safety timeout for long press in seconds (default: 120s)
98
94
  """
99
95
  self._loop = loop
100
96
  self._callback = callback
@@ -107,7 +103,6 @@ class MultiClickDetector:
107
103
  self._enable_triple_click = enable_triple_click
108
104
  self._name = name
109
105
  self._pin = pin
110
- self._max_long_press_seconds = max_long_press_seconds
111
106
  self._state = ClickState()
112
107
 
113
108
  # Pre-compute which click types should be delayed in exclusive mode
@@ -361,14 +356,13 @@ class MultiClickDetector:
361
356
 
362
357
  def _detect_long_press(self) -> None:
363
358
  """Detect and report a long press and start periodic updates."""
364
- if not self._state.last_press_loop_ts:
359
+ if not self._state.last_press_ts:
365
360
  return
366
361
 
367
362
  # Reset executed actions for new long press
368
363
  self._state.executed_long_actions = set()
369
- self._state.last_repeat_times = {}
370
364
 
371
- duration = self._loop.time() - self._state.last_press_loop_ts
365
+ duration = self._loop.time() - self._state.last_press_ts
372
366
 
373
367
  _LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
374
368
 
@@ -387,24 +381,11 @@ class MultiClickDetector:
387
381
 
388
382
  def _send_periodic_long_event(self) -> None:
389
383
  """Send periodic 'long' event with updated duration."""
390
- if not self._state.last_press_loop_ts or self._state.last_release_ts:
384
+ if not self._state.last_press_ts or self._state.last_release_ts:
391
385
  # Button released or invalid state
392
386
  return
393
387
 
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
388
+ duration = self._loop.time() - self._state.last_press_ts
408
389
 
409
390
  _LOGGER.debug(
410
391
  "Periodic long event on %s (%s), duration=%.3fs",
@@ -421,34 +402,6 @@ class MultiClickDetector:
421
402
  0.2,
422
403
  self._send_periodic_long_event
423
404
  )
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
- )
452
405
 
453
406
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
454
407
  """Process a GPIO edge event and update click state.
@@ -480,7 +433,6 @@ class MultiClickDetector:
480
433
 
481
434
  _LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
482
435
  self._state.last_press_ts = timestamp_s
483
- self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
484
436
  self._state.last_release_ts = None # Reset release timestamp for new press
485
437
 
486
438
  # Cancel any pending finalizer for a multi-click sequence
@@ -516,7 +468,7 @@ class MultiClickDetector:
516
468
  elif event.event_type is event.Type.RISING_EDGE:
517
469
  # Button released (RISING_EDGE on BeagleBone with pull-up)
518
470
 
519
- # Software debounce (release-vs-release)
471
+ # Software debounce
520
472
  if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
521
473
  delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
522
474
  _LOGGER.debug(
@@ -525,20 +477,8 @@ class MultiClickDetector:
525
477
  delta_ms,
526
478
  )
527
479
  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
539
480
 
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)
481
+ _LOGGER.debug("RELEASED: %s (%s)", self._name, self._pin)
542
482
  self._state.last_release_ts = timestamp_s
543
483
 
544
484
  _LOGGER.debug(
@@ -556,8 +496,8 @@ class MultiClickDetector:
556
496
  # Note: The callback creates an async task, so we need to delay
557
497
  # the reset of executed_actions to allow the async handler to
558
498
  # read the current state before it's cleared
559
- if self._state.last_press_loop_ts:
560
- duration = self._loop.time() - self._state.last_press_loop_ts
499
+ if self._state.last_press_ts:
500
+ duration = timestamp_s - self._state.last_press_ts
561
501
  _LOGGER.debug(
562
502
  "Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
563
503
  self._name,
@@ -571,7 +511,6 @@ class MultiClickDetector:
571
511
  # need to give it time to start and read executed_long_actions.
572
512
  def reset_executed_actions():
573
513
  self._state.executed_long_actions = set()
574
- self._state.last_repeat_times = {}
575
514
  _LOGGER.debug("Reset executed_long_actions for %s", self._name)
576
515
  self._loop.call_later(0.05, reset_executed_actions)
577
516