boneIO 1.1.0.dev1__tar.gz → 1.1.0.dev3__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 (414) hide show
  1. {boneio-1.1.0.dev1/boneio.egg-info → boneio-1.1.0.dev3}/PKG-INFO +2 -1
  2. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/detectors.py +70 -5
  3. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/inputs.py +43 -2
  4. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/manager.py +124 -22
  5. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/remote.py +157 -5
  6. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/__init__.py +9 -0
  7. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/base.py +2 -0
  8. boneio-1.1.0.dev3/boneio/core/remote/wled.py +572 -0
  9. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/homeassistant.py +13 -5
  10. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/runner.py +2 -2
  11. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions.yaml +18 -0
  12. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/remote_devices.yaml +106 -3
  13. boneio-1.1.0.dev3/boneio/version.py +2 -0
  14. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/cssMode-jm8BgQUG.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/cssMode-D_Y1ZXCG.js +1 -1
  15. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/freemarker2-Dp0Xzx1I.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/freemarker2-CzSRjwLP.js +1 -1
  16. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/handlebars-DI4hd1VE.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/handlebars-CZgWREM_.js +1 -1
  17. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/html-CqpC7ec2.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/html-l_-Dx9v2.js +1 -1
  18. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/htmlMode-Cgw0dxSz.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/htmlMode-C94ufgZC.js +1 -1
  19. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-fvCxV9EK.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-BtWe9nS_.js +228 -228
  20. boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/index-D0XGmf2O.css +1 -0
  21. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/javascript-BW9tlink.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/javascript-CTWNFYCB.js +1 -1
  22. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/jsonMode-BEG4tw2F.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/jsonMode-6lY0okwf.js +1 -1
  23. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/liquid-xHiYCVBL.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/liquid-BpvwlD2T.js +1 -1
  24. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/mdx-DBRAmEVg.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/mdx-CLQNFljY.js +1 -1
  25. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/python-DdjAUqQp.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/python-Cq5ZYn3v.js +1 -1
  26. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/razor-CVHTFNOs.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/razor-kCTdL12M.js +1 -1
  27. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/tsMode-DR-WSiIu.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/tsMode-C1oHUIMn.js +1 -1
  28. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/typescript-ljc143Ju.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/typescript-Bg5eEWu8.js +1 -1
  29. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/xml-B6zOV41n.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/xml-CMwCv6rv.js +1 -1
  30. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/yaml-C4f2eVhb.js → boneio-1.1.0.dev3/boneio/webui/frontend-dist/assets/yaml-CVxeQdw0.js +1 -1
  31. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/index.html +2 -2
  32. {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem}/binary_sensor.schema.json +32 -0
  33. {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev3/boneio/webui/frontend-dist/schem}/config.schema.json +327 -5
  34. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/event.schema.json +112 -0
  35. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +4 -4
  36. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +179 -1
  37. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/config.py +3 -0
  38. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/remote_devices.py +118 -0
  39. {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev3/boneio/webui/schema}/binary_sensor.schema.json +32 -0
  40. {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev3/boneio/webui/schema}/config.schema.json +327 -5
  41. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/event.schema.json +112 -0
  42. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/modbus_devices.schema.json +4 -4
  43. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/remote_devices.schema.json +179 -1
  44. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/web_server.py +34 -29
  45. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3/boneio.egg-info}/PKG-INFO +2 -1
  46. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/SOURCES.txt +18 -17
  47. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/requires.txt +1 -0
  48. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/pyproject.toml +1 -0
  49. boneio-1.1.0.dev1/boneio/version.py +0 -2
  50. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-Dxd5huyV.css +0 -1
  51. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/LICENSE +0 -0
  52. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/MANIFEST.in +0 -0
  53. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/README.md +0 -0
  54. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/__init__.py +0 -0
  55. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/input.yaml +0 -0
  56. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_24_16.yaml +0 -0
  57. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_32_10.yaml +0 -0
  58. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_32_5.yaml +0 -0
  59. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_cover.yaml +0 -0
  60. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  61. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/input.yaml +0 -0
  62. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_24_16.yaml +0 -0
  63. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_32_10.yaml +0 -0
  64. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_32_5.yaml +0 -0
  65. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_cover.yaml +0 -0
  66. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  67. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/input.yaml +0 -0
  68. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_24_16.yaml +0 -0
  69. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_32_10.yaml +0 -0
  70. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_32_5.yaml +0 -0
  71. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_cover.yaml +0 -0
  72. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  73. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/input.yaml +0 -0
  74. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_24_16.yaml +0 -0
  75. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_32_10.yaml +0 -0
  76. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_cover.yaml +0 -0
  77. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  78. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/input.yaml +0 -0
  79. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_24_16.yaml +0 -0
  80. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_32_10.yaml +0 -0
  81. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_cover.yaml +0 -0
  82. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  83. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/input.yaml +0 -0
  84. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_24_16.yaml +0 -0
  85. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_32_10.yaml +0 -0
  86. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_cover.yaml +0 -0
  87. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  88. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/input.yaml +0 -0
  89. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_24_16.yaml +0 -0
  90. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_32_10.yaml +0 -0
  91. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_cover.yaml +0 -0
  92. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  93. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/bonecli.py +0 -0
  94. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/__init__.py +0 -0
  95. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/__init__.py +0 -0
  96. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/cover.py +0 -0
  97. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/previous.py +0 -0
  98. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/time_based.py +0 -0
  99. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/cover/venetian.py +0 -0
  100. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/group/__init__.py +0 -0
  101. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/group/output_group.py +0 -0
  102. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/__init__.py +0 -0
  103. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/binary_sensor.py +0 -0
  104. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/input/event.py +0 -0
  105. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/__init__.py +0 -0
  106. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/basic.py +0 -0
  107. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/mcp.py +0 -0
  108. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/pca.py +0 -0
  109. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/output/pcf.py +0 -0
  110. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/sensor/__init__.py +0 -0
  111. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/components/sensor/virtual_energy.py +0 -0
  112. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/const.py +0 -0
  113. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/__init__.py +0 -0
  114. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/__init__.py +0 -0
  115. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/config_helper.py +0 -0
  116. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/package-lock.json +0 -0
  117. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/package.json +0 -0
  118. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/schema_converter.py +0 -0
  119. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/config/yaml_util.py +0 -0
  120. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/discovery.py +0 -0
  121. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/events/__init__.py +0 -0
  122. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/events/bus.py +0 -0
  123. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/__init__.py +0 -0
  124. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/covers.py +0 -0
  125. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/display.py +0 -0
  126. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/modbus.py +0 -0
  127. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/outputs.py +0 -0
  128. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/manager/sensors.py +0 -0
  129. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/__init__.py +0 -0
  130. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/basic.py +0 -0
  131. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/basic_mqtt.py +0 -0
  132. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/local.py +0 -0
  133. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/mqtt.py +0 -0
  134. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/messaging/queue.py +0 -0
  135. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/esphome.py +0 -0
  136. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/remote/mqtt.py +0 -0
  137. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/__init__.py +0 -0
  138. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/base.py +0 -0
  139. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/sensor/system.py +0 -0
  140. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/state/__init__.py +0 -0
  141. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/state/manager.py +0 -0
  142. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/__init__.py +0 -0
  143. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/host_data.py +0 -0
  144. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/system/monitor.py +0 -0
  145. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/__init__.py +0 -0
  146. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/async_updater.py +0 -0
  147. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/filter.py +0 -0
  148. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/font_util.py +0 -0
  149. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/logger.py +0 -0
  150. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/timeperiod.py +0 -0
  151. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/core/utils/util.py +0 -0
  152. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/adc.yaml +0 -0
  153. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  154. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/config.yaml +0 -0
  155. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/event.yaml +0 -0
  156. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/mqtt.yaml +0 -0
  157. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  158. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/adc.yaml +0 -0
  159. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  160. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/config.yaml +0 -0
  161. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/event.yaml +0 -0
  162. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/mqtt.yaml +0 -0
  163. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  164. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/__init__.py +0 -0
  165. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/adc.yaml +0 -0
  166. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  167. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/config.yaml +0 -0
  168. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/cover.yaml +0 -0
  169. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/event.yaml +0 -0
  170. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/mqtt.yaml +0 -0
  171. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover/outputCover.yaml +0 -0
  172. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/adc.yaml +0 -0
  173. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  174. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/config.yaml +0 -0
  175. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/cover.yaml +0 -0
  176. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/event.yaml +0 -0
  177. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  178. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  179. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/adc.yaml +0 -0
  180. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  181. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  182. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  183. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  184. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/event_all.yaml +0 -0
  185. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  186. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  187. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  188. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  189. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  190. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  191. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/exceptions.py +0 -0
  192. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/__init__.py +0 -0
  193. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/analog/__init__.py +0 -0
  194. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/analog/adc.py +0 -0
  195. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/__init__.py +0 -0
  196. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  197. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/display/oled.py +0 -0
  198. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/__init__.py +0 -0
  199. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  200. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  201. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  202. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  203. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/__init__.py +0 -0
  204. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/base.py +0 -0
  205. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/gpio/input/manager.py +0 -0
  206. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/__init__.py +0 -0
  207. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/bus.py +0 -0
  208. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/ina219.py +0 -0
  209. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/ina219_driver.py +0 -0
  210. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/mcp9808.py +0 -0
  211. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/i2c/pct2075.py +0 -0
  212. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/__init__.py +0 -0
  213. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/bus.py +0 -0
  214. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/dallas.py +0 -0
  215. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/onewire/ds2482.py +0 -0
  216. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/__init__.py +0 -0
  217. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  218. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/base.py +0 -0
  219. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  220. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  221. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/__init__.py +0 -0
  222. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/integration/interlock.py +0 -0
  223. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/__init__.py +0 -0
  224. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/cli.py +0 -0
  225. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/client.py +0 -0
  226. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/coordinator.py +0 -0
  227. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/__init__.py +0 -0
  228. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  229. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  230. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  231. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  232. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  233. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  234. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  235. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/inverters/sofar.json +0 -0
  236. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/inverters/thessla.json +0 -0
  237. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  238. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/other/wanas415.json +0 -0
  239. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/cwt.json +0 -0
  240. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  241. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  242. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  243. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/pt100.json +0 -0
  244. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/sht20.json +0 -0
  245. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/devices/sensors/sht30.json +0 -0
  246. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/__init__.py +0 -0
  247. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/base.py +0 -0
  248. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/__init__.py +0 -0
  249. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/numeric.py +0 -0
  250. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/select.py +0 -0
  251. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/switch.py +0 -0
  252. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/derived/text.py +0 -0
  253. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/__init__.py +0 -0
  254. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/binary.py +0 -0
  255. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/numeric.py +0 -0
  256. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/sensor/text.py +0 -0
  257. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/__init__.py +0 -0
  258. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/binary.py +0 -0
  259. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/entities/writeable/numeric.py +0 -0
  260. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/modbus/utils.py +0 -0
  261. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/__init__.py +0 -0
  262. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/actions.py +0 -0
  263. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/events.py +0 -0
  264. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/files.py +0 -0
  265. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/logs.py +0 -0
  266. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/mqtt.py +0 -0
  267. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/models/state.py +0 -0
  268. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions_sensor.yaml +0 -0
  269. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/actions_switch.yaml +0 -0
  270. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/filters.yaml +0 -0
  271. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/filters_adc.yaml +0 -0
  272. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/id.yaml +0 -0
  273. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/schema.yaml +0 -0
  274. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/temp_unit.yaml +0 -0
  275. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/schema/update_interval.yaml +0 -0
  276. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/app.py +0 -0
  277. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  278. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  279. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  280. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  281. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  282. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  283. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  284. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  285. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  286. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  287. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  288. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  289. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  290. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  291. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  292. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  293. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  294. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  295. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  296. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  297. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  298. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  299. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  300. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  301. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  302. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  303. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  304. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  305. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  306. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  307. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  308. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  309. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  310. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  311. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  312. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  313. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  314. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  315. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  316. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  317. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  318. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  319. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  320. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  321. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  322. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  323. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  324. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  325. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  326. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  327. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  328. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  329. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  330. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  331. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  332. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  333. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  334. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  335. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  336. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  337. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  338. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  339. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  340. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  341. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  342. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  343. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  344. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  345. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  346. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  347. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  348. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  349. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  350. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  351. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/boneio.svg +0 -0
  352. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  353. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
  354. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
  355. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
  356. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
  357. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  358. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
  359. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
  360. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
  361. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  362. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
  363. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
  364. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
  365. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
  366. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
  367. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
  368. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
  369. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
  370. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
  371. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
  372. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
  373. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/frontend-dist/schem/web.schema.json +0 -0
  374. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/middleware/__init__.py +0 -0
  375. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/middleware/auth.py +0 -0
  376. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/__init__.py +0 -0
  377. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/auth.py +0 -0
  378. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/caddy.py +0 -0
  379. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/covers.py +0 -0
  380. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/modbus.py +0 -0
  381. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/outputs.py +0 -0
  382. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/sensors.py +0 -0
  383. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/system.py +0 -0
  384. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/routes/update.py +0 -0
  385. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/adc.schema.json +0 -0
  386. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/areas.schema.json +0 -0
  387. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/boneio.schema.json +0 -0
  388. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/cover.schema.json +0 -0
  389. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/dallas.schema.json +0 -0
  390. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/ds2482.schema.json +0 -0
  391. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/ina219.schema.json +0 -0
  392. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/lm75.schema.json +0 -0
  393. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/logger.schema.json +0 -0
  394. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mcp23017.schema.json +0 -0
  395. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mcp9808.schema.json +0 -0
  396. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/modbus.schema.json +0 -0
  397. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/mqtt.schema.json +0 -0
  398. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/oled.schema.json +0 -0
  399. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/output.schema.json +0 -0
  400. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/output_group.schema.json +0 -0
  401. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/pca9685.schema.json +0 -0
  402. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/pcf8575.schema.json +0 -0
  403. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/sensor.schema.json +0 -0
  404. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  405. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/schema/web.schema.json +0 -0
  406. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/services/__init__.py +0 -0
  407. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/services/logs.py +0 -0
  408. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio/webui/websocket_manager.py +0 -0
  409. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/dependency_links.txt +0 -0
  410. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/entry_points.txt +0 -0
  411. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/boneio.egg-info/top_level.txt +0 -0
  412. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/setup.cfg +0 -0
  413. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/setup.py +0 -0
  414. {boneio-1.1.0.dev1 → boneio-1.1.0.dev3}/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.dev1
