API-Anforderungen für Gebäudezustandsmeldungen
Version: 1.0
Stand: 2026-10
Herausgeber: Dexa Solutions GmbH
Produkt: Safe Fire House (SFH) – Einbruchwarnsystem (EWS)
1. Übersicht
Diese Spezifikation beschreibt die REST-Schnittstelle, über die ein Drittsystem – zum Beispiel eine Zutrittskontrollanlage, eine Gebäudeleittechnik oder eine Hausautomation – dem Einbruchwarnsystem der Safe-Fire-House-Zentrale den Gebäudezustand meldet und den Zustand der Anlage abfragt.
Die Schnittstelle ersetzt den potentialfreien Kontakt eines Schlüsselschalters: Statt einen Draht zu schalten, teilt das Drittsystem der Zentrale über das Netzwerk mit, ob das Gebäude zugeschlossen oder aufgeschlossen ist.
1.1 Grundprinzip: Zustand statt Befehl
Das Drittsystem meldet ausschließlich einen Zustand, keinen Schaltbefehl. Ob daraus ein Scharf- oder Unscharfschalten folgt, entscheidet das Regelwerk der Zentrale – nach denselben Regeln wie beim Schlüsselschalter (Abschnitt 6).
Ein fehlerhaftes oder kompromittiertes Drittsystem kann dadurch höchstens einen falschen Gebäudezustand behaupten. Die Schutzregeln der Anlage – aktiver Alarm, Wartung, Störung – bleiben immer davor.
1.2 Funktionen
/api/intrusion/access/state
Lesen
Gebäudezustand melden
POST
/api/intrusion/access/report
Lesen und Schreiben
2. API-Parameter
https://{adresse-der-zentrale} – wird bei der Einrichtung mitgeteilt
Content-Type
application/json; charset=UTF-8
Accept
application/json
Zeichenkodierung
UTF-8
Max. Größe einer Anfrage
4 KB
Jede Zentrale hat eine Adresse, auch wenn sie mehrere Standorte überwacht. Welcher Standort gemeint ist, steht als Standort-Kennung in der Anfrage (Abschnitt 2.2).
Die Schnittstelle ist in der Voreinstellung nur im internen Netz des Kunden erreichbar. Ein Zugang von außen wird nur auf ausdrücklichen Wunsch eingerichtet.
2.1 Authentifizierung
Die Authentifizierung erfolgt über einen Zugangsschlüssel (Token) im HTTP-Kopf:
Authorization: Bearer {zugangsschluessel}
Der Schlüssel gehört ausschließlich in den Kopf der Anfrage, niemals in die Adresse. Adressen werden in Protokollen gespeichert, der Kopf nicht.
Empfehlung: Für Systeme, die den Zustand nur anzeigen, einen Schlüssel mit Recht „nur lesen“ verwenden. Wird ein solches System kompromittiert, kann die Anlage darüber nicht beeinflusst werden.
2.2 Standort-Kennung
Jeder Standort einer Zentrale hat eine Standort-Kennung (locationHash, 32 Zeichen hexadezimal). Sie wird bei der Einrichtung mitgeteilt.
Die Standort-Kennung ist **keine** Berechtigung. Sie sagt nur, welcher Standort gemeint ist. Ob er gemeldet oder abgefragt werden darf, entscheidet allein der Zugangsschlüssel. Eine Meldung für einen Standort, für den der Schlüssel nicht freigegeben ist, wird abgewiesen.
2.3 Rate Limiting
Ein Zutrittssystem meldet bei Zustandswechsel und höchstens ein Lebenszeichen pro Minute. Mehr Anfragen sind im Betrieb nicht vorgesehen.
3. Zustand abfragen (GET)
Liefert den Zustand der Anlage für alle Standorte, für die der Schlüssel freigegeben ist.
3.1 Request
GET /api/intrusion/access/state HTTP/1.1
Host: {adresse-der-zentrale}
Authorization: Bearer {zugangsschluessel}
Accept: application/json
3.2 Response (Erfolg)
HTTP/1.1 200 OK
Content-Type: application/json
{
"locations": [
{
"locationHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718",
"name": "Lagerhalle Nord",
"armingState": "armed",
"alarmState": "none",
"fault": false,
"lastReportAt": "2026-10-14T06:58:12.000Z"
}
],
"timestamp": "2026-10-14T07:02:40.000Z"
}
3.3 Response-Felder
Root-Objekt
locations
array
Ein Eintrag je freigegebenem Standort
timestamp
string
Zeitpunkt der Antwort (ISO 8601, UTC)
locations-Objekt (Array-Element)
locationHash
string
Standort-Kennung
name
string
Name des Standorts
armingState
string
Scharfzustand der Anlage (siehe Enum)
alarmState
string
Alarmzustand der Anlage (siehe Enum)
fault
boolean
true, wenn an diesem Standort eine Störung vorliegt – der Schnittstelle oder der Anlage (z. B. Kamera, Netzwerk)
lastReportAt
string | null
Zeitpunkt der letzten angenommenen Meldung (ISO 8601, UTC), null wenn noch keine Meldung einging
armingState Enum
armed
Standort ist scharf
arming
Scharfschaltung läuft (Vorlaufzeit, Kameras starten)
disarmed
Standort ist unscharf
alarmState Enum
none
Kein Alarm
prealarm
Voralarm läuft
alarm
Alarm ist ausgelöst und noch nicht quittiert
Scharfzustand und Alarmzustand sind bewusst zwei getrennte Felder. Der Zustand „unscharf, Alarm noch offen“ entsteht, wenn bei laufendem Alarm aufgeschlossen wird (Abschnitt 6).
Den Gebäudezustand selbst (auf- oder zugeschlossen) liefert die Abfrage nicht zurück – diesen kennt das Drittsystem selbst.
4. Gebäudezustand melden (POST)
Meldet der Zentrale, ob das Gebäude eines Standorts zugeschlossen oder aufgeschlossen ist. Erfordert einen Schlüssel mit Recht „lesen und schreiben“.
4.1 Request
POST /api/intrusion/access/report HTTP/1.1
Host: {adresse-der-zentrale}
Authorization: Bearer {zugangsschluessel}
Content-Type: application/json
Accept: application/json
4.2 Request-Body
{
"locationHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718",
"buildingLocked": true,
"timestamp": "2026-10-14T06:58:12Z"
}
4.3 Request-Felder
locationHash
string
✓
Standort-Kennung des gemeldeten Standorts
buildingLocked
boolean
✓
true = Gebäude zugeschlossen, false = Gebäude aufgeschlossen
timestamp
string
Zeitpunkt der Meldung (ISO 8601). Empfohlen – aktiviert den Wiederholschutz (Abschnitt 7.2)
`buildingLocked` muss ein echter Wahrheitswert sein: `true` oder `false`. Zeichenketten wie `"true"`, Zahlen wie `1` oder fehlende Werte werden mit HTTP 400 abgewiesen.
4.4 Response (Erfolg)
HTTP/1.1 200 OK
Content-Type: application/json
{
"ok": true,
"accepted": { "buildingLocked": true },
"timestamp": "2026-10-14T06:58:12.000Z"
}
ok
boolean
true, wenn die Meldung angenommen wurde
accepted.buildingLocked
boolean
Der angenommene Gebäudezustand
timestamp
string
Zeitpunkt der Verarbeitung (ISO 8601, UTC)
„Angenommen“ heißt: Die Zentrale kennt jetzt den neuen Gebäudezustand. Ob die Anlage daraufhin geschaltet hat, zeigt die Abfrage (Abschnitt 3) – die Scharfschaltung kann je nach Regelwerk ausbleiben oder mit Vorlaufzeit erfolgen.
5. Fehlerbehandlung
5.1 HTTP-Statuscodes
200
OK
Abfrage beantwortet bzw. Meldung angenommen
400
Bad Request
Ungültiger Inhalt, buildingLocked kein Wahrheitswert, oder timestamp unlesbar, zu alt bzw. bereits verwendet
401
Unauthorized
Schlüssel fehlt oder ist unbekannt
403
Forbidden
Schlüssel widerrufen oder abgelaufen, Absender nicht freigegeben, Standort für diesen Schlüssel nicht freigegeben, Schlüssel nur lesend, oder Anfrage nicht verschlüsselt (http statt https)
404
Not Found
Unbekannter Pfad
413
Payload Too Large
Anfrage größer als 4 KB
429
Too Many Requests
Rate Limit überschritten
503
Service Unavailable
Schnittstelle auf der Zentrale vorübergehend nicht verfügbar
5.2 Fehler-Response
{
"error": "forbidden"
}
unauthorized
Zugang abgewiesen (Schlüssel fehlt, unbekannt, widerrufen, abgelaufen oder Absender nicht freigegeben)
read_only
Schlüssel hat nur Leserecht
forbidden
Standort für diesen Schlüssel nicht freigegeben
bad_request
Inhalt ungültig
not_found
Unbekannter Pfad
unavailable
Schnittstelle vorübergehend nicht verfügbar
Die Fehlermeldungen nach außen sind bewusst knapp und nennen nicht, woran eine Anmeldung gescheitert ist. Der genaue Grund steht im Prüfprotokoll der Zentrale und kann vom Errichter bzw. von dexa eingesehen werden.
5.3 Retry-Strategie (Drittsystem)
Bei einer Wiederholung mit Zeitstempel bitte einen neuen Zeitstempel verwenden – eine Anfrage mit bereits verwendetem Zeitstempel wird als Wiederholung abgewiesen.
6. Verhalten der Anlage
Eine angenommene Meldung wirkt wie das Schalten eines Schlüsselschalters:
false)
Standort wird sofort unscharf geschaltet, ohne Vorlaufzeit
Zugeschlossen (true)
Standort wird über den normalen Weg scharf geschaltet: Vorlaufzeit, Kamerastart, Kameraprüfung
Gleicher Zustand wie zuvor
Keine Wirkung
Erste Meldung nach Einrichtung
Zustand wird übernommen, es wird noch nicht geschaltet
6.1 Schutzregeln
Der zuletzt gemeldete Gebäudezustand bleibt auch über einen Neustart der Zentrale erhalten.
6.2 Lebenszeichen
Anders als beim Kontakt eines Schlüsselschalters meldet sich ein Ausfall des Drittsystems nicht von selbst – ein Drahtbruch wird erkannt, ein stummes Drittsystem nicht.
Deshalb kann je Zugangsschlüssel ein **Lebenszeichen** eingestellt werden: „Meldung erwartet alle … Minuten“ (Vorschlag 15 Minuten). **Jede** Anfrage zählt als Lebenszeichen, auch eine reine Abfrage – ein eigener Aufruf ist nicht nötig.
Empfehlung: Das Drittsystem fragt in regelmäßigen Abständen den Zustand ab (Abschnitt 3) und die Zentrale wird mit Lebenszeichen betrieben.
7. Sicherheitsanforderungen
7.1 Übersicht
7.2 Wiederholschutz
Wird ein timestamp mitgesendet, prüft die Zentrale:
Damit kann eine mitgeschnittene Anfrage nicht später erneut eingespielt werden. Ohne timestamp entfällt dieser Schutz für die betreffende Anfrage; die Uhr des Drittsystems sollte deshalb über NTP synchronisiert sein und der Zeitstempel immer mitgesendet werden.
8. Beispiel: Vollständiger Ablauf
8.1 Schritt 1: Gebäude wird abends zugeschlossen
curl -X POST "https://{adresse-der-zentrale}/api/intrusion/access/report" \
-H "Authorization: Bearer {zugangsschluessel}" \
-H "Content-Type: application/json" \
-d '{
"locationHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718",
"buildingLocked": true,
"timestamp": "2026-10-14T18:05:00Z"
}'
Response:
{ "ok": true, "accepted": { "buildingLocked": true }, "timestamp": "2026-10-14T18:05:00.412Z" }
8.2 Schritt 2: Scharfschaltung prüfen
curl -X GET "https://{adresse-der-zentrale}/api/intrusion/access/state" \
-H "Authorization: Bearer {zugangsschluessel}" \
-H "Accept: application/json"
Response während der Vorlaufzeit:
{
"locations": [
{ "locationHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718", "name": "Lagerhalle Nord",
"armingState": "arming", "alarmState": "none", "fault": false,
"lastReportAt": "2026-10-14T18:05:00.412Z" }
],
"timestamp": "2026-10-14T18:05:20.000Z"
}
Nach Ablauf der Vorlaufzeit wechselt armingState auf armed.
8.3 Schritt 3: Gebäude wird morgens aufgeschlossen
curl -X POST "https://{adresse-der-zentrale}/api/intrusion/access/report" \
-H "Authorization: Bearer {zugangsschluessel}" \
-H "Content-Type: application/json" \
-d '{
"locationHash": "9f2c4e7a1b3d5f6081a2c3d4e5f60718",
"buildingLocked": false,
"timestamp": "2026-10-15T06:30:00Z"
}'
Der Standort wird sofort unscharf; die Abfrage liefert danach "armingState": "disarmed".
9. Einrichtung
Anhang A: Constraints
locationHash
32 Zeichen, hexadezimal (0-9, a-f), Groß-/Kleinschreibung egal
buildingLocked
JSON-Wahrheitswert true oder false
timestamp
ISO 8601, höchstens 5 Minuten Abweichung zur Zentrale, je Schlüssel nur einmal verwendbar
Größe einer Anfrage
Max. 4 KB
Methoden
GET, POST
Anfragerate
1 pro Sekunde je Absender, kurzzeitig bis zu 5