boneIO 1.4.2__tar.gz → 1.4.3__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 (456) hide show
  1. {boneio-1.4.2/boneio.egg-info → boneio-1.4.3}/PKG-INFO +1 -1
  2. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/MANIFEST.sha256 +4 -3
  3. boneio-1.4.3/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +12 -0
  4. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/systemd/boneio.service +1 -1
  5. boneio-1.4.3/boneio/migrations/assets/usr-sbin/oled_msg.py +255 -0
  6. boneio-1.4.3/boneio/migrations/assets/usr-sbin/oled_msg.sh +55 -0
  7. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/bootstrap/boneio-migrate +14 -4
  8. boneio-1.4.3/boneio/migrations/versions/v1_4_3_oled_shutdown.py +54 -0
  9. boneio-1.4.3/boneio/version.py +2 -0
  10. {boneio-1.4.2 → boneio-1.4.3/boneio.egg-info}/PKG-INFO +1 -1
  11. {boneio-1.4.2 → boneio-1.4.3}/boneio.egg-info/SOURCES.txt +2 -0
  12. boneio-1.4.2/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -110
  13. boneio-1.4.2/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -17
  14. boneio-1.4.2/boneio/version.py +0 -2
  15. {boneio-1.4.2 → boneio-1.4.3}/LICENSE +0 -0
  16. {boneio-1.4.2 → boneio-1.4.3}/MANIFEST.in +0 -0
  17. {boneio-1.4.2 → boneio-1.4.3}/README.md +0 -0
  18. {boneio-1.4.2 → boneio-1.4.3}/boneio/__init__.py +0 -0
  19. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/input.yaml +0 -0
  20. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/output_24_16.yaml +0 -0
  21. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/output_32_10.yaml +0 -0
  22. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/output_32_5.yaml +0 -0
  23. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/output_cover.yaml +0 -0
  24. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
  25. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/input.yaml +0 -0
  26. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/output_24_16.yaml +0 -0
  27. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/output_32_10.yaml +0 -0
  28. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/output_32_5.yaml +0 -0
  29. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/output_cover.yaml +0 -0
  30. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
  31. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/input.yaml +0 -0
  32. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/output_24_16.yaml +0 -0
  33. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/output_32_10.yaml +0 -0
  34. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/output_32_5.yaml +0 -0
  35. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/output_cover.yaml +0 -0
  36. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
  37. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.5/input.yaml +0 -0
  38. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.5/output_24_16.yaml +0 -0
  39. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.5/output_32_10.yaml +0 -0
  40. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.5/output_cover.yaml +0 -0
  41. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
  42. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.6/input.yaml +0 -0
  43. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.6/output_24_16.yaml +0 -0
  44. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.6/output_32_10.yaml +0 -0
  45. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.6/output_cover.yaml +0 -0
  46. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
  47. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/input.yaml +0 -0
  48. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/output_24_16.yaml +0 -0
  49. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/output_32_10.yaml +0 -0
  50. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/output_48_4.yaml +0 -0
  51. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/output_cover.yaml +0 -0
  52. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
  53. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/input.yaml +0 -0
  54. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/output_24_16.yaml +0 -0
  55. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/output_32_10.yaml +0 -0
  56. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/output_48_4.yaml +0 -0
  57. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/output_cover.yaml +0 -0
  58. {boneio-1.4.2 → boneio-1.4.3}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
  59. {boneio-1.4.2 → boneio-1.4.3}/boneio/bonecli.py +0 -0
  60. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/__init__.py +0 -0
  61. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/cover/__init__.py +0 -0
  62. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/cover/cover.py +0 -0
  63. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/cover/time_based.py +0 -0
  64. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/cover/venetian.py +0 -0
  65. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/group/__init__.py +0 -0
  66. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/group/output_group.py +0 -0
  67. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/__init__.py +0 -0
  68. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/binary_sensor.py +0 -0
  69. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/detectors.py +0 -0
  70. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/event.py +0 -0
  71. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/remote/__init__.py +0 -0
  72. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/remote/base.py +0 -0
  73. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/input/remote/esphome.py +0 -0
  74. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/irrigation/__init__.py +0 -0
  75. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/irrigation/controller.py +0 -0
  76. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/irrigation/water_source.py +0 -0
  77. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/__init__.py +0 -0
  78. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/basic.py +0 -0
  79. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/mcp.py +0 -0
  80. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/pca.py +0 -0
  81. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/pcf.py +0 -0
  82. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/output/remote.py +0 -0
  83. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/sensor/__init__.py +0 -0
  84. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/sensor/virtual_energy.py +0 -0
  85. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/template/__init__.py +0 -0
  86. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/template/alarm_panel.py +0 -0
  87. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/template/gate_cover.py +0 -0
  88. {boneio-1.4.2 → boneio-1.4.3}/boneio/components/template/thermostat.py +0 -0
  89. {boneio-1.4.2 → boneio-1.4.3}/boneio/const.py +0 -0
  90. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/__init__.py +0 -0
  91. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/__init__.py +0 -0
  92. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/data/__init__.py +0 -0
  93. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/data/docker-compose-cloud.yaml +0 -0
  94. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/data/docker-compose.yaml +0 -0
  95. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
  96. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/registration.py +0 -0
  97. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/cloud/secrets.py +0 -0
  98. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/__init__.py +0 -0
  99. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/config_helper.py +0 -0
  100. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/migrations/__init__.py +0 -0
  101. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
  102. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/migrations/v2_transition.py +0 -0
  103. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/package-lock.json +0 -0
  104. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/package.json +0 -0
  105. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/schema_converter.py +0 -0
  106. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/config/yaml_util.py +0 -0
  107. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/discovery.py +0 -0
  108. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/events/__init__.py +0 -0
  109. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/events/bus.py +0 -0
  110. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/__init__.py +0 -0
  111. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/action_conditions.py +0 -0
  112. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/canopen.py +0 -0
  113. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/covers.py +0 -0
  114. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/display.py +0 -0
  115. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/inputs.py +0 -0
  116. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/irrigation.py +0 -0
  117. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/manager.py +0 -0
  118. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/modbus.py +0 -0
  119. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/outputs.py +0 -0
  120. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/remote.py +0 -0
  121. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/remote_input_registrar.py +0 -0
  122. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/sensors.py +0 -0
  123. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/templates/__init__.py +0 -0
  124. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/templates/alarm.py +0 -0
  125. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/templates/gate_cover.py +0 -0
  126. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/templates/thermostat.py +0 -0
  127. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/templates.py +0 -0
  128. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/manager/update.py +0 -0
  129. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/__init__.py +0 -0
  130. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/basic.py +0 -0
  131. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/basic_mqtt.py +0 -0
  132. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/composite.py +0 -0
  133. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/local.py +0 -0
  134. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/lox.py +0 -0
  135. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/mqtt.py +0 -0
  136. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/messaging/queue.py +0 -0
  137. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/__init__.py +0 -0
  138. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/base.py +0 -0
  139. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/can.py +0 -0
  140. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/esphome.py +0 -0
  141. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/mqtt.py +0 -0
  142. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/remote/wled.py +0 -0
  143. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/sensor/__init__.py +0 -0
  144. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/sensor/base.py +0 -0
  145. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/sensor/system.py +0 -0
  146. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/state/__init__.py +0 -0
  147. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/state/manager.py +0 -0
  148. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/system/__init__.py +0 -0
  149. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/system/host_data.py +0 -0
  150. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/system/monitor.py +0 -0
  151. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/__init__.py +0 -0
  152. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/async_updater.py +0 -0
  153. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/conditions.py +0 -0
  154. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/filter.py +0 -0
  155. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/font_util.py +0 -0
  156. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/logger.py +0 -0
  157. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/timeperiod.py +0 -0
  158. {boneio-1.4.2 → boneio-1.4.3}/boneio/core/utils/util.py +0 -0
  159. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/adc.yaml +0 -0
  160. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
  161. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/config.yaml +0 -0
  162. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/event.yaml +0 -0
  163. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/mqtt.yaml +0 -0
  164. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/24x16/output24x16A.yaml +0 -0
  165. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/adc.yaml +0 -0
  166. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
  167. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/config.yaml +0 -0
  168. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/event.yaml +0 -0
  169. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/mqtt.yaml +0 -0
  170. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/32x10/output32x10A.yaml +0 -0
  171. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/adc.yaml +0 -0
  172. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
  173. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/config.yaml +0 -0
  174. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/event.yaml +0 -0
  175. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/mqtt.yaml +0 -0
  176. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/48x4/output48x4A.yaml +0 -0
  177. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/__init__.py +0 -0
  178. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/can_master.yaml +0 -0
  179. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/can_slave.yaml +0 -0
  180. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/adc.yaml +0 -0
  181. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/binary_sensor.yaml +0 -0
  182. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/config.yaml +0 -0
  183. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/cover.yaml +0 -0
  184. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/event.yaml +0 -0
  185. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/mqtt.yaml +0 -0
  186. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover/outputCover.yaml +0 -0
  187. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/adc.yaml +0 -0
  188. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
  189. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/config.yaml +0 -0
  190. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/cover.yaml +0 -0
  191. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/event.yaml +0 -0
  192. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
  193. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
  194. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/adc.yaml +0 -0
  195. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
  196. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
  197. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
  198. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
  199. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/event_all.yaml +0 -0
  200. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
  201. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
  202. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
  203. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
  204. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
  205. {boneio-1.4.2 → boneio-1.4.3}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
  206. {boneio-1.4.2 → boneio-1.4.3}/boneio/exceptions.py +0 -0
  207. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/__init__.py +0 -0
  208. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/analog/__init__.py +0 -0
  209. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/analog/adc.py +0 -0
  210. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/__init__.py +0 -0
  211. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/bridge.py +0 -0
  212. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/client.py +0 -0
  213. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/interface.py +0 -0
  214. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/node.py +0 -0
  215. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/node_id.py +0 -0
  216. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/can/test_od.py +0 -0
  217. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/display/__init__.py +0 -0
  218. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/display/early_oled.py +0 -0
  219. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/display/fonts/danube__.ttf +0 -0
  220. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/display/oled.py +0 -0
  221. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/__init__.py +0 -0
  222. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/expanders/__init__.py +0 -0
  223. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
  224. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
  225. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
  226. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/input/__init__.py +0 -0
  227. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/input/base.py +0 -0
  228. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/gpio/input/manager.py +0 -0
  229. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/__init__.py +0 -0
  230. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/bus.py +0 -0
  231. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/ina219.py +0 -0
  232. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/ina219_driver.py +0 -0
  233. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/mcp9808.py +0 -0
  234. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/i2c/pct2075.py +0 -0
  235. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/onewire/__init__.py +0 -0
  236. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/onewire/bus.py +0 -0
  237. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/onewire/dallas.py +0 -0
  238. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/onewire/ds2482.py +0 -0
  239. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/sensor/__init__.py +0 -0
  240. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/sensor/temperature/__init__.py +0 -0
  241. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/sensor/temperature/base.py +0 -0
  242. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
  243. {boneio-1.4.2 → boneio-1.4.3}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
  244. {boneio-1.4.2 → boneio-1.4.3}/boneio/integration/__init__.py +0 -0
  245. {boneio-1.4.2 → boneio-1.4.3}/boneio/integration/homeassistant.py +0 -0
  246. {boneio-1.4.2 → boneio-1.4.3}/boneio/integration/interlock.py +0 -0
  247. {boneio-1.4.2 → boneio-1.4.3}/boneio/integration/lox_template.py +0 -0
  248. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/__init__.py +0 -0
  249. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/actions.py +0 -0
  250. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/docker/daemon.json +0 -0
  251. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
  252. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/docker/nodered/nginx/default.conf +0 -0
  253. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
  254. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/journald/journald.conf +0 -0
  255. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
  256. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/sudoers/boneio +0 -0
  257. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
  258. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
  259. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
  260. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
  261. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
  262. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/bootstrap/install-helper.sh +0 -0
  263. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
  264. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/runner.py +0 -0
  265. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/versions/__init__.py +0 -0
  266. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
  267. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
  268. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
  269. {boneio-1.4.2 → boneio-1.4.3}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
  270. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/__init__.py +0 -0
  271. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/cli.py +0 -0
  272. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/client.py +0 -0
  273. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/coordinator.py +0 -0
  274. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/__init__.py +0 -0
  275. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
  276. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
  277. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
  278. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
  279. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
  280. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
  281. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
  282. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
  283. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
  284. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/hvac/ventclear.json +0 -0
  285. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/inverters/sofar.json +0 -0
  286. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/inverters/thessla.json +0 -0
  287. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
  288. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/other/n4dsc08.json +0 -0
  289. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/other/r4dcb08.json +0 -0
  290. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/other/wanas415.json +0 -0
  291. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
  292. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/cwt.json +0 -0
  293. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/dts1964_3f.json +0 -0
  294. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
  295. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/gdfs.json +0 -0
  296. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/gdfx.json +0 -0
  297. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
  298. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/pt100.json +0 -0
  299. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/sht20.json +0 -0
  300. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/devices/sensors/sht30.json +0 -0
  301. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/__init__.py +0 -0
  302. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/base.py +0 -0
  303. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/derived/__init__.py +0 -0
  304. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/derived/numeric.py +0 -0
  305. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/derived/select.py +0 -0
  306. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/derived/switch.py +0 -0
  307. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/derived/text.py +0 -0
  308. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/sensor/__init__.py +0 -0
  309. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/sensor/binary.py +0 -0
  310. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/sensor/numeric.py +0 -0
  311. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/sensor/text.py +0 -0
  312. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/writeable/__init__.py +0 -0
  313. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/writeable/binary.py +0 -0
  314. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/entities/writeable/numeric.py +0 -0
  315. {boneio-1.4.2 → boneio-1.4.3}/boneio/modbus/utils.py +0 -0
  316. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/__init__.py +0 -0
  317. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/actions.py +0 -0
  318. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/events.py +0 -0
  319. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/files.py +0 -0
  320. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/logs.py +0 -0
  321. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/mqtt.py +0 -0
  322. {boneio-1.4.2 → boneio-1.4.3}/boneio/models/state.py +0 -0
  323. {boneio-1.4.2 → boneio-1.4.3}/boneio/runner.py +0 -0
  324. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/actions.yaml +0 -0
  325. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/actions_sensor.yaml +0 -0
  326. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/actions_switch.yaml +0 -0
  327. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/condition.yaml +0 -0
  328. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/filters.yaml +0 -0
  329. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/filters_adc.yaml +0 -0
  330. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/id.yaml +0 -0
  331. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/remote_devices.yaml +0 -0
  332. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/remote_inputs.yaml +0 -0
  333. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/remote_outputs.yaml +0 -0
  334. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/schema.yaml +0 -0
  335. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/temp_unit.yaml +0 -0
  336. {boneio-1.4.2 → boneio-1.4.3}/boneio/schema/update_interval.yaml +0 -0
  337. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/action_validation.py +0 -0
  338. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/app.py +0 -0
  339. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/dashboard_cards.py +0 -0
  340. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/ConfigEditor-DqDX4DyY.js +0 -0
  341. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/aiConfig-DxFilBWK.js +0 -0
  342. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/aiWizardPrompt-CrWwS7zb.js +0 -0
  343. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/codicon-DCmgc-ay.ttf +0 -0
  344. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/editor.worker-BVjSvWeP.js +0 -0
  345. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/index-BXbDdVbb.css +0 -0
  346. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/index-DBT9dXd3.js +0 -0
  347. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/json.worker-CqOJL4FD.js +0 -0
  348. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/monaco-B9WiNxkw.css +0 -0
  349. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/monaco-CAZoGZNF.js +0 -0
  350. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/rolldown-runtime-Dw2cE7zH.js +0 -0
  351. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/useTranslation-DUpbl8sU.js +0 -0
  352. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/vendor-BD5Ml_Uz.js +0 -0
  353. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BJd1pjeW.js +0 -0
  354. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/assets/yaml.worker-nZQZSRZ7.js +0 -0
  355. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/boneio-192.png +0 -0
  356. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/boneio-512.png +0 -0
  357. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/boneio.svg +0 -0
  358. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
  359. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/index.html +0 -0
  360. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
  361. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
  362. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
  363. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
  364. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
  365. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
  366. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
  367. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
  368. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
  369. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
  370. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
  371. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
  372. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
  373. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
  374. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
  375. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
  376. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
  377. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
  378. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
  379. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
  380. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
  381. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
  382. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
  383. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
  384. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
  385. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
  386. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
  387. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
  388. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
  389. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
  390. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
  391. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
  392. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/sw.js +0 -0
  393. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/frontend-dist/workbox-4eca85ba.js +0 -0
  394. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/middleware/__init__.py +0 -0
  395. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/middleware/auth.py +0 -0
  396. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/__init__.py +0 -0
  397. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/auth.py +0 -0
  398. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/caddy.py +0 -0
  399. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/can.py +0 -0
  400. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/config.py +0 -0
  401. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/covers.py +0 -0
  402. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/irrigation.py +0 -0
  403. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/migrations.py +0 -0
  404. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/modbus.py +0 -0
  405. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/outputs.py +0 -0
  406. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/remote_devices.py +0 -0
  407. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/sensors.py +0 -0
  408. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/system.py +0 -0
  409. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/templates.py +0 -0
  410. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/timezone_sudoers.py +0 -0
  411. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/tools.py +0 -0
  412. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/routes/update.py +0 -0
  413. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/adc.schema.json +0 -0
  414. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/areas.schema.json +0 -0
  415. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/binary_sensor.schema.json +0 -0
  416. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/boneio.schema.json +0 -0
  417. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/can.schema.json +0 -0
  418. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/config.schema.json +0 -0
  419. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/cover.schema.json +0 -0
  420. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/dallas.schema.json +0 -0
  421. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/ds2482.schema.json +0 -0
  422. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/event.schema.json +0 -0
  423. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/ina219.schema.json +0 -0
  424. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/irrigation.schema.json +0 -0
  425. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/lm75.schema.json +0 -0
  426. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/logger.schema.json +0 -0
  427. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/lox_udp.schema.json +0 -0
  428. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/mcp23017.schema.json +0 -0
  429. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/mcp9808.schema.json +0 -0
  430. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/modbus.schema.json +0 -0
  431. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/modbus_devices.schema.json +0 -0
  432. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/mqtt.schema.json +0 -0
  433. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/oled.schema.json +0 -0
  434. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/output.schema.json +0 -0
  435. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/output_group.schema.json +0 -0
  436. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/pca9685.schema.json +0 -0
  437. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/pcf8575.schema.json +0 -0
  438. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/remote_devices.schema.json +0 -0
  439. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/remote_inputs.schema.json +0 -0
  440. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/remote_outputs.schema.json +0 -0
  441. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/sensor.schema.json +0 -0
  442. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/template.schema.json +0 -0
  443. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
  444. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/schema/web.schema.json +0 -0
  445. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/services/__init__.py +0 -0
  446. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/services/logs.py +0 -0
  447. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/web_server.py +0 -0
  448. {boneio-1.4.2 → boneio-1.4.3}/boneio/webui/websocket_manager.py +0 -0
  449. {boneio-1.4.2 → boneio-1.4.3}/boneio.egg-info/dependency_links.txt +0 -0
  450. {boneio-1.4.2 → boneio-1.4.3}/boneio.egg-info/entry_points.txt +0 -0
  451. {boneio-1.4.2 → boneio-1.4.3}/boneio.egg-info/requires.txt +0 -0
  452. {boneio-1.4.2 → boneio-1.4.3}/boneio.egg-info/top_level.txt +0 -0
  453. {boneio-1.4.2 → boneio-1.4.3}/pyproject.toml +0 -0
  454. {boneio-1.4.2 → boneio-1.4.3}/setup.cfg +0 -0
  455. {boneio-1.4.2 → boneio-1.4.3}/setup.py +0 -0
  456. {boneio-1.4.2 → boneio-1.4.3}/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.3
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
@@ -10,10 +10,11 @@ f2ed05c6f5934a15f12571139bdc225804f67b8c83561cc39868f7b2296d2697 docker/daemon.
10
10
  3db75f83033d82ca229e2d3bcb7daf4a5584f65b298d834bd0ee12527ae06e22 mosquitto/boneio.conf
