From 80fc79709a1e43264e258b0520f3058a2e9cd9de Mon Sep 17 00:00:00 2001 From: Cobra Date: Fri, 10 Apr 2026 14:21:50 -0400 Subject: [PATCH] Add presence DB schema; fix BLE passive scan mode (bleak #1440) --- net_alerter/ble_alerter.py | 4 ++-- net_alerter/presence_schema.sql | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 net_alerter/presence_schema.sql diff --git a/net_alerter/ble_alerter.py b/net_alerter/ble_alerter.py index 0e52a56..33e7569 100755 --- a/net_alerter/ble_alerter.py +++ b/net_alerter/ble_alerter.py @@ -274,8 +274,8 @@ async def scan_loop(): await on_arrival(name, mac, rssi) - # Active scanner — explicitly required; bleak 0.20 BlueZ backend defaults to passive - async with BleakScanner(detection_callback=detection_callback, scanning_mode="active") as scanner: + # Passive scanner — required to avoid corrupting BLE 0x004C manufacturer_data (bleak #1440) + async with BleakScanner(detection_callback=detection_callback, scanning_mode="passive") as scanner: try: while not shutdown_event.is_set(): await asyncio.sleep(1) diff --git a/net_alerter/presence_schema.sql b/net_alerter/presence_schema.sql new file mode 100644 index 0000000..f4dce1d --- /dev/null +++ b/net_alerter/presence_schema.sql @@ -0,0 +1,38 @@ +-- Presence intelligence schema — Phase 1 (WiFi-only) +-- Load with: sqlite3 presence.db < presence_schema.sql + +PRAGMA journal_mode=WAL; + +CREATE TABLE IF NOT EXISTS persons ( + mac TEXT PRIMARY KEY, + hostname TEXT, + vendor TEXT, + first_seen REAL NOT NULL, + last_seen REAL NOT NULL, + state TEXT NOT NULL DEFAULT 'ABSENT', + certainty REAL NOT NULL DEFAULT 0.0, + session_count INTEGER NOT NULL DEFAULT 1, + total_minutes REAL NOT NULL DEFAULT 0.0 +); + +CREATE TABLE IF NOT EXISTS signals ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + mac TEXT NOT NULL, + signal_type TEXT NOT NULL, -- mdns | arp + certainty REAL NOT NULL, + observed_at REAL NOT NULL +); + +CREATE TABLE IF NOT EXISTS events ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + mac TEXT NOT NULL, + hostname TEXT, + event_type TEXT NOT NULL, -- arrived | departed | updated + certainty REAL NOT NULL, + timestamp REAL NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_signals_mac ON signals(mac); +CREATE INDEX IF NOT EXISTS idx_signals_mac_time ON signals(mac, observed_at); +CREATE INDEX IF NOT EXISTS idx_events_mac ON events(mac); +CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);