# Busylight WLED Controller Web-Anwendung zur Steuerung von WLED-Busylights basierend auf Microsoft Teams Presence-Status und AIDA-Zeiterfassung. Jedes WLED-Gerät verfügt über zwei Segmente (oben/unten), die jeweils einem Benutzer zugeordnet werden. Die Farbe des Segments wird automatisch anhand des Anwesenheitsstatus (AIDA) und des Teams-Status gesetzt. ## Features - **Dashboard** mit Echtzeit-Übersicht aller Busylights und deren aktuellem Status - **Benutzer-Verwaltung** mit automatischem Sync aus Azure AD - **WLED-Geräte** hinzufügen, bearbeiten und entfernen - **Zuordnung** von Benutzern zu WLED-Segmenten per Dropdown (statt UUID-Mapping in einer Config-Datei) - **Farb-Regeln** mit Color-Picker für jeden Teams-/Anwesenheitsstatus - **Einstellungen** für Azure AD, Polling-Intervall und AIDA-CSV-Pfad - **Protokoll** der letzten Statusänderungen ## Voraussetzungen - Python 3.10+ - Netzwerkzugriff auf die WLED-Geräte (HTTP) - Azure AD App-Registrierung mit folgenden Berechtigungen: - `User.Read`, `User.Read.All`, `Presence.Read`, `Presence.Read.All` - Zugriff auf die AIDA-Zeiterfassungs-CSV (lokal oder per SMB-Mount) ## Installation ```bash # Repository klonen git clone https://git.cynfo.net/christian/busylight.git /opt/busylight cd /opt/busylight # Python Virtual Environment erstellen python3 -m venv venv source venv/bin/activate # Abhängigkeiten installieren pip install -r requirements.txt ``` ## Migration von der alten config.cfg Falls das System vorher mit dem alten Python-Script und `config.cfg` betrieben wurde, können alle Daten (User, Geräte, Segmente, Farben, Azure-Credentials) automatisch importiert werden: ```bash # config.cfg ins Projektverzeichnis kopieren cp /pfad/zur/alten/config.cfg . # Migration ausführen python migrate.py ``` Die alte `config.cfg` wird danach nicht mehr benötigt. ## Azure Authentifizierung Die Authentifizierung gegen Microsoft Graph erfolgt einmalig über den Device-Code-Flow im Terminal: ```bash source venv/bin/activate python app.py --auth ``` Es wird ein Code angezeigt, der unter https://microsoft.com/devicelogin eingegeben werden muss. Nach erfolgreicher Anmeldung wird das Token in der Datenbank gespeichert und automatisch erneuert. ## AIDA-CSV auf Linux bereitstellen Die Zeiterfassungs-CSV liegt typischerweise auf einem Windows-Server. Für den Zugriff von Linux gibt es mehrere Möglichkeiten: ### Option A: SMB/CIFS-Mount (empfohlen) ```bash # Paket installieren sudo apt install cifs-utils # Mount-Punkt erstellen sudo mkdir -p /mnt/zeiterfassung # Eintrag in /etc/fstab # //SERVERNAME/Zeiterfassung /mnt/zeiterfassung cifs credentials=/etc/samba/creds,uid=busylight,gid=busylight,ro 0 0 # Credentials-Datei erstellen sudo bash -c 'cat > /etc/samba/creds << EOF username=DOMAIN\user password=geheim EOF' sudo chmod 600 /etc/samba/creds # Mounten sudo mount /mnt/zeiterfassung ``` In den Web-Einstellungen dann als CSV-Pfad eintragen: ``` /mnt/zeiterfassung/Aida/profiles/aida/Transfer/Export/Status.csv ``` ### Option B: Regelmäßiger Kopiervorgang Per Cronjob die CSV regelmäßig auf den Linux-Server kopieren (z.B. via `scp` oder `rsync`). ## Starten ### Manuell (zum Testen) ```bash source venv/bin/activate python app.py ``` Die Web-Oberfläche ist dann erreichbar unter: **http://localhost:8080** ### Als systemd-Service (Produktivbetrieb) ```bash # Service-User anlegen sudo useradd -r -s /usr/sbin/nologin busylight sudo chown -R busylight:busylight /opt/busylight # Service installieren sudo cp busylight.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now busylight # Status prüfen sudo systemctl status busylight # Logs anzeigen sudo journalctl -u busylight -f ``` ## Benutzung ### 1. Einstellungen konfigurieren Unter **Einstellungen** die Azure AD Credentials (Client ID, Client Secret, Tenant ID) und den CSV-Pfad eintragen. ### 2. Benutzer synchronisieren Unter **Benutzer** auf „Aus Azure synchronisieren" klicken. Alle Azure AD Benutzer werden importiert. Anschließend: - Benutzer aktivieren/deaktivieren (nur aktive Benutzer werden abgefragt) - AIDA-Personalnummer zuordnen (Format: `~~00341~~`) ### 3. WLED-Geräte anlegen Unter **WLED-Geräte** die Hostnamen/IP-Adressen der WLED-Busylights eintragen und die Anzahl der Segmente festlegen (Standard: 2). ### 4. Zuordnungen erstellen Unter **Zuordnungen** jeden aktiven Benutzer einem WLED-Gerät und Segment zuweisen: - Segment 0 = oben - Segment 1 = unten ### 5. Farben anpassen Unter **Farb-Regeln** die Farben für jeden Status per Color-Picker anpassen: | Status | Beschreibung | |--------|-------------| | `abwesend` | Benutzer laut AIDA nicht anwesend | | `homeoffice` | Benutzer im Homeoffice | | `teams_available` | Teams: Verfügbar | | `teams_busy` | Teams: Beschäftigt | | `teams_donotdisturb` | Teams: Nicht stören | | `teams_inacall` | Teams: In einem Anruf | | `teams_inameeting` | Teams: In einer Besprechung | | `teams_presenting` | Teams: Präsentiert | | `teams_away` | Teams: Abwesend | | `teams_offline` | Teams: Offline | ### 6. Dashboard Das **Dashboard** zeigt alle Busylights mit dem aktuellen Status in Echtzeit an und aktualisiert sich automatisch alle 10 Sekunden. ### 7. Protokoll Unter **Protokoll** werden die letzten 200 Statusänderungen mit Zeitstempel, WLED-URL und Ergebnis angezeigt. ## Projektstruktur ``` busylight/ ├── app.py # FastAPI Web-Anwendung + CLI Auth ├── database.py # SQLite Datenbank-Schema und Hilfsfunktionen ├── graph_client.py # Microsoft Graph API Client ├── wled_client.py # WLED HTTP API Client ├── scheduler.py # Hintergrund-Polling (AIDA + Teams → WLED) ├── migrate.py # Import aus alter config.cfg ├── requirements.txt # Python-Abhängigkeiten ├── busylight.service # systemd Service-Datei ├── static/ │ └── style.css # CSS Styles └── templates/ ├── base.html # Basis-Layout mit Sidebar ├── dashboard.html # Status-Übersicht ├── users.html # Benutzer-Verwaltung ├── devices.html # WLED-Geräte-Verwaltung ├── assignments.html # Zuordnungen User → Segment ├── colors.html # Farb-Regeln ├── settings.html # Einstellungen └── log.html # Aktivitäts-Protokoll ``` ## Ports und Firewall | Port | Richtung | Zweck | |------|----------|-------| | 8080/tcp | Eingehend | Web-Oberfläche | | 80/tcp | Ausgehend | WLED HTTP API | | 443/tcp | Ausgehend | Microsoft Graph API |