boneIO 1.5.6__tar.gz → 1.6.0.dev1__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 (562) hide show
  1. {boneio-1.5.6/boneio.egg-info → boneio-1.6.0.dev1}/PKG-INFO +1 -1
  2. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/bonecli.py +3 -0
  3. boneio-1.6.0.dev1/boneio/components/cover/__init__.py +6 -0
  4. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/cover.py +3 -17
  5. boneio-1.6.0.dev1/boneio/components/cover/remote.py +277 -0
  6. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/time_based.py +0 -14
  7. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/cover/venetian.py +0 -14
  8. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/binary_sensor.py +0 -71
  9. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/detectors.py +1 -62
  10. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/event.py +11 -34
  11. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/controller.py +1 -29
  12. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/yaml_util.py +6 -49
  13. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/events/bus.py +1 -67
  14. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/covers.py +8 -45
  15. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/inputs.py +3 -20
  16. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/manager.py +138 -71
  17. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/outputs.py +0 -49
  18. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/sensors.py +8 -24
  19. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/update.py +4 -21
  20. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/esphome.py +38 -0
  21. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/monitor.py +2 -18
  22. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/async_updater.py +2 -30
  23. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/oled.py +1 -6
  24. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +21 -163
  25. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/base.py +3 -13
  26. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219.py +1 -39
  27. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/base.py +1 -9
  28. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/actions.py +0 -68
  29. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/MANIFEST.sha256 +4 -11
  30. boneio-1.6.0.dev1/boneio/migrations/assets/journald/journald.conf +6 -0
  31. boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio-oled-boot.service +17 -0
  32. boneio-1.6.0.dev1/boneio/migrations/assets/systemd/boneio.service +15 -0
  33. boneio-1.6.0.dev1/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +10 -0
  34. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/boneio-migrate +1 -130
  35. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/runner.py +0 -155
  36. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/wanas415.json +1 -1
  37. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/runner.py +1 -4
  38. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_outputs.yaml +2 -1
  39. boneio-1.6.0.dev1/boneio/version.py +2 -0
  40. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/action_validation.py +4 -7
  41. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/BindingMatrix-BNqK7tIZ.js +1 -0
  42. boneio-1.5.6/boneio/webui/frontend-dist/assets/ConfigEditor-DeE7U2yr.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ConfigEditor-BbAOE4qq.js +1 -1
  43. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EditItemDialog-C0WDUAld.js +66 -0
  44. boneio-1.5.6/boneio/webui/frontend-dist/assets/EntityCard-MIm2X0xL.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityCard-xdVpUoDY.js +1 -1
  45. boneio-1.5.6/boneio/webui/frontend-dist/assets/EntityGrid-DXAibzFZ.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/EntityGrid-gh0rv5_A.js +1 -1
  46. boneio-1.5.6/boneio/webui/frontend-dist/assets/FormInputToggle-CKmTOUV2.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/FormInputToggle-B-viFZz5.js +1 -1
  47. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/InputsView-7BXiGozL.js +1 -0
  48. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/LogViewer-DoFcRAEu.js +2 -0
  49. boneio-1.5.6/boneio/webui/frontend-dist/assets/ModbusView-BkLPDyTp.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/ModbusView-DX2BOSsr.js +1 -1
  50. boneio-1.5.6/boneio/webui/frontend-dist/assets/NodeRedView-Cm3TBtDf.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/NodeRedView-BdZeZ91F.js +1 -1
  51. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/OutputsView-BaZRxY6O.js +1 -0
  52. boneio-1.5.6/boneio/webui/frontend-dist/assets/SensorView-BGvX8Zku.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SensorView-BS6L9UKi.js +1 -1
  53. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BBw56CUu.js +1 -0
  54. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/SystemState-3DdCx89h.js +1 -0
  55. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/TemplatesView-C2wBfPOg.js +1 -0
  56. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/Tools-DX1geom0.js +14 -0
  57. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/UISettings-BAXtlmBZ.js +38 -0
  58. boneio-1.5.6/boneio/webui/frontend-dist/assets/gi-DaFhuK3L.js → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/gi-D-jcrHWa.js +1 -1
  59. boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-B-isv7qh.js +6 -0
  60. boneio-1.5.6/boneio/webui/frontend-dist/assets/index-CqtrKdPF.css → boneio-1.6.0.dev1/boneio/webui/frontend-dist/assets/index-pwUtHTme.css +1 -1
  61. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/index.html +2 -24
  62. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +2 -1
  63. {boneio-1.5.6/boneio/webui → boneio-1.6.0.dev1/boneio/webui/frontend-dist}/schema/remote_outputs.schema.json +2 -1
  64. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/sw.js +1 -1
  65. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_core.py +0 -20
  66. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/nodered.py +2 -28
  67. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/remote_devices.py +88 -0
  68. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/system.py +10 -35
  69. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/update.py +2 -34
  70. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/config.schema.json +2 -1
  71. {boneio-1.5.6/boneio/webui/frontend-dist → boneio-1.6.0.dev1/boneio/webui}/schema/remote_outputs.schema.json +2 -1
  72. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/websocket_manager.py +31 -81
  73. {boneio-1.5.6 → boneio-1.6.0.dev1/boneio.egg-info}/PKG-INFO +1 -1
  74. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/SOURCES.txt +21 -42
  75. boneio-1.5.6/boneio/components/cover/__init__.py +0 -5
  76. boneio-1.5.6/boneio/core/utils/overlay.py +0 -159
  77. boneio-1.5.6/boneio/migrations/assets/journald/journald.conf +0 -43
  78. boneio-1.5.6/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -79
  79. boneio-1.5.6/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -30
  80. boneio-1.5.6/boneio/migrations/assets/systemd/boneio.service +0 -49
  81. boneio-1.5.6/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -11
  82. boneio-1.5.6/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -22
  83. boneio-1.5.6/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -16
  84. boneio-1.5.6/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -21
  85. boneio-1.5.6/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -27
  86. boneio-1.5.6/boneio/migrations/assets/systemd/linger-marker +0 -0
  87. boneio-1.5.6/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -15
  88. boneio-1.5.6/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -33
  89. boneio-1.5.6/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -64
  90. boneio-1.5.6/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -69
  91. boneio-1.5.6/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -43
  92. boneio-1.5.6/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -50
  93. boneio-1.5.6/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -37
  94. boneio-1.5.6/boneio/migrations/versions/v1_5_16_login_linger.py +0 -53
  95. boneio-1.5.6/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -60
  96. boneio-1.5.6/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -57
  97. boneio-1.5.6/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -32
  98. boneio-1.5.6/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -59
  99. boneio-1.5.6/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -47
  100. boneio-1.5.6/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -72
  101. boneio-1.5.6/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -50
  102. boneio-1.5.6/boneio/version.py +0 -2
  103. boneio-1.5.6/boneio/webui/frontend-dist/assets/BindingMatrix-C4JLRTbH.js +0 -1
  104. boneio-1.5.6/boneio/webui/frontend-dist/assets/EditItemDialog-DAL7SSTN.js +0 -66
  105. boneio-1.5.6/boneio/webui/frontend-dist/assets/InputsView-BvUAn54U.js +0 -1
  106. boneio-1.5.6/boneio/webui/frontend-dist/assets/LogViewer-DdM372kc.js +0 -2
  107. boneio-1.5.6/boneio/webui/frontend-dist/assets/OutputsView-SU0EQQ3a.js +0 -1
  108. boneio-1.5.6/boneio/webui/frontend-dist/assets/SudoPasswordDialog-BHYIALWE.js +0 -1
  109. boneio-1.5.6/boneio/webui/frontend-dist/assets/SystemState-D3GEjPni.js +0 -1
  110. boneio-1.5.6/boneio/webui/frontend-dist/assets/TemplatesView-BRIdzlbF.js +0 -1
  111. boneio-1.5.6/boneio/webui/frontend-dist/assets/Tools-BJTVhILd.js +0 -14
  112. boneio-1.5.6/boneio/webui/frontend-dist/assets/UISettings-124Db9Cg.js +0 -38
  113. boneio-1.5.6/boneio/webui/frontend-dist/assets/index-ChQOzHhp.js +0 -6
  114. {boneio-1.5.6 → boneio-1.6.0.dev1}/LICENSE +0 -0
  115. {boneio-1.5.6 → boneio-1.6.0.dev1}/MANIFEST.in +0 -0
  116. {boneio-1.5.6 → boneio-1.6.0.dev1}/README.md +0 -0
  117. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/__init__.py +0 -0
  118. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/input.yaml +0 -0
  119. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
  120. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
  121. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
  122. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
  123. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  124. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/input.yaml +0 -0
  125. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
  126. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
  127. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
  128. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
  129. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  130. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/input.yaml +0 -0
  131. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
  132. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
  133. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
  134. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
  135. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  136. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/input.yaml +0 -0
  137. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
  138. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
  139. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
  140. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  141. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/input.yaml +0 -0
  142. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
  143. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
  144. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
  145. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  146. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/input.yaml +0 -0
  147. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
  148. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  149. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
  150. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
  151. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  152. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/input.yaml +0 -0
  153. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
  154. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  155. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
  156. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
  157. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  158. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/input.yaml +0 -0
  159. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_24_16.yaml +0 -0
  160. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_32_10.yaml +0 -0
  161. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_48_4.yaml +0 -0
  162. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover.yaml +0 -0
  163. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  164. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/__init__.py +0 -0
  165. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/group/__init__.py +0 -0
  166. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/group/output_group.py +0 -0
  167. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/__init__.py +0 -0
  168. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/__init__.py +0 -0
  169. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/base.py +0 -0
  170. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/input/remote/esphome.py +0 -0
  171. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/__init__.py +0 -0
  172. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/irrigation/water_source.py +0 -0
  173. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/__init__.py +0 -0
  174. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/basic.py +0 -0
  175. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/buzzer.py +0 -0
  176. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/mcp.py +0 -0
  177. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/pca.py +0 -0
  178. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/pcf.py +0 -0
  179. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/output/remote.py +0 -0
  180. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/sensor/__init__.py +0 -0
  181. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
  182. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/__init__.py +0 -0
  183. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/alarm_panel.py +0 -0
  184. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/gate_cover.py +0 -0
  185. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/components/template/thermostat.py +0 -0
  186. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/const.py +0 -0
  187. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/__init__.py +0 -0
  188. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/__init__.py +0 -0
  189. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/__init__.py +0 -0
  190. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  191. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  192. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  193. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/registration.py +0 -0
  194. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/cloud/secrets.py +0 -0
  195. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/__init__.py +0 -0
  196. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/config_helper.py +0 -0
  197. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/__init__.py +0 -0
  198. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  199. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
  200. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  201. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
  202. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/package-lock.json +0 -0
  203. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/package.json +0 -0
  204. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/schema_converter.py +0 -0
  205. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/config/yaml_compat.py +0 -0
  206. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/discovery.py +0 -0
  207. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/events/__init__.py +0 -0
  208. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/__init__.py +0 -0
  209. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/action_conditions.py +0 -0
  210. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/canopen.py +0 -0
  211. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/display.py +0 -0
  212. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/irrigation.py +0 -0
  213. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/modbus.py +0 -0
  214. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/remote.py +0 -0
  215. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/remote_input_registrar.py +0 -0
  216. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/__init__.py +0 -0
  217. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/alarm.py +0 -0
  218. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
  219. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
  220. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/manager/templates.py +0 -0
  221. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/__init__.py +0 -0
  222. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/basic.py +0 -0
  223. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
  224. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/composite.py +0 -0
  225. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/local.py +0 -0
  226. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/lox.py +0 -0
  227. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/mqtt.py +0 -0
  228. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/messaging/queue.py +0 -0
  229. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/__init__.py +0 -0
  230. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/base.py +0 -0
  231. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/can.py +0 -0
  232. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/mqtt.py +0 -0
  233. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/wled.py +0 -0
  234. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/remote/wled_cache.py +0 -0
  235. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/__init__.py +0 -0
  236. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/base.py +0 -0
  237. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/sensor/system.py +0 -0
  238. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/state/__init__.py +0 -0
  239. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/state/manager.py +0 -0
  240. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/__init__.py +0 -0
  241. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/system/host_data.py +0 -0
  242. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/__init__.py +0 -0
  243. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/conditions.py +0 -0
  244. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/filter.py +0 -0
  245. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/font_util.py +0 -0
  246. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/logger.py +0 -0
  247. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/timeperiod.py +0 -0
  248. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/core/utils/util.py +0 -0
  249. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
  250. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  251. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/config.yaml +0 -0
  252. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/event.yaml +0 -0
  253. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
  254. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  255. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
  256. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  257. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/config.yaml +0 -0
  258. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/event.yaml +0 -0
  259. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
  260. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  261. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
  262. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  263. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/config.yaml +0 -0
  264. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/event.yaml +0 -0
  265. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
  266. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  267. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/__init__.py +0 -0
  268. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/can_master.yaml +0 -0
  269. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/can_slave.yaml +0 -0
  270. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/adc.yaml +0 -0
  271. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  272. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/config.yaml +0 -0
  273. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/cover.yaml +0 -0
  274. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/event.yaml +0 -0
  275. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
  276. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
  277. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
  278. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  279. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
  280. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
  281. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
  282. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  283. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  284. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
  285. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  286. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  287. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  288. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  289. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
  290. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  291. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  292. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  293. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  294. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  295. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  296. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/exceptions.py +0 -0
  297. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/__init__.py +0 -0
  298. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/analog/__init__.py +0 -0
  299. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/analog/adc.py +0 -0
  300. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/__init__.py +0 -0
  301. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/bridge.py +0 -0
  302. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/client.py +0 -0
  303. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/interface.py +0 -0
  304. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/node.py +0 -0
  305. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/node_id.py +0 -0
  306. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/can/test_od.py +0 -0
  307. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/__init__.py +0 -0
  308. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/early_oled.py +0 -0
  309. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  310. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/__init__.py +0 -0
  311. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  312. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  313. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  314. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
  315. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
  316. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/__init__.py +0 -0
  317. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/bus.py +0 -0
  318. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
  319. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226.py +0 -0
  320. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/ina226_driver.py +0 -0
  321. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
  322. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
  323. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/onewire/__init__.py +0 -0
  324. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/onewire/dallas.py +0 -0
  325. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/__init__.py +0 -0
  326. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  327. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  328. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  329. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/__init__.py +0 -0
  330. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/homeassistant.py +0 -0
  331. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/interlock.py +0 -0
  332. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/integration/lox_template.py +0 -0
  333. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/__init__.py +0 -0
  334. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
  335. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  336. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  337. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  338. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  339. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  340. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  341. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  342. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
  343. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  344. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  345. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  346. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  347. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  348. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  349. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  350. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  351. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  352. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/__init__.py +0 -0
  353. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  354. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  355. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  356. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  357. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  358. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  359. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  360. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  361. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  362. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  363. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  364. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/__init__.py +0 -0
  365. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/cli.py +0 -0
  366. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/client.py +0 -0
  367. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/coordinator.py +0 -0
  368. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/__init__.py +0 -0
  369. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  370. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  371. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  372. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  373. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  374. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  375. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  376. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  377. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  378. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  379. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/thessla.json +0 -0
  380. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  381. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
  382. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  383. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  384. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  385. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  386. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
  387. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  388. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  389. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  390. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  391. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
  392. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  393. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
  394. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
  395. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/__init__.py +0 -0
  396. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/base.py +0 -0
  397. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
  398. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
  399. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/select.py +0 -0
  400. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
  401. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/derived/text.py +0 -0
  402. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
  403. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
  404. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
  405. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
  406. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
  407. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
  408. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
  409. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/mock_coordinator.py +0 -0
  410. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/modbus/utils.py +0 -0
  411. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/__init__.py +0 -0
  412. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/actions.py +0 -0
  413. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/events.py +0 -0
  414. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/files.py +0 -0
  415. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/logs.py +0 -0
  416. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/mqtt.py +0 -0
  417. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/models/state.py +0 -0
  418. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions.yaml +0 -0
  419. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions_sensor.yaml +0 -0
  420. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/actions_switch.yaml +0 -0
  421. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/condition.yaml +0 -0
  422. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/filters.yaml +0 -0
  423. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/filters_adc.yaml +0 -0
  424. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/id.yaml +0 -0
  425. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_devices.yaml +0 -0
  426. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/remote_inputs.yaml +0 -0
  427. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/schema.yaml +0 -0
  428. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/temp_unit.yaml +0 -0
  429. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/schema/update_interval.yaml +0 -0
  430. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/app.py +0 -0
  431. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/dashboard_cards.py +0 -0
  432. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/HelpLabel-BSTjOtDA.js +0 -0
  433. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/LongPressWrapper-BHOQV7Wq.js +0 -0
  434. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/Sparkline-BGWlVLtt.js +0 -0
  435. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  436. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  437. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/axios-DHUeYRnu.js +0 -0
  438. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  439. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  440. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  441. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/configCache-BAkc0Ye7.js +0 -0
  442. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  443. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  444. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  445. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  446. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  447. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
  448. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-L6as-BKo.js +0 -0
  449. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  450. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  451. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  452. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/select-B2YDgQ4X.js +0 -0
  453. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/tabs-box-Dj36r4_e.js +0 -0
  454. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  455. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/utils-C8nShLO6.js +0 -0
  456. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/vendor-IzweXARb.js +0 -0
  457. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  458. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  459. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  460. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  461. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  462. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  463. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  464. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  465. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  466. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  467. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  468. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  469. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  470. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  471. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  472. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  473. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
  474. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  475. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  476. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  477. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  478. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  479. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  480. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  481. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  482. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  483. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  484. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  485. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  486. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  487. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  488. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  489. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  490. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  491. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  492. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  493. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  494. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  495. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/hvac_svg_templates.py +0 -0
  496. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/middleware/__init__.py +0 -0
  497. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/middleware/auth.py +0 -0
  498. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/modbus_card_templates.py +0 -0
  499. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/__init__.py +0 -0
  500. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/auth.py +0 -0
  501. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/caddy.py +0 -0
  502. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/can.py +0 -0
  503. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config.py +0 -0
  504. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_actions.py +0 -0
  505. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_backups.py +0 -0
  506. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_discovery.py +0 -0
  507. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/config_files.py +0 -0
  508. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/covers.py +0 -0
  509. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/dashboard.py +0 -0
  510. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/dev_fake_device.py +0 -0
  511. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/irrigation.py +0 -0
  512. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/migrations.py +0 -0
  513. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/modbus.py +0 -0
  514. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/mqtt_reference.py +0 -0
  515. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/outputs.py +0 -0
  516. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/sensors.py +0 -0
  517. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/templates.py +0 -0
  518. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
  519. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/routes/tools.py +0 -0
  520. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/adc.schema.json +0 -0
  521. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/areas.schema.json +0 -0
  522. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  523. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
  524. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/can.schema.json +0 -0
  525. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/cover.schema.json +0 -0
  526. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
  527. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
  528. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/event.schema.json +0 -0
  529. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
  530. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/ina226.schema.json +0 -0
  531. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
  532. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
  533. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/logger.schema.json +0 -0
  534. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
  535. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  536. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  537. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
  538. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  539. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
  540. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/oled.schema.json +0 -0
  541. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/output.schema.json +0 -0
  542. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
  543. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
  544. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  545. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
  546. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  547. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
  548. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/template.schema.json +0 -0
  549. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  550. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/schema/web.schema.json +0 -0
  551. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/services/__init__.py +0 -0
  552. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/services/logs.py +0 -0
  553. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/sudo_rate_limiter.py +0 -0
  554. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio/webui/web_server.py +0 -0
  555. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/dependency_links.txt +0 -0
  556. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/entry_points.txt +0 -0
  557. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/requires.txt +0 -0
  558. {boneio-1.5.6 → boneio-1.6.0.dev1}/boneio.egg-info/top_level.txt +0 -0
  559. {boneio-1.5.6 → boneio-1.6.0.dev1}/pyproject.toml +0 -0
  560. {boneio-1.5.6 → boneio-1.6.0.dev1}/setup.cfg +0 -0
  561. {boneio-1.5.6 → boneio-1.6.0.dev1}/setup.py +0 -0
  562. {boneio-1.5.6 → boneio-1.6.0.dev1}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.5.6
3
+ Version: 1.6.0.dev1
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
@@ -258,6 +258,9 @@ def run(
258
258
  from boneio.const import ACTION
259
259
  _LOGGER.debug("[RUNNER IMPORT] boneio.const: %.2fs", _time.monotonic() - _t_a)
260
260
  _t_a = _time.monotonic()
261
+ from boneio.core.cloud import CloudRegistration
262
+ _LOGGER.debug("[RUNNER IMPORT] boneio.core.cloud: %.2fs", _time.monotonic() - _t_a)
263
+ _t_a = _time.monotonic()
261
264
  from boneio.core.manager import Manager
262
265
  _LOGGER.debug("[RUNNER IMPORT] boneio.core.manager: %.2fs", _time.monotonic() - _t_a)
263
266
  _t_a = _time.monotonic()
@@ -0,0 +1,6 @@
1
+ """Cover classes."""
2
+ from .remote import RemoteCoverOutput
3
+ from .time_based import TimeBasedCover
4
+ from .venetian import VenetianCover
5
+
6
+ __all__ = ["RemoteCoverOutput", "TimeBasedCover", "VenetianCover"]
@@ -210,23 +210,9 @@ class BaseCover(BaseCoverABC, BasicMqtt):
210
210
  async def stop(self, on_exit=False) -> None:
211
211
  if self._movement_thread and self._movement_thread.is_alive():
212
212
  self._stop_event.set()
213
-
214
- # Halting is three blocking operations: waiting for the movement
215
- # thread to notice the stop event, and two relay writes that go out
216
- # over I2C behind a bus lock shared with every other device. Run
217
- # inline they were the *event loop's* wait — up to half a second of
218
- # frozen loop on every cover stop, and a cover stop is the first
219
- # thing `toggle`, `toggle_open` and `toggle_close` do, so an
220
- # ordinary button press paid it. Nothing reads GPIO while the loop
221
- # is stopped. Order is unchanged: join first, then de-energise.
222
- thread = self._movement_thread
223
-
224
- def _halt() -> None:
225
- thread.join(timeout=0.5)
226
- self._open_relay.turn_off()
227
- self._close_relay.turn_off()
228
-
229
- await asyncio.get_running_loop().run_in_executor(None, _halt)
213
+ self._movement_thread.join(timeout=0.5)
214
+ self._open_relay.turn_off()
215
+ self._close_relay.turn_off()
230
216
  # Send relay states to WebSocket (not MQTT - that's handled by output_type check)
231
217
  with suppress(RuntimeError):
232
218
  asyncio.create_task(self._open_relay.async_send_state())
@@ -0,0 +1,277 @@
1
+ """Remote cover output for covers on remote devices (ESPHome API).
2
+
3
+ ``RemoteCoverOutput`` provides a duck-type compatible interface with
4
+ :class:`TimeBasedCover` / :class:`VenetianCover` so that the conditions
5
+ system (``is_open`` / ``is_closed``), ``CoverManager.get_cover()``,
6
+ and WebSocket event emission work transparently with remote covers.
7
+
8
+ The actual hardware control is delegated to the parent
9
+ ``ESPHomeDeviceManager`` via ``control_cover()``.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ import time
16
+ from typing import TYPE_CHECKING, Any
17
+
18
+ from boneio.const import CLOSED, CLOSING, COVER, IDLE, OPEN, OPENING
19
+ from boneio.core.events import EventBus
20
+ from boneio.models import CoverState
21
+ from boneio.models.events import CoverEvent
22
+
23
+ if TYPE_CHECKING:
24
+ from boneio.core.messaging import MessageBus
25
+
26
+ _LOGGER = logging.getLogger(__name__)
27
+
28
+
29
+ class RemoteCoverOutput:
30
+ """Remote cover from ESPHome — duck-type compatible with local Cover.
31
+
32
+ Provides the same public interface that the condition evaluators and
33
+ the ``CoverManager`` expect:
34
+
35
+ - ``is_open`` / ``is_closed`` property for action conditions
36
+ - ``state`` / ``position`` / ``tilt`` for state reporting
37
+ - ``on_remote_state_change()`` callback from ESPHome subscription
38
+ - ``CoverEvent`` emission on EventBus for WebSocket clients
39
+
40
+ Args:
41
+ id: Entity identifier (usually ``{device_id}_{cover_id}``).
42
+ name: Human-readable display name.
43
+ device_id: ID of the remote device hosting this cover.
44
+ cover_id: Entity object_id on the remote device.
45
+ remote_source: Transport protocol (``esphome_api``).
46
+ event_bus: Central event bus for emitting ``CoverEvent`` objects.
47
+ kind: Cover device class (``blind``, ``shutter``, ``gate``, etc.).
48
+ show_in_ha: Whether to publish HA autodiscovery.
49
+ area: Optional HA area assignment.
50
+ """
51
+
52
+ # Duck-type compatibility with local covers
53
+ is_remote: bool = True
54
+
55
+ def __init__(
56
+ self,
57
+ *,
58
+ id: str,
59
+ name: str,
60
+ device_id: str,
61
+ cover_id: str,
62
+ remote_source: str,
63
+ event_bus: EventBus,
64
+ message_bus: MessageBus | None = None,
65
+ topic_prefix: str = "",
66
+ kind: str = "cover",
67
+ show_in_ha: bool = False,
68
+ area: str | None = None,
69
+ ) -> None:
70
+ self._id = id
71
+ self._name = name
72
+ self._device_id = device_id
73
+ self._cover_id = cover_id
74
+ self._remote_source = remote_source
75
+ self._event_bus = event_bus
76
+ self._message_bus: MessageBus | None = message_bus
77
+ self._send_topic = f"{topic_prefix}/{COVER}/{id}" if topic_prefix else ""
78
+ self._kind = kind
79
+ self.show_in_ha = show_in_ha
80
+ self.area: str | None = area
81
+
82
+ # State tracking
83
+ self._position: int = 0 # 0=closed, 100=open
84
+ self._tilt: int = 0
85
+ self._current_operation: str = IDLE
86
+ self._last_timestamp: float = 0.0
87
+ self._available: bool = False
88
+
89
+ # Reference to remote device manager — set by registration.
90
+ self._device_manager: Any = None
91
+ self._remote_devices_ref: Any = None
92
+
93
+ # ------------------------------------------------------------------
94
+ # Public properties (duck-type compatible with TimeBasedCover)
95
+ # ------------------------------------------------------------------
96
+
97
+ @property
98
+ def id(self) -> str:
99
+ """Entity identifier."""
100
+ return self._id
101
+
102
+ @property
103
+ def name(self) -> str:
104
+ """Human-readable name."""
105
+ return self._name
106
+
107
+ @property
108
+ def kind(self) -> str:
109
+ """Cover device class (blind, shutter, gate, etc.)."""
110
+ return self._kind
111
+
112
+ @property
113
+ def state(self) -> str:
114
+ """Current state as string (open/closed/opening/closing)."""
115
+ if self._current_operation == OPENING:
116
+ return OPENING
117
+ elif self._current_operation == CLOSING:
118
+ return CLOSING
119
+ else:
120
+ return CLOSED if self._position == 0 else OPEN
121
+
122
+ @property
123
+ def is_open(self) -> bool:
124
+ """True when cover position > 0 (not fully closed)."""
125
+ return self._position > 0
126
+
127
+ @property
128
+ def is_closed(self) -> bool:
129
+ """True when cover is fully closed (position == 0)."""
130
+ return self._position == 0
131
+
132
+ @property
133
+ def position(self) -> int:
134
+ """Current cover position (0-100)."""
135
+ return self._position
136
+
137
+ @property
138
+ def tilt(self) -> int:
139
+ """Current tilt position (0-100)."""
140
+ return self._tilt
141
+
142
+ @property
143
+ def current_operation(self) -> str:
144
+ """Current operation (idle/opening/closing)."""
145
+ return self._current_operation
146
+
147
+ @property
148
+ def last_timestamp(self) -> float:
149
+ """Timestamp of last state update."""
150
+ return self._last_timestamp
151
+
152
+ # ------------------------------------------------------------------
153
+ # Remote state callback
154
+ # ------------------------------------------------------------------
155
+
156
+ def on_remote_state_change(self, state_dict: dict[str, Any]) -> None:
157
+ """Called by ESPHome device manager when cover state changes.
158
+
159
+ Args:
160
+ state_dict: Cover state from ESPHome containing:
161
+ - position: float (0.0-1.0)
162
+ - tilt: float | None
163
+ - current_operation: int (0=IDLE, 1=OPENING, 2=CLOSING)
164
+ """
165
+ position_raw = state_dict.get("position")
166
+ if position_raw is not None:
167
+ self._position = round(float(position_raw) * 100)
168
+
169
+ tilt_raw = state_dict.get("tilt")
170
+ if tilt_raw is not None:
171
+ self._tilt = round(float(tilt_raw) * 100)
172
+
173
+ current_op_int = state_dict.get("current_operation", 0)
174
+ if current_op_int == 1:
175
+ self._current_operation = OPENING
176
+ elif current_op_int == 2:
177
+ self._current_operation = CLOSING
178
+ else:
179
+ self._current_operation = IDLE
180
+
181
+ self._last_timestamp = time.time()
182
+ self._available = True
183
+
184
+ _LOGGER.debug(
185
+ "Remote cover '%s' state: position=%d%%, tilt=%d%%, operation=%s",
186
+ self._id,
187
+ self._position,
188
+ self._tilt,
189
+ self._current_operation,
190
+ )
191
+
192
+ # Emit CoverEvent for WebSocket clients
193
+ self._emit_cover_event()
194
+
195
+ def _emit_cover_event(self) -> None:
196
+ """Emit a CoverEvent on the event bus."""
197
+ event = CoverState(
198
+ id=self._id,
199
+ name=self._name,
200
+ state=self.state,
201
+ kind=self._kind,
202
+ timestamp=self._last_timestamp,
203
+ current_operation=self._current_operation,
204
+ position=self._position,
205
+ tilt=self._tilt,
206
+ )
207
+ self._event_bus.trigger_event(CoverEvent(entity_id=self._id, state=event))
208
+
209
+ # ------------------------------------------------------------------
210
+ # Device manager resolution (lazy — same pattern as RemoteOutputBase)
211
+ # ------------------------------------------------------------------
212
+
213
+ def _resolve_device_manager(self) -> bool:
214
+ """Try to resolve device manager lazily from remote_devices reference.
215
+
216
+ Returns:
217
+ ``True`` if device manager is now available.
218
+ """
219
+ if self._device_manager is not None:
220
+ return True
221
+ if self._remote_devices_ref is None:
222
+ return False
223
+ device = self._remote_devices_ref.get_device(self._device_id)
224
+ if device is not None:
225
+ self._device_manager = device
226
+ self._remote_devices_ref = None
227
+ self._register_state_callback()
228
+ _LOGGER.info(
229
+ "Lazily resolved device manager for remote cover '%s' (device '%s')",
230
+ self._id,
231
+ self._device_id,
232
+ )
233
+ return True
234
+ return False
235
+
236
+ def _register_state_callback(self) -> None:
237
+ """Register a cover state change callback on the device manager.
238
+
239
+ Called after device manager is resolved (lazy or immediate).
240
+ ESPHome devices will call back on cover state changes.
241
+ Also syncs current state from the device if available.
242
+ """
243
+ if self._device_manager is None:
244
+ return
245
+ register_fn = getattr(self._device_manager, "register_cover_callback", None)
246
+ if register_fn is not None:
247
+ register_fn(self._cover_id, self.on_remote_state_change)
248
+ _LOGGER.debug(
249
+ "Registered cover callback for remote cover '%s' on device '%s'",
250
+ self._id,
251
+ self._device_id,
252
+ )
253
+
254
+ # Sync initial state from device's current known states
255
+ self._sync_initial_state()
256
+
257
+ def _sync_initial_state(self) -> None:
258
+ """Sync initial state from ESPHome device's cached cover states."""
259
+ if self._device_manager is None:
260
+ return
261
+
262
+ cover_states: dict[str, dict[str, Any]] = getattr(
263
+ self._device_manager, "_cover_states", {}
264
+ )
265
+ if self._cover_id in cover_states:
266
+ self.on_remote_state_change(cover_states[self._cover_id])
267
+ _LOGGER.debug(
268
+ "Synced initial cover state for '%s': position=%d%%",
269
+ self._id,
270
+ self._position,
271
+ )
272
+
273
+ def __repr__(self) -> str:
274
+ return (
275
+ f"RemoteCoverOutput(id={self._id!r}, device={self._device_id!r}, "
276
+ f"cover={self._cover_id!r}, position={self._position})"
277
+ )
@@ -61,20 +61,6 @@ class TimeBasedCover(BaseCover):
61
61
  else:
62
62
  return
63
63
 
64
- if duration == 0:
65
- # A zero open_time/close_time makes movement impossible: the guard
66
- # below returns before relay.turn_on(), so the relay is never
67
- # energised and the motor never gets voltage — while the cover still
68
- # reports IDLE and publishes state, so the UI looks like it worked.
69
- # This is always a misconfiguration, never a normal outcome.
70
- _LOGGER.error(
71
- "Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
72
- "switched. Set a non-zero time in the cover configuration.",
73
- self._id,
74
- direction,
75
- "open" if direction == OPEN else "close",
76
- )
77
-
78
64
  if total_steps == 0 or duration == 0:
79
65
  self._current_operation = IDLE
80
66
  with suppress(RuntimeError):
@@ -93,20 +93,6 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
93
93
  else:
94
94
  total_steps = 1
95
95
 
96
- if duration == 0:
97
- # A zero open_time/close_time makes movement impossible: the guard
98
- # below returns before relay.turn_on(), so the relay is never
99
- # energised and the motor never gets voltage — while the cover still
100
- # reports IDLE and publishes state, so the UI looks like it worked.
101
- # This is always a misconfiguration, never a normal outcome.
102
- _LOGGER.error(
103
- "Cover %s cannot move %s: %s_time is 0. The relay will NOT be "
104
- "switched. Set a non-zero time in the cover configuration.",
105
- self._id,
106
- direction,
107
- "open" if direction == OPEN else "close",
108
- )
109
-
110
96
  if total_steps == 0 or duration == 0:
111
97
  self._current_operation = IDLE
112
98
  self._loop.call_soon_threadsafe(self.send_state, self.state, self.json_position)
@@ -8,18 +8,12 @@ from typing import cast
8
8
 
9
9
  from boneio.components.input.detectors import BinarySensorDetector
10
10
  from boneio.const import PRESSED, RELEASED, BinaryStateTypes, ClickTypes
11
- from boneio.core.utils.timeperiod import parse_time_to_ms
12
11
  from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
13
12
  from boneio.models import InputState
14
13
  from boneio.models.events import InputEvent
15
14
 
16
15
  _LOGGER = logging.getLogger(__name__)
17
16
 
18
- # Matches the binary_sensor bounce_time default in schema.yaml. Needed on the
19
- # hot-reload path, which reads the YAML without running Cerberus, so an
20
- # omitted bounce_time arrives as None rather than as the schema default.
21
- DEFAULT_BOUNCE_TIME_MS = 120
22
-
23
17
 
24
18
  class GpioInputBinarySensor(GpioBaseClass):
25
19
  """Represent Gpio binary sensor on input boards."""
@@ -63,71 +57,6 @@ class GpioInputBinarySensor(GpioBaseClass):
63
57
  if kwargs.get("initial_send", False):
64
58
  gpio_manager.register_on_start_callback(self._send_initial_state)
65
59
 
66
- def update_inverted(self, inverted: bool) -> bool:
67
- """Apply a new ``inverted`` setting to a running sensor.
68
-
69
- Polarity is decided in ``__init__`` and baked into the detector, so a
70
- config reload alone used to leave the running sensor on the old
71
- polarity until the application was restarted.
72
-
73
- Args:
74
- inverted: New inverted flag from the reloaded config.
75
-
76
- Returns:
77
- True if the polarity actually changed (caller should re-publish
78
- the state), False if it was already set that way.
79
- """
80
- inverted = bool(inverted)
81
- if inverted == self._inverted:
82
- return False
83
-
84
- self._inverted = inverted
85
- self._click_type = (RELEASED, PRESSED) if inverted else (PRESSED, RELEASED)
86
-
87
- # Re-read the pin and re-anchor the detector with the new polarity.
88
- gpio_manager = get_gpio_manager(loop=self._loop)
89
- current_value = gpio_manager.read_value(self._pin)
90
- is_pressed = current_value if inverted else not current_value
91
- self._detector.resync(inverted=inverted, current_state=is_pressed)
92
-
93
- _LOGGER.info(
94
- "Binary sensor %s (%s): inverted changed to %s without restart",
95
- self._name,
96
- self._pin,
97
- inverted,
98
- )
99
- return True
100
-
101
- def update_bounce_time(self, bounce_time) -> bool:
102
- """Apply a new debounce window to a running sensor.
103
-
104
- Like ``inverted``, ``bounce_time`` is read in ``__init__`` and handed to
105
- the detector, so a config reload used to leave the old window in place
106
- until the application was restarted.
107
-
108
- Args:
109
- bounce_time: Value straight from the reloaded config — a TimePeriod
110
- at startup, but a bare number of milliseconds (WebUI) or a string
111
- such as "120ms" (hand-written YAML) on the hot-reload path, which
112
- skips Cerberus coercion. ``None`` means the schema default.
113
-
114
- Returns:
115
- True if the window actually changed.
116
- """
117
- seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
118
- if seconds == self._bounce_time:
119
- return False
120
-
121
- self._bounce_time = seconds
122
- self._detector.set_debounce(seconds)
123
- _LOGGER.info(
124
- "Binary sensor %s (%s): bounce_time changed to %.0fms without restart",
125
- self._name,
126
- self._pin,
127
- seconds * 1000,
128
- )
129
- return True
130
-
131
60
  def _send_initial_state(self) -> None:
132
61
  """Send initial state after setup."""
133
62
  self.send_current_state()
@@ -135,14 +135,6 @@ class MultiClickDetector:
135
135
  self._delay_click_types.add(first)
136
136
  break
137
137
 
138
- def set_debounce(self, debounce_seconds: float) -> None:
139
- """Change the debounce window on a running detector.
140
-
141
- Only the window is replaced; timestamps already recorded stay valid
142
- and are simply compared against the new window from now on.
143
- """
144
- self._debounce_seconds = debounce_seconds
145
-
146
138
  def _finalize_clicks(self) -> None:
147
139
  """Finalize a multi-click sequence."""
148
140
  count = self._state.click_count
@@ -423,18 +415,13 @@ class MultiClickDetector:
423
415
  GPIO state to detect missed RELEASE edge events.
424
416
  """
425
417
  if not self._state.last_press_loop_ts or self._state.last_release_ts:
426
- # Button released or invalid state. Drop the handle as well: this
427
- # chain is ending here, and a handle left pointing at a timer that
428
- # has already fired reads as "a long press is running" to the
429
- # release path, which then emits a phantom final LONG on the next
430
- # ordinary click.
418
+ # Button released or invalid state
431
419
  _LOGGER.debug(
432
420
  "Periodic long skipped for %s: press_ts=%s, release_ts=%s",
433
421
  self._name,
434
422
  self._state.last_press_loop_ts is not None,
435
423
  self._state.last_release_ts,
436
424
  )
437
- self._state.long_hold_periodic_timer = None
438
425
  return
439
426
 
440
427
  now = self._loop.time()
@@ -583,27 +570,6 @@ class MultiClickDetector:
583
570
  return
584
571
 
585
572
  _LOGGER.debug("PRESSED: %s (%s)", self._name, self._pin)
586
-
587
- # End any long-hold chain still running from the previous press.
588
- # It can still be running only because that press never saw its
589
- # release — the edge was lost while the event loop was blocked, or
590
- # it was swallowed as a bounce. Left alone, the old chain keeps
591
- # rescheduling itself and now measures against *this* press, so its
592
- # safety timeout never trips and nothing can ever cancel it: the
593
- # handle below is about to be overwritten. Every such press adds
594
- # another immortal chain emitting LONG five times a second.
595
- if self._state.long_hold_periodic_timer:
596
- _LOGGER.warning(
597
- "New press on %s (%s) while a long-hold chain was still "
598
- "running — the previous release was never seen. Ending it.",
599
- self._name,
600
- self._pin,
601
- )
602
- self._state.long_hold_periodic_timer.cancel()
603
- self._state.long_hold_periodic_timer = None
604
- self._state.executed_long_actions = set()
605
- self._state.last_repeat_times = {}
606
-
607
573
  self._state.last_press_ts = timestamp_s
608
574
  self._state.last_press_loop_ts = self._loop.time() # Store loop time for duration calc
609
575
  self._state.last_release_ts = None # Reset release timestamp for new press
@@ -881,33 +847,6 @@ class BinarySensorDetector:
881
847
  self._pin = pin
882
848
  self._state = BinarySensorState()
883
849
 
884
- def set_debounce(self, debounce_seconds: float) -> None:
885
- """Change the debounce window on a running detector.
886
-
887
- Only the window is replaced; timestamps already recorded stay valid
888
- and are simply compared against the new window from now on.
889
- """
890
- self._debounce_seconds = debounce_seconds
891
-
892
- def resync(self, inverted: bool, current_state: bool) -> None:
893
- """Apply a new polarity to a running detector.
894
-
895
- Called when ``inverted`` is changed in the config and reloaded, so the
896
- user does not have to restart the application for it to take effect.
897
-
898
- Args:
899
- inverted: New inverted flag.
900
- current_state: Pressed state as read from the pin right now, already
901
- interpreted with the *new* polarity. Without re-anchoring it the
902
- cached state would still describe the old polarity and the next
903
- edge would be dropped by the "state unchanged" guard.
904
- """
905
- self._inverted = bool(inverted)
906
- self._state.current_state = bool(current_state)
907
- # Drop the debounce anchor — the pending window belongs to the old
908
- # polarity and would swallow the first edge after the change.
909
- self._state.last_press_ts = None
910
-
911
850
  def handle_event(self, event: gpiod.EdgeEvent) -> None:
912
851
  """Process a GPIO edge event for binary sensor.
913
852
 
@@ -7,7 +7,7 @@ import time
7
7
 
8
8
  from boneio.components.input.detectors import MultiClickDetector
9
9
  from boneio.const import ClickTypes
10
- from boneio.core.utils.timeperiod import parse_time_to_ms
10
+ from boneio.core.utils import TimePeriod
11
11
  from boneio.hardware.gpio.input import GpioBaseClass, get_gpio_manager
12
12
 
13
13
  _LOGGER = logging.getLogger(__name__)
@@ -16,31 +16,25 @@ _LOGGER = logging.getLogger(__name__)
16
16
  DEFAULT_DOUBLE_CLICK_DURATION_MS = 220
17
17
  DEFAULT_LONG_PRESS_DURATION_MS = 400
18
18
  DEFAULT_SEQUENCE_WINDOW_MS = 500
19
- # Matches the event bounce_time default in schema.yaml. Needed on the hot-reload
20
- # path, which reads the YAML without running Cerberus, so an omitted bounce_time
21
- # arrives as None rather than as the schema default.
22
- DEFAULT_BOUNCE_TIME_MS = 30
23
19
 
24
20
 
25
21
  def _to_milliseconds(value, default_ms: int) -> int:
26
22
  """Convert a value to milliseconds.
27
23
 
28
24
  Args:
29
- value: TimePeriod, bare number of milliseconds, string with a unit
30
- (e.g. "300ms"), or None.
31
- default_ms: Default value in milliseconds if value is None or unusable.
25
+ value: Can be int, float, TimePeriod, or None
26
+ default_ms: Default value in milliseconds if value is None
32
27
 
33
28
  Returns:
34
- Value in milliseconds as integer.
35
-
36
- Note:
37
- Strings have to be handled here, not just TimePeriod: Cerberus coerces
38
- these fields at startup, but the hot-reload path reads the YAML without
39
- validating, and EventForm writes them as strings like "300ms". Falling
40
- back to the default for those quietly reset every custom click timing on
41
- each reload.
29
+ Value in milliseconds as integer
42
30
  """
43
- return parse_time_to_ms(value, default_ms)
31
+ if value is None:
32
+ return default_ms
33
+ if isinstance(value, TimePeriod):
34
+ return int(value.total_milliseconds)
35
+ if isinstance(value, (int, float)):
36
+ return int(value)
37
+ return default_ms
44
38
 
45
39
 
46
40
  class GpioEventButton(GpioBaseClass):
@@ -179,7 +173,6 @@ class GpioEventButton(GpioBaseClass):
179
173
  enable_triple_click: bool | None = None,
180
174
  long_press_mqtt_mode: str | None = None,
181
175
  max_long_press_duration: int | float | None = None,
182
- bounce_time: object | None = None,
183
176
  ) -> None:
184
177
  """Update timing parameters for click detection.
185
178
 
@@ -196,9 +189,6 @@ class GpioEventButton(GpioBaseClass):
196
189
  enable_triple_click: Enable triple click detection
197
190
  long_press_mqtt_mode: 'single' or 'periodic' for MQTT long press events
198
191
  max_long_press_duration: Safety timeout for long press in ms (default: 120000ms)
199
- bounce_time: Debounce window — a TimePeriod at startup, but a bare
200
- number of milliseconds or a string such as "30ms" on the
201
- hot-reload path, which skips Cerberus coercion
202
192
  """
203
193
  from boneio.const import CLICK_SEQUENCES
204
194
 
@@ -270,16 +260,3 @@ class GpioEventButton(GpioBaseClass):
270
260
  if long_press_mqtt_mode is not None:
271
261
  self._long_press_mqtt_mode = long_press_mqtt_mode
272
262
  _LOGGER.debug("Updated long_press_mqtt_mode to %s for %s", long_press_mqtt_mode, self._name)
273
-
274
- # bounce_time is handed to the detector in __init__, so it needs pushing
275
- # through explicitly — None here means "back to the schema default".
276
- seconds = parse_time_to_ms(bounce_time, DEFAULT_BOUNCE_TIME_MS) / 1000.0
277
- if seconds != self._bounce_time:
278
- self._bounce_time = seconds
279
- self._detector.set_debounce(seconds)
280
- _LOGGER.info(
281
- "Event input %s (%s): bounce_time changed to %.0fms without restart",
282
- self._name,
283
- self._pin,
284
- seconds * 1000,
285
- )