3
+ Version: 1.1.0.dev3
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
@@ -13,6 +13,7 @@ Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: smbus2==0.4.3
15
15
  Requires-Dist: aiomqtt==2.4.0
16
+ Requires-Dist: aiohttp==3.13.3
16
17
  Requires-Dist: Cerberus==1.3.7
17
18
  Requires-Dist: colorlog==6.9.0
18
19
  Requires-Dist: luma-core==2.5.1
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  import logging
7
7
  from collections.abc import Callable
8
- from dataclasses import dataclass
8
+ from dataclasses import dataclass, field
9
9
  from typing import cast
10
10
 
11
11
  import gpiod
@@ -43,6 +43,9 @@ class ClickState:
43
43
  pending_click_type: str | None = None
44
44
  pending_click_duration: float | None = None
45
45
  pending_click_timer: asyncio.TimerHandle | None = None
46
+ # Long hold periodic events
47
+ long_hold_periodic_timer: asyncio.TimerHandle | None = None
48
+ executed_long_actions: set[int] = field(default_factory=set) # Track which long actions already executed
46
49
 
47
50
 
48
51
  @dataclass
@@ -352,10 +355,14 @@ class MultiClickDetector:
352
355
  return None
353
356
 
354
357
  def _detect_long_press(self) -> None:
