uMe Eyes — relay protocol 1.3 (kiosk ↔ relay service)¶
Status as of 03.11.2026. In development — in the repository
ume-eyes, not yet adopted, not yet installed on any device. This page summarises the
protocol. The binding description is relay/PROTOKOLL.md (version 1.3) in the repository
ume-eyes. The German version follows below: Deutsch. Set-up for
technicians: uMe Eyes — set-up, kiosk lock and relay service.
For IT, technicians and integration partners
Technical reference for IT departments, URG technicians and trained partners. It is not written as operating instructions for end users.
Version note — 1.2 → 1.3¶
Same MAJOR, compatible (uGo eyes, 03.11.2026):
- Four new emotions for
set_emotion:love,starstruck,sleepy,birthday(section 6). Kiosks still have only the toolset_emotion. - Mapping for older tablets: a tablet that logged in with
protocol1.2 or older receiveshappyinstead ofloveandbirthday,surprisedinstead ofstarstruckandneutralinstead ofsleepy. - New configuration field
gesicht("ume"or"ugo", default"ugo", section 4). Only an explicit"ume"switches back to the uMe face; it is changed only on the technician page. - New message relay → tablet
momentwithname∈ {losfahren,danke,wow,geburtstag,hallo,sorge,schlafen,gluecklich}: for the device test the technician page starts one of the eight standard moments on one connected tablet. Tablets with 1.2 or older getset_emotionwith the mapped value instead. The tablet applies a moment only outside a conversation, never over the warning screen or a fault. Only the face changes; nothing moves; a first name is never transmitted. helloand mDNS TXT report1.3; the tablet sendsprotocol: "1.3"inauth.
Version note — 1.1 → 1.2¶
Same MAJOR; item 1 is mandatory for version 1.2:
- Mutual authentication:
authadditionally carriesnonce(own random value of the tablet, 32 bytes = 64 hex characters, new per connection) andprotocol: "1.2".auth_okcarriesproof, computed by the relay service with its own prefix (section 3). The tablet discards everything that arrives beforeproofhas been verified; ifproofis missing or wrong it disconnects and shows question mode. With version 1.2, without a validnoncethe relay closes with 4400. - New error
busy: while the relay service checks an input transcript,ptt.startandtext.sendare rejected witherror/busy. Release push-to-talk again only after an answer,warnung,fallbackorconversation.ended. Texts with a warning term still triggerwarnung. - Warning list: matches also inside longer words (inflections, compounds), like the app; umlauts are folded to the base vowel. Accepted false positives such as „Notfallaufnahme“.
- After an answer consisting only of
set_emotion, the relay requests a spoken answer at most once per input. - WebSocket: invalid close codes → 1002, invalid close reason → 1007, tablet no longer reading (more than 1 MiB unsent) → 1008, more than 64 fragments → 1009.
- mDNS TXT
proto=1.2.
Version note — 1.0 → 1.1¶
Compatible (same MAJOR):
- New message relay → tablet
warnung(box,textwithdeanden): show the full-screen warning with exactly this text and reportstatuswithzustand: "help". conversation.endedadditionally knowsreason: "warnung".- After
ptt.stopthe relay service first waits for the input transcript and checks it against the warning list; only then is an answer requested. Without a transcript:fallback. text.sendis always checked against the warning list first, also without a running conversation and with speech off.- Only requests from the allowed networks are answered; otherwise HTTP 403, also when a WebSocket is opened.
- Robots are not polled by default (
not_polled).
The local warning check on the tablet stays mandatory; the check in the relay service is a second stage.
1 Endpoints¶
| Way | Purpose |
|---|---|
mDNS _ume-eyes._tcp |
find the relay service without typing an address; TXT proto=1.2, path=/api/v1/kiosk |
GET /api/v1/hello |
detection during the network search, without log-in |
WebSocket /api/v1/kiosk |
everything else: log-in, configuration, status, conversation |
GET /, GET /api/v1/status |
status overview, without addresses and content |
/technik |
technician page, password-protected |
Default port 8770 (TCP; HTTP and WebSocket on the same port; unencrypted ws://, only in the
closed fair router network). A hit during the search is only an answer with
service == "ume-eyes-relay" and matching protocol MAJOR:
{"type":"hello","service":"ume-eyes-relay","protocol":"1.2"}
/api/v1/hello contains no device list, no addresses and no secrets.
2 Message format¶
One JSON object (UTF-8) per WebSocket text frame, with field type. Binary frames are not used
and are answered with error/bad_request.
Largest message 256 KiB (larger → close with 1009). Unknown fields are ignored by both sides. The
relay service builds every message to the speech service itself; no field from the tablet is
passed on unchecked.
3 Log-in with device key¶
Each tablet has an ID (device_id, e.g. kiosk-box2) and its own device key (32 random bytes,
64 hex characters), created once at the relay service and entered once in the kiosk app. The key
is never sent over the network.
- Relay → tablet right after connecting:
hellowithchallengeandauth_timeout_s(5). - Tablet → relay:
authwithdevice_id,response,nonce(own random value, 64 hex characters, new per connection),protocol(1.2),app_version.response= HMAC-SHA256 with the device key overume-eyes-auth-v1|<device_id>|<challenge>, 64 lower-case hex characters. - Relay → tablet:
auth_okwithproofand the configuration.proof= HMAC-SHA256 with the same device key overume-eyes-relay-v1|<device_id>|<nonce>|<challenge>— an own prefix, so that a tablet answer can never serve as proof of the relay service. - The tablet checks
proofin constant time before it uses anything from this connection (configuration, audio, texts,warnung). Missing or wrong: disconnect, question mode, note in the technician area. A foreign device in the network therefore cannot pose as the relay service without knowing the device key.
Limitation: the connection stays unencrypted (ws://). Anyone who can read the traffic sees
audio and texts; anyone who can redirect it can take over a verified connection after the log-in.
For the fair, the closed WPA2 network is the protection. TLS is a follow-up.
Unknown ID or wrong answer → close 4403 (both cases identical, constant-time comparison); no
answer in 5 s → 4401; MAJOR ≠ 1 → error/protocol_version, close 4400; version 1.2
without a valid nonce (at least 128 bits, hexadecimal) → error/bad_request, close 4400; same ID logs in
again → the older connection is closed with 4409. Without a valid device key there is no
configuration, no status and no session at the speech service.
4 Central configuration¶
Tablet → relay {"type":"config.get"} after auth_ok and every abruf_s seconds (60). Relay →
tablet config as answer and immediately after every change on the technician page.
| Field | Meaning | Default |
|---|---|---|
revision |
increases with every change | – |
device_id, name, box |
kiosk, name, box 2/3/6 | from the assignment |
sprache |
push-to-talk and text input to the AI allowed | off |
demo |
recording demo visible | off |
lautstaerke |
volume 0–100 | 70 |
inhaltsfassung |
valid content version | from the content manifest |
gesicht |
face: "ume" (uMe face) or "ugo" (uGo eyes with glasses and moments, 1.3); any other value or a missing field counts as "ugo"; "ume" is the way back, per tablet, only on the technician page |
ugo |
abruf_s, status_s, ruecksetzen_s, sprachdienst_zeitlimit_s |
intervals and limits | 60, 10, 90, 8 |
Without the relay service the tablet uses the last valid configuration.
5 Status report¶
Tablet → relay every status_s seconds (10): zustand (idle, conversation, question_mode,
fault, help), akku, laedt, netz (wlan, lan, mobil, keins), app_version,
inhaltsfassung, letzte_interaktion_s, sprache_aktiv. No free text, no content; invalid values
become null. No status for 20 s or connection closed → overview shows offline.
6 Conversation¶
Audio: PCM 16 bit, little endian, mono, 24 000 Hz, Base64 in JSON.
| Tablet → relay | Effect |
|---|---|
conversation.start |
session at the speech service with the instructions of this tablet's box |
ptt.start / audio.append (≤ 64 KiB) / ptt.stop |
push-to-talk; after ptt.stop the transcript is checked before an answer is requested |
text.send (1–500 characters) |
text input; checked against the warning list before anything is passed on |
response.cancel |
cancel the running answer |
conversation.end |
„End“ or 90 s idle: close the session, discard state |
Every other message type (for example session.update, response.create, tool or instruction
fields) is discarded (error/discarded). Fields such as instructions, tools, voice,
model are ignored. With speech off or without a configured key the relay answers
speech_disabled or speech_not_configured; the tablet stays in question mode.
| Relay → tablet | Meaning |
|---|---|
conversation.ready |
session stands |
response.started, audio.delta, transcript.delta, response.done |
answer (transcript only for subtitles, never stored) |
set_emotion |
one of neutral, friendly, happy, curious, thoughtful, surprised, empathetic, embarrassed and, from 1.3, love, starstruck, sleepy, birthday — the only tool; it moves nothing |
moment (1.3) |
standard moment from the technician page (device test), only to 1.3 tablets, never applied during a conversation |
warnung |
warning term detected: warning screen with exactly this text, status help, no AI answer |
fallback (speech_unreachable, speech_timeout, speech_error) |
tablet switches to question mode in less than 5 s |
conversation.ended (end, idle, fallback, config, warnung) |
session closed, state discarded |
While an input transcript is being checked, ptt.start and text.send are rejected with
error/busy. If an answer consists only of set_emotion, the relay service requests a spoken
answer at most once per input.
| New value (1.3) | uGo face | sent to tablets with 1.2 or older |
|---|---|---|
love |
hearts as pupils, little hearts rise | happy |
starstruck |
stars as pupils, sparkles | surprised |
sleepy |
closed eyes, rising „z“ | neutral |
birthday |
smiling eyes, party hat, balloons, confetti | happy |
With the uMe face a 1.3 tablet also shows the expressions of the right column (sleepy: neutral
with half closed lids). Approval: the relay offers the four new values to the speech service
only when the section „MOMENTE“ of the kiosk instructions is approved and the kiosk shows the
uGo face. Otherwise set_emotion lists only the eight earlier values, and a new value that still
arrives is sent as in the right column, also to 1.3 tablets. As of 03.11.2026 the section is
approved and the default face is uGo, so the AI uses the new values.
Time limit 8 s at conversation.start, after every ptt.stop (until the transcript) and for every
answer request; the first answer data end it.
7 Warning block¶
Warning list from the approved content (wirkt_immer: true, German and English terms together),
checked against the content manifest; without the list the relay service does not start. Matching
ignores case, matches also inside longer words (inflections, compounds, like the app) and folds
umlauts to the base vowel (ä/ae → a, ö/oe → o, ü/ue → u, ß → ss). Accepted false positives: for
example „Notfallaufnahme“ (contains „Notfall“) or „heart attacks“; in case of doubt the stricter
reading applies. A response is requested only when all pending transcripts are there and free of
matches. The session at
the speech service runs without automatic turn detection and with input transcription, so the
speech service never answers by itself.
On a match: no AI answer, message warnung with the approved text S-8 (DE „Bitte sprechen Sie
sofort das Standpersonal an. In einem Notfall wählen Sie 112.“ / EN „Please speak to our booth
staff right away. In an emergency, call 112.“), conversation.ended with reason: "warnung", the
overview shows „Help requested, Box n“. The text never promises that somebody is fetched or
notified.
Limitation: with speech input the audio itself reaches the speech service before the check, because the transcript is created there. The block prevents the AI answer, not the transfer of the audio. Text inputs with a match never leave the relay service.
8 Error and close codes¶
code |
Meaning |
|---|---|
auth_required |
message before auth_ok |
protocol_version |
protocol MAJOR does not match |
bad_json / bad_request |
no valid JSON object / field missing or invalid |
discarded |
message type not allowed |
speech_disabled / speech_not_configured |
speech off for this tablet / relay service has no key |
not_in_conversation |
conversation message without conversation.start |
busy |
ptt.start or text.send while an input transcript is being checked (1.2) |
message is a short German text for the technician area, never with keys or content.
| Close code | Meaning |
|---|---|
| 1001 | relay service stops |
| 1002 | protocol error in the WebSocket frame: invalid close code or close message with only 1 byte, RSV bits set, wrong masking, control frame over 125 bytes or fragmented, continuation frame without start or new frame in the middle of a fragment sequence, unknown opcode |
| 1007 | invalid UTF-8 in the reason of a close frame or in a text frame |
| 1008 | tablet no longer reading: more than 1 MiB unsent data at the relay service |
| 1009 | message too large (over 256 KiB) or more than 64 fragments |
| 4400 | protocol version does not match |
| 4401 | log-in too late |
| 4403 | log-in rejected |
| 4409 | replaced by a newer connection of the same device |
9 Robots (read only, default off)¶
Default roboter_lesen: false: no connection to any Gateway; the overview shows „not polled“.
Switch it on only after the Gateway has a read-only role and authenticates itself to the relay
service (follow-up for the uMe development). If switched on, the relay service connects to the uMe Gateway only with an address on the
technician page and a stored pairing key, and sends only pair and ping (every 10 s) — no
control message. It reads hello, paired, status and pong; camera images are discarded at
once. No pong within 20 s → offline. The Gateway stops the robot when a paired connection is
closed; see set-up. Gateway pairing:
uMe Gateway — discovery and pairing (API 1.1).
10 Recording demo and versions¶
The recording demo runs entirely on the tablet: 0 messages to the relay service apart from the
regular status (possibly help). The relay only delivers the switch demo.
protocol = MAJOR.MINOR; same MAJOR = compatible, new fields only in MINOR and optional.
1.0: first description (31.10.2026). 1.1: warning block, wait for the input transcript, allowed
networks, robots not polled by default (31.10.2026). 1.2: mutual authentication
(nonce/proof), busy, warning list like the app, at most one re-request, WebSocket hardening
(31.10.2026). 1.3: emotions love, starstruck, sleepy, birthday with mapping for 1.2
tablets, configuration field gesicht, moments from the technician page (03.11.2026).
Faults: support@unitedrobotics.group.
United Robotics Group GmbH, An der Riede 2, 28816 Stuhr, Germany, HRB 209124 Amtsgericht Walsrode.
uMe Eyes — Vermittlungsprotokoll 1.3 (Kiosk ↔ Vermittlungsdienst)¶
Stand 03.11.2026. In Entwicklung — im Repository
ume-eyes, noch nicht übernommen, noch auf keinem Gerät eingespielt. Diese Seite fasst das
Protokoll zusammen. Verbindlich ist relay/PROTOKOLL.md (Fassung 1.3) im Repository ume-eyes.
Einrichtung für Techniker:
uMe Eyes — Einrichtung, Kiosk-Sperre und Vermittlungsdienst.
Für IT, Techniker und Integrationspartner
Technische Referenz für IT-Abteilungen, URG-Techniker und geschulte Partner. Keine Bedienungsanleitung für Endanwender.
Versionshinweis — 1.2 → 1.3¶
Gleiche MAJOR, verträglich (uGo-Augen, 03.11.2026):
- Vier neue Emotionen für
set_emotion:love,starstruck,sleepy,birthday(Abschnitt 6). Kiosks haben weiterhin nur das Werkzeugset_emotion. - Abbildung für ältere Tablets: Ein Tablet, das sich mit
protocol1.2 oder älter angemeldet hat, erhält stattloveundbirthdayden Werthappy, stattstarstruckden Wertsurprisedund stattsleepyden Wertneutral. - Neues Konfigurationsfeld
gesicht("ume"oder"ugo", Vorgabe"ugo", Abschnitt 4). Nur ein ausdrückliches"ume"schaltet auf das uMe-Gesicht zurück; geändert wird es nur auf der Technikerseite. - Neue Nachricht Dienst → Tablet
momentmitname∈ {losfahren,danke,wow,geburtstag,hallo,sorge,schlafen,gluecklich}: Für den Gerätetest startet die Technikerseite einen der acht Standard-Momente an einem verbundenen Tablet. Tablets mit 1.2 oder älter bekommen stattdessenset_emotionmit dem abgebildeten Wert. Das Tablet wendet einen Moment nur außerhalb eines Gesprächs an, nie über dem Warnbildschirm oder einer Störung. Es ändert sich nur das Gesicht; nichts bewegt sich; ein Vorname wird nie übertragen. hellound mDNS-TXT melden1.3; das Tablet sendet inauthprotocol: "1.3".
Versionshinweis — 1.1 → 1.2¶
Gleiche MAJOR; Punkt 1 ist für Fassung 1.2 Pflicht:
- Gegenseitige Anmeldung:
authenthält zusätzlichnonce(eigener Zufall des Tablets, 32 Byte = 64 Hex-Zeichen, je Verbindung neu) undprotocol: "1.2".auth_okenthältproof, vom Dienst mit eigenem Präfix berechnet (Abschnitt 3). Das Tablet verwirft alles, was vor der erfolgreichen Prüfung vonproofkommt; fehltproofoder ist er falsch, trennt es und zeigt den Fragenmodus. Bei Fassung 1.2 schließt der Dienst ohne gültigenoncemit 4400. - Neuer Fehler
busy: Solange der Dienst ein Eingabe-Transkript prüft, werdenptt.startundtext.sendmiterror/busyabgewiesen. Die Sprechtaste erst wieder freigeben, wenn eine Antwort,warnung,fallbackoderconversation.endedkam. Texte mit Warnwort lösen trotzdemwarnungaus. - Warnliste: Treffer auch innerhalb längerer Wörter (Beugungen, Zusammensetzungen) wie in der App; Umlaute auf den Grundvokal gefaltet. Bewusst hingenommene Fehltreffer wie „Notfallaufnahme“.
- Nach einer Antwort nur mit
set_emotionfordert der Dienst höchstens einmal je Eingabe eine gesprochene Antwort nach. - WebSocket: ungültige Schließcodes → 1002, ungültige Begründung → 1007, Tablet liest nicht mehr mit (über 1 MiB unversandte Daten) → 1008, mehr als 64 Fragmente → 1009.
- mDNS-TXT
proto=1.2.
Versionshinweis — 1.0 → 1.1¶
Verträglich (gleiche MAJOR):
- Neue Nachricht Dienst → Tablet
warnung(box,textmitdeunden): bildschirmfüllenden Warnbildschirm mit genau diesem Text zeigen undstatusmitzustand: "help"melden. conversation.endedkennt zusätzlichreason: "warnung".- Nach
ptt.stopwartet der Dienst zuerst auf das Eingabe-Transkript und prüft es gegen die Warnliste; erst dann wird eine Antwort angefordert. Ohne Transkript:fallback. text.sendwird immer zuerst gegen die Warnliste geprüft, auch ohne laufendes Gespräch und bei „Sprache aus“.- Beantwortet werden nur Anfragen aus den erlaubten Netzen; sonst HTTP 403, auch beim WebSocket-Aufbau.
- Roboter werden standardmäßig nicht abgefragt (
not_polled).
Die lokale Warnwort-Prüfung auf dem Tablet bleibt Pflicht; die Prüfung im Dienst ist eine zweite Stufe.
1 Endpunkte¶
| Weg | Zweck |
|---|---|
mDNS _ume-eyes._tcp |
Dienst ohne Adresseingabe finden; TXT proto=1.2, path=/api/v1/kiosk |
GET /api/v1/hello |
Erkennung bei der Netzsuche, ohne Anmeldung |
WebSocket /api/v1/kiosk |
alles andere: Anmeldung, Konfiguration, Status, Gespräch |
GET /, GET /api/v1/status |
Statusübersicht, ohne Adressen und Inhalte |
/technik |
Technikerseite, kennwortgeschützt |
Vorgabe-Port 8770 (TCP; HTTP und WebSocket auf demselben Port; unverschlüsselt ws://, nur
im geschlossenen Messerouter-Netz). Treffer bei der Suche ist nur eine Antwort mit
service == "ume-eyes-relay" und passender Protokoll-MAJOR:
{"type":"hello","service":"ume-eyes-relay","protocol":"1.2"}
/api/v1/hello enthält keine Geräteliste, keine Adressen und keine Geheimnisse.
2 Nachrichtenformat¶
Ein JSON-Objekt (UTF-8) je WebSocket-Textrahmen, mit Feld type. Binärrahmen werden nicht
verwendet und mit error/bad_request beantwortet. Größte Nachricht 256 KiB (größer → Schließen mit 1009). Unbekannte Felder ignorieren
beide Seiten. Der Dienst baut jede Nachricht an den Sprachdienst selbst; kein Feld vom Tablet wird
ungeprüft weitergereicht.
3 Anmeldung mit Geräteschlüssel¶
Jedes Tablet hat eine Kennung (device_id, z. B. kiosk-box2) und einen eigenen Geräteschlüssel
(32 Byte Zufall, 64 Hex-Zeichen), einmal am Dienst erzeugt und einmal in der Kiosk-App eingegeben.
Der Schlüssel wird nie über das Netz gesendet.
- Dienst → Tablet direkt nach dem Verbindungsaufbau:
hellomitchallengeundauth_timeout_s(5). - Tablet → Dienst:
authmitdevice_id,response,nonce(eigener Zufall, 64 Hex-Zeichen, je Verbindung neu),protocol(1.2),app_version.response= HMAC-SHA256 mit dem Geräteschlüssel überume-eyes-auth-v1|<device_id>|<challenge>, 64 Hex-Zeichen klein. - Dienst → Tablet:
auth_okmitproofund der Konfiguration.proof= HMAC-SHA256 mit demselben Geräteschlüssel überume-eyes-relay-v1|<device_id>|<nonce>|<challenge>— eigenes Präfix, damit eine Tablet-Antwort nie als Beweis des Dienstes taugt. - Das Tablet prüft
proofin konstanter Zeit, bevor es irgendetwas aus dieser Verbindung verwendet (Konfiguration, Audio, Texte,warnung). Fehltproofoder ist er falsch: trennen, Fragenmodus, Meldung im Technikerbereich. Ein fremdes Gerät im Netz kann sich so nicht als Dienst ausgeben, ohne den Geräteschlüssel zu kennen.
Grenze: Die Verbindung bleibt unverschlüsselt (ws://). Wer den Verkehr mitlesen kann, sieht
Audio und Texte; wer ihn umleiten kann, kann eine geprüfte Verbindung nach der Anmeldung
übernehmen. Für die Messe schützt das geschlossene WPA2-Netz. TLS ist ein Folgeschritt.
Unbekannte Kennung oder falsche Antwort → Schließen 4403 (beide Fälle gleich, Vergleich in
konstanter Zeit); keine Antwort in 5 s → 4401; MAJOR ≠ 1 → error/protocol_version, Schließen
4400; Fassung 1.2 ohne gültige nonce (mind. 128 Bit, hexadezimal) → error/bad_request,
Schließen 4400; dieselbe Kennung meldet sich erneut an → ältere Verbindung wird mit 4409 geschlossen.
Ohne gültigen Geräteschlüssel gibt es keine Konfiguration, keinen Status und keine Sitzung beim
Sprachdienst.
4 Zentrale Konfiguration¶
Tablet → Dienst {"type":"config.get"} nach auth_ok und alle abruf_s Sekunden (60). Dienst →
Tablet config als Antwort und sofort nach jeder Änderung auf der Technikerseite.
| Feld | Bedeutung | Vorgabe |
|---|---|---|
revision |
steigt bei jeder Änderung | – |
device_id, name, box |
Kiosk, Name, Box 2/3/6 | aus der Zuordnung |
sprache |
Sprechtaste und Texteingabe an die KI erlaubt | aus |
demo |
Aufnahme-Demo sichtbar | aus |
lautstaerke |
Lautstärke 0–100 | 70 |
inhaltsfassung |
gültige Inhaltsfassung | aus dem Inhaltsmanifest |
gesicht |
Gesicht: "ume" (uMe-Gesicht) oder "ugo" (uGo-Augen mit Brille und Momenten, 1.3); jeder andere Wert und ein fehlendes Feld gelten als "ugo"; "ume" ist der Rückweg, je Tablet, nur auf der Technikerseite |
ugo |
abruf_s, status_s, ruecksetzen_s, sprachdienst_zeitlimit_s |
Intervalle und Fristen | 60, 10, 90, 8 |
Ohne Dienst gilt auf dem Tablet die zuletzt gültige Konfiguration.
5 Statusmeldung¶
Tablet → Dienst alle status_s Sekunden (10): zustand (idle, conversation, question_mode,
fault, help), akku, laedt, netz (wlan, lan, mobil, keins), app_version,
inhaltsfassung, letzte_interaktion_s, sprache_aktiv. Keine freien Texte, keine Inhalte;
ungültige Werte werden null. 20 s kein status oder Verbindung getrennt → Übersicht zeigt
offline.
6 Gespräch¶
Audio: PCM 16 bit, little endian, mono, 24 000 Hz, Base64 in JSON.
| Tablet → Dienst | Wirkung |
|---|---|
conversation.start |
Sitzung beim Sprachdienst mit den Anweisungen der Box dieses Tablets |
ptt.start / audio.append (≤ 64 KiB) / ptt.stop |
Sprechtaste; nach ptt.stop wird das Transkript geprüft, bevor eine Antwort angefordert wird |
text.send (1–500 Zeichen) |
Texteingabe; wird vor jeder Weitergabe gegen die Warnliste geprüft |
response.cancel |
laufende Antwort abbrechen |
conversation.end |
„Ende“ oder 90 s Leerlauf: Sitzung schließen, Zustand verwerfen |
Jeder andere Nachrichtentyp (z. B. session.update, response.create, Werkzeug- oder
Anweisungsfelder) wird verworfen (error/discarded). Felder wie instructions, tools,
voice, model werden ignoriert. Bei „Sprache aus“ oder ohne Schlüssel antwortet der Dienst mit
speech_disabled bzw. speech_not_configured; das Tablet bleibt im Fragenmodus.
| Dienst → Tablet | Bedeutung |
|---|---|
conversation.ready |
Sitzung steht |
response.started, audio.delta, transcript.delta, response.done |
Antwort (Transkript nur für Untertitel, nie gespeichert) |
set_emotion |
eine von neutral, friendly, happy, curious, thoughtful, surprised, empathetic, embarrassed und ab 1.3 love, starstruck, sleepy, birthday — das einzige Werkzeug; es bewegt nichts |
moment (1.3) |
Standard-Moment von der Technikerseite (Gerätetest), nur an 1.3-Tablets, nie während eines Gesprächs angewandt |
warnung |
Warnbegriff erkannt: Warnbildschirm mit genau diesem Text, status help, keine KI-Antwort |
fallback (speech_unreachable, speech_timeout, speech_error) |
Tablet wechselt in weniger als 5 s in den Fragenmodus |
conversation.ended (end, idle, fallback, config, warnung) |
Sitzung geschlossen, Zustand verworfen |
Solange ein Eingabe-Transkript geprüft wird, werden ptt.start und text.send mit
error/busy abgewiesen. Besteht eine Antwort nur aus set_emotion, fordert der Dienst höchstens
einmal je Eingabe eine gesprochene Antwort nach.
| Neuer Wert (1.3) | uGo-Gesicht | an Tablets mit 1.2 oder älter |
|---|---|---|
love |
Herzen als Pupillen, Herzchen steigen auf | happy |
starstruck |
Sterne als Pupillen, Funkeln | surprised |
sleepy |
geschlossene Augen, aufsteigende „z“ | neutral |
birthday |
lachende Augen, Partyhut, Ballons, Konfetti | happy |
Im uMe-Gesicht zeigt auch ein 1.3-Tablet die Ausdrücke der rechten Spalte (sleepy: neutral mit
halb geschlossenen Lidern). Freigabe: Der Dienst meldet die vier neuen Werte beim
Sprachdienst nur an, wenn der Abschnitt „MOMENTE“ der Kiosk-Anweisungen freigegeben ist und der
Kiosk das uGo-Gesicht zeigt. Sonst enthält set_emotion nur die acht bisherigen Werte, und ein
trotzdem ankommender neuer Wert geht wie in der rechten Spalte hinaus, auch an 1.3-Tablets. Stand
03.11.2026: Der Abschnitt ist freigegeben und die Vorgabe ist das uGo-Gesicht, die KI nutzt die
neuen Werte also.
Frist 8 s bei conversation.start, nach jedem ptt.stop (bis zum Transkript) und bei jeder
Antwortanforderung; die ersten Antwortdaten beenden sie.
7 Warnwort-Sperre¶
Warnliste aus den freigegebenen Inhalten (wirkt_immer: true, deutsche und englische Begriffe
gleichzeitig), geprüft gegen das Inhaltsmanifest; ohne Liste startet der Dienst nicht. Abgleich
ohne Groß-/Kleinschreibung, auch innerhalb längerer Wörter (Beugungen, Zusammensetzungen, wie
die App), Umlaute auf den Grundvokal gefaltet (ä/ae → a, ö/oe → o, ü/ue → u, ß → ss). Bewusst
hingenommene Fehltreffer: z. B. „Notfallaufnahme“ (enthält „Notfall“) oder „heart attacks“; im
Zweifel gilt die strengere Auslegung. Eine Antwort wird erst angefordert, wenn alle offenen
Transkripte da und ohne Treffer sind. Die Sitzung beim
Sprachdienst läuft ohne automatische Sprecherkennung und mit Eingabe-Transkription; der
Sprachdienst antwortet nie von selbst.
Bei einem Treffer: keine KI-Antwort, Nachricht warnung mit dem freigegebenen Text S-8 (DE „Bitte
sprechen Sie sofort das Standpersonal an. In einem Notfall wählen Sie 112.“ / EN „Please speak to
our booth staff right away. In an emergency, call 112.“), conversation.ended mit
reason: "warnung", die Übersicht zeigt „Hilfe angefordert, Box n“. Der Text verspricht nie, dass
jemand geholt oder benachrichtigt wird.
Grenze: Bei Spracheingabe erreicht das Audio selbst den Sprachdienst vor der Prüfung, denn das Transkript entsteht dort. Die Sperre verhindert die KI-Antwort, nicht die Übertragung des Audios. Texteingaben mit Treffer verlassen den Dienst nie.
8 Fehler- und Schließcodes¶
code |
Bedeutung |
|---|---|
auth_required |
Nachricht vor auth_ok |
protocol_version |
Protokoll-MAJOR passt nicht |
bad_json / bad_request |
kein gültiges JSON-Objekt / Feld fehlt oder ungültig |
discarded |
Nachrichtentyp nicht erlaubt |
speech_disabled / speech_not_configured |
Sprache für dieses Tablet aus / Dienst hat keinen Schlüssel |
not_in_conversation |
Gesprächsnachricht ohne conversation.start |
busy |
ptt.start oder text.send, während ein Eingabe-Transkript geprüft wird (1.2) |
message ist ein kurzer deutscher Text für den Technikerbereich, nie mit Schlüsseln oder
Inhalten.
| Schließcode | Bedeutung |
|---|---|
| 1001 | Dienst wird beendet |
| 1002 | Protokollfehler im WebSocket-Rahmen: ungültiger Schließcode oder Schließnachricht mit nur 1 Byte, gesetzte RSV-Bits, falsche Maskierung, Steuerrahmen über 125 Byte oder fragmentiert, Fortsetzungsrahmen ohne Anfang bzw. neuer Rahmen mitten in einer Fragmentfolge, unbekannter Opcode |
| 1007 | ungültiges UTF-8 in der Begründung eines Schließrahmens oder in einem Textrahmen |
| 1008 | Tablet liest nicht mehr mit: über 1 MiB unversandte Daten beim Dienst |
| 1009 | Nachricht zu groß (über 256 KiB) oder mehr als 64 Fragmente |
| 4400 | Protokollfassung passt nicht |
| 4401 | Anmeldung nicht rechtzeitig |
| 4403 | Anmeldung abgelehnt |
| 4409 | durch neuere Verbindung desselben Geräts ersetzt |
9 Roboter (nur lesen, Vorgabe aus)¶
Vorgabe roboter_lesen: false: keine Verbindung zu irgendeinem Gateway; die Übersicht zeigt
„nicht abgefragt“. Erst einschalten, wenn das Gateway eine reine Leserolle hat und sich gegenüber
dem Dienst selbst ausweist (Folgepunkt für die uMe-Entwicklung). Eingeschaltet verbindet sich der Dienst mit dem uMe Gateway nur mit
einer Adresse auf der Technikerseite und einem hinterlegten Kopplungsschlüssel und sendet
ausschließlich pair und ping (alle 10 s) — keine Steuernachricht. Gelesen werden hello,
paired, status und pong; Kamerabilder werden sofort verworfen. Kein pong in 20 s →
offline. Das Gateway hält den Roboter an, wenn eine gekoppelte Verbindung getrennt wird; siehe
Einrichtung. Kopplung am
Gateway: uMe Gateway — Suche und Kopplung (API 1.1).
10 Aufnahme-Demo und Fassungen¶
Die Aufnahme-Demo läuft vollständig auf dem Tablet: 0 Nachrichten an den Dienst außer dem
regulären status (ggf. help). Der Dienst liefert nur den Schalter demo.
protocol = MAJOR.MINOR; gleiche MAJOR = verträglich, neue Felder nur als MINOR und optional.
1.0: erste Beschreibung (31.10.2026). 1.1: Warnwort-Sperre, Warten auf das Eingabe-Transkript,
erlaubte Netze, Roboter standardmäßig nicht abgefragt (31.10.2026). 1.2: gegenseitige Anmeldung
(nonce/proof), busy, Warnliste wie die App, höchstens eine Nachforderung, WebSocket-Härtung
(31.10.2026). 1.3: Emotionen love, starstruck, sleepy, birthday mit Abbildung für
1.2-Tablets, Konfigurationsfeld gesicht, Momente von der Technikerseite (03.11.2026).
Störungen: support@unitedrobotics.group.
United Robotics Group GmbH, An der Riede 2, 28816 Stuhr, Deutschland, HRB 209124 Amtsgericht Walsrode.