boneIO 1.1.0.dev1__tar.gz → 1.1.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 (413) hide show
  1. {boneio-1.1.0.dev1/boneio.egg-info → boneio-1.1.0.dev2}/PKG-INFO +1 -1
  2. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/detectors.py +70 -5
  3. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/inputs.py +43 -2
  4. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/manager.py +112 -19
  5. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/remote.py +44 -1
  6. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/homeassistant.py +12 -3
  7. boneio-1.1.0.dev2/boneio/version.py +2 -0
  8. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/cssMode-jm8BgQUG.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/cssMode-Ca1DAf9-.js +1 -1
  9. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/freemarker2-Dp0Xzx1I.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/freemarker2-C5IgNKwL.js +1 -1
  10. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/handlebars-DI4hd1VE.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/handlebars-coN2SbcA.js +1 -1
  11. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/html-CqpC7ec2.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/html-DauOMz0u.js +1 -1
  12. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/htmlMode-Cgw0dxSz.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/htmlMode-CmodurAE.js +1 -1
  13. boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/index-BGHXdp7U.css +1 -0
  14. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-fvCxV9EK.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/index-CeFOvpPM.js +191 -191
  15. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/javascript-BW9tlink.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/javascript-N6k9oxRy.js +1 -1
  16. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/jsonMode-BEG4tw2F.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/jsonMode-DCkYHItT.js +1 -1
  17. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/liquid-xHiYCVBL.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/liquid-CuYEfgul.js +1 -1
  18. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/mdx-DBRAmEVg.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/mdx-DEiUIP8w.js +1 -1
  19. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/python-DdjAUqQp.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/python-DBpf3_HZ.js +1 -1
  20. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/razor-CVHTFNOs.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/razor-S1P72cEP.js +1 -1
  21. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/tsMode-DR-WSiIu.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/tsMode-A2L2Jxa9.js +1 -1
  22. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/typescript-ljc143Ju.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/typescript-CupJHRfY.js +1 -1
  23. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/xml-B6zOV41n.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/xml-DDPTy55c.js +1 -1
  24. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/yaml-C4f2eVhb.js → boneio-1.1.0.dev2/boneio/webui/frontend-dist/assets/yaml-CuImUjrc.js +1 -1
  25. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/index.html +2 -2
  26. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/config.schema.json +8 -8
  27. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +4 -4
  28. {boneio-1.1.0.dev1/boneio/webui/schema → boneio-1.1.0.dev2/boneio/webui/frontend-dist/schem}/web.schema.json +4 -4
  29. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/remote_devices.py +34 -0
  30. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/config.schema.json +8 -8
  31. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/modbus_devices.schema.json +4 -4
  32. {boneio-1.1.0.dev1/boneio/webui/frontend-dist/schem → boneio-1.1.0.dev2/boneio/webui/schema}/web.schema.json +4 -4
  33. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2/boneio.egg-info}/PKG-INFO +1 -1
  34. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/SOURCES.txt +17 -17
  35. boneio-1.1.0.dev1/boneio/version.py +0 -2
  36. boneio-1.1.0.dev1/boneio/webui/frontend-dist/assets/index-Dxd5huyV.css +0 -1
  37. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/LICENSE +0 -0
  38. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/MANIFEST.in +0 -0
  39. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/README.md +0 -0
  40. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/__init__.py +0 -0
  41. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/input.yaml +0 -0
  42. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_24_16.yaml +0 -0
  43. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_32_10.yaml +0 -0
  44. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_32_5.yaml +0 -0
  45. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_cover.yaml +0 -0
  46. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  47. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/input.yaml +0 -0
  48. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_24_16.yaml +0 -0
  49. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_32_10.yaml +0 -0
  50. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_32_5.yaml +0 -0
  51. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_cover.yaml +0 -0
  52. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  53. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/input.yaml +0 -0
  54. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_24_16.yaml +0 -0
  55. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_32_10.yaml +0 -0
  56. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_32_5.yaml +0 -0
  57. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_cover.yaml +0 -0
  58. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  59. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/input.yaml +0 -0
  60. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_24_16.yaml +0 -0
  61. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_32_10.yaml +0 -0
  62. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_cover.yaml +0 -0
  63. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  64. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/input.yaml +0 -0
  65. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_24_16.yaml +0 -0
  66. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_32_10.yaml +0 -0
  67. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_cover.yaml +0 -0
  68. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  69. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/input.yaml +0 -0
  70. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_24_16.yaml +0 -0
  71. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_32_10.yaml +0 -0
  72. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_cover.yaml +0 -0
  73. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  74. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/input.yaml +0 -0
  75. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_24_16.yaml +0 -0
  76. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_32_10.yaml +0 -0
  77. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_cover.yaml +0 -0
  78. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  79. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/bonecli.py +0 -0
  80. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/__init__.py +0 -0
  81. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/__init__.py +0 -0
  82. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/cover.py +0 -0
  83. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/previous.py +0 -0
  84. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/time_based.py +0 -0
  85. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/cover/venetian.py +0 -0
  86. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/group/__init__.py +0 -0
  87. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/group/output_group.py +0 -0
  88. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/__init__.py +0 -0
  89. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/binary_sensor.py +0 -0
  90. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/input/event.py +0 -0
  91. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/__init__.py +0 -0
  92. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/basic.py +0 -0
  93. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/mcp.py +0 -0
  94. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/pca.py +0 -0
  95. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/output/pcf.py +0 -0
  96. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/sensor/__init__.py +0 -0
  97. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/components/sensor/virtual_energy.py +0 -0
  98. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/const.py +0 -0
  99. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/__init__.py +0 -0
  100. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/__init__.py +0 -0
  101. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/config_helper.py +0 -0
  102. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/package-lock.json +0 -0
  103. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/package.json +0 -0
  104. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/schema_converter.py +0 -0
  105. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/config/yaml_util.py +0 -0
  106. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/discovery.py +0 -0
  107. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/events/__init__.py +0 -0
  108. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/events/bus.py +0 -0
  109. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/__init__.py +0 -0
  110. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/covers.py +0 -0
  111. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/display.py +0 -0
  112. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/modbus.py +0 -0
  113. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/outputs.py +0 -0
  114. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/manager/sensors.py +0 -0
  115. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/__init__.py +0 -0
  116. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/basic.py +0 -0
  117. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/basic_mqtt.py +0 -0
  118. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/local.py +0 -0
  119. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/mqtt.py +0 -0
  120. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/messaging/queue.py +0 -0
  121. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/__init__.py +0 -0
  122. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/base.py +0 -0
  123. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/esphome.py +0 -0
  124. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/remote/mqtt.py +0 -0
  125. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/__init__.py +0 -0
  126. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/base.py +0 -0
  127. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/sensor/system.py +0 -0
  128. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/state/__init__.py +0 -0
  129. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/state/manager.py +0 -0
  130. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/__init__.py +0 -0
  131. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/host_data.py +0 -0
  132. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/system/monitor.py +0 -0
  133. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/__init__.py +0 -0
  134. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/async_updater.py +0 -0
  135. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/filter.py +0 -0
  136. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/font_util.py +0 -0
  137. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/logger.py +0 -0
  138. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/timeperiod.py +0 -0
  139. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/core/utils/util.py +0 -0
  140. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/adc.yaml +0 -0
  141. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  142. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/config.yaml +0 -0
  143. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/event.yaml +0 -0
  144. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/mqtt.yaml +0 -0
  145. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  146. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/adc.yaml +0 -0
  147. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  148. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/config.yaml +0 -0
  149. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/event.yaml +0 -0
  150. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/mqtt.yaml +0 -0
  151. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  152. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/__init__.py +0 -0
  153. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/adc.yaml +0 -0
  154. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  155. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/config.yaml +0 -0
  156. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/cover.yaml +0 -0
  157. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/event.yaml +0 -0
  158. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/mqtt.yaml +0 -0
  159. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover/outputCover.yaml +0 -0
  160. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/adc.yaml +0 -0
  161. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  162. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/config.yaml +0 -0
  163. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/cover.yaml +0 -0
  164. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/event.yaml +0 -0
  165. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  166. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  167. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/adc.yaml +0 -0
  168. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  169. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  170. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  171. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  172. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/event_all.yaml +0 -0
  173. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  174. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  175. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  176. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  177. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  178. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  179. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/exceptions.py +0 -0
  180. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/__init__.py +0 -0
  181. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/analog/__init__.py +0 -0
  182. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/analog/adc.py +0 -0
  183. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/__init__.py +0 -0
  184. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  185. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/display/oled.py +0 -0
  186. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/__init__.py +0 -0
  187. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  188. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  189. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  190. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  191. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/__init__.py +0 -0
  192. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/base.py +0 -0
  193. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/gpio/input/manager.py +0 -0
  194. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/__init__.py +0 -0
  195. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/bus.py +0 -0
  196. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/ina219.py +0 -0
  197. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/ina219_driver.py +0 -0
  198. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/mcp9808.py +0 -0
  199. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/i2c/pct2075.py +0 -0
  200. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/__init__.py +0 -0
  201. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/bus.py +0 -0
  202. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/dallas.py +0 -0
  203. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/onewire/ds2482.py +0 -0
  204. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/__init__.py +0 -0
  205. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  206. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/base.py +0 -0
  207. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  208. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  209. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/__init__.py +0 -0
  210. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/integration/interlock.py +0 -0
  211. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/__init__.py +0 -0
  212. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/cli.py +0 -0
  213. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/client.py +0 -0
  214. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/coordinator.py +0 -0
  215. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/__init__.py +0 -0
  216. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  217. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  218. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  219. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  220. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  221. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  222. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  223. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/inverters/sofar.json +0 -0
  224. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/inverters/thessla.json +0 -0
  225. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  226. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/other/wanas415.json +0 -0
  227. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/cwt.json +0 -0
  228. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  229. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  230. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  231. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/pt100.json +0 -0
  232. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/sht20.json +0 -0
  233. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/devices/sensors/sht30.json +0 -0
  234. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/__init__.py +0 -0
  235. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/base.py +0 -0
  236. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/__init__.py +0 -0
  237. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/numeric.py +0 -0
  238. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/select.py +0 -0
  239. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/switch.py +0 -0
  240. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/derived/text.py +0 -0
  241. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/__init__.py +0 -0
  242. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/binary.py +0 -0
  243. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/numeric.py +0 -0
  244. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/sensor/text.py +0 -0
  245. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/__init__.py +0 -0
  246. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/binary.py +0 -0
  247. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/entities/writeable/numeric.py +0 -0
  248. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/modbus/utils.py +0 -0
  249. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/__init__.py +0 -0
  250. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/actions.py +0 -0
  251. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/events.py +0 -0
  252. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/files.py +0 -0
  253. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/logs.py +0 -0
  254. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/mqtt.py +0 -0
  255. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/models/state.py +0 -0
  256. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/runner.py +0 -0
  257. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions.yaml +0 -0
  258. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions_sensor.yaml +0 -0
  259. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/actions_switch.yaml +0 -0
  260. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/filters.yaml +0 -0
  261. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/filters_adc.yaml +0 -0
  262. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/id.yaml +0 -0
  263. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/remote_devices.yaml +0 -0
  264. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/schema.yaml +0 -0
  265. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/temp_unit.yaml +0 -0
  266. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/schema/update_interval.yaml +0 -0
  267. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/app.py +0 -0
  268. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  269. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  270. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  271. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  272. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  273. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  274. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  275. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  276. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  277. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  278. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  279. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  280. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  281. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  282. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  283. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  284. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  285. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -0
  286. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  287. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  288. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  289. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  290. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  291. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  292. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  293. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  294. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/json.worker-DaRII17c.js +0 -0
  295. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  296. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  297. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  298. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  299. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  300. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  301. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  302. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  303. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  304. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  305. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  306. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  307. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  308. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  309. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  310. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  311. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  312. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  313. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  314. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  315. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  316. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  317. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  318. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  319. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  320. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  321. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  322. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  323. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  324. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  325. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  326. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  327. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  328. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  329. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  330. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  331. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  332. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  333. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  334. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  335. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  336. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  337. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  338. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  339. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  340. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  341. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/assets/yaml.worker-BTE-_K6g.js +0 -0
  342. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/boneio.svg +0 -0
  343. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  344. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/adc.schema.json +0 -0
  345. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
  346. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +0 -0
  347. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/boneio.schema.json +0 -0
  348. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/cover.schema.json +0 -0
  349. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  350. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
  351. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/event.schema.json +0 -0
  352. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/ina219.schema.json +0 -0
  353. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/lm75.schema.json +0 -0
  354. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  355. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +0 -0
  356. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +0 -0
  357. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/modbus.schema.json +0 -0
  358. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/mqtt.schema.json +0 -0
  359. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/oled.schema.json +0 -0
  360. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/output.schema.json +0 -0
  361. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
  362. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/pca9685.schema.json +0 -0
  363. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +0 -0
  364. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +0 -0
  365. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/sensor.schema.json +0 -0
  366. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
  367. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/middleware/__init__.py +0 -0
  368. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/middleware/auth.py +0 -0
  369. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/__init__.py +0 -0
  370. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/auth.py +0 -0
  371. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/caddy.py +0 -0
  372. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/config.py +0 -0
  373. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/covers.py +0 -0
  374. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/modbus.py +0 -0
  375. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/outputs.py +0 -0
  376. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/sensors.py +0 -0
  377. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/system.py +0 -0
  378. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/routes/update.py +0 -0
  379. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/adc.schema.json +0 -0
  380. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/areas.schema.json +0 -0
  381. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  382. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/boneio.schema.json +0 -0
  383. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/cover.schema.json +0 -0
  384. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/dallas.schema.json +0 -0
  385. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/ds2482.schema.json +0 -0
  386. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/event.schema.json +0 -0
  387. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/ina219.schema.json +0 -0
  388. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/lm75.schema.json +0 -0
  389. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/logger.schema.json +0 -0
  390. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mcp23017.schema.json +0 -0
  391. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mcp9808.schema.json +0 -0
  392. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/modbus.schema.json +0 -0
  393. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/mqtt.schema.json +0 -0
  394. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/oled.schema.json +0 -0
  395. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/output.schema.json +0 -0
  396. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/output_group.schema.json +0 -0
  397. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/pca9685.schema.json +0 -0
  398. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/pcf8575.schema.json +0 -0
  399. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/remote_devices.schema.json +0 -0
  400. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/sensor.schema.json +0 -0
  401. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  402. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/services/__init__.py +0 -0
  403. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/services/logs.py +0 -0
  404. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/web_server.py +0 -0
  405. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio/webui/websocket_manager.py +0 -0
  406. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/dependency_links.txt +0 -0
  407. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/entry_points.txt +0 -0
  408. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/requires.txt +0 -0
  409. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/boneio.egg-info/top_level.txt +0 -0
  410. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/pyproject.toml +0 -0
  411. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/setup.cfg +0 -0
  412. {boneio-1.1.0.dev1 → boneio-1.1.0.dev2}/setup.py +0 -0
  413. {boneio-1.1.0.dev1 → boneio-1.1.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.1.0.dev1
3
+ Version: 1.1.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
@@ -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:
@@ -632,6 +720,11 @@ class Manager:
632
720
  action=action_cover,
633
721
  **extra_data,
634
722
  )
