collector: survive bluetoothd hangs and restarts

- every BlueZ call runs off the asyncio thread with a timeout; if bluetoothd
  stays unresponsive for 30 s the collector restarts bluetooth.service and
  exits for a clean re-registration
- Type=notify + WatchdogSec for buttontask-collector, never give up restarting
- bluetooth.service drop-in: Restart=always (BlueZ 5.55 crashes on assert/SEGV),
  installed by device-install.sh and OTA (bt-update)
- bt-service: bluez-restart action for the collector

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-10 07:10:02 +00:00
co-authored by Claude Opus 5.5
parent 588c2e0135
commit 115879ab67
10 changed files with 265 additions and 89 deletions
+10 -2
View File
@@ -2,9 +2,17 @@
Description=ButtonTask BLE Sensor Collector
After=bluetooth.service dbus.service
Wants=bluetooth.service
# Never give up restarting: the collector exits on purpose whenever
# bluetoothd restarts or hangs, to re-register GATT/advertising from scratch.
StartLimitIntervalSec=0
[Service]
Type=simple
# Type=notify + watchdog: the collector sends READY=1 after GATT start and
# WATCHDOG=1 every loop tick; a stuck event loop gets killed and restarted.
Type=notify
NotifyAccess=main
WatchdogSec=60
TimeoutStartSec=90
User=buttontask
Group=buttontask
SupplementaryGroups=bluetooth
@@ -12,7 +20,7 @@ WorkingDirectory=/opt/buttontask/current/collector
Environment=BUTTONTASK_ROOT=/opt/buttontask
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /opt/buttontask/current/collector/main.py
Restart=on-failure
Restart=always
RestartSec=3
[Install]