boneIO 1.2.0.dev14__tar.gz → 1.2.0.dev17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. {boneio-1.2.0.dev14/boneio.egg-info → boneio-1.2.0.dev17}/PKG-INFO +1 -1
  2. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/cover/cover.py +10 -3
  3. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/migrations/v2_transition.py +23 -8
  4. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/yaml_util.py +20 -5
  5. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/events/bus.py +1 -0
  6. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/inputs.py +6 -1
  7. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/modbus.py +11 -1
  8. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/templates/__init__.py +15 -2
  9. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/remote/esphome.py +40 -4
  10. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/client.py +41 -10
  11. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/coordinator.py +37 -13
  12. boneio-1.2.0.dev17/boneio/modbus/devices/sensors/boneio-edge-temp.json +50 -0
  13. boneio-1.2.0.dev17/boneio/modbus/devices/sensors/gdfs.json +35 -0
  14. boneio-1.2.0.dev17/boneio/modbus/devices/sensors/gdfx.json +41 -0
  15. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/actions.yaml +2 -0
  16. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/schema.yaml +14 -0
  17. boneio-1.2.0.dev17/boneio/version.py +2 -0
  18. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/app.py +2 -0
  19. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/cssMode-DiRdRTjn.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/cssMode-DDcbtjMv.js +1 -1
  20. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/freemarker2-My492RbD.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/freemarker2-DKdwGGQd.js +1 -1
  21. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/handlebars-Bn2yjOuB.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/handlebars-CanQjBCY.js +1 -1
  22. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/html-C3Dn1bP6.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/html-BIqxJPif.js +1 -1
  23. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/htmlMode-C-CVJWpp.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/htmlMode-Da-qVQJp.js +1 -1
  24. boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/index-BkP1mrhT.css +1 -0
  25. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/index-Cgrn-IcO.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/index-DUHOddeW.js +227 -227
  26. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/javascript-Bt1XPvUb.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/javascript-D2sCfnfc.js +1 -1
  27. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/jsonMode-D-kv5mDr.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/jsonMode-NoTCqaf3.js +1 -1
  28. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/liquid-BAT5-2C3.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/liquid-CZ8xXWlF.js +1 -1
  29. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/mdx-Dr8eK8pD.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/mdx-BMmV_pXf.js +1 -1
  30. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/python-B-3qWZ1F.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/python-Cho18ADd.js +1 -1
  31. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/razor-4_yKrual.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/razor-CB8kkVEZ.js +1 -1
  32. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/tsMode-R_hQmMR5.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/tsMode-B6P_cxMO.js +1 -1
  33. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/typescript-BUdJWLyj.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/typescript-DJ4c4LAD.js +1 -1
  34. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/xml-Q501Nx8r.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/xml-DYlBjxVe.js +1 -1
  35. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/yaml-C2ne9Q3j.js → boneio-1.2.0.dev17/boneio/webui/frontend-dist/assets/yaml-BST1bCmo.js +1 -1
  36. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/index.html +2 -2
  37. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/config.schema.json +22 -0
  38. {boneio-1.2.0.dev14/boneio/webui → boneio-1.2.0.dev17/boneio/webui/frontend-dist}/schema/modbus.schema.json +10 -0
  39. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/modbus_devices.schema.json +12 -0
  40. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/sw.js +1 -1
  41. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/config.py +75 -1
  42. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/modbus.py +50 -0
  43. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/sensors.py +17 -0
  44. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/tools.py +74 -2
  45. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/config.schema.json +22 -0
  46. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/schema}/modbus.schema.json +10 -0
  47. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/modbus_devices.schema.json +12 -0
  48. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17/boneio.egg-info}/PKG-INFO +1 -1
  49. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio.egg-info/SOURCES.txt +47 -44
  50. boneio-1.2.0.dev14/boneio/version.py +0 -2
  51. boneio-1.2.0.dev14/boneio/webui/frontend-dist/assets/index-CgzBI1Pg.css +0 -1
  52. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/LICENSE +0 -0
  53. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/MANIFEST.in +0 -0
  54. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/README.md +0 -0
  55. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/__init__.py +0 -0
  56. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/input.yaml +0 -0
  57. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/output_24_16.yaml +0 -0
  58. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/output_32_10.yaml +0 -0
  59. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/output_32_5.yaml +0 -0
  60. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/output_cover.yaml +0 -0
  61. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  62. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/input.yaml +0 -0
  63. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/output_24_16.yaml +0 -0
  64. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/output_32_10.yaml +0 -0
  65. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/output_32_5.yaml +0 -0
  66. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/output_cover.yaml +0 -0
  67. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  68. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/input.yaml +0 -0
  69. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/output_24_16.yaml +0 -0
  70. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/output_32_10.yaml +0 -0
  71. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/output_32_5.yaml +0 -0
  72. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/output_cover.yaml +0 -0
  73. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  74. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.5/input.yaml +0 -0
  75. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.5/output_24_16.yaml +0 -0
  76. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.5/output_32_10.yaml +0 -0
  77. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.5/output_cover.yaml +0 -0
  78. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  79. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.6/input.yaml +0 -0
  80. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.6/output_24_16.yaml +0 -0
  81. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.6/output_32_10.yaml +0 -0
  82. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.6/output_cover.yaml +0 -0
  83. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  84. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.7/input.yaml +0 -0
  85. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.7/output_24_16.yaml +0 -0
  86. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.7/output_32_10.yaml +0 -0
  87. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.7/output_cover.yaml +0 -0
  88. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  89. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.8/input.yaml +0 -0
  90. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.8/output_24_16.yaml +0 -0
  91. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.8/output_32_10.yaml +0 -0
  92. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.8/output_cover.yaml +0 -0
  93. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  94. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/bonecli.py +0 -0
  95. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/__init__.py +0 -0
  96. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/cover/__init__.py +0 -0
  97. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/cover/previous.py +0 -0
  98. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/cover/time_based.py +0 -0
  99. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/cover/venetian.py +0 -0
  100. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/group/__init__.py +0 -0
  101. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/group/output_group.py +0 -0
  102. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/input/__init__.py +0 -0
  103. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/input/binary_sensor.py +0 -0
  104. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/input/detectors.py +0 -0
  105. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/input/event.py +0 -0
  106. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/output/__init__.py +0 -0
  107. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/output/basic.py +0 -0
  108. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/output/mcp.py +0 -0
  109. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/output/pca.py +0 -0
  110. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/output/pcf.py +0 -0
  111. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/sensor/__init__.py +0 -0
  112. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/sensor/virtual_energy.py +0 -0
  113. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/template/__init__.py +0 -0
  114. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/template/alarm_panel.py +0 -0
  115. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/template/gate_cover.py +0 -0
  116. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/components/template/thermostat.py +0 -0
  117. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/const.py +0 -0
  118. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/__init__.py +0 -0
  119. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/__init__.py +0 -0
  120. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/data/__init__.py +0 -0
  121. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  122. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  123. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  124. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/registration.py +0 -0
  125. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/cloud/secrets.py +0 -0
  126. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/__init__.py +0 -0
  127. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/config_helper.py +0 -0
  128. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/migrations/__init__.py +0 -0
  129. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  130. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/package-lock.json +0 -0
  131. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/package.json +0 -0
  132. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/config/schema_converter.py +0 -0
  133. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/discovery.py +0 -0
  134. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/events/__init__.py +0 -0
  135. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/__init__.py +0 -0
  136. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/covers.py +0 -0
  137. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/display.py +0 -0
  138. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/manager.py +0 -0
  139. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/outputs.py +0 -0
  140. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/remote.py +0 -0
  141. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/sensors.py +0 -0
  142. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/templates/alarm.py +0 -0
  143. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/templates/gate_cover.py +0 -0
  144. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/templates/thermostat.py +0 -0
  145. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/templates.py +0 -0
  146. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/manager/update.py +0 -0
  147. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/__init__.py +0 -0
  148. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/basic.py +0 -0
  149. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/basic_mqtt.py +0 -0
  150. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/local.py +0 -0
  151. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/mqtt.py +0 -0
  152. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/messaging/queue.py +0 -0
  153. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/remote/__init__.py +0 -0
  154. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/remote/base.py +0 -0
  155. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/remote/mqtt.py +0 -0
  156. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/remote/wled.py +0 -0
  157. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/sensor/__init__.py +0 -0
  158. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/sensor/base.py +0 -0
  159. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/sensor/system.py +0 -0
  160. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/state/__init__.py +0 -0
  161. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/state/manager.py +0 -0
  162. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/system/__init__.py +0 -0
  163. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/system/host_data.py +0 -0
  164. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/system/monitor.py +0 -0
  165. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/__init__.py +0 -0
  166. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/async_updater.py +0 -0
  167. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/filter.py +0 -0
  168. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/font_util.py +0 -0
  169. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/logger.py +0 -0
  170. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/timeperiod.py +0 -0
  171. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/core/utils/util.py +0 -0
  172. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/adc.yaml +0 -0
  173. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  174. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/config.yaml +0 -0
  175. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/event.yaml +0 -0
  176. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/mqtt.yaml +0 -0
  177. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  178. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/adc.yaml +0 -0
  179. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  180. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/config.yaml +0 -0
  181. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/event.yaml +0 -0
  182. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/mqtt.yaml +0 -0
  183. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  184. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/__init__.py +0 -0
  185. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/adc.yaml +0 -0
  186. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  187. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/config.yaml +0 -0
  188. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/cover.yaml +0 -0
  189. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/event.yaml +0 -0
  190. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/mqtt.yaml +0 -0
  191. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover/outputCover.yaml +0 -0
  192. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/adc.yaml +0 -0
  193. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  194. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/config.yaml +0 -0
  195. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/cover.yaml +0 -0
  196. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/event.yaml +0 -0
  197. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  198. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  199. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/adc.yaml +0 -0
  200. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  201. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  202. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  203. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  204. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/event_all.yaml +0 -0
  205. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  206. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  207. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  208. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  209. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  210. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  211. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/exceptions.py +0 -0
  212. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/__init__.py +0 -0
  213. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/analog/__init__.py +0 -0
  214. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/analog/adc.py +0 -0
  215. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/display/__init__.py +0 -0
  216. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  217. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/display/oled.py +0 -0
  218. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/__init__.py +0 -0
  219. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  220. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  221. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  222. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  223. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/input/__init__.py +0 -0
  224. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/input/base.py +0 -0
  225. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/gpio/input/manager.py +0 -0
  226. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/__init__.py +0 -0
  227. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/bus.py +0 -0
  228. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/ina219.py +0 -0
  229. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/ina219_driver.py +0 -0
  230. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/mcp9808.py +0 -0
  231. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/i2c/pct2075.py +0 -0
  232. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/onewire/__init__.py +0 -0
  233. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/onewire/bus.py +0 -0
  234. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/onewire/dallas.py +0 -0
  235. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/onewire/ds2482.py +0 -0
  236. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/sensor/__init__.py +0 -0
  237. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  238. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/sensor/temperature/base.py +0 -0
  239. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  240. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  241. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/integration/__init__.py +0 -0
  242. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/integration/homeassistant.py +0 -0
  243. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/integration/interlock.py +0 -0
  244. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/__init__.py +0 -0
  245. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/cli.py +0 -0
  246. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/__init__.py +0 -0
  247. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  248. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  249. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  250. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  251. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  252. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  253. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  254. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  255. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  256. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/inverters/sofar.json +0 -0
  257. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/inverters/thessla.json +0 -0
  258. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  259. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  260. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/other/wanas415.json +0 -0
  261. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/cwt.json +0 -0
  262. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  263. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  264. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  265. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/pt100.json +0 -0
  266. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/sht20.json +0 -0
  267. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/devices/sensors/sht30.json +0 -0
  268. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/__init__.py +0 -0
  269. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/base.py +0 -0
  270. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/derived/__init__.py +0 -0
  271. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/derived/numeric.py +0 -0
  272. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/derived/select.py +0 -0
  273. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/derived/switch.py +0 -0
  274. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/derived/text.py +0 -0
  275. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/sensor/__init__.py +0 -0
  276. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/sensor/binary.py +0 -0
  277. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/sensor/numeric.py +0 -0
  278. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/sensor/text.py +0 -0
  279. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/writeable/__init__.py +0 -0
  280. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/writeable/binary.py +0 -0
  281. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/entities/writeable/numeric.py +0 -0
  282. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/modbus/utils.py +0 -0
  283. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/__init__.py +0 -0
  284. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/actions.py +0 -0
  285. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/events.py +0 -0
  286. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/files.py +0 -0
  287. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/logs.py +0 -0
  288. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/mqtt.py +0 -0
  289. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/models/state.py +0 -0
  290. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/runner.py +0 -0
  291. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/actions_sensor.yaml +0 -0
  292. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/actions_switch.yaml +0 -0
  293. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/filters.yaml +0 -0
  294. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/filters_adc.yaml +0 -0
  295. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/id.yaml +0 -0
  296. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/remote_devices.yaml +0 -0
  297. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/temp_unit.yaml +0 -0
  298. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/schema/update_interval.yaml +0 -0
  299. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  300. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  301. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  302. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  303. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  304. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  305. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  306. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  307. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  308. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  309. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  310. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  311. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  312. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  313. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  314. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  315. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  316. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
  317. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  318. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  319. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  320. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  321. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  322. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  323. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  324. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  325. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
  326. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  327. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  328. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  329. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  330. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  331. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  332. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  333. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  334. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  335. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  336. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  337. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  338. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  339. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  340. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  341. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  342. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  343. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  344. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  345. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  346. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  347. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  348. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  349. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  350. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  351. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  352. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  353. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  354. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  355. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  356. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  357. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  358. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  359. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  360. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  361. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  362. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  363. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  364. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  365. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  366. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  367. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  368. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  369. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  370. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  371. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  372. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
  373. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
  374. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  375. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  376. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/boneio.svg +0 -0
  377. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  378. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/adc.schema.json +0 -0
  379. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/areas.schema.json +0 -0
  380. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/binary_sensor.schema.json +0 -0
  381. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/boneio.schema.json +0 -0
  382. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/cover.schema.json +0 -0
  383. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/dallas.schema.json +0 -0
  384. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/ds2482.schema.json +0 -0
  385. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/event.schema.json +0 -0
  386. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/ina219.schema.json +0 -0
  387. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/lm75.schema.json +0 -0
  388. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/logger.schema.json +0 -0
  389. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/mcp23017.schema.json +0 -0
  390. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/mcp9808.schema.json +0 -0
  391. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/mqtt.schema.json +0 -0
  392. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/oled.schema.json +0 -0
  393. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/output.schema.json +0 -0
  394. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/output_group.schema.json +0 -0
  395. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/pca9685.schema.json +0 -0
  396. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/pcf8575.schema.json +0 -0
  397. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/remote_devices.schema.json +0 -0
  398. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/sensor.schema.json +0 -0
  399. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/template.schema.json +0 -0
  400. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/virtual_energy_sensor.schema.json +0 -0
  401. {boneio-1.2.0.dev14/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev17/boneio/webui/frontend-dist/schema}/web.schema.json +0 -0
  402. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
  403. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/middleware/__init__.py +0 -0
  404. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/middleware/auth.py +0 -0
  405. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/__init__.py +0 -0
  406. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/auth.py +0 -0
  407. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/caddy.py +0 -0
  408. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/covers.py +0 -0
  409. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/outputs.py +0 -0
  410. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/remote_devices.py +0 -0
  411. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/system.py +0 -0
  412. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/templates.py +0 -0
  413. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/routes/update.py +0 -0
  414. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/adc.schema.json +0 -0
  415. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/areas.schema.json +0 -0
  416. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  417. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/boneio.schema.json +0 -0
  418. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/cover.schema.json +0 -0
  419. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/dallas.schema.json +0 -0
  420. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/ds2482.schema.json +0 -0
  421. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/event.schema.json +0 -0
  422. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/ina219.schema.json +0 -0
  423. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/lm75.schema.json +0 -0
  424. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/logger.schema.json +0 -0
  425. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/mcp23017.schema.json +0 -0
  426. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/mcp9808.schema.json +0 -0
  427. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/mqtt.schema.json +0 -0
  428. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/oled.schema.json +0 -0
  429. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/output.schema.json +0 -0
  430. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/output_group.schema.json +0 -0
  431. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/pca9685.schema.json +0 -0
  432. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/pcf8575.schema.json +0 -0
  433. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/remote_devices.schema.json +0 -0
  434. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/sensor.schema.json +0 -0
  435. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/template.schema.json +0 -0
  436. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  437. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/schema/web.schema.json +0 -0
  438. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/services/__init__.py +0 -0
  439. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/services/logs.py +0 -0
  440. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/web_server.py +0 -0
  441. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio/webui/websocket_manager.py +0 -0
  442. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio.egg-info/dependency_links.txt +0 -0
  443. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio.egg-info/entry_points.txt +0 -0
  444. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio.egg-info/requires.txt +0 -0
  445. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/boneio.egg-info/top_level.txt +0 -0
  446. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/pyproject.toml +0 -0
  447. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/setup.cfg +0 -0
  448. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/setup.py +0 -0
  449. {boneio-1.2.0.dev14 → boneio-1.2.0.dev17}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.2.0.dev14