11
11
  3fc86895f5fd3e59d2ee2d229ff7ff7c0030752f0c4eca0bb04314ea57ac0ede sudoers/boneio
12
12
  80e528c3a0e03a4d269bcb46db4224c8e5b6c75553b266cfc4f301b515ddcd95 systemd/boneio-oled-boot.service
13
- 9d4f46cfe6df36ee786b4b08fccc0a4dbe8161b82bdcb74f61cde45869e20ff9 systemd/boneio.service
13
+ df6cbd8ff2361a815917c3a24ca11ebb817fc98c9790833cb2475e0b9f4e9923 systemd/boneio-oled-shutdown.service
14
+ 455fe344a251e0162cdf26beff2a041c55340119de917675faafa06d573663c6 systemd/boneio.service
14
15
  5abbd8e37720f31d44ad59814c7ebbcfb5ae09ef32d83682dee6479f34270a31 systemd/set-hostname-once.service
15
16
  8eaea86c51a17c1bc7b68e9ea65a20b428577a0bc16793768f8dba575532e8ed usr-local-bin/set-hostname-once.sh
16
17
  3340abd637e15bb789e20f2e7de5d95dc45d8e427689e0c62312d044cd3ad86e usr-sbin/oled_boot_splash.py
17
18
  0537e194700c50d91295517e23bcccce9b23be740b93381dff35b510d562c6fe usr-sbin/oled_boot_splash.sh
