boneio 1.5.0.dev11__tar.gz → 1.5.0.dev13__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 (504) hide show
  1. {boneio-1.5.0.dev11/boneio.egg-info → boneio-1.5.0.dev13}/PKG-INFO +1 -1
  2. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/gate_cover.py +6 -2
  3. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/__init__.py +3 -1
  4. boneio-1.5.0.dev13/boneio/core/config/migrations/v4_wled_cache.py +219 -0
  5. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/yaml_util.py +12 -0
  6. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/inputs.py +9 -7
  7. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/remote.py +9 -2
  8. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/__init__.py +4 -0
  9. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/gate_cover.py +53 -11
  10. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates.py +40 -10
  11. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/wled.py +60 -5
  12. boneio-1.5.0.dev13/boneio/core/remote/wled_cache.py +143 -0
  13. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_devices.yaml +2 -78
  14. boneio-1.5.0.dev13/boneio/version.py +2 -0
  15. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/app.py +6 -0
  16. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/BindingMatrix-sPbnkk3q.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/BindingMatrix-aj3riWWZ.js +1 -1
  17. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/ConfigEditor-BW5p6czH.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ConfigEditor-Blrg9Au1.js +1 -1
  18. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EditItemDialog-EXSzv1h-.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EditItemDialog-cJc7C25R.js +1 -1
  19. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EntityCard-Baa34yvR.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityCard-CVnjkl2Y.js +1 -1
  20. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/EntityGrid-ZMMQCacx.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/EntityGrid-B6mC4OZ8.js +1 -1
  21. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/InputsView-3TWtNuVX.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/InputsView-C09ulmeN.js +1 -1
  22. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/LogViewer-k5Gt8k2O.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/LogViewer-U1DEZ2mc.js +1 -1
  23. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/ModbusView-DtvRzQPY.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/ModbusView-MqeWOSDT.js +1 -1
  24. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/NodeRedView-BPEkkqIb.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/NodeRedView-CNPh9Kak.js +1 -1
  25. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/OutputsView-DUnA3EG0.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/OutputsView-uXH9nyRR.js +1 -1
  26. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SensorView-WmoZT5VM.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SensorView-DW85dbP7.js +1 -1
  27. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SudoPasswordDialog-fC4HRGtE.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SudoPasswordDialog-C9jQ6QtB.js +1 -1
  28. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/SystemState-BRigO9Bc.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/SystemState-A6TNdNT0.js +1 -1
  29. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/TemplatesView-CAXj1gAG.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/TemplatesView-Bmu7KfpS.js +1 -1
  30. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/Tools-DfTLLXUx.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/Tools-C-qgHesX.js +1 -1
  31. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/UISettings-CEZ5cjTg.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/UISettings-B_Vt1ikn.js +3 -3
  32. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/dialog-DaAuWrWH.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/dialog-Dj_HN1ZA.js +1 -1
  33. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/gi-B6VoRVMX.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/gi-Dt8p1sub.js +1 -1
  34. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/index-mUeR1ZYi.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/index-CyBZuJ67.js +2 -2
  35. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-DAG4PZPN.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/modbusDeviceCatalog-D8uh5ILp.js +1 -1
  36. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/select-CT8v8aH8.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/select-Bxh-o8g9.js +1 -1
  37. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/tabs-box-DdJPCk-r.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/tabs-box-Bjw4Iwcm.js +1 -1
  38. boneio-1.5.0.dev11/boneio/webui/frontend-dist/assets/utils-BgjkKFNC.js → boneio-1.5.0.dev13/boneio/webui/frontend-dist/assets/utils-BmlJVtvk.js +1 -1
  39. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/index.html +1 -1
  40. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/config.schema.json +0 -144
  41. {boneio-1.5.0.dev11/boneio/webui → boneio-1.5.0.dev13/boneio/webui/frontend-dist}/schema/remote_devices.schema.json +0 -144
  42. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/sw.js +1 -1
  43. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/config.py +13 -1
  44. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/remote_devices.py +36 -0
  45. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/config.schema.json +0 -144
  46. {boneio-1.5.0.dev11/boneio/webui/frontend-dist → boneio-1.5.0.dev13/boneio/webui}/schema/remote_devices.schema.json +0 -144
  47. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13/boneio.egg-info}/PKG-INFO +1 -1
  48. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/SOURCES.txt +25 -23
  49. boneio-1.5.0.dev11/boneio/version.py +0 -2
  50. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/LICENSE +0 -0
  51. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/MANIFEST.in +0 -0
  52. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/README.md +0 -0
  53. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/__init__.py +0 -0
  54. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/input.yaml +0 -0
  55. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_24_16.yaml +0 -0
  56. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_32_10.yaml +0 -0
  57. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_32_5.yaml +0 -0
  58. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_cover.yaml +0 -0
  59. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  60. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/input.yaml +0 -0
  61. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_24_16.yaml +0 -0
  62. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_32_10.yaml +0 -0
  63. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_32_5.yaml +0 -0
  64. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_cover.yaml +0 -0
  65. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  66. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/input.yaml +0 -0
  67. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_24_16.yaml +0 -0
  68. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_32_10.yaml +0 -0
  69. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_32_5.yaml +0 -0
  70. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_cover.yaml +0 -0
  71. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  72. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/input.yaml +0 -0
  73. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_24_16.yaml +0 -0
  74. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_32_10.yaml +0 -0
  75. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_cover.yaml +0 -0
  76. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  77. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/input.yaml +0 -0
  78. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_24_16.yaml +0 -0
  79. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_32_10.yaml +0 -0
  80. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_cover.yaml +0 -0
  81. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  82. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/input.yaml +0 -0
  83. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_24_16.yaml +0 -0
  84. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_32_10.yaml +0 -0
  85. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_48_4.yaml +0 -0
  86. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_cover.yaml +0 -0
  87. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  88. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/input.yaml +0 -0
  89. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_24_16.yaml +0 -0
  90. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_32_10.yaml +0 -0
  91. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_48_4.yaml +0 -0
  92. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_cover.yaml +0 -0
  93. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  94. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/input.yaml +0 -0
  95. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_24_16.yaml +0 -0
  96. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_32_10.yaml +0 -0
  97. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_48_4.yaml +0 -0
  98. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_cover.yaml +0 -0
  99. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  100. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/bonecli.py +0 -0
  101. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/__init__.py +0 -0
  102. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/__init__.py +0 -0
  103. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/cover.py +0 -0
  104. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/time_based.py +0 -0
  105. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/cover/venetian.py +0 -0
  106. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/group/__init__.py +0 -0
  107. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/group/output_group.py +0 -0
  108. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/__init__.py +0 -0
  109. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/binary_sensor.py +0 -0
  110. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/detectors.py +0 -0
  111. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/event.py +0 -0
  112. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/__init__.py +0 -0
  113. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/base.py +0 -0
  114. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/input/remote/esphome.py +0 -0
  115. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/__init__.py +0 -0
  116. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/controller.py +0 -0
  117. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/irrigation/water_source.py +0 -0
  118. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/__init__.py +0 -0
  119. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/basic.py +0 -0
  120. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/buzzer.py +0 -0
  121. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/mcp.py +0 -0
  122. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/pca.py +0 -0
  123. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/pcf.py +0 -0
  124. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/output/remote.py +0 -0
  125. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/sensor/__init__.py +0 -0
  126. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/sensor/virtual_energy.py +0 -0
  127. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/__init__.py +0 -0
  128. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/alarm_panel.py +0 -0
  129. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/components/template/thermostat.py +0 -0
  130. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/const.py +0 -0
  131. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/__init__.py +0 -0
  132. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/__init__.py +0 -0
  133. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/__init__.py +0 -0
  134. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  135. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  136. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  137. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/registration.py +0 -0
  138. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/cloud/secrets.py +0 -0
  139. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/__init__.py +0 -0
  140. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/config_helper.py +0 -0
  141. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  142. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/migrations/v2_transition.py +0 -0
  143. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/package-lock.json +0 -0
  144. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/package.json +0 -0
  145. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/config/schema_converter.py +0 -0
  146. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/discovery.py +0 -0
  147. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/events/__init__.py +0 -0
  148. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/events/bus.py +0 -0
  149. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/__init__.py +0 -0
  150. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/action_conditions.py +0 -0
  151. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/canopen.py +0 -0
  152. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/covers.py +0 -0
  153. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/display.py +0 -0
  154. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/irrigation.py +0 -0
  155. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/manager.py +0 -0
  156. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/modbus.py +0 -0
  157. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/outputs.py +0 -0
  158. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/remote_input_registrar.py +0 -0
  159. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/sensors.py +0 -0
  160. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/alarm.py +0 -0
  161. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/templates/thermostat.py +0 -0
  162. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/manager/update.py +0 -0
  163. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/__init__.py +0 -0
  164. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/basic.py +0 -0
  165. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/basic_mqtt.py +0 -0
  166. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/composite.py +0 -0
  167. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/local.py +0 -0
  168. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/lox.py +0 -0
  169. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/mqtt.py +0 -0
  170. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/messaging/queue.py +0 -0
  171. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/__init__.py +0 -0
  172. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/base.py +0 -0
  173. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/can.py +0 -0
  174. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/esphome.py +0 -0
  175. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/remote/mqtt.py +0 -0
  176. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/__init__.py +0 -0
  177. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/base.py +0 -0
  178. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/sensor/system.py +0 -0
  179. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/state/__init__.py +0 -0
  180. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/state/manager.py +0 -0
  181. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/__init__.py +0 -0
  182. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/host_data.py +0 -0
  183. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/system/monitor.py +0 -0
  184. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/__init__.py +0 -0
  185. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/async_updater.py +0 -0
  186. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/conditions.py +0 -0
  187. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/filter.py +0 -0
  188. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/font_util.py +0 -0
  189. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/logger.py +0 -0
  190. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/timeperiod.py +0 -0
  191. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/core/utils/util.py +0 -0
  192. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/adc.yaml +0 -0
  193. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  194. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/config.yaml +0 -0
  195. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/event.yaml +0 -0
  196. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/mqtt.yaml +0 -0
  197. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  198. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/adc.yaml +0 -0
  199. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  200. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/config.yaml +0 -0
  201. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/event.yaml +0 -0
  202. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/mqtt.yaml +0 -0
  203. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  204. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/adc.yaml +0 -0
  205. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  206. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/config.yaml +0 -0
  207. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/event.yaml +0 -0
  208. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/mqtt.yaml +0 -0
  209. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  210. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/__init__.py +0 -0
  211. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/can_master.yaml +0 -0
  212. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/can_slave.yaml +0 -0
  213. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/adc.yaml +0 -0
  214. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  215. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/config.yaml +0 -0
  216. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/cover.yaml +0 -0
  217. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/event.yaml +0 -0
  218. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/mqtt.yaml +0 -0
  219. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover/outputCover.yaml +0 -0
  220. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/adc.yaml +0 -0
  221. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  222. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/config.yaml +0 -0
  223. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/cover.yaml +0 -0
  224. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/event.yaml +0 -0
  225. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  226. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  227. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/adc.yaml +0 -0
  228. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  229. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  230. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  231. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  232. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/event_all.yaml +0 -0
  233. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  234. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  235. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  236. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  237. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  238. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  239. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/exceptions.py +0 -0
  240. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/__init__.py +0 -0
  241. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/analog/__init__.py +0 -0
  242. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/analog/adc.py +0 -0
  243. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/__init__.py +0 -0
  244. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/bridge.py +0 -0
  245. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/client.py +0 -0
  246. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/interface.py +0 -0
  247. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/node.py +0 -0
  248. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/node_id.py +0 -0
  249. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/can/test_od.py +0 -0
  250. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/__init__.py +0 -0
  251. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/early_oled.py +0 -0
  252. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  253. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/display/oled.py +0 -0
  254. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/__init__.py +0 -0
  255. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  256. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  257. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  258. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  259. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/__init__.py +0 -0
  260. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/base.py +0 -0
  261. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/gpio/input/manager.py +0 -0
  262. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/__init__.py +0 -0
  263. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/bus.py +0 -0
  264. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/ina219.py +0 -0
  265. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/ina219_driver.py +0 -0
  266. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/mcp9808.py +0 -0
  267. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/i2c/pct2075.py +0 -0
  268. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/__init__.py +0 -0
  269. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/bus.py +0 -0
  270. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/dallas.py +0 -0
  271. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/onewire/ds2482.py +0 -0
  272. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/__init__.py +0 -0
  273. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  274. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/base.py +0 -0
  275. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  276. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  277. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/__init__.py +0 -0
  278. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/homeassistant.py +0 -0
  279. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/interlock.py +0 -0
  280. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/integration/lox_template.py +0 -0
  281. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/__init__.py +0 -0
  282. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/actions.py +0 -0
  283. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/MANIFEST.sha256 +0 -0
  284. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/daemon.json +0 -0
  285. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  286. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  287. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  288. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  289. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  290. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/journald/journald.conf +0 -0
  291. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  292. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/sudoers/boneio +0 -0
  293. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  294. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  295. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/boneio.service +0 -0
  296. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  297. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  298. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  299. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  300. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  301. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  302. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  303. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  304. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  305. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/runner.py +0 -0
  306. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/__init__.py +0 -0
  307. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  308. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  309. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  310. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  311. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  312. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  313. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  314. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  315. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/__init__.py +0 -0
  316. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/cli.py +0 -0
  317. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/client.py +0 -0
  318. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/coordinator.py +0 -0
  319. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/__init__.py +0 -0
  320. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  321. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  322. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  323. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  324. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  325. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  326. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  327. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  328. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  329. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  330. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/thessla.json +0 -0
  331. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  332. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  333. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/inverters/sofar.json +0 -0
  334. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  335. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  336. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  337. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  338. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/cwt.json +0 -0
  339. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  340. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  341. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  342. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  343. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/pt100.json +0 -0
  344. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/sht20.json +0 -0
  345. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/devices/sensors/sht30.json +0 -0
  346. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/__init__.py +0 -0
  347. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/base.py +0 -0
  348. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/__init__.py +0 -0
  349. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/numeric.py +0 -0
  350. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/select.py +0 -0
  351. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/switch.py +0 -0
  352. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/derived/text.py +0 -0
  353. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/__init__.py +0 -0
  354. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/binary.py +0 -0
  355. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/numeric.py +0 -0
  356. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/sensor/text.py +0 -0
  357. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/__init__.py +0 -0
  358. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/binary.py +0 -0
  359. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/entities/writeable/numeric.py +0 -0
  360. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/mock_coordinator.py +0 -0
  361. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/modbus/utils.py +0 -0
  362. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/__init__.py +0 -0
  363. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/actions.py +0 -0
  364. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/events.py +0 -0
  365. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/files.py +0 -0
  366. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/logs.py +0 -0
  367. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/mqtt.py +0 -0
  368. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/models/state.py +0 -0
  369. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/runner.py +0 -0
  370. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions.yaml +0 -0
  371. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions_sensor.yaml +0 -0
  372. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/actions_switch.yaml +0 -0
  373. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/condition.yaml +0 -0
  374. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/filters.yaml +0 -0
  375. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/filters_adc.yaml +0 -0
  376. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/id.yaml +0 -0
  377. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_inputs.yaml +0 -0
  378. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/remote_outputs.yaml +0 -0
  379. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/schema.yaml +0 -0
  380. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/temp_unit.yaml +0 -0
  381. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/schema/update_interval.yaml +0 -0
  382. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/action_validation.py +0 -0
  383. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/dashboard_cards.py +0 -0
  384. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/HelpView-tDBff8mq.js +0 -0
  385. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/LongPressWrapper-B-jkbdNk.js +0 -0
  386. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/SearchableEntityPicker-Dr9uF-oT.js +0 -0
  387. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/Sparkline-P3-zEZpz.js +0 -0
  388. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/aiConfig-IRYCBmLm.js +0 -0
  389. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/aiWizardPrompt-D9OJ-cE7.js +0 -0
  390. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  391. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  392. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  393. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/css.worker-CvXBzhp8.js +0 -0
  394. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/editor.worker-Cn2oRESe.js +0 -0
  395. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/formatters-zOiGPJLh.js +0 -0
  396. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/html.worker-BO6WuOEO.js +0 -0
  397. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/index-CpB8cnDC.css +0 -0
  398. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/json.worker-BkJRGcCJ.js +0 -0
  399. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/monaco-61yH0vfd.js +0 -0
  400. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  401. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/rolldown-runtime-QTnfLwEv.js +0 -0
  402. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/ts.worker-B0J26iPs.js +0 -0
  403. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/useTranslation-DWIecEyP.js +0 -0
  404. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/vendor-DjFmndpd.js +0 -0
  405. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  406. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/assets/yaml.worker-BKRoXlmz.js +0 -0
  407. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  408. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  409. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio.svg +0 -0
  410. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  411. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  412. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  413. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  414. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  415. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  416. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  417. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  418. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  419. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  420. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  421. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  422. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  423. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  424. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  425. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  426. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  427. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  428. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  429. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  430. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  431. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  432. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  433. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  434. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  435. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  436. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  437. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  438. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  439. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  440. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  441. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/frontend-dist/workbox-4918f2f6.js +0 -0
  442. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/hvac_svg_templates.py +0 -0
  443. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/middleware/__init__.py +0 -0
  444. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/middleware/auth.py +0 -0
  445. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/modbus_card_templates.py +0 -0
  446. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/__init__.py +0 -0
  447. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/auth.py +0 -0
  448. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/caddy.py +0 -0
  449. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/can.py +0 -0
  450. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/covers.py +0 -0
  451. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/dashboard.py +0 -0
  452. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/dev_fake_device.py +0 -0
  453. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/irrigation.py +0 -0
  454. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/migrations.py +0 -0
  455. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/modbus.py +0 -0
  456. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/outputs.py +0 -0
  457. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/sensors.py +0 -0
  458. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/system.py +0 -0
  459. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/templates.py +0 -0
  460. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/timezone_sudoers.py +0 -0
  461. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/tools.py +0 -0
  462. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/routes/update.py +0 -0
  463. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/adc.schema.json +0 -0
  464. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/areas.schema.json +0 -0
  465. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  466. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/boneio.schema.json +0 -0
  467. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/can.schema.json +0 -0
  468. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/cover.schema.json +0 -0
  469. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/dallas.schema.json +0 -0
  470. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/ds2482.schema.json +0 -0
  471. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/event.schema.json +0 -0
  472. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/ina219.schema.json +0 -0
  473. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/irrigation.schema.json +0 -0
  474. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/lm75.schema.json +0 -0
  475. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/logger.schema.json +0 -0
  476. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/lox_udp.schema.json +0 -0
  477. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mcp23017.schema.json +0 -0
  478. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mcp9808.schema.json +0 -0
  479. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/modbus.schema.json +0 -0
  480. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  481. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/mqtt.schema.json +0 -0
  482. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/oled.schema.json +0 -0
  483. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/output.schema.json +0 -0
  484. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/output_group.schema.json +0 -0
  485. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/pca9685.schema.json +0 -0
  486. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/pcf8575.schema.json +0 -0
  487. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  488. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  489. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/sensor.schema.json +0 -0
  490. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/template.schema.json +0 -0
  491. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  492. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/schema/web.schema.json +0 -0
  493. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/services/__init__.py +0 -0
  494. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/services/logs.py +0 -0
  495. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/web_server.py +0 -0
  496. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio/webui/websocket_manager.py +0 -0
  497. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/dependency_links.txt +0 -0
  498. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/entry_points.txt +0 -0
  499. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/requires.txt +0 -0
  500. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/boneio.egg-info/top_level.txt +0 -0
  501. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/pyproject.toml +0 -0
  502. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/setup.cfg +0 -0
  503. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/setup.py +0 -0
  504. {boneio-1.5.0.dev11 → boneio-1.5.0.dev13}/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.dev11
3
+ Version: 1.5.0.dev13
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
@@ -191,10 +191,14 @@ class BoneIOGateCover:
191
191
  # -- MQTT ----------------------------------------------------------------
192
192
 
193
193
  async def start(self) -> None:
194
- """Subscribe to MQTT command topic."""
194
+ """Subscribe to MQTT command topic and publish current state.
195
+
196
+ Initial sensor state is already set by TemplateManager during
197
+ configuration, so start() just subscribes and publishes.
198
+ """
195
199
  await self._message_bus.subscribe_and_listen(self._cmd_topic, self.handle_command)
196
200
  self._publish_state()
197
- _LOGGER.info("GateCover %s started, subscribed to %s", self._id, self._cmd_topic)
201
+ _LOGGER.info("GateCover %s started (state=%s), subscribed to %s", self._id, self._state, self._cmd_topic)
198
202
 
199
203
  async def stop(self) -> None:
200
204
  """Unsubscribe from MQTT and cancel timers."""
@@ -17,7 +17,7 @@ from dataclasses import dataclass, field
17
17
  _LOGGER = logging.getLogger(__name__)
18
18
 
19
19
  # Current schema version — bump this when adding new migrations
20
- CURRENT_SCHEMA_VERSION = 3
20
+ CURRENT_SCHEMA_VERSION = 4
21
21
 
22
22
  # Minimum app version that introduced each schema version.
23
23
  # Used by the WebUI to warn before rolling back to an incompatible version.
@@ -26,6 +26,7 @@ SCHEMA_VERSION_APP_MAP: dict[int, str] = {
26
26
  1: "1.2.0dev1", # proxy_port rename
27
27
  2: "1.3.0dev1", # transition timeperiod
28
28
  3: "1.3.0dev7", # irrigation section
29
+ 4: "1.5.0dev13", # WLED effects/palettes → JSON cache
29
30
  }
30
31
 
31
32
 
@@ -230,4 +231,5 @@ def _persist_config_version(config_file: str, version: int) -> None:
230
231
  from boneio.core.config.migrations import (
231
232
  v1_proxy_port, # noqa: E402, F401
232
233
  v2_transition, # noqa: E402, F401
234
+ v4_wled_cache, # noqa: E402, F401
233
235
  )
@@ -0,0 +1,219 @@
1
+ """Migration v4: Extract WLED effects/palettes/segments from config to JSON cache.
2
+
3
+ Before: WLED effects (219 items), palettes (72 items), and segments are stored
4
+ inline in each remote_device's ``wled`` section inside config.yaml.
5
+ This causes 3-5 second YAML serialization delays on ARM hardware.
6
+
7
+ After: These fields are stripped from config and saved to a lightweight
8
+ ``.wled_cache.json`` file. The cache auto-regenerates from WLED API
9
+ on device connect, so no data is permanently lost.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import json
15
+ import logging
16
+ import re
17
+ from pathlib import Path
18
+
19
+ from boneio.core.config.migrations import register_migration
20
+
21
+ _LOGGER = logging.getLogger(__name__)
22
+
23
+ # Fields to strip from each WLED device config — these are device metadata,
24
+ # not user configuration.
25
+ _WLED_CACHE_FIELDS = ("effects", "palettes", "segments")
26
+
27
+
28
+ def _persist_wled_cache_strip(config_file: str) -> None:
29
+ """Strip effects/palettes/segments from WLED devices in the YAML file.
30
+
31
+ Reads the config file(s), extracts WLED metadata into a JSON cache,
32
+ and rewrites the YAML without those bulky lists.
33
+
34
+ Args:
35
+ config_file: Path to the main config.yaml file.
36
+ """
37
+ config_dir = Path(config_file).parent
38
+
39
+ # First, find and extract WLED data from the in-memory parse
40
+ # to save into .wled_cache.json before removing from YAML
41
+ try:
42
+ from yaml import SafeLoader, load
43
+
44
+ class IncludeLoader(SafeLoader):
45
+ """YAML loader that preserves !include tags."""
46
+
47
+ def _include_constructor(
48
+ loader: IncludeLoader, node: object
49
+ ) -> object:
50
+ filename = loader.construct_scalar(node) # type: ignore[arg-type]
51
+ return type(
52
+ "Include", (), {"filename": filename, "tag": "!include"}
53
+ )()
54
+
55
+ IncludeLoader.add_constructor("!include", _include_constructor)
56
+
57
+ with open(config_file, encoding="utf-8") as f:
58
+ config = load(f, Loader=IncludeLoader) # noqa: S506
59
+
60
+ if not config:
61
+ return
62
+
63
+ # Determine where remote_devices lives
64
+ rd_section = config.get("remote_devices")
65
+ if rd_section is None:
66
+ return
67
+
68
+ # If it's an !include, load the included file
69
+ if hasattr(rd_section, "tag") and rd_section.tag == "!include":
70
+ include_path = config_dir / rd_section.filename
71
+ if include_path.exists():
72
+ with open(include_path, encoding="utf-8") as f:
73
+ rd_list = load(f, Loader=SafeLoader) # noqa: S506
74
+ _strip_wled_fields_from_file(include_path, rd_list, config_dir)
75
+ return
76
+
77
+ # Inline remote_devices — strip from main config file
78
+ if isinstance(rd_section, list):
79
+ _strip_wled_fields_from_file(
80
+ Path(config_file), rd_section, config_dir
81
+ )
82
+
83
+ except Exception as exc:
84
+ _LOGGER.error("Failed to strip WLED cache fields from file: %s", exc)
85
+
86
+
87
+ def _strip_wled_fields_from_file(
88
+ yaml_path: Path, devices: list[dict] | None, config_dir: Path
89
+ ) -> None:
90
+ """Extract WLED metadata to JSON cache, then strip from YAML file.
91
+
92
+ Args:
93
+ yaml_path: Path to the YAML file containing remote_devices.
94
+ devices: Parsed list of remote device dicts.
95
+ config_dir: Config directory for placing the cache file.
96
+ """
97
+ if not devices:
98
+ return
99
+
100
+ # Extract cache data
101
+ cache_data: dict[str, dict[str, list[dict[str, str | int]]]] = {}
102
+ has_data = False
103
+
104
+ for device in devices:
105
+ if not isinstance(device, dict):
106
+ continue
107
+ wled = device.get("wled")
108
+ if not isinstance(wled, dict):
109
+ continue
110
+
111
+ device_id = device.get("id", "")
112
+ if not device_id:
113
+ continue
114
+
115
+ device_cache: dict[str, list[dict[str, str | int]]] = {}
116
+ for field in _WLED_CACHE_FIELDS:
117
+ if field in wled and isinstance(wled[field], list) and wled[field]:
118
+ device_cache[field] = wled[field]
119
+ has_data = True
120
+ if device_cache:
121
+ cache_data[device_id] = device_cache
122
+
123
+ # Save extracted data to JSON cache
124
+ if has_data:
125
+ cache_path = config_dir / ".wled_cache.json"
126
+ try:
127
+ # Merge with existing cache (other migrations may have run)
128
+ existing: dict[str, dict[str, list[dict[str, str | int]]]] = {}
129
+ if cache_path.exists():
130
+ with open(cache_path, encoding="utf-8") as f:
131
+ existing = json.load(f)
132
+
133
+ existing.update(cache_data)
134
+
135
+ with open(cache_path, "w", encoding="utf-8") as f:
136
+ json.dump(existing, f, indent=2, ensure_ascii=False)
137
+
138
+ _LOGGER.info(
139
+ "Saved WLED metadata for %d device(s) to %s",
140
+ len(cache_data),
141
+ cache_path,
142
+ )
143
+ except Exception as exc:
144
+ _LOGGER.warning("Failed to write WLED cache: %s", exc)
145
+
146
+ # Now strip the fields from the YAML file using regex
147
+ # This is safer than re-serializing the entire file
148
+ with open(yaml_path, encoding="utf-8") as f:
149
+ content = f.read()
150
+
151
+ original_content = content
152
+
153
+ # Remove effects/palettes/segments blocks from YAML
154
+ # Pattern: indented key followed by a list of dicts
155
+ for field in _WLED_CACHE_FIELDS:
156
+ # Match the field key line and all following lines that are more indented
157
+ # or are list items (- ) at deeper indent
158
+ pattern = re.compile(
159
+ rf"^( +){field}:\s*\n" # field key line
160
+ rf"((?:\1 .+\n|\1- .+\n)*)", # indented content below
161
+ re.MULTILINE,
162
+ )
163
+ content = pattern.sub("", content)
164
+
165
+ if content != original_content:
166
+ with open(yaml_path, "w", encoding="utf-8") as f:
167
+ f.write(content)
168
+ _LOGGER.info(
169
+ "Stripped WLED cache fields from %s (saved %d bytes)",
170
+ yaml_path.name,
171
+ len(original_content) - len(content),
172
+ )
173
+
174
+
175
+ @register_migration(
176
+ version=4,
177
+ name="Extract WLED effects/palettes/segments to JSON cache",
178
+ migrate_file=_persist_wled_cache_strip,
179
+ )
180
+ def migrate(doc: dict) -> dict:
181
+ """Strip effects, palettes, and segments from remote_devices in memory.
182
+
183
+ These fields are device metadata auto-discovered from the WLED API,
184
+ not user configuration. Storing them in config.yaml causes slow saves
185
+ on ARM hardware due to YAML serialization overhead (~64KB per 7 devices).
186
+
187
+ After migration, this data lives in ``.wled_cache.json`` and is
188
+ auto-populated from the WLED API on device connect.
189
+
190
+ Args:
191
+ doc: Raw config dict.
192
+
193
+ Returns:
194
+ Migrated config dict with WLED metadata fields removed.
195
+ """
196
+ remote_devices = doc.get("remote_devices")
197
+ if not isinstance(remote_devices, list):
198
+ return doc
199
+
200
+ for device in remote_devices:
201
+ if not isinstance(device, dict):
202
+ continue
203
+ wled = device.get("wled")
204
+ if not isinstance(wled, dict):
205
+ continue
206
+
207
+ for field in _WLED_CACHE_FIELDS:
208
+ if field in wled:
209
+ items = wled[field]
210
+ count = len(items) if isinstance(items, list) else 0
211
+ _LOGGER.info(
212
+ "Stripping wled.%s (%d items) from device '%s'",
213
+ field,
214
+ count,
215
+ device.get("id", "?"),
216
+ )
217
+ del wled[field]
218
+
219
+ return doc
@@ -1246,6 +1246,18 @@ def update_config_section(config_file: str, section: str, data: dict | list) ->
1246
1246
  with contextlib.suppress(ValueError):
1247
1247
  entry["address"] = int(addr, 10)
1248
1248
 
1249
+ # Strip WLED device metadata (effects/palettes/segments) from remote_devices.
1250
+ # These are auto-discovered from WLED API and cached in .wled_cache.json,
1251
+ # NOT stored in config.yaml (defense in depth).
1252
+ if section == "remote_devices" and isinstance(data, list):
1253
+ _wled_cache_fields = ("effects", "palettes", "segments")
1254
+ for entry in data:
1255
+ if isinstance(entry, dict):
1256
+ wled = entry.get("wled")
1257
+ if isinstance(wled, dict):
1258
+ for field in _wled_cache_fields:
1259
+ wled.pop(field, None)
1260
+
1249
1261
  # Strip default values to keep YAML clean
1250
1262
  cleaned_data = strip_default_values(data, {}, section)
1251
1263
  _LOGGER.info(f"Cleaned data (defaults removed): {cleaned_data}")
@@ -801,16 +801,18 @@ class InputManager:
801
801
  # Send event to MQTT for Home Assistant
802
802
  self._publish_input_event_to_mqtt(input_instance, event)
803
803
 
804
- # Route to template entities (gate covers, alarm panels)
805
- # This must happen before the publish_only check so initial state
806
- # sync events reach gate covers and alarm panels.
807
- self._manager.templates.on_input_event(event.entity_id, event.click_type)
808
-
809
- # If publish_only is set, skip action execution (used for initial state sync)
804
+ # If publish_only is set, skip action execution AND template routing.
805
+ # publish_only events come from initial state sync (binary_sensor
806
+ # initial_send) routing them to gate covers would cause spurious
807
+ # state transitions that trigger HA automations on every restart.
808
+ # Gate covers read sensor state silently during their own start().
810
809
  if event.publish_only:
811
- _LOGGER.debug("Skipping action execution for %s (publish_only=True)", event.entity_id)
810
+ _LOGGER.debug("Skipping actions and template routing for %s (publish_only=True)", event.entity_id)
812
811
  return
813
812
 
813
+ # Route to template entities (gate covers, alarm panels)
814
+ self._manager.templates.on_input_event(event.entity_id, event.click_type)
815
+
814
816
  # Cancel pending delayed actions if this event matches delay_cancel_on
815
817
  # Check ALL click types' actions for delay_cancel_on (not just current click_type)
816
818
  self._cancel_delayed_if_matching(input_instance, event.entity_id, event.click_type)
@@ -473,7 +473,11 @@ class RemoteDeviceManager:
473
473
  action=action,
474
474
  )
475
475
 
476
- # For WLED devices, use HTTP JSON API
476
+ # For WLED devices, use fire-and-forget HTTP JSON API.
477
+ # WLED HTTP requests can stall for seconds when the device is
478
+ # unreachable (DNS timeout on .local), which blocks the EventBus
479
+ # worker and freezes ALL input events. Fire-and-forget schedules
480
+ # the request as a background task so the caller returns immediately.
477
481
  if device.protocol == RemoteDeviceProtocol.WLED:
478
482
  _LOGGER.debug("Controlling WLED '%s' segment '%s' on device '%s'", output_id, action, device_id)
479
483
  # Parse segment_id - "main" means whole device, otherwise it's segment ID
@@ -482,7 +486,9 @@ class RemoteDeviceManager:
482
486
  wled_rgb: tuple[int, int, int] | None = None
483
487
  if rgb and len(rgb) >= 3:
484
488
  wled_rgb = (rgb[0], rgb[1], rgb[2])
485
- return await cast(Any, device).control_light(
489
+ from boneio.core.remote.wled import WLEDRemoteDevice
490
+ wled_device = cast(WLEDRemoteDevice, device)
491
+ wled_device.control_light_fire_and_forget(
486
492
  segment_id=segment_id,
487
493
  action=action,
488
494
  brightness=brightness,
@@ -494,6 +500,7 @@ class RemoteDeviceManager:
494
500
  effect_speed=effect_speed,
495
501
  effect_intensity=effect_intensity,
496
502
  )
503
+ return True # Optimistic: task is scheduled
497
504
 
498
505
  # For MQTT devices, use standard control_output
499
506
  return await device.control_output(
@@ -145,6 +145,9 @@ class TemplateManager:
145
145
  for alarm in self._alarms.items:
146
146
  await alarm.start()
147
147
  for gate in self._gates.items:
148
+ # Sync sensor state silently before start() publishes state.
149
+ # Done here (not in configure()) because GPIO manager is now running.
150
+ self._gates.sync_initial_state(gate)
148
151
  await gate.start()
149
152
  _LOGGER.info("TemplateManager started all entities")
150
153
 
@@ -242,6 +245,7 @@ class TemplateManager:
242
245
  continue
243
246
  gate = self._gates.get(eid)
244
247
  if gate:
248
+ self._gates.sync_initial_state(gate)
245
249
  await gate.start()
246
250
 
247
251
  # Re-register all sensor EventBus listeners (clean slate)
@@ -143,10 +143,6 @@ class GateCoverManager:
143
143
  self._input_map[sensor_id] = []
144
144
  self._input_map[sensor_id].append(gate)
145
145
 
146
- # Read current sensor states to set correct initial gate state.
147
- # Without this, gate defaults to CLOSED which may be wrong.
148
- self._sync_initial_state(closed_sensor_id, open_sensor_id)
149
-
150
146
  # Publish HA discovery
151
147
  self._publish_discovery(gate)
152
148
 
@@ -159,23 +155,69 @@ class GateCoverManager:
159
155
 
160
156
  def _sync_initial_state(
161
157
  self,
158
+ gate: BoneIOGateCover,
162
159
  closed_sensor_id: str | None,
163
160
  open_sensor_id: str | None,
164
161
  ) -> None:
165
- """Sync initial gate state by asking InputManager to re-send sensor states.
162
+ """Read current sensor GPIO state and set gate cover's initial state.
166
163
 
167
- Delegates to InputManager.send_current_state_for_input() which reads
168
- live GPIO and fires an EventBus event. The gate cover's event listener
169
- picks it up automatically no direct GPIO access needed here.
164
+ Reads the binary sensor's ``is_active`` property directly —
165
+ no EventBus events are fired, no MQTT messages are published.
166
+ Gate cover's ``start()`` will publish the correct state later.
170
167
 
171
168
  Args:
169
+ gate: The gate cover instance to initialize.
172
170
  closed_sensor_id: ID of the closed contact sensor (or None).
173
171
  open_sensor_id: ID of the open contact sensor (or None).
174
172
  """
173
+ from boneio.components.input.binary_sensor import GpioInputBinarySensor
174
+ from boneio.components.template.gate_cover import CYCLE_CLOSE, CYCLE_OPEN
175
+ from boneio.const import CLOSED, IDLE, OPEN
176
+
175
177
  input_mgr = self._manager.inputs
176
- for sensor_id in (closed_sensor_id, open_sensor_id):
177
- if sensor_id:
178
- input_mgr.send_current_state_for_input(sensor_id)
178
+
179
+ if closed_sensor_id:
180
+ sensor = input_mgr._inputs.get(closed_sensor_id)
181
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
182
+ is_closed = sensor.is_active
183
+ _LOGGER.debug(
184
+ "Gate %s: initial closed_sensor %s is_active=%s",
185
+ gate.id, closed_sensor_id, is_closed,
186
+ )
187
+ if is_closed:
188
+ gate._state = CLOSED
189
+ gate._current_operation = IDLE
190
+ gate._cycle_next = CYCLE_OPEN
191
+ elif not gate._has_open_sensor:
192
+ gate._state = OPEN
193
+ gate._current_operation = IDLE
194
+
195
+ if open_sensor_id:
196
+ sensor = input_mgr._inputs.get(open_sensor_id)
197
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
198
+ is_open = sensor.is_active
199
+ _LOGGER.debug(
200
+ "Gate %s: initial open_sensor %s is_active=%s",
201
+ gate.id, open_sensor_id, is_open,
202
+ )
203
+ if is_open:
204
+ gate._state = OPEN
205
+ gate._current_operation = IDLE
206
+ gate._cycle_next = CYCLE_CLOSE
207
+
208
+ def sync_initial_state(self, gate: BoneIOGateCover) -> None:
209
+ """Public entry point for setting gate's initial state from sensor GPIO.
210
+
211
+ Called by TemplateManager during start() when GPIO manager is ready.
212
+
213
+ Args:
214
+ gate: Gate cover to sync.
215
+ """
216
+ self._sync_initial_state(
217
+ gate,
218
+ gate._closed_sensor_id,
219
+ gate._open_sensor_id,
220
+ )
179
221
 
180
222
  # -- Removal -------------------------------------------------------------
181
223
 
@@ -17,9 +17,9 @@ from boneio.components.template.alarm_panel import (
17
17
  BoneIOAlarmPanel,
18
18
  ZoneInput,
19
19
  )
20
- from boneio.components.template.gate_cover import BoneIOGateCover
20
+ from boneio.components.template.gate_cover import BoneIOGateCover, CYCLE_CLOSE, CYCLE_OPEN
21
21
  from boneio.components.template.thermostat import BoneIOThermostat
22
- from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, COVER
22
+ from boneio.const import ALARM_CONTROL_PANEL, CLIMATE, CLOSED, COVER, IDLE, OPEN
23
23
  from boneio.core.utils.timeperiod import parse_time_to_ms, parse_time_to_seconds
24
24
 
25
25
  if TYPE_CHECKING:
@@ -365,7 +365,7 @@ class TemplateManager:
365
365
 
366
366
  # Read current sensor states to set correct initial gate state.
367
367
  # Without this, gate defaults to CLOSED which may be wrong.
368
- self._sync_gate_initial_state(closed_sensor_id, open_sensor_id)
368
+ self._sync_gate_initial_state(gate, closed_sensor_id, open_sensor_id)
369
369
 
370
370
  # Publish HA discovery
371
371
  self._publish_gate_cover_discovery(gate)
@@ -379,23 +379,53 @@ class TemplateManager:
379
379
 
380
380
  def _sync_gate_initial_state(
381
381
  self,
382
+ gate: BoneIOGateCover,
382
383
  closed_sensor_id: str | None,
383
384
  open_sensor_id: str | None,
384
385
  ) -> None:
385
- """Sync initial gate state by asking InputManager to re-send sensor states.
386
+ """Read current sensor GPIO state and set gate cover's initial state.
386
387
 
387
- Delegates to InputManager.send_current_state_for_input() which reads
388
- live GPIO and fires an EventBus event. The gate cover's event listener
389
- picks it up automatically.
388
+ Reads the binary sensor's ``is_active`` property directly —
389
+ no EventBus events are fired, no MQTT messages are published.
390
+ Gate cover's ``start()`` will publish the correct state later.
390
391
 
391
392
  Args:
393
+ gate: The gate cover instance to initialize.
392
394
  closed_sensor_id: ID of the closed contact sensor (or None).
393
395
  open_sensor_id: ID of the open contact sensor (or None).
394
396
  """
397
+ from boneio.components.input.binary_sensor import GpioInputBinarySensor
398
+
395
399
  input_mgr = self._manager.inputs
396
- for sensor_id in (closed_sensor_id, open_sensor_id):
397
- if sensor_id:
398
- input_mgr.send_current_state_for_input(sensor_id)
400
+
401
+ if closed_sensor_id:
402
+ sensor = input_mgr._inputs.get(closed_sensor_id)
403
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
404
+ is_closed = sensor.is_active
405
+ _LOGGER.debug(
406
+ "Gate %s: initial closed_sensor %s is_active=%s",
407
+ gate.id, closed_sensor_id, is_closed,
408
+ )
409
+ if is_closed:
410
+ gate._state = CLOSED
411
+ gate._current_operation = IDLE
412
+ gate._cycle_next = CYCLE_OPEN
413
+ elif not gate._has_open_sensor:
414
+ gate._state = OPEN
415
+ gate._current_operation = IDLE
416
+
417
+ if open_sensor_id:
418
+ sensor = input_mgr._inputs.get(open_sensor_id)
419
+ if sensor and isinstance(sensor, GpioInputBinarySensor):
420
+ is_open = sensor.is_active
421
+ _LOGGER.debug(
422
+ "Gate %s: initial open_sensor %s is_active=%s",
423
+ gate.id, open_sensor_id, is_open,
424
+ )
425
+ if is_open:
426
+ gate._state = OPEN
427
+ gate._current_operation = IDLE
428
+ gate._cycle_next = CYCLE_CLOSE
399
429
 
400
430
  # -- HA Discovery --------------------------------------------------------
401
431
 
@@ -169,10 +169,25 @@ class WLEDRemoteDevice(RemoteDevice):
169
169
  _LOGGER.debug("Closed session for WLED '%s'", self._name)
170
170
 
171
171
  async def _get_session(self) -> aiohttp.ClientSession:
172
- """Get or create aiohttp session."""
172
+ """Get or create aiohttp session.
173
+
174
+ Uses ``ThreadedResolver`` (system ``getaddrinfo`` via NSS) so that
175
+ mDNS ``.local`` hostnames are resolved correctly through Avahi.
176
+ The default aiohttp resolver (``AsyncResolver`` / c-ares) bypasses
177
+ NSS entirely, causing ``Name or service not known`` errors for
178
+ ``.local`` names even when ``ping`` from the same host works fine.
179
+
180
+ Timeout is kept short (3s total, 2s connect) so that unreachable
181
+ devices do not block the caller.
182
+ """
173
183
  if self._session is None or self._session.closed:
174
- timeout = aiohttp.ClientTimeout(total=10)
175
- self._session = aiohttp.ClientSession(timeout=timeout)
184
+ timeout = aiohttp.ClientTimeout(total=3, connect=2)
185
+ resolver = aiohttp.resolver.ThreadedResolver()
186
+ connector = aiohttp.TCPConnector(resolver=resolver)
187
+ self._session = aiohttp.ClientSession(
188
+ timeout=timeout,
189
+ connector=connector,
190
+ )
176
191
  return self._session
177
192
 
178
193
  async def _send_state(self, state: dict[str, Any]) -> bool:
@@ -366,6 +381,34 @@ class WLEDRemoteDevice(RemoteDevice):
366
381
  )
367
382
 
368
383
  return await self._send_state(state)
384
+
385
+ def control_light_fire_and_forget(
386
+ self,
387
+ **kwargs: Any,
388
+ ) -> None:
389
+ """Schedule ``control_light`` as a background task.
390
+
391
+ Use this when the caller must not be blocked by network I/O
392
+ (e.g. when called from the EventBus action handler). The task
393
+ runs independently; failures are logged but do not propagate.
394
+
395
+ Args:
396
+ **kwargs: Forwarded to :meth:`control_light`.
397
+ """
398
+ asyncio.create_task(
399
+ self._control_light_safe(**kwargs),
400
+ name=f"wled_ff_{self._id}",
401
+ )
402
+
403
+ async def _control_light_safe(self, **kwargs: Any) -> None:
404
+ """Wrapper that catches all exceptions so fire-and-forget tasks never crash."""
405
+ try:
406
+ await self.control_light(**kwargs)
407
+ except Exception as exc:
408
+ _LOGGER.error(
409
+ "WLED fire-and-forget failed for '%s': %s",
410
+ self._name, exc,
411
+ )
369
412
 
370
413
  async def control_output(
371
414
  self,
@@ -487,12 +530,24 @@ class WLEDRemoteDevice(RemoteDevice):
487
530
  # Update internal segments list
488
531
  self._segments = segments
489
532
 
533
+ # Persist effects/palettes/segments to JSON cache
534
+ # (they are no longer stored in config.yaml)
535
+ from boneio.core.remote.wled_cache import update_device_metadata
536
+ update_device_metadata(
537
+ self._id,
538
+ effects=effects,
539
+ palettes=palettes,
540
+ segments=segments,
541
+ )
542
+
490
543
  _LOGGER.info(
491
- "Discovered WLED '%s' v%s with %d segments, %d LEDs",
544
+ "Discovered WLED '%s' v%s with %d segments, %d LEDs, %d effects, %d palettes",
492
545
  self._device_info["name"],
493
546
  self._device_info["version"],
494
547
  len(segments),
495
- self._device_info["led_count"]
548
+ self._device_info["led_count"],
549
+ len(effects),
550
+ len(palettes),
496
551
  )
497
552
 
498
553
  return self._device_info