355
- """Detect and report a long press."""
356
- duration = None
357
- if self._state.last_press_ts and self._state.last_release_ts:
358
- duration = self._state.last_release_ts - self._state.last_press_ts
358
+ """Detect and report a long press and start periodic updates."""
359
+ if not self._state.last_press_ts:
360
+ return
361
+
362
+ # Reset executed actions for new long press
363
+ self._state.executed_long_actions = set()
364
+
365
+ duration = self._loop.time() - self._state.last_press_ts
359
366
 
360
367
  _LOGGER.info("Detected LONG press on %s (%s)", self._name, self._pin)
361
368
 
@@ -365,6 +372,36 @@ class MultiClickDetector:
365
372
 
366
373
  # Emit the long press (may also trigger sequence)
367
374
  self._emit_click(LONG, duration)
375
+
376
+ # Start periodic timer for subsequent long events
377
+ self._state.long_hold_periodic_timer = self._loop.call_later(
378
+ 0.2, # 200ms
379
+ self._send_periodic_long_event
380
+ )
381
+
382
+ def _send_periodic_long_event(self) -> None:
383
+ """Send periodic 'long' event with updated duration."""
384
+ if not self._state.last_press_ts or self._state.last_release_ts:
385
+ # Button released or invalid state
386
+ return
387
+
388
+ duration = self._loop.time() - self._state.last_press_ts
389
+
390
+ _LOGGER.debug(
391
+ "Periodic long event on %s (%s), duration=%.3fs",
392
+ self._name,
393
+ self._pin,
394
+ duration
395
+ )
396
+
397
+ # Emit 'long' event with updated duration
398
+ self._emit_click(LONG, duration)
399
+
400
+ # Schedule next update
401
+ self._state.long_hold_periodic_timer = self._loop.call_later(
402
+ 0.2,
403
+ self._send_periodic_long_event
404
+ )
368
405
 
369
406
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
370
407
  """Process a GPIO edge event and update click state.
@@ -396,6 +433,7 @@ class MultiClickDetector:
396
433
 
397
434
  _LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
398
435
  self._state.last_press_ts = timestamp_s
436
+ self._state.last_release_ts = None # Reset release timestamp for new press
399
437
 
400
438
  # Cancel any pending finalizer for a multi-click sequence
401
439
  if self._state.finalizer:
@@ -449,6 +487,33 @@ class MultiClickDetector:
449
487
  "EXISTS" if self._state.long_press_timer else "None",
450
488
  )
451
489
 
490
+ # Cancel periodic timer if running
491
+ if self._state.long_hold_periodic_timer:
492
+ self._state.long_hold_periodic_timer.cancel()
493
+ self._state.long_hold_periodic_timer = None
494
+
495
+ # Send final 'long' event with final duration
496
+ # Note: The callback creates an async task, so we need to delay
497
+ # the reset of executed_actions to allow the async handler to
498
+ # read the current state before it's cleared
499
+ if self._state.last_press_ts:
500
+ duration = timestamp_s - self._state.last_press_ts
501
+ _LOGGER.debug(
502
+ "Sending final long event on release for %s, duration=%.3fs, executed_actions=%s",
503
+ self._name,
504
+ duration,
505
+ self._state.executed_long_actions
506
+ )
507
+ self._emit_click(LONG, duration)
508
+
509
+ # Reset executed actions with a small delay to allow async handler
510
+ # to read the current state. The handler uses create_task() so we
511
+ # need to give it time to start and read executed_long_actions.
512
+ def reset_executed_actions():
513
+ self._state.executed_long_actions = set()
514
+ _LOGGER.debug("Reset executed_long_actions for %s", self._name)
515
+ self._loop.call_later(0.05, reset_executed_actions)
516
+
452
517
  # If a long press timer exists, it means it hasn't fired yet.
453
518
  # This is a short click.
454
519
  if self._state.long_press_timer:
@@ -22,6 +22,7 @@ from boneio.const import (
22
22
  ID,
23
23
  INPUT,
24
24
  INPUT_SENSOR,
25
+ LONG,
25
26
  PIN,
26
27
  PRESSED,
27
28
  RELEASED,
@@ -686,8 +687,48 @@ class InputManager:
686
687
  # Send event to MQTT for Home Assistant
687
688
  self._publish_input_event_to_mqtt(input_instance, event)
688
689
 
689
- # Execute actions for this input event (skip if publish_only)
690
- if actions and not event.publish_only:
690
+ # Execute actions with duration threshold support
691
+ if actions and event.click_type == LONG:
692
+ # Get executed_actions from detector state
693
+ detector = getattr(input_instance, '_detector', None)
694
+ executed_actions = getattr(detector._state, 'executed_long_actions', set()) if detector else set()
695
+
696
+ # Lazy evaluation: Check if there are any actions with duration thresholds
697
+ # or any actions without thresholds that haven't been executed yet
698
+ has_pending_actions = False
699
+ for idx, action in enumerate(actions):
700
+ if idx in executed_actions:
701
+ continue # Already executed
702
+ min_dur = action.get("min_duration")
703
+ max_dur = action.get("max_duration")
704
+ if min_dur is not None or max_dur is not None:
705
+ # Has duration thresholds - might need to execute
706
+ has_pending_actions = True
707
+ break
708
+ elif not executed_actions:
709
+ # No thresholds and nothing executed yet - first event
710
+ has_pending_actions = True
711
+ break
712
+
713
+ # Skip execute_actions if no pending actions (optimization for periodic events)
714
+ if not has_pending_actions:
715
+ _LOGGER.debug(
716
+ "Skipping execute_actions for %s - no pending actions (executed=%s)",
717
+ event.entity_id, executed_actions
718
+ )
719
+ else:
720
+ # Execute actions with duration checking
721
+ new_executed = await self._manager.execute_actions(
722
+ actions=actions,
723
+ duration=event.duration,
724
+ executed_actions=executed_actions,
725
+ )
726
+
727
+ # Update detector state
728
+ if detector:
729
+ detector._state.executed_long_actions = new_executed
730
+ elif actions:
731
+ # Non-long events - execute all actions normally
691
732
  await self._manager.execute_actions(actions=actions)
692
733
 
693
734
  async def send_ha_autodiscovery(self) -> None:
@@ -26,6 +26,7 @@ from boneio.const import (
26
26
  REMOTE_OUTPUT,
27
27
  SET_BRIGHTNESS,
28
28
  STATE,
29
+ TOGGLE,
29
30
  cover_actions,
30
31
  output_actions,
31
32
  )
@@ -423,17 +424,28 @@ class Manager:
423
424
  # Support both new 'boneio_output' and legacy 'pin' for backward compatibility
424
425
  entity_id = action_definition.get("boneio_output") or action_definition.get("pin")
425
426
  stripped_entity_id = strip_accents(entity_id)
426
- action_output = action_definition.get("action_output")
427
+ action_output = action_definition.get("action_output", TOGGLE)
427
428
  output = self.outputs.get_output(stripped_entity_id) or self.outputs.get_output_group(stripped_entity_id)
428
429
  action_to_execute = output_actions.get(action_output)
429
430
  if output and action_to_execute:
430
431
  _f = getattr(output, action_to_execute, None)
431
432
  if _f:
432
- parsed_actions[click_type].append({
433
+ parsed_action = {
433
434
  "action": action,
434
435
  "pin": stripped_entity_id,
435
436
  "action_to_execute": action_to_execute,
436
- })
437
+ }
438
+ # Copy duration thresholds for long press actions
439
+ if action_definition.get("min_duration") is not None:
440
+ parsed_action["min_duration"] = action_definition["min_duration"]
441
+ if action_definition.get("max_duration") is not None:
442
+ parsed_action["max_duration"] = action_definition["max_duration"]
443
+ _LOGGER.debug(
444
+ "Parsed OUTPUT action for %s: output=%s, action=%s, min_dur=%s, max_dur=%s",
445
+ pin, stripped_entity_id, action_to_execute,
446
+ parsed_action.get("min_duration"), parsed_action.get("max_duration")
447
+ )
448
+ parsed_actions[click_type].append(parsed_action)
437
449
  continue
438
450
  _LOGGER.warning("Device %s for action in %s not found. Omitting.", entity_id, pin)
439
451
 
@@ -441,19 +453,25 @@ class Manager:
441
453
  # Support both new 'boneio_cover' and legacy 'pin' for backward compatibility
442
454
  entity_id = action_definition.get("boneio_cover") or action_definition.get("pin")
443
455
  stripped_entity_id = strip_accents(entity_id)
444
- action_cover = action_definition.get("action_cover")
456
+ action_cover = action_definition.get("action_cover", TOGGLE)
445
457
  extra_data = action_definition.get("data", {})
446
458
  cover = self.covers.get_cover(stripped_entity_id)
447
459
  action_to_execute = cover_actions.get(action_cover)
448
460
  if cover and action_to_execute:
449
461
  _f = getattr(cover, action_to_execute, None)
450
462
  if _f:
451
- parsed_actions[click_type].append({
463
+ parsed_action = {
452
464
  "action": action,
453
465
  "pin": stripped_entity_id,
454
466
  "action_to_execute": action_to_execute,
455
467
  "extra_data": extra_data,
456
- })
468
+ }
469
+ # Copy duration thresholds for long press actions
470
+ if action_definition.get("min_duration") is not None:
471
+ parsed_action["min_duration"] = action_definition["min_duration"]
472
+ if action_definition.get("max_duration") is not None:
473
+ parsed_action["max_duration"] = action_definition["max_duration"]
474
+ parsed_actions[click_type].append(parsed_action)
457
475
  continue
458
476
  _LOGGER.warning("Device %s for action not found. Omitting.", entity_id)
459
477
 
@@ -461,11 +479,17 @@ class Manager:
461
479
  action_mqtt_msg = action_definition.get("action_mqtt_msg")
462
480
  action_topic = action_definition.get(TOPIC)
463
481
  if action_topic and action_mqtt_msg:
464
- parsed_actions[click_type].append({
482
+ parsed_action = {
465
483
  "action": action,
466
484
  "action_mqtt_msg": action_mqtt_msg,
467
485
  "action_topic": action_topic,
468
- })
486
+ }
487
+ # Copy duration thresholds for long press actions
488
+ if action_definition.get("min_duration") is not None:
489
+ parsed_action["min_duration"] = action_definition["min_duration"]
490
+ if action_definition.get("max_duration") is not None:
491
+ parsed_action["max_duration"] = action_definition["max_duration"]
492
+ parsed_actions[click_type].append(parsed_action)
469
493
  continue
470
494
  _LOGGER.warning("MQTT action missing topic or message for %s", pin)
471
495
 
@@ -474,11 +498,17 @@ class Manager:
474
498
  action_output = action_definition.get("action_output")
475
499
  action_to_execute = output_actions.get(action_output.upper())
476
500
  if boneio_id and action_to_execute:
477
- parsed_actions[click_type].append({
501
+ parsed_action = {
478
502
  "action": action,
479
503
  "boneio_id": boneio_id,
480
504
  "action_output": action_output,
481
- })
505
+ }
506
+ # Copy duration thresholds for long press actions
507
+ if action_definition.get("min_duration") is not None:
508
+ parsed_action["min_duration"] = action_definition["min_duration"]
509
+ if action_definition.get("max_duration") is not None:
510
+ parsed_action["max_duration"] = action_definition["max_duration"]
511
+ parsed_actions[click_type].append(parsed_action)
482
512
  continue
483
513
  _LOGGER.warning("OUTPUT_OVER_MQTT action missing data for %s", pin)
484
514
 
@@ -487,11 +517,17 @@ class Manager:
487
517
  action_cover = action_definition.get("action_cover")
488
518
  action_to_execute = cover_actions.get(action_cover.upper())
489
519
  if boneio_id and action_to_execute:
490
- parsed_actions[click_type].append({
520
+ parsed_action = {
491
521
  "action": action,
492
522
  "boneio_id": boneio_id,
493
523
  "action_cover": action_cover,
494
- })
524
+ }
525
+ # Copy duration thresholds for long press actions
526
+ if action_definition.get("min_duration") is not None:
527
+ parsed_action["min_duration"] = action_definition["min_duration"]
528
+ if action_definition.get("max_duration") is not None:
529
+ parsed_action["max_duration"] = action_definition["max_duration"]
530
+ parsed_actions[click_type].append(parsed_action)
495
531
  continue
496
532
  _LOGGER.warning("COVER_OVER_MQTT action missing data for %s", pin)
497
533
 
@@ -501,12 +537,18 @@ class Manager:
501
537
  output_id = action_definition.get("output_id")
502
538
  action_output = action_definition.get("action_output", "TOGGLE")
503
539
  if remote_device and output_id:
504
- parsed_actions[click_type].append({
540
+ parsed_action = {
505
541
  "action": action,
506
542
  "remote_device": remote_device,
507
543
  "output_id": output_id,
508
544
  "action_output": action_output,
509
- })
545
+ }
546
+ # Copy duration thresholds for long press actions
547
+ if action_definition.get("min_duration") is not None:
548
+ parsed_action["min_duration"] = action_definition["min_duration"]
549
+ if action_definition.get("max_duration") is not None:
550
+ parsed_action["max_duration"] = action_definition["max_duration"]
551
+ parsed_actions[click_type].append(parsed_action)
510
552
  continue
511
553
  _LOGGER.warning("REMOTE_OUTPUT action missing remote_device or output_id for %s", pin)
512
554
 
@@ -517,13 +559,19 @@ class Manager:
517
559
  action_cover = action_definition.get("action_cover", "TOGGLE")
518
560
  extra_data = action_definition.get("data", {})
519
561
  if remote_device and cover_id:
520
- parsed_actions[click_type].append({
562
+ parsed_action = {
521
563
  "action": action,
522
564
  "remote_device": remote_device,
523
565
  "cover_id": cover_id,
524
566
  "action_cover": action_cover,
525
567
  "extra_data": extra_data,
526
- })
568
+ }
569
+ # Copy duration thresholds for long press actions
570
+ if action_definition.get("min_duration") is not None:
571
+ parsed_action["min_duration"] = action_definition["min_duration"]
572
+ if action_definition.get("max_duration") is not None:
573
+ parsed_action["max_duration"] = action_definition["max_duration"]
574
+ parsed_actions[click_type].append(parsed_action)
527
575
  continue
528
576
  _LOGGER.warning("REMOTE_COVER action missing remote_device or cover_id for %s", pin)
529
577
 
@@ -531,18 +579,58 @@ class Manager:
531
579
 
532
580
  async def execute_actions(
533
581
  self,
534
- actions: list
535
- ) -> None:
582
+ actions: list,
583
+ duration: float | None = None,
584
+ executed_actions: set[int] | None = None,
585
+ ) -> set[int]:
536
586
  """Execute list of actions.