18
- 700c812bcf192f8be079ae58fce45543c8f60d9a9c25ab149f8dd68786c717d7 usr-sbin/oled_msg.py
19
- e07152aae00b0d020ae69a69bfe2738a5f4b8768b62639516d85bbd2d808ba0a usr-sbin/oled_msg.sh
19
+ a95d897f49e1af2468b18a721731a6c679b3a0c54af4bb8338a5906f98898bdd usr-sbin/oled_msg.py
20
+ b30a474473c96ab973a442ea01bd197735a3d75f12d88129895488335bf5401c usr-sbin/oled_msg.sh
@@ -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
+ ]
@@ -0,0 +1,2 @@
1
+ # flake8: noqa
2
+ __version__ = "1.4.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.4.2
3
+ Version: 1.4.3
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
@@ -254,6 +254,7 @@ boneio/migrations/assets/journald/journald.conf
254
254
  boneio/migrations/assets/mosquitto/boneio.conf
255
255
  boneio/migrations/assets/sudoers/boneio
256
256
  boneio/migrations/assets/systemd/boneio-oled-boot.service
257
+ boneio/migrations/assets/systemd/boneio-oled-shutdown.service
257
258
  boneio/migrations/assets/systemd/boneio.service
258
259
  boneio/migrations/assets/systemd/set-hostname-once.service