3
+ Version: 1.2.0.dev17
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
@@ -171,6 +171,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
171
171
  self._position = position
172
172
  self._initial_position = None
173
173
  self._current_operation = IDLE
174
+ self._last_operation = CLOSING
174
175
  _LOGGER.debug(
175
176
  "BaseCover %s initialized: open_time=%dms, close_time=%dms, initial_position=%d%%",
176
177
  id, self._open_time, self._close_time, position
@@ -207,6 +208,8 @@ class BaseCover(BaseCoverABC, BasicMqtt):
207
208
  # Send relay states to WebSocket (not MQTT - that's handled by output_type check)
208
209
  asyncio.create_task(self._open_relay.async_send_state())
209
210
  asyncio.create_task(self._close_relay.async_send_state())
211
+ if self._current_operation in (OPENING, CLOSING):
212
+ self._last_operation = self._current_operation
210
213
  self._current_operation = IDLE
211
214
  if not on_exit:
212
215
  self.send_state(self.state, self.json_position)
@@ -219,6 +222,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
219
222
  "Opening cover %s from position %d%%. Estimated time: %.1fs (open_time=%dms)",
220
223
  self._id, self._position, estimated_time_s, self._open_time
221
224
  )
225
+ self._last_operation = OPENING
222
226
  await self.run_cover(current_operation=OPENING)
