Changes include:

Features

Neighbour details modal with full info and map view

WebSocket support with heartbeat and automatic reconnection

Improved signal quality calculations (SNR-based RSSI)

Route-based pagination for faster initial loads

UI

Mobile sidebar tweaks (logout, version info, lazy-loaded charts)

Sorting added to the neighbour table

Packet view now shows multi-hop paths

CAD calibration charts respect light/dark themes

Statistics charts now show the full requested time range

Performance

Reduced polling when WebSocket is active

Lazy loading for heavier components

Noise floor data capped to keep charts responsive

Technical

Improved type safety across API responses

Contrast improvements for accessibility

Cleaner WebSocket and MQTT reconnection handling

Additional metrics added to heartbeat stats

Bug fixes

Corrected noise floor history query

Fixed authentication for CAD calibration streams

Nothing major required from users — just update and carry on.
As always, shout if something looks off.
This commit is contained in:
Lloyd
2026-01-18 20:15:50 +00:00
parent 5bdea1132c
commit 599e4628d9
46 changed files with 4559 additions and 4237 deletions
+15 -6
View File
@@ -766,22 +766,31 @@ class SQLiteHandler:
logger.error(f"Failed to get neighbors: {e}")
return {}
def get_noise_floor_history(self, hours: int = 24) -> list:
def get_noise_floor_history(self, hours: int = 24, limit: int = None) -> list:
try:
cutoff = time.time() - (hours * 3600)
with sqlite3.connect(self.sqlite_path) as conn:
conn.row_factory = sqlite3.Row
measurements = conn.execute("""
# Build query with optional limit
query = """
SELECT timestamp, noise_floor_dbm
FROM noise_floor
WHERE timestamp > ?
ORDER BY timestamp ASC
""", (cutoff,)).fetchall()
ORDER BY timestamp DESC
"""
return [{"timestamp": row["timestamp"], "noise_floor_dbm": row["noise_floor_dbm"]}
for row in measurements]
if limit:
query += f" LIMIT {int(limit)}"
measurements = conn.execute(query, (cutoff,)).fetchall()
# Reverse to get chronological order (oldest to newest)
result = [{"timestamp": row["timestamp"], "noise_floor_dbm": row["noise_floor_dbm"]}
for row in reversed(measurements)]
return result
except Exception as e:
logger.error(f"Failed to get noise floor history: {e}")