Zum Inhalt springen
Campus Innsbruck · MCI I – MCI VSimulationsumgebung für das Raumbuchungssystem
Schnittstelle

API

REST unter /api/v1. Alle Antworten sind JSON mit der Nutzlast unter data. Keine Authentifizierung, CORS offen.

Zustandsmodell

Schloss und Türblatt sind zwei unabhängige Größen — genau wie bei echter Hardware. Aus der Kombination ergeben sich vier Zustände:

lockdoorBedeutung
lockedclosedRuhezustand. Öffnen wird abgewiesen.
unlockedclosedFreigegeben. Autolock läuft, die Tür kann geöffnet werden.
unlockedopenTür steht offen, Schloss noch freigegeben.
lockedopenAutolock hat ausgelöst, während die Tür offen stand. Feld ajar ist true; der Zustand endet, sobald die Tür zufällt.

Typischer Ablauf

Zutritt gewähren, Panel beschriften, Autolock beobachten:

# 1. Panel beschriften
curl -X PUT http://localhost:3000/api/v1/displays/MCI1-001 \
  -H 'Content-Type: application/json' \
  -d '{"title":"Raum MCI1-001","status":"belegt","subtitle":"Belegt bis 15:15"}'

# 2. Entriegeln
curl -X POST http://localhost:3000/api/v1/doors/MCI1-001/unlock

# 3. Status prüfen — autoLockInSeconds zählt herunter
curl http://localhost:3000/api/v1/doors/MCI1-001/status

# 4. Tür öffnen und wieder schließen
curl -X POST http://localhost:3000/api/v1/doors/MCI1-001/open
curl -X POST http://localhost:3000/api/v1/doors/MCI1-001/close

# 5. Nach 5 Sekunden ist lock wieder "locked"

Fehlerformat

{
  "error": {
    "code": "door_locked",
    "message": "Tür 'MCI1-001' ist verriegelt.",
    "details": null
  }
}
CodeHTTPAuslöser
door_not_found404Unbekannte Tür-ID
door_locked409Öffnen bei verriegeltem Schloss
door_in_lockdown409Entriegeln bei gesperrter Tür
controller_offline503Schaltbefehl an ausgefallenen Controller
validation_failed400Fehlerhafter Parameter oder Körper

Schloss steuern

Die beiden Endpunkte, die ein Buchungssystem im Normalbetrieb braucht: entriegeln und Status abfragen.

POST/api/v1/doors/{id}/unlock

Entriegelt das Schloss. Im Normalbetrieb ein Impuls — nach 5 Sekunden verriegelt der Controller selbsttätig. Bei gesperrter Tür antwortet der Endpunkt mit 409 door_in_lockdown, bei ausgefallenem Controller mit 503.

curl -X POST http://localhost:3000/api/v1/doors/MCI1-001/unlock

GET/api/v1/doors/{id}/status

Minimale Statusabfrage. Liefert Schlosszustand, Türzustand, Betriebsart und die verbleibenden Sekunden bis zum Autolock.

curl http://localhost:3000/api/v1/doors/MCI1-001/status

POST/api/v1/doors/{id}/lock

Verriegelt sofort und bricht ein laufendes Autolock ab.

PUT/api/v1/doors/{id}/mode

Betriebsart setzen. auto = Normalbetrieb mit Autolock, permanent_unlock = Dauerentriegelung ohne Autolock, lockdown = dauerhaft verriegelt, Entriegeln wird abgewiesen.

{ "mode": "permanent_unlock" }

Türblatt

Das Türblatt ist vom Schloss unabhängig. Diese Endpunkte simulieren eine Person, die die Tür aufzieht oder zufallen lässt.

POST/api/v1/doors/{id}/open

Öffnet das Türblatt. Setzt ein entriegeltes Schloss voraus — sonst 409 door_locked, und der Controller protokolliert door.access_denied.

curl -X POST http://localhost:3000/api/v1/doors/MCI1-001/open

POST/api/v1/doors/{id}/close

Schließt das Türblatt. War das Schloss bereits verriegelt, fällt die Tür ein und der Zustand ajar endet.

Anzeigepanels

Jede Tür hat ein Panel unter /kiosk/{id}. Der Inhalt ist beliebiges JSON und erscheint sofort.

PUT/api/v1/displays/{id}

Setzt den Panelinhalt. Die Felder title, subtitle, status, accent, message, lines und footer werden gestaltet dargestellt; alle weiteren Felder erscheinen als Schlüssel-Wert-Liste. status steuert die Akzentfarbe: frei grün, reserviert gelb, belegt rot, wartung grau.

{
  "title": "Seminarraum 1.01",
  "subtitle": "Belegt bis 15:15",
  "status": "belegt",
  "lines": [
    { "label": "Aktuell", "value": "Corporate Finance (SE)" },
    { "label": "Danach",  "value": "15:30 Marketing Management (IL)" }
  ],
  "footer": "Buchung über raumbuchung.mci.local"
}
curl -X PUT http://localhost:3000/api/v1/displays/MCI1-001 \
  -H 'Content-Type: application/json' \
  -d '{"title":"Raum MCI1-001","status":"frei","subtitle":"Frei bis 14:00"}'

GET/api/v1/displays/{id}

Liest den aktuellen Panelinhalt samt Version und Zeitpunkt.

DELETE/api/v1/displays/{id}

Setzt das Panel auf den Standardinhalt zurück.

GET/api/v1/displays

Alle Panels auf einmal.

Bestand, Ereignisse, Verwaltung

GET/api/v1/doors

Alle Türen mit vollem Status und einer Zusammenfassung.

Abfrageparameter für /api/v1/doors
ParameterBedeutung
buildingIdz. B. MCI1
locklocked | unlocked
limit / offsetPaginierung, max. 200
curl 'http://localhost:3000/api/v1/doors?lock=unlocked'

GET/api/v1/buildings

Gebäude, Ebenen und Türzuordnung.

GET/api/v1/events

Ereignisprotokoll. Mit ?since=<seq> lassen sich gezielt nur neue Ereignisse abholen.

Abfrageparameter für /api/v1/events
ParameterBedeutung
doorIdauf eine Tür einschränken
sincenur Ereignisse mit höherer Sequenznummer
limit1–500, Standard 50

GET/api/v1/stream

Server-Sent Events. Beim Verbinden kommt eine vollständige Momentaufnahme, danach jedes Ereignis, sobald es eintritt.

const es = new EventSource("http://localhost:3000/api/v1/stream");
es.addEventListener("door.auto_locked", (e) => console.log(JSON.parse(e.data)));

PUT/api/v1/doors/{id}/controller

Simuliert Ausfall oder Rückkehr eines Türcontrollers. Ein ausgefallener Controller weist jeden Schaltbefehl mit 503 ab — damit lässt sich prüfen, wie euer System auf Hardwareausfälle reagiert.

{ "online": false }

POST/api/v1/system/lockdown

Sperrt oder gibt alle Türen frei, wahlweise nur ein Gebäude.

{ "active": true, "buildingId": "MCI1" }

POST/api/v1/system/reset

Stellt die Startbelegung wieder her (laufender Lehrbetrieb). Mit ?empty=true der Grundzustand: alle Türen verriegelt und geschlossen, Panels und Protokoll leer.