223
227
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=OPENING)
224
228
 
@@ -230,6 +234,7 @@ class BaseCover(BaseCoverABC, BasicMqtt):
230
234
  "Closing cover %s from position %d%%. Estimated time: %.1fs (close_time=%dms)",
231
235
  self._id, self._position, estimated_time_s, self._close_time
232
236
  )
237
+ self._last_operation = CLOSING
233
238
  await self.run_cover(current_operation=CLOSING)
234
239
  self._message_bus.send_message(topic=f"{self._send_topic}/state", payload=CLOSING)
235
240
 
@@ -258,10 +263,12 @@ class BaseCover(BaseCoverABC, BasicMqtt):
258
263
 
259
264
  async def toggle(self) -> None:
260
265
  _LOGGER.debug("Toggle cover %s from input.", self._id)
261
- if self._position > 50:
262
- await self.close()
263
- else:
266
+ if self._current_operation != IDLE:
267
+ await self.stop()
268
+ elif self._last_operation == CLOSING:
264
269
  await self.open()
270
+ else:
271
+ await self.close()
265
272
 
266
273
  async def toggle_open(self) -> None:
267
274
  _LOGGER.debug("Toggle open cover %s from input.", self._id)
@@ -32,6 +32,14 @@ def _persist_transition(config_file: str) -> None:
32
32
  for line in lines:
33
33
  m = transition_re.match(line)
34
34
  if m:
35
+ num_val = float(m.group(2))
36
+ if num_val == 0:
37
+ # Remove transition: 0 entirely — not meaningful
38
+ _LOGGER.info(
39
+ "Removing from config file: %s", line.rstrip(),
40
+ )
41
+ updated = True
42
+ continue # skip this line
35
43
  new_line = f"{m.group(1)}{m.group(2)}s\n"
36
44
  updated_lines.append(new_line)
37
45
  updated = True
@@ -82,13 +90,20 @@ def migrate(doc: dict) -> dict:
82
90
  if "transition" in action_def:
83
91
  val = action_def["transition"]
84
92
  if isinstance(val, (int, float)):
85
- new_val = f"{val}s"
86
- _LOGGER.info(
87
- "Migrating transition: %s -> '%s' in %s action",
88
- val,
89
- new_val,
90
- section_name,
91
- )
92
- action_def["transition"] = new_val
93
+ if val == 0:
94
+ _LOGGER.info(
95
+ "Removing transition: 0 from %s action (not meaningful)",
96
+ section_name,
97
+ )
98
+ del action_def["transition"]
99
+ else:
100
+ new_val = f"{val}s"
101
+ _LOGGER.info(
102
+ "Migrating transition: %s -> '%s' in %s action",
103
+ val,
104
+ new_val,
105
+ section_name,
106
+ )
107
+ action_def["transition"] = new_val
93
108
 
94
109
  return doc
@@ -6,7 +6,7 @@ from collections import OrderedDict
6
6
  from typing import Any
7
7
 
8
8
  from cerberus import TypeDefinition, Validator
9
- from yaml import MarkedYAMLError, SafeLoader, YAMLError, dump, load
9
+ from yaml import MarkedYAMLError, SafeLoader, SafeDumper, YAMLError, dump, load
10
10
 
11
11
  from boneio.const import OUTPUT
12
12
  from boneio.core.utils import TimePeriod
@@ -56,6 +56,15 @@ def clear_config_cache():
56
56
  _LOGGER.info("Config cache cleared")
57
57
 
58
58
 
59
+ class TimePeriodDumper(SafeDumper):
60
+ """Custom dumper that cleanly serializes TimePeriod objects as strings."""
61
+ pass
62
+
63
+ def represent_time_period(dumper, data):
64
+ return dumper.represent_scalar('tag:yaml.org,2002:str', str(data))
65
+
66
+ TimePeriodDumper.add_representer(TimePeriod, represent_time_period)
67
+
59
68
  class BoneIOLoader(SafeLoader):
60
69
  """Loader which support for include in yaml files."""
61
70
 
@@ -518,6 +527,8 @@ class CustomValidator(Validator):
518
527
  def _normalize_coerce_positive_time_period(self, value) -> TimePeriod:
519
528
  """Validate and transform time period with time unit and integer value."""
520
529
  if isinstance(value, int):
530
+ if value == 0:
531
+ return TimePeriod(seconds=0)
521
532
  raise ConfigurationException(
522
533
  f"Don't know what '{value}' means as it has no time *unit*! Did you mean '{value}s'?"
523
534
  )
@@ -876,8 +887,12 @@ def strip_default_values(data: Any, schema: dict | None = None, section: str | N
876
887
  action_defaults = {
877
888
  'action_cover': 'TOGGLE',
878
889
  'action_output': 'TOGGLE',
879
- 'data': {}
890
+ 'data': {},
880
891
  }
892
+ # Remove transition if 0 or '0s' — not meaningful
893
+ t_val = action_item.get('transition')
894
+ if t_val is not None and (t_val == 0 or t_val == 0.0 or str(t_val) in ('0s', '0ms', '0')):
895
+ action_item = {k: v for k, v in action_item.items() if k != 'transition'}
881
896
  cleaned_action = clean_dict(action_item, action_defaults)
882
897
  # Only add if action field exists (required)
883
898
  if 'action' in cleaned_action or cleaned_action:
@@ -1006,7 +1021,7 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1006
1021
  _LOGGER.info(f"Section '{section}' uses !include '{include_filename}', updating {include_file_path}")
1007
1022
 
1008
1023
  # Save cleaned data to the included file
1009
- content = dump(cleaned_data, default_flow_style=False, allow_unicode=True, sort_keys=False)
1024
+ content = dump(cleaned_data, Dumper=TimePeriodDumper, default_flow_style=False, allow_unicode=True, sort_keys=False)
1010
1025
  with open(include_file_path, 'w', encoding='utf-8') as f:
1011
1026
  f.write(content)
1012
1027
 
@@ -1035,7 +1050,7 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1035
1050
  in_section = True
1036
1051
  section_indent = len(line) - len(line.lstrip())
1037
1052
  # Add the complete new section (header + data)
1038
- section_yaml = dump({section: cleaned_data}, default_flow_style=False, allow_unicode=True, sort_keys=False)
1053
+ section_yaml = dump({section: cleaned_data}, Dumper=TimePeriodDumper, default_flow_style=False, allow_unicode=True, sort_keys=False)
1039
1054
  # Add proper indentation if section was indented
1040
1055
  if section_indent > 0:
1041
1056
  indented_lines = []
@@ -1065,7 +1080,7 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1065
1080
  _LOGGER.info(f"Section '{section}' doesn't exist, adding to config.yaml")
1066
1081
 
1067
1082
  # Append new section to the end of the file
1068
- section_yaml = dump({section: cleaned_data}, default_flow_style=False, allow_unicode=True, sort_keys=False)
1083
+ section_yaml = dump({section: cleaned_data}, Dumper=TimePeriodDumper, default_flow_style=False, allow_unicode=True, sort_keys=False)
1069
1084
  with open(config_file, 'a', encoding='utf-8') as f:
1070
1085
  f.write('\n' + section_yaml)
1071
1086
 
@@ -97,6 +97,7 @@ class EventBus:
97
97
  "output": {},
98
98
  "cover": {},
99
99
  "modbus_device": {},
100
+ "modbus_temperature": {},
100
101
  "sensor": {},
101
102
  "host": {},
102
103
  "group": {},
@@ -695,7 +695,12 @@ class InputManager:
695
695
  """
696
696
 
697
697
  if not event.entity_id or not event.click_type:
698
- _LOGGER.warning("Entity ID or click type not found in event data")
698
+ # State-sync events (e.g. from _broadcast_all_input_states after reload)
699
+ # have click_type=None — this is expected, not an error.
700
+ _LOGGER.debug(
701
+ "Ignoring input event without click_type (state sync): entity_id=%s",
702
+ event.entity_id,
703
+ )
699
704
  return
700
705
  # Get the input instance and retrieve actions for this click type
701
706
  input_instance = self._inputs.get(event.entity_id)
@@ -10,7 +10,7 @@ import logging
10
10
  from typing import TYPE_CHECKING, Any
11
11
 
12
12
  from boneio.const import ADDRESS, ID, MODEL, NAME, UART, UARTS, UPDATE_INTERVAL
13
- from boneio.core.utils.timeperiod import TimePeriod
13
+ from boneio.core.utils.timeperiod import TimePeriod, parse_time_to_seconds, parse_time_to_ms
14
14
  from boneio.exceptions import ModbusUartException
15
15
 
16
16
  if TYPE_CHECKING:
@@ -83,10 +83,20 @@ class ModbusManager:
83
83
  f"UART {uart} is not available. Available UARTs: {UARTS}"
84
84
  )
85
85
 
86
+ # Convert TimePeriod values to numeric before passing to client
87
+ timeout = parse_time_to_seconds(
88
+ config.pop("timeout", None), default=1.5
89
+ )
90
+ inter_device_delay = parse_time_to_ms(
91
+ config.pop("inter_device_delay", None), default=5
92
+ ) or 5
93
+
86
94
  # Initialize Modbus client
87
95
  self._modbus = Modbus(
88
96
  uart=UARTS[uart],
89
97
  baudrate=config.pop("baudrate", 9600),
98
+ timeout=timeout,
99
+ inter_device_delay=inter_device_delay,
90
100
  **config
91
101
  )
92
102
 
@@ -93,7 +93,15 @@ class TemplateManager:
93
93
  except (ValueError, TypeError, AttributeError):
94
94
  return
95
95
 
96
- for thermostat in self._thermostats.sensor_map.get(sensor_id, []):
96
+ matched = self._thermostats.sensor_map.get(sensor_id, [])
97
+ if not matched:
98
+ _LOGGER.debug(
99
+ "SensorEvent '%s' (%.1f°C) has no matching thermostat. "
100
+ "Registered sensor_ids: %s",
101
+ sensor_id, temperature,
102
+ list(self._thermostats.sensor_map.keys()),
103
+ )
104
+ for thermostat in matched:
97
105
  thermostat.update_sensor_temperature(sensor_id, temperature)
98
106
 
99
107
  def on_input_event(self, input_id: str, event_type: str) -> None:
@@ -260,7 +268,7 @@ class TemplateManager:
260
268
  listener_id=f"template_mgr_{sensor_id}",
261
269
  )
262
270
 
263
- # Re-register for current mappings
271
+ # Re-register for current mappings (native SensorEvent sources)
264
272
  for sensor_id in self._thermostats.sensor_map:
265
273
  event_bus.add_event_listener(
266
274
  event_type="sensor",
@@ -268,3 +276,8 @@ class TemplateManager:
268
276
  listener_id=f"template_mgr_{sensor_id}",
269
277
  target=self._on_sensor_event,
270
278
  )
279
+
280
+ _LOGGER.info(
281
+ "Registered sensor listeners for thermostat sensor_ids: %s",
282
+ list(self._thermostats.sensor_map.keys()),
283
+ )
@@ -351,10 +351,18 @@ class ESPHomeRemoteDevice(RemoteDevice):
351
351
  for cover in self._covers_list:
352
352
  if cover.get("key") == state.key:
353
353
  cover_id = cover.get("id", "")
354
+
355
+ # Store last known operation if moving
356
+ current_op = getattr(state, 'current_operation', 0)
357
+ last_op = self._cover_states.get(cover_id, {}).get("last_known_operation", 2) # Default to CLOSING (2)
358
+ if current_op != 0:
359
+ last_op = current_op
360
+
354
361
  self._cover_states[cover_id] = {
355
362
  "position": state.position,
356
363
  "tilt": getattr(state, 'tilt', None),
357
- "current_operation": getattr(state, 'current_operation', None),
364
+ "current_operation": current_op,
365
+ "last_known_operation": last_op,
358
366
  }
359
367
  _LOGGER.debug("Cover '%s' position: %.2f", cover_id, state.position)
360
368
  break
@@ -847,12 +855,40 @@ class ESPHomeRemoteDevice(RemoteDevice):
847
855
  elif action_upper == "STOP":
848
856
  self._client.cover_command(cover_key, stop=True)
849
857
  elif action_upper == "TOGGLE":
850
- # Get current state and toggle
851
- current_pos = self._cover_states.get(cover_id, {}).get("position", 0.5)
852
- if current_pos > 0.5:
858
+ # Toggle based on current operation or last known operation
859
+ state = self._cover_states.get(cover_id, {})
860
+ current_op = state.get("current_operation", 0) # 0=IDLE, 1=OPENING, 2=CLOSING
861
+ last_op = state.get("last_known_operation", 2)
862
+ cover_pos = state.get("position")
863
+ _LOGGER.debug(
864
+ "TOGGLE cover '%s': key=%s, state=%s, current_op=%s, last_op=%s, position=%s, all_states=%s",
865
+ cover_id, cover_key, state, current_op, last_op, cover_pos,
866
+ {k: v for k, v in self._cover_states.items()},
867
+ )
868
+
869
+ if current_op != 0: # If moving, stop it
870
+ _LOGGER.debug("TOGGLE -> STOP (cover is moving, current_op=%s)", current_op)
871
+ self._client.cover_command(cover_key, stop=True)
872
+ elif last_op == 2: # If last operation was CLOSING, open it
873
+ _LOGGER.debug("TOGGLE -> OPEN (last_op=CLOSING)")
874
+ self._client.cover_command(cover_key, position=1.0)
875
+ else: # Otherwise close it
876
+ _LOGGER.debug("TOGGLE -> CLOSE (last_op=%s)", last_op)
853
877
  self._client.cover_command(cover_key, position=0.0)
878
+ elif action_upper == "TOGGLE_OPEN":
879
+ state = self._cover_states.get(cover_id, {})
880
+ current_op = state.get("current_operation", 0)
881
+ if current_op != 0:
882
+ self._client.cover_command(cover_key, stop=True)
854
883
  else:
855
884
  self._client.cover_command(cover_key, position=1.0)
885
+ elif action_upper == "TOGGLE_CLOSE":
886
+ state = self._cover_states.get(cover_id, {})
887
+ current_op = state.get("current_operation", 0)
888
+ if current_op != 0:
889
+ self._client.cover_command(cover_key, stop=True)
890
+ else:
891
+ self._client.cover_command(cover_key, position=0.0)
856
892
  else:
857
893
  _LOGGER.error("Invalid cover action: %s", action)
858
894
  return False
@@ -103,8 +103,21 @@ class Modbus:
103
103
  bytesize: int = 8,
104
104
  parity: str = "N",
105
105
  timeout: float = 1.5,
106
+ inter_device_delay: int = 5,
106
107
  ) -> None:
107
- """Initialize the Modbus hub."""
108
+ """Initialize the Modbus hub.
109
+
110
+ Args:
111
+ uart: UART configuration dict with RX/TX pins.
112
+ baudrate: Serial baudrate (default 9600).
113
+ stopbits: Number of stop bits (default 1).
114
+ bytesize: Number of data bits (default 8).
115
+ parity: Parity mode N/E/O (default N).
116
+ timeout: Response timeout in seconds (default 1.5).
117
+ inter_device_delay: Delay in ms between transactions (default 5).
118
+ Helps with star topology wiring where signal reflections
119
+ on branch stubs need time to settle.
120
+ """
108
121
  rx = uart.get(RX)
109
122
  tx = uart.get(TX)
110
123
  if not tx or not rx:
@@ -115,15 +128,24 @@ class Modbus:
115
128
  self._uart = uart
116
129
  self._loop = asyncio.get_event_loop()
117
130
  self._lock = asyncio.Lock()
131
+ # Clamp inter_device_delay to 0-200ms, timeout to 0.1-10s
132
+ clamped_delay = max(0, min(200, inter_device_delay))
133
+ if clamped_delay != inter_device_delay:
134
+ _LOGGER.warning(
135
+ "inter_device_delay %dms out of range (0-200), clamped to %dms",
136
+ inter_device_delay, clamped_delay,
137
+ )
138
+ self._inter_device_delay = clamped_delay / 1000.0 # ms -> seconds
139
+ clamped_timeout = max(0.1, min(10.0, timeout))
140
+ if clamped_timeout != timeout:
141
+ _LOGGER.warning(
142
+ "timeout %.2fs out of range (0.1-10), clamped to %.2fs",
143
+ timeout, clamped_timeout,
144
+ )
145
+ timeout = clamped_timeout
118
146
  self._executor = ThreadPoolExecutor(max_workers=MAX_WORKERS, thread_name_prefix="modbus_worker")
119
147
 
120
148
  _LOGGER.debug(f"Creating ModbusSerialClient for port: {self._uart[ID]}")
121
- # Calculate inter-character timeout based on baudrate (3.5 characters)
122
- # At 9600 baud: 1 char = 11 bits (start + 8 data + parity + stop) = ~1.15ms
123
- # 3.5 chars = ~4ms, we use slightly more for safety
124
- char_time_ms = (11 * 1000) / baudrate # Time for 1 character in ms
125
- inter_char_timeout = (char_time_ms * 3.5) / 1000 # Convert to seconds
126
-
127
149
  self._client = ModbusSerialClient(
128
150
  port=self._uart[ID],
129
151
  framer=FramerType.RTU,
@@ -134,7 +156,10 @@ class Modbus:
134
156
  timeout=timeout,
135
157
  retries=2, # Reduced from 3 to speed up detection of offline devices
136
158
  )
137
- _LOGGER.debug("ModbusSerialClient created successfully with timeout=%.2fs, retries=2", timeout)
159
+ _LOGGER.debug(
160
+ "ModbusSerialClient created successfully with timeout=%.2fs, retries=2, inter_device_delay=%dms",
161
+ timeout, inter_device_delay,
162
+ )
138
163
 
139
164
  @property
140
165
  def client(self) -> ModbusSerialClient | None:
@@ -341,7 +366,10 @@ class Modbus:
341
366
  ):
342
367
  """Call async pymodbus."""
343
368
  async with self._lock:
344
- return await self._loop.run_in_executor(self._executor, self.read_registers_blocking, unit, address, count, method)
369
+ result = await self._loop.run_in_executor(self._executor, self.read_registers_blocking, unit, address, count, method)
370
+ if self._inter_device_delay > 0:
371
+ await asyncio.sleep(self._inter_device_delay)
372
+ return result
345
373
 
346
374
  def scan_device_blocking(self, unit: int, address: int = 1, method: str = "input", timeout: float = 0.3) -> bool:
347
375
  """Quick scan to check if device exists at address.
@@ -426,4 +454,7 @@ class Modbus:
426
454
  async def write_register(self, unit: int | str, address: int, value: int | float):
427
455
  """Write register async."""
428
456
  async with self._lock:
429
- return await self._loop.run_in_executor(self._executor, self.write_register_blocking, unit, address, value)
457
+ result = await self._loop.run_in_executor(self._executor, self.write_register_blocking, unit, address, value)
458
+ if self._inter_device_delay > 0:
459
+ await asyncio.sleep(self._inter_device_delay)
460
+ return result
@@ -49,7 +49,8 @@ from boneio.modbus.entities.writeable.numeric import (
49
49
  ModbusNumericWriteableEntity,
50
50
  ModbusNumericWriteableEntityDiscrete,
51
51
  )
52
- from boneio.models.events import ModbusDeviceEvent
52
+ from boneio.models.events import ModbusDeviceEvent, SensorEvent
53
+ from boneio.models.state import SensorState
53
54
 
54
55
  from .client import VALUE_TYPES, Modbus
55
56
 
@@ -686,27 +687,50 @@ class ModbusCoordinator(BasicMqtt, AsyncUpdater, Filter):
686
687
  ) -> None:
687
688
  """Trigger events for entity updates.
688
689
 
690
+ Emits ModbusDeviceEvent for all entities. Additionally emits
691
+ SensorEvent for any entity that acts as a sensor, so standard
692
+ components (like thermostats) can listen to sensor updates natively.
693
+
689
694
  Args:
690
695
  entity: Entity that was updated
691
- output: Output dictionary with states
692
696
  """
693
697
  type_info = self._get_entity_type_info(entity)
694
698
 
699
+ device_state = ModbusDeviceState(
700
+ id=entity.id,
701
+ name=entity.name,
702
+ state=entity.state or 0.0,
703
+ unit=getattr(entity, 'unit_of_measurement', None),
704
+ timestamp=entity.last_timestamp,
705
+ device_group=self.name,
706
+ coordinator_id=self._id,
707
+ entity_type=entity.entity_type,
708
+ **type_info
709
+ )
710
+
695
711
  self._event_bus.trigger_event(ModbusDeviceEvent(
696
712
  entity_id=entity.id,
697
- state=ModbusDeviceState(
698
- id=entity.id,
699
- name=entity.name,
700
- state=entity.state or 0.0,
701
- unit=getattr(entity, 'unit_of_measurement', None),
702
- timestamp=entity.last_timestamp,
703
- device_group=self.name,
704
- coordinator_id=self._id,
705
- entity_type=entity.entity_type,
706
- **type_info
707
- ),
713
+ state=device_state,
708
714
  ))
