boneio 1.3.0.dev3__tar.gz → 1.3.0.dev5__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 (481) hide show
  1. {boneio-1.3.0.dev3/boneio.egg-info → boneio-1.3.0.dev5}/PKG-INFO +2 -2
  2. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/config_helper.py +13 -0
  3. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/canopen.py +7 -1
  4. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/client.py +18 -4
  5. boneio-1.3.0.dev5/boneio/hardware/can/sudoers.py +199 -0
  6. boneio-1.3.0.dev5/boneio/hardware/can/test_od.py +15 -0
  7. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/homeassistant.py +15 -2
  8. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/runner.py +1 -0
  9. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/schema.yaml +12 -0
  10. boneio-1.3.0.dev5/boneio/version.py +2 -0
  11. boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/ConfigEditor-DCabX5qK.js → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/ConfigEditor-BWHZGmYg.js +1 -1
  12. boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/aiWizardPrompt-B5y1tw6O.js → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/aiWizardPrompt-C1vdmyeb.js +1 -1
  13. boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/index-CmBl6pFS.css → boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/index-BZZGqf-N.css +1 -1
  14. boneio-1.3.0.dev5/boneio/webui/frontend-dist/assets/index-DXEKDEyX.js +105 -0
  15. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/index.html +2 -2
  16. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/boneio.schema.json +14 -0
  17. {boneio-1.3.0.dev3/boneio/webui → boneio-1.3.0.dev5/boneio/webui/frontend-dist}/schema/config.schema.json +14 -0
  18. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/sw.js +1 -1
  19. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/can.py +37 -0
  20. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/system.py +257 -4
  21. boneio-1.3.0.dev5/boneio/webui/routes/timezone_sudoers.py +202 -0
  22. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/boneio.schema.json +14 -0
  23. {boneio-1.3.0.dev3/boneio/webui/frontend-dist → boneio-1.3.0.dev5/boneio/webui}/schema/config.schema.json +14 -0
  24. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5/boneio.egg-info}/PKG-INFO +2 -2
  25. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/SOURCES.txt +6 -4
  26. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/requires.txt +1 -1
  27. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/pyproject.toml +1 -1
  28. boneio-1.3.0.dev3/boneio/hardware/can/test_od.py +0 -10
  29. boneio-1.3.0.dev3/boneio/version.py +0 -2
  30. boneio-1.3.0.dev3/boneio/webui/frontend-dist/assets/index-CYk12kJk.js +0 -105
  31. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/LICENSE +0 -0
  32. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/MANIFEST.in +0 -0
  33. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/README.md +0 -0
  34. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/__init__.py +0 -0
  35. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/input.yaml +0 -0
  36. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_24_16.yaml +0 -0
  37. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_32_10.yaml +0 -0
  38. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_32_5.yaml +0 -0
  39. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_cover.yaml +0 -0
  40. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  41. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/input.yaml +0 -0
  42. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_24_16.yaml +0 -0
  43. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_32_10.yaml +0 -0
  44. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_32_5.yaml +0 -0
  45. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_cover.yaml +0 -0
  46. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  47. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/input.yaml +0 -0
  48. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_24_16.yaml +0 -0
  49. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_32_10.yaml +0 -0
  50. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_32_5.yaml +0 -0
  51. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_cover.yaml +0 -0
  52. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  53. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/input.yaml +0 -0
  54. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_24_16.yaml +0 -0
  55. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_32_10.yaml +0 -0
  56. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_cover.yaml +0 -0
  57. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  58. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/input.yaml +0 -0
  59. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_24_16.yaml +0 -0
  60. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_32_10.yaml +0 -0
  61. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_cover.yaml +0 -0
  62. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  63. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/input.yaml +0 -0
  64. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_24_16.yaml +0 -0
  65. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_32_10.yaml +0 -0
  66. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_48_4.yaml +0 -0
  67. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_cover.yaml +0 -0
  68. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  69. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/input.yaml +0 -0
  70. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_24_16.yaml +0 -0
  71. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_32_10.yaml +0 -0
  72. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_48_4.yaml +0 -0
  73. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_cover.yaml +0 -0
  74. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  75. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/bonecli.py +0 -0
  76. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/__init__.py +0 -0
  77. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/__init__.py +0 -0
  78. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/cover.py +0 -0
  79. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/time_based.py +0 -0
  80. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/cover/venetian.py +0 -0
  81. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/group/__init__.py +0 -0
  82. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/group/output_group.py +0 -0
  83. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/__init__.py +0 -0
  84. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/binary_sensor.py +0 -0
  85. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/detectors.py +0 -0
  86. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/input/event.py +0 -0
  87. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/__init__.py +0 -0
  88. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/basic.py +0 -0
  89. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/mcp.py +0 -0
  90. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/pca.py +0 -0
  91. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/output/pcf.py +0 -0
  92. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/sensor/__init__.py +0 -0
  93. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/sensor/virtual_energy.py +0 -0
  94. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/__init__.py +0 -0
  95. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/alarm_panel.py +0 -0
  96. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/gate_cover.py +0 -0
  97. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/components/template/thermostat.py +0 -0
  98. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/const.py +0 -0
  99. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/__init__.py +0 -0
  100. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/__init__.py +0 -0
  101. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/__init__.py +0 -0
  102. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  103. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  104. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  105. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/registration.py +0 -0
  106. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/cloud/secrets.py +0 -0
  107. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/__init__.py +0 -0
  108. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/__init__.py +0 -0
  109. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  110. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/migrations/v2_transition.py +0 -0
  111. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/package-lock.json +0 -0
  112. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/package.json +0 -0
  113. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/schema_converter.py +0 -0
  114. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/config/yaml_util.py +0 -0
  115. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/discovery.py +0 -0
  116. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/events/__init__.py +0 -0
  117. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/events/bus.py +0 -0
  118. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/__init__.py +0 -0
  119. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/covers.py +0 -0
  120. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/display.py +0 -0
  121. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/inputs.py +0 -0
  122. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/manager.py +0 -0
  123. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/modbus.py +0 -0
  124. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/outputs.py +0 -0
  125. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/remote.py +0 -0
  126. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/sensors.py +0 -0
  127. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/__init__.py +0 -0
  128. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/alarm.py +0 -0
  129. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/gate_cover.py +0 -0
  130. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates/thermostat.py +0 -0
  131. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/templates.py +0 -0
  132. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/manager/update.py +0 -0
  133. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/__init__.py +0 -0
  134. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/basic.py +0 -0
  135. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/basic_mqtt.py +0 -0
  136. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/local.py +0 -0
  137. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/mqtt.py +0 -0
  138. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/messaging/queue.py +0 -0
  139. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/__init__.py +0 -0
  140. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/base.py +0 -0
  141. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/can.py +0 -0
  142. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/esphome.py +0 -0
  143. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/mqtt.py +0 -0
  144. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/remote/wled.py +0 -0
  145. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/__init__.py +0 -0
  146. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/base.py +0 -0
  147. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/sensor/system.py +0 -0
  148. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/state/__init__.py +0 -0
  149. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/state/manager.py +0 -0
  150. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/__init__.py +0 -0
  151. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/host_data.py +0 -0
  152. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/system/monitor.py +0 -0
  153. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/__init__.py +0 -0
  154. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/async_updater.py +0 -0
  155. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/conditions.py +0 -0
  156. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/filter.py +0 -0
  157. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/font_util.py +0 -0
  158. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/logger.py +0 -0
  159. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/timeperiod.py +0 -0
  160. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/core/utils/util.py +0 -0
  161. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/adc.yaml +0 -0
  162. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  163. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/config.yaml +0 -0
  164. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/event.yaml +0 -0
  165. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/mqtt.yaml +0 -0
  166. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  167. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/adc.yaml +0 -0
  168. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  169. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/config.yaml +0 -0
  170. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/event.yaml +0 -0
  171. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/mqtt.yaml +0 -0
  172. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  173. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/adc.yaml +0 -0
  174. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  175. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/config.yaml +0 -0
  176. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/event.yaml +0 -0
  177. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/mqtt.yaml +0 -0
  178. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  179. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/__init__.py +0 -0
  180. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/can_master.yaml +0 -0
  181. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/can_slave.yaml +0 -0
  182. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/adc.yaml +0 -0
  183. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  184. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/config.yaml +0 -0
  185. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/cover.yaml +0 -0
  186. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/event.yaml +0 -0
  187. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/mqtt.yaml +0 -0
  188. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover/outputCover.yaml +0 -0
  189. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/adc.yaml +0 -0
  190. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  191. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/config.yaml +0 -0
  192. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/cover.yaml +0 -0
  193. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/event.yaml +0 -0
  194. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  195. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  196. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/adc.yaml +0 -0
  197. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  198. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  199. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  200. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  201. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/event_all.yaml +0 -0
  202. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  203. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  204. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  205. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  206. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  207. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  208. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/exceptions.py +0 -0
  209. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/__init__.py +0 -0
  210. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/analog/__init__.py +0 -0
  211. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/analog/adc.py +0 -0
  212. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/__init__.py +0 -0
  213. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/bridge.py +0 -0
  214. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/interface.py +0 -0
  215. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/node.py +0 -0
  216. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/can/node_id.py +0 -0
  217. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/__init__.py +0 -0
  218. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  219. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/display/oled.py +0 -0
  220. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/__init__.py +0 -0
  221. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  222. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  223. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  224. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  225. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/__init__.py +0 -0
  226. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/base.py +0 -0
  227. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/gpio/input/manager.py +0 -0
  228. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/__init__.py +0 -0
  229. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/bus.py +0 -0
  230. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/ina219.py +0 -0
  231. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/ina219_driver.py +0 -0
  232. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/mcp9808.py +0 -0
  233. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/i2c/pct2075.py +0 -0
  234. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/__init__.py +0 -0
  235. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/bus.py +0 -0
  236. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/dallas.py +0 -0
  237. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/onewire/ds2482.py +0 -0
  238. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/__init__.py +0 -0
  239. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  240. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/base.py +0 -0
  241. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  242. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  243. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/__init__.py +0 -0
  244. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/integration/interlock.py +0 -0
  245. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/__init__.py +0 -0
  246. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/cli.py +0 -0
  247. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/client.py +0 -0
  248. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/coordinator.py +0 -0
  249. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/__init__.py +0 -0
  250. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  251. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  252. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  253. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  254. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  255. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  256. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  257. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  258. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  259. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/inverters/sofar.json +0 -0
  260. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/inverters/thessla.json +0 -0
  261. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  262. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  263. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/other/wanas415.json +0 -0
  264. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  265. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/cwt.json +0 -0
  266. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  267. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  268. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  269. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  270. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  271. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/pt100.json +0 -0
  272. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/sht20.json +0 -0
  273. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/devices/sensors/sht30.json +0 -0
  274. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/__init__.py +0 -0
  275. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/base.py +0 -0
  276. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/__init__.py +0 -0
  277. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/numeric.py +0 -0
  278. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/select.py +0 -0
  279. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/switch.py +0 -0
  280. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/derived/text.py +0 -0
  281. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/__init__.py +0 -0
  282. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/binary.py +0 -0
  283. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/numeric.py +0 -0
  284. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/sensor/text.py +0 -0
  285. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/__init__.py +0 -0
  286. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/binary.py +0 -0
  287. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/entities/writeable/numeric.py +0 -0
  288. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/modbus/utils.py +0 -0
  289. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/__init__.py +0 -0
  290. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/actions.py +0 -0
  291. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/events.py +0 -0
  292. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/files.py +0 -0
  293. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/logs.py +0 -0
  294. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/mqtt.py +0 -0
  295. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/models/state.py +0 -0
  296. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions.yaml +0 -0
  297. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions_sensor.yaml +0 -0
  298. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/actions_switch.yaml +0 -0
  299. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/condition.yaml +0 -0
  300. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/filters.yaml +0 -0
  301. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/filters_adc.yaml +0 -0
  302. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/id.yaml +0 -0
  303. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/remote_devices.yaml +0 -0
  304. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/temp_unit.yaml +0 -0
  305. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/schema/update_interval.yaml +0 -0
  306. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/action_validation.py +0 -0
  307. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/app.py +0 -0
  308. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/abap-CRCWOmpq.js +0 -0
  309. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/apex-DnsZk_dE.js +0 -0
  310. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/azcli-1IWB1ccx.js +0 -0
  311. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/bat-DPkNLes8.js +0 -0
  312. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/bicep-Corcdgou.js +0 -0
  313. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cameligo-CGrWLZr3.js +0 -0
  314. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/clojure-D9WOWImG.js +0 -0
  315. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  316. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/coffee-B7EJu28W.js +0 -0
  317. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cpp-SEyurbux.js +0 -0
  318. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/csharp-BoL64M5l.js +0 -0
  319. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/csp-C46ZqvIl.js +0 -0
  320. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/css-DQU6DXDx.js +0 -0
  321. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cssMode-DShylJqh.js +0 -0
  322. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/cypher-D84EuPTj.js +0 -0
  323. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/dart-D8lhlL1r.js +0 -0
  324. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/dockerfile-DLk6rpji.js +0 -0
  325. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ecl-BO6FnfXk.js +0 -0
  326. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +0 -0
  327. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/elixir-BRjLKONM.js +0 -0
  328. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/flow9-Cac8vKd7.js +0 -0
  329. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/freemarker2-CdX7KyE5.js +0 -0
  330. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/fsharp-fd1GTHhf.js +0 -0
  331. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/go-O9LJTZXk.js +0 -0
  332. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/graphql-LQdxqEYJ.js +0 -0
  333. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/handlebars-C3LDizRo.js +0 -0
  334. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/hcl-DxDQ3s82.js +0 -0
  335. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/html-z-YV0Mzh.js +0 -0
  336. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/htmlMode-D7IIR2va.js +0 -0
  337. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ini-BvajGCUy.js +0 -0
  338. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/java-SYsfObOQ.js +0 -0
  339. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/javascript-CH6jkTQ0.js +0 -0
  340. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/json.worker-aFakAbRR.js +0 -0
  341. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/jsonMode-CLzeI5HJ.js +0 -0
  342. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/julia-DQXNmw_w.js +0 -0
  343. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/kotlin-qQ0MG-9I.js +0 -0
  344. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/less-GGFNNJHn.js +0 -0
  345. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/lexon-Canl7DCW.js +0 -0
  346. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/liquid-DuoI_Tv0.js +0 -0
  347. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/lua-D28Ae8-K.js +0 -0
  348. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/m3-DPitgjJI.js +0 -0
  349. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/markdown-B811l8j2.js +0 -0
  350. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mdx-C2KSoPE6.js +0 -0
  351. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mips-CdjsipkG.js +0 -0
  352. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/monaco-DVn9mNSL.js +0 -0
  353. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/monaco-xnhJeWAr.css +0 -0
  354. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/msdax-CYqgjx_P.js +0 -0
  355. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/mysql-BHd6q0vd.js +0 -0
  356. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/objective-c-B1aVtJYH.js +0 -0
  357. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pascal-BhNW15KB.js +0 -0
  358. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pascaligo-5jv8CcQD.js +0 -0
  359. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/perl-DlYyT36c.js +0 -0
  360. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pgsql-Dy0bjov7.js +0 -0
  361. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/php-120yhfDK.js +0 -0
  362. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pla-CjnFlu4u.js +0 -0
  363. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/postiats-CQpG440k.js +0 -0
  364. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/powerquery-DdJtto1Z.js +0 -0
  365. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/powershell-Bu_VLpJB.js +0 -0
  366. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/protobuf-IBS6jZEB.js +0 -0
  367. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/pug-kFxLfcjb.js +0 -0
  368. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/python-Dh7Kzq6D.js +0 -0
  369. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/qsharp-q7JyzKFN.js +0 -0
  370. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/r-BIFz-_sK.js +0 -0
  371. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/razor-CJwYmOfy.js +0 -0
  372. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/redis-CHOsPHWR.js +0 -0
  373. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/redshift-CBifECDb.js +0 -0
  374. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/restructuredtext-CghPJEOS.js +0 -0
  375. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/ruby-CYWGW-b1.js +0 -0
  376. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/rust-DMDD0SHb.js +0 -0
  377. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sb-BYAiYHFx.js +0 -0
  378. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scala-Bqvq8jcR.js +0 -0
  379. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scheme-Dhb-2j9p.js +0 -0
  380. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/scss-CTwUZ5N7.js +0 -0
  381. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/shell-CsDZo4DB.js +0 -0
  382. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/solidity-CME5AdoB.js +0 -0
  383. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sophia-RYC1BQQz.js +0 -0
  384. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sparql-KEyrF7De.js +0 -0
  385. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/sql-BdTr02Mf.js +0 -0
  386. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/st-C7iG7M4S.js +0 -0
  387. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/swift-D7IUmUK8.js +0 -0
  388. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/systemverilog-DgMryOEJ.js +0 -0
  389. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/tcl-PloMZuKG.js +0 -0
  390. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/tsMode-VSMpyycN.js +0 -0
  391. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/twig-BfRIq3la.js +0 -0
  392. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/typescript-C4HjhnfC.js +0 -0
  393. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/typespec-CzxlYoT_.js +0 -0
  394. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/vb-BwAE3J76.js +0 -0
  395. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/vendor-8TE4Uyqi.js +0 -0
  396. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/wgsl-B_1kOXbF.js +0 -0
  397. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +0 -0
  398. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/xml-ByUHJiRO.js +0 -0
  399. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/yaml-CTy8Ej0Q.js +0 -0
  400. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/assets/yaml.worker-DBeHcBRc.js +0 -0
  401. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  402. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  403. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio.svg +0 -0
  404. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  405. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  406. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  407. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  408. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  409. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  410. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  411. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  412. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  413. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  414. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  415. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  416. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  417. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  418. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  419. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  420. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  421. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  422. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  423. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  424. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  425. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  426. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  427. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  428. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  429. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  430. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  431. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/frontend-dist/workbox-226dbdbf.js +0 -0
  432. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/middleware/__init__.py +0 -0
  433. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/middleware/auth.py +0 -0
  434. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/__init__.py +0 -0
  435. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/auth.py +0 -0
  436. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/caddy.py +0 -0
  437. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/config.py +0 -0
  438. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/covers.py +0 -0
  439. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/modbus.py +0 -0
  440. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/outputs.py +0 -0
  441. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/remote_devices.py +0 -0
  442. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/sensors.py +0 -0
  443. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/templates.py +0 -0
  444. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/tools.py +0 -0
  445. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/routes/update.py +0 -0
  446. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/adc.schema.json +0 -0
  447. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/areas.schema.json +0 -0
  448. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  449. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/can.schema.json +0 -0
  450. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/cover.schema.json +0 -0
  451. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/dallas.schema.json +0 -0
  452. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/ds2482.schema.json +0 -0
  453. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/event.schema.json +0 -0
  454. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/ina219.schema.json +0 -0
  455. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/lm75.schema.json +0 -0
  456. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/logger.schema.json +0 -0
  457. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mcp23017.schema.json +0 -0
  458. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mcp9808.schema.json +0 -0
  459. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/modbus.schema.json +0 -0
  460. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  461. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/mqtt.schema.json +0 -0
  462. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/oled.schema.json +0 -0
  463. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/output.schema.json +0 -0
  464. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/output_group.schema.json +0 -0
  465. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/pca9685.schema.json +0 -0
  466. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/pcf8575.schema.json +0 -0
  467. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/remote_devices.schema.json +0 -0
  468. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/sensor.schema.json +0 -0
  469. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/template.schema.json +0 -0
  470. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  471. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/schema/web.schema.json +0 -0
  472. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/services/__init__.py +0 -0
  473. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/services/logs.py +0 -0
  474. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/web_server.py +0 -0
  475. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio/webui/websocket_manager.py +0 -0
  476. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/dependency_links.txt +0 -0
  477. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/entry_points.txt +0 -0
  478. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/boneio.egg-info/top_level.txt +0 -0
  479. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/setup.cfg +0 -0
  480. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/setup.py +0 -0
  481. {boneio-1.3.0.dev3 → boneio-1.3.0.dev5}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.3.0.dev3
3
+ Version: 1.3.0.dev5
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
@@ -35,7 +35,7 @@ Requires-Dist: requests==2.32.5
35
35
  Requires-Dist: packaging==25.0
36
36
  Requires-Dist: aioesphomeapi>=29.0.0
37
37
  Requires-Dist: zeroconf>=0.148.0
38
- Requires-Dist: canopen-asyncio>=2.3.0
38
+ Requires-Dist: canopen-asyncio>=2.4.1
39
39
  Dynamic: license-file
40
40
 
41
41
  Example usage:
@@ -51,6 +51,7 @@ class ConfigHelper:
51
51
  cloud_registration: bool = False,
52
52
  pwa_name: str | None = None,
53
53
  ha_child_devices: bool = False,
54
+ ha_child_devices_naming: str = "default",
54
55
  ):
55
56
  self._name = name
56
57
 
@@ -83,6 +84,7 @@ class ConfigHelper:
83
84
  self._update_channel = update_channel
84
85
  self._cloud_registration = cloud_registration
85
86
  self._ha_child_devices = ha_child_devices
87
+ self._ha_child_devices_naming = ha_child_devices_naming
86
88
  self._device_type = device_type
87
89
  self._web_port = web_port
88
90
  self._proxy_port = proxy_port
@@ -236,6 +238,17 @@ class ConfigHelper:
236
238
  """
237
239
  return self._ha_child_devices
238
240
 
241
+ @property
242
+ def ha_child_devices_naming(self) -> str:
243
+ """Get the naming style for HA child devices.
244
+
245
+ Returns:
246
+ 'default' — entity name only (e.g. "OUT 17")
247
+ 'device_name' — "{device_name} - {name}" (e.g. "boneIO Black - OUT 17")
248
+ 'device_name_area' — "{device_name} - {area} - {name}" (e.g. "boneIO Black - Gabinet - OUT 17")
249
+ """
250
+ return self._ha_child_devices_naming
251
+
239
252
  @property
240
253
  def device_type(self) -> str:
241
254
  return self._device_type
@@ -111,7 +111,13 @@ class CANopenManager:
111
111
  True if started successfully.
112
112
  """
113
113
  if not self.is_enabled:
114
- _LOGGER.info("CANopen is disabled or not available")
114
+ if not self._enabled:
115
+ _LOGGER.info("CANopen is disabled in configuration (enabled: false)")
116
+ elif not CANOPEN_AVAILABLE:
117
+ _LOGGER.warning(
118
+ "CANopen is enabled in configuration but canopen library is not installed. "
119
+ "Install with: pip install canopen-asyncio"
120
+ )
115
121
  return False
116
122
 
117
123
  if self._running:
@@ -12,15 +12,27 @@ from types import ModuleType
12
12
  from typing import TYPE_CHECKING, Callable
13
13
 
14
14
  if TYPE_CHECKING:
15
- from canopen import Network, LocalNode
15
+ try:
16
+ from canopen import Network, LocalNode
17
+ except ImportError:
18
+ from canopen_asyncio import Network, LocalNode # type: ignore[assignment]
16
19
 
17
20
  try:
18
21
  import canopen
19
22
 
20
23
  CANOPEN_AVAILABLE = True
21
24
  except ImportError:
22
- CANOPEN_AVAILABLE = False
23
- canopen: ModuleType = None # type: ignore[assignment]
25
+ try:
26
+ import canopen_asyncio as canopen # type: ignore[no-redef]
27
+
28
+ CANOPEN_AVAILABLE = True
29
+ except ImportError as _import_err:
30
+ CANOPEN_AVAILABLE = False
31
+ canopen: ModuleType = None # type: ignore[assignment]
32
+ logging.getLogger(__name__).warning(
33
+ "canopen module not available: %s. Install with: pip install canopen-asyncio",
34
+ _import_err,
35
+ )
24
36
 
25
37
  _LOGGER = logging.getLogger(__name__)
26
38
 
@@ -330,7 +342,9 @@ class CANopenClient:
330
342
 
331
343
  def _create_object_dictionary(self):
332
344
  """Create minimal Object Dictionary for SDO operations."""
333
- from canopen.objectdictionary import ObjectDictionary, Variable
345
+ # Use module-level canopen (may be aliased from canopen_asyncio)
346
+ ObjectDictionary = canopen.objectdictionary.ObjectDictionary
347
+ Variable = canopen.objectdictionary.Variable
334
348
 
335
349
  od = ObjectDictionary()
336
350
 
@@ -0,0 +1,199 @@
1
+ """CAN interface sudoers management for boneIO.
2
+
3
+ Provides functions to check and fix sudoers configuration
4
+ for CAN interface management commands (ip link set).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ import logging
11
+ import os
12
+
13
+ _LOGGER = logging.getLogger(__name__)
14
+
15
+ # Sudoers file path for CAN interface
16
+ SUDOERS_FILE = "/etc/sudoers.d/boneio-can"
17
+
18
+ # Expected sudoers content template
19
+ # {user} will be replaced with the current system user
20
+ SUDOERS_TEMPLATE = """{user} ALL=(ALL) NOPASSWD: /sbin/ip link set can0 *
21
+ {user} ALL=(ALL) NOPASSWD: /sbin/ip link set can1 *
22
+ """
23
+
24
+
25
+ def get_sudoers_content(user: str | None = None) -> str:
26
+ """Generate expected sudoers file content.
27
+
28
+ Args:
29
+ user: System user name. Defaults to current user or 'boneio'.
30
+
31
+ Returns:
32
+ Sudoers file content string.
33
+ """
34
+ if user is None:
35
+ user = os.environ.get("USER", "boneio")
36
+ return SUDOERS_TEMPLATE.format(user=user)
37
+
38
+
39
+ async def check_sudo_nopasswd_for_ip() -> dict:
40
+ """Check if sudo NOPASSWD is configured for 'ip link set can*'.
41
+
42
+ Uses 'sudo -n -l' to list allowed commands and verifies that
43
+ '/sbin/ip link set can0' is permitted without a password.
44
+ This avoids false positives from cached sudo credentials.
45
+
46
+ Returns:
47
+ Dictionary with:
48
+ - needs_password: bool — True if NOPASSWD rule is missing
49
+ - sudoers_file_exists: bool — True if /etc/sudoers.d/boneio-can exists
50
+ - error: str | None — error message if check failed
51
+ """
52
+ result = {
53
+ "needs_password": True,
54
+ "sudoers_file_exists": os.path.exists(SUDOERS_FILE),
55
+ "error": None,
56
+ }
57
+
58
+ try:
59
+ # Use 'sudo -n -l' to list what the user can run without a password.
60
+ # This is the correct way to check NOPASSWD rules — it doesn't
61
+ # execute anything and is not affected by cached sudo credentials.
62
+ proc = await asyncio.create_subprocess_exec(
63
+ "sudo", "-n", "-l",
64
+ stdout=asyncio.subprocess.PIPE,
65
+ stderr=asyncio.subprocess.PIPE,
66
+ )
67
+ stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=5)
68
+
69
+ if proc.returncode != 0:
70
+ stderr_str = stderr.decode().strip()
71
+ if "password is required" in stderr_str or "a terminal is required" in stderr_str:
72
+ result["needs_password"] = True
73
+ result["error"] = "sudo requires a password to list allowed commands"
74
+ else:
75
+ result["error"] = stderr_str
76
+ return result
77
+
78
+ # Parse the output to find NOPASSWD rules for /sbin/ip link set can*
79
+ sudo_list = stdout.decode()
80
+ # Look for line containing '/sbin/ip link set can0' (with NOPASSWD)
81
+ # sudo -l output format: (ALL) NOPASSWD: /sbin/ip link set can0 *
82
+ has_can0 = any(
83
+ "/sbin/ip link set can0" in line
84
+ for line in sudo_list.splitlines()
85
+ if "NOPASSWD" in line
86
+ )
87
+
88
+ if has_can0:
89
+ result["needs_password"] = False
90
+ else:
91
+ result["needs_password"] = True
92
+ result["error"] = (
93
+ "No NOPASSWD rule found for '/sbin/ip link set can0'. "
94
+ "CAN interface auto-setup will fail."
95
+ )
96
+
97
+ except asyncio.TimeoutError:
98
+ result["error"] = "sudo check timed out"
99
+ except FileNotFoundError:
100
+ result["error"] = "sudo command not found"
101
+ except Exception as e:
102
+ result["error"] = str(e)
103
+
104
+ return result
105
+
106
+
107
+ async def create_sudoers_file(password: str) -> dict:
108
+ """Create /etc/sudoers.d/boneio-can with NOPASSWD rules for CAN interface.
109
+
110
+ Uses sudo with the provided password to write the sudoers file.
111
+
112
+ Args:
113
+ password: User's sudo password.
114
+
115
+ Returns:
116
+ Dictionary with status and message.
117
+ """
118
+ user = os.environ.get("USER", "boneio")
119
+ content = get_sudoers_content(user)
120
+
121
+ try:
122
+ # Write content to a temp file first, then move it with sudo
123
+ # This is safer than piping directly to sudoers
124
+ tmp_path = f"/tmp/boneio-can-sudoers-{os.getpid()}"
125
+
126
+ with open(tmp_path, "w") as f:
127
+ f.write(content)
128
+
129
+ # Validate the sudoers file before installing
130
+ validate_cmd = ["sudo", "-S", "visudo", "-c", "-f", tmp_path]
131
+ proc = await asyncio.create_subprocess_exec(
132
+ *validate_cmd,
133
+ stdin=asyncio.subprocess.PIPE,
134
+ stdout=asyncio.subprocess.PIPE,
135
+ stderr=asyncio.subprocess.PIPE,
136
+ )
137
+ stdout, stderr = await asyncio.wait_for(
138
+ proc.communicate(input=(password + "\n").encode()),
139
+ timeout=10,
140
+ )
141
+
142
+ if proc.returncode != 0:
143
+ stderr_str = stderr.decode().strip()
144
+ os.unlink(tmp_path)
145
+ if "incorrect password" in stderr_str.lower() or "sorry" in stderr_str.lower():
146
+ return {"status": "error", "message": "Incorrect sudo password"}
147
+ return {"status": "error", "message": f"Sudoers validation failed: {stderr_str}"}
148
+
149
+ # Copy the validated file to /etc/sudoers.d/ and set correct permissions
150
+ install_cmd = ["sudo", "-S", "cp", tmp_path, SUDOERS_FILE]
151
+ proc = await asyncio.create_subprocess_exec(
152
+ *install_cmd,
153
+ stdin=asyncio.subprocess.PIPE,
154
+ stdout=asyncio.subprocess.PIPE,
155
+ stderr=asyncio.subprocess.PIPE,
156
+ )
157
+ _, stderr = await asyncio.wait_for(
158
+ proc.communicate(input=(password + "\n").encode()),
159
+ timeout=10,
160
+ )
161
+
162
+ if proc.returncode != 0:
163
+ stderr_str = stderr.decode().strip()
164
+ os.unlink(tmp_path)
165
+ if "incorrect password" in stderr_str.lower() or "sorry" in stderr_str.lower():
166
+ return {"status": "error", "message": "Incorrect sudo password"}
167
+ return {"status": "error", "message": f"Failed to install sudoers file: {stderr_str}"}
168
+
169
+ # Set correct permissions (must be 0440)
170
+ chmod_cmd = ["sudo", "-S", "chmod", "0440", SUDOERS_FILE]
171
+ proc = await asyncio.create_subprocess_exec(
172
+ *chmod_cmd,
173
+ stdin=asyncio.subprocess.PIPE,
174
+ stdout=asyncio.subprocess.PIPE,
175
+ stderr=asyncio.subprocess.PIPE,
176
+ )
177
+ await asyncio.wait_for(
178
+ proc.communicate(input=(password + "\n").encode()),
179
+ timeout=10,
180
+ )
181
+
182
+ # Clean up temp file
183
+ try:
184
+ os.unlink(tmp_path)
185
+ except OSError:
186
+ pass
187
+
188
+ _LOGGER.info("Successfully created sudoers file for CAN interface: %s", SUDOERS_FILE)
189
+ return {
190
+ "status": "success",
191
+ "message": f"Sudoers file created at {SUDOERS_FILE}",
192
+ "content": content,
193
+ }
194
+
195
+ except asyncio.TimeoutError:
196
+ return {"status": "error", "message": "sudo command timed out"}
197
+ except Exception as e:
198
+ _LOGGER.error("Failed to create CAN sudoers file: %s", e)
199
+ return {"status": "error", "message": str(e)}
@@ -0,0 +1,15 @@
1
+ try:
2
+ import canopen
3
+ except ImportError:
4
+ import canopen_asyncio as canopen # type: ignore[no-redef]
5
+
6
+ ObjectDictionary = canopen.objectdictionary.ObjectDictionary
7
+ Variable = canopen.objectdictionary.Variable
8
+
9
+ od = ObjectDictionary()
10
+ var_node = Variable("Node ID", 0x2000, 0)
11
+ var_node.data_type = 5 # UNSIGNED8
12
+ var_node.access_type = "rw"
13
+ od.add_object(var_node)
14
+
15
+ print(od[0x2000].name)
@@ -79,7 +79,10 @@ def ha_availabilty_message(
79
79
  topic = config_helper.topic_prefix if topic is None else topic
80
80
  device_name = config_helper.name if device_name is None else device_name
81
81
  model = f"boneIO Black {config_helper.device_type.title().replace('X', 'x')}"
82
- if config_helper.is_web_active and config_helper.network_info and IP in config_helper.network_info:
82
+ if config_helper.cloud_registration and config_helper.serial_number:
83
+ # PWA-registered device: use the public PWA domain with TLS
84
+ web_url = f"https://{config_helper.serial_number}.black.boneio.app:8443"
85
+ elif config_helper.is_web_active and config_helper.network_info and IP in config_helper.network_info:
83
86
  web_url = f"{config_helper.http_proto}://{config_helper.network_info[IP]}:{config_helper.web_configuration_port}"
84
87
 
85
88
  web_url_dict = {
@@ -101,7 +104,17 @@ def ha_availabilty_message(
101
104
  _CHILD_DEVICE_TYPES = {OUTPUT, INPUT, COVER, "group", ADC}
102
105
 
103
106
  if config_helper.ha_child_devices and device_type in _CHILD_DEVICE_TYPES:
104
- child_device_name = name # e.g., "OUT 01"
107
+ # Build child device name based on naming style
108
+ naming = config_helper.ha_child_devices_naming
109
+ if naming == "device_name_area" and area_name:
110
+ child_device_name = f"{device_name} - {area_name} - {name}"
111
+ elif naming == "device_name_area" or naming == "device_name":
112
+ # device_name_area without area falls back to device_name style
113
+ child_device_name = f"{device_name} - {name}"
114
+ else:
115
+ # 'default' — entity name only (e.g. "OUT 17")
116
+ child_device_name = name
117
+
105
118
  child_identifier = f"{topic}_{device_type}_{id}"
106
119
  device_info = {
107
120
  "identifiers": [child_identifier],
@@ -186,6 +186,7 @@ async def async_run(
186
186
  cloud_registration=web_config.get("cloud", {}).get("enabled", False),
187
187
  pwa_name=web_config.get("cloud", {}).get("pwa_name"),
188
188
  ha_child_devices=main_config.get("ha_child_devices", False),
189
+ ha_child_devices_naming=main_config.get("ha_child_devices_naming", "default"),
189
190
  )
190
191
 
191
192
  # Load areas configuration
@@ -1746,3 +1746,15 @@ boneio:
1746
1746
  This allows HA to auto-generate dashboards per area.
1747
1747
  Entity names become empty so HA uses the device name directly.
1748
1748
  WARNING: Experimental feature — may change or be removed in future versions.
1749
+ ha_child_devices_naming:
1750
+ type: string
1751
+ required: False
1752
+ default: 'default'
1753
+ allowed: ['default', 'device_name', 'device_name_area']
1754
+ meta:
1755
+ label: "Child device naming style"
1756
+ description: |
1757
+ Controls how child device names are constructed when ha_child_devices is enabled.
1758
+ - default: Entity name only (e.g., "OUT 17"). May cause duplicates if multiple boneIO devices share output names.
1759
+ - device_name: Adds boneIO device name prefix (e.g., "boneIO Black - OUT 17").
1760
+ - device_name_area: Adds device name and area (e.g., "boneIO Black - Living Room - OUT 17"). Falls back to device_name if no area is assigned.
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.3.0dev5"
@@ -1 +1 @@
1
- import{G as W,u as _,j as e,a as f,F as $,b as B,c as L,d as H,e as z}from"./index-CYk12kJk.js";import{a as c,F as A,c as D,l as Z,m as P}from"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function U(){const[r,i]=c.useState("dark");return c.useEffect(()=>{const a=localStorage.getItem("theme")||"dark";i(a);const g=new MutationObserver(m=>{m.forEach(o=>{if(o.attributeName==="data-theme"){const h=document.documentElement.getAttribute("data-theme")||"dark";i(h)}})});return g.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>g.disconnect()},[]),r}function G(r){return W({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{d:"M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z"},child:[]},{tag:"path",attr:{d:"M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z"},child:[]}]})(r)}function K({isOpen:r,onClose:i}){const{t:a}=_(),[g,m]=c.useState(!1),[o,h]=c.useState(null),p=async()=>{m(!0);try{const l=await f.get("/api/check_configuration");h({status:l.data.status,message:l.data.message})}catch{h({status:"error",message:a("config_check.failed")})}finally{m(!1)}};return r?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4",children:[e.jsx("h2",{className:"text-2xl font-bold mb-6",children:a("config_check.title")}),g?e.jsxs("div",{className:"flex flex-col items-center gap-4 py-8",children:[e.jsx("div",{className:"loading loading-spinner loading-lg"}),e.jsx("p",{className:"text-lg",children:a("config_check.checking")})]}):o?e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:`text-lg font-semibold ${o.status==="success"?"text-success":"text-error"}`,children:o.status==="success"?a("config_check.valid"):a("config_check.error")}),o.message&&e.jsx("pre",{className:"bg-base-300 p-4 rounded-lg whitespace-pre-wrap",children:o.message}),e.jsxs("div",{className:"flex justify-end gap-4 mt-6",children:[e.jsx("button",{className:"btn btn-ghost",onClick:()=>{h(null),i()},children:a("common.close")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>{h(null),p()},children:a("config_check.check_again")})]})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("p",{className:"text-base-content/70",children:a("config_check.description")}),e.jsxs("div",{className:"flex justify-end gap-4",children:[e.jsx("button",{className:"btn btn-ghost",onClick:i,children:a("common.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:p,children:a("config_check.check_button")})]})]})]})}):null}function q(r){return new Worker("/assets/editor.worker-B4pQIWZD.js",{name:r?.name})}function V(r){return new Worker("/assets/json.worker-aFakAbRR.js",{name:r?.name})}function Y(r){return new Worker("/assets/yaml.worker-DBeHcBRc.js",{name:r?.name})}self.MonacoEnvironment={getWorker(r,i){return i==="yaml"?new Y:i==="json"?new V:new q}};Z.config({monaco:P});let N;function ee(){const[r,i]=c.useState([]),[a,g]=c.useState(null),[m,o]=c.useState(""),[h,p]=c.useState(!1),[l,b]=c.useState("waiting"),[x,C]=c.useState(!0),[S,j]=c.useState(!1),F=U(),w=async()=>{try{const s=await f.get("/api/files");i(s.data.items)}catch(t){console.error("Error loading directory:",t)}},v=async t=>{try{const s=`/api/files/${encodeURIComponent(t)}`,n=await f.get(s);g(t),o(n.data.content),localStorage.setItem("lastOpenedFile",t)}catch(s){console.error("Error loading file:",s)}},y=async()=>{if(a)try{await f.put(`/api/files/${encodeURIComponent(a)}`,{content:m}),console.log("File saved successfully")}catch(t){console.error("Error saving file:",t)}},R=async t=>{if(!N){const n=(await f.get("/schema/config.schema.json")).data;N=await D(t,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+"/schema/config.schema.json",fileMatch:["config.yaml","config.yml"],schema:n},...Object.keys(n.properties).map(d=>({uri:window.location.origin+`/schema/${d}.schema.json`,fileMatch:[`${d}.yaml`,`${d}.yml`],schema:n.properties[d]}))],validate:!0})}},E=async(t,s)=>{t.addCommand(s.KeyMod.CtrlCmd|s.KeyCode.KeyS,()=>{y()})},O=t=>{i(s=>{const n=d=>d.map(u=>u.path===t?{...u,isOpen:!u.isOpen}:u.children?{...u,children:n(u.children)}:u);return n(s)})},k=(t,s=0)=>t.map(n=>{const d=s==0||n.isOpen;return e.jsxs("div",{children:[e.jsxs("button",{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${a===n.path?"bg-primary/10":""}`,style:{paddingLeft:`${s*16+8}px`},onClick:()=>n.type==="file"?v(n.path):O(n.path),children:[n.type==="directory"&&e.jsx("span",{className:"text-xs",children:d?e.jsx($,{}):e.jsx(B,{})}),e.jsx("span",{className:"text-base-content/70",children:n.type==="directory"?d?e.jsx(L,{}):e.jsx(H,{}):e.jsx(z,{})}),e.jsx("span",{className:"text-sm truncate",children:n.name})]}),n.type==="directory"&&d&&n.children&&k(n.children,s+1)]},n.path)}),M=async()=>{try{return await f.get("/api/files"),!0}catch{return!1}},T=async()=>{for(p(!0),b("waiting"),await new Promise(t=>setTimeout(t,2e3)),b("checking");;){if(await M()){b("ready"),await new Promise(s=>setTimeout(s,1e3)),p(!1),w();break}await new Promise(s=>setTimeout(s,1e3))}},I=()=>h?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg text-center",children:[e.jsx("div",{className:"loading loading-spinner loading-lg mb-4"}),e.jsxs("h2",{className:"text-xl font-bold mb-4",children:[l==="waiting"&&"Restarting Service...",l==="checking"&&"Waiting for Service...",l==="ready"&&"Service Restarted!"]}),e.jsxs("p",{className:"text-base-content/70",children:[l==="waiting"&&"Initiating service restart",l==="checking"&&"Checking if service is back online",l==="ready"&&"Redirecting..."]})]})}):null;return c.useEffect(()=>{(async()=>{await w();const s=localStorage.getItem("lastOpenedFile");s&&v(s)})()},[]),e.jsxs("div",{className:"flex h-full bg-base-300",children:[I(),e.jsxs("div",{className:`${x?"w-64":"w-0"} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[e.jsx("div",{className:"p-2 text-sm font-semibold text-base-content/70 uppercase",children:"Explorer"}),e.jsx("div",{className:"overflow-y-auto",children:k(r)})]}),e.jsxs("div",{className:"flex-1 overflow-hidden flex flex-col h-full max-h-screen",children:[e.jsxs("div",{className:"flex items-center p-2 border-b border-base-content/10",children:[e.jsx("button",{onClick:()=>C(!x),className:"btn btn-ghost btn-sm p-1",title:x?"Hide file tree":"Show file tree",children:e.jsx(G,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${x?"":"rotate-180"}`})}),a&&e.jsx("span",{className:"ml-2 text-sm opacity-70",children:a})]}),e.jsx("div",{className:"flex-1 overflow-hidden",children:e.jsx(A,{height:"100%",width:"100%",defaultLanguage:"yaml",path:a||"config.yaml",theme:F==="light"?"vs-light":"vs-dark",value:m,onChange:t=>o(t||""),onMount:E,beforeMount:R,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),e.jsxs("div",{className:"h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4",children:[e.jsx("button",{onClick:y,disabled:!a,className:"btn btn-primary btn-sm",children:"Save"}),e.jsx("button",{onClick:()=>j(!0),className:"btn btn-primary btn-sm",children:"Check Config"}),e.jsx("button",{onClick:async()=>{await y();try{if((await f.post("/api/restart")).data.status==="not available"){const s=document.getElementById("toast");s&&(s.classList.remove("hidden"),setTimeout(()=>{s.classList.add("hidden")},5e3))}else console.log("Service restarted successfully"),T()}catch(t){console.error("Error restarting service:",t)}},disabled:!a,className:"btn btn-secondary btn-sm",children:"Save and Restart"})]})]}),e.jsx("div",{id:"toast",className:"toast toast-end hidden",children:e.jsx("div",{className:"alert alert-warning",children:e.jsx("span",{children:"Restart not possible. Application is not running as systemd service. Restart manually."})})}),e.jsx(K,{isOpen:S,onClose:()=>j(!1)})]})}export{ee as default};
1
+ import{G as W,u as _,j as e,a as f,F as $,b as B,c as L,d as H,e as z}from"./index-DXEKDEyX.js";import{a as c,F as A,c as D,l as Z,m as P}from"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function U(){const[r,i]=c.useState("dark");return c.useEffect(()=>{const a=localStorage.getItem("theme")||"dark";i(a);const g=new MutationObserver(m=>{m.forEach(o=>{if(o.attributeName==="data-theme"){const h=document.documentElement.getAttribute("data-theme")||"dark";i(h)}})});return g.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>g.disconnect()},[]),r}function G(r){return W({attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{d:"M11.28 9.53 8.81 12l2.47 2.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-3-3a.75.75 0 0 1 0-1.06l3-3a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734Z"},child:[]},{tag:"path",attr:{d:"M3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25V3.75C2 2.784 2.784 2 3.75 2ZM3.5 3.75v16.5c0 .138.112.25.25.25H15v-17H3.75a.25.25 0 0 0-.25.25Zm13 16.75h3.75a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25H16.5Z"},child:[]}]})(r)}function K({isOpen:r,onClose:i}){const{t:a}=_(),[g,m]=c.useState(!1),[o,h]=c.useState(null),p=async()=>{m(!0);try{const l=await f.get("/api/check_configuration");h({status:l.data.status,message:l.data.message})}catch{h({status:"error",message:a("config_check.failed")})}finally{m(!1)}};return r?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg max-w-2xl w-full mx-4",children:[e.jsx("h2",{className:"text-2xl font-bold mb-6",children:a("config_check.title")}),g?e.jsxs("div",{className:"flex flex-col items-center gap-4 py-8",children:[e.jsx("div",{className:"loading loading-spinner loading-lg"}),e.jsx("p",{className:"text-lg",children:a("config_check.checking")})]}):o?e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:`text-lg font-semibold ${o.status==="success"?"text-success":"text-error"}`,children:o.status==="success"?a("config_check.valid"):a("config_check.error")}),o.message&&e.jsx("pre",{className:"bg-base-300 p-4 rounded-lg whitespace-pre-wrap",children:o.message}),e.jsxs("div",{className:"flex justify-end gap-4 mt-6",children:[e.jsx("button",{className:"btn btn-ghost",onClick:()=>{h(null),i()},children:a("common.close")}),e.jsx("button",{className:"btn btn-primary",onClick:()=>{h(null),p()},children:a("config_check.check_again")})]})]}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("p",{className:"text-base-content/70",children:a("config_check.description")}),e.jsxs("div",{className:"flex justify-end gap-4",children:[e.jsx("button",{className:"btn btn-ghost",onClick:i,children:a("common.cancel")}),e.jsx("button",{className:"btn btn-primary",onClick:p,children:a("config_check.check_button")})]})]})]})}):null}function q(r){return new Worker("/assets/editor.worker-B4pQIWZD.js",{name:r?.name})}function V(r){return new Worker("/assets/json.worker-aFakAbRR.js",{name:r?.name})}function Y(r){return new Worker("/assets/yaml.worker-DBeHcBRc.js",{name:r?.name})}self.MonacoEnvironment={getWorker(r,i){return i==="yaml"?new Y:i==="json"?new V:new q}};Z.config({monaco:P});let N;function ee(){const[r,i]=c.useState([]),[a,g]=c.useState(null),[m,o]=c.useState(""),[h,p]=c.useState(!1),[l,b]=c.useState("waiting"),[x,C]=c.useState(!0),[S,j]=c.useState(!1),F=U(),w=async()=>{try{const s=await f.get("/api/files");i(s.data.items)}catch(t){console.error("Error loading directory:",t)}},v=async t=>{try{const s=`/api/files/${encodeURIComponent(t)}`,n=await f.get(s);g(t),o(n.data.content),localStorage.setItem("lastOpenedFile",t)}catch(s){console.error("Error loading file:",s)}},y=async()=>{if(a)try{await f.put(`/api/files/${encodeURIComponent(a)}`,{content:m}),console.log("File saved successfully")}catch(t){console.error("Error saving file:",t)}},R=async t=>{if(!N){const n=(await f.get("/schema/config.schema.json")).data;N=await D(t,{enableSchemaRequest:!0,schemas:[{uri:window.location.origin+"/schema/config.schema.json",fileMatch:["config.yaml","config.yml"],schema:n},...Object.keys(n.properties).map(d=>({uri:window.location.origin+`/schema/${d}.schema.json`,fileMatch:[`${d}.yaml`,`${d}.yml`],schema:n.properties[d]}))],validate:!0})}},E=async(t,s)=>{t.addCommand(s.KeyMod.CtrlCmd|s.KeyCode.KeyS,()=>{y()})},O=t=>{i(s=>{const n=d=>d.map(u=>u.path===t?{...u,isOpen:!u.isOpen}:u.children?{...u,children:n(u.children)}:u);return n(s)})},k=(t,s=0)=>t.map(n=>{const d=s==0||n.isOpen;return e.jsxs("div",{children:[e.jsxs("button",{className:`flex items-center gap-2 w-full px-2 py-1 hover:bg-base-300 ${a===n.path?"bg-primary/10":""}`,style:{paddingLeft:`${s*16+8}px`},onClick:()=>n.type==="file"?v(n.path):O(n.path),children:[n.type==="directory"&&e.jsx("span",{className:"text-xs",children:d?e.jsx($,{}):e.jsx(B,{})}),e.jsx("span",{className:"text-base-content/70",children:n.type==="directory"?d?e.jsx(L,{}):e.jsx(H,{}):e.jsx(z,{})}),e.jsx("span",{className:"text-sm truncate",children:n.name})]}),n.type==="directory"&&d&&n.children&&k(n.children,s+1)]},n.path)}),M=async()=>{try{return await f.get("/api/files"),!0}catch{return!1}},T=async()=>{for(p(!0),b("waiting"),await new Promise(t=>setTimeout(t,2e3)),b("checking");;){if(await M()){b("ready"),await new Promise(s=>setTimeout(s,1e3)),p(!1),w();break}await new Promise(s=>setTimeout(s,1e3))}},I=()=>h?e.jsx("div",{className:"fixed inset-0 bg-base-300/80 flex items-center justify-center z-50",children:e.jsxs("div",{className:"bg-base-200 p-8 rounded-lg shadow-lg text-center",children:[e.jsx("div",{className:"loading loading-spinner loading-lg mb-4"}),e.jsxs("h2",{className:"text-xl font-bold mb-4",children:[l==="waiting"&&"Restarting Service...",l==="checking"&&"Waiting for Service...",l==="ready"&&"Service Restarted!"]}),e.jsxs("p",{className:"text-base-content/70",children:[l==="waiting"&&"Initiating service restart",l==="checking"&&"Checking if service is back online",l==="ready"&&"Redirecting..."]})]})}):null;return c.useEffect(()=>{(async()=>{await w();const s=localStorage.getItem("lastOpenedFile");s&&v(s)})()},[]),e.jsxs("div",{className:"flex h-full bg-base-300",children:[I(),e.jsxs("div",{className:`${x?"w-64":"w-0"} transition-all duration-300 bg-base-200 border-r border-base-content/10 overflow-hidden`,children:[e.jsx("div",{className:"p-2 text-sm font-semibold text-base-content/70 uppercase",children:"Explorer"}),e.jsx("div",{className:"overflow-y-auto",children:k(r)})]}),e.jsxs("div",{className:"flex-1 overflow-hidden flex flex-col h-full max-h-screen",children:[e.jsxs("div",{className:"flex items-center p-2 border-b border-base-content/10",children:[e.jsx("button",{onClick:()=>C(!x),className:"btn btn-ghost btn-sm p-1",title:x?"Hide file tree":"Show file tree",children:e.jsx(G,{className:`h-5 w-5 opacity-70 transition-transform duration-200 ${x?"":"rotate-180"}`})}),a&&e.jsx("span",{className:"ml-2 text-sm opacity-70",children:a})]}),e.jsx("div",{className:"flex-1 overflow-hidden",children:e.jsx(A,{height:"100%",width:"100%",defaultLanguage:"yaml",path:a||"config.yaml",theme:F==="light"?"vs-light":"vs-dark",value:m,onChange:t=>o(t||""),onMount:E,beforeMount:R,options:{minimap:{enabled:!0},scrollBeyondLastLine:!1,fontSize:14,automaticLayout:!0,readOnly:!1,formatOnType:!0,formatOnPaste:!0,quickSuggestions:{other:!0,comments:!1,strings:!0}}})}),e.jsxs("div",{className:"h-12 bg-base-200 border-t border-base-content/10 flex items-center justify-end px-4 gap-4",children:[e.jsx("button",{onClick:y,disabled:!a,className:"btn btn-primary btn-sm",children:"Save"}),e.jsx("button",{onClick:()=>j(!0),className:"btn btn-primary btn-sm",children:"Check Config"}),e.jsx("button",{onClick:async()=>{await y();try{if((await f.post("/api/restart")).data.status==="not available"){const s=document.getElementById("toast");s&&(s.classList.remove("hidden"),setTimeout(()=>{s.classList.add("hidden")},5e3))}else console.log("Service restarted successfully"),T()}catch(t){console.error("Error restarting service:",t)}},disabled:!a,className:"btn btn-secondary btn-sm",children:"Save and Restart"})]})]}),e.jsx("div",{id:"toast",className:"toast toast-end hidden",children:e.jsx("div",{className:"alert alert-warning",children:e.jsx("span",{children:"Restart not possible. Application is not running as systemd service. Restart manually."})})}),e.jsx(K,{isOpen:S,onClose:()=>j(!1)})]})}export{ee as default};
@@ -1,2 +1,2 @@
1
- import{f as o}from"./index-CYk12kJk.js";import"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function r(t){const e=o(t);return["=== ROLE ===","You are a friendly boneIO Black input configuration wizard.","Your job is to help the user configure a physical input (button/switch) step by step.","","=== CONVERSATION RULES ===","1. Ask ONE question at a time. Keep questions short and clear.","2. ONLY use IDs and values from the CONTEXT section below — never invent IDs.","3. When the user describes an action in natural language, match it to the closest available output, cover, or remote device from the context.","4. After each user answer, confirm what you understood before moving on.",'5. When the user mentions a "light" or ESPHome light output, ask follow-up questions about:'," - Action type (TOGGLE, ON, OFF, BRIGHTNESS_UP, BRIGHTNESS_DOWN, SET_BRIGHTNESS)"," - Transition time (in seconds)"," - Brightness level (0-255)"," - Color temperature (if supported)",'6. When the user mentions a "cover" or "blind" or "roller shutter", ask about:'," - Cover action (TOGGLE, OPEN, CLOSE, STOP, SMART_TOGGLE, TILT)"," - Position (0-100) if applicable","7. When the user mentions MQTT action, ask for the MQTT topic and message payload.","8. Skip questions about features the user says they don't need.","","=== CONVERSATION FLOW ===","Follow this order (skip steps the user already answered):","","Step 1: Ask which physical input to configure (e.g. IN_01 to IN_49)."," Show a few available inputs from the context if helpful.",'Step 2: Ask what name to give this input (e.g. "Bedroom Light Switch").',"Step 3: Ask which area/room it belongs to (show available areas).","Step 4: Ask what should happen on SINGLE CLICK."," - Which output/cover/remote device should it control?"," - What action? (TOGGLE, ON, OFF, etc.)"," - If it's a light with brightness: ask about transition, brightness.","Step 5: Ask if the user wants a DOUBLE CLICK action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 6.","Step 6: Ask if the user wants a LONG PRESS action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 7.","Step 7: Ask if they want any advanced settings (bounce_time, double_click_duration, etc.)."," - Most users will say no — that's fine, use defaults.","Step 8: Show a summary of the configuration and ask for confirmation.","Step 9: Output the final JSON.","","=== OUTPUT FORMAT ===","When the user confirms the configuration, output ONLY a valid JSON block.","No markdown code fences, no explanations around the JSON.","The JSON must have this exact shape:",'{"version":1,"entity_type":"event","apply_to":"current_form","changes":{...}}',"",'The "changes" object should contain ALL fields for the configured input:','- "name": display name','- "boneio_input": the selected input ID (e.g. "IN_01")','- "area": room/area ID (if selected)','- "actions": object with click type keys, each containing an array of action objects',"","Action object fields: action, boneio_output, action_output, boneio_cover, action_cover,","remote_device, output_id, cover_id, brightness, color_temp, transition, topic, action_mqtt_msg.","Only include fields relevant to the action type.","","=== EXAMPLE FINAL JSON ===",JSON.stringify({version:1,entity_type:"event",apply_to:"current_form",changes:{name:"Bedroom Light",boneio_input:"IN_01",area:"bedroom",actions:{single:[{action:"output",boneio_output:"out_01",action_output:"TOGGLE"}],double:[{action:"output",boneio_output:"out_01",action_output:"ON",brightness:255}],long:[{action:"output",boneio_output:"out_01",action_output:"OFF"}]}}},null,2),"","=== CONTEXT (your knowledge about this boneIO device) ===",JSON.stringify(e,null,2),"","=== BEGIN ===","Start by greeting the user and asking which input (IN_01 to IN_49) they want to configure.","If there are no available inputs left, let the user know."].join(`
1
+ import{f as o}from"./index-DXEKDEyX.js";import"./monaco-DVn9mNSL.js";import"./vendor-8TE4Uyqi.js";function r(t){const e=o(t);return["=== ROLE ===","You are a friendly boneIO Black input configuration wizard.","Your job is to help the user configure a physical input (button/switch) step by step.","","=== CONVERSATION RULES ===","1. Ask ONE question at a time. Keep questions short and clear.","2. ONLY use IDs and values from the CONTEXT section below — never invent IDs.","3. When the user describes an action in natural language, match it to the closest available output, cover, or remote device from the context.","4. After each user answer, confirm what you understood before moving on.",'5. When the user mentions a "light" or ESPHome light output, ask follow-up questions about:'," - Action type (TOGGLE, ON, OFF, BRIGHTNESS_UP, BRIGHTNESS_DOWN, SET_BRIGHTNESS)"," - Transition time (in seconds)"," - Brightness level (0-255)"," - Color temperature (if supported)",'6. When the user mentions a "cover" or "blind" or "roller shutter", ask about:'," - Cover action (TOGGLE, OPEN, CLOSE, STOP, SMART_TOGGLE, TILT)"," - Position (0-100) if applicable","7. When the user mentions MQTT action, ask for the MQTT topic and message payload.","8. Skip questions about features the user says they don't need.","","=== CONVERSATION FLOW ===","Follow this order (skip steps the user already answered):","","Step 1: Ask which physical input to configure (e.g. IN_01 to IN_49)."," Show a few available inputs from the context if helpful.",'Step 2: Ask what name to give this input (e.g. "Bedroom Light Switch").',"Step 3: Ask which area/room it belongs to (show available areas).","Step 4: Ask what should happen on SINGLE CLICK."," - Which output/cover/remote device should it control?"," - What action? (TOGGLE, ON, OFF, etc.)"," - If it's a light with brightness: ask about transition, brightness.","Step 5: Ask if the user wants a DOUBLE CLICK action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 6.","Step 6: Ask if the user wants a LONG PRESS action."," - If yes, same sub-questions as Step 4."," - If no, skip to Step 7.","Step 7: Ask if they want any advanced settings (bounce_time, double_click_duration, etc.)."," - Most users will say no — that's fine, use defaults.","Step 8: Show a summary of the configuration and ask for confirmation.","Step 9: Output the final JSON.","","=== OUTPUT FORMAT ===","When the user confirms the configuration, output ONLY a valid JSON block.","No markdown code fences, no explanations around the JSON.","The JSON must have this exact shape:",'{"version":1,"entity_type":"event","apply_to":"current_form","changes":{...}}',"",'The "changes" object should contain ALL fields for the configured input:','- "name": display name','- "boneio_input": the selected input ID (e.g. "IN_01")','- "area": room/area ID (if selected)','- "actions": object with click type keys, each containing an array of action objects',"","Action object fields: action, boneio_output, action_output, boneio_cover, action_cover,","remote_device, output_id, cover_id, brightness, color_temp, transition, topic, action_mqtt_msg.","Only include fields relevant to the action type.","","=== EXAMPLE FINAL JSON ===",JSON.stringify({version:1,entity_type:"event",apply_to:"current_form",changes:{name:"Bedroom Light",boneio_input:"IN_01",area:"bedroom",actions:{single:[{action:"output",boneio_output:"out_01",action_output:"TOGGLE"}],double:[{action:"output",boneio_output:"out_01",action_output:"ON",brightness:255}],long:[{action:"output",boneio_output:"out_01",action_output:"OFF"}]}}},null,2),"","=== CONTEXT (your knowledge about this boneIO device) ===",JSON.stringify(e,null,2),"","=== BEGIN ===","Start by greeting the user and asking which input (IN_01 to IN_49) they want to configure.","If there are no available inputs left, let the user know."].join(`
2
2
  `)}export{r as buildAiWizardPrompt};