Nach dem Release von 4.82 und den Diskussionen mit @pierre-gilles über die Leistung der neuen Aktivitätsansicht auf etwas größeren Installationen (zumindest wie meiner), hier der Bericht zur PR #2647, getestet auf meiner Datenbank mit 448 Millionen Zuständen.
Das Problem
Bei einer großen Datenbank erzwingt das Filtern der Aktivität nach einer sparsamen Kategorie (z. B. „Öffnungen“: wenige, alte Zustände), dass der Server einen großen Teil des Historienscans durchführen muss, bevor er antwortet: Der Server antwortet erst, wenn seine Seite mit 80 Zuständen gefüllt ist, unabhängig von der zu durchsuchenden Tiefe. Ergebnis: Ein eingefrorener Spinner für 20 bis 50 Sekunden, manchmal 3 Minuten.
Wir haben alle „Server-only“-Lösungen systematisch gemessen (progressive Fenster, Anker auf der letzten Aktivität — danke @pierre-gilles für die #2642 —, disjunkte Abschnitte, physische Kompaktierung der Tabelle): Jede verbessert, aber keine beseitigt die Mauer — die Mindestkosten sind die Scanrate von DuckDB multipliziert mit dem zu durchsuchenden Volumen.
Die Lösung: Dem Client die Steuerung der Suche überlassen
- Server:
getDeviceStatesHistoryakzeptiert eine Grenzesince→ eine Abfrage = ein zeitlich begrenztes Fenster, das zurückgibt, was es enthält (auch wenn es weniger als 80 sind) und sich nie erweitert. Ein begrenztes Fenster antwortet in Millisekunden dank der DuckDB-Zonenkarten. Ohnesincebleibt das Verhalten streng unverändert (rückwärtskompatibel). - Frontend: Die Aktivitätsansicht sondiert 1 → 2 → 4 → 8 → 16 → 32 Monate, dann eine letzte unbegrenzte Abfrage, zeigt jeden Satz sofort an, sobald er eintrifft, mit einem Banner „Aktivitäten suchen — März 2025…“ während ältere Fenster im Hintergrund sondiert werden.
Die Messungen (448 M Zustände)
| Fall | Vorher | Nachher |
|---|---|---|
| Filter „Öffnungen“ (wenige, alte Zustände) | 20 bis 33 s eingefrorener Spinner | Erste Zustände in ~100 ms, die Seite füllt sich im Hintergrund |
| Filter „Knöpfe“ (Zustände nach 17 Monaten) | 22 bis 51 s | Sofortiges Banner, das den gescannten Monat anzeigt, Zustände, sobald sie gefunden werden |
| Ansicht „Alles“ / Live / redselige Sensoren | ~100 ms | Unverändert (~100 ms) |
Die Gesamtarbeit im schlimmsten Fall ändert sich nicht — aber sie wird hinter einer bereits nutzbaren Seite durchgeführt, anstatt die erste Anzeige zu blockieren. Das ist das Prinzip des Home Assistant Logbooks, angepasst an die Gladys-API.
Die PR ist bereit für die Überprüfung. Sie betrifft weder das Datenmodell noch die Aggregationen — es ist reine Aufteilung der Abfragen.