723
+
724
+ # Mark action as executed
725
+ executed_actions.add(idx)
726
+
727
+ return executed_actions
635
728
 
636
729
  def _reload_logger(self) -> None:
637
730
  """Reload logger configuration from config file.
@@ -670,7 +670,10 @@ class RemoteDeviceManager:
670
670
  )
671
671
 
672
672
  def _remove_autodiscovered_device(self, device_id: str) -> None:
673
- """Remove autodiscovered device.
673
+ """Remove autodiscovered device from memory only.
674
+
675
+ This is called when receiving empty discovery payload.
676
+ Does NOT clear MQTT retained messages.
674
677
 
675
678
  Args:
676
679
  device_id: Device ID to remove
@@ -679,6 +682,46 @@ class RemoteDeviceManager:
679
682
  del self._autodiscovered_devices[device_id]
680
683
  _LOGGER.info("Removed autodiscovered device: %s", device_id)
681
684
 
685
+ def remove_autodiscovered_device_from_mqtt(self, device_id: str) -> None:
686
+ """Remove autodiscovered device and clear MQTT retained messages.
687
+
688
+ This sends empty payloads to all discovery topics for the device,
689
+ which clears retained messages from MQTT broker.
690
+
691
+ Args:
692
+ device_id: Device ID to remove
693
+ """
694
+ if not self._message_bus:
695
+ _LOGGER.error("Cannot remove device from MQTT - message_bus not set")
696
+ return
697
+
698
+ # List of all discovery subtopics
699
+ discovery_subtopics = [
700
+ "device",
701
+ "outputs",
702
+ "covers",
703
+ "inputs",
704
+ "sensors",
705
+ "modbus",
706
+ ]
707
+
708
+ # Send empty payload to each discovery topic to clear retained messages
709
+ for subtopic in discovery_subtopics:
710
+ topic = f"{DISCOVERY_TOPIC_PREFIX}/{device_id}/{DISCOVERY_SUBTOPIC}/{subtopic}"
711
+ self._message_bus.send_message(
712
+ topic=topic,
713
+ payload=None, # Empty payload clears retained message
714
+ retain=True,
715
+ )
716
+ _LOGGER.debug("Cleared MQTT retained message for %s", topic)
717
+
718
+ # Remove from memory
719
+ if device_id in self._autodiscovered_devices:
720
+ del self._autodiscovered_devices[device_id]
721
+ _LOGGER.info("Removed autodiscovered device from MQTT and memory: %s", device_id)
722
+ else:
723
+ _LOGGER.warning("Device %s not in autodiscovered list, but cleared MQTT messages", device_id)
724
+
682
725
  def get_autodiscovered_device(self, device_id: str) -> MQTTRemoteDevice | None:
683
726
  """Get autodiscovered device by ID.
