boneio 1.2.0.dev7__tar.gz → 1.2.0.dev9__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 (432) hide show
  1. {boneio-1.2.0.dev7/boneio.egg-info → boneio-1.2.0.dev9}/PKG-INFO +1 -1
  2. boneio-1.2.0.dev9/boneio/core/config/migrations/__init__.py +222 -0
  3. boneio-1.2.0.dev9/boneio/core/config/migrations/v1_proxy_port.py +75 -0
  4. boneio-1.2.0.dev9/boneio/core/config/migrations/v2_transition.py +94 -0
  5. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/yaml_util.py +31 -81
  6. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/manager.py +21 -0
  7. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/update.py +268 -6
  8. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/mqtt.py +8 -6
  9. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/homeassistant.py +1 -1
  10. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions.yaml +4 -4
  11. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/schema.yaml +6 -0
  12. boneio-1.2.0.dev9/boneio/version.py +2 -0
  13. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/cssMode-D2_GdEHn.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/cssMode-xo2BdOZm.js +1 -1
  14. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/freemarker2-Ccev9DQ3.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/freemarker2-CpF78_ZW.js +1 -1
  15. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/handlebars-CSWuYUii.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/handlebars-CTxt7dmO.js +1 -1
  16. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/html-BeCDD7uj.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/html-BU5yZ3BK.js +1 -1
  17. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/htmlMode-Csqim4tI.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/htmlMode-Bi7QBmdE.js +1 -1
  18. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/index-C6eDye5h.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/index-TnEo7N0a.js +145 -145
  19. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/javascript-CNjo7h5s.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/javascript-BTvyG1P5.js +1 -1
  20. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/jsonMode-CrofIOf5.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/jsonMode-HE9dW4cx.js +1 -1
  21. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/liquid-DhQWiRQL.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/liquid-BxuGpv1s.js +1 -1
  22. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/mdx-B7NfGq9x.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/mdx-C04Q98IR.js +1 -1
  23. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/python-CfAzolFq.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/python-CKNUIQdp.js +1 -1
  24. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/razor-nVU9Xllg.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/razor-UrUJyAuF.js +1 -1
  25. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/tsMode-DUyiY9xo.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/tsMode-AhPw7VFe.js +1 -1
  26. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/typescript-Cz5XSgIr.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/typescript-CLXQgPoF.js +1 -1
  27. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/xml-Bf4znVSR.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/xml-DZmKn2me.js +1 -1
  28. boneio-1.2.0.dev7/boneio/webui/frontend-dist/assets/yaml-KWLRG-vP.js → boneio-1.2.0.dev9/boneio/webui/frontend-dist/assets/yaml-CGKDqmHX.js +1 -1
  29. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/index.html +1 -1
  30. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/adc.schema.json +2 -2
  31. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/binary_sensor.schema.json +30 -30
  32. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/boneio.schema.json +11 -2
  33. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/config.schema.json +247 -238
  34. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/cover.schema.json +8 -8
  35. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/event.schema.json +106 -106
  36. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/ina219.schema.json +4 -4
  37. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/lm75.schema.json +4 -4
  38. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/mcp23017.schema.json +4 -4
  39. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/mcp9808.schema.json +4 -4
  40. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/modbus.schema.json +6 -6
  41. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/modbus_devices.schema.json +8 -8
  42. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/mqtt.schema.json +2 -2
  43. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/oled.schema.json +2 -2
  44. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/output.schema.json +8 -8
  45. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/pca9685.schema.json +4 -4
  46. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/pcf8575.schema.json +4 -4
  47. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/remote_devices.schema.json +26 -26
  48. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/sensor.schema.json +2 -2
  49. {boneio-1.2.0.dev7/boneio/webui/schema → boneio-1.2.0.dev9/boneio/webui/frontend-dist/schem}/web.schema.json +12 -12
  50. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/sw.js +1 -1
  51. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/update.py +44 -113
  52. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/adc.schema.json +2 -2
  53. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/binary_sensor.schema.json +30 -30
  54. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/boneio.schema.json +11 -2
  55. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/config.schema.json +247 -238
  56. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/cover.schema.json +8 -8
  57. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/event.schema.json +106 -106
  58. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/ina219.schema.json +4 -4
  59. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/lm75.schema.json +4 -4
  60. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/mcp23017.schema.json +4 -4
  61. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/mcp9808.schema.json +4 -4
  62. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/modbus.schema.json +6 -6
  63. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/modbus_devices.schema.json +8 -8
  64. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/mqtt.schema.json +2 -2
  65. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/oled.schema.json +2 -2
  66. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/output.schema.json +8 -8
  67. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/pca9685.schema.json +4 -4
  68. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/pcf8575.schema.json +4 -4
  69. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/remote_devices.schema.json +26 -26
  70. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/sensor.schema.json +2 -2
  71. {boneio-1.2.0.dev7/boneio/webui/frontend-dist/schem → boneio-1.2.0.dev9/boneio/webui/schema}/web.schema.json +12 -12
  72. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9/boneio.egg-info}/PKG-INFO +1 -1
  73. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/SOURCES.txt +19 -16
  74. boneio-1.2.0.dev7/boneio/version.py +0 -2
  75. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/LICENSE +0 -0
  76. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/MANIFEST.in +0 -0
  77. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/README.md +0 -0
  78. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/__init__.py +0 -0
  79. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/input.yaml +0 -0
  80. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_24_16.yaml +0 -0
  81. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_32_10.yaml +0 -0
  82. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_32_5.yaml +0 -0
  83. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_cover.yaml +0 -0
  84. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  85. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/input.yaml +0 -0
  86. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_24_16.yaml +0 -0
  87. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_32_10.yaml +0 -0
  88. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_32_5.yaml +0 -0
  89. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_cover.yaml +0 -0
  90. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  91. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/input.yaml +0 -0
  92. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_24_16.yaml +0 -0
  93. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_32_10.yaml +0 -0
  94. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_32_5.yaml +0 -0
  95. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_cover.yaml +0 -0
  96. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  97. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/input.yaml +0 -0
  98. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_24_16.yaml +0 -0
  99. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_32_10.yaml +0 -0
  100. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_cover.yaml +0 -0
  101. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  102. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/input.yaml +0 -0
  103. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_24_16.yaml +0 -0
  104. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_32_10.yaml +0 -0
  105. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_cover.yaml +0 -0
  106. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  107. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/input.yaml +0 -0
  108. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_24_16.yaml +0 -0
  109. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_32_10.yaml +0 -0
  110. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_cover.yaml +0 -0
  111. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  112. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/input.yaml +0 -0
  113. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_24_16.yaml +0 -0
  114. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_32_10.yaml +0 -0
  115. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_cover.yaml +0 -0
  116. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  117. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/bonecli.py +0 -0
  118. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/__init__.py +0 -0
  119. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/__init__.py +0 -0
  120. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/cover.py +0 -0
  121. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/previous.py +0 -0
  122. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/time_based.py +0 -0
  123. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/cover/venetian.py +0 -0
  124. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/group/__init__.py +0 -0
  125. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/group/output_group.py +0 -0
  126. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/__init__.py +0 -0
  127. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/binary_sensor.py +0 -0
  128. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/detectors.py +0 -0
  129. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/input/event.py +0 -0
  130. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/__init__.py +0 -0
  131. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/basic.py +0 -0
  132. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/mcp.py +0 -0
  133. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/pca.py +0 -0
  134. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/output/pcf.py +0 -0
  135. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/sensor/__init__.py +0 -0
  136. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/components/sensor/virtual_energy.py +0 -0
  137. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/const.py +0 -0
  138. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/__init__.py +0 -0
  139. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/__init__.py +0 -0
  140. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/__init__.py +0 -0
  141. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  142. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  143. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  144. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/registration.py +0 -0
  145. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/cloud/secrets.py +0 -0
  146. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/__init__.py +0 -0
  147. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/config_helper.py +0 -0
  148. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/package-lock.json +0 -0
  149. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/package.json +0 -0
  150. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/config/schema_converter.py +0 -0
  151. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/discovery.py +0 -0
  152. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/events/__init__.py +0 -0
  153. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/events/bus.py +0 -0
  154. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/__init__.py +0 -0
  155. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/covers.py +0 -0
  156. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/display.py +0 -0
  157. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/inputs.py +0 -0
  158. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/modbus.py +0 -0
  159. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/outputs.py +0 -0
  160. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/remote.py +0 -0
  161. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/manager/sensors.py +0 -0
  162. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/__init__.py +0 -0
  163. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/basic.py +0 -0
  164. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/basic_mqtt.py +0 -0
  165. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/local.py +0 -0
  166. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/messaging/queue.py +0 -0
  167. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/__init__.py +0 -0
  168. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/base.py +0 -0
  169. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/esphome.py +0 -0
  170. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/mqtt.py +0 -0
  171. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/remote/wled.py +0 -0
  172. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/__init__.py +0 -0
  173. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/base.py +0 -0
  174. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/sensor/system.py +0 -0
  175. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/state/__init__.py +0 -0
  176. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/state/manager.py +0 -0
  177. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/__init__.py +0 -0
  178. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/host_data.py +0 -0
  179. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/system/monitor.py +0 -0
  180. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/__init__.py +0 -0
  181. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/async_updater.py +0 -0
  182. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/filter.py +0 -0
  183. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/font_util.py +0 -0
  184. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/logger.py +0 -0
  185. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/timeperiod.py +0 -0
  186. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/core/utils/util.py +0 -0
  187. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/adc.yaml +0 -0
  188. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  189. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/config.yaml +0 -0
  190. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/event.yaml +0 -0
  191. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/mqtt.yaml +0 -0
  192. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  193. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/adc.yaml +0 -0
  194. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  195. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/config.yaml +0 -0
  196. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/event.yaml +0 -0
  197. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/mqtt.yaml +0 -0
  198. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  199. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/__init__.py +0 -0
  200. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/adc.yaml +0 -0
  201. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  202. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/config.yaml +0 -0
  203. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/cover.yaml +0 -0
  204. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/event.yaml +0 -0
  205. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/mqtt.yaml +0 -0
  206. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover/outputCover.yaml +0 -0
  207. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/adc.yaml +0 -0
  208. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  209. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/config.yaml +0 -0
  210. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/cover.yaml +0 -0
  211. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/event.yaml +0 -0
  212. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  213. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  214. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/adc.yaml +0 -0
  215. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  216. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  217. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  218. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  219. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/event_all.yaml +0 -0
  220. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  221. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  222. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  223. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  224. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  225. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  226. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/exceptions.py +0 -0
  227. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/__init__.py +0 -0
  228. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/analog/__init__.py +0 -0
  229. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/analog/adc.py +0 -0
  230. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/__init__.py +0 -0
  231. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  232. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/display/oled.py +0 -0
  233. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/__init__.py +0 -0
  234. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  235. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  236. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  237. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  238. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/__init__.py +0 -0
  239. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/base.py +0 -0
  240. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/gpio/input/manager.py +0 -0
  241. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/__init__.py +0 -0
  242. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/bus.py +0 -0
  243. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/ina219.py +0 -0
  244. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/ina219_driver.py +0 -0
  245. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/mcp9808.py +0 -0
  246. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/i2c/pct2075.py +0 -0
  247. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/__init__.py +0 -0
  248. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/bus.py +0 -0
  249. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/dallas.py +0 -0
  250. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/onewire/ds2482.py +0 -0
  251. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/__init__.py +0 -0
  252. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  253. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/base.py +0 -0
  254. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  255. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  256. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/__init__.py +0 -0
  257. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/integration/interlock.py +0 -0
  258. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/__init__.py +0 -0
  259. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/cli.py +0 -0
  260. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/client.py +0 -0
  261. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/coordinator.py +0 -0
  262. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/__init__.py +0 -0
  263. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  264. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  265. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  266. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  267. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  268. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  269. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  270. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  271. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  272. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/inverters/sofar.json +0 -0
  273. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/inverters/thessla.json +0 -0
  274. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  275. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  276. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/other/wanas415.json +0 -0
  277. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/cwt.json +0 -0
  278. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  279. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  280. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  281. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/pt100.json +0 -0
  282. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/sht20.json +0 -0
  283. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/devices/sensors/sht30.json +0 -0
  284. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/__init__.py +0 -0
  285. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/base.py +0 -0
  286. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/__init__.py +0 -0
  287. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/numeric.py +0 -0
  288. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/select.py +0 -0
  289. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/switch.py +0 -0
  290. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/derived/text.py +0 -0
  291. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/__init__.py +0 -0
  292. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/binary.py +0 -0
  293. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/numeric.py +0 -0
  294. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/sensor/text.py +0 -0
  295. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/__init__.py +0 -0
  296. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/binary.py +0 -0
  297. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/entities/writeable/numeric.py +0 -0
  298. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/modbus/utils.py +0 -0
  299. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/__init__.py +0 -0
  300. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/actions.py +0 -0
  301. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/events.py +0 -0
  302. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/files.py +0 -0
  303. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/logs.py +0 -0
  304. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/mqtt.py +0 -0
  305. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/models/state.py +0 -0
  306. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/runner.py +0 -0
  307. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions_sensor.yaml +0 -0
  308. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/actions_switch.yaml +0 -0
  309. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/filters.yaml +0 -0
  310. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/filters_adc.yaml +0 -0
  311. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/id.yaml +0 -0
  312. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/remote_devices.yaml +0 -0
  313. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/temp_unit.yaml +0 -0
  314. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/schema/update_interval.yaml +0 -0
  315. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/app.py +0 -0
  316. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  317. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  318. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  319. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  320. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  321. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  322. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  323. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  324. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  325. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  326. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  327. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  328. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  329. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  330. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  331. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  332. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  333. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
  334. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  335. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  336. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  337. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  338. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  339. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  340. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/index-CyjBlAI7.css +0 -0
  341. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  342. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  343. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
  344. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  345. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  346. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  347. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  348. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  349. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  350. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  351. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  352. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  353. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  354. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  355. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  356. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  357. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  358. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  359. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  360. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  361. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  362. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  363. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  364. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  365. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  366. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  367. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  368. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  369. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  370. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  371. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  372. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  373. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  374. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  375. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  376. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  377. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  378. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  379. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  380. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  381. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  382. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  383. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  384. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  385. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  386. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  387. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  388. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  389. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  390. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
  391. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
  392. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  393. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  394. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio.svg +0 -0
  395. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  396. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/areas.schema.json +0 -0
  397. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/dallas.schema.json +0 -0
  398. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/ds2482.schema.json +0 -0
  399. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/logger.schema.json +0 -0
  400. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/output_group.schema.json +0 -0
  401. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +0 -0
  402. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
  403. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/middleware/__init__.py +0 -0
  404. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/middleware/auth.py +0 -0
  405. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/__init__.py +0 -0
  406. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/auth.py +0 -0
  407. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/caddy.py +0 -0
  408. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/config.py +0 -0
  409. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/covers.py +0 -0
  410. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/modbus.py +0 -0
  411. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/outputs.py +0 -0
  412. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/remote_devices.py +0 -0
  413. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/sensors.py +0 -0
  414. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/routes/system.py +0 -0
  415. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/areas.schema.json +0 -0
  416. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/dallas.schema.json +0 -0
  417. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/ds2482.schema.json +0 -0
  418. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/logger.schema.json +0 -0
  419. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/output_group.schema.json +0 -0
  420. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  421. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/services/__init__.py +0 -0
  422. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/services/logs.py +0 -0
  423. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/web_server.py +0 -0
  424. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio/webui/websocket_manager.py +0 -0
  425. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/dependency_links.txt +0 -0
  426. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/entry_points.txt +0 -0
  427. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/requires.txt +0 -0
  428. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/boneio.egg-info/top_level.txt +0 -0
  429. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/pyproject.toml +0 -0
  430. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/setup.cfg +0 -0
  431. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/setup.py +0 -0
  432. {boneio-1.2.0.dev7 → boneio-1.2.0.dev9}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.2.0.dev7
3
+ Version: 1.2.0.dev9
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
@@ -0,0 +1,222 @@
1
+ """Configuration migration system for boneIO.
2
+
3
+ Migrations are versioned and executed once per config file.
4
+ The config_version field in the boneio section tracks which
5
+ migrations have already been applied.
6
+
7
+ Each migration module registers itself via the @register_migration decorator.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import logging
13
+ import re
14
+ from dataclasses import dataclass, field
15
+ from typing import Callable
16
+
17
+ _LOGGER = logging.getLogger(__name__)
18
+
19
+ # Current schema version — bump this when adding new migrations
20
+ CURRENT_SCHEMA_VERSION = 2
21
+
22
+
23
+ @dataclass
24
+ class Migration:
25
+ """A single config migration step.
26
+
27
+ Attributes:
28
+ version: Target schema version after this migration.
29
+ name: Human-readable description.
30
+ migrate_dict: Transforms the raw config dict in memory.
31
+ migrate_file: Optional — persists changes directly in the YAML file.
32
+ """
33
+
34
+ version: int
35
+ name: str
36
+ migrate_dict: Callable[[dict], dict]
37
+ migrate_file: Callable[[str], None] | None = None
38
+
39
+
40
+ # Global ordered registry of migrations
41
+ _MIGRATIONS: list[Migration] = []
42
+
43
+
44
+ def register_migration(
45
+ version: int,
46
+ name: str,
47
+ migrate_file: Callable[[str], None] | None = None,
48
+ ) -> Callable:
49
+ """Decorator to register a dict migration function.
50
+
51
+ Args:
52
+ version: Target schema version after this migration.
53
+ name: Human-readable description.
54
+ migrate_file: Optional file-level persistence function.
55
+
56
+ Returns:
57
+ Decorator that registers the function and returns it unchanged.
58
+ """
59
+
60
+ def decorator(fn: Callable[[dict], dict]) -> Callable[[dict], dict]:
61
+ _MIGRATIONS.append(
62
+ Migration(
63
+ version=version,
64
+ name=name,
65
+ migrate_dict=fn,
66
+ migrate_file=migrate_file,
67
+ )
68
+ )
69
+ # Keep sorted by version
70
+ _MIGRATIONS.sort(key=lambda m: m.version)
71
+ return fn
72
+
73
+ return decorator
74
+
75
+
76
+ def get_config_version(doc: dict) -> int:
77
+ """Read config_version from the boneio section (default 0).
78
+
79
+ Args:
80
+ doc: Raw config dict.
81
+
82
+ Returns:
83
+ Current config version number.
84
+ """
85
+ boneio = doc.get("boneio")
86
+ if isinstance(boneio, dict):
87
+ return boneio.get("config_version", 0)
88
+ return 0
89
+
90
+
91
+ def run_migrations(
92
+ doc: dict,
93
+ from_version: int | None = None,
94
+ config_file: str | None = None,
95
+ ) -> tuple[dict, int]:
96
+ """Run all pending migrations on a config dict.
97
+
98
+ Args:
99
+ doc: Raw config dict (will be mutated in place).
100
+ from_version: Override starting version (default: read from doc).
101
+ config_file: If provided, also persist file-level migrations
102
+ and update config_version in the file.
103
+
104
+ Returns:
105
+ Tuple of (migrated dict, new config_version).
106
+ """
107
+ if from_version is None:
108
+ from_version = get_config_version(doc)
109
+
110
+ if from_version >= CURRENT_SCHEMA_VERSION:
111
+ return doc, from_version
112
+
113
+ applied: list[str] = []
114
+
115
+ for migration in _MIGRATIONS:
116
+ if migration.version <= from_version:
117
+ continue
118
+ if migration.version > CURRENT_SCHEMA_VERSION:
119
+ break
120
+
121
+ _LOGGER.info(
122
+ "Running migration v%d: %s", migration.version, migration.name
123
+ )
124
+ doc = migration.migrate_dict(doc)
125
+ applied.append(f"v{migration.version}: {migration.name}")
126
+
127
+ # Persist file-level changes
128
+ if config_file and migration.migrate_file:
129
+ try:
130
+ migration.migrate_file(config_file)
131
+ except Exception as e:
132
+ _LOGGER.error(
133
+ "Failed to persist migration v%d to file: %s",
134
+ migration.version,
135
+ e,
136
+ )
137
+
138
+ new_version = CURRENT_SCHEMA_VERSION
139
+
140
+ if applied:
141
+ _LOGGER.info("Migrations applied: %s", ", ".join(applied))
142
+
143
+ # Persist config_version to file
144
+ if config_file:
145
+ try:
146
+ _persist_config_version(config_file, new_version)
147
+ except Exception as e:
148
+ _LOGGER.error("Failed to persist config_version: %s", e)
149
+
150
+ # Update in-memory dict
151
+ if "boneio" not in doc or not isinstance(doc.get("boneio"), dict):
152
+ doc["boneio"] = {}
153
+ doc["boneio"]["config_version"] = new_version
154
+
155
+ return doc, new_version
156
+
157
+
158
+ def _persist_config_version(config_file: str, version: int) -> None:
159
+ """Write config_version into the boneio section of the YAML file.
160
+
161
+ Handles three cases:
162
+ - config_version already exists → update value
163
+ - boneio section exists but no config_version → insert after 'boneio:'
164
+ - no boneio section → skip (shouldn't happen in practice)
165
+
166
+ Args:
167
+ config_file: Path to the YAML config file.
168
+ version: New config_version value to write.
169
+ """
170
+ with open(config_file, "r", encoding="utf-8") as f:
171
+ lines = f.readlines()
172
+
173
+ updated_lines: list[str] = []
174
+ version_written = False
175
+ in_boneio = False
176
+ boneio_indent = -1
177
+ config_version_re = re.compile(r"^(\s*)config_version:\s*\d+")
178
+
179
+ for i, line in enumerate(lines):
180
+ stripped = line.rstrip()
181
+
182
+ # Check if we're entering the boneio section
183
+ if stripped == "boneio:" or stripped.startswith("boneio:"):
184
+ in_boneio = True
185
+ boneio_indent = len(line) - len(line.lstrip())
186
+ updated_lines.append(line)
187
+ continue
188
+
189
+ if in_boneio and not version_written:
190
+ line_indent = len(line) - len(line.lstrip())
191
+
192
+ # Existing config_version line — replace it
193
+ if config_version_re.match(line):
194
+ indent = " " * (boneio_indent + 2)
195
+ updated_lines.append(f"{indent}config_version: {version}\n")
196
+ version_written = True
197
+ continue
198
+
199
+ # Left the boneio section (non-empty line at same or lower indent)
200
+ if stripped and line_indent <= boneio_indent and i > 0:
201
+ # Insert config_version before leaving
202
+ indent = " " * (boneio_indent + 2)
203
+ updated_lines.append(f"{indent}config_version: {version}\n")
204
+ version_written = True
205
+ in_boneio = False
206
+
207
+ updated_lines.append(line)
208
+
209
+ # If boneio was the last section and we haven't written yet
210
+ if in_boneio and not version_written:
211
+ indent = " " * (boneio_indent + 2)
212
+ updated_lines.append(f"{indent}config_version: {version}\n")
213
+
214
+ with open(config_file, "w", encoding="utf-8") as f:
215
+ f.writelines(updated_lines)
216
+
217
+ _LOGGER.info("Persisted config_version: %d to %s", version, config_file)
218
+
219
+
220
+ # Import migration modules to trigger registration
221
+ from boneio.core.config.migrations import v1_proxy_port # noqa: E402, F401
222
+ from boneio.core.config.migrations import v2_transition # noqa: E402, F401
@@ -0,0 +1,75 @@
1
+ """Migration v1: Rename deprecated config fields.
2
+
3
+ - web.nginx_proxy_port -> web.proxy_port
4
+ - modbus_sensors -> modbus_devices (warning only, no rename)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ import re
11
+
12
+ from boneio.core.config.migrations import register_migration
13
+
14
+ _LOGGER = logging.getLogger(__name__)
15
+
16
+
17
+ def _persist_proxy_port(config_file: str) -> None:
18
+ """Replace nginx_proxy_port with proxy_port in the YAML file.
19
+
20
+ Args:
21
+ config_file: Path to the YAML config file.
22
+ """
23
+ with open(config_file, "r", encoding="utf-8") as f:
24
+ lines = f.readlines()
25
+
26
+ updated = False
27
+ updated_lines: list[str] = []
28
+ for line in lines:
29
+ if "nginx_proxy_port:" in line:
30
+ indent = len(line) - len(line.lstrip())
31
+ value_part = line.split("nginx_proxy_port:", 1)[1]
32
+ new_line = " " * indent + "proxy_port:" + value_part
33
+ updated_lines.append(new_line)
34
+ updated = True
35
+ _LOGGER.info(
36
+ "Replaced in config file: %s -> %s",
37
+ line.rstrip(),
38
+ new_line.rstrip(),
39
+ )
40
+ else:
41
+ updated_lines.append(line)
42
+
43
+ if updated:
44
+ with open(config_file, "w", encoding="utf-8") as f:
45
+ f.writelines(updated_lines)
46
+
47
+
48
+ @register_migration(
49
+ version=1,
50
+ name="nginx_proxy_port -> proxy_port, modbus_sensors deprecation",
51
+ migrate_file=_persist_proxy_port,
52
+ )
53
+ def migrate(doc: dict) -> dict:
54
+ """Migrate web.nginx_proxy_port to web.proxy_port and warn about modbus_sensors.
55
+
56
+ Args:
57
+ doc: Raw config dict.
58
+
59
+ Returns:
60
+ Migrated config dict.
61
+ """
62
+ # web.nginx_proxy_port -> web.proxy_port
63
+ if "web" in doc and isinstance(doc["web"], dict):
64
+ if "nginx_proxy_port" in doc["web"]:
65
+ _LOGGER.info("Migrating 'web.nginx_proxy_port' to 'web.proxy_port'")
66
+ doc["web"]["proxy_port"] = doc["web"].pop("nginx_proxy_port")
67
+
68
+ # modbus_sensors -> modbus_devices (warning only)
69
+ if "modbus_sensors" in doc:
70
+ _LOGGER.warning(
71
+ "Modbus sensors are renamed to modbus_devices. "
72
+ "Please update your config."
73
+ )
74
+
75
+ return doc
@@ -0,0 +1,94 @@
1
+ """Migration v2: Convert transition field from float to timeperiod string.
2
+
3
+ Before: transition: 2 (bare number, interpreted as seconds)
4
+ After: transition: 2s (timeperiod string with unit)
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import logging
10
+ import re
11
+
12
+ from boneio.core.config.migrations import register_migration
13
+
14
+ _LOGGER = logging.getLogger(__name__)
15
+
16
+
17
+ def _persist_transition(config_file: str) -> None:
18
+ """Replace bare-number transition values with timeperiod strings in YAML file.
19
+
20
+ Matches lines like ``transition: 2`` or ``transition: 0.5`` and appends ``s``.
21
+
22
+ Args:
23
+ config_file: Path to the YAML config file.
24
+ """
25
+ with open(config_file, "r", encoding="utf-8") as f:
26
+ lines = f.readlines()
27
+
28
+ updated = False
29
+ updated_lines: list[str] = []
30
+ transition_re = re.compile(r"^(\s*transition:\s*)(\d+(?:\.\d+)?)\s*$")
31
+
32
+ for line in lines:
33
+ m = transition_re.match(line)
34
+ if m:
35
+ new_line = f"{m.group(1)}{m.group(2)}s\n"
36
+ updated_lines.append(new_line)
37
+ updated = True
38
+ _LOGGER.info(
39
+ "Replaced in config file: %s -> %s",
40
+ line.rstrip(),
41
+ new_line.rstrip(),
42
+ )
43
+ else:
44
+ updated_lines.append(line)
45
+
46
+ if updated:
47
+ with open(config_file, "w", encoding="utf-8") as f:
48
+ f.writelines(updated_lines)
49
+
50
+
51
+ @register_migration(
52
+ version=2,
53
+ name="transition: float -> timeperiod string",
54
+ migrate_file=_persist_transition,
55
+ )
56
+ def migrate(doc: dict) -> dict:
57
+ """Convert transition fields from int/float to timeperiod strings.
58
+
59
+ Walks through event and binary_sensor sections, finding action
60
+ definitions with a bare numeric transition value and converting
61
+ them to strings with an ``s`` suffix.
62
+
63
+ Args:
64
+ doc: Raw config dict.
65
+
66
+ Returns:
67
+ Migrated config dict.
68
+ """
69
+ for section_name in ("event", "binary_sensor"):
70
+ for item in doc.get(section_name, []) or []:
71
+ if not isinstance(item, dict):
72
+ continue
73
+ actions = item.get("actions")
74
+ if not isinstance(actions, dict):
75
+ continue
76
+ for _click_type, action_list in actions.items():
77
+ if not isinstance(action_list, list):
78
+ continue
79
+ for action_def in action_list:
80
+ if not isinstance(action_def, dict):
81
+ continue
82
+ if "transition" in action_def:
83
+ val = action_def["transition"]
84
+ if isinstance(val, (int, float)):
85
+ new_val = f"{val}s"
86
+ _LOGGER.info(
87
+ "Migrating transition: %s -> '%s' in %s action",
88
+ val,
89
+ new_val,
90
+ section_name,
91
+ )
92
+ action_def["transition"] = new_val
93
+
94
+ return doc
@@ -724,84 +724,32 @@ class CustomValidator(Validator):
724
724
 
725
725
 
726
726
 
727
- def _migrate_config(doc: dict, config_file: str | None = None) -> tuple[dict, bool]:
728
- """
729
- Apply configuration migrations for backward compatibility.
730
-
727
+ def _run_config_migrations(doc: dict, config_file: str | None = None) -> tuple[dict, bool]:
728
+ """Run versioned config migrations via the migrations module.
729
+
730
+ Migrations are only applied if config_version < CURRENT_SCHEMA_VERSION.
731
+ When config_file is provided, changes are persisted to the YAML file
732
+ and config_version is updated so migrations won't run again.
733
+
731
734
  Args:
732
- doc: Configuration document to migrate
733
- config_file: Optional path to config file for persisting migrations
734
-
735
+ doc: Raw configuration dict (mutated in place).
736
+ config_file: Optional path to config file for persistence.
737
+
735
738
  Returns:
736
- Tuple of (migrated configuration document, whether migrations were applied)
739
+ Tuple of (migrated dict, whether any migrations were applied).
737
740
  """
738
- migrated = False
739
- migrations_applied = []
740
-
741
- # Migration: nginx_proxy_port -> proxy_port in web section
742
- if "web" in doc and isinstance(doc["web"], dict):
743
- if "nginx_proxy_port" in doc["web"]:
744
- _LOGGER.info("Migrating 'web.nginx_proxy_port' to 'web.proxy_port'")
745
- doc["web"]["proxy_port"] = doc["web"].pop("nginx_proxy_port")
746
- migrated = True
747
- migrations_applied.append("web.nginx_proxy_port -> web.proxy_port")
748
-
749
- # Migration: modbus_sensors -> modbus_devices
750
- if "modbus_sensors" in doc:
751
- _LOGGER.warning("Modbus sensors are renamed to modbus_devices. Please update your config.")
752
- migrated = True
753
- migrations_applied.append("modbus_sensors -> modbus_devices")
754
-
755
- if migrated:
756
- _LOGGER.info("Configuration migrations applied: %s", ", ".join(migrations_applied))
757
-
758
- # Persist migrations to config file if provided
759
- if config_file:
760
- try:
761
- _persist_migrations(config_file, doc, migrations_applied)
762
- except Exception as e:
763
- _LOGGER.error("Failed to persist migrations to config file: %s", e)
764
-
765
- return doc, migrated
741
+ from boneio.core.config.migrations import (
742
+ CURRENT_SCHEMA_VERSION,
743
+ get_config_version,
744
+ run_migrations,
745
+ )
766
746
 
747
+ current_version = get_config_version(doc)
748
+ if current_version >= CURRENT_SCHEMA_VERSION:
749
+ return doc, False
767
750
 
768
- def _persist_migrations(config_file: str, migrated_doc: dict, migrations: list[str]) -> None:
769
- """
770
- Persist migrated configuration back to YAML file.
771
-
772
- Args:
773
- config_file: Path to config file
774
- migrated_doc: Migrated configuration document
775
- migrations: List of applied migrations for logging
776
- """
777
- import os
778
- from pathlib import Path
779
-
780
- config_dir = Path(config_file).parent
781
-
782
- # Read original file to preserve structure and !include directives
783
- with open(config_file, 'r', encoding='utf-8') as f:
784
- original_lines = f.readlines()
785
-
786
- # For web.nginx_proxy_port -> web.proxy_port migration
787
- if any("nginx_proxy_port" in m for m in migrations):
788
- updated_lines = []
789
- for line in original_lines:
790
- # Replace nginx_proxy_port with proxy_port in the line
791
- if "nginx_proxy_port:" in line:
792
- indent = len(line) - len(line.lstrip())
793
- value_part = line.split("nginx_proxy_port:", 1)[1]
794
- updated_line = " " * indent + "proxy_port:" + value_part
795
- updated_lines.append(updated_line)
796
- _LOGGER.info("Replaced line in config file: %s -> %s", line.rstrip(), updated_line.rstrip())
797
- else:
798
- updated_lines.append(line)
799
-
800
- # Write back to file
801
- with open(config_file, 'w', encoding='utf-8') as f:
802
- f.writelines(updated_lines)
803
-
804
- _LOGGER.info("Persisted migrations to config file: %s", config_file)
751
+ doc, new_version = run_migrations(doc, current_version, config_file)
752
+ return doc, new_version > current_version
805
753
 
806
754
 
807
755
  def load_config_from_string(config_str: str) -> dict:
@@ -809,11 +757,12 @@ def load_config_from_string(config_str: str) -> dict:
809
757
  schema = _get_schema() # Use cached schema instead of loading every time
810
758
  v = CustomValidator(schema, purge_unknown=True)
811
759
 
812
- # First normalize the document
813
- doc = v.normalized(config_str, always_return_document=True) # type: ignore[attr-defined]
760
+ # Apply migrations on raw dict BEFORE normalization/coercion
761
+ # (coerce: positive_time_period would fail on bare int like transition: 2)
762
+ migrated_str, _ = _run_config_migrations(config_str, config_file=None)
814
763
 
815
- # Apply migrations (without persisting - that happens in load_config_from_file)
816
- doc, _ = _migrate_config(doc, config_file=None)
764
+ # Normalize the document (applies coercion rules)
765
+ doc = v.normalized(migrated_str, always_return_document=True) # type: ignore[attr-defined]
817
766
 
818
767
  # Then merge board config
819
768
  merged_doc = merge_board_config(doc)
@@ -847,11 +796,12 @@ def load_config_from_file(config_file: str):
847
796
  schema = _get_schema()
848
797
  v = CustomValidator(schema, purge_unknown=True)
849
798
 
850
- # First normalize the document
851
- doc = v.normalized(config_yaml, always_return_document=True) # type: ignore[attr-defined]
799
+ # Apply migrations on raw dict BEFORE normalization/coercion
800
+ # (coerce: positive_time_period would fail on bare int like transition: 2)
801
+ config_yaml, migrations_applied = _run_config_migrations(config_yaml, config_file=config_file)
852
802
 
853
- # Apply migrations and persist to file if needed
854
- doc, migrations_applied = _migrate_config(doc, config_file=config_file)
803
+ # Normalize the document (applies coercion rules)
804
+ doc = v.normalized(config_yaml, always_return_document=True) # type: ignore[attr-defined]
855
805
 
856
806
  # Then merge board config
857
807
  merged_doc = merge_board_config(doc)
@@ -566,6 +566,13 @@ class Manager:
566
566
  val = action_definition.get(opt_key)
567
567
  if val is not None:
568
568
  parsed_action[opt_key] = val
569
+ # Convert transition TimePeriod to float seconds
570
+ if "transition" in parsed_action:
571
+ t_val = parsed_action["transition"]
572
+ if hasattr(t_val, "total_in_seconds"):
573
+ parsed_action["transition"] = t_val.total_in_seconds
574
+ elif not isinstance(t_val, (int, float)):
575
+ parsed_action["transition"] = 0.0
569
576
  _copy_long_press_meta(parsed_action, action_definition)
570
577
  parsed_actions[click_type].append(parsed_action)
571
578
  continue
@@ -739,6 +746,20 @@ class Manager:
739
746
  output_id = action_definition.get("output_id")
740
747
  action_output = action_definition.get("action_output", "TOGGLE")
741
748
 
749
+ # Clamp transition to repeat_interval to avoid overlapping animations
750
+ transition_val = action_definition.get("transition")
751
+ if transition_val and action_definition.get("repeat"):
752
+ repeat_interval = action_definition.get("repeat_interval")
753
+ if repeat_interval:
754
+ ri_seconds = repeat_interval.total_in_seconds if hasattr(repeat_interval, "total_in_seconds") else repeat_interval / 1000.0
755
+ if transition_val > ri_seconds:
756
+ _LOGGER.debug(
757
+ "Clamping transition %.3fs to repeat_interval %.3fs",
758
+ transition_val, ri_seconds,
759
+ )
760
+ transition_val = ri_seconds
761
+ action_definition = {**action_definition, "transition": transition_val}
762
+
742
763
  if action_output == "CYCLE_COLOR":
743
764
  await self.remote_devices.cycle_color(
744
765
  device_id=remote_device_id,