Skip to content

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):

  1. Four new emotions for set_emotion: love, starstruck, sleepy, birthday (section 6). Kiosks still have only the tool set_emotion.
  2. Mapping for older tablets: a tablet that logged in with protocol 1.2 or older receives happy instead of love and birthday, surprised instead of starstruck and neutral instead of sleepy.
  3. 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.
  4. New message relay → tablet moment with name ∈ {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 get set_emotion with 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.
  5. hello and mDNS TXT report 1.3; the tablet sends protocol: "1.3" in auth.

Version note — 1.1 → 1.2

Same MAJOR; item 1 is mandatory for version 1.2:

  1. Mutual authentication: auth additionally carries nonce (own random value of the tablet, 32 bytes = 64 hex characters, new per connection) and protocol: "1.2". auth_ok carries proof, computed by the relay service with its own prefix (section 3). The tablet discards everything that arrives before proof has been verified; if proof is missing or wrong it disconnects and shows question mode. With version 1.2, without a valid nonce the relay closes with 4400.
  2. New error busy: while the relay service checks an input transcript, ptt.start and text.send are rejected with error/busy. Release push-to-talk again only after an answer, warnung, fallback or conversation.ended. Texts with a warning term still trigger warnung.
  3. 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“.
  4. After an answer consisting only of set_emotion, the relay requests a spoken answer at most once per input.
  5. WebSocket: invalid close codes → 1002, invalid close reason → 1007, tablet no longer reading (more than 1 MiB unsent) → 1008, more than 64 fragments → 1009.
  6. mDNS TXT proto=1.2.

Version note — 1.0 → 1.1

Compatible (same MAJOR):

  1. New message relay → tablet warnung (box, text with de and en): show the full-screen warning with exactly this text and report status with zustand: "help".
  2. conversation.ended additionally knows reason: "warnung".
  3. After ptt.stop the 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.
  4. text.send is always checked against the warning list first, also without a running conversation and with speech off.
  5. Only requests from the allowed networks are answered; otherwise HTTP 403, also when a WebSocket is opened.
  6. 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.

  1. Relay → tablet right after connecting: hello with challenge and auth_timeout_s (5).
  2. Tablet → relay: auth with device_id, response, nonce (own random value, 64 hex characters, new per connection), protocol (1.2), app_version. response = HMAC-SHA256 with the device key over ume-eyes-auth-v1|<device_id>|<challenge>, 64 lower-case hex characters.
  3. Relay → tablet: auth_ok with proof and the configuration. proof = HMAC-SHA256 with the same device key over ume-eyes-relay-v1|<device_id>|<nonce>|<challenge> — an own prefix, so that a tablet answer can never serve as proof of the relay service.
  4. The tablet checks proof in 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):

  1. Vier neue Emotionen für set_emotion: love, starstruck, sleepy, birthday (Abschnitt 6). Kiosks haben weiterhin nur das Werkzeug set_emotion.
  2. Abbildung für ältere Tablets: Ein Tablet, das sich mit protocol 1.2 oder älter angemeldet hat, erhält statt love und birthday den Wert happy, statt starstruck den Wert surprised und statt sleepy den Wert neutral.
  3. 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.
  4. Neue Nachricht Dienst → Tablet moment mit name ∈ {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 stattdessen set_emotion mit 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.
  5. hello und mDNS-TXT melden 1.3; das Tablet sendet in auth protocol: "1.3".

Versionshinweis — 1.1 → 1.2

Gleiche MAJOR; Punkt 1 ist für Fassung 1.2 Pflicht:

  1. Gegenseitige Anmeldung: auth enthält zusätzlich nonce (eigener Zufall des Tablets, 32 Byte = 64 Hex-Zeichen, je Verbindung neu) und protocol: "1.2". auth_ok enthält proof, vom Dienst mit eigenem Präfix berechnet (Abschnitt 3). Das Tablet verwirft alles, was vor der erfolgreichen Prüfung von proof kommt; fehlt proof oder ist er falsch, trennt es und zeigt den Fragenmodus. Bei Fassung 1.2 schließt der Dienst ohne gültige nonce mit 4400.
  2. Neuer Fehler busy: Solange der Dienst ein Eingabe-Transkript prüft, werden ptt.start und text.send mit error/busy abgewiesen. Die Sprechtaste erst wieder freigeben, wenn eine Antwort, warnung, fallback oder conversation.ended kam. Texte mit Warnwort lösen trotzdem warnung aus.
  3. Warnliste: Treffer auch innerhalb längerer Wörter (Beugungen, Zusammensetzungen) wie in der App; Umlaute auf den Grundvokal gefaltet. Bewusst hingenommene Fehltreffer wie „Notfallaufnahme“.
  4. Nach einer Antwort nur mit set_emotion fordert der Dienst höchstens einmal je Eingabe eine gesprochene Antwort nach.
  5. 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.
  6. mDNS-TXT proto=1.2.

Versionshinweis — 1.0 → 1.1

Verträglich (gleiche MAJOR):

  1. Neue Nachricht Dienst → Tablet warnung (box, text mit de und en): bildschirmfüllenden Warnbildschirm mit genau diesem Text zeigen und status mit zustand: "help" melden.
  2. conversation.ended kennt zusätzlich reason: "warnung".
  3. Nach ptt.stop wartet der Dienst zuerst auf das Eingabe-Transkript und prüft es gegen die Warnliste; erst dann wird eine Antwort angefordert. Ohne Transkript: fallback.
  4. text.send wird immer zuerst gegen die Warnliste geprüft, auch ohne laufendes Gespräch und bei „Sprache aus“.
  5. Beantwortet werden nur Anfragen aus den erlaubten Netzen; sonst HTTP 403, auch beim WebSocket-Aufbau.
  6. 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.

  1. Dienst → Tablet direkt nach dem Verbindungsaufbau: hello mit challenge und auth_timeout_s (5).
  2. Tablet → Dienst: auth mit device_id, response, nonce (eigener Zufall, 64 Hex-Zeichen, je Verbindung neu), protocol (1.2), app_version. response = HMAC-SHA256 mit dem Geräteschlüssel über ume-eyes-auth-v1|<device_id>|<challenge>, 64 Hex-Zeichen klein.
  3. Dienst → Tablet: auth_ok mit proof und der Konfiguration. proof = HMAC-SHA256 mit demselben Geräteschlüssel über ume-eyes-relay-v1|<device_id>|<nonce>|<challenge> — eigenes Präfix, damit eine Tablet-Antwort nie als Beweis des Dienstes taugt.
  4. Das Tablet prüft proof in konstanter Zeit, bevor es irgendetwas aus dieser Verbindung verwendet (Konfiguration, Audio, Texte, warnung). Fehlt proof oder 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.