Ein einzelner Klick konnte den aktuellen Besetzer der Zentrale verdraengen.
Sitzt dort jemand anderes, kommt jetzt erst eine Rueckfrage, die die
betroffene Person nennt und sagt, was mit ihr passiert - je nach Lage
Rueckstellung auf das eigene Tuerschild, Vermerk als Stamm-Besetzer, oder
der Hinweis dass sie ohnehin dorthin gehoert. Ist die Zentrale frei, wird
ohne Rueckfrage besetzt.
Eine Rueckgabe zu erzwingen waere die naheliegende Alternative, wurde aber
bewusst nicht gebaut: wer abends ohne Freigabe nach Hause geht, wuerde die
Zentrale damit sperren. Am naechsten Morgen koennte niemand den Empfang
besetzen, weil der Vorgaenger nicht da ist um freizugeben. Genau diese
Sperre soll das Feature vermeiden.
Nebenbei eine Ungenauigkeit behoben: die Seite hat behauptet, der Besetzer
werde "auf das eigene Tuerschild zurueckgesetzt" - auch dann, wenn er gar
keines hat. Die drei Faelle werden jetzt unterschieden.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Zwei Handhabungsprobleme, die zusammengehoeren.
Auf /zentrale gab es ueberhaupt keinen Knopf zum Zurueckgeben - den fand
man nur ueber den Direktlink, den man nach einer Uebernahme in der Hand
hatte. Wer stattdessen /zentrale aufrief, konnte nur weiter uebernehmen
und sah nicht, dass erst zurueckgesetzt werden muss.
Ausserdem rendern die POST-Endpunkte ihr Ergebnis direkt. Man blieb also
auf /api/zentrale/uebernehmen stehen: eine Adresse, die beim Neuladen die
Aktion wiederholt und den Zustand nicht widerspiegelt.
Neu:
- Zwei Schritte. /zentrale fragt nur die Durchwahl ab und leitet auf
/zentrale/{durchwahl} um. Diese Zustandsseite ist die Adresse fuer den
Alltag, als Lesezeichen oder QR-Code, und ist gefahrlos neu ladbar.
- Die Knoepfe richten sich nach der Lage: frei -> besetzen, fremd besetzt
-> uebernehmen samt Hinweis was mit dieser Person passiert, selbst
besetzt -> zurueck auf mein Tuerschild, eigener Stammplatz -> kein
Knopf, nur der Hinweis dass nichts zu tun ist.
- Alle Aktionen antworten mit POST/Redirect/GET auf die Zustandsseite und
uebergeben nur einen kurzen Code fuer die Bestaetigung. Die Einzelheiten
- wer sitzt drauf, wer wartet, wer blockiert den Heimatplatz - leitet
die Seite bei jedem Aufruf frisch aus dem echten Zustand ab.
- Die allgemeine Seite nennt den aktuellen Besetzer und, falls vorhanden,
wer bei einer Freigabe automatisch zurueckkommt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bisher war das Logo fest im Repository verdrahtet. Damit hat ein Update
das Logo eines Kunden ueberschrieben - beim Sprung auf den modularen
Stand zum Beispiel von logo.svg auf die mitgelieferte logo.png.
Unter Einstellungen > Logo laesst sich jetzt ein eigenes Logo hochladen.
Es erscheint in der Seitenleiste, auf der Login-Seite und auf der
Zentrale-Seite, mit Vorschau auf hellem und dunklem Grund.
- Datei liegt unter static/custom/ und ist per .gitignore von der
Versionierung ausgenommen, ein git pull ueberschreibt sie also nicht
- PNG, JPG, SVG, WEBP, GIF bis 2 MB; Format und Groesse werden geprueft
- es bleibt immer genau eine Datei liegen, alte Endungen werden entfernt
- fehlt die Datei, greift automatisch das mitgelieferte Logo
- Upload und Zuruecksetzen liegen hinter dem Admin-Login
- logo_url() ist als Jinja-Global registriert, damit auch die Seiten ohne
_ctx() (Login, Zentrale) dasselbe Logo zeigen
.gitignore ergaenzt: static/custom/ sowie die bisher fehlenden
busylight.db-shm, busylight.db-wal und Status.csv - letztere lagen auf
dem Produktivsystem als untracked herum.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
"Zurueck auf mein Tuerschild" hat die Zentrale nur ausgeschaltet, statt
ihren eigentlichen Besetzer wieder darauf zu setzen. Wer normalerweise am
Empfang sitzt, blieb nach einer Vertretung ohne Zuordnung.
Die Zentrale hat jetzt einen Stamm-Besetzer, ohne dass es dafuer eine
eigene Einstellung braucht: wer beim ersten Verdraengen keinen anderen
Platz gemerkt hat, bekommt das Zentral-Segment als Heimatplatz vermerkt.
Wird die Zentrale wieder frei, kommt er automatisch zurueck - egal wie
viele Vertretungen sich zwischenzeitlich abgewechselt haben.
Der Vermerk des Stamm-Besetzers bleibt dabei dauerhaft stehen, anders als
bei einer Vertretung: die Zentrale ist sein normaler Platz, nicht eine
Station, aus der er zurueckkehrt. Klickt er selbst "zurueck auf mein
Tuerschild", aendert sich deshalb nichts und die Seite erklaert es.
Damit gilt in beide Richtungen dieselbe Regel: wird ein Platz frei, kommt
zurueck, fuer wen er gemerkt ist.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bisher blieb der bisherige Besetzer der Zentrale nach einer Uebernahme
ohne Zuordnung. In der Praxis heisst das: er hat gar kein Licht mehr, und
es musste immer erst jemand "zurueck auf mein Tuerschild" klicken, damit
der Zustand wieder stimmte.
Die Uebernahme setzt den Vorgaenger jetzt selbst auf seinen gemerkten
Heimatplatz zurueck. Ist der inzwischen jemand anderem zugeordnet oder
war keiner gemerkt, bleibt er ohne Zuordnung - die Meldung auf der Seite
nennt den jeweiligen Grund.
Dabei darf das eben freigegebene Segment des neuen Besetzers nicht
ausgeschaltet werden, wenn der Vorgaenger genau dorthin zurueckkehrt -
sonst waere sein Licht sofort wieder aus.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Das Busylight im Empfangsbereich wird wechselnd besetzt. Mitarbeiter
koennen sich jetzt selbst darauf setzen, ohne Admin-Passwort.
- Neue Seite /zentrale (Durchwahl eingeben) und /zentrale/{durchwahl}
als Direktlink fuer QR-Codes. Der Direktlink zeigt nur an und aendert
nichts, damit Link-Vorschau und Prefetch niemanden versetzen.
- Neue Tabelle home_assignments merkt das eigene Tuerschild, solange der
Mitarbeiter in der Zentrale sitzt. Beim Verlassen wird es
wiederhergestellt, das Zentral-Segment wird freigegeben.
- Der Vorgaenger bleibt ohne Zuordnung - er ist nicht da. Sein gemerkter
Heimatplatz bleibt erhalten, er kann jederzeit zurueckkehren.
- Ist der Heimatplatz inzwischen belegt, wird die Rueckkehr abgelehnt
und nichts geaendert.
- Eine ausdrueckliche Admin-Zuordnung verwirft den gemerkten Heimatplatz.
Ein reines Loeschen der Zuordnung nicht, sonst kaeme niemand mehr von
der Zentrale zurueck.
- Farbe wird sofort ans Geraet geschickt (scheduler.push_user_light).
Das Polling allein reicht nicht: _process_user sendet nur bei einer
Statusaenderung, und beim Platzwechsel bleibt der Status gleich.
- Neue Settings selfservice_device_id und selfservice_segment,
einstellbar unter Einstellungen.
- Jeder Wechsel landet im Protokoll (zentrale / zentrale_frei).
Die Durchwahl ist eine Kennung, kein Geheimnis - im README dokumentiert.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Alle AIDA-Referenzen durch generische Begriffe ersetzt
(aida -> attendance im Code, "Zeiterfassung" im UI)
- DB-Spalten: last_aida_status -> last_attendance_status
- Settings: aida_csv_path -> attendance_csv_path
- REST API fuer Zeiterfassung auf Port 8081:
POST /api/attendance/{personal_nr} mit {"status": "anwesend"}
GET /api/attendance - alle Status abfragen
- Automatische DB-Migration fuer bestehende Installationen
- CSV bleibt als Option, API als Echtzeit-Alternative
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Device-Code-Flow direkt ueber das Web-Interface starten statt
ueber die Kommandozeile. Button "Mit Azure verbinden" in den
Einstellungen zeigt Code und Link an, pollt den Status und
laedt die Seite nach Erfolg neu.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Card per device showing: hostname, MAC, version, LEDs, segments
- Segment assignments displayed per card
- Last activity timestamp
- Online/offline dot in card header
- Action buttons in card footer
- Add device + firmware upload side by side at bottom
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dashboard:
- Much smaller cards (col-xl-2), compact badges
- Short labels (Buero, HO, DND, OoO, etc.)
- Optimized for small screens
Login:
- Password-protected admin pages (all except dashboard)
- Dashboard remains public (read-only status view)
- Login page with redirect back to requested page
- Session cookie (24h, regenerated on restart)
- Password set via Settings page (SHA256 hashed)
- Sidebar shows only Dashboard when not logged in
- Login/Logout link in sidebar footer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Upload .bin firmware files via web UI
- Update individual devices (button per device in table)
- Auto config backup before each update
- Shows current version vs available firmware
- Firmware file management (upload/delete)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Auto WLED config backup daily at 02:05 (keeps last 14 per device)
- Backup page: WLED configs grouped by hostname in accordion
- Each device shows backup count and last backup date
- Collapsible sections to keep page compact
- Readable date format (dd.mm.yyyy HH:MM:SS) for all backups
- Scrollable containers for long lists
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Portal DB:
- Download current DB button
- Manual backup creation
- Auto-backup daily at 02:00 (keeps last 14)
- Download/delete individual backups
WLED Config:
- Backup all devices at once
- Backup individual device
- Download config as JSON
- Restore config to any device
- Delete old backups
New sidebar menu item 'Backup' with dedicated page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New webhook server on port 8081 for phone system (PBX)
- Endpoints: GET/POST /{extension}/callstart and /{extension}/callend
- New 'phone_extension' field on users (Durchwahl)
- Only activates when user is anwesend or homeoffice (AIDA)
- Sets WLED to phone_active color (red) on callstart
- Restores previous Teams/AIDA color on callend
- Polling skips WLED update while phone is active
- Dashboard shows phone badge when user is in a call
- New color rule 'phone_active' (configurable via web UI)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Query WLED JSON API (/json/info) for device info
- Show online/offline status dot, LED count and firmware version
- Auto-check all devices on page load
- Button to manually check individual or all devices
- Fix hostname placeholder to volksheimstaette.de
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the standalone Python script + config.cfg with a full web
application featuring:
- FastAPI backend with REST API
- SQLite database (config, state, activity log separated)
- Bootstrap 5 web interface for configuration
- Pages: Dashboard, Users, Devices, Assignments, Color Rules, Settings, Log
- APScheduler background polling for Teams presence + AIDA status
- systemd service file for Linux deployment
- Migration script to import existing config.cfg data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>