Self-hosted Smart Home System — runs on a Raspberry Pi, controls lights, plugs, PCs, and more from a single dashboard. Multi-user support, remote access via Tailscale, voice control with Alexa.
┌─────────────────────────────────┐
│ Tailscale Mesh VPN │
│ (secure access from anywhere) │
└──────────┬──────────────────────┘
│
┌──────────────┐ MQTT ┌─────┴─────────┐ HTTP ┌─────────────┐
│ NEXUS Agent │◄─────────────►│ NEXUS Brain │◄─────────────►│ Dashboard │
│ (Win / Mac) │ │ (FastAPI) │ │ (React PWA)│
└──────────────┘ └──────┬────────┘ └─────────────┘
│
┌───────────┬───────────┼───────────┬───────────┐
│ │ │ │ │
Hue/IKEA Tasmota Pi Manager Alexa Jarvis
Lights Plugs SSH Metrics Skill Bridge
Brain — FastAPI backend on a Raspberry Pi. Manages devices via plugins, runs scenes, serves the REST API. JWT-based authentication with multi-user support.
Agent — Python service on Windows and macOS PCs. Reports system metrics (CPU/RAM/GPU/disk/network), accepts remote commands (shutdown, restart, launch programs), sends alerts via MQTT.
Dashboard — React PWA with real-time WebSocket updates. Device control, scene management, Pi monitoring, alerts, room management, and user settings. Fully customizable — all devices, rooms, and scenes are editable from the UI.
MQTT — Mosquitto broker. All communication between Brain, Agents, and plugins runs over MQTT.
Tailscale — Mesh VPN for secure remote access. All devices communicate via Tailscale IPs, allowing full control from anywhere without port forwarding.
- Device Control — Philips Hue, IKEA Tradfri, Tasmota smart plugs, PCs (WOL + Agent), Raspberry Pis
- Scene Automation — YAML-based multi-device scenes with delays, conditions, and wait-for-online logic
- PC Agent (Windows) — Remote shutdown/restart/sleep/lock, system monitoring, process management, GPU metrics, alerts
- Mac Agent — Open apps/URLs, RDP connections, SSH terminals, volume/brightness control, dark mode, screenshots
- Pi Manager — SSH-based metrics (CPU, RAM, temp, disk, uptime) from all Pis in the network
- Alexa Integration — Custom skill endpoint for voice-triggered scenes and device control
- Real-time Dashboard — Live device status, scene/device/room editors, Pi monitor, alerts panel, logs
- Energy Monitoring — Power consumption tracking via Tasmota plugs
- Multi-User Auth — JWT-based login, user management, admin/user roles, password management
- Remote Access — Tailscale mesh VPN — control your home from anywhere (university, travel, etc.)
- Room Management — Organize devices into rooms with custom icons, controllable as groups
- Raspberry Pi (3B+ or newer) with Raspbian/Debian
- Docker & Docker Compose
- Python 3.10+ (on managed PCs for the Agent)
- Tailscale (optional, for remote access)
Reihenfolge ist wichtig — jeder Schritt baut auf dem vorherigen auf. Bereits erledigte Schritte überspringen.
Der Brain ist das Herzstück — er muss zuerst laufen.
# Repo klonen
git clone https://github.com/Werizu/nexus.git
cd nexus
# Config anpassen
cp config/secrets.yaml.example config/secrets.yaml
nano config/devices.yaml # Geräte eintragen (Lichter, Plugs, PCs, Pis)
nano config/secrets.yaml # API-Keys (Hue Bridge Key, etc.)
nano config/nexus.yaml # MQTT Broker IP, System-Einstellungen
# Bauen und starten
sudo docker compose up -dEs starten drei Container:
nexus-brain— FastAPI Backend auf Port 8000nexus-mqtt— Mosquitto Broker auf Port 1883nexus-web— Nginx Dashboard auf Port 80
Tailscale wird vor den Agents installiert, weil die Agents die Tailscale-IP des Brain brauchen.
# Auf dem Brain-Pi
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# Tailscale IP notieren — wird für alles Weitere gebraucht
tailscale ip -4config/nexus.yaml und config/devices.yaml auf Tailscale-IPs umstellen. Danach Brain neustarten:
sudo docker compose restart nexus-brainTailscale auch auf allen anderen Geräten installieren (PCs, MacBooks, Handys), die auf das Dashboard zugreifen sollen.
Ohne Tailscale funktioniert alles nur im lokalen Netzwerk — Agents können dann die lokale IP des Brain nutzen.
Dashboard im Browser öffnen: http://<tailscale-ip> (oder http://<lokale-ip> ohne Tailscale).
Beim ersten Start wird ein Admin-Account erstellt:
- Username:
admin - Password:
nexus
Passwort sofort ändern über das Zahnrad-Icon oben rechts.
Wichtig: Accounts müssen existieren bevor Agents installiert werden, weil der Agent bei der Installation nach NEXUS-Login-Daten fragt und sich damit beim Brain registriert.
Neuen User anlegen (z.B. für einen Freund):
- Zahnrad-Icon oben rechts → Benutzerverwaltung
- + Neuer Benutzer: Username, Anzeigename, Passwort, Rolle (
useroderadmin) - Login-Daten dem Freund mitteilen — er braucht sie bei der Agent-Installation
Reihenfolge auf dem PC: Tailscale → WOL → Agent.
4a) Tailscale installieren:
- tailscale.com/download → Windows Installer
- Installieren und anmelden
- Run unattended aktivieren (Tailscale-Einstellungen) — damit Tailscale nach Neustart automatisch verbindet
- Tailscale-IP notieren: Rechtsklick auf Tailscale-Icon → My IP address
4b) Wake-on-LAN einrichten:
Damit der PC über das Dashboard aus dem ausgeschalteten Zustand geweckt werden kann.
BIOS/UEFI:
- PC neustarten → ins BIOS (
DEL,F2oderF12) - Wake on LAN / Wake on PCI(E): Enabled
- ErP Ready / Deep Sleep: Disabled
- Speichern und neustarten
Windows Netzwerkadapter:
- Geräte-Manager (
devmgmt.msc) → Netzwerkadapter → Rechtsklick Ethernet-Adapter → Eigenschaften - Tab Erweitert:
- Wake on Magic Packet: Enabled
- Wake on Pattern Match: Enabled
- Energy Efficient Ethernet: Disabled (falls vorhanden)
- Tab Energieverwaltung:
- ☑ Gerät kann den Computer aus dem Ruhezustand aktivieren
- ☑ Nur Magic Packet kann den Computer aus dem Ruhezustand aktivieren
Windows Energieoptionen:
- Einstellungen → System → Netzbetrieb → Schnellstart: Aus (blockiert WOL bei Herunterfahren)
Wichtig: WOL funktioniert nur über Ethernet (Kabel), nicht über WLAN.
4c) Remotedesktop aktivieren:
Einstellungen → System → Remotedesktop → An
4d) NEXUS Agent installieren:
Voraussetzung: Ein NEXUS-Account muss bereits existieren (siehe Schritt 3).
In einer erhöhten PowerShell (Rechtsklick → Als Administrator):
irm https://werizu.github.io/nexus/install.ps1 | iexDas Script fragt nach:
- Brain IP — Tailscale-IP des Brain Pi (aus Schritt 2)
- NEXUS Username — dein NEXUS-Benutzername
- NEXUS Passwort — dein NEXUS-Passwort
Der Agent meldet sich beim Brain an, registriert den PC automatisch als Gerät (mit richtigem Owner), und startet als Windows-Service. Das Gerät erscheint sofort im Dashboard.
Kein manuelles Bearbeiten von
devices.yamlnötig — die Registrierung läuft komplett automatisch.
4e) Neustart und prüfen:
PC neustarten. Prüfen:
- Tailscale verbindet automatisch (Icon grün)
- Agent läuft:
Get-Service NexusAgent - Dashboard zeigt den PC als online
Agent-Funktionen: System-Metriken (CPU, RAM, GPU, Disk, Netzwerk), Remote Shutdown/Restart/Sleep/Lock, Prozessverwaltung, Alerts bei Schwellwerten.
Nur nötig wenn das MacBook auch über NEXUS gesteuert werden soll (Apps öffnen, RDP, etc.).
Voraussetzung: Tailscale installiert + NEXUS-Account existiert (siehe Schritt 3).
Zuerst Tailscale installieren (tailscale.com/download → macOS), dann:
curl -fsSL https://werizu.github.io/nexus/install-mac.sh | bashDas Script fragt nach:
- Brain IP — Tailscale-IP des Brain Pi
- NEXUS Username — dein NEXUS-Benutzername
- NEXUS Passwort — dein NEXUS-Passwort
Der Agent registriert sich automatisch beim Brain, das Gerät erscheint im Dashboard. Installiert sich als LaunchAgent und startet automatisch beim Login.
Agent-Funktionen: Apps/URLs öffnen, RDP-Verbindungen (Windows App), SSH-Terminals, Lautstärke, Helligkeit, Dark Mode, Screenshots, System-Metriken.
Komplette Anleitung um einen Freund einzurichten — von Null. Er hat ein MacBook ohne alles, einen Desktop-PC ohne alles, und bekommt einen Raspberry Pi als WOL-Relay. Ziel: Er kann seinen PC von überall (Uni, unterwegs) über das NEXUS-Dashboard aufwecken und per RDP steuern.
Voraussetzung: NEXUS Brain läuft bereits auf deinem Pi mit Tailscale. Falls nicht, zuerst Schritt 1: Brain und Schritt 5: Tailscale abschließen.
Freund an der Uni Freundes Netzwerk zuhause
┌──────────┐ ┌────────────┐ LAN ┌──────────┐
│ MacBook │───── Tailscale ─────►│ Relay Pi │──── WOL ────►│ Freund │
│ Dashboard│ │ (Pi Zero W)│ Broadcast │ PC (aus) │
└──────────┘ └────────────┘ └──────────┘
│ │
│ Tailscale │
└────────────────────────────────┘
│
┌─────┴──────┐
│ NEXUS Brain │
│ (dein Pi) │
└────────────┘
| Gerät | Standort | Rolle | Muss 24/7 laufen? |
|---|---|---|---|
| NEXUS Brain (dein Pi) | Bei dir | Backend, Dashboard | Ja |
| Relay-Pi (z.B. Pi Zero W) | Beim Freund | WOL-Relay | Ja (~0.5W) |
| Freund PC | Beim Freund | Wird ferngesteuert | Nein (wird per WOL geweckt) |
| Freund MacBook | Mobil | Dashboard + RDP Client | Nein |
Bevor du zum Freund fährst — diese Schritte kannst du vorher erledigen:
Tailscale-Einladung senden:
- Öffne Tailscale Admin Console
- Users → Invite users
- E-Mail deines Freundes eingeben, Einladung senden
- Dein Freund soll die Einladung annehmen und einen Tailscale-Account erstellen (er muss noch nichts installieren)
Tailscale Free erlaubt bis zu 3 Benutzer und 100 Geräte.
NEXUS-Account anlegen:
Dieser Schritt muss vor der Agent-Installation passieren — der Agent braucht Login-Daten bei der Einrichtung.
- Dashboard öffnen:
http://<tailscale-ip-des-brain> - Als Admin einloggen
- Zahnrad-Icon (oben rechts) → Benutzerverwaltung
- + Neuer Benutzer: Benutzername, Anzeigename, temporäres Passwort, Rolle
user - Login-Daten aufschreiben — dein Freund braucht sie bei der Agent-Installation
Relay-Pi vorbereiten:
- Raspberry Pi Imager herunterladen
- Raspberry Pi OS Lite (64-bit) auswählen (kein Desktop nötig)
- Vor dem Schreiben auf das Zahnrad klicken:
- SSH aktivieren (Passwort-Authentifizierung)
- Benutzername + Passwort setzen (z.B.
marlon/ eigenes Passwort) - WLAN konfigurieren (WLAN des Freundes, damit man beim ersten Boot per SSH draufkommt)
- SD-Karte flashen — mitnehmen
Der Pi wird als Erstes eingerichtet, weil er am längsten braucht (Updates, Tailscale).
Wichtig: Der Relay-Pi muss per LAN-Kabel am selben Router/Switch wie der PC angeschlossen sein. WOL funktioniert nicht über WLAN.
- SD-Karte einlegen, LAN-Kabel an den Router, Strom anschließen
- Warten bis hochgefahren (~1-2 Minuten)
- IP herausfinden (im Router unter "Verbundene Geräte" oder per
ping raspberrypi.local) - Per SSH verbinden und Setup-Script ausführen:
ssh marlon@<lokale-ip-des-pi>
curl -fsSL https://werizu.github.io/nexus/setup-relay.sh | bashDas Script installiert wakeonlan + Tailscale und zeigt einen Login-Link. Diesen im Browser öffnen und mit deinem Tailscale-Account anmelden (der Pi gehört zu deinem Netzwerk).
Tailscale-IP des Relay-Pi notieren — wird in Schritt 4 gebraucht.
Während der Pi Updates installiert, kannst du parallel mit Schritt 2 (PC) weitermachen.
2a) Wake-on-LAN im BIOS aktivieren:
- PC neustarten → ins BIOS (
DEL,F2oderF12) - Wake on LAN / Wake on PCI(E): Enabled
- ErP Ready / Deep Sleep: Disabled
- Speichern und neustarten
2b) Wake-on-LAN in Windows aktivieren:
- Geräte-Manager (
devmgmt.msc) → Netzwerkadapter → Rechtsklick Ethernet-Adapter → Eigenschaften - Tab Erweitert:
- Wake on Magic Packet: Enabled
- Wake on Pattern Match: Enabled
- Energy Efficient Ethernet: Disabled (falls vorhanden)
- Tab Energieverwaltung:
- ☑ Gerät kann den Computer aus dem Ruhezustand aktivieren
- ☑ Nur Magic Packet kann den Computer aus dem Ruhezustand aktivieren
- Einstellungen → System → Netzbetrieb → Schnellstart: Aus
2c) MAC-Adresse notieren:
getmac /vMAC-Adresse des Ethernet-Adapters aufschreiben (Format AA-BB-CC-DD-EE-FF).
WOL funktioniert nur über Ethernet (Kabel), nicht über WLAN.
2d) Tailscale installieren:
- tailscale.com/download → Windows Installer herunterladen und installieren
- Mit dem Account deines Freundes anmelden (er hat die Einladung in der Vorbereitung angenommen)
- Tailscale-Einstellungen: Run unattended aktivieren
- Tailscale-IP notieren: Rechtsklick auf Tailscale-Icon → My IP address
2e) Remotedesktop aktivieren:
Einstellungen → System → Remotedesktop → An
2f) NEXUS Agent installieren:
Jetzt ist Tailscale aktiv und du kennst die Brain-IP. In einer erhöhten PowerShell (Rechtsklick → Als Administrator):
irm https://werizu.github.io/nexus/install.ps1 | iexDas Script fragt nach:
- Brain IP — Tailscale-IP des Brain Pi
- NEXUS Username — der Account, den du in der Vorbereitung angelegt hast
- NEXUS Passwort — das temporäre Passwort
Der Agent registriert sich automatisch beim Brain. Das Gerät erscheint im Dashboard und gehört dem eingeloggten User — nur er sieht es, Admins sehen alles.
2g) Neustart und prüfen:
PC einmal neu starten. Prüfen ob:
- Tailscale automatisch verbindet (Icon grün)
- NEXUS Agent läuft:
Get-Service NexusAgent - PC erscheint im Dashboard des Freundes
3a) Tailscale installieren:
- tailscale.com/download → macOS herunterladen und installieren
- Mit dem Account deines Freundes anmelden
3b) Windows App installieren (für RDP):
- App Store → Windows App (von Microsoft) installieren
- Neue Verbindung hinzufügen:
- IP: Tailscale-IP des PCs (aus Schritt 2d)
- Benutzer: Windows-Login des PCs
- Verbindung speichern
3c) NEXUS Mac Agent installieren (optional):
Falls das MacBook auch über NEXUS gesteuert werden soll:
curl -fsSL https://werizu.github.io/nexus/install-mac.sh | bashFragt nach Brain-IP + NEXUS-Login. Agent registriert sich automatisch.
Ohne Agent braucht das MacBook nur Tailscale, Windows App und den Browser.
3d) Dashboard testen:
- Browser öffnen:
http://<tailscale-ip-des-brain> - Mit dem NEXUS-Account einloggen (aus der Vorbereitung)
- Dashboard sollte laden und die Geräte des Freundes anzeigen (nicht deine — jeder User sieht nur seine eigenen)
Der PC des Freundes hat sich in Schritt 2f automatisch registriert (über den Agent). Nur der Relay-Pi muss manuell eingetragen werden.
4a) SSH-Key zum Relay-Pi kopieren:
ssh-copy-id -i ~/.ssh/pi_manager_rsa marlon@<relay-tailscale-ip>Testen:
ssh -i ~/.ssh/pi_manager_rsa marlon@<relay-tailscale-ip> "echo OK"4b) Relay-Pi registrieren:
In config/devices.yaml:
pis:
- id: relay_friend
name: "WOL Relay (Freund)"
plugin: pi_manager
hostname: 100.x.x.x # Tailscale IP des Relay-Pi
ssh_user: marlon
ssh_key: "~/.pi-manager/keys/id_rsa"
role: relayBrain neustarten: sudo docker compose restart nexus-brain
4c) WOL-Relay dem PC zuweisen:
Den automatisch registrierten PC des Freundes mit dem Relay verknüpfen — im Dashboard unter Geräte den PC bearbeiten und wol_relay: relay_friend hinzufügen. Oder in config/devices.yaml den Eintrag ergänzen:
computers:
- id: <username>_<hostname> # wurde automatisch vergeben
wol_relay: relay_friend # WOL über den Relay-Pi senden
mac_address: "AA:BB:CC:DD:EE:FF" # MAC-Adresse aus Schritt 2cDas wol_relay Feld sagt dem Brain: "Sende WOL nicht lokal, sondern per SSH über den Relay-Pi."
Jetzt alles zusammen testen:
- PC des Freundes herunterfahren (oder er fährt ihn selbst runter)
- Am MacBook des Freundes (oder deinem Rechner):
http://<tailscale-ip-des-brain>öffnen- Einloggen → "Freund PC" → Wake klicken
- Was passiert:
- Brain erkennt
wol_relay: relay_friend - Brain verbindet sich per SSH zum Relay-Pi
- Relay-Pi sendet WOL-Broadcast ins lokale Netz
- PC wacht auf → Tailscale startet → Agent meldet sich
- Dashboard zeigt PC als "online"
- Brain erkennt
- RDP verbinden: Windows App öffnen → gespeicherte Verbindung klicken
| Problem | Ursache | Lösung |
|---|---|---|
| PC wacht nicht auf | WOL nicht im BIOS aktiviert | Schritt 2a prüfen |
| PC wacht nicht auf | Relay-Pi nicht per LAN-Kabel | Relay-Pi per Ethernet anschließen |
| PC wacht nicht auf | Schnellstart aktiv | Schritt 2b: Schnellstart deaktivieren |
| Dashboard nicht erreichbar | Tailscale nicht verbunden | Tailscale-App öffnen, Status prüfen |
| "WOL relay device not found" | Relay-Pi nicht registriert | Schritt 4b prüfen, Brain neustarten |
| Agent meldet sich nicht | Agent-Service nicht gestartet | Get-Service NexusAgent prüfen |
| RDP verbindet nicht | Remotedesktop nicht aktiviert | Schritt 2e prüfen |
devices:
computers:
- id: main_pc
name: Desktop PC
plugin: pc_control
mac_address: "AA:BB:CC:DD:EE:FF"
ip: 100.123.253.88 # Tailscale IP
os: windows
check_port: 3389
- id: main_mac
name: MacBook
plugin: pc_control
os: macos
pis:
- id: brain
name: NEXUS Brain
plugin: pi_manager
hostname: 100.122.236.58
ssh_user: marlon
ssh_key: "~/.pi-manager/keys/id_rsa"
role: primary
lights:
- id: light_1
name: Wohnzimmer Licht
plugin: hue_lights
bridge_ip: 192.168.178.48 # Hue Bridge stays on local IP
hue_id: "3"
plugs:
- id: plug_pc
name: PC Steckdose
plugin: hue_lights
bridge_ip: 192.168.178.48
hue_id: "8"name: dev_mode
display_name: "Programmier-Modus"
icon: code
color: "#00D4FF"
triggers:
alexa:
- "Programmier-Modus"
- "wir programmieren was"
conditions:
time_range: "07:00-02:00"
actions:
- device: plug_pc
command: "on"
- delay: 10
- device: main_pc
command: wake
wait_for_online: true
timeout: 90
- delay: 15
- device: main_mac
command: rdp_connect
- device: main_mac
command: open_url
params:
url: "http://100.122.236.58"Scenes support:
- Delays between actions
- Conditions (time ranges)
- Wait-for-online with timeout (e.g., wait until PC boots)
- Alexa triggers (voice phrases)
- Scheduled triggers (cron-style)
Die Config wird bei der Installation automatisch erstellt. Beim ersten Start registriert sich der Agent beim Brain und ergänzt device_id und token selbst.
mqtt:
broker: "100.122.236.58" # Brain Tailscale-IP (bei Installation angegeben)
port: 1883
client_id: "nexus-agent-marlon_desktop" # wird automatisch gesetzt
auth:
username: "marlon" # NEXUS-Login (bei Installation angegeben)
password: "..." # NEXUS-Passwort
token: "eyJ..." # JWT-Token (wird automatisch gesetzt)
agent:
device_id: "marlon_desktop" # wird automatisch vom Brain vergeben
name: "Desktop" # Hostname des PCs
report_interval: 10
alerts:
cpu: 90 # CPU usage %
ram: 90 # RAM usage %
disk: 90 # Disk usage %
gpu_temp: 85 # GPU temperature °C
gpu_load: 95 # GPU load %
cooldown: 300 # Seconds between repeated alertsdevice_id wird automatisch aus
username_hostnamegeneriert (z.B.marlon_desktop,freund_gaming_pc). So ist garantiert eindeutig welches Gerät welchem User gehört.
| Tab | Description |
|---|---|
| Dashboard | Overview — scenes, all devices, Pi status, active alerts |
| Geräte | Device management — add, edit, delete devices by category |
| Szenen | Scene management — create, edit, delete automation scenes |
| Räume | Room management — organize devices into rooms with icons |
| Pi Monitor | Raspberry Pi metrics — CPU, RAM, temperature, disk, uptime |
| Alerts | Alert history — acknowledge individual or all alerts |
| Logs | System log viewer |
- Profile — change display name
- Password — change password
- User Management (admin only) — create users, assign roles (admin/user), delete users
PCs und Macs werden automatisch registriert wenn der NEXUS Agent installiert wird. Der Agent fragt nach NEXUS-Login-Daten und registriert das Gerät beim Brain mit dem richtigen Owner. Kein manuelles Konfigurieren nötig.
Andere Geräte (Lichter, Plugs, Pis, Kameras) manuell hinzufügen:
- Go to Geräte tab
- Click + Neues Gerät
- Select category (Computer, Pi, Lights, Plugs, Cameras, Speakers)
- Fill in device-specific config (IP, MAC, Hue ID, etc.)
- Save — device appears immediately
- Go to Szenen tab
- Click + Neue Szene
- Name the scene, pick an icon and color
- Add actions: select device, command, and parameters
- Save — scene is triggerable from dashboard, API, or Alexa
- Go to Räume tab
- Click + Neuer Raum
- Name the room, pick an icon
- Assign devices by clicking on them
- Save — room appears with grouped device controls
NEXUS supports multiple users with role-based access and device ownership:
| Role | Permissions |
|---|---|
| admin | Full access — sieht alle Geräte, verwaltet User, Scenes, Rooms |
| user | Sieht nur eigene Geräte + geteilte Geräte (owner = NULL) |
Jedes Gerät hat einen Owner. Wenn ein Agent sich registriert, wird der eingeloggte User automatisch als Owner gesetzt. Admins sehen alle Geräte, normale User nur ihre eigenen.
- Agent-Installation → User loggt sich ein → Gerät bekommt
owner = username - Manuell erstellte Geräte gehören dem User, der sie anlegt
- Geräte ohne Owner (
owner = NULL) sind für alle sichtbar
Admins can manage users via the settings panel (gear icon → Benutzerverwaltung):
- Create new users with username, display name, password, and role
- Promote/demote users between admin and user roles
- Delete users
Workflow: Zuerst Account anlegen → dann Agent installieren. Der Agent braucht die NEXUS-Login-Daten bei der Einrichtung.
All API endpoints (except /api/v1/health and /api/v1/alexa) require a JWT token:
# Login
curl -X POST http://<ip>/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"nexus"}'
# Use the token
curl http://<ip>/api/v1/devices \
-H 'Authorization: Bearer <token>'Tokens are valid for 30 days.
Base URL: http://<pi-ip>/api/v1
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/auth/login |
POST | — | Login, returns JWT token |
/auth/register |
POST | Admin | Create new user |
/auth/me |
GET | User | Current user info |
/auth/password |
PUT | User | Change own password |
/auth/users |
GET | Admin | List all users |
/auth/users/{username} |
PUT | Admin | Update user (role, display name) |
/auth/users/{username} |
DELETE | Admin | Delete user |
/agent/register |
POST | User | Auto-register a device (used by agents on first start) |
| Endpoint | Method | Description |
|---|---|---|
/devices |
GET | All devices with current state |
/devices |
POST | Register a new device |
/devices/{id} |
GET | Single device details |
/devices/{id} |
PUT | Update device config |
/devices/{id} |
DELETE | Remove device |
/devices/{id}/command |
POST | Send command ({"command": "on", "params": {}}) |
| Endpoint | Method | Description |
|---|---|---|
/scenes |
GET | List all scenes |
/scenes |
POST | Create scene |
/scenes/{name} |
GET | Scene details |
/scenes/{name} |
PUT | Update scene |
/scenes/{name} |
DELETE | Delete scene |
/scenes/{name}/trigger |
POST | Execute scene |
| Endpoint | Method | Description |
|---|---|---|
/rooms |
GET | All rooms with assigned devices |
/rooms |
POST | Create room |
/rooms/{id} |
PUT | Update room |
/rooms/{id} |
DELETE | Delete room |
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | System health + plugin status (no auth) |
/pis |
GET | Pi metrics (CPU, RAM, temp, disk) |
/alerts |
GET | Alert history |
/alerts/{id}/ack |
POST | Acknowledge alert |
/alerts/ack-all |
POST | Acknowledge all alerts |
/logs |
GET | System logs |
/alexa |
POST | Alexa skill endpoint (no auth) |
Connect to ws://<pi-ip>/ws/realtime for real-time events:
{"event": "device_update", "device_id": "main_pc", "state": {...}}
{"event": "scene_complete", "scene": "dev_mode"}
{"event": "alert", "device_id": "main_pc", "type": "cpu", "value": 95}| Plugin | Type | Devices | Protocol |
|---|---|---|---|
hue_lights |
light | Philips Hue, IKEA (via Hue Bridge) | HTTP API |
ikea_lights |
light | IKEA Tradfri (direct) | CoAP |
tasmota |
plug | Tasmota-flashed smart plugs | HTTP + MQTT |
pc_control |
computer | Windows/macOS PCs | MQTT Agent + WOL |
pi_manager |
pi | Raspberry Pis | SSH |
alexa_bridge |
assistant | Amazon Alexa | HTTP Skill API |
jarvis_bridge |
assistant | Jarvis voice assistant | MQTT |
cd ~/nexus
git pull
sudo docker compose build nexus-brain --no-cache
sudo docker compose up -dFor frontend changes:
cd web && npm run build && cd ..
sudo docker compose restart nexus-web# Brain logs
sudo docker logs nexus-brain --tail 50 -f
# MQTT logs
sudo docker logs nexus-mqtt --tail 20
# Agent logs (Windows)
Get-Content "C:\Program Files\NEXUS Agent\nexus-agent.log" -Tail 20
# Agent logs (macOS)
tail -f ~/.nexus-agent/nexus-agent-mac.logGet-Service NexusAgent # Status
Restart-Service NexusAgent # Restart
Stop-Service NexusAgent # Stop
# Uninstall
python "C:\Program Files\NEXUS Agent\nexus_service.py" removelaunchctl list | grep nexus # Status
launchctl unload ~/Library/LaunchAgents/com.nexus.agent.plist # Stop
launchctl load ~/Library/LaunchAgents/com.nexus.agent.plist # Start
# Uninstall
launchctl unload ~/Library/LaunchAgents/com.nexus.agent.plist
rm -rf ~/.nexus-agent ~/Library/LaunchAgents/com.nexus.agent.plisttar czf nexus-backup-$(date +%F).tar.gz config/ scenes/ data/Important data:
config/— device config, rooms, secretsscenes/— automation scenesdata/nexus.db— device state, users, logs (SQLite)
| Component | Technology |
|---|---|
| Backend | Python 3.12, FastAPI, Uvicorn |
| Frontend | React 19, Vite, Tailwind CSS |
| Database | SQLite (aiosqlite) |
| Messaging | MQTT (Mosquitto) |
| Auth | JWT (PyJWT, HS256, 30-day tokens) |
| Deployment | Docker Compose, Nginx |
| VPN | Tailscale |
| Device APIs | Philips Hue REST, Tasmota HTTP, SSH (Paramiko), WOL |
nexus/
├── agent/ # Windows PC Agent (Python service)
│ ├── nexus_agent.py # Agent main (MQTT + monitoring)
│ ├── nexus_service.py # Windows service wrapper
│ ├── config.yaml # Agent config
│ └── install.ps1 # One-line installer
├── agent-mac/ # macOS Agent (LaunchAgent)
│ ├── nexus_agent_mac.py # Agent main (MQTT + macOS commands)
│ ├── config.yaml # Agent config
│ └── install.sh # One-line installer
├── config/ # System configuration
│ ├── devices.yaml # Device registry
│ ├── rooms.yaml # Room definitions
│ ├── nexus.yaml # System settings
│ ├── secrets.yaml # API keys (gitignored)
│ ├── mosquitto.conf # MQTT broker config
│ └── nginx.conf # Web server config
├── core/ # FastAPI backend
│ ├── main.py # API routes + auth
│ ├── config.py # Config loader
│ ├── state_store.py # SQLite store (devices, users, logs)
│ ├── plugin_manager.py # Plugin discovery + lifecycle
│ ├── scene_engine.py # Scene execution engine
│ ├── mqtt_client.py # MQTT client
│ ├── scheduler.py # Cron-style scheduler
│ └── websocket_server.py # Real-time WebSocket
├── plugins/ # Device plugins
│ ├── base_plugin.py # Base class for all plugins
│ ├── hue/ # Philips Hue + IKEA (via Bridge)
│ ├── ikea/ # IKEA Tradfri (direct CoAP)
│ ├── tasmota/ # Tasmota smart plugs
│ ├── pc_control/ # PC control (WOL + MQTT Agent)
│ ├── pi_manager/ # Raspberry Pi monitoring (SSH)
│ ├── alexa_bridge/ # Alexa voice control
│ └── jarvis_bridge/ # Jarvis voice assistant
├── scenes/ # YAML automation scenes
├── web/ # React + Vite dashboard
│ ├── src/
│ │ ├── App.jsx # Main app + routing
│ │ ├── components/
│ │ │ ├── LoginScreen.jsx # Authentication
│ │ │ ├── Header.jsx # Status bar + settings
│ │ │ ├── DeviceCard.jsx # Device control card
│ │ │ ├── DeviceEditor.jsx # Add/edit devices
│ │ │ ├── SceneCard.jsx # Scene trigger card
│ │ │ ├── SceneEditor.jsx # Add/edit scenes
│ │ │ ├── RoomView.jsx # Room device groups
│ │ │ ├── RoomEditor.jsx # Add/edit rooms
│ │ │ ├── PiMonitor.jsx # Pi metrics display
│ │ │ ├── AlertsPanel.jsx # Alert management
│ │ │ ├── LogViewer.jsx # Log viewer
│ │ │ └── SettingsPanel.jsx # User settings + admin
│ │ └── hooks/
│ │ └── useNexus.js # API hooks + WebSocket
│ └── dist/ # Built frontend (served by nginx)
├── docs/ # GitHub Pages (install scripts)
├── Dockerfile
├── docker-compose.yaml
└── requirements.txt
Private project by Werizu.