No description
- Python 57.1%
- JavaScript 22.1%
- HTML 12.5%
- CSS 4.4%
- Shell 3.9%
| .claude | ||
| src/artnet_monitor | ||
| static | ||
| templates | ||
| tests | ||
| .gitignore | ||
| config.yaml | ||
| gunicorn_conf.py | ||
| INSTALL.md | ||
| install.sh | ||
| pyproject.toml | ||
| QUICKSTART.md | ||
| README.md | ||
| start.sh | ||
| test.md | ||
Art-Net Console Monitor
Ein professionelles Monitoring-Tool zur Überwachung von Chamsys MQ40N Lichtpulten via Art-Net. Erkennt automatisch Freezes und Netzwerkausfälle durch Pattern-Analyse.
Funktionen
- Art-Net Monitoring: Empfängt Art-Net DMX-Pakete auf Port 6454
- Pattern-Erkennung: Erkennt wechselnde RGB-Werte als "Heartbeat"
- Freeze-Erkennung: Alarm wenn Pattern ausbleibt (konfigurierbarer Timeout)
- Multi-Input: Mehrere Art-Net Universen parallel überwachen
- Event-Logging: SQLite-Datenbank für Pattern-Start/-Ende-Events
- Web-Dashboard: Echtzeit-Statusanzeige mit WebSocket-Updates
- REST API: Vollständige API für Status, Config und Logs
- Konfigurierbar: YAML-basierte Konfiguration
Technischer Stack
- Python 3.11+
- FastAPI (Web-Framework)
- SQLAlchemy (Datenbank)
- Pydantic (Validierung)
- asyncio (Async I/O)
- WebSocket (Echtzeit-Updates)
Installation
Mit uv (empfohlen)
# uv installieren (falls noch nicht installiert)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Repository klonen
cd artnet-test
# Virtual Environment erstellen und Dependencies installieren
uv venv
source .venv/bin/activate # Linux/Mac
# oder
.venv\Scripts\activate # Windows
uv pip install -e .
Mit pip
python -m venv .venv
source .venv/bin/activate
pip install -e .
Konfiguration
Konfigurationsdatei: config.yaml
artnet_receiver:
bind_address: "0.0.0.0" # Alle Netzwerk-Interfaces
port: 6454 # Standard Art-Net Port
pattern_detection:
no_change_timeout: 7.0 # Sekunden ohne Änderung → Fehler
tolerance: 5 # RGB-Toleranz für Änderungs-Erkennung
inputs:
- id: "console_main"
name: "Chamsys MQ40N - Main Output"
enabled: true
universe: 0 # Art-Net Universe
start_address: 1 # DMX Start-Adresse (1-512)
red_offset: 0 # Offset relativ zu start_address
green_offset: 1
blue_offset: 2
dimmer_offset: 3 # Optional
database:
path: "artnet_monitor.db"
logging:
level: "INFO"
file: "artnet_monitor.log"
Verwendung
Entwicklung
# Mit uvicorn (Hot-Reload)
uvicorn src.artnet_monitor.main:app --reload --host 0.0.0.0 --port 8000
Produktion
# Mit Gunicorn
gunicorn -c gunicorn_conf.py src.artnet_monitor.main:app
Docker (optional)
docker build -t artnet-monitor .
docker run -p 8000:8000 -p 6454:6454/udp artnet-monitor
Web-Interface
Nach dem Start:
- Status-Dashboard: http://localhost:8000/api/status/
- API-Dokumentation: http://localhost:8000/docs
- API-Status: http://localhost:8000/api/status/inputs
API-Endpunkte
Status
GET /api/status/inputs- Alle Input-StatusGET /api/status/inputs/{id}- Einzelner Input-StatusWS /api/status/ws- WebSocket für Echtzeit-Updates
Logs
GET /api/logs/events- Event-Log (mit Filtern)GET /api/logs/summary- Uptime-Statistiken
Konfiguration
GET /api/config- Aktuelle ConfigPUT /api/config- Config aktualisierenPOST /api/config/validate- Config validieren
Testing
Art-Net Simulator
Zum Testen ohne echtes Lichtpult:
from src.artnet_monitor.artnet.simulator import ArtNetSimulator, SimulatorPattern
import asyncio
async def test():
simulator = ArtNetSimulator()
await simulator.start()
# Pattern senden (Rot -> Grün -> Blau)
pattern = SimulatorPattern(
colors=[(255,0,0), (0,255,0), (0,0,255)],
interval=1.0 # 1 Sekunde pro Farbe
)
await simulator.send_pattern(
universe=0,
start_address=1,
pattern=pattern,
duration=60.0 # 60 Sekunden
)
await simulator.stop()
asyncio.run(test())
Unit-Tests
# Tests ausführen
pytest tests/
# Mit Coverage
pytest --cov=src tests/
Projekt-Struktur
artnet-test/
├── src/artnet_monitor/
│ ├── artnet/ # Art-Net Protokoll
│ ├── monitoring/ # Pattern-Erkennung
│ ├── storage/ # Datenbank
│ ├── config/ # Konfiguration
│ ├── web/ # FastAPI Web-App
│ └── main.py # Entry Point
├── static/ # Frontend (CSS, JS)
├── templates/ # HTML Templates
├── tests/ # Tests
├── config.yaml # Konfiguration
└── pyproject.toml # Dependencies
Troubleshooting
Port 6454 bereits belegt
# Linux: Port prüfen
sudo netstat -tulpn | grep 6454
# Anderen Port in config.yaml verwenden
Keine Art-Net Pakete empfangen
- Firewall-Einstellungen prüfen
- Netzwerk-Interface richtig konfiguriert?
- Lichtpult sendet an richtige IP-Adresse?
Pattern wird nicht erkannt
tolerancein config.yaml erhöhenno_change_timeoutanpassen- Logs prüfen:
tail -f artnet_monitor.log
Development
# Development-Dependencies installieren
uv pip install -e ".[dev]"
# Code formatieren
ruff format src/
# Linting
ruff check src/
Deployment
Systemd Service (Linux)
# /etc/systemd/system/artnet-monitor.service
[Unit]
Description=Art-Net Monitor
After=network.target
[Service]
Type=notify
User=artnet
WorkingDirectory=/opt/artnet-monitor
ExecStart=/opt/artnet-monitor/.venv/bin/gunicorn -c gunicorn_conf.py src.artnet_monitor.main:app
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl enable artnet-monitor
sudo systemctl start artnet-monitor
sudo systemctl status artnet-monitor
Lizenz
MIT License
Autor
Stefan Gärtner
Support
Bei Fragen oder Problemen bitte ein Issue auf GitHub erstellen.
7afcac4 (first init)