Make lifepo4wered-daemon the primary process in run.sh

The daemon must contact the UPS within PI_BOOT_TO seconds of power-on
or the UPS cuts power. Start it immediately via exec as the container's
main process; run the MQTT monitor in a background loop with 30s restart
backoff so Supervisor API delays or monitor crashes can never delay or
kill the daemon.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
vaku
2026-07-18 01:18:46 +03:00
parent 25b3e2dcc4
commit 952fc24e90
2 changed files with 49 additions and 31 deletions

View File

@@ -45,10 +45,14 @@ present and one subprocess call reads everything at once.
- Dockerfile: add `python3` + `py3-paho-mqtt` (Alpine packages), copy script - Dockerfile: add `python3` + `py3-paho-mqtt` (Alpine packages), copy script
and `run.sh`, `CMD ["/run.sh"]`. and `run.sh`, `CMD ["/run.sh"]`.
- `run.sh` (bashio): pull MQTT host/port/user/password from Supervisor - `run.sh` (bashio): `lifepo4wered-daemon -f` is the exec'd main process,
services API (works out of the box with the Mosquitto addon), allow started immediately — it must contact the UPS within PI_BOOT_TO seconds of
overrides from addon options, start `lifepo4wered-daemon -f` in the power-on or the UPS cuts power, so nothing (Supervisor API calls included)
background, run the monitor in the foreground. may delay it and monitor failures must never take it down. The monitor runs
in a background subshell that pulls MQTT host/port/user/password from the
Supervisor services API (works out of the box with the Mosquitto addon,
addon options can override) and restarts the monitor with 30 s backoff if
it exits.
- `config.json`: add `"services": ["mqtt:need"]`, addon options - `config.json`: add `"services": ["mqtt:need"]`, addon options
(`poll_interval`, optional MQTT overrides), bump version. (`poll_interval`, optional MQTT overrides), bump version.

View File

@@ -1,10 +1,16 @@
#!/usr/bin/with-contenv bashio #!/usr/bin/with-contenv bashio
export POLL_INTERVAL="$(bashio::config 'poll_interval')" # The daemon must contact the UPS within PI_BOOT_TO seconds of power-on,
# otherwise the UPS assumes the boot failed and cuts power. It is therefore
# the main process, started before any MQTT/Supervisor API calls, and the
# monitor runs on the side where its failures can never take the daemon down.
# Manual MQTT settings from addon options win; otherwise use the broker setup_mqtt_env() {
# provided by the Supervisor (e.g. the Mosquitto addon). export POLL_INTERVAL="$(bashio::config 'poll_interval')"
if bashio::config.has_value 'mqtt_host'; then
# Manual MQTT settings from addon options win; otherwise use the broker
# provided by the Supervisor (e.g. the Mosquitto addon).
if bashio::config.has_value 'mqtt_host'; then
export MQTT_HOST="$(bashio::config 'mqtt_host')" export MQTT_HOST="$(bashio::config 'mqtt_host')"
if bashio::config.has_value 'mqtt_port'; then if bashio::config.has_value 'mqtt_port'; then
export MQTT_PORT="$(bashio::config 'mqtt_port')" export MQTT_PORT="$(bashio::config 'mqtt_port')"
@@ -15,19 +21,27 @@ if bashio::config.has_value 'mqtt_host'; then
if bashio::config.has_value 'mqtt_password'; then if bashio::config.has_value 'mqtt_password'; then
export MQTT_PASSWORD="$(bashio::config 'mqtt_password')" export MQTT_PASSWORD="$(bashio::config 'mqtt_password')"
fi fi
elif bashio::services.available "mqtt"; then elif bashio::services.available "mqtt"; then
export MQTT_HOST="$(bashio::services mqtt 'host')" export MQTT_HOST="$(bashio::services mqtt 'host')"
export MQTT_PORT="$(bashio::services mqtt 'port')" export MQTT_PORT="$(bashio::services mqtt 'port')"
export MQTT_USER="$(bashio::services mqtt 'username')" export MQTT_USER="$(bashio::services mqtt 'username')"
export MQTT_PASSWORD="$(bashio::services mqtt 'password')" export MQTT_PASSWORD="$(bashio::services mqtt 'password')"
else else
bashio::log.warning \ bashio::log.warning \
"No MQTT broker configured and no mqtt service available;" \ "No MQTT broker configured and no mqtt service available;" \
"trying localhost:1883" "trying localhost:1883"
fi fi
}
(
setup_mqtt_env
bashio::log.info "Starting MQTT monitor (poll interval: ${POLL_INTERVAL}s)"
while true; do
python3 /usr/bin/lifepo4wered_monitor.py || true
bashio::log.warning "MQTT monitor exited; restarting in 30s"
sleep 30
done
) &
bashio::log.info "Starting lifepo4wered-daemon" bashio::log.info "Starting lifepo4wered-daemon"
lifepo4wered-daemon -f & exec lifepo4wered-daemon -f
bashio::log.info "Starting MQTT monitor (poll interval: ${POLL_INTERVAL}s)"
exec python3 /usr/bin/lifepo4wered_monitor.py