Web-based DALI lighting controller with multi-hardware support, REST API, SSE and multi-room dashboa
1.0K
DALI ServUI is a web-based controller for DALI lighting installations with multi-hardware support, REST API, server-sent events and a multi-room dashboard.
Self-hosted, runs as a Docker container or natively as a systemd service on a Raspberry Pi (or any Linux host).
Use of DALI ServUI is at your own risk. The author accepts no liability for personal injury, property damage or financial loss resulting from the use of this software.
DALI ServUI controls electrical lighting installations. Installation, wiring and commissioning of the DALI bus system – in particular all work on the mains-voltage side of the control gear – must only be carried out by qualified, trained personnel (a licensed electrician). Applicable national regulations (e. g. IEC 60364, BS 7671, NEC) must be observed.
X-API-Token protection,
CORS-enabled, ideal for Home Assistant/api/v1/events) for level, group
and scan updatesGET /healthz (auth-free) for container
healthchecksinstall.sh)| Driver | Hardware | Connection | Library | Status |
|---|---|---|---|---|
hasseb | Hasseb USB DALI Master | USB-HID | hidapi | production |
mikroe_gpio | MikroE DALI Click / DALI 2 Click | Raspberry Pi GPIO | gpiod | coming soon |
mikroe_ftdi | MikroE DALI Click / DALI 2 Click | Click USB Adapter (FT2232H) | pyftdi | coming soon |
dryrun | Test mode (no hardware) | – | – | production |
The MikroE drivers are visible in the UI with a Coming Soon stamp. The Python dependencies
gpiodandpyftdiare commented out inrequirements.txtand must be installed manually before activating.
git clone https://github.com/c42u/dali-servui.git
cd dali-servui/Code
sudo ./install.sh install
sudo systemctl start dali-servui
Web UI: http://<host-ip>:5000
The pre-built image is available on Docker Hub as
c42u/dali-servui
(multi-arch: amd64 + arm64):
docker pull c42u/dali-servui:latest
Minimal compose.yaml:
services:
dali-servui:
image: c42u/dali-servui:latest
container_name: dali-servui
restart: unless-stopped
devices:
- /dev/hidraw0:/dev/hidraw0 # Hasseb USB DALI Master
volumes:
- dali-data:/app/data
ports:
- "5000:5000"
environment:
DALI_HOST: 0.0.0.0
DALI_PORT: 5000
DALI_LANG: de
# DALI_API_TOKEN: my-secret-token
volumes:
dali-data:
cd dali-servui/Docker
docker compose up -d
The container maps /dev/hidraw0 for the Hasseb USB DALI Master by
default. Adjust the path in docker-compose.yml if needed.
| Variable | Default | Description |
|---|---|---|
DALI_HOST | 0.0.0.0 | Bind address |
DALI_PORT | 5000 | TCP port |
DALI_DRIVER | (empty) | Initial driver (hasseb, mikroe_gpio, mikroe_ftdi, dryrun) |
DALI_LANG | de | UI language (de or en) |
DALI_API_TOKEN | (empty) | Optional API token. Empty = no auth |
DALI_CORS_ORIGINS | (empty) | Comma-separated origin list (* allowed but not default) |
DALI_SECRET_KEY | (empty) | Flask secret. Empty → generated in data/secret_key (0600) |
DALI_DATA_DIR | ./data | Path for driver_config.json, labels.json, devices.json, dashboards.json |
DALI_LOG_LEVEL | INFO | Log level |
DALI_LOG_FILE | (empty) | Optional log file path |
DALI_DEBUG | false | Flask debug mode |
| Method | Endpoint | Description |
|---|---|---|
| GET | /healthz | Container healthcheck (auth-free) |
| GET | /api/v1/status | Service status |
| GET | /api/v1/events | SSE stream (real-time events) |
| GET | /api/v1/devices | All devices |
| POST | /api/v1/devices/{addr}/level | Set brightness |
| POST | /api/v1/devices/{addr}/on / /off | Turn on / off |
| GET | /api/v1/groups | Groups with members and level |
| POST | /api/v1/groups/{g}/on / /off / /level | Group control |
| GET/POST/PUT/DELETE | /api/v1/dashboards[…] | Dashboard CRUD |
| POST | /api/v1/scan | Start bus scan |
| POST | /api/v1/commission | Commissioning |
Full API documentation in the integrated help page (/help) and in
Dokumentation/DALI_ServUI_Dokumentation_v1.0.0.md.
DALI_API_TOKEN for the REST API (header X-API-Token or
?token=… for SSE)SECRET_KEY in data/secret_key (mode 0600), generated
automaticallyX-Frame-Options: DENY, X-Content-Type-Options: nosniff,
Referrer-Policy: same-originNoNewPrivileges, ProtectSystem,
ProtectHome, ReadWritePaths, PrivateTmp)/dev/hidraw0)
instead of privileged: trueDALI ServUI is developed with the assistance of Claude Code (Claude by Anthropic), an AI coding assistant used directly in the terminal.
How AI is used in this project:
What the AI does not do:
The software is provided "as is" without warranty. Use at your own risk.
DALI ServUI ist ein web-basierter Controller für DALI-Beleuchtungsanlagen mit Multi-Hardware-Support, REST-API, Server-Sent-Events und Multi-Raum- Dashboard.
Self-hosted, läuft als Docker-Container oder nativ als systemd-Service auf einem Raspberry Pi (oder beliebigem Linux-Host).
Die Nutzung von DALI ServUI erfolgt auf eigene Gefahr. Der Autor übernimmt keine Haftung für Personen-, Sach- oder Vermögensschäden, die durch den Einsatz dieser Software entstehen.
DALI ServUI steuert elektrische Beleuchtungsanlagen. Die Installation, Verkabelung und Inbetriebnahme des DALI-Bus-Systems – insbesondere alle Arbeiten an der Netzspannungsseite der Vorschaltgeräte – sind ausschließlich durch fachkundiges, ausgebildetes Personal (Elektrofachkraft) durchzuführen. Die jeweils geltenden nationalen Vorschriften (z. B. DIN VDE 0100, ÖVE/ÖNORM E 8001, NIN) sind zu beachten.
X-API-Token-Schutz, CORS-fähig, ideal für Home Assistant/api/v1/events) für Level-,
Gruppen- und Scan-UpdatesGET /healthz (auth-frei) für
Container-Healthchecksinstall.sh)| Treiber | Hardware | Anschluss | Bibliothek | Status |
|---|---|---|---|---|
hasseb | Hasseb USB DALI Master | USB-HID | hidapi | produktiv |
mikroe_gpio | MikroE DALI Click / DALI 2 Click | Raspberry Pi GPIO | gpiod | in Vorbereitung |
mikroe_ftdi | MikroE DALI Click / DALI 2 Click | Click USB Adapter (FT2232H) | pyftdi | in Vorbereitung |
dryrun | Testmodus (ohne Hardware) | – | – | produktiv |
Die MikroE-Treiber sind im UI sichtbar mit Coming-Soon-Stempel. Die Python-Abhängigkeiten
gpiodundpyftdisind inrequirements.txtauskommentiert und müssen vor dem Aktivieren manuell installiert werden.
git clone https://github.com/c42u/dali-servui.git
cd dali-servui/Code
sudo ./install.sh install
sudo systemctl start dali-servui
Web-UI: http://<host-ip>:5000
Das vorgebaute Image liegt auf Docker Hub als
c42u/dali-servui
(multi-arch: amd64 + arm64):
docker pull c42u/dali-servui:latest
Minimale compose.yaml:
services:
dali-servui:
image: c42u/dali-servui:latest
container_name: dali-servui
restart: unless-stopped
devices:
- /dev/hidraw0:/dev/hidraw0 # Hasseb USB DALI Master
volumes:
- dali-data:/app/data
ports:
- "5000:5000"
environment:
DALI_HOST: 0.0.0.0
DALI_PORT: 5000
DALI_LANG: de
# DALI_API_TOKEN: mein-geheimer-token
volumes:
dali-data:
cd dali-servui/Docker
docker compose up -d
Der Container mappt standardmäßig /dev/hidraw0 für den Hasseb USB
DALI Master. Pfad ggf. in docker-compose.yml anpassen.
| Variable | Default | Beschreibung |
|---|---|---|
DALI_HOST | 0.0.0.0 | Bind-Adresse |
DALI_PORT | 5000 | TCP-Port |
DALI_DRIVER | (leer) | Initialer Treiber (hasseb, mikroe_gpio, mikroe_ftdi, dryrun) |
DALI_LANG | de | UI-Sprache (de oder en) |
DALI_API_TOKEN | (leer) | Optionaler API-Token. Leer = kein Auth |
DALI_CORS_ORIGINS | (leer) | Komma-getrennte Origin-Liste (* möglich, aber nicht Default) |
DALI_SECRET_KEY | (leer) | Flask-Secret. Leer → wird in data/secret_key (0600) generiert |
DALI_DATA_DIR | ./data | Pfad für driver_config.json, labels.json, devices.json, dashboards.json |
DALI_LOG_LEVEL | INFO | Log-Level |
DALI_LOG_FILE | (leer) | Optionaler Datei-Pfad für Logs |
DALI_DEBUG | false | Flask-Debug-Modus |
| Methode | Endpunkt | Beschreibung |
|---|---|---|
| GET | /healthz | Container-Healthcheck (auth-frei) |
| GET | /api/v1/status | Service-Status |
| GET | /api/v1/events | SSE-Stream (Echtzeit-Events) |
| GET | /api/v1/devices | Alle Geräte |
| POST | /api/v1/devices/{addr}/level | Helligkeit setzen |
| POST | /api/v1/devices/{addr}/on / /off | Ein-/Ausschalten |
| GET | /api/v1/groups | Gruppen mit Mitgliedern und Level |
| POST | /api/v1/groups/{g}/on / /off / /level | Gruppen-Steuerung |
| GET/POST/PUT/DELETE | /api/v1/dashboards[…] | Dashboard-CRUD |
| POST | /api/v1/scan | Bus-Scan starten |
| POST | /api/v1/commission | Commissioning |
Vollständige API-Dokumentation in der integrierten Hilfe-Seite (/help)
und in Dokumentation/DALI_ServUI_Dokumentation_v1.0.0.md.
DALI_API_TOKEN für die REST-API (Header X-API-Token
oder ?token=… für SSE)SECRET_KEY in data/secret_key (Modus 0600),
automatisch generiertX-Frame-Options: DENY, X-Content-Type-Options: nosniff,
Referrer-Policy: same-originNoNewPrivileges, ProtectSystem,
ProtectHome, ReadWritePaths, PrivateTmp)/dev/hidraw0) statt privileged: trueDALI ServUI wird unter Einsatz von Claude Code (Claude von Anthropic), einem KI-Coding-Assistenten direkt im Terminal, entwickelt.
Wie KI in diesem Projekt eingesetzt wird:
Was die KI nicht tut:
Die Software wird "wie besehen" ohne jegliche Gewährleistung bereitgestellt. Nutzung auf eigene Gefahr.
Betreiber: Carsten Zucker, c/o IP-Management #9060, Ludwig-Erhard-Straße 18, 20459 Hamburg
Kontakt: E-Mail: DALI-ServUI[at]c42u.de
USt-ID: DE309146063
Externe Links Diese Website enthält Verknüpfungen zu Websites Dritter ("externe Links"). Diese Websites unterliegen der Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.
Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV: Carsten Zucker
Haftung für Inhalte
Die Inhalte dieser Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte kann jedoch keine Gewähr übernommen werden. Als Diensteanbieter bin ich gemäß § 7 Abs. 1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach Art. 4 bis 6 der Verordnung (EU) 2022/2065 (Digital Services Act) bin ich als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werde ich diese Inhalte umgehend entfernen.
Datenschutz https://docs.github.com/de/site-policy/privacy-policies/github-general-privacy-statement
Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.
Content type
Image
Digest
sha256:46d37ae41…
Size
53.6 MB
Last updated
3 months ago
docker pull c42u/dali-servui