259
260
  boneio/migrations/assets/usr-local-bin/set-hostname-once.sh
@@ -269,6 +270,7 @@ boneio/migrations/versions/v1_3_0_baseline.py
269
270
  boneio/migrations/versions/v1_3_1_fix_oled_boot.py
270
271
  boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py
271
272
  boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py
273
+ boneio/migrations/versions/v1_4_3_oled_shutdown.py
272
274
  boneio/modbus/__init__.py
273
275
  boneio/modbus/cli.py
274
276
  boneio/modbus/client.py
@@ -1,110 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Display a centered message on optional SH1106 OLED.
3
-
4
- This script is safe to call when no OLED is connected or dependencies are
5
- missing: it exits quietly with code 0.
6
- """
7
-
8
- from __future__ import annotations
9
-
10
- import sys
11
-
12
-
13
- def _fast_clear_oled() -> None:
14
- """Clear OLED display via raw I2C before slow luma init.
15
-
16
- On soft-reboot the SH1106 retains the previous image. Luma's sh1106()
17
- constructor takes ~9 seconds (device enumeration, contrast setup, etc.).
18
- This function clears the display in ~50ms using raw smbus2 writes,
19
- so the stale image disappears almost instantly at boot.
20
- """
21
- try:
22
- import smbus2
23
-
24
- bus = smbus2.SMBus(2)
25
- addr = 0x3C
26
- # SH1106 init: display on, set page addressing
27
- for cmd in [
28
- 0xAE,
29
- 0xD5,
30
- 0x80,
31
- 0xA8,
32
- 0x3F,
33
- 0xD3,
34
- 0x00,
35
- 0x40,
36
- 0xAD,
37
- 0x8B,
38
- 0xA1,
39
- 0xC8,
40
- 0xDA,
41
- 0x12,
42
- 0x81,
43
- 0xFF,
44
- 0xD9,
45
- 0x1F,
46
- 0xDB,
47
- 0x40,
48
- 0xA6,
49
- 0xAF,
50
- ]:
51
- bus.write_byte_data(addr, 0x00, cmd)
52
- # Clear all 8 pages (128 columns each)
53
- blank = [0x00] * 128
54
- for page in range(8):
55
- bus.write_byte_data(addr, 0x00, 0xB0 | page) # set page
56
- bus.write_byte_data(addr, 0x00, 0x02) # low col (offset 2 for SH1106)
57
- bus.write_byte_data(addr, 0x00, 0x10) # high col
58
- # Write in chunks of 32 (smbus limit)
59
- for i in range(0, 128, 32):
60
- bus.write_i2c_block_data(addr, 0x40, blank[i : i + 32])
61
- bus.close()
62
- except Exception:
63
- pass # No OLED or smbus2 not available — ignore
64
-
65
-
66
- def main(argv: list[str]) -> int:
67
- lines = [line[:24] for line in argv[1:5] if line]
68
- if not lines:
69
- return 0
70
-
71
- # Immediately clear stale OLED content (e.g. "has stopped" from previous session)
72
- _fast_clear_oled()
73
-
74
- try:
75
- from luma.core.error import DeviceNotFoundError
76
- from luma.core.interface.serial import i2c
77
- from luma.core.render import canvas
78
- from luma.oled.device import sh1106
79
- from PIL import ImageFont
80
- except Exception:
81
- return 0
82
-
83
- try:
84
- serial = i2c(port=2, address=0x3C)
85
- device = sh1106(serial)
86
- device.persist = True
87
- except (DeviceNotFoundError, OSError, Exception):
88
- return 0
89
-
90
- try:
91
- font = ImageFont.load_default()
92
- with canvas(device) as draw:
93
- if len(lines) == 1:
94
- positions = [(20, 26)]
95
- elif len(lines) == 2:
96
- positions = [(12, 20), (12, 36)]
97
- elif len(lines) == 3:
98
- positions = [(8, 12), (8, 28), (8, 44)]
99
- else:
100
- positions = [(4, 4), (4, 18), (4, 32), (4, 46)]
101
- for index, line in enumerate(lines):
102
- draw.text(positions[index], line, font=font, fill="white")
103
- except Exception:
104
- return 0
105
-
106
- return 0
107
-
108
-
109
- if __name__ == "__main__":
110
- raise SystemExit(main(sys.argv))
@@ -1,17 +0,0 @@
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
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- PYTHON_RENDERER="${SCRIPT_DIR}/oled_msg.py"
7
- VENV_PYTHON="/home/boneio/boneio/venv/bin/python3"
8
-
9
- if [ ! -f "${PYTHON_RENDERER}" ]; then
10
- exit 0
11
- fi
12
-
13
- if [ -x "${VENV_PYTHON}" ]; then
14
- "${VENV_PYTHON}" "${PYTHON_RENDERER}" "$@" 2>/dev/null || true
15
- elif command -v python3 >/dev/null 2>&1; then
16
- python3 "${PYTHON_RENDERER}" "$@" 2>/dev/null || true
17
- fi
@@ -1,2 +0,0 @@
1
- # flake8: noqa
2
- __version__ = "1.4.2"
File without changes
File without changes
File without changes
File without changes