684
727
 
@@ -452,6 +452,9 @@ def modbus_sensor_availabilty_message(
452
452
  """
453
453
  topic = config_helper.topic_prefix
454
454
 
455
+ # Remove entity_id from kwargs to avoid conflict
456
+ kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
457
+
455
458
  # Use base ha_availabilty_message and override modbus-specific fields
456
459
  msg = ha_availabilty_message(
457
460
  id=entity_id,
@@ -464,7 +467,7 @@ def modbus_sensor_availabilty_message(
464
467
  manufacturer=manufacturer,
465
468
  model=model,
466
469
  area=area,
467
- **kwargs,
470
+ **kwargs_filtered,
468
471
  )
469
472
 
470
473
  # Override with modbus-specific values
@@ -511,6 +514,9 @@ def modbus_select_availabilty_message(
511
514
  """
512
515
  topic = config_helper.topic_prefix
513
516
 
517
+ # Remove entity_id from kwargs to avoid conflict
518
+ kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
519
+
514
520
  # Use base ha_availabilty_message and override modbus-specific fields
515
521
  msg = ha_availabilty_message(
516
522
  id=entity_id,
@@ -523,7 +529,7 @@ def modbus_select_availabilty_message(
523
529
  manufacturer=manufacturer,
524
530
  model=model,
525
531
  area=area,
526
- **kwargs,
532
+ **kwargs_filtered,
527
533
  )
528
534
 
529
535
  # Override with modbus-specific values
@@ -570,6 +576,9 @@ def modbus_numeric_availabilty_message(
570
576
  """
571
577
  topic = config_helper.topic_prefix
572
578
 
579
+ # Remove entity_id from kwargs to avoid conflict
580
+ kwargs_filtered = {k: v for k, v in kwargs.items() if k != 'entity_id'}
581
+
573
582
  # Use base ha_availabilty_message and override modbus-specific fields
574
583
  msg = ha_availabilty_message(
575
584
  id=entity_id,
@@ -582,7 +591,7 @@ def modbus_numeric_availabilty_message(
582
591
  manufacturer=manufacturer,
583
592
  model=model,
584
593
  area=area,
585
- **kwargs,
594
+ **kwargs_filtered,
586
595
  )
587
596
 
588
597
  # Override with modbus-specific values
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.1.0dev2"