Mit der Raumsystem-Steuerung bedient ein Panel im physischen Meetingraum ein laufendes Meeting. Das Panel kann ein Wandpanel, ein Q-SYS- oder Crestron-Prozessor sein oder jedes andere Gerät, das HTTPS-Anfragen senden kann. Über HTTPS-Anfragen steuert das Panel, was auf den Bildschirmen im Raum zu sehen ist und wie und wann das Meeting beendet wird. Es sind dieselben Aktionen, die ein Moderator in der Browserapplikation auch manuell ausführen kann. Mit den folgenden Kommandos bedienen Sie einen Raum über ein Panel statt über den Browser.
Basis-URL: https://<DOMAIN-NAME>/api/v6
<DOMAIN-NAME> ist Ihre eigene Web-Meeting-Domain. Verwenden Sie die Domain, unter der Ihre Instanz läuft.
Content-Type: application/json bei jedem POST.
Die Raumsystem-API besteht aus einem Endpunkt für Kommandos und einem für den Zustand. Sie senden ein Kommando und jede Antwort enthält den Zustand des Meetings nach dem Kommando. Mit den Zustands-APIs können Sie jederzeit den aktuellen Stand abrufen und so zum Beispiel die Tasten auf dem Panel beleuchten.
Mit den Raumsystem-Kommandos können Sie kein Meeting starten. Nutzen Sie dafür die normalen REST-APIs.
Wenn Sie mit einem KI-Coding-Assistenten arbeiten, können Sie den folgenden Text in Ihren Assistenten kopieren und mit einem Satz ergänzen, der beschreibt, was Sie programmieren möchten.
Der Prompt verweist auf unsere Entwicklerdokumentation, die wir für Coding-Assistenten in einer separaten, token-optimierten KI-Version ausliefern.
Lies zuerst diese Seite, bevor Du Code schreibst:
https://www.veeting.com/de/developer-documentation/room-system-control
Sie dokumentiert die Raumsystem-Steuerung von Veeting Rooms. Halte
Dich an diese sechs Regeln:
1. Frag mich nach meiner Veeting-Domain und meinen Zugangsdaten,
bevor Du Code schreibst, sofern ich sie Dir nicht schon gegeben
habe. Rate weder das eine noch das andere.
2. Ein Aufruf war nur dann erfolgreich, wenn der HTTP-Status 200
ist UND der Body responseCode 0 enthält. Prüfe beides. Ein 402
ist eine Ablehnung und kein Serverfehler; ein erneuter Versuch
hilft nicht.
3. Nimm in der URL die 24 Zeichen lange «id» des Meetings, nie den
Meeting-Token mit den Bindestrichen aus dem Meeting-Link.
4. Kommandos wirken nur, solange das Meeting läuft. Es gibt kein
Kommando, das eines startet.
5. presentation.nextSlide und presentation.previousSlide brauchen
eine Präsentation, die jemand im Meeting bereits geöffnet hat.
6. Kommandonamen und Tool-IDs sind Identifier. Übersetze sie nie
und erfinde keine. Nimm nur die Werte von dieser Seite.
Was ich bauen möchte:Die Raumsystem-Steuerung ist standardmässig ausgeschaltet. Ein White-Label-Administrator schaltet sie in den Systemeinstellungen unter «Raumsystemfunktionen aktivieren» ein. Solange die Einstellung aus ist, antworten die nachfolgenden Endpunkte mit 402.
Sie haben drei Möglichkeiten, sich zu authentifizieren. Die Methoden unterscheiden sich darin, welche Meetings sie erreichen.
| Methode | Header | Erreicht |
|---|---|---|
| API-Key auf Kontoebene | X-API-KEY | jedes laufende Meeting des zugehörigen Kontos |
| API-Key auf Instanzebene | X-API-KEY | jedes laufende Meeting der White-Label-Instanz |
| Moderatoren-Token | X-MODERATOR-TOKEN | ein bestimmtes laufendes Meeting, nur über die /moderator/-Routen |
Für ein Raumsystem ist ein API-Key der Normalfall. Einen Key auf Kontoebene erstellen Sie in den «Kontoeinstellungen». Er ist auf die Meeting-Endpunkte beschränkt und lässt sich darum bedenkenlos in einem Raum hinterlegen. Ein Key auf Instanzebene erreicht jedes Konto und gehört nie in Kundenhand. Wie Keys ausgestellt werden und wie sie im Namen eines Users handeln, steht unter API-Nutzung.
Ein Moderatoren-Token wird für jedes einzelne Meeting neu erstellt und ist nur für dieses spezifische Meeting gültig. Mit einem Moderatoren-Token muss das Raumsystem über die /moderator/-Varianten der beiden Routen angesprochen werden. Schicken Sie ihn als Header statt in der URL, damit er nicht in Proxy- und Browser-Logs landet.
| Methode | Pfad | Zweck |
|---|---|---|
| POST | /meeting-room/<MEETING-ID>/room-system/commands | ein Kommando ausführen |
| GET | /meeting-room/<MEETING-ID>/room-system/state | den Zustand lesen |
| POST | /meeting-room/<MEETING-ID>/room-system/moderator/commands | ein Kommando ausführen, mit Moderatoren-Token |
| GET | /meeting-room/<MEETING-ID>/room-system/moderator/state | den Zustand lesen, mit Moderatoren-Token |
<MEETING-ID> ist die 24 Zeichen lange id des Meetings, also der Wert, den die Meeting-API beim Anlegen zurückgibt, zum Beispiel 6a9e7e89813a920f5679188f. Es ist nicht die meetingId mit den Bindestrichen aus dem Meeting-Link.
Der Request-Body eines Kommandos ist in beiden Varianten (API-Key und Moderatoren-Token) derselbe:
{
"command": "tool.activate",
"parameters": {
"toolId": "vr-whiteboard"
}
}Lassen Sie parameters weg, wenn ein Kommando keine braucht. Alle vier Routen liefern das Zustandsobjekt, das weiter unten beschrieben ist.
| Kommando | Erforderlich | Optional | Wirkung |
|---|---|---|---|
tool.activate | toolId | Legt ein Tool auf den Bildschirm aller Teilnehmer. Das entspricht der Taste take im Meetingraum: Sie zieht alle mit, ob «Folge mir» nun aktiv ist oder nicht. | |
presentation.goToSlide | page | documentId | Blättert die offene Präsentation auf eine absolute Seitenzahl, gezählt ab 1. |
presentation.nextSlide | documentId | Blättert auf die Seite nach der aktuellen. | |
presentation.previousSlide | documentId | Blättert auf die Seite vor der aktuellen. Bei Seite 1 ist Schluss. | |
screen.assignTool | toolId | tvChannel | Weist ein Tool einem TV-Kanal zu. Lassen Sie tvChannel weg, um die Zuweisung aufzuheben. |
screen.pinParticipant | participantId | tvChannel | Heftet einen Teilnehmer an einen TV-Kanal. Lassen Sie tvChannel weg, um die Zuweisung wieder aufzuheben. |
presentationMode.enable | Schaltet den Präsentationsmodus ein. | ||
presentationMode.disable | Schaltet den Präsentationsmodus aus. | ||
waitingRoom.lock | Schickt neu Ankommende in den Warteraum. | ||
waitingRoom.unlock | Lässt neu Ankommende wieder direkt herein. | ||
chat.clear | Leert den Gruppenchat, für alle und im Meeting-Protokoll. | ||
screensharing.forceStop | Beendet das laufende Screensharing. | ||
meeting.close | Beendet das Meeting für alle. |
| Parameter | Typ | Hinweise |
|---|---|---|
toolId | String | Einer der Tool-Identifier weiter unten. Jeder andere Wert wird abgelehnt. |
page | Integer | 1 oder grösser. |
documentId | String | Die Präsentation, die Ihrer Annahme nach offen ist. Ist eine andere offen, wird das Kommando abgelehnt, statt auf das falsche Dokument zu wirken. |
tvChannel | Integer | 0 oder grösser. Lassen Sie ihn weg, um eine Zuweisung aufzuheben. |
participantId | String | Die participantId eines Teilnehmers, aus dem Zustandsobjekt. |
Ihr Panel muss nicht mitzählen. presentation.nextSlide und presentation.previousSlide bezieht die Plattform auf die Seite, auf der das Meeting gerade steht. Ein Panel muss also nicht mitzählen. Wenn Sie die Seitenzahl anzeigen möchten, lesen Sie presentation.currentPage aus dem Zustand.
Zuerst muss eine Präsentation offen sein. Um die Präsentation zu steuern, muss jemand im Meeting sie zuvor geöffnet haben. Ohne ein solches Dokument antworten die APIs mit 402.
toolId akzeptiert diese Werte und keine anderen. Es sind Identifier, keine Beschriftungen, und sie lauten in jeder Oberflächensprache gleich.
Custom Tools heissen vr-custom-tool-0 bis vr-custom-tool-5. Wie Sie Custom Tools einrichten, steht unter Widgets im Meetingraum.
Welche Tools ein Teilnehmer überhaupt sieht, ist eine andere Frage. Das entscheiden die Meeting-Berechtigungen des Kontos. Aktivieren Sie ein Tool, das ein Teilnehmer nicht nutzen darf, bekommt er es auch nicht zu sehen.
Beide Zustandsendpunkte und jedes Kommando liefern dieses Objekt.
| Feld | Typ | Beschreibung |
|---|---|---|
activeToolId | String | Das Tool, das gerade auf dem Bildschirm liegt. Fehlt, solange niemand eines gewählt hat. |
presentation | Objekt | documentId und currentPage der offenen Präsentation, sonst null. |
presentationModeActive | Boolean | Ob der Präsentationsmodus läuft. |
waitingRoomActive | Boolean | Ob neu Ankommende in den Warteraum gehen. |
followMeActive | Boolean | Ob ein Teilnehmer den Raum mit «Folge mir» führt. |
recordingState | String | stopped, requested oder started. |
participants | Array | Alle im Meeting, ausser Teilnehmern, die unsichtbar beigetreten sind. |
Jeder Teilnehmer enthält participantId, name, isModerator und handRaised, dazu tvChannel, sofern er einem TV-Kanal zugewiesen ist.
Jede Antwort verwendet denselben Wrapper wie die REST API: { "responseCode": 0, "responseMessage": "", "data": { ... } }.
| HTTP Status | responseCode | Bedeutung |
|---|---|---|
| 200 | 0 | Das Kommando ist ausgeführt. data enthält den Zustand. |
| 401 | -99 | Sie sind nicht berechtigt, z.B. weil die Zugangsdaten fehlen oder ungültig sind. |
| 402 | -33 | Die Raumsystem-Funktion ist nicht aktiviert, oder das Meeting läuft nicht oder gehört Ihnen nicht, ein erforderlicher Parameter fehlt, keine Präsentation ist offen, oder der Teilnehmer ist nicht im Meeting. |
| 422 | -44 | Ein unbekanntes Kommando, eine unbekannte toolId, eine Seite kleiner als 1. |
Das Whiteboard auf alle Bildschirme legen:
curl -X POST "https://<DOMAIN-NAME>/api/v6/meeting-room/<MEETING-ID>/room-system/commands" \
-H "X-API-KEY: <API-KEY>" \
-H "Content-Type: application/json" \
-d '{"command":"tool.activate","parameters":{"toolId":"vr-whiteboard"}}'Eine Seite weiterblättern:
curl -X POST "https://<DOMAIN-NAME>/api/v6/meeting-room/<MEETING-ID>/room-system/commands" \
-H "X-API-KEY: <API-KEY>" \
-H "Content-Type: application/json" \
-d '{"command":"presentation.nextSlide"}'Den Zustand lesen, mit einem Moderatoren-Token statt eines Keys:
curl "https://<DOMAIN-NAME>/api/v6/meeting-room/<MEETING-ID>/room-system/moderator/state" \
-H "X-MODERATOR-TOKEN: <MODERATOR-TOKEN>"Eine erfolgreiche Antwort:
{
"responseCode": 0,
"responseMessage": "",
"data": {
"activeToolId": "vr-documents",
"presentation": { "documentId": "6710a2b4c81e4a6c8b0d2f4a", "currentPage": 7 },
"presentationModeActive": true,
"waitingRoomActive": false,
"followMeActive": false,
"recordingState": "stopped",
"participants": [
{ "participantId": "a1b2c3", "name": "Anna Meier", "isModerator": true, "handRaised": false, "tvChannel": 1 }
]
}
}Ein Panel braucht in der Regel zweierlei: eine Taste, die ein Kommando schickt, und eine Lampe, die zeigt, was im Raum läuft.
Für die Taste schicken Sie das Kommando und prüfen, ob der HTTP-Status 200 und responseCode 0 ist. Für die Lampe fragen Sie den Zustandsendpunkt regelmässig ab. Da jedes Kommando ebenfalls mit dem Zustand antwortet, können Sie den Zustand auch aus der API-Antwort übernehmen.
Legen Sie den API-Key in die Konfiguration des Panels und nicht in das Skript der einzelnen Taste. Dann müssen Sie beim Wechsel eines Keys nicht jede Taste anfassen.
Mit den Query-Parametern können Sie zum Beispiel festlegen, ob der angesprochene Browser Audio überhaupt empfangen soll. Das ist vor allem im TV-Modus interessant.
Gerade wenn Sie verschiedene Bildschirme über denselben Rechner steuern und die Browserinstanzen deshalb im Kioskmodus öffnen, möchten Sie sicherstellen, dass es im Raum kein Echo gibt. Deshalb ist es sinnvoll, z.B. nur in einer Browserinstanz Audio zu empfangen.
id.responseCode. Prüfen Sie beides.presentation.nextSlide aufrufen, bevor jemand ein Dokument geöffnet hat./moderator/ im Pfad schicken, wo er ignoriert wird.Sprechen Sie mit unserem Team über Ihre Pläne.