709
715
 
716
+ # Also emit dedicated SensorEvent for generic sensor integration
717
+ # (thermostats, rules, etc. shouldn't care about transport type)
718
+ if entity.entity_type in (SENSOR, TEXT_SENSOR):
719
+ _LOGGER.debug(
720
+ "Emitting SensorEvent: entity_id='%s', name='%s', state=%s",
721
+ entity.id, entity.name, entity.state,
722
+ )
723
+ self._event_bus.trigger_event(SensorEvent(
724
+ entity_id=entity.id,
725
+ state=SensorState(
726
+ id=entity.id,
727
+ name=entity.name,
728
+ state=entity.state or 0.0,
729
+ unit=getattr(entity, 'unit_of_measurement', None),
730
+ timestamp=entity.last_timestamp,
731
+ )
732
+ ))
733
+
710
734
  async def write_register(
711
735
  self,
712
736
  value: str | float | int,
@@ -0,0 +1,50 @@
1
+ {
2
+ "model": "boneIO Edge Temp and Humidity sensor",
3
+ "set_base": {
4
+ "set_address_address": 100,
5
+ "set_baudrate": {
6
+ "address": 101,
7
+ "possible_baudrates": {
8
+ "2400": 0,
9
+ "4800": 1,
10
+ "9600": 2,
11
+ "19200": 3
12
+ }
13
+ }
14
+ },
15
+ "registers_base": [
16
+ {
17
+ "base": 0,
18
+ "length": 2,
19
+ "register_type": "holding",
20
+ "registers": [
21
+ {
22
+ "name": "Humidity",
23
+ "address": 0,
24
+ "unit_of_measurement": "%",
25
+ "state_class": "measurement",
26
+ "device_class": "humidity",
27
+ "value_type": "S_WORD",
28
+ "filters": [
29
+ {
30
+ "multiply": 0.1
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "name": "Temperature",
36
+ "address": 1,
37
+ "unit_of_measurement": "°C",
38
+ "state_class": "measurement",
39
+ "device_class": "temperature",
40
+ "value_type": "S_WORD",
41
+ "filters": [
42
+ {
43
+ "multiply": 0.1
44
+ }
45
+ ]
46
+ }
47
+ ]
48
+ }
49
+ ]
50
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "model": "WIND_SPEED_GD_FS",
3
+ "registers_base": [
4
+ {
5
+ "base": 0,
6
+ "length": 1,
7
+ "register_type": "holding",
8
+ "registers": [
9
+ {
10
+ "name": "wind_speed",
11
+ "address": 0,
12
+ "unit_of_measurement": "m/s",
13
+ "state_class": "measurement",
14
+ "value_type": "U_WORD",
15
+ "device_class": "speed"
16
+ }
17
+ ]
18
+ }
19
+ ],
20
+ "set_base": {
21
+ "set_address_address": 10,
22
+ "set_baudrate": {
23
+ "address": 100,
24
+ "possible_baudrates": {
25
+ "2400": 0,
26
+ "4800": 1,
27
+ "9600": 2,
28
+ "19200": 3,
29
+ "38400": 4,
30
+ "57600": 5,
31
+ "115200": 6
32
+ }
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "model": "WIND_DIRECTION_GD_FX",
3
+ "registers_base": [
4
+ {
5
+ "base": 0,
6
+ "length": 2,
7
+ "register_type": "holding",
8
+ "registers": [
9
+ {
10
+ "name": "wind_direction_gear",
11
+ "address": 0,
12
+ "unit_of_measurement": "sector",
13
+ "state_class": "measurement",
14
+ "value_type": "U_WORD"
15
+ },
16
+ {
17
+ "name": "wind_direction_degree",
18
+ "address": 1,
19
+ "unit_of_measurement": "°",
20
+ "state_class": "measurement",
21
+ "value_type": "U_WORD"
22
+ }
23
+ ]
24
+ }
25
+ ],
26
+ "set_base": {
27
+ "set_address_address": 10,
28
+ "set_baudrate": {
29
+ "address": 100,
30
+ "possible_baudrates": {
31
+ "2400": 0,
32
+ "4800": 1,
33
+ "9600": 2,
34
+ "19200": 3,
35
+ "38400": 4,
36
+ "57600": 5,
37
+ "115200": 6
38
+ }
39
+ }
40
+ }
41
+ }
@@ -166,6 +166,8 @@ schema:
166
166
  type: timeperiod
167
167
  coerce: positive_time_period
168
168
  required: False
169
+ forbidden_if:
170
+ action: ['output', 'cover', 'mqtt', 'output_over_mqtt', 'cover_over_mqtt', 'remote_cover']
169
171
  meta:
170
172
  label: Transition Time
171
173
  description: "Time to transition to the new state. Only for ESPHome/WLED lights. Example: 500ms, 1s"
@@ -291,6 +291,16 @@ modbus:
291
291
  type: string
292
292
  allowed: ['N', 'E', 'O']
293
293
  default: 'N'
294
+ timeout:
295
+ coerce: timeperiod
296
+ default: 1500ms
297
+ meta:
298
+ label: Response timeout. Increase for slow devices or long cables.
299
+ inter_device_delay:
300
+ coerce: timeperiod
301
+ default: 5ms
302
+ meta:
303
+ label: Delay between Modbus transactions. Helps with star topology wiring where signal reflections need time to settle. Recommended 5-50ms for star, 0 for daisy-chain.
294
304
 
295
305
  modbus_devices:
296
306
  type: list
@@ -340,6 +350,10 @@ modbus_devices:
340
350
  [
341
351
  'cwt',
342
352
  'dts1964_3f',
353
+ 'dyp-a12-ultrasonic',
354
+ 'gdfs',
355
+ 'gdfx',
356
+ 'boneio-edge-temp',
343
357
  'liquid-sensor',
344
358
  'orno-or-we-517',
345
359
  'pt100',
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.2.0dev17"