boneio 1.5.0.dev8__tar.gz → 1.5.0.dev10__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 (508) hide show
  1. {boneio-1.5.0.dev8/boneio.egg-info → boneio-1.5.0.dev10}/PKG-INFO +1 -1
  2. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/time_based.py +3 -2
  3. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/venetian.py +4 -3
  4. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/config_helper.py +57 -19
  5. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/discovery.py +2 -2
  6. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/covers.py +9 -1
  7. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/inputs.py +13 -4
  8. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/irrigation.py +1 -1
  9. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/manager.py +18 -27
  10. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/update.py +1 -1
  11. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/mqtt.py +1 -1
  12. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/__init__.py +2 -1
  13. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/timeperiod.py +67 -0
  14. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/homeassistant.py +9 -9
  15. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/lox_template.py +2 -2
  16. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/boneio-edge-temp.json +1 -1
  17. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/base.py +1 -1
  18. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/runner.py +2 -1
  19. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/schema.yaml +13 -0
  20. boneio-1.5.0.dev10/boneio/version.py +2 -0
  21. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/BindingMatrix-DAAjBzzR.js +1 -0
  22. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ConfigEditor-iXr5kaqI.js +1 -0
  23. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EditItemDialog-tVR2WDXW.js +66 -0
  24. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityCard-CVch9a7x.js +1 -0
  25. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/EntityGrid-DrIgH2RW.js +1 -0
  26. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +1 -0
  27. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/InputsView-DcezF20P.js +1 -0
  28. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/LogViewer-BPb6YMmQ.js +2 -0
  29. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +1 -0
  30. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/ModbusView-DfHlmQ4U.js +1 -0
  31. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/NodeRedView-CR3ZGtc9.js +1 -0
  32. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/OutputsView-nljQGE7z.js +1 -0
  33. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +11 -0
  34. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SensorView-B2oFg70N.js +1 -0
  35. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +10 -0
  36. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SudoPasswordDialog-CYEaTaL9.js +1 -0
  37. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/SystemState-D7PUoRdp.js +1 -0
  38. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/TemplatesView-BDccDcwP.js +1 -0
  39. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/Tools-DAFDHpzm.js +14 -0
  40. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/UISettings-L_Uh0sL_.js +38 -0
  41. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +2 -0
  42. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +2 -0
  43. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +1 -0
  44. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +1 -0
  45. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/dialog-Bj5BD-Tr.js +1 -0
  46. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +1 -0
  47. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/gi-AjEh3QsP.js +1 -0
  48. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/index-CDsuwPez.js +2 -0
  49. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +2 -0
  50. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D5oIDT5t.js +1 -0
  51. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/select-CZiAfWrl.js +1 -0
  52. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/tabs-box-BQJbfr3G.js +1 -0
  53. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +13 -0
  54. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/utils-C6puLrXz.js +1 -0
  55. boneio-1.5.0.dev10/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +11 -0
  56. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/index.html +5 -3
  57. {boneio-1.5.0.dev8/boneio/webui → boneio-1.5.0.dev10/boneio/webui/frontend-dist}/schema/boneio.schema.json +8 -0
  58. {boneio-1.5.0.dev8/boneio/webui → boneio-1.5.0.dev10/boneio/webui/frontend-dist}/schema/config.schema.json +8 -0
  59. boneio-1.5.0.dev10/boneio/webui/frontend-dist/sw.js +1 -0
  60. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/middleware/auth.py +1 -0
  61. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/config.py +342 -7
  62. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/dev_fake_device.py +2 -2
  63. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/sensors.py +41 -0
  64. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/system.py +60 -3
  65. {boneio-1.5.0.dev8/boneio/webui/frontend-dist → boneio-1.5.0.dev10/boneio/webui}/schema/boneio.schema.json +8 -0
  66. {boneio-1.5.0.dev8/boneio/webui/frontend-dist → boneio-1.5.0.dev10/boneio/webui}/schema/config.schema.json +8 -0
  67. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10/boneio.egg-info}/PKG-INFO +1 -1
  68. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/SOURCES.txt +35 -5
  69. boneio-1.5.0.dev8/boneio/version.py +0 -2
  70. boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/ConfigEditor-D4xZU9og.js +0 -1
  71. boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/aiWizardPrompt-DFwp2Xa8.js +0 -2
  72. boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/index-BpK_lX6d.js +0 -140
  73. boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/index-zdMDZxqr.css +0 -2
  74. boneio-1.5.0.dev8/boneio/webui/frontend-dist/assets/vendor-pmGLHP0_.js +0 -55
  75. boneio-1.5.0.dev8/boneio/webui/frontend-dist/sw.js +0 -1
  76. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/LICENSE +0 -0
  77. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/MANIFEST.in +0 -0
  78. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/README.md +0 -0
  79. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/__init__.py +0 -0
  80. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/input.yaml +0 -0
  81. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_24_16.yaml +0 -0
  82. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_32_10.yaml +0 -0
  83. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_32_5.yaml +0 -0
  84. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_cover.yaml +0 -0
  85. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  86. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/input.yaml +0 -0
  87. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_24_16.yaml +0 -0
  88. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_32_10.yaml +0 -0
  89. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_32_5.yaml +0 -0
  90. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_cover.yaml +0 -0
  91. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  92. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/input.yaml +0 -0
  93. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_24_16.yaml +0 -0
  94. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_32_10.yaml +0 -0
  95. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_32_5.yaml +0 -0
  96. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_cover.yaml +0 -0
  97. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  98. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/input.yaml +0 -0
  99. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_24_16.yaml +0 -0
  100. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_32_10.yaml +0 -0
  101. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_cover.yaml +0 -0
  102. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  103. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/input.yaml +0 -0
  104. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_24_16.yaml +0 -0
  105. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_32_10.yaml +0 -0
  106. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_cover.yaml +0 -0
  107. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  108. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/input.yaml +0 -0
  109. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_24_16.yaml +0 -0
  110. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_32_10.yaml +0 -0
  111. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_48_4.yaml +0 -0
  112. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_cover.yaml +0 -0
  113. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  114. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/input.yaml +0 -0
  115. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_24_16.yaml +0 -0
  116. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_32_10.yaml +0 -0
  117. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_48_4.yaml +0 -0
  118. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_cover.yaml +0 -0
  119. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  120. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/input.yaml +0 -0
  121. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_24_16.yaml +0 -0
  122. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_32_10.yaml +0 -0
  123. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_48_4.yaml +0 -0
  124. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_cover.yaml +0 -0
  125. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  126. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/bonecli.py +0 -0
  127. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/__init__.py +0 -0
  128. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/__init__.py +0 -0
  129. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/cover/cover.py +0 -0
  130. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/group/__init__.py +0 -0
  131. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/group/output_group.py +0 -0
  132. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/__init__.py +0 -0
  133. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/binary_sensor.py +0 -0
  134. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/detectors.py +0 -0
  135. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/event.py +0 -0
  136. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/__init__.py +0 -0
  137. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/base.py +0 -0
  138. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/input/remote/esphome.py +0 -0
  139. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/__init__.py +0 -0
  140. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/controller.py +0 -0
  141. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/irrigation/water_source.py +0 -0
  142. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/__init__.py +0 -0
  143. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/basic.py +0 -0
  144. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/buzzer.py +0 -0
  145. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/mcp.py +0 -0
  146. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/pca.py +0 -0
  147. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/pcf.py +0 -0
  148. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/output/remote.py +0 -0
  149. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/sensor/__init__.py +0 -0
  150. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/sensor/virtual_energy.py +0 -0
  151. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/__init__.py +0 -0
  152. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/alarm_panel.py +0 -0
  153. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/gate_cover.py +0 -0
  154. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/components/template/thermostat.py +0 -0
  155. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/const.py +0 -0
  156. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/__init__.py +0 -0
  157. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/__init__.py +0 -0
  158. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/__init__.py +0 -0
  159. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  160. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  161. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  162. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/registration.py +0 -0
  163. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/cloud/secrets.py +0 -0
  164. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/__init__.py +0 -0
  165. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/__init__.py +0 -0
  166. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  167. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/migrations/v2_transition.py +0 -0
  168. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/package-lock.json +0 -0
  169. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/package.json +0 -0
  170. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/schema_converter.py +0 -0
  171. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/config/yaml_util.py +0 -0
  172. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/events/__init__.py +0 -0
  173. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/events/bus.py +0 -0
  174. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/__init__.py +0 -0
  175. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/action_conditions.py +0 -0
  176. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/canopen.py +0 -0
  177. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/display.py +0 -0
  178. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/modbus.py +0 -0
  179. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/outputs.py +0 -0
  180. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/remote.py +0 -0
  181. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/remote_input_registrar.py +0 -0
  182. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/sensors.py +0 -0
  183. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/__init__.py +0 -0
  184. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/alarm.py +0 -0
  185. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/gate_cover.py +0 -0
  186. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates/thermostat.py +0 -0
  187. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/manager/templates.py +0 -0
  188. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/__init__.py +0 -0
  189. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/basic.py +0 -0
  190. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/basic_mqtt.py +0 -0
  191. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/composite.py +0 -0
  192. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/local.py +0 -0
  193. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/lox.py +0 -0
  194. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/messaging/queue.py +0 -0
  195. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/__init__.py +0 -0
  196. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/base.py +0 -0
  197. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/can.py +0 -0
  198. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/esphome.py +0 -0
  199. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/mqtt.py +0 -0
  200. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/remote/wled.py +0 -0
  201. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/__init__.py +0 -0
  202. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/base.py +0 -0
  203. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/sensor/system.py +0 -0
  204. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/state/__init__.py +0 -0
  205. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/state/manager.py +0 -0
  206. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/__init__.py +0 -0
  207. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/host_data.py +0 -0
  208. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/system/monitor.py +0 -0
  209. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/async_updater.py +0 -0
  210. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/conditions.py +0 -0
  211. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/filter.py +0 -0
  212. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/font_util.py +0 -0
  213. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/logger.py +0 -0
  214. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/core/utils/util.py +0 -0
  215. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/adc.yaml +0 -0
  216. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  217. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/config.yaml +0 -0
  218. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/event.yaml +0 -0
  219. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/mqtt.yaml +0 -0
  220. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  221. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/adc.yaml +0 -0
  222. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  223. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/config.yaml +0 -0
  224. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/event.yaml +0 -0
  225. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/mqtt.yaml +0 -0
  226. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  227. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/adc.yaml +0 -0
  228. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  229. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/config.yaml +0 -0
  230. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/event.yaml +0 -0
  231. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/mqtt.yaml +0 -0
  232. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  233. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/__init__.py +0 -0
  234. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/can_master.yaml +0 -0
  235. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/can_slave.yaml +0 -0
  236. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/adc.yaml +0 -0
  237. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  238. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/config.yaml +0 -0
  239. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/cover.yaml +0 -0
  240. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/event.yaml +0 -0
  241. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/mqtt.yaml +0 -0
  242. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover/outputCover.yaml +0 -0
  243. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/adc.yaml +0 -0
  244. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  245. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/config.yaml +0 -0
  246. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/cover.yaml +0 -0
  247. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/event.yaml +0 -0
  248. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  249. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  250. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/adc.yaml +0 -0
  251. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  252. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  253. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  254. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  255. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/event_all.yaml +0 -0
  256. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  257. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  258. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  259. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  260. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  261. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  262. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/exceptions.py +0 -0
  263. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/__init__.py +0 -0
  264. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/analog/__init__.py +0 -0
  265. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/analog/adc.py +0 -0
  266. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/__init__.py +0 -0
  267. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/bridge.py +0 -0
  268. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/client.py +0 -0
  269. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/interface.py +0 -0
  270. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/node.py +0 -0
  271. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/node_id.py +0 -0
  272. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/can/test_od.py +0 -0
  273. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/__init__.py +0 -0
  274. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/early_oled.py +0 -0
  275. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  276. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/display/oled.py +0 -0
  277. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/__init__.py +0 -0
  278. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  279. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  280. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  281. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  282. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/__init__.py +0 -0
  283. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/base.py +0 -0
  284. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/gpio/input/manager.py +0 -0
  285. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/__init__.py +0 -0
  286. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/bus.py +0 -0
  287. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/ina219.py +0 -0
  288. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/ina219_driver.py +0 -0
  289. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/mcp9808.py +0 -0
  290. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/i2c/pct2075.py +0 -0
  291. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/__init__.py +0 -0
  292. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/bus.py +0 -0
  293. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/dallas.py +0 -0
  294. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/onewire/ds2482.py +0 -0
  295. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/__init__.py +0 -0
  296. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  297. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/base.py +0 -0
  298. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  299. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  300. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/__init__.py +0 -0
  301. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/integration/interlock.py +0 -0
  302. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/__init__.py +0 -0
  303. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/actions.py +0 -0
  304. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  305. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/daemon.json +0 -0
  306. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  307. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  308. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  309. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  310. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  311. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/journald/journald.conf +0 -0
  312. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  313. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/sudoers/boneio +0 -0
  314. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  315. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  316. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/boneio.service +0 -0
  317. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  318. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  319. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  320. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  321. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  322. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  323. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  324. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  325. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  326. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/runner.py +0 -0
  327. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/__init__.py +0 -0
  328. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  329. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  330. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  331. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  332. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  333. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  334. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  335. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  336. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/__init__.py +0 -0
  337. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/cli.py +0 -0
  338. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/client.py +0 -0
  339. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/coordinator.py +0 -0
  340. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/__init__.py +0 -0
  341. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  342. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  343. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  344. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  345. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  346. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  347. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  348. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  349. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  350. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  351. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/thessla.json +0 -0
  352. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  353. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  354. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/inverters/sofar.json +0 -0
  355. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  356. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  357. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  358. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/cwt.json +0 -0
  359. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  360. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  361. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  362. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  363. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/pt100.json +0 -0
  364. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/sht20.json +0 -0
  365. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/devices/sensors/sht30.json +0 -0
  366. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/__init__.py +0 -0
  367. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/__init__.py +0 -0
  368. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/numeric.py +0 -0
  369. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/select.py +0 -0
  370. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/switch.py +0 -0
  371. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/derived/text.py +0 -0
  372. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/__init__.py +0 -0
  373. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/binary.py +0 -0
  374. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/numeric.py +0 -0
  375. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/sensor/text.py +0 -0
  376. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/__init__.py +0 -0
  377. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/binary.py +0 -0
  378. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/entities/writeable/numeric.py +0 -0
  379. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/mock_coordinator.py +0 -0
  380. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/modbus/utils.py +0 -0
  381. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/__init__.py +0 -0
  382. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/actions.py +0 -0
  383. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/events.py +0 -0
  384. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/files.py +0 -0
  385. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/logs.py +0 -0
  386. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/mqtt.py +0 -0
  387. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/models/state.py +0 -0
  388. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions.yaml +0 -0
  389. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions_sensor.yaml +0 -0
  390. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/actions_switch.yaml +0 -0
  391. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/condition.yaml +0 -0
  392. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/filters.yaml +0 -0
  393. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/filters_adc.yaml +0 -0
  394. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/id.yaml +0 -0
  395. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_devices.yaml +0 -0
  396. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_inputs.yaml +0 -0
  397. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/remote_outputs.yaml +0 -0
  398. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/temp_unit.yaml +0 -0
  399. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/schema/update_interval.yaml +0 -0
  400. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/action_validation.py +0 -0
  401. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/app.py +0 -0
  402. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/dashboard_cards.py +0 -0
  403. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  404. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  405. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  406. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  407. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  408. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  409. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  410. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  411. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  412. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  413. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  414. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  415. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  416. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio.svg +0 -0
  417. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  418. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  419. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  420. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  421. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  422. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  423. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  424. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  425. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  426. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  427. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  428. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  429. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  430. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  431. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  432. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  433. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  434. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  435. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  436. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  437. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  438. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  439. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  440. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  441. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  442. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  443. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  444. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  445. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  446. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  447. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  448. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  449. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/hvac_svg_templates.py +0 -0
  450. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/middleware/__init__.py +0 -0
  451. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/modbus_card_templates.py +0 -0
  452. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/__init__.py +0 -0
  453. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/auth.py +0 -0
  454. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/caddy.py +0 -0
  455. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/can.py +0 -0
  456. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/covers.py +0 -0
  457. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/dashboard.py +0 -0
  458. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/irrigation.py +0 -0
  459. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/migrations.py +0 -0
  460. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/modbus.py +0 -0
  461. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/outputs.py +0 -0
  462. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/remote_devices.py +0 -0
  463. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/templates.py +0 -0
  464. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/timezone_sudoers.py +0 -0
  465. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/tools.py +0 -0
  466. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/routes/update.py +0 -0
  467. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/adc.schema.json +0 -0
  468. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/areas.schema.json +0 -0
  469. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  470. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/can.schema.json +0 -0
  471. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/cover.schema.json +0 -0
  472. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/dallas.schema.json +0 -0
  473. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/ds2482.schema.json +0 -0
  474. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/event.schema.json +0 -0
  475. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/ina219.schema.json +0 -0
  476. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/irrigation.schema.json +0 -0
  477. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/lm75.schema.json +0 -0
  478. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/logger.schema.json +0 -0
  479. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/lox_udp.schema.json +0 -0
  480. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mcp23017.schema.json +0 -0
  481. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mcp9808.schema.json +0 -0
  482. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/modbus.schema.json +0 -0
  483. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  484. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/mqtt.schema.json +0 -0
  485. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/oled.schema.json +0 -0
  486. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/output.schema.json +0 -0
  487. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/output_group.schema.json +0 -0
  488. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/pca9685.schema.json +0 -0
  489. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/pcf8575.schema.json +0 -0
  490. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_devices.schema.json +0 -0
  491. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  492. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  493. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/sensor.schema.json +0 -0
  494. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/template.schema.json +0 -0
  495. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  496. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/schema/web.schema.json +0 -0
  497. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/services/__init__.py +0 -0
  498. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/services/logs.py +0 -0
  499. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/web_server.py +0 -0
  500. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio/webui/websocket_manager.py +0 -0
  501. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/dependency_links.txt +0 -0
  502. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/entry_points.txt +0 -0
  503. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/requires.txt +0 -0
  504. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/boneio.egg-info/top_level.txt +0 -0
  505. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/pyproject.toml +0 -0
  506. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/setup.cfg +0 -0
  507. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/setup.py +0 -0
  508. {boneio-1.5.0.dev8 → boneio-1.5.0.dev10}/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.0.dev8
3
+ Version: 1.5.0.dev10
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
@@ -12,6 +12,7 @@ from boneio.components.output import BasicOutput
12
12
  from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
13
13
  from boneio.core.events import EventBus
14
14
  from boneio.core.utils import TimePeriod
15
+ from boneio.core.utils.timeperiod import ensure_time_period
15
16
 
16
17
  _LOGGER = logging.getLogger(__name__)
17
18
  DEFAULT_RESTORED_STATE = {"position": 100}
@@ -151,6 +152,6 @@ class TimeBasedCover(BaseCover):
151
152
  Keys: open_time, close_time
152
153
  """
153
154
  if "open_time" in config:
154
- self._open_time = config["open_time"].total_milliseconds
155
+ self._open_time = ensure_time_period(config["open_time"]).total_milliseconds
155
156
  if "close_time" in config:
156
- self._close_time = config["close_time"].total_milliseconds
157
+ self._close_time = ensure_time_period(config["close_time"]).total_milliseconds
@@ -8,6 +8,7 @@ import time
8
8
  from boneio.components.cover.cover import BaseCover, BaseVenetianCoverABC
9
9
  from boneio.const import CLOSE, CLOSING, IDLE, OPEN, OPENING, STOP
10
10
  from boneio.core.utils import TimePeriod
11
+ from boneio.core.utils.timeperiod import ensure_time_period
11
12
  from boneio.models import PositionDict, SavedPositionDict
12
13
 
13
14
  _LOGGER = logging.getLogger(__name__)
@@ -362,11 +363,11 @@ class VenetianCover(BaseCover, BaseVenetianCoverABC):
362
363
  Keys: open_time, close_time, tilt_duration, tilt_restore_after_close
363
364
  """