537
587
 
538
588
  Args:
539
589
  actions: List of actions to execute
590
+ duration: Current duration in seconds (for long press threshold checking)
591
+ executed_actions: Set of action indices already executed (for long press)
592
+
593
+ Returns:
594
+ Set of action indices that were executed
540
595
  """
596
+ if executed_actions is None:
597
+ executed_actions = set()
541
598
 
599
+ duration_ms = (duration or 0) * 1000 # Convert to ms
542
600
 
543
601
  start_time = time.time()
544
602
 
545
- for action_definition in actions:
603
+ for idx, action_definition in enumerate(actions):
604
+ # Skip if already executed
605
+ if idx in executed_actions:
606
+ _LOGGER.debug("Action %d already executed, skipping", idx)
607
+ continue
608
+
609
+ # Check duration thresholds
610
+ min_dur = action_definition.get("min_duration") # ms
611
+ max_dur = action_definition.get("max_duration") # ms
612
+
613
+ _LOGGER.debug(
614
+ "Checking action %d: min_dur=%s, max_dur=%s, duration_ms=%.1f, executed=%s",
615
+ idx, min_dur, max_dur, duration_ms, executed_actions
616
+ )
617
+
618
+ if min_dur is not None or max_dur is not None:
619
+ # Action has duration thresholds
620
+ if min_dur is not None and duration_ms < min_dur:
621
+ _LOGGER.debug("Action %d: duration %.1fms < min_dur %dms, skipping", idx, duration_ms, min_dur)
622
+ continue # Duration too short
623
+ if max_dur is not None and duration_ms >= max_dur:
624
+ _LOGGER.debug("Action %d: duration %.1fms >= max_dur %dms, skipping", idx, duration_ms, max_dur)
625
+ continue # Duration too long
626
+ _LOGGER.debug("Action %d: duration %.1fms in range [%s, %s), executing", idx, duration_ms, min_dur, max_dur)
627
+ else:
628
+ # Action without thresholds - execute only once (on first long event)
629
+ # Check if THIS specific action was already executed, not just any action
630
+ if idx in executed_actions:
631
+ _LOGGER.debug("Action %d: no thresholds, already executed, skipping", idx)
632
+ continue
633
+ _LOGGER.debug("Action %d: no thresholds, not yet executed, executing", idx)
546
634
  action = action_definition.get("action")
547
635
 
548
636
  if action == MQTT:
@@ -610,7 +698,7 @@ class Manager:
610
698
  )
611
699
 
612
700
  elif action == REMOTE_OUTPUT:
613
- # Control output on remote device
701
+ # Control output on remote device (supports ESPHome lights with brightness/color and WLED effects)
614
702
  remote_device_id = action_definition.get("remote_device")
615
703
  output_id = action_definition.get("output_id")
616
704
  action_output = action_definition.get("action_output", "TOGGLE")
@@ -618,6 +706,14 @@ class Manager:
618
706
  device_id=remote_device_id,
619
707
  output_id=output_id,
620
708
  action=action_output,
709
+ brightness=action_definition.get("brightness"),
710
+ color_temp=action_definition.get("color_temp"),
711
+ rgb=action_definition.get("rgb"),
712
+ transition=action_definition.get("transition"),
713
+ effect=action_definition.get("effect"),
714
+ palette=action_definition.get("palette"),
715
+ effect_speed=action_definition.get("effect_speed"),
716
+ effect_intensity=action_definition.get("effect_intensity"),
621
717
  )
622
718
 
623
719
  elif action == REMOTE_COVER:
@@ -632,6 +728,11 @@ class Manager:
632
728
  action=action_cover,
633
729
  **extra_data,
634
730
  )
731
+
732
+ # Mark action as executed
733
+ executed_actions.add(idx)
734
+
735
+ return executed_actions
635
736
 
636
737
  def _reload_logger(self) -> None:
637
738
  """Reload logger configuration from config file.
@@ -647,16 +748,17 @@ class Manager:
647
748
  configure_logger(log_config, debug=0)
648
749
  _LOGGER.info("Logger configuration reloaded successfully")
649
750
 
650
- def _reload_remote_devices(self) -> None:
751
+ async def _reload_remote_devices(self) -> None:
651
752
  """Reload remote devices configuration from config file.
652
753
 
653
754
  This allows hot-reloading of remote devices without restarting the application.
755
+ Handles ESPHome connections properly (stops old, starts new).
654
756
  """
655
757
  config = self._config_helper.get_config()
656
758
  remote_devices_config = config.get("remote_devices", [])
657
759
 
658
760
  _LOGGER.info("Reloading remote devices configuration")
659
- self.remote_devices.reload(remote_devices_config)
761
+ await self.remote_devices.reload(remote_devices_config)
660
762
  _LOGGER.info("Remote devices configuration reloaded successfully")
661
763
 
662
764
  async def publish_discovery(self) -> None: