boneio 1.6.0.dev17__tar.gz → 1.6.0.dev19__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 (769) hide show
  1. {boneio-1.6.0.dev17/boneio.egg-info → boneio-1.6.0.dev19}/PKG-INFO +1 -1
  2. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/migration.py +10 -1
  3. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/recovery.py +6 -4
  4. boneio-1.6.0.dev19/boneio/core/utils/logger.py +346 -0
  5. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/display/early_oled.py +23 -0
  6. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/input/manager.py +39 -5
  7. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/bus.py +43 -2
  8. boneio-1.6.0.dev19/boneio/hardware/udev_wait.py +137 -0
  9. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/MANIFEST.sha256 +1 -0
  10. boneio-1.6.0.dev19/boneio/migrations/assets/journald/boneio-console.conf +11 -0
  11. boneio-1.6.0.dev19/boneio/migrations/plans/1.6.25.json +1 -0
  12. boneio-1.6.0.dev19/boneio/migrations/plans/1.6.25.sig +1 -0
  13. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/manifest.json +1 -1
  14. boneio-1.6.0.dev19/boneio/migrations/plans/manifest.sig +0 -0
  15. boneio-1.6.0.dev19/boneio/migrations/versions/v1_6_25_journal_to_serial_console.py +58 -0
  16. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/client.py +211 -22
  17. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/coordinator.py +36 -3
  18. boneio-1.6.0.dev19/boneio/version.py +2 -0
  19. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/app.py +4 -1
  20. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/AccountsView-TbSkH9UL.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/AccountsView-dff6wvrg.js +1 -1
  21. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/BackupSection-EvCtwFQL.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/BackupSection-hkprtrN_.js +1 -1
  22. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/BindingMatrix-sRRfB8jC.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/BindingMatrix-BbWb-n85.js +1 -1
  23. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/DeviceControlSection-CvFyHv7S.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/DeviceControlSection-Bxgmktet.js +1 -1
  24. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/DiagnosticsView-rVS5qDH1.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/DiagnosticsView-BatKg3hK.js +1 -1
  25. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/EntityGrid-Don0ym4o.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/EntityGrid-DUg1BPau.js +1 -1
  26. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/FactoryResetSection-CWLBpFcy.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/FactoryResetSection-CdeQ9R8G.js +1 -1
  27. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/FormInputToggle-wkyu5nWZ.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/FormInputToggle-C-GO0U9E.js +1 -1
  28. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/HaDashboardWizard-Cxcr8qUY.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/HaDashboardWizard-BBvvXJlJ.js +1 -1
  29. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/HostnameSection-1i8lcR91.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/HostnameSection-nYmGzt9B.js +1 -1
  30. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/InputsView-djkHXGOO.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/InputsView-CdbUBoBM.js +1 -1
  31. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/LocationSection-D2CiUIwU.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/LocationSection-BM01jfoj.js +2 -2
  32. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/LoggerForm-Jivd_RXP.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/LoggerForm-BSSFaXSo.js +1 -1
  33. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/LongPressWrapper-CFu1CzuN.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/LongPressWrapper-CgCS_7jy.js +1 -1
  34. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/MigrationsSection-DEzC0mN6.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/MigrationsSection-C6Sz11ep.js +1 -1
  35. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/ModbusView-CHatoXuR.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/ModbusView-mVYavKlT.js +1 -1
  36. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DaxpKeP6.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/MqttPasswordsSection-CIinWhZp.js +1 -1
  37. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/NodeRedManagement-KfLTXyHL.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/NodeRedManagement-DiCup4Y8.js +1 -1
  38. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/OutputsView-CBLnm1Rx.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/OutputsView-BhX49aG6.js +1 -1
  39. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/SecurityView-C12Ye4pF.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/SecurityView-C5uZ-HBY.js +1 -1
  40. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/SensorView-Cz60X005.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/SensorView-pDYf34KT.js +1 -1
  41. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/SystemState-2u8fEUcf.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/SystemState-CmJYNWAd.js +1 -1
  42. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/TemplatesView-8ES2KODg.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/TemplatesView-YDVm7-hR.js +1 -1
  43. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/TilePicker-ByrlXspI.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/TilePicker-0igdEEL2.js +1 -1
  44. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/TimezoneSection-DitamIoS.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/TimezoneSection-C3FOonGN.js +1 -1
  45. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/UISettings-D8hwUItg.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/UISettings-BSlt-jCc.js +4 -4
  46. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-Ch0iC5e1.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-Cy9pAW1l.js +1 -1
  47. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/aiConfig-B7uJx9nA.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/aiConfig-Bv2x5rjm.js +1 -1
  48. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/aiWizardPrompt-abAmCO-3.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/aiWizardPrompt-wB_1CnNS.js +1 -1
  49. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/bodies-CN3Xf7Dt.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/bodies-CejFygVx.js +1 -1
  50. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/index-CLjnGlT9.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/index-DEQDthmP.js +10 -10
  51. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/monaco-CVsEQEbX.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/monaco-BERQIwEm.js +1 -1
  52. boneio-1.6.0.dev17/boneio/webui/frontend-dist/assets/monaco-Dw6H67rn.js → boneio-1.6.0.dev19/boneio/webui/frontend-dist/assets/monaco-CoOT4FPo.js +2 -2
  53. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/index.html +1 -1
  54. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/sw.js +1 -1
  55. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/server.py +71 -4
  56. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19/boneio.egg-info}/PKG-INFO +1 -1
  57. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio.egg-info/SOURCES.txt +38 -33
  58. boneio-1.6.0.dev17/boneio/core/utils/logger.py +0 -161
  59. boneio-1.6.0.dev17/boneio/migrations/plans/manifest.sig +0 -1
  60. boneio-1.6.0.dev17/boneio/version.py +0 -2
  61. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/LICENSE +0 -0
  62. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/MANIFEST.in +0 -0
  63. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/README.md +0 -0
  64. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/__init__.py +0 -0
  65. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/input.yaml +0 -0
  66. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/output_24_16.yaml +0 -0
  67. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/output_32_10.yaml +0 -0
  68. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/output_32_5.yaml +0 -0
  69. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/output_cover.yaml +0 -0
  70. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  71. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/input.yaml +0 -0
  72. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/output_24_16.yaml +0 -0
  73. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/output_32_10.yaml +0 -0
  74. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/output_32_5.yaml +0 -0
  75. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/output_cover.yaml +0 -0
  76. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  77. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/input.yaml +0 -0
  78. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/output_24_16.yaml +0 -0
  79. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/output_32_10.yaml +0 -0
  80. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/output_32_5.yaml +0 -0
  81. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/output_cover.yaml +0 -0
  82. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  83. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.5/input.yaml +0 -0
  84. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.5/output_24_16.yaml +0 -0
  85. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.5/output_32_10.yaml +0 -0
  86. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.5/output_cover.yaml +0 -0
  87. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  88. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.6/input.yaml +0 -0
  89. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.6/output_24_16.yaml +0 -0
  90. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.6/output_32_10.yaml +0 -0
  91. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.6/output_cover.yaml +0 -0
  92. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  93. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/input.yaml +0 -0
  94. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/output_24_16.yaml +0 -0
  95. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/output_32_10.yaml +0 -0
  96. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/output_48_4.yaml +0 -0
  97. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/output_cover.yaml +0 -0
  98. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  99. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/input.yaml +0 -0
  100. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/output_24_16.yaml +0 -0
  101. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/output_32_10.yaml +0 -0
  102. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/output_48_4.yaml +0 -0
  103. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/output_cover.yaml +0 -0
  104. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  105. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/input.yaml +0 -0
  106. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/output_24_16.yaml +0 -0
  107. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/output_32_10.yaml +0 -0
  108. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/output_48_4.yaml +0 -0
  109. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/output_cover.yaml +0 -0
  110. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
  111. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/input.yaml +0 -0
  112. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/output_24_16.yaml +0 -0
  113. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/output_32_10.yaml +0 -0
  114. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/output_48_4.yaml +0 -0
  115. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/output_cover.yaml +0 -0
  116. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/boards/1.1/output_cover_mix.yaml +0 -0
  117. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/bonecli.py +0 -0
  118. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/__init__.py +0 -0
  119. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/cover/__init__.py +0 -0
  120. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/cover/cover.py +0 -0
  121. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/cover/remote.py +0 -0
  122. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/cover/time_based.py +0 -0
  123. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/cover/venetian.py +0 -0
  124. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/group/__init__.py +0 -0
  125. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/group/output_group.py +0 -0
  126. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/__init__.py +0 -0
  127. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/binary_sensor.py +0 -0
  128. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/detectors.py +0 -0
  129. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/event.py +0 -0
  130. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/remote/__init__.py +0 -0
  131. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/remote/base.py +0 -0
  132. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/remote/esphome.py +0 -0
  133. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/input/remote/mqtt.py +0 -0
  134. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/irrigation/__init__.py +0 -0
  135. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/irrigation/controller.py +0 -0
  136. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/irrigation/water_source.py +0 -0
  137. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/__init__.py +0 -0
  138. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/basic.py +0 -0
  139. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/buzzer.py +0 -0
  140. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/mcp.py +0 -0
  141. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/pca.py +0 -0
  142. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/pcf.py +0 -0
  143. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/output/remote.py +0 -0
  144. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/sensor/__init__.py +0 -0
  145. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/sensor/virtual_energy.py +0 -0
  146. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/template/__init__.py +0 -0
  147. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/template/alarm_panel.py +0 -0
  148. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/template/gate_cover.py +0 -0
  149. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/template/thermostat.py +0 -0
  150. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/components/virtual_switch.py +0 -0
  151. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/const.py +0 -0
  152. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/__init__.py +0 -0
  153. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/atomic_file.py +0 -0
  154. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/__init__.py +0 -0
  155. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/cli.py +0 -0
  156. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/hashing.py +0 -0
  157. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/jwt_secret.py +0 -0
  158. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/models.py +0 -0
  159. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/auth/store.py +0 -0
  160. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/__init__.py +0 -0
  161. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/data/__init__.py +0 -0
  162. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  163. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  164. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/registration.py +0 -0
  165. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/cloud/secrets.py +0 -0
  166. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/__init__.py +0 -0
  167. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/config_helper.py +0 -0
  168. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/input_bindings.py +0 -0
  169. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/__init__.py +0 -0
  170. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  171. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v2_transition.py +0 -0
  172. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
  173. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
  174. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v6_input_keys.py +0 -0
  175. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/migrations/v7_mqtt_password_secret.py +0 -0
  176. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/package-lock.json +0 -0
  177. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/package.json +0 -0
  178. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/provenance.py +0 -0
  179. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/schema_converter.py +0 -0
  180. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/secret_masking.py +0 -0
  181. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/write_lock.py +0 -0
  182. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/yaml_compat.py +0 -0
  183. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/yaml_patch.py +0 -0
  184. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/config/yaml_util.py +0 -0
  185. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/containers.py +0 -0
  186. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/diagnostics/__init__.py +0 -0
  187. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/diagnostics/collect.py +0 -0
  188. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/discovery.py +0 -0
  189. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/events/__init__.py +0 -0
  190. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/events/bus.py +0 -0
  191. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/__init__.py +0 -0
  192. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/action_conditions.py +0 -0
  193. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/canopen.py +0 -0
  194. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/covers.py +0 -0
  195. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/display.py +0 -0
  196. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/inputs.py +0 -0
  197. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/irrigation.py +0 -0
  198. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/manager.py +0 -0
  199. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/modbus.py +0 -0
  200. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/outputs.py +0 -0
  201. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/remote.py +0 -0
  202. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/remote_input_registrar.py +0 -0
  203. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/scheduler.py +0 -0
  204. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/security_alert.py +0 -0
  205. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/sensors.py +0 -0
  206. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/sun.py +0 -0
  207. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/templates/__init__.py +0 -0
  208. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/templates/alarm.py +0 -0
  209. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/templates/gate_cover.py +0 -0
  210. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/templates/thermostat.py +0 -0
  211. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/templates.py +0 -0
  212. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/update.py +0 -0
  213. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/manager/virtual_switches.py +0 -0
  214. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/__init__.py +0 -0
  215. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/basic.py +0 -0
  216. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/basic_mqtt.py +0 -0
  217. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/composite.py +0 -0
  218. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/local.py +0 -0
  219. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/lox.py +0 -0
  220. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/mqtt.py +0 -0
  221. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/messaging/queue.py +0 -0
  222. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/net/__init__.py +0 -0
  223. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/net/discovery_guard.py +0 -0
  224. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/__init__.py +0 -0
  225. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/base.py +0 -0
  226. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/can.py +0 -0
  227. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/esphome.py +0 -0
  228. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/mqtt.py +0 -0
  229. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/wled.py +0 -0
  230. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/remote/wled_cache.py +0 -0
  231. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/security/__init__.py +0 -0
  232. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/security/certificate.py +0 -0
  233. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/security/framing.py +0 -0
  234. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/security/posture.py +0 -0
  235. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/sensor/__init__.py +0 -0
  236. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/sensor/base.py +0 -0
  237. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/sensor/sun.py +0 -0
  238. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/sensor/system.py +0 -0
  239. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/state/__init__.py +0 -0
  240. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/state/manager.py +0 -0
  241. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/system/__init__.py +0 -0
  242. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/system/host_data.py +0 -0
  243. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/system/monitor.py +0 -0
  244. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/system_ops.py +0 -0
  245. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/__init__.py +0 -0
  246. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/async_updater.py +0 -0
  247. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/conditions.py +0 -0
  248. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/filter.py +0 -0
  249. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/font_util.py +0 -0
  250. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/naming.py +0 -0
  251. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/overlay.py +0 -0
  252. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/sun.py +0 -0
  253. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/timeperiod.py +0 -0
  254. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/core/utils/util.py +0 -0
  255. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/adc.yaml +0 -0
  256. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  257. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/config.yaml +0 -0
  258. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/event.yaml +0 -0
  259. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/mqtt.yaml +0 -0
  260. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  261. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/adc.yaml +0 -0
  262. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  263. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/config.yaml +0 -0
  264. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/event.yaml +0 -0
  265. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/mqtt.yaml +0 -0
  266. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  267. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/adc.yaml +0 -0
  268. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  269. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/config.yaml +0 -0
  270. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/event.yaml +0 -0
  271. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/mqtt.yaml +0 -0
  272. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  273. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/__init__.py +0 -0
  274. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/can_master.yaml +0 -0
  275. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/can_slave.yaml +0 -0
  276. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/adc.yaml +0 -0
  277. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  278. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/config.yaml +0 -0
  279. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/cover.yaml +0 -0
  280. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/event.yaml +0 -0
  281. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/mqtt.yaml +0 -0
  282. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover/outputCover.yaml +0 -0
  283. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/adc.yaml +0 -0
  284. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  285. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/config.yaml +0 -0
  286. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/cover.yaml +0 -0
  287. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/event.yaml +0 -0
  288. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  289. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  290. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/adc.yaml +0 -0
  291. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  292. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  293. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  294. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  295. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/event_all.yaml +0 -0
  296. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  297. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  298. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  299. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  300. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  301. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  302. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/exceptions.py +0 -0
  303. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/__init__.py +0 -0
  304. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/analog/__init__.py +0 -0
  305. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/analog/adc.py +0 -0
  306. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/__init__.py +0 -0
  307. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/bridge.py +0 -0
  308. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/client.py +0 -0
  309. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/interface.py +0 -0
  310. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/node.py +0 -0
  311. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/node_id.py +0 -0
  312. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/can/test_od.py +0 -0
  313. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/display/__init__.py +0 -0
  314. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  315. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/display/oled.py +0 -0
  316. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/__init__.py +0 -0
  317. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  318. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  319. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  320. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  321. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/input/__init__.py +0 -0
  322. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/gpio/input/base.py +0 -0
  323. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/__init__.py +0 -0
  324. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/ina219.py +0 -0
  325. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/ina219_driver.py +0 -0
  326. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/ina226.py +0 -0
  327. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/ina226_driver.py +0 -0
  328. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/mcp9808.py +0 -0
  329. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/i2c/pct2075.py +0 -0
  330. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/onewire/__init__.py +0 -0
  331. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/onewire/dallas.py +0 -0
  332. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/sensor/__init__.py +0 -0
  333. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  334. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/sensor/temperature/base.py +0 -0
  335. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  336. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  337. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/integration/__init__.py +0 -0
  338. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/integration/homeassistant.py +0 -0
  339. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/integration/interlock.py +0 -0
  340. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/integration/lox_template.py +0 -0
  341. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/__init__.py +0 -0
  342. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/actions.py +0 -0
  343. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/apt/52boneio-periodic +0 -0
  344. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/apt/52boneio-unattended +0 -0
  345. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/daemon.json +0 -0
  346. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
  347. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
  348. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
  349. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  350. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  351. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/helpers/boneio-containers +0 -0
  352. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
  353. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/helpers/boneio-migrate-v2 +0 -0
  354. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/helpers/boneio-system +0 -0
  355. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/issue.d/10-boneio.issue +0 -0
  356. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/journald/journald.conf +0 -0
  357. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
  358. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/migrations-recovery.pem +0 -0
  359. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/migrations.pem +0 -0
  360. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
  361. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  362. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
  363. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/sudoers/boneio +0 -0
  364. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
  365. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
  366. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/boneio-dpkg-recover.service +0 -0
  367. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
  368. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  369. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
  370. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/boneio.service +0 -0
  371. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/apt-daily-priority.conf +0 -0
  372. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
  373. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
  374. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
  375. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
  376. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
  377. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/linger-marker +0 -0
  378. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  379. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  380. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  381. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  382. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
  383. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
  384. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
  385. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/bootstrap/boneio-migrate +0 -0
  386. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  387. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  388. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.0.json +0 -0
  389. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.0.sig +0 -0
  390. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.1.json +0 -0
  391. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.1.sig +0 -0
  392. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.2.json +0 -0
  393. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.3.2.sig +0 -0
  394. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.0.json +0 -0
  395. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.0.sig +0 -0
  396. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.3.json +0 -0
  397. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.3.sig +0 -0
  398. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.4.json +0 -0
  399. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.4.4.sig +0 -0
  400. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.0.json +0 -0
  401. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.0.sig +0 -0
  402. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.1.json +0 -0
  403. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.1.sig +0 -0
  404. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.10.json +0 -0
  405. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.10.sig +0 -0
  406. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.11.json +0 -0
  407. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.11.sig +0 -0
  408. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.12.json +0 -0
  409. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.12.sig +0 -0
  410. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.13.json +0 -0
  411. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.13.sig +0 -0
  412. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.14.json +0 -0
  413. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.14.sig +0 -0
  414. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.15.json +0 -0
  415. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.15.sig +0 -0
  416. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.16.json +0 -0
  417. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.16.sig +0 -0
  418. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.17.json +0 -0
  419. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.17.sig +0 -0
  420. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.18.json +0 -0
  421. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.18.sig +0 -0
  422. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.2.json +0 -0
  423. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.2.sig +0 -0
  424. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.3.json +0 -0
  425. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.3.sig +0 -0
  426. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.4.json +0 -0
  427. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.4.sig +0 -0
  428. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.5.json +0 -0
  429. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.5.sig +0 -0
  430. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.6.json +0 -0
  431. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.6.sig +0 -0
  432. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.7.json +0 -0
  433. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.7.sig +0 -0
  434. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.8.json +0 -0
  435. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.8.sig +0 -0
  436. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.9.json +0 -0
  437. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.5.9.sig +0 -0
  438. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.0.json +0 -0
  439. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.0.sig +0 -0
  440. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.1.json +0 -0
  441. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.1.sig +0 -0
  442. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.10.json +0 -0
  443. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.10.sig +0 -0
  444. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.11.json +0 -0
  445. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.11.sig +0 -0
  446. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.12.json +0 -0
  447. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.12.sig +0 -0
  448. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.13.json +0 -0
  449. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.13.sig +0 -0
  450. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.14.json +0 -0
  451. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.14.sig +0 -0
  452. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.15.json +0 -0
  453. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.15.sig +0 -0
  454. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.16.json +0 -0
  455. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.16.sig +0 -0
  456. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.17.json +0 -0
  457. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.17.sig +0 -0
  458. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.18.json +0 -0
  459. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.18.sig +0 -0
  460. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.19.json +0 -0
  461. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.19.sig +0 -0
  462. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.2.json +0 -0
  463. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.2.sig +0 -0
  464. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.20.json +0 -0
  465. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.20.sig +0 -0
  466. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.21.json +0 -0
  467. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.21.sig +0 -0
  468. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.22.json +0 -0
  469. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.22.sig +0 -0
  470. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.23.json +0 -0
  471. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.23.sig +0 -0
  472. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.24.json +0 -0
  473. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.24.sig +0 -0
  474. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.3.json +0 -0
  475. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.3.sig +0 -0
  476. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.4.json +0 -0
  477. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.4.sig +0 -0
  478. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.5.json +0 -0
  479. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.5.sig +0 -0
  480. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.6.json +0 -0
  481. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.6.sig +0 -0
  482. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.7.json +0 -0
  483. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.7.sig +0 -0
  484. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.8.json +0 -0
  485. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.8.sig +0 -0
  486. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.9.json +0 -0
  487. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/plans/1.6.9.sig +0 -0
  488. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/runner.py +0 -0
  489. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/__init__.py +0 -0
  490. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  491. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  492. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  493. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  494. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
  495. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
  496. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
  497. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
  498. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
  499. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
  500. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
  501. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
  502. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
  503. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
  504. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
  505. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
  506. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
  507. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
  508. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
  509. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
  510. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
  511. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
  512. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
  513. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
  514. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
  515. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
  516. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +0 -0
  517. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_11_drop_docker_group.py +0 -0
  518. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_12_console_shows_ip.py +0 -0
  519. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_13_custom_certificate.py +0 -0
  520. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_14_certificate_lifetime.py +0 -0
  521. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_15_web_port_reaches_caddy.py +0 -0
  522. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_16_release_floor_ordering.py +0 -0
  523. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_17_service_password.py +0 -0
  524. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_18_os_updates.py +0 -0
  525. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_19_helper_apt_purge.py +0 -0
  526. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
  527. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_20_drop_packagekit.py +0 -0
  528. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_21_caddy_pinned.py +0 -0
  529. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_22_security_autoupdates.py +0 -0
  530. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_23_helper_fstab_options.py +0 -0
  531. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_24_boot_partition_nofail.py +0 -0
  532. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +0 -0
  533. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
  534. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +0 -0
  535. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_5_trust_transition.py +0 -0
  536. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +0 -0
  537. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
  538. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
  539. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/migrations/versions/v1_6_9_ntp_servers.py +0 -0
  540. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/__init__.py +0 -0
  541. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/cli.py +0 -0
  542. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/__init__.py +0 -0
  543. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
  544. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  545. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  546. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  547. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  548. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  549. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  550. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  551. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
  552. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  553. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  554. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/thessla.json +0 -0
  555. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  556. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/hvac/wanas415.json +0 -0
  557. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/inverters/sofar.json +0 -0
  558. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  559. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  560. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  561. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  562. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/cwt.json +0 -0
  563. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  564. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  565. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  566. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  567. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/pt100.json +0 -0
  568. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
  569. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/sht20.json +0 -0
  570. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/devices/sensors/sht30.json +0 -0
  571. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/__init__.py +0 -0
  572. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/base.py +0 -0
  573. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/derived/__init__.py +0 -0
  574. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/derived/numeric.py +0 -0
  575. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/derived/select.py +0 -0
  576. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/derived/switch.py +0 -0
  577. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/derived/text.py +0 -0
  578. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/sensor/__init__.py +0 -0
  579. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/sensor/binary.py +0 -0
  580. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/sensor/numeric.py +0 -0
  581. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/sensor/text.py +0 -0
  582. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/writeable/__init__.py +0 -0
  583. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/writeable/binary.py +0 -0
  584. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/entities/writeable/numeric.py +0 -0
  585. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/mock_coordinator.py +0 -0
  586. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/modbus/utils.py +0 -0
  587. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/__init__.py +0 -0
  588. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/actions.py +0 -0
  589. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/events.py +0 -0
  590. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/files.py +0 -0
  591. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/logs.py +0 -0
  592. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/mqtt.py +0 -0
  593. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/models/state.py +0 -0
  594. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/runner.py +0 -0
  595. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/actions.yaml +0 -0
  596. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/actions_sensor.yaml +0 -0
  597. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/actions_switch.yaml +0 -0
  598. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/condition.yaml +0 -0
  599. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/filters.yaml +0 -0
  600. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/filters_adc.yaml +0 -0
  601. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/id.yaml +0 -0
  602. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/remote_devices.yaml +0 -0
  603. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/remote_inputs.yaml +0 -0
  604. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/remote_outputs.yaml +0 -0
  605. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/schema.yaml +0 -0
  606. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/temp_unit.yaml +0 -0
  607. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/schema/update_interval.yaml +0 -0
  608. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/action_validation.py +0 -0
  609. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/bind.py +0 -0
  610. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/dashboard_cards.py +0 -0
  611. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/AppInitContext-BeNfj23N.js +0 -0
  612. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/NodeRedView-C_0IlqZ6.js +0 -0
  613. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/NumericInput-DGzxoNxg.js +0 -0
  614. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/Sparkline-IwpgUXqb.js +0 -0
  615. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/ViewToggle-CTm9ZUC_.js +0 -0
  616. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/axios-DJBeJS4R.js +0 -0
  617. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
  618. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
  619. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  620. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/configCache-BS98BpF9.js +0 -0
  621. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/dialog-DUHsilMe.js +0 -0
  622. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js +0 -0
  623. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/fa-Bo0hGcDa.js +0 -0
  624. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/formatters-Cc0QIRxb.js +0 -0
  625. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/gi-BEb-YkSt.js +0 -0
  626. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/index-bS3WyOSw.css +0 -0
  627. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
  628. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/rolldown-runtime-hePW80VL.js +0 -0
  629. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/select-DCMFLjZt.js +0 -0
  630. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js +0 -0
  631. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
  632. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js +0 -0
  633. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  634. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  635. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/boneio.svg +0 -0
  636. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  637. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  638. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  639. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  640. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  641. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  642. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  643. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  644. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  645. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  646. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  647. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  648. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
  649. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  650. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  651. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/location.schema.json +0 -0
  652. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  653. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  654. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  655. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  656. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  657. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  658. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  659. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  660. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/osdp.schema.json +0 -0
  661. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  662. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  663. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  664. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  665. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  666. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  667. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  668. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/schedule.schema.json +0 -0
  669. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  670. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  671. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  672. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/virtual_switch.schema.json +0 -0
  673. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  674. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
  675. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/hvac_svg_templates.py +0 -0
  676. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/middleware/__init__.py +0 -0
  677. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/middleware/auth.py +0 -0
  678. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/middleware/csrf.py +0 -0
  679. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/middleware/policy.py +0 -0
  680. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/modbus_card_templates.py +0 -0
  681. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/rate_limit.py +0 -0
  682. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/__init__.py +0 -0
  683. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/app.py +0 -0
  684. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/static/index.html +0 -0
  685. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/static/recovery.css +0 -0
  686. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/recovery/static/recovery.js +0 -0
  687. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/__init__.py +0 -0
  688. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/accounts.py +0 -0
  689. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/auth.py +0 -0
  690. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/can.py +0 -0
  691. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config.py +0 -0
  692. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config_actions.py +0 -0
  693. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config_backups.py +0 -0
  694. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config_core.py +0 -0
  695. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config_discovery.py +0 -0
  696. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/config_files.py +0 -0
  697. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/covers.py +0 -0
  698. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/dashboard.py +0 -0
  699. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/dev_fake_device.py +0 -0
  700. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/diagnostics.py +0 -0
  701. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/irrigation.py +0 -0
  702. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/migrations.py +0 -0
  703. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/modbus.py +0 -0
  704. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/mqtt_reference.py +0 -0
  705. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/nodered.py +0 -0
  706. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/onboarding.py +0 -0
  707. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/os_update.py +0 -0
  708. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/outputs.py +0 -0
  709. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/remote_devices.py +0 -0
  710. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/schedule.py +0 -0
  711. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/security.py +0 -0
  712. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/sensors.py +0 -0
  713. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/sun.py +0 -0
  714. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/system.py +0 -0
  715. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/templates.py +0 -0
  716. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/timezone_sudoers.py +0 -0
  717. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/tools.py +0 -0
  718. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/routes/update.py +0 -0
  719. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/adc.schema.json +0 -0
  720. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/areas.schema.json +0 -0
  721. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  722. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/boneio.schema.json +0 -0
  723. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/can.schema.json +0 -0
  724. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/config.schema.json +0 -0
  725. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/cover.schema.json +0 -0
  726. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/dallas.schema.json +0 -0
  727. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/ds2482.schema.json +0 -0
  728. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/event.schema.json +0 -0
  729. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/ina219.schema.json +0 -0
  730. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/ina226.schema.json +0 -0
  731. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/irrigation.schema.json +0 -0
  732. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/lm75.schema.json +0 -0
  733. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/location.schema.json +0 -0
  734. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/logger.schema.json +0 -0
  735. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/lox_udp.schema.json +0 -0
  736. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/mcp23017.schema.json +0 -0
  737. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/mcp9808.schema.json +0 -0
  738. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/modbus.schema.json +0 -0
  739. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  740. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/mqtt.schema.json +0 -0
  741. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/oled.schema.json +0 -0
  742. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/osdp.schema.json +0 -0
  743. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/output.schema.json +0 -0
  744. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/output_group.schema.json +0 -0
  745. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/pca9685.schema.json +0 -0
  746. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/pcf8575.schema.json +0 -0
  747. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/remote_devices.schema.json +0 -0
  748. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  749. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  750. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/schedule.schema.json +0 -0
  751. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/sensor.schema.json +0 -0
  752. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/template.schema.json +0 -0
  753. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  754. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/virtual_switch.schema.json +0 -0
  755. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/schema/web.schema.json +0 -0
  756. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/security_headers.py +0 -0
  757. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/services/__init__.py +0 -0
  758. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/services/logs.py +0 -0
  759. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/sudo_rate_limiter.py +0 -0
  760. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/web_server.py +0 -0
  761. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio/webui/websocket_manager.py +0 -0
  762. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio.egg-info/dependency_links.txt +0 -0
  763. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio.egg-info/entry_points.txt +0 -0
  764. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio.egg-info/requires.txt +0 -0
  765. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/boneio.egg-info/top_level.txt +0 -0
  766. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/pyproject.toml +0 -0
  767. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/setup.cfg +0 -0
  768. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/setup.py +0 -0
  769. {boneio-1.6.0.dev17 → boneio-1.6.0.dev19}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.6.0.dev17