364
365
  if "open_time" in config:
365
- self._open_time = config["open_time"].total_milliseconds
366
+ self._open_time = ensure_time_period(config["open_time"]).total_milliseconds
366
367
  if "close_time" in config:
367
- self._close_time = config["close_time"].total_milliseconds
368
+ self._close_time = ensure_time_period(config["close_time"]).total_milliseconds
368
369
  if "tilt_duration" in config and config["tilt_duration"]:
369
- self._tilt_duration = config["tilt_duration"].total_milliseconds
370
+ self._tilt_duration = ensure_time_period(config["tilt_duration"]).total_milliseconds
370
371
  if "tilt_restore_after_close" in config:
371
372
  self._tilt_restore_after_close = bool(config["tilt_restore_after_close"])
372
373
 
@@ -6,6 +6,7 @@ from __future__ import annotations
6
6
  import logging
7
7
  from _collections_abc import dict_values
8
8
  from typing import TYPE_CHECKING, Any
9
+ import time as _time
9
10
 
10
11
  if TYPE_CHECKING:
11
12
  from boneio.integration.homeassistant import HomeAssistantDiscoveryMessage
@@ -28,7 +29,6 @@ from boneio.const import (
28
29
  VALVE,
29
30
  )
30
31
  from boneio.core.system import get_serial_from_mac
31
- from boneio.core.utils.util import sanitize_mqtt_topic
32
32
 
33
33
  _LOGGER = logging.getLogger(__name__)
34
34
 
@@ -53,21 +53,29 @@ class ConfigHelper:
53
53
  pwa_name: str | None = None,
54
54
  ha_child_devices: bool = False,
55
55
  ha_child_devices_naming: str = "default",
56
+ serial_override: str | None = None,
56
57
  ):
57
58
  self._name = name
58
59
  self._version = version
59
60
 
60
- # Generate serial number from MAC - always required for topic prefix
61
- self._serial_no = get_serial_from_mac(network_info or {})
61
+ # Generate real serial number from MAC - always required for physical identification
62
+ self._real_serial = get_serial_from_mac(network_info or {})
62
63
 
63
- # Build fixed topic prefix: boneio/blk_{serial}
64
+ # If override is provided, use it as effective serial, otherwise use real MAC-based serial
65
+ if serial_override:
66
+ self._serial_no = serial_override
67
+ _LOGGER.warning("Serial override active: effective=%s, real=%s", serial_override, self._real_serial)
68
+ else:
69
+ self._serial_no = self._real_serial
70
+
71
+ # Build fixed topic prefix: boneio/blk_{serial} using effective serial
64
72
  # This is no longer configurable - always uses this format
65
73
  if self._serial_no:
66
74
  self._topic_prefix = f"boneio/{self._serial_no}"
67
75
  else:
68
76
  # Fallback if MAC not available (should rarely happen)
69
77
  self._topic_prefix = "boneio/blk_unknown"
70
- _LOGGER.warning("Could not determine serial number from MAC, using fallback topic prefix")
78
+ _LOGGER.warning("Could not determine serial number, using fallback topic prefix")
71
79
 
72
80
  # PWA short name for Android home screen (max 12 chars)
73
81
  if pwa_name:
@@ -165,7 +173,8 @@ class ConfigHelper:
165
173
 
166
174
  @property
167
175
  def serial_number(self) -> str:
168
- return self._serial_no
176
+ """Get effective device serial number (e.g., 'blk_abc123')."""
177
+ return self._serial_no or "blk_unknown"
169
178
 
170
179
  @property
171
180
  def proxy_port(self) -> int | None:
@@ -186,9 +195,16 @@ class ConfigHelper:
186
195
  return self._topic_prefix
187
196
 
188
197
  @property
189
- def serial_no(self) -> str:
190
- """Get device serial number (e.g., 'blk_abc123')."""
191
- return self._serial_no or "blk_unknown"
198
+ def real_serial(self) -> str:
199
+ """Real serial from MAC — for HA device_info and UI display."""
200
+ return self._real_serial or "blk_unknown"
201
+
202
+ @property
203
+ def serial_override(self) -> str | None:
204
+ """Return override value if active, None otherwise."""
205
+ if self._serial_no != self._real_serial:
206
+ return self._serial_no
207
+ return None
192
208
 
193
209
  @property
194
210
  def pwa_name(self) -> str:
@@ -390,16 +406,20 @@ class ConfigHelper:
390
406
  return self._config_cache
391
407
 
392
408
  def reload_config(self) -> dict[str, Any]:
393
- """Reload configuration from file and update cache.
409
+ """Reload configuration from YAML file (fast path for hot-reload).
394
410
 
395
- Loads config from file using load_config_from_file() which tries the
396
- disk cache first (~0.5s) and falls back to full Cerberus validation
397
- (~20s) on cache miss. This method does NOT wait for any background
398
- cache rebuild — it's independent.
411
+ Uses load_yaml_file() + merge_board_config() to read the config
412
+ directly from YAML without running Cerberus validation. This is
413
+ much faster (~0.5-1s) than the full validation path (~20s on BB).
399
414
 
400
- NOTE: This method may take up to ~20s on BeagleBone if disk cache
401
- is not available. Callers should run it via asyncio.to_thread() to
402
- avoid blocking the event loop.
415
+ Full Cerberus validation is only needed at:
416
+ - Application startup (via load_config_from_file)
417
+ - Background disk cache rebuild (debounced after config changes)
418
+ - Monaco YAML editor validation (load_config_from_string)
419
+
420
+ NOTE: Migrations are not applied here — they run at startup and
421
+ are idempotent (version-gated). Config saved via the UI always
422
+ has current schema version.
403
423
 
404
424
  Returns:
405
425
  dict: Reloaded configuration dictionary
@@ -407,8 +427,26 @@ class ConfigHelper:
407
427
  Raises:
408
428
  ValueError: If config_file_path is not set
409
429
  """
410
- _LOGGER.info("Reloading config from file: %s", self._config_file_path)
411
- return self.get_config(force_reload=True)
430
+
431
+ if self._config_file_path is None:
432
+ raise ValueError("config_file_path not set in ConfigHelper")
433
+
434
+ _t0 = _time.monotonic()
435
+ _LOGGER.info("Fast-reloading config from: %s", self._config_file_path)
436
+
437
+ from boneio.core.config.yaml_util import load_yaml_file, merge_board_config
438
+
439
+ config_yaml = load_yaml_file(self._config_file_path)
440
+ if config_yaml is None:
441
+ raise ValueError(f"Failed to load config from: {self._config_file_path}")
442
+
443
+ merged = merge_board_config(config_yaml)
444
+ self._config_cache = merged
445
+
446
+ elapsed = _time.monotonic() - _t0
447
+ _LOGGER.info("Fast config reload completed in %.2fs", elapsed)
448
+
449
+ return merged
412
450
 
413
451
  def get_section(self, section_name: str, force_reload: bool = False) -> Any:
414
452
  """Get a specific configuration section.
@@ -62,9 +62,9 @@ class BlackDiscoveryPublisher:
62
62
 
63
63
  config_helper = self._manager._config_helper
64
64
  device_info = {
65
- "id": config_helper._serial_no or "unknown",
65
+ "id": config_helper.serial_number,
66
66
  "name": config_helper.name,
67
- "serial_number": config_helper._serial_no or "unknown",
67
+ "serial_number": config_helper.serial_number,
68
68
  "type": "black",
69
69
  "firmware": __version__,
70
70
  "topic_prefix": config_helper.topic_prefix,
@@ -14,7 +14,7 @@ import logging
14
14
  from typing import TYPE_CHECKING, Any
15
15
 
16
16
  from boneio.const import COVER, DEVICE_CLASS, ID, NAME, RESTORE_STATE, SHOW_HA, cover_actions, filter_cover_extra_data
17
- from boneio.core.utils import TimePeriod, strip_accents
17
+ from boneio.core.utils import TimePeriod, ensure_time_period, strip_accents
18
18
  from boneio.exceptions import CoverConfigurationException
19
19
  from boneio.integration import ha_cover_availabilty_message
20
20
  from boneio.integration.homeassistant import ha_cover_with_tilt_availabilty_message
@@ -230,6 +230,14 @@ class CoverManager:
230
230
 
231
231
  platform = config.get("platform", "time_based")
232
232
 
233
+ # Normalize time period fields — during hot-reload YAML values may
234
+ # arrive as raw strings (e.g. "5s") instead of TimePeriod objects.
235
+ for time_key in ("open_time", "close_time", "actuator_activation_duration"):
236
+ if time_key in config and config[time_key] is not None:
237
+ config[time_key] = ensure_time_period(config[time_key])
238
+ if tilt_duration is not None and not isinstance(tilt_duration, TimePeriod):
239
+ tilt_duration = ensure_time_period(tilt_duration)
240
+
233
241
  def state_save(value: dict[str, float]):
234
242
  if config[RESTORE_STATE]:
235
243
  self._manager._state_manager.save_attribute(
@@ -255,13 +255,17 @@ class InputManager:
255
255
 
256
256
  # Reload: update existing input's actions and name
257
257
  if existing_input:
258
- # Check if HA-relevant fields changed (name, area, mqtt_sequences)
258
+ # Check if HA-relevant fields changed (name, area, device_class, mqtt_sequences)
259
259
  old_name = existing_input._name if hasattr(existing_input, "_name") else None
260
260
  old_area = getattr(existing_input, "area", None)
261
+ old_device_class = getattr(existing_input, "_device_class", None)
262
+ new_device_class = gpio.get(DEVICE_CLASS)
261
263
  old_mqtt_sequences = existing_input.mqtt_sequences if hasattr(existing_input, "mqtt_sequences") else {}
262
264
  new_mqtt_sequences = gpio.get("mqtt_sequences", {})
263
265
  ha_fields_changed = (
264
- (old_name != name) or (old_area != area) or (old_mqtt_sequences != new_mqtt_sequences)
266
+ (old_name != name) or (old_area != area)
267
+ or (old_device_class != new_device_class)
268
+ or (old_mqtt_sequences != new_mqtt_sequences)
265
269
  )
266
270
 
267
271
  # Update actions (always - this is internal to the controller)
@@ -383,10 +387,15 @@ class InputManager:
383
387
 
384
388
  # Reload: update existing input's actions and name
385
389
  if existing_input:
386
- # Check if HA-relevant fields changed (name, area)
390
+ # Check if HA-relevant fields changed (name, area, device_class)
387
391
  old_name = existing_input._name if hasattr(existing_input, "_name") else None
388
392
  old_area = getattr(existing_input, "area", None)
389
- ha_fields_changed = (old_name != name) or (old_area != area)
393
+ old_device_class = getattr(existing_input, "_device_class", None)
394
+ new_device_class = gpio.get(DEVICE_CLASS)
395
+ ha_fields_changed = (
396
+ (old_name != name) or (old_area != area)
397
+ or (old_device_class != new_device_class)
398
+ )
390
399
 
391
400
  # Update actions (always - this is internal to the controller)
392
401
  existing_input.set_actions(actions=actions)
@@ -309,7 +309,7 @@ class IrrigationManager:
309
309
  Sends empty payload to discovery topics to remove entities from HA.
310
310
  """
311
311
  cfg = self._manager.config_helper
312
- serial = cfg.serial_no
312
+ serial = cfg.serial_number
313
313
 
314
314
  # Build list of discovery IDs to remove
315
315
  discovery_ids: list[tuple[str, str]] = [
@@ -52,6 +52,7 @@ from boneio.core.manager.templates import TemplateManager
52
52
  from boneio.core.manager.update import UpdateManager
53
53
  from boneio.core.messaging import MessageBus
54
54
  from boneio.core.state import StateManager
55
+ from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
55
56
  from boneio.hardware.i2c.bus import SMBus2I2C
56
57
  from boneio.migrations import MigrationRunner, MigrationStatus
57
58
 
@@ -243,7 +244,7 @@ class Manager:
243
244
  self.remote_devices = RemoteDeviceManager(
244
245
  message_bus=message_bus,
245
246
  remote_devices_config=remote_devices,
246
- own_serial=config_helper.serial_no,
247
+ own_serial=config_helper.serial_number,
247
248
  name=self.config_helper.name,
248
249
  )
249
250
 
@@ -625,7 +626,7 @@ class Manager:
625
626
  ha_type: Home Assistant entity type (sensor, light, cover …).
626
627
  payload: Ready-to-publish discovery payload dict.
627
628
  """
628
- topic = f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_no}/{id}/config"
629
+ topic = f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_number}/{id}/config"
629
630
  _LOGGER.debug("Sending HA discovery for %s entity %s.", ha_type, id)
630
631
  self._config_helper.add_autodiscovery_msg(topic=topic, ha_type=ha_type, payload=payload)
631
632
  self.send_message(topic=topic, payload=payload, retain=True)
@@ -657,23 +658,19 @@ class Manager:
657
658
  """Copy long press meta fields (duration thresholds, repeat), delay, and conditions to parsed action."""
658
659
  for key in ("min_duration", "max_duration"):
659
660
  if action_definition.get(key) is not None:
660
- parsed_action[key] = action_definition[key]
661
+ parsed_action[key] = parse_time_to_ms(action_definition[key], None)
661
662
  if action_definition.get("repeat"):
662
663
  parsed_action["repeat"] = True
663
664
  ri = action_definition.get("repeat_interval", 1000)
664
- # TimePeriod object from schema validation -> convert to ms
665
- if hasattr(ri, "total_milliseconds"):
666
- parsed_action["repeat_interval"] = ri.total_milliseconds
667
- else:
668
- parsed_action["repeat_interval"] = ri
665
+ # Safely convert TimePeriod, string ("1s"), or number to ms
666
+ parsed_action["repeat_interval"] = parse_time_to_ms(ri, 1000)
669
667
  # Copy delay fields for cancelable timer support
670
668
  delay_val = action_definition.get("delay")
671
669
  if delay_val is not None:
672
- if hasattr(delay_val, "total_in_seconds"):
673
- parsed_action["delay"] = delay_val.total_in_seconds
674
- elif isinstance(delay_val, (int, float)):
675
- parsed_action["delay"] = float(delay_val)
676
- _LOGGER.debug("Action has delay: %.1fs", parsed_action.get("delay", 0))
670
+ # Safely convert TimePeriod, string ("5s"), or number to seconds
671
+ parsed_delay = parse_time_to_seconds(delay_val, 0.0)
672
+ parsed_action["delay"] = parsed_delay
673
+ _LOGGER.debug("Action has delay: %.1fs", parsed_delay)
677
674
  cancel_on = action_definition.get("delay_cancel_on")
678
675
  if cancel_on:
679
676
  parsed_action["delay_cancel_on"] = cancel_on
@@ -818,13 +815,11 @@ class Manager:
818
815
  val = action_definition.get(opt_key)
819
816
  if val is not None:
820
817
  parsed_action[opt_key] = val
821
- # Convert transition TimePeriod to float seconds
818
+ # Convert transition TimePeriod/string to float seconds
822
819
  if "transition" in parsed_action:
823
- t_val = parsed_action["transition"]
824
- if hasattr(t_val, "total_in_seconds"):
825
- parsed_action["transition"] = t_val.total_in_seconds
826
- elif not isinstance(t_val, (int, float)):
827
- parsed_action["transition"] = 0.0
820
+ parsed_action["transition"] = parse_time_to_seconds(
821
+ parsed_action["transition"], 0.0
822
+ )
828
823
  _copy_long_press_meta(parsed_action, action_definition)
829
824
  parsed_actions[click_type].append(parsed_action)
830
825
  continue
@@ -1089,11 +1084,7 @@ class Manager:
1089
1084
  if transition_val and action_definition.get("repeat"):
1090
1085
  repeat_interval = action_definition.get("repeat_interval")
1091
1086
  if repeat_interval:
1092
- ri_seconds = (
1093
- repeat_interval.total_in_seconds
1094
- if hasattr(repeat_interval, "total_in_seconds")
1095
- else repeat_interval / 1000.0
1096
- )
1087
+ ri_seconds = parse_time_to_seconds(repeat_interval, 1.0)
1097
1088
  if transition_val > ri_seconds:
1098
1089
  _LOGGER.debug(
1099
1090
  "Clamping transition %.3fs to repeat_interval %.3fs",
@@ -1590,9 +1581,9 @@ class Manager:
1590
1581
  _LOGGER.info("Starting config reload")
1591
1582
 
1592
1583
  # Reload config cache in ConfigHelper
1593
- # NOTE: reload_config() calls load_config_from_file() which may run
1594
- # full Cerberus validation (~20s) on disk cache miss. Run in a thread
1595
- # executor to keep the event loop responsive (MQTT, WS, modbus).
1584
+ # Uses fast path: load_yaml_file() + merge_board_config() (~0.5-1s)
1585
+ # instead of full Cerberus validation (~20s). Run in thread executor
1586
+ # because it still does file I/O (reading YAML files from disk).
1596
1587
  try:
1597
1588
  config = await asyncio.to_thread(self._config_helper.reload_config)
1598
1589
  # Update areas mapping from reloaded config
@@ -737,7 +737,7 @@ class UpdateManager(AsyncUpdater):
737
737
  # --- Remove legacy event entity discovery (if any) ---
738
738
  old_event_topic = (
739
739
  f"{config.ha_discovery_prefix}/event/"
740
- f"{config.serial_no}/migration_alert/config"
740
+ f"{config.serial_number}/migration_alert/config"
741
741
  )
742
742
  self._manager.send_message(topic=old_event_topic, payload="", retain=True)
743
743
  _LOGGER.debug("Removed legacy migration_alert event entity discovery")
@@ -59,7 +59,7 @@ class MQTTClient(MessageBus):
59
59
  self._mqtt_energy_listeners: dict[str, Callable[[str, str], Awaitable[None]]] = {}
60
60
  self._discovery_topics = (
61
61
  [
62
- f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_no}/#"
62
+ f"{self._config_helper.ha_discovery_prefix}/{ha_type}/{self._config_helper.serial_number}/#"
63
63
  for ha_type in self._config_helper.ha_types
64
64
  ]
65
65
  if self._config_helper.ha_discovery
@@ -3,12 +3,13 @@
3
3
  from boneio.core.utils.async_updater import AsyncUpdater
4
4
  from boneio.core.utils.filter import Filter
5
5
  from boneio.core.utils.logger import configure_logger
6
- from boneio.core.utils.timeperiod import TimePeriod
6
+ from boneio.core.utils.timeperiod import TimePeriod, ensure_time_period
7
7
  from boneio.core.utils.util import callback, open_json, strip_accents
8
8
 
9
9
  __all__ = [
10
10
  "Filter",
11
11
  "TimePeriod",
12
+ "ensure_time_period",
12
13
  "callback",
13
14
  "configure_logger",
14
15
  "strip_accents",
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import math
3
+ import re
3
4
  from collections import OrderedDict
4
5
  from datetime import timedelta
5
6
  from typing import Any
@@ -238,3 +239,69 @@ def parse_time_to_ms(value: Any, default: int | None) -> int | None:
238
239
  except (ValueError, TypeError):
239
240
  _LOGGER.warning("Invalid time value: %s, using default %s ms", value, default)
240
241
  return default
242
+
243
+
244
+ _TIME_UNIT_MAP = {
245
+ "us": "microseconds",
246
+ "microseconds": "microseconds",
247
+ "ms": "milliseconds",
248
+ "milliseconds": "milliseconds",
249
+ "s": "seconds",
250
+ "sec": "seconds",
251
+ "secs": "seconds",
252
+ "seconds": "seconds",
253
+ "min": "minutes",
254
+ "mins": "minutes",
255
+ "minutes": "minutes",
256
+ "h": "hours",
257
+ "hours": "hours",
258
+ "d": "days",
259
+ "days": "days",
260
+ }
261
+
262
+
263
+ _TIME_PERIOD_RE = re.compile(r"^([-+]?[0-9]*\.?[0-9]+)\s*([a-zA-Z]+)$")
264
+
265
+
266
+ def ensure_time_period(value: "TimePeriod | str | int | float") -> "TimePeriod":
267
+ """Ensure a value is a TimePeriod object.
268
+
269
+ Converts strings like '5s', '1000ms', '2min' and raw numeric values
270
+ (treated as seconds) to TimePeriod. Passes through existing TimePeriod
271
+ objects unchanged. This is the defensive layer for hot-reload scenarios
272
+ where YAML values may arrive as raw strings instead of pre-parsed
273
+ TimePeriod objects.
274
+
275
+ Args:
276
+ value: A TimePeriod, time string with unit, or numeric seconds.
277
+
278
+ Returns:
279
+ A TimePeriod instance.
280
+
281
+ Raises:
282
+ ValueError: If the string format is invalid or the unit is unknown.
283
+ """
284
+ if isinstance(value, TimePeriod):
285
+ return value
286
+
287
+ if isinstance(value, (int, float)):
288
+ return TimePeriod(seconds=float(value))
289
+
290
+ if not isinstance(value, str):
291
+ raise ValueError(f"Cannot convert {type(value).__name__} to TimePeriod: {value!r}")
292
+
293
+ value = value.strip()
294
+ if not value:
295
+ raise ValueError("Empty string cannot be converted to TimePeriod")
296
+
297
+ match = _TIME_PERIOD_RE.match(value)
298
+ if match is None:
299
+ raise ValueError(f"Invalid time period format: {value!r}")
300
+
301
+ num_str, unit = match.group(1), match.group(2).lower()
302
+ kwarg = _TIME_UNIT_MAP.get(unit)
303
+ if kwarg is None:
304
+ raise ValueError(f"Unknown time unit '{unit}' in: {value!r}")
305
+
306
+ return TimePeriod(**{kwarg: float(num_str)})
307
+
@@ -123,9 +123,9 @@ def ha_availabilty_message(
123
123
  "identifiers": [child_identifier],
124
124
  "manufacturer": manufacturer,
125
125
  "model": model,
126
- "model_id": config_helper.serial_number,
126
+ "model_id": config_helper.real_serial,
127
127
  "name": child_device_name,
128
- "serial_number": config_helper.serial_number,
128
+ "serial_number": config_helper.real_serial,
129
129
  "sw_version": __version__,
130
130
  "via_device": topic, # Link to main BoneIO device
131
131
  **web_url_dict,
@@ -144,9 +144,9 @@ def ha_availabilty_message(
144
144
  "identifiers": [f"{topic}_{area}"], # Use area ID for consistent grouping
145
145
  "manufacturer": manufacturer,
146
146
  "model": model,
147
- "model_id": config_helper.serial_number,
147
+ "model_id": config_helper.real_serial,
148
148
  "name": sub_device_name,
149
- "serial_number": config_helper.serial_number,
149
+ "serial_number": config_helper.real_serial,
150
150
  "sw_version": __version__,
151
151
  "via_device": topic, # Link to main BoneIO device
152
152
  "suggested_area": area_name, # Use area ID (lowercase) - HA converts area names to lowercase
@@ -158,9 +158,9 @@ def ha_availabilty_message(
158
158
  "identifiers": [topic],
159
159
  "manufacturer": manufacturer,
160
160
  "model": model,
161
- "model_id": config_helper.serial_number,
161
+ "model_id": config_helper.real_serial,
162
162
  "name": device_name,
163
- "serial_number": config_helper.serial_number,
163
+ "serial_number": config_helper.real_serial,
164
164
  "sw_version": __version__,
165
165
  **web_url_dict
166
166
  }
@@ -297,9 +297,9 @@ def _ha_irrigation_device(
297
297
  "identifiers": [f"{topic}_{IRRIGATION}_{ctrl_id}"],
298
298
  "manufacturer": "boneIO",
299
299
  "model": model,
300
- "model_id": config_helper.serial_number,
300
+ "model_id": config_helper.real_serial,
301
301
  "name": ctrl_name,
302
- "serial_number": config_helper.serial_number,
302
+ "serial_number": config_helper.real_serial,
303
303
  "sw_version": __version__,
304
304
  "via_device": topic,
305
305
  }
@@ -880,7 +880,7 @@ def modbus_polling_switch_message(
880
880
 
881
881
  discovery_topic = (
882
882
  f"{config_helper.ha_discovery_prefix}/switch/"
883
- f"{config_helper.serial_no}/{entity_id}/config"
883
+ f"{config_helper.serial_number}/{entity_id}/config"
884
884
  )
885
885
 
886
886
  area_name = config_helper.get_area_name(area) if area else None
@@ -52,7 +52,7 @@ def generate_lox_template(manager: Manager) -> str:
52
52
  Returns:
53
53
  XML string ready to be saved as a .xml template file.
54
54
  """
55
- serial = manager.config_helper.serial_no or "boneio"
55
+ serial = manager.config_helper.serial_number or "boneio"
56
56
  device_name = manager.config_helper.name or serial
57
57
 
58
58
  # Get Lox UDP config (host/ports) from running config
@@ -275,7 +275,7 @@ def generate_lox_summary(manager: Manager) -> dict[str, Any]:
275
275
  Returns:
276
276
  Dictionary with 'commands' and 'status' sections.
277
277
  """
278
- serial = manager.config_helper.serial_no or "boneio"
278
+ serial = manager.config_helper.serial_number or "boneio"
279
279
  device_name = manager.config_helper.name or serial
280
280
 
281
281
  commands: list[dict[str, str]] = []
@@ -4,7 +4,7 @@
4
4
  "description": "boneIO temperature sensor extension board",
5
5
  "category": "sensors",
6
6
  "default_address": 1,
7
- "default_update_interval": "10s",
7
+ "default_update_interval": "30s",
8
8
  "set_base": {
9
9
  "set_address_address": 100,
10
10
  "set_baudrate": {
@@ -60,7 +60,7 @@ class BaseEntity(Filter):
60
60
  self._timestamp = time.time()
61
61
  self._id = f"{self._parent[ID]}_{self._decoded_name_low.replace('_', '')}"
62
62
  self._topic = (
63
- f"{self._config_helper.ha_discovery_prefix}/{self._entity_type}/{self._config_helper.serial_no}"
63
+ f"{self._config_helper.ha_discovery_prefix}/{self._entity_type}/{self._config_helper.serial_number}"
64
64
  f"/{self._id}/config"
65
65
  )
66
66
 
@@ -170,6 +170,7 @@ async def async_run(
170
170
  pwa_name=web_config.get("cloud", {}).get("pwa_name"),
171
171
  ha_child_devices=main_config.get("ha_child_devices", False),
172
172
  ha_child_devices_naming=main_config.get("ha_child_devices_naming", "default"),
173
+ serial_override=main_config.get("serial_override"),
173
174
  )
174
175
 
175
176
  # Load areas configuration
@@ -358,7 +359,7 @@ async def async_run(
358
359
  cloud_reg = None
359
360
  if _config_helper.cloud_registration:
360
361
  local_ip = network_state.get("ip", "")
361
- serial = _config_helper.serial_no
362
+ serial = _config_helper.serial_number
362
363
  if local_ip and serial:
363
364
  cloud_reg = CloudRegistration(
364
365
  serial_number=serial,
@@ -2255,3 +2255,16 @@ boneio:
2255
2255
  - default: Entity name only (e.g., "OUT 17"). May cause duplicates if multiple boneIO devices share output names.
2256
2256
  - device_name: Adds boneIO device name prefix (e.g., "boneIO Black - OUT 17").
2257
2257
  - device_name_area: Adds device name and area (e.g., "boneIO Black - Living Room - OUT 17"). Falls back to device_name if no area is assigned.
2258
+ serial_override:
2259
+ required: False
2260
+ type: string
2261
+ nullable: True
2262
+ regex: '^blk[a-f0-9]{6}$'
2263
+ meta:
2264
+ label: Serial number override
2265
+ description: |
2266
+ Override the auto-detected serial number (based on MAC address).
2267
+ Use this when restoring config from a different device (e.g., RMA replacement).
2268
+ Format: blk followed by 6 hex characters (e.g., blk8c7df0).
2269
+ WARNING: Two devices with the same serial on the same MQTT broker will conflict!
2270
+
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.5.0dev10"