boneio 1.4.2__tar.gz → 1.4.4.dev1__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 (459) hide show
  1. {boneio-1.4.2/boneio.egg-info → boneio-1.4.4.dev1}/PKG-INFO +1 -1
  2. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/MANIFEST.sha256 +7 -4
  3. boneio-1.4.4.dev1/boneio/migrations/assets/docker/nodered/caddy/502.html +43 -0
  4. boneio-1.4.4.dev1/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +107 -0
  5. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +14 -7
  6. boneio-1.4.4.dev1/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +12 -0
  7. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/systemd/boneio.service +1 -1
  8. boneio-1.4.4.dev1/boneio/migrations/assets/usr-sbin/oled_msg.py +255 -0
  9. boneio-1.4.4.dev1/boneio/migrations/assets/usr-sbin/oled_msg.sh +55 -0
  10. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/bootstrap/boneio-migrate +14 -4
  11. boneio-1.4.4.dev1/boneio/migrations/versions/v1_4_3_oled_shutdown.py +54 -0
  12. boneio-1.4.4.dev1/boneio/migrations/versions/v1_4_4_caddy.py +68 -0
  13. boneio-1.4.4.dev1/boneio/version.py +2 -0
  14. {boneio-1.4.2 → boneio-1.4.4.dev1/boneio.egg-info}/PKG-INFO +1 -1
  15. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio.egg-info/SOURCES.txt +5 -0
  16. boneio-1.4.2/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -110
  17. boneio-1.4.2/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -17
  18. boneio-1.4.2/boneio/version.py +0 -2
  19. {boneio-1.4.2 → boneio-1.4.4.dev1}/LICENSE +0 -0
  20. {boneio-1.4.2 → boneio-1.4.4.dev1}/MANIFEST.in +0 -0
  21. {boneio-1.4.2 → boneio-1.4.4.dev1}/README.md +0 -0
  22. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/__init__.py +0 -0
  23. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/input.yaml +0 -0
  24. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/output_24_16.yaml +0 -0
  25. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/output_32_10.yaml +0 -0
  26. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/output_32_5.yaml +0 -0
  27. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/output_cover.yaml +0 -0
  28. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  29. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/input.yaml +0 -0
  30. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/output_24_16.yaml +0 -0
  31. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/output_32_10.yaml +0 -0
  32. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/output_32_5.yaml +0 -0
  33. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/output_cover.yaml +0 -0
  34. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  35. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/input.yaml +0 -0
  36. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/output_24_16.yaml +0 -0
  37. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/output_32_10.yaml +0 -0
  38. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/output_32_5.yaml +0 -0
  39. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/output_cover.yaml +0 -0
  40. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  41. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.5/input.yaml +0 -0
  42. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.5/output_24_16.yaml +0 -0
  43. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.5/output_32_10.yaml +0 -0
  44. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.5/output_cover.yaml +0 -0
  45. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  46. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.6/input.yaml +0 -0
  47. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.6/output_24_16.yaml +0 -0
  48. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.6/output_32_10.yaml +0 -0
  49. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.6/output_cover.yaml +0 -0
  50. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  51. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/input.yaml +0 -0
  52. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/output_24_16.yaml +0 -0
  53. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/output_32_10.yaml +0 -0
  54. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/output_48_4.yaml +0 -0
  55. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/output_cover.yaml +0 -0
  56. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  57. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/input.yaml +0 -0
  58. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/output_24_16.yaml +0 -0
  59. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/output_32_10.yaml +0 -0
  60. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/output_48_4.yaml +0 -0
  61. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/output_cover.yaml +0 -0
  62. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  63. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/bonecli.py +0 -0
  64. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/__init__.py +0 -0
  65. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/cover/__init__.py +0 -0
  66. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/cover/cover.py +0 -0
  67. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/cover/time_based.py +0 -0
  68. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/cover/venetian.py +0 -0
  69. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/group/__init__.py +0 -0
  70. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/group/output_group.py +0 -0
  71. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/__init__.py +0 -0
  72. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/binary_sensor.py +0 -0
  73. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/detectors.py +0 -0
  74. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/event.py +0 -0
  75. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/remote/__init__.py +0 -0
  76. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/remote/base.py +0 -0
  77. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/input/remote/esphome.py +0 -0
  78. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/irrigation/__init__.py +0 -0
  79. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/irrigation/controller.py +0 -0
  80. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/irrigation/water_source.py +0 -0
  81. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/__init__.py +0 -0
  82. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/basic.py +0 -0
  83. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/mcp.py +0 -0
  84. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/pca.py +0 -0
  85. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/pcf.py +0 -0
  86. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/output/remote.py +0 -0
  87. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/sensor/__init__.py +0 -0
  88. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/sensor/virtual_energy.py +0 -0
  89. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/template/__init__.py +0 -0
  90. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/template/alarm_panel.py +0 -0
  91. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/template/gate_cover.py +0 -0
  92. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/components/template/thermostat.py +0 -0
  93. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/const.py +0 -0
  94. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/__init__.py +0 -0
  95. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/__init__.py +0 -0
  96. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/data/__init__.py +0 -0
  97. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  98. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  99. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  100. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/registration.py +0 -0
  101. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/cloud/secrets.py +0 -0
  102. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/__init__.py +0 -0
  103. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/config_helper.py +0 -0
  104. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/migrations/__init__.py +0 -0
  105. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  106. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/migrations/v2_transition.py +0 -0
  107. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/package-lock.json +0 -0
  108. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/package.json +0 -0
  109. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/schema_converter.py +0 -0
  110. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/config/yaml_util.py +0 -0
  111. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/discovery.py +0 -0
  112. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/events/__init__.py +0 -0
  113. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/events/bus.py +0 -0
  114. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/__init__.py +0 -0
  115. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/action_conditions.py +0 -0
  116. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/canopen.py +0 -0
  117. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/covers.py +0 -0
  118. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/display.py +0 -0
  119. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/inputs.py +0 -0
  120. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/irrigation.py +0 -0
  121. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/manager.py +0 -0
  122. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/modbus.py +0 -0
  123. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/outputs.py +0 -0
  124. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/remote.py +0 -0
  125. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/remote_input_registrar.py +0 -0
  126. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/sensors.py +0 -0
  127. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/templates/__init__.py +0 -0
  128. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/templates/alarm.py +0 -0
  129. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/templates/gate_cover.py +0 -0
  130. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/templates/thermostat.py +0 -0
  131. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/templates.py +0 -0
  132. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/manager/update.py +0 -0
  133. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/__init__.py +0 -0
  134. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/basic.py +0 -0
  135. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/basic_mqtt.py +0 -0
  136. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/composite.py +0 -0
  137. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/local.py +0 -0
  138. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/lox.py +0 -0
  139. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/mqtt.py +0 -0
  140. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/messaging/queue.py +0 -0
  141. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/__init__.py +0 -0
  142. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/base.py +0 -0
  143. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/can.py +0 -0
  144. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/esphome.py +0 -0
  145. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/mqtt.py +0 -0
  146. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/remote/wled.py +0 -0
  147. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/sensor/__init__.py +0 -0
  148. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/sensor/base.py +0 -0
  149. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/sensor/system.py +0 -0
  150. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/state/__init__.py +0 -0
  151. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/state/manager.py +0 -0
  152. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/system/__init__.py +0 -0
  153. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/system/host_data.py +0 -0
  154. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/system/monitor.py +0 -0
  155. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/__init__.py +0 -0
  156. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/async_updater.py +0 -0
  157. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/conditions.py +0 -0
  158. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/filter.py +0 -0
  159. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/font_util.py +0 -0
  160. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/logger.py +0 -0
  161. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/timeperiod.py +0 -0
  162. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/core/utils/util.py +0 -0
  163. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/adc.yaml +0 -0
  164. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  165. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/config.yaml +0 -0
  166. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/event.yaml +0 -0
  167. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/mqtt.yaml +0 -0
  168. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  169. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/adc.yaml +0 -0
  170. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  171. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/config.yaml +0 -0
  172. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/event.yaml +0 -0
  173. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/mqtt.yaml +0 -0
  174. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  175. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/adc.yaml +0 -0
  176. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  177. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/config.yaml +0 -0
  178. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/event.yaml +0 -0
  179. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/mqtt.yaml +0 -0
  180. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  181. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/__init__.py +0 -0
  182. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/can_master.yaml +0 -0
  183. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/can_slave.yaml +0 -0
  184. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/adc.yaml +0 -0
  185. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  186. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/config.yaml +0 -0
  187. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/cover.yaml +0 -0
  188. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/event.yaml +0 -0
  189. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/mqtt.yaml +0 -0
  190. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover/outputCover.yaml +0 -0
  191. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/adc.yaml +0 -0
  192. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  193. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/config.yaml +0 -0
  194. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/cover.yaml +0 -0
  195. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/event.yaml +0 -0
  196. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  197. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  198. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/adc.yaml +0 -0
  199. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  200. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  201. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  202. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  203. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/event_all.yaml +0 -0
  204. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  205. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  206. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  207. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  208. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  209. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  210. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/exceptions.py +0 -0
  211. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/__init__.py +0 -0
  212. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/analog/__init__.py +0 -0
  213. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/analog/adc.py +0 -0
  214. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/__init__.py +0 -0
  215. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/bridge.py +0 -0
  216. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/client.py +0 -0
  217. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/interface.py +0 -0
  218. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/node.py +0 -0
  219. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/node_id.py +0 -0
  220. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/can/test_od.py +0 -0
  221. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/display/__init__.py +0 -0
  222. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/display/early_oled.py +0 -0
  223. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  224. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/display/oled.py +0 -0
  225. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/__init__.py +0 -0
  226. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  227. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  228. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  229. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  230. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/input/__init__.py +0 -0
  231. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/input/base.py +0 -0
  232. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/gpio/input/manager.py +0 -0
  233. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/__init__.py +0 -0
  234. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/bus.py +0 -0
  235. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/ina219.py +0 -0
  236. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/ina219_driver.py +0 -0
  237. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/mcp9808.py +0 -0
  238. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/i2c/pct2075.py +0 -0
  239. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/onewire/__init__.py +0 -0
  240. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/onewire/bus.py +0 -0
  241. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/onewire/dallas.py +0 -0
  242. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/onewire/ds2482.py +0 -0
  243. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/sensor/__init__.py +0 -0
  244. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  245. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/sensor/temperature/base.py +0 -0
  246. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  247. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  248. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/integration/__init__.py +0 -0
  249. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/integration/homeassistant.py +0 -0
  250. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/integration/interlock.py +0 -0
  251. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/integration/lox_template.py +0 -0
  252. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/__init__.py +0 -0
  253. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/actions.py +0 -0
  254. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/docker/daemon.json +0 -0
  255. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  256. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  257. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/journald/journald.conf +0 -0
  258. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  259. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/sudoers/boneio +0 -0
  260. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  261. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  262. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  263. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  264. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  265. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  266. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  267. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/runner.py +0 -0
  268. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/versions/__init__.py +0 -0
  269. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  270. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  271. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  272. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  273. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/__init__.py +0 -0
  274. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/cli.py +0 -0
  275. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/client.py +0 -0
  276. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/coordinator.py +0 -0
  277. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/__init__.py +0 -0
  278. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  279. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  280. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  281. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  282. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  283. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  284. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  285. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  286. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  287. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  288. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/inverters/sofar.json +0 -0
  289. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/inverters/thessla.json +0 -0
  290. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  291. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  292. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  293. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/other/wanas415.json +0 -0
  294. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  295. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/cwt.json +0 -0
  296. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  297. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  298. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  299. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  300. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  301. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/pt100.json +0 -0
  302. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/sht20.json +0 -0
  303. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/devices/sensors/sht30.json +0 -0
  304. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/__init__.py +0 -0
  305. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/base.py +0 -0
  306. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/derived/__init__.py +0 -0
  307. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/derived/numeric.py +0 -0
  308. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/derived/select.py +0 -0
  309. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/derived/switch.py +0 -0
  310. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/derived/text.py +0 -0
  311. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/sensor/__init__.py +0 -0
  312. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/sensor/binary.py +0 -0
  313. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/sensor/numeric.py +0 -0
  314. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/sensor/text.py +0 -0
  315. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/writeable/__init__.py +0 -0
  316. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/writeable/binary.py +0 -0
  317. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/entities/writeable/numeric.py +0 -0
  318. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/modbus/utils.py +0 -0
  319. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/__init__.py +0 -0
  320. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/actions.py +0 -0
  321. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/events.py +0 -0
  322. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/files.py +0 -0
  323. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/logs.py +0 -0
  324. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/mqtt.py +0 -0
  325. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/models/state.py +0 -0
  326. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/runner.py +0 -0
  327. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/actions.yaml +0 -0
  328. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/actions_sensor.yaml +0 -0
  329. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/actions_switch.yaml +0 -0
  330. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/condition.yaml +0 -0
  331. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/filters.yaml +0 -0
  332. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/filters_adc.yaml +0 -0
  333. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/id.yaml +0 -0
  334. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/remote_devices.yaml +0 -0
  335. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/remote_inputs.yaml +0 -0
  336. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/remote_outputs.yaml +0 -0
  337. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/schema.yaml +0 -0
  338. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/temp_unit.yaml +0 -0
  339. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/schema/update_interval.yaml +0 -0
  340. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/action_validation.py +0 -0
  341. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/app.py +0 -0
  342. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/dashboard_cards.py +0 -0
  343. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +0 -0
  344. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  345. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  346. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  347. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  348. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/index-BXbDdVbb.css +0 -0
  349. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/index-DBT9dXd3.js +0 -0
  350. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  351. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  352. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  353. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  354. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +0 -0
  355. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  356. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  357. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  358. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  359. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  360. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/boneio.svg +0 -0
  361. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  362. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/index.html +0 -0
  363. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  364. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  365. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  366. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  367. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  368. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  369. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  370. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  371. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  372. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  373. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  374. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  375. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  376. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  377. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  378. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  379. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  380. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  381. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  382. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  383. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  384. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  385. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  386. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  387. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  388. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  389. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  390. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  391. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  392. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  393. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  394. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  395. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/sw.js +0 -0
  396. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  397. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/middleware/__init__.py +0 -0
  398. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/middleware/auth.py +0 -0
  399. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/__init__.py +0 -0
  400. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/auth.py +0 -0
  401. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/caddy.py +0 -0
  402. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/can.py +0 -0
  403. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/config.py +0 -0
  404. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/covers.py +0 -0
  405. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/irrigation.py +0 -0
  406. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/migrations.py +0 -0
  407. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/modbus.py +0 -0
  408. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/outputs.py +0 -0
  409. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/remote_devices.py +0 -0
  410. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/sensors.py +0 -0
  411. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/system.py +0 -0
  412. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/templates.py +0 -0
  413. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/timezone_sudoers.py +0 -0
  414. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/tools.py +0 -0
  415. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/routes/update.py +0 -0
  416. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/adc.schema.json +0 -0
  417. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/areas.schema.json +0 -0
  418. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  419. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/boneio.schema.json +0 -0
  420. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/can.schema.json +0 -0
  421. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/config.schema.json +0 -0
  422. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/cover.schema.json +0 -0
  423. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/dallas.schema.json +0 -0
  424. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/ds2482.schema.json +0 -0
  425. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/event.schema.json +0 -0
  426. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/ina219.schema.json +0 -0
  427. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/irrigation.schema.json +0 -0
  428. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/lm75.schema.json +0 -0
  429. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/logger.schema.json +0 -0
  430. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/lox_udp.schema.json +0 -0
  431. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/mcp23017.schema.json +0 -0
  432. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/mcp9808.schema.json +0 -0
  433. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/modbus.schema.json +0 -0
  434. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  435. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/mqtt.schema.json +0 -0
  436. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/oled.schema.json +0 -0
  437. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/output.schema.json +0 -0
  438. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/output_group.schema.json +0 -0
  439. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/pca9685.schema.json +0 -0
  440. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/pcf8575.schema.json +0 -0
  441. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/remote_devices.schema.json +0 -0
  442. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  443. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  444. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/sensor.schema.json +0 -0
  445. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/template.schema.json +0 -0
  446. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  447. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/schema/web.schema.json +0 -0
  448. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/services/__init__.py +0 -0
  449. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/services/logs.py +0 -0
  450. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/web_server.py +0 -0
  451. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio/webui/websocket_manager.py +0 -0
  452. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio.egg-info/dependency_links.txt +0 -0
  453. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio.egg-info/entry_points.txt +0 -0
  454. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio.egg-info/requires.txt +0 -0
  455. {boneio-1.4.2 → boneio-1.4.4.dev1}/boneio.egg-info/top_level.txt +0 -0
  456. {boneio-1.4.2 → boneio-1.4.4.dev1}/pyproject.toml +0 -0
  457. {boneio-1.4.2 → boneio-1.4.4.dev1}/setup.cfg +0 -0
  458. {boneio-1.4.2 → boneio-1.4.4.dev1}/setup.py +0 -0
  459. {boneio-1.4.2 → boneio-1.4.4.dev1}/tests/test_py313_compatibility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.4.2
3
+ Version: 1.4.4.dev1
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
@@ -3,17 +3,20 @@
3
3
  # Generated by scripts/generate_manifest.py — do not edit manually
4
4
 
5
5
  f2ed05c6f5934a15f12571139bdc225804f67b8c83561cc39868f7b2296d2697 docker/daemon.json
6
- 806f93c15b304153672ed2a1783716d5867b5b8045a0e0dff270e147f7792e02 docker/nodered/docker-compose.yaml
6
+ 22dfe7d55e5ed85ea0f4149b7776b7504a12b91905701657a88840ae1208087c docker/nodered/caddy/502.html
7
+ 3e4a91a1737ce82c6bcdbbc31fce214790c0432a608ac34de7fc4e5c58cfd550 docker/nodered/caddy/init-certs.sh
8
+ 1cdcab7aa474d209ba2bc02a06411af3444e7d6c4ccaa0c2c427378af986043a docker/nodered/docker-compose.yaml
7
9
  30467786de3a35e02f9f5049b29ec1808056814e7c2fc5e507ff4b0991cde557 docker/nodered/nginx/default.conf
8
10
  66b00c1e480113a098b90d9948284781896c943006c1a3fe882d515f63b9d3e8 docker/nodered/node-red/settings.js
9
11
  67b4d45f890f073bee66dcf6d6026bd42515d938566b90d2b2a6f7ea016f3764 journald/journald.conf
10
12
  3db75f83033d82ca229e2d3bcb7daf4a5584f65b298d834bd0ee12527ae06e22 mosquitto/boneio.conf
11
13
  3fc86895f5fd3e59d2ee2d229ff7ff7c0030752f0c4eca0bb04314ea57ac0ede sudoers/boneio
12
14
  80e528c3a0e03a4d269bcb46db4224c8e5b6c75553b266cfc4f301b515ddcd95 systemd/boneio-oled-boot.service
13
- 9d4f46cfe6df36ee786b4b08fccc0a4dbe8161b82bdcb74f61cde45869e20ff9 systemd/boneio.service
15
+ df6cbd8ff2361a815917c3a24ca11ebb817fc98c9790833cb2475e0b9f4e9923 systemd/boneio-oled-shutdown.service
16
+ 455fe344a251e0162cdf26beff2a041c55340119de917675faafa06d573663c6 systemd/boneio.service
14
17
  5abbd8e37720f31d44ad59814c7ebbcfb5ae09ef32d83682dee6479f34270a31 systemd/set-hostname-once.service
15
18
  8eaea86c51a17c1bc7b68e9ea65a20b428577a0bc16793768f8dba575532e8ed usr-local-bin/set-hostname-once.sh
16
19
  3340abd637e15bb789e20f2e7de5d95dc45d8e427689e0c62312d044cd3ad86e usr-sbin/oled_boot_splash.py
17
20
  0537e194700c50d91295517e23bcccce9b23be740b93381dff35b510d562c6fe usr-sbin/oled_boot_splash.sh
18
- 700c812bcf192f8be079ae58fce45543c8f60d9a9c25ab149f8dd68786c717d7 usr-sbin/oled_msg.py
19
- e07152aae00b0d020ae69a69bfe2738a5f4b8768b62639516d85bbd2d808ba0a usr-sbin/oled_msg.sh
21
+ a95d897f49e1af2468b18a721731a6c679b3a0c54af4bb8338a5906f98898bdd usr-sbin/oled_msg.py
22
+ b30a474473c96ab973a442ea01bd197735a3d75f12d88129895488335bf5401c usr-sbin/oled_msg.sh
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>boneIO — Service Unavailable</title>
7
+ <style>
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
10
+ background: #1a1a2e;
11
+ color: #e0e0e0;
12
+ display: flex;
13
+ justify-content: center;
14
+ align-items: center;
15
+ min-height: 100vh;
16
+ margin: 0;
17
+ }
18
+ .container {
19
+ text-align: center;
20
+ padding: 2rem;
21
+ }
22
+ h1 { color: #e94560; font-size: 2rem; margin-bottom: 0.5rem; }
23
+ p { color: #a0a0b0; font-size: 1.1rem; }
24
+ .retry { margin-top: 1.5rem; }
25
+ .retry a {
26
+ color: #0f3460;
27
+ background: #e94560;
28
+ padding: 0.6rem 1.5rem;
29
+ border-radius: 6px;
30
+ text-decoration: none;
31
+ font-weight: 600;
32
+ }
33
+ </style>
34
+ </head>
35
+ <body>
36
+ <div class="container">
37
+ <h1>Service Unavailable</h1>
38
+ <p>boneIO is starting up or temporarily unavailable.</p>
39
+ <p>Please wait a moment and try again.</p>
40
+ <div class="retry"><a href="/">Retry</a></div>
41
+ </div>
42
+ </body>
43
+ </html>
@@ -0,0 +1,107 @@
1
+ #!/bin/sh
2
+ # Caddy init script for non-cloud mode (self-signed HTTPS only).
3
+ # Generates a Caddyfile with HTTP and self-signed HTTPS reverse proxy
4
+ # for boneIO and Node-RED.
5
+
6
+ HOSTNAME_FILE="/data/last_hostname"
7
+ CURRENT_HOSTNAME="${HOST_HOSTNAME:-$(cat /etc/host_hostname 2>/dev/null || hostname)}"
8
+
9
+ echo "Current hostname: $CURRENT_HOSTNAME"
10
+ echo "Mode: local (self-signed HTTPS)"
11
+
12
+ # Check if hostname changed (for self-signed cert regeneration)
13
+ if [ -f "$HOSTNAME_FILE" ]; then
14
+ LAST_HOSTNAME=$(cat "$HOSTNAME_FILE")
15
+ if [ "$LAST_HOSTNAME" != "$CURRENT_HOSTNAME" ]; then
16
+ echo "Hostname changed from $LAST_HOSTNAME to $CURRENT_HOSTNAME"
17
+ echo "Removing old self-signed certificates..."
18
+ rm -rf /data/caddy/certificates/local/*
19
+ rm -rf /data/caddy/pki/*
20
+ rm -rf /config/caddy/*
21
+ fi
22
+ else
23
+ echo "First run on this device, clearing any existing certificates..."
24
+ rm -rf /data/caddy/certificates/local/*
25
+ rm -rf /data/caddy/pki/*
26
+ rm -rf /config/caddy/*
27
+ fi
28
+
29
+ echo "$CURRENT_HOSTNAME" > "$HOSTNAME_FILE"
30
+
31
+ # Generate Caddyfile
32
+ cat > /tmp/Caddyfile << EOF
33
+ {
34
+ # Global options - empty for internal issuer
35
+ }
36
+
37
+ # HTTP - serve directly
38
+ :80 {
39
+ handle_errors {
40
+ @502-504 expression {err.status_code} >= 502 && {err.status_code} <= 504
41
+ handle @502-504 {
42
+ root * /srv
43
+ rewrite * /502.html
44
+ file_server
45
+ }
46
+ }
47
+
48
+ handle /nodered-status {
49
+ header Content-Type application/json
50
+ header X-NodeRed-Available "true"
51
+ header Access-Control-Expose-Headers "X-NodeRed-Available"
52
+ respond \`{"available": true}\` 200
53
+ }
54
+
55
+ handle /nodered/* {
56
+ reverse_proxy node-red:1880 {
57
+ header_up X-Forwarded-Proto {scheme}
58
+ header_down X-NodeRed-Available "true"
59
+ }
60
+ }
61
+
62
+ handle {
63
+ reverse_proxy host.docker.internal:8090 {
64
+ header_up X-Forwarded-Proto {scheme}
65
+ }
66
+ }
67
+ }
68
+
69
+ # HTTPS with self-signed certificate (catch-all for hostname and IP access)
70
+ https:// {
71
+ tls internal {
72
+ on_demand
73
+ }
74
+
75
+ handle_errors {
76
+ @502-504 expression {err.status_code} >= 502 && {err.status_code} <= 504
77
+ handle @502-504 {
78
+ root * /srv
79
+ rewrite * /502.html
80
+ file_server
81
+ }
82
+ }
83
+
84
+ handle /nodered-status {
85
+ header Content-Type application/json
86
+ header X-NodeRed-Available "true"
87
+ header Access-Control-Expose-Headers "X-NodeRed-Available"
88
+ respond \`{"available": true}\` 200
89
+ }
90
+
91
+ handle /nodered/* {
92
+ reverse_proxy node-red:1880 {
93
+ header_up X-Forwarded-Proto {scheme}
94
+ header_down X-NodeRed-Available "true"
95
+ }
96
+ }
97
+
98
+ handle {
99
+ reverse_proxy host.docker.internal:8090 {
100
+ header_up X-Forwarded-Proto {scheme}
101
+ }
102
+ }
103
+ }
104
+ EOF
105
+
106
+ # Start Caddy with generated config
107
+ exec caddy run --config /tmp/Caddyfile --adapter caddyfile
@@ -11,16 +11,23 @@ services:
11
11
  - "host.docker.internal:host-gateway"
12
12
  networks:
13
13
  - edge
14
-
15
- nginx:
16
- image: nginx:1.29-alpine-slim
14
+ caddy:
15
+ image: caddy:2-alpine
17
16
  restart: unless-stopped
18
- depends_on:
19
- - node-red
17
+ hostname: ${HOSTNAME}
20
18
  ports:
21
- - "${NGINX_PORT:-8091}:80"
19
+ - "${HTTP_PORT:-8091}:80"
20
+ - "${HTTPS_PORT:-8443}:443"
21
+ environment:
22
+ - HOST_HOSTNAME=${HOSTNAME}
22
23
  volumes:
23
- - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
24
+ - ./caddy/502.html:/srv/502.html:ro
25
+ - ./caddy/init-certs.sh:/init-certs.sh:ro
26
+ - ./caddy/data:/data
27
+ - ./caddy/config:/config
28
+ - /etc/hostname:/etc/host_hostname:ro
29
+ entrypoint: /bin/sh
30
+ command: ["/init-certs.sh"]
24
31
  extra_hosts:
25
32
  - "host.docker.internal:host-gateway"
26
33
  networks:
@@ -0,0 +1,12 @@
1
+ [Unit]
2
+ Description=OLED shutdown message (runs after network is down)
3
+ DefaultDependencies=no
4
+ Before=final.target
5
+ After=network.target
6
+
7
+ [Service]
8
+ Type=oneshot
9
+ ExecStart=/usr/sbin/oled_msg.sh "boneIO Black" "System stopped." "Safe to unplug."
10
+
11
+ [Install]
12
+ WantedBy=final.target
@@ -6,7 +6,7 @@ After=multi-user.target network.target boneio-oled-boot.service
6
6
  Type=simple
7
7
  ExecStartPre=-/usr/sbin/oled_msg.sh "boneIO Black" "is starting..." "Please wait..."
8
8
  ExecStart=${BONEIO_HOME}/boneio/venv/bin/boneio run -c ${BONEIO_HOME}/boneio/config.yaml
9
- ExecStopPost=/usr/sbin/oled_msg.sh "boneIO Black" "has stopped."
9
+ ExecStopPost=-/bin/sh -c 'if ! systemctl is-system-running --quiet 2>/dev/null; then /usr/sbin/oled_msg.sh "boneIO Black" "Shutting down..."; fi'
10
10
  User=${BONEIO_USER}
11
11
  Restart=always
12
12
  RestartSec=3
@@ -0,0 +1,255 @@
1
+ #!/usr/bin/env python3
2
+ """Display a centered message on optional SH1106 OLED.
3
+
4
+ Supports two modes:
5
+ - Direct: oled_msg.py "Line 1" "Line 2" — one-shot render (slow, flickers)
6
+ - Daemon: oled_msg.py --serve — keeps luma in memory, reads
7
+ commands from /tmp/.oled_fifo (fast, no flicker)
8
+
9
+ When the daemon is running, direct calls detect it and send messages
10
+ through the FIFO instead of re-initializing luma.
11
+
12
+ This script is safe to call when no OLED is connected or dependencies are
13
+ missing: it exits quietly with code 0.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import os
19
+ import sys
20
+
21
+ _FIFO_PATH = "/tmp/.oled_fifo"
22
+ _PID_PATH = "/tmp/.oled_serve.pid"
23
+
24
+
25
+ def _fast_clear_oled() -> None:
26
+ """Clear OLED display via raw I2C before slow luma init.
27
+
28
+ On soft-reboot the SH1106 retains the previous image. Luma's sh1106()
29
+ constructor takes ~9 seconds (device enumeration, contrast setup, etc.).
30
+ This function clears the display in ~50ms using raw smbus2 writes,
31
+ so the stale image disappears almost instantly at boot.
32
+ """
33
+ try:
34
+ import smbus2
35
+
36
+ bus = smbus2.SMBus(2)
37
+ addr = 0x3C
38
+ # SH1106 init: display on, set page addressing
39
+ for cmd in [
40
+ 0xAE,
41
+ 0xD5,
42
+ 0x80,
43
+ 0xA8,
44
+ 0x3F,
45
+ 0xD3,
46
+ 0x00,
47
+ 0x40,
48
+ 0xAD,
49
+ 0x8B,
50
+ 0xA1,
51
+ 0xC8,
52
+ 0xDA,
53
+ 0x12,
54
+ 0x81,
55
+ 0xFF,
56
+ 0xD9,
57
+ 0x1F,
58
+ 0xDB,
59
+ 0x40,
60
+ 0xA6,
61
+ 0xAF,
62
+ ]:
63
+ bus.write_byte_data(addr, 0x00, cmd)
64
+ # Clear all 8 pages (128 columns each)
65
+ blank = [0x00] * 128
66
+ for page in range(8):
67
+ bus.write_byte_data(addr, 0x00, 0xB0 | page) # set page
68
+ bus.write_byte_data(addr, 0x00, 0x02) # low col (offset 2 for SH1106)
69
+ bus.write_byte_data(addr, 0x00, 0x10) # high col
70
+ # Write in chunks of 32 (smbus limit)
71
+ for i in range(0, 128, 32):
72
+ bus.write_i2c_block_data(addr, 0x40, blank[i : i + 32])
73
+ bus.close()
74
+ except Exception:
75
+ pass # No OLED or smbus2 not available — ignore
76
+
77
+
78
+ def _is_daemon_running() -> bool:
79
+ """Check if the oled_msg daemon is running.
80
+
81
+ Returns:
82
+ True if daemon PID file exists and process is alive.
83
+ """
84
+ try:
85
+ with open(_PID_PATH) as f:
86
+ pid = int(f.read().strip())
87
+ os.kill(pid, 0) # Check if process exists
88
+ return True
89
+ except (FileNotFoundError, ValueError, ProcessLookupError, PermissionError):
90
+ return False
91
+
92
+
93
+ def _send_to_daemon(lines: list[str]) -> bool:
94
+ """Send a message to the running daemon via FIFO.
95
+
96
+ Args:
97
+ lines: List of text lines to display.
98
+
99
+ Returns:
100
+ True if message was sent successfully.
101
+ """
102
+ try:
103
+ # Open FIFO in non-blocking write to avoid hanging if daemon died
104
+ fd = os.open(_FIFO_PATH, os.O_WRONLY | os.O_NONBLOCK)
105
+ msg = "|".join(lines) + "\n"
106
+ os.write(fd, msg.encode())
107
+ os.close(fd)
108
+ return True
109
+ except (OSError, BrokenPipeError):
110
+ return False
111
+
112
+
113
+ def _draw(device, font, lines: list[str]) -> None:
114
+ """Draw centered text lines on the OLED.
115
+
116
+ Args:
117
+ device: luma sh1106 device instance.
118
+ font: PIL ImageFont instance.
119
+ lines: List of 1-4 text strings to display.
120
+ """
121
+ from luma.core.render import canvas
122
+
123
+ with canvas(device) as draw:
124
+ if len(lines) == 1:
125
+ positions = [(20, 26)]
126
+ elif len(lines) == 2:
127
+ positions = [(12, 20), (12, 36)]
128
+ elif len(lines) == 3:
129
+ positions = [(8, 12), (8, 28), (8, 44)]
130
+ else:
131
+ positions = [(4, 4), (4, 18), (4, 32), (4, 46)]
132
+ for index, line in enumerate(lines):
133
+ draw.text(positions[index], line[:24], font=font, fill="white")
134
+
135
+
136
+ def _serve() -> int:
137
+ """Run as a daemon: initialize luma once, then listen on FIFO for commands.
138
+
139
+ Message format on FIFO: "Line 1|Line 2|Line 3\\n"
140
+ Special messages: "clear\\n" to clear display, "quit\\n" to stop daemon.
141
+
142
+ Returns:
143
+ Exit code.
144
+ """
145
+ _fast_clear_oled()
146
+
147
+ try:
148
+ from luma.core.interface.serial import i2c
149
+ from luma.oled.device import sh1106
150
+ from PIL import ImageFont
151
+ except Exception:
152
+ return 0
153
+
154
+ try:
155
+ serial = i2c(port=2, address=0x3C)
156
+ device = sh1106(serial)
157
+ device.persist = True
158
+ font = ImageFont.load_default()
159
+ except Exception:
160
+ return 0
161
+
162
+ # Create FIFO
163
+ try:
164
+ os.unlink(_FIFO_PATH)
165
+ except FileNotFoundError:
166
+ pass
167
+ os.mkfifo(_FIFO_PATH)
168
+
169
+ # Write PID file
170
+ with open(_PID_PATH, "w") as f:
171
+ f.write(str(os.getpid()))
172
+
173
+ try:
174
+ while True:
175
+ # Open FIFO — blocks until a writer connects
176
+ with open(_FIFO_PATH) as fifo:
177
+ for raw_line in fifo:
178
+ msg = raw_line.strip()
179
+ if not msg:
180
+ continue
181
+ if msg == "quit":
182
+ return 0
183
+ if msg == "clear":
184
+ _fast_clear_oled()
185
+ continue
186
+ lines = msg.split("|")
187
+ _draw(device, font, lines)
188
+ except KeyboardInterrupt:
189
+ pass
190
+ finally:
191
+ try:
192
+ os.unlink(_FIFO_PATH)
193
+ except FileNotFoundError:
194
+ pass
195
+ try:
196
+ os.unlink(_PID_PATH)
197
+ except FileNotFoundError:
198
+ pass
199
+
200
+ return 0
201
+
202
+
203
+ def main(argv: list[str]) -> int:
204
+ """Display a centered message on optional SH1106 OLED.
205
+
206
+ If --serve is passed, runs as a daemon listening on a FIFO.
207
+ Otherwise, sends message to daemon if running, or falls back
208
+ to direct luma rendering.
209
+
210
+ Args:
211
+ argv: Command-line arguments.
212
+
213
+ Returns:
214
+ Exit code (always 0).
215
+ """
216
+ if len(argv) > 1 and argv[1] == "--serve":
217
+ return _serve()
218
+
219
+ lines = [line[:24] for line in argv[1:5] if line]
220
+ if not lines:
221
+ return 0
222
+
223
+ # Try sending to daemon first (fast path — no Python init overhead)
224
+ if _is_daemon_running() and _send_to_daemon(lines):
225
+ return 0
226
+
227
+ # Fallback: direct rendering (slow but always works)
228
+ _fast_clear_oled()
229
+
230
+ try:
231
+ from luma.core.error import DeviceNotFoundError
232
+ from luma.core.interface.serial import i2c
233
+ from luma.oled.device import sh1106
234
+ from PIL import ImageFont
235
+ except Exception:
236
+ return 0
237
+
238
+ try:
239
+ serial = i2c(port=2, address=0x3C)
240
+ device = sh1106(serial)
241
+ device.persist = True
242
+ except (DeviceNotFoundError, OSError, Exception):
243
+ return 0
244
+
245
+ try:
246
+ _draw(device, ImageFont.load_default(), lines)
247
+ except Exception:
248
+ return 0
249
+
250
+ return 0
251
+
252
+
253
+ if __name__ == "__main__":
254
+ raise SystemExit(main(sys.argv))
255
+
@@ -0,0 +1,55 @@
1
+ #!/bin/bash
2
+ # oled_msg.sh — wrapper for optional Python SH1106 renderer
3
+ # Usage: oled_msg.sh "Line 1" ["Line 2"] ["Line 3"] ["Line 4"]
4
+ # oled_msg.sh --serve # start daemon (keeps luma in memory)
5
+ # oled_msg.sh --stop # stop daemon
6
+ # oled_msg.sh clear # clear display
7
+
8
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
+ PYTHON_RENDERER="${SCRIPT_DIR}/oled_msg.py"
10
+ VENV_PYTHON="/home/boneio/boneio/venv/bin/python3"
11
+ OLED_FIFO="/tmp/.oled_fifo"
12
+ OLED_PID="/tmp/.oled_serve.pid"
13
+
14
+ if [ ! -f "${PYTHON_RENDERER}" ]; then
15
+ exit 0
16
+ fi
17
+
18
+ # Pick the right Python
19
+ PYTHON=""
20
+ if [ -x "${VENV_PYTHON}" ]; then
21
+ PYTHON="${VENV_PYTHON}"
22
+ elif command -v python3 >/dev/null 2>&1; then
23
+ PYTHON="python3"
24
+ else
25
+ exit 0
26
+ fi
27
+
28
+ # Handle --serve: start daemon in background
29
+ if [ "$1" = "--serve" ]; then
30
+ "${PYTHON}" "${PYTHON_RENDERER}" --serve 2>/dev/null &
31
+ # Wait briefly for FIFO to be created
32
+ for i in $(seq 1 20); do
33
+ [ -p "$OLED_FIFO" ] && break
34
+ sleep 0.1
35
+ done
36
+ exit 0
37
+ fi
38
+
39
+ # Handle --stop: send quit command to daemon
40
+ if [ "$1" = "--stop" ]; then
41
+ if [ -p "$OLED_FIFO" ]; then
42
+ echo "quit" > "$OLED_FIFO" 2>/dev/null || true
43
+ fi
44
+ exit 0
45
+ fi
46
+
47
+ # Normal message: try FIFO (fast), fallback to direct call
48
+ if [ -p "$OLED_FIFO" ] && [ -f "$OLED_PID" ]; then
49
+ # Daemon is running — send via FIFO (instant, no Python startup)
50
+ MSG=$(IFS='|'; echo "$*")
51
+ echo "$MSG" > "$OLED_FIFO" 2>/dev/null && exit 0
52
+ fi
53
+
54
+ # Fallback: direct Python call
55
+ "${PYTHON}" "${PYTHON_RENDERER}" "$@" 2>/dev/null || true
@@ -237,7 +237,7 @@ def handle_systemctl_disable(action: dict[str, Any], assets_base: str) -> None:
237
237
 
238
238
 
239
239
  def handle_systemctl_restart(action: dict[str, Any], assets_base: str) -> None:
240
- """Restart a systemd service.
240
+ """Restart a systemd service (tolerant of inactive services).
241
241
 
242
242
  Args:
243
243
  action: Action dict with unit.
@@ -245,11 +245,16 @@ def handle_systemctl_restart(action: dict[str, Any], assets_base: str) -> None:
245
245
  """
246
246
  unit = action["unit"]
247
247
  _LOGGER.info("systemctl restart %s", unit)
248
- subprocess.run(["systemctl", "restart", unit], check=True, timeout=30)
248
+ result = subprocess.run(["systemctl", "restart", unit], capture_output=True, text=True, timeout=30)
249
+ if result.returncode != 0:
250
+ if "not active" in result.stderr or "not loaded" in result.stderr or "not found" in result.stderr:
251
+ _LOGGER.warning("systemctl restart %s skipped (not active)", unit)
252
+ else:
253
+ raise subprocess.CalledProcessError(result.returncode, ["systemctl", "restart", unit], result.stdout, result.stderr)
249
254
 
250
255
 
251
256
  def handle_systemctl_reload(action: dict[str, Any], assets_base: str) -> None:
252
- """Reload a systemd service.
257
+ """Reload a systemd service (tolerant of inactive services).
253
258
 
254
259
  Args:
255
260
  action: Action dict with unit.
@@ -257,7 +262,12 @@ def handle_systemctl_reload(action: dict[str, Any], assets_base: str) -> None:
257
262
  """
258
263
  unit = action["unit"]
259
264
  _LOGGER.info("systemctl reload %s", unit)
260
- subprocess.run(["systemctl", "reload", unit], check=True, timeout=30)
265
+ result = subprocess.run(["systemctl", "reload", unit], capture_output=True, text=True, timeout=30)
266
+ if result.returncode != 0:
267
+ if "not active" in result.stderr or "not loaded" in result.stderr or "not found" in result.stderr:
268
+ _LOGGER.warning("systemctl reload %s skipped (not active)", unit)
269
+ else:
270
+ raise subprocess.CalledProcessError(result.returncode, ["systemctl", "reload", unit], result.stdout, result.stderr)
261
271
 
262
272
 
263
273
  def handle_append_line_if_missing(action: dict[str, Any], assets_base: str) -> None:
@@ -0,0 +1,54 @@
1
+ """BoneIO 1.4.3 — OLED shutdown messages improvement.
2
+
3
+ Adds a late-phase shutdown OLED service that shows "System stopped"
4
+ after the network is already down. Updates boneio.service to only show
5
+ "Shutting down..." during actual shutdown (not during restarts).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from boneio.migrations.actions import (
11
+ InstallFile,
12
+ MigrationAction,
13
+ SystemctlDaemonReload,
14
+ SystemctlEnable,
15
+ )
16
+
17
+ VERSION = "1.4.3"
18
+ DESCRIPTION = "OLED shutdown messages: late-phase service + restart-aware ExecStopPost"
19
+ REQUIRES_ROOT = True
20
+
21
+ _BONEIO_USER = "boneio"
22
+ _BONEIO_HOME = f"/home/{_BONEIO_USER}"
23
+
24
+
25
+ def plan() -> list[MigrationAction]:
26
+ """Return the ordered list of migration actions for version 1.4.3.
27
+
28
+ Returns:
29
+ List of :class:`MigrationAction` to apply in order.
30
+ """
31
+ template_vars = {
32
+ "BONEIO_USER": _BONEIO_USER,
33
+ "BONEIO_HOME": _BONEIO_HOME,
34
+ }
35
+
36
+ return [
37
+ # 1. Install late-shutdown OLED service (runs after network is down)
38
+ InstallFile(
39
+ src="systemd/boneio-oled-shutdown.service",
40
+ dst="/etc/systemd/system/boneio-oled-shutdown.service",
41
+ mode=0o644,
42
+ on_change=SystemctlDaemonReload(),
43
+ ),
44
+ SystemctlEnable(unit="boneio-oled-shutdown.service"),
45
+
46
+ # 2. Update boneio.service with shutdown-aware ExecStopPost
47
+ InstallFile(
48
+ src="systemd/boneio.service",
49
+ dst="/etc/systemd/system/boneio.service",
50
+ mode=0o644,
51
+ template_vars=template_vars,
52
+ on_change=SystemctlDaemonReload(),
53
+ ),
54
+ ]