3
+ Version: 1.6.0.dev19
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
@@ -69,12 +69,21 @@ def migrate_legacy_auth(
69
69
  if store.is_provisioned():
70
70
  return MigrationResult(False, reason="already_provisioned")
71
71
 
72
- if not isinstance(legacy_auth, dict) or not legacy_auth:
72
+ if not isinstance(legacy_auth, dict):
73
73
  return MigrationResult(False, reason="no_legacy_auth")
74
74
 
75
75
  username = str(legacy_auth.get("username") or "").strip()
76
76
  password = str(legacy_auth.get("password") or "")
77
77
 
78
+ # Only the login pair makes this a pre-1.6 block. The schema fills
79
+ # web.auth with its defaults (allow_anonymous: false) on every device, so
80
+ # "non-empty" was true everywhere: each fresh controller was reported as
81
+ # incomplete legacy auth and, through that, as configured before — and the
82
+ # wizard hid the import and device steps from exactly the devices that
83
+ # need them.
84
+ if not username and not password:
85
+ return MigrationResult(False, reason="no_legacy_auth")
86
+
78
87
  if not username or not password:
79
88
  _LOGGER.warning(
80
89
  "web.auth in config.yaml is incomplete (username and password are "
@@ -231,10 +231,12 @@ class StartupFailures:
231
231
  def allow_one_retry(self) -> None:
232
232
  """Let the next start run normally, but only that one.
233
233
 
234
- Called when the owner leaves recovery. Clearing the count outright
235
- would cost three more crashes - most of a minute each on a BeagleBone
236
- - before the panel came back if the fix did not work; one below the
237
- threshold gives the fix a single try.
234
+ Called when the owner leaves recovery, and when recovery cannot run
235
+ at all (no ``web`` section, no account to sign in with): without a
236
+ panel, another normal start is the only way out of the loop.
237
+ Clearing the count outright would cost three more crashes - most of
238
+ a minute each on a BeagleBone - before the panel came back if the fix
239
+ did not work; one below the threshold gives the fix a single try.
238
240
  """
239
241
  data = self._read()
240
242
  if self.count >= CRASH_LOOP_THRESHOLD:
@@ -0,0 +1,346 @@
1
+ import logging
2
+ import os
3
+ import sys
4
+ import threading
5
+ from logging import Formatter
6
+ from typing import IO
7
+ from logging.handlers import RotatingFileHandler
8
+
9
+ from colorlog import ColoredFormatter
10
+
11
+ from boneio.const import PAHO, PYMODBUS
12
+ from boneio.version import __version__
13
+
14
+ _LOGGER = logging.getLogger(__name__)
15
+ _nameToLevel = {
16
+ "CRITICAL": logging.CRITICAL,
17
+ "FATAL": logging.FATAL,
18
+ "ERROR": logging.ERROR,
19
+ "WARN": logging.WARNING,
20
+ "WARNING": logging.WARNING,
21
+ "INFO": logging.INFO,
22
+ "DEBUG": logging.DEBUG,
23
+ "NOTSET": logging.NOTSET,
24
+ }
25
+
26
+
27
+ #: The one logger pymodbus 3.x writes through (its ``Log`` class).
28
+ PYMODBUS_INTERNAL_LOGGER = "pymodbus.logging"
29
+
30
+
31
+ class _PymodbusNoResponseFilter(logging.Filter):
32
+ """Drop pymodbus's own report of a device that did not answer.
33
+
34
+ pymodbus logs "No response received after N retries" at ERROR and then
35
+ raises ModbusIOException, which boneio.modbus.client catches and reports
36
+ itself — with the device and register, and rate-limited, WARNING once and
37
+ INFO after. Without this the same timeout is logged twice per poll and the
38
+ pymodbus copy stays at ERROR forever. Everything else pymodbus logs is
39
+ left alone.
40
+
41
+ pymodbus replaces the second identical message in a row with
42
+ "Repeating....", so that is dropped too, but only straight after a dropped
43
+ no-response line; after anything else it is the only trace of a repeat.
44
+ """
45
+
46
+ def __init__(self) -> None:
47
+ """Initialize the filter."""
48
+ super().__init__()
49
+ self._dropped_last = False
50
+
51
+ def filter(self, record: logging.LogRecord) -> bool:
52
+ """Return False for the duplicated no-response message."""
53
+ msg = str(record.msg)
54
+ if msg.startswith("No response received after"):
55
+ self._dropped_last = True
56
+ return False
57
+ # pymodbus appends the last frames it sent to an error, so the marker
58
+ # is a prefix, not the whole message.
59
+ if msg.startswith("Repeating....") and self._dropped_last:
60
+ return False
61
+ self._dropped_last = False
62
+ return True
63
+
64
+
65
+ _PYMODBUS_NO_RESPONSE_FILTER = _PymodbusNoResponseFilter()
66
+
67
+
68
+ def _configure_pymodbus_filter(log_config: dict, debug: int) -> None:
69
+ """Install the no-response filter unless the operator asked for pymodbus.
70
+
71
+ An explicit ``logger.logs`` entry for pymodbus, or ``-dd``, means somebody
72
+ wants to see what pymodbus says, so the filter stays off. Removed first
73
+ because this runs again on every config reload.
74
+ """
75
+ internal = logging.getLogger(PYMODBUS_INTERNAL_LOGGER)
76
+ internal.removeFilter(_PYMODBUS_NO_RESPONSE_FILTER)
77
+ configured = (log_config or {}).get("logs") or {}
78
+ explicit = any(
79
+ name == PYMODBUS or name.startswith(PYMODBUS + ".") for name in configured
80
+ )
81
+ if not explicit and debug <= 1:
82
+ internal.addFilter(_PYMODBUS_NO_RESPONSE_FILTER)
83
+
84
+
85
+ def configure_logger(log_config: dict, debug: int) -> None:
86
+ """Configure logger based on config yaml."""
87
+ _configure_pymodbus_filter(log_config, debug)
88
+
89
+ def debug_logger():
90
+ # Always suppress hypercorn access logs (they spam INFO level)
91
+ logging.getLogger("hypercorn.access").setLevel(logging.WARNING)
92
+
93
+ if debug == 0:
94
+ logging.getLogger().setLevel(logging.INFO)
95
+ if debug > 0:
96
+ logging.getLogger().setLevel(logging.DEBUG)
97
+ logging.getLogger(PAHO).setLevel(logging.WARN)
98
+ logging.getLogger(PYMODBUS).setLevel(logging.WARN)
99
+ logging.getLogger("pymodbus.client").setLevel(logging.WARN)
100
+ _LOGGER.info("Debug mode active")
101
+ _LOGGER.debug(f"Lib version is {__version__}")
102
+ if debug > 1:
103
+ logging.getLogger(PAHO).setLevel(logging.DEBUG)
104
+ logging.getLogger(PYMODBUS).setLevel(logging.DEBUG)
105
+ logging.getLogger("pymodbus.client").setLevel(logging.DEBUG)
106
+ logging.getLogger("hypercorn.error").setLevel(logging.DEBUG)
107
+
108
+ if not log_config:
109
+ debug_logger()
110
+ return
111
+ default = log_config.get("default", "").upper()
112
+ if default in _nameToLevel:
113
+ _LOGGER.info("Setting default log level to %s", default)
114
+ logging.getLogger().setLevel(_nameToLevel[default])
115
+ if debug == 0:
116
+ debug = -1
117
+ for k, v in log_config.get("logs", {}).items():
118
+ logger = logging.getLogger(k)
119
+ val = v.upper()
120
+ if val in _nameToLevel and logger:
121
+ _LOGGER.info("Setting %s log level to %s", k, val)
122
+ logger.setLevel(_nameToLevel[val])
123
+ debug_logger()
124
+
125
+
126
+ """Shared logging configuration for BoneIO."""
127
+
128
+
129
+ _nameToLevel = {
130
+ "CRITICAL": logging.CRITICAL,
131
+ "FATAL": logging.FATAL,
132
+ "ERROR": logging.ERROR,
133
+ "WARN": logging.WARNING,
134
+ "WARNING": logging.WARNING,
135
+ "INFO": logging.INFO,
136
+ "DEBUG": logging.DEBUG,
137
+ "NOTSET": logging.NOTSET,
138
+ }
139
+
140
+ def get_log_level(level_name: str) -> int:
141
+ """Convert string log level to logging constant."""
142
+ return _nameToLevel.get(level_name.upper(), logging.INFO)
143
+
144
+ def is_running_under_systemd():
145
+ """Check if the process is running under systemd."""
146
+ return os.getenv('JOURNAL_STREAM') is not None
147
+
148
+ def is_journal_stream(stream: IO | None) -> bool:
149
+ """Whether ``stream`` is the one systemd connected to the journal.
150
+
151
+ systemd sets JOURNAL_STREAM to "device:inode" of the socket it gave the
152
+ service as stdout/stderr (systemd.exec(5)). The variable alone is not
153
+ enough: a child of boneIO inherits it with its stderr piped elsewhere, and
154
+ there a level prefix would be noise in somebody else's output.
155
+ """
156
+ value = os.environ.get("JOURNAL_STREAM")
157
+ if not value or stream is None:
158
+ return False
159
+ try:
160
+ device, inode = (int(part) for part in value.split(":"))
161
+ st = os.fstat(stream.fileno())
162
+ except (ValueError, OSError, AttributeError):
163
+ # io.UnsupportedOperation (no real fd, e.g. pytest's capture) is
164
+ # both an OSError and a ValueError.
165
+ return False
166
+ return (st.st_dev, st.st_ino) == (device, inode)
167
+
168
+
169
+ def syslog_priority(levelno: int) -> int:
170
+ """Map a logging level to the syslog priority journald files it under."""
171
+ if levelno >= logging.CRITICAL:
172
+ return 2
173
+ if levelno >= logging.ERROR:
174
+ return 3
175
+ if levelno >= logging.WARNING:
176
+ return 4
177
+ if levelno >= logging.INFO:
178
+ return 6
179
+ return 7
180
+
181
+
182
+ class JournalLevelFormatter(Formatter):
183
+ """Prefix every line of a record with its level for journald.
184
+
185
+ journald reads what a service writes to stdout/stderr line by line and
186
+ files each line at PRIORITY=6 unless it starts with "<N>" (the sd-daemon
187
+ prefix; SyslogLevelPrefix= is on by default). boneIO wrote plain text, so
188
+ its warnings, errors and tracebacks were all "info" to the journal - and
189
+ never reached the serial console, which since 1.6.25 shows warning and
190
+ above. A traceback is one record but many lines, and journald makes each
191
+ line a separate entry, so every line gets the prefix, not just the first.
192
+ journald strips it again; the stored message is unchanged.
193
+
194
+ Only the formatted text is prefixed. The record, including the traceback
195
+ text the base class caches on it, is left alone for the other handlers.
196
+ """
197
+
198
+ def __init__(self, inner: Formatter) -> None:
199
+ """Wrap ``inner``, which does the actual formatting."""
200
+ super().__init__()
201
+ self._inner = inner
202
+
203
+ def format(self, record: logging.LogRecord) -> str:
204
+ """Format with the inner formatter and prefix each line."""
205
+ prefix = f"<{syslog_priority(record.levelno)}>"
206
+ text = self._inner.format(record)
207
+ return "\n".join(prefix + line for line in text.split("\n"))
208
+
209
+
210
+ def get_log_formatter(color: bool = True, stream: IO | None = None) -> Formatter:
211
+ """Get log formatter with optional color support.
212
+
213
+ Args:
214
+ color: Colour the output by level.
215
+ stream: Stream the handler writes to. When it is the journal, the
216
+ formatter tells journald each line's level and drops the colours:
217
+ journald keeps a message with escape codes as a byte array rather
218
+ than text, the level now travels in PRIORITY (journalctl colours
219
+ by it), and the prefix has to be the first thing on the line.
220
+ """
221
+ if is_journal_stream(stream):
222
+ return JournalLevelFormatter(
223
+ Formatter("%(levelname)s (%(threadName)s) [%(name)s] %(message)s")
224
+ )
225
+
226
+ # When running under systemd, omit timestamp since journald adds it
227
+ if is_running_under_systemd():
228
+ log_format = "%(levelname)s (%(threadName)s) [%(name)s] %(message)s"
229
+ else:
230
+ log_format = "%(asctime)s %(levelname)s (%(threadName)s) [%(name)s] %(message)s"
231
+
232
+ date_format = "%Y-%m-%d %H:%M:%S"
233
+
234
+ if color:
235
+ colored_format = "%(log_color)s" + log_format + "%(reset)s"
236
+ return ColoredFormatter(
237
+ fmt=colored_format,
238
+ datefmt=date_format,
239
+ reset=True,
240
+ log_colors={
241
+ "DEBUG": "cyan",
242
+ "INFO": "green",
243
+ "WARNING": "yellow",
244
+ "ERROR": "red",
245
+ "CRITICAL": "red",
246
+ },
247
+ )
248
+ return Formatter(log_format, datefmt=date_format)
249
+
250
+
251
+ def install_excepthooks() -> None:
252
+ """Send exceptions nobody caught through logging instead of bare stderr.
253
+
254
+ Python prints an uncaught exception straight to stderr, which under
255
+ systemd means one journal entry per traceback line, all at "info" - so
256
+ the one message that explains why boneIO died never reached the serial
257
+ console. Through logging it gets the level prefix like everything else.
258
+ An exception in the main thread ends the process and is CRITICAL; one
259
+ that ends another thread is ERROR, since boneIO carries on without it.
260
+ Ctrl+C keeps Python's usual short output, and a thread ending with
261
+ SystemExit stays silent, as it is by default.
262
+ """
263
+ logger = logging.getLogger("boneio")
264
+
265
+ def _log_uncaught(exc_type, exc_value, exc_traceback) -> None:
266
+ if issubclass(exc_type, KeyboardInterrupt):
267
+ sys.__excepthook__(exc_type, exc_value, exc_traceback)
268
+ return
269
+ try:
270
+ logger.critical(
271
+ "Uncaught exception, boneIO is exiting",
272
+ exc_info=(exc_type, exc_value, exc_traceback),
273
+ )
274
+ except Exception: # noqa: BLE001 - the traceback must come out somehow
275
+ sys.__excepthook__(exc_type, exc_value, exc_traceback)
276
+
277
+ def _log_uncaught_in_thread(args: threading.ExceptHookArgs) -> None:
278
+ if args.exc_type is SystemExit:
279
+ return
280
+ try:
281
+ logger.error(
282
+ "Uncaught exception in thread %s",
283
+ args.thread.name if args.thread is not None else "unknown",
284
+ exc_info=(args.exc_type, args.exc_value, args.exc_traceback),
285
+ )
286
+ except Exception: # noqa: BLE001
287
+ threading.__excepthook__(args)
288
+
289
+ sys.excepthook = _log_uncaught
290
+ threading.excepthook = _log_uncaught_in_thread
291
+
292
+
293
+ def setup_logging(debug_level: int = 0) -> None:
294
+ """Setup logging configuration."""
295
+ log_format = "%(asctime)s %(levelname)s (%(threadName)s) [%(name)s] %(message)s"
296
+ date_format = "%Y-%m-%d %H:%M:%S"
297
+
298
+ # Set up basic configuration for console output
299
+ logging.basicConfig(
300
+ level=logging.INFO if debug_level == 0 else logging.DEBUG,
301
+ format=log_format,
302
+ datefmt=date_format
303
+ )
304
+
305
+ # Create console handler
306
+ console_handler = logging.StreamHandler()
307
+ console_handler.setLevel(logging.INFO if debug_level == 0 else logging.DEBUG)
308
+
309
+ # Create formatter for console handler. basicConfig's handler writes to
310
+ # stderr; the formatter needs to know whether that is the journal.
311
+ root_handler = logging.getLogger().handlers[0]
312
+ console_formatter = get_log_formatter(
313
+ color=True, stream=getattr(root_handler, "stream", None)
314
+ )
315
+ console_handler.setFormatter(console_formatter)
316
+
317
+ # Add console handler to root logger
318
+ root_handler.setFormatter(console_formatter)
319
+ install_excepthooks()
320
+
321
+ # If debug level > 1, also log to file with rotation
322
+ if debug_level > 1:
323
+ # Get the config directory path
324
+ # config_dir = os.path.dirname(os.path.abspath(os.environ.get("BONEIO_CONFIG", "/tmp")))
325
+ new_config_dir = "/tmp"
326
+ log_file = os.path.join(new_config_dir, "boneio.log")
327
+
328
+ # Create rotating file handler (10MB max size, keep 3 backup files)
329
+ file_handler = RotatingFileHandler(
330
+ log_file,
331
+ maxBytes=10 * 1024 * 1024, # 10MB
332
+ backupCount=3,
333
+ encoding='utf-8'
334
+ )
335
+
336
+ # Set formatter for file handler
337
+ formatter = logging.Formatter(log_format, date_format)
338
+ file_handler.setFormatter(formatter)
339
+
340
+ # Set level for file handler
341
+ file_handler.setLevel(logging.DEBUG)
342
+
343
+ # Add handler to root logger
344
+ logging.getLogger().addHandler(file_handler)
345
+
346
+ logging.info("File logging enabled at: %s", log_file)
@@ -208,6 +208,11 @@ def draw_crash(exception: BaseException, device: Any | None = None) -> None:
208
208
  This function ALWAYS works, even after handoff() — crashes must be
209
209
  visible to the user regardless of which component owns the screen.
210
210
 
211
+ It also marks the display to survive the exit. Every caller returns 1
212
+ straight after drawing, and luma's atexit hook would otherwise blank
213
+ the panel a moment later - the message was up for about a second, then
214
+ the cabinet showed a black screen until systemd's next start.
215
+
211
216
  Args:
212
217
  exception: The exception that caused the crash.
213
218
  device: Optional device override; uses singleton if not provided.
@@ -223,6 +228,7 @@ def draw_crash(exception: BaseException, device: Any | None = None) -> None:
223
228
  detail=exc_msg,
224
229
  device=device,
225
230
  )
231
+ keep_on_exit(device)
226
232
  finally:
227
233
  _taken_over = was_taken_over
228
234
 
@@ -274,6 +280,23 @@ def draw_recovery(title: str, message: str, url: str | None = None, device: Any
274
280
  _LOGGER.debug("Failed to draw recovery notice on OLED: %s", err)
275
281
 
276
282
 
283
+ def keep_on_exit(device: Any | None = None) -> None:
284
+ """Leave whatever is on the display there when the process exits.
285
+
286
+ luma registers an atexit hook that switches the panel off and clears it
287
+ unless the device is marked ``persist``. Right for a clean shutdown, but
288
+ a message drawn just before a deliberate exit - one systemd will follow
289
+ with another start - would otherwise vanish with the process and leave
290
+ the cabinet with a black screen instead of the reason.
291
+
292
+ Args:
293
+ device: Optional device override; uses singleton if not provided.
294
+ """
295
+ dev = device or _early_device
296
+ if dev is not None:
297
+ dev.persist = True
298
+
299
+
277
300
  def clear_display(device: Any | None = None) -> None:
278
301
  """Clear the OLED display (turn all pixels off).
279
302
 
@@ -14,6 +14,7 @@ from gpiod import LineSettings
14
14
  from gpiod.line import Bias, Direction, Edge
15
15
 
16
16
  from boneio.const import PINS
17
+ from boneio.hardware.udev_wait import RETRY_SECONDS, NodeWait, is_not_ready
17
18
 
18
19
  if TYPE_CHECKING:
19
20
  from boneio.components.input.detectors import BinarySensorDetector, MultiClickDetector
@@ -52,6 +53,8 @@ class GpioManager:
52
53
  if debounce_ms > self.MAX_DEBOUNCE_MS:
53
54
  raise ValueError(f"debounce_ms={debounce_ms} exceeds BeagleBone hardware limit of {self.MAX_DEBOUNCE_MS}ms")
54
55
  self._loop = loop
56
+ # Awaited between attempts to open a chip; a test swaps in a fake clock.
57
+ self._sleep = asyncio.sleep
55
58
  self._debounce_ms = debounce_ms
56
59
  self._inputs: list[GpioInputDefinition] = []
57
60
  self._requests: dict[int, gpiod.LineRequest] = {}
@@ -176,6 +179,41 @@ class GpioManager:
176
179
 
177
180
  return successful_lines, failed_lines
178
181
 
182
+ async def _request_lines_when_ready(
183
+ self, chip: int, consumer: str, config: dict[tuple[int, ...], LineSettings]
184
+ ) -> gpiod.LineRequest:
185
+ """Request the chip's lines, waiting for udev if it has to.
186
+
187
+ On the first boot of a fresh image boneIO can get here before udev
188
+ has handed /dev/gpiochip* to the gpio group. One attempt used to be
189
+ all there was: the chip was logged as failed and skipped, and its
190
+ inputs stayed dead until someone restarted boneIO by hand. Now a
191
+ missing or not yet accessible chip is retried once a second within
192
+ the startup budget shared with the I2C bus
193
+ (:mod:`boneio.hardware.udev_wait`). The sleep is awaited, so the event
194
+ loop keeps running. When the budget runs out, or on any other error,
195
+ the original error is raised and start() reports and skips the chip
196
+ as before.
197
+ """
198
+ path = f"/dev/gpiochip{chip}"
199
+ node = NodeWait(path, _LOGGER)
200
+ while True:
201
+ try:
202
+ request = gpiod.request_lines(
203
+ path,
204
+ consumer=consumer,
205
+ config=config, # type: ignore[arg-type]
206
+ )
207
+ except OSError as err:
208
+ if node.retry(err):
209
+ await self._sleep(RETRY_SECONDS)
210
+ continue
211
+ if node.waiting and is_not_ready(err):
212
+ _LOGGER.error("%s still not accessible after %.0f s", path, node.elapsed)
213
+ raise
214
+ node.opened()
215
+ return request
216
+
179
217
  async def start(self, debug_mode: bool = False) -> None:
180
218
  """Start monitoring GPIO inputs.
181
219
 
@@ -250,11 +288,7 @@ class GpioManager:
250
288
 
251
289
  # Request all lines at once (fast mode or after debug validation)
252
290
  try:
253
- request = gpiod.request_lines(
254
- f"/dev/gpiochip{chip}",
255
- consumer=consumer,
256
- config=config, # type: ignore[arg-type]
257
- )
291
+ request = await self._request_lines_when_ready(chip, consumer, config)
258
292
  self._requests[chip] = request
259
293
  _LOGGER.info("✓ Successfully configured chip %d with %d lines", chip, len(config))
260
294
  except OSError as err:
@@ -8,11 +8,14 @@ from __future__ import annotations
8
8
 
9
9
  import logging
10
10
  import threading
11
+ import time
11
12
  from contextlib import suppress
12
13
  from typing import Optional
13
14
 
14
15
  from smbus2 import SMBus, i2c_msg
15
16
 
17
+ from boneio.hardware.udev_wait import RETRY_SECONDS, STARTUP_WAIT_SECONDS, NodeWait, is_not_ready
18
+
16
19
  _LOGGER = logging.getLogger(__name__)
17
20
 
18
21
 
@@ -29,18 +32,56 @@ class SMBus2I2C:
29
32
  bus_number: I2C bus number (typically 2 for BeagleBone Black)
30
33
  """
31
34
 
32
- def __init__(self, bus_number: int = 2):
35
+ def __init__(self, bus_number: int = 2, startup_wait: float = STARTUP_WAIT_SECONDS):
33
36
  """Initialize I2C bus wrapper.
34
37
 
35
38
  Args:
36
39
  bus_number: I2C bus number (default 2 for BBB I2C-2)
40
+ startup_wait: Seconds to keep retrying while the device node is
41
+ missing or not accessible yet, within the startup budget it
42
+ shares with the GPIO chips, see
43
+ :data:`boneio.hardware.udev_wait.STARTUP_WAIT_SECONDS`.
37
44
  """
38
45
  self._bus_number = bus_number
39
46
  self._bus: SMBus | None = None
40
47
  self._lock = threading.RLock() # Reentrant lock for thread safety
41
- self._open_bus()
48
+ self._open_bus_when_ready(startup_wait)
42
49
  _LOGGER.info("Initialized I2C wrapper on bus %d (smbus2)", bus_number)
43
50
 
51
+ def _open_bus_when_ready(self, wait: float) -> None:
52
+ """Open the bus for the first time, waiting for udev if it has to.
53
+
54
+ Only construction waits. A reopen later on (``__enter__``,
55
+ ``try_lock``) runs on the event loop, where blocking for a minute
56
+ would stall everything else; there the device node has long been set
57
+ up, so a failure is a real one.
58
+
59
+ Only "not there" and "not ours yet" are waited out - the two states
60
+ udev leaves the node in before its rule has run. Anything else fails
61
+ at once, as before, and so does the last attempt: the original error
62
+ is re-raised, so the crash reads the same as it always did.
63
+ """
64
+ path = f"/dev/i2c-{self._bus_number}"
65
+ # The clock is looked up here, not in NodeWait, so a test that swaps
66
+ # this module's ``time`` moves the deadline and the sleep together.
67
+ node = NodeWait(path, _LOGGER, wait=wait, clock=time.monotonic)
68
+ while True:
69
+ try:
70
+ # Not _open_bus(): that logs an ERROR per failure, and a wait
71
+ # would fill the journal with them.
72
+ self._bus = SMBus(self._bus_number)
73
+ break
74
+ except OSError as err:
75
+ if node.retry(err):
76
+ time.sleep(RETRY_SECONDS)
77
+ continue
78
+ if node.waiting and is_not_ready(err):
79
+ _LOGGER.error("%s still not accessible after %.0f s: %s", path, node.elapsed, err)
80
+ else:
81
+ _LOGGER.error(f"Failed to open I2C bus {self._bus_number}: {err}")
82
+ raise
83
+ node.opened()
84
+
44
85
  def _open_bus(self) -> None:
45
86
  """Open I2C bus if not already open."""
46
87
  if self._bus is None: