OmegaSim Wiki

OmegaSim Wiki – die Idee dazu stammt von Gnen54. Hier stehen die offenen Artikel von Nutzer Luuke42 unter der Lizenz CC BY-SA 4.0.

Carrera HYBRID

Stand dieses Artikels: OmegaSim 1.2.9 vom 26.10.2026 · Firmware des Autos: nicht bekannt (OmegaSim liest die Firmware-Version nicht aus)
Dieser Text wurde mithilfe von KI erstellt (Claude) und ist nicht in jedem Punkt von Menschen geprüft. Fehler bitte direkt verbessern oder auf der Diskussionsseite melden, siehe Mitmachen. Die öffentliche Fassung auf luuke42.github.io/omegasim kann älter sein als der hier beschriebene Stand.

Zwei Carrera-HYBRID-Autos (Porsche 911 GT3 R) mit eingeschaltetem Licht. Foto: Luuke42

Carrera HYBRID ist ein Spielsystem des Herstellers Carrera, bei dem kleine, per Bluetooth Low Energy gesteuerte Rennautos im Maßstab 1:50 frei auf lose ausgelegten Streckenteilen fahren. Anders als bei einer klassischen Carrera-Bahn gibt es keine Führungsrille: Ein Sensor an der Unterseite liest einen Strichcode auf dem Streckenteil, und das Auto meldet der App, auf welchem Teil es gerade fährt. Gesteuert wird es von der Original-App des Herstellers oder von unabhängigen Programmen wie OmegaSim, die dieselbe Funkschnittstelle sprechen. Dieser Artikel beschreibt das Auto und sein Funkprotokoll so, wie sie in der Dokumentation und im Quelltext von OmegaSim festgehalten sind; das Protokoll ist nicht offengelegt, sondern aus Mitschnitten rekonstruiert.

Auf einen Blick

Merkmal Wert Beleg
Funk Bluetooth Low Energy, Gerätename beginnt mit HYBRID- src/10-ble-explorer.js
Steuerkanal Nordic UART Service (NUS), Merkmal RX 6e400002-… src/50-drive.js, NUS_RX
Meldekanal NUS TX 6e400003-…, Notifications src/50-drive.js, NUS_TX
Befehlspaket 20 Byte, beginnt mit 0xAF, endet mit CRC-8 buildCommandPacket()
Sendetakt in OmegaSim 45 ms (rund 22 Pakete je Sekunde) CONTROL_SEND_INTERVAL_MS
Gas Byte 6, Neutral 0xDF, ±Δ Gasschritte src/20-protocol.js
Lenkung Byte 7 (und Kopie in Byte 9), vorzeichenbehaftet −127 … +127 src/20-protocol.js
Licht und Leseart Byte 14, einzelne Bits LIGHT_HEAD, TRACK_BIT_RAIL
Tempo 0,0119 m/s je Gasschritt, Vollgas rund 1,51 m/s TACHO_SCALE, src/30-input.js
Fahrbahn 25 cm breit, Gerade rund 43 cm lang CARRERA_HYBRID.md
Firmware-Update Nordic Secure DFU vorhanden, OmegaSim nutzt es nicht siehe Firmware
Status der Entschlüsselung Kernbytes gesichert, einige Bytes offen siehe unten

Grundlagen

Wer das Protokoll lesen will, braucht ein paar Begriffe. Sie werden hier kurz erklärt; ausführlicher stehen sie im Glossar und in den Artikeln Hexadezimalsystem und Bluetooth Low Energy.

Bit, Byte und Hexadezimalzahl

Ein Bit ist die kleinste Informationseinheit: 0 oder 1. Acht Bits ergeben ein Byte, das Werte von 0 bis 255 annehmen kann. Weil lange Bitfolgen unhandlich sind, schreibt man Bytes meist hexadezimal (zur Basis 16, Ziffern 0–9 und A–F) mit dem Vorsatz 0x. Eine Hex-Ziffer steht genau für vier Bits, ein Byte also für zwei Hex-Ziffern:

Hex Dezimal Binär Bedeutung im Auto
0x0A 10 0000 1010 Streckencode „Engstelle“ (Bahn) oder Start/Ziel (Ausdruck)
0x20 32 0010 0000 Bit 5 gesetzt: Leseart „Auf der Bahn“
0x22 34 0010 0010 Bit 5 und Bit 1: Bahn plus Scheinwerfer
0xAF 175 1010 1111 Rahmenkennung, erstes Byte jedes Befehls
0xDF 223 1101 1111 Gas neutral

Bits zählt man von rechts: Bit 0 ist die Einerstelle (Wert 1), Bit 1 hat den Wert 2, Bit 5 den Wert 32 (0x20), Bit 7 den Wert 128 (0x80). Ein Byte, in dem mehrere Schalter stecken, heißt Bitfeld; man setzt einen Schalter mit ODER (|) und prüft ihn mit UND (&).

Vorzeichenbehaftetes Byte

Ein Byte kann auch negative Zahlen tragen („Zweierkomplement“): 0 bis 127 bleiben positiv, 128 bis 255 bedeuten −128 bis −1. So steht 0x7F für +127 (voll rechts), 0x81 für −127 (voll links). Das hat eine Falle: Rechnet man über 127 hinaus, „bricht“ der Wert in den negativen Bereich um. Ein Lenkwert von +128 käme als −128, also als Vollausschlag in die andere Richtung an. OmegaSim begrenzt deshalb jeden Lenkwert hart auf ±127.

Modulo-256-Rechnung

Ein Byte kann nicht über 255 hinaus; was darüber liegt, läuft wieder bei 0 los (Rechnung „modulo 256“). Das Gasbyte nutzt das absichtlich: 0xDF + 56 = 0x117, davon bleibt im Byte 0x17.

Prüfsumme

Eine Prüfsumme ist ein aus allen übrigen Bytes errechnetes Kontrollbyte. Der Empfänger rechnet sie nach; stimmt sie nicht, verwirft er das Paket. Bei HYBRID ist es eine CRC-8 (zyklische Redundanzprüfung mit 8 Bit), siehe unten.

GATT, Dienst, Merkmal, Notification

Bluetooth-Low-Energy-Geräte ordnen ihre Daten in einem Baum namens GATT (Generic Attribute Profile). Ganz oben stehen Dienste (englisch services), darin Merkmale (characteristics), also einzelne Datenfelder mit einer weltweit eindeutigen Kennung (UUID). Ein Merkmal kann man lesen, beschreiben oder abonnieren. Beim Schreiben mit Antwort bestätigt das Auto jedes Paket; beim Schreiben ohne Antwort schickt die App das Paket einfach ab. Ein Abonnement heißt Notification: Das Auto schickt von sich aus neue Werte, ohne dass die App fragt. Wie oft gefunkt wird, legt das Verbindungsintervall fest, das Handy und Auto aushandeln; mehr dazu in OmegaBle.

Firmware

Die Firmware ist das Programm im Auto. Sie setzt die empfangenen Zielwerte in Motor- und Servobewegung um, liest den Sensor aus und sendet die Meldungen.

Bedienung

So wird ein HYBRID-Auto mit OmegaSim in Betrieb genommen:

  1. Auto einschalten und aufladen. Ein Auto, das bereits mit einem anderen Gerät verbunden ist, wirbt nicht und wird nicht gefunden.
  2. In OmegaSim FAHREN → Autos → Auto verbinden (in der Garage). Im Browser wählt man das Auto im Auswahlfenster des Browsers (Filter: Name beginnt mit „HYBRID“ oder Gerät bietet den Nordic UART Service an). In der Android-App öffnet sich die Suche des Bluetooth-Plugins.
  3. Nach dem Verbinden spielt OmegaSim einen Anlassklang; das erste verbundene Auto wird Spieler 1, jedes weitere ein NPC, sofern keine gemerkte Rolle vorliegt.
  4. Die Leseart wählen: Auf der Bahn für die Kunststoffteile, Ausdruck für gedruckte Muster (FAHREN → Strecke, am Gamepad L1). Siehe Strecke.
  5. Mit Blinken in der Garage lässt sich prüfen, welches physische Auto zu welcher Zeile gehört.
  6. Fahren. Gas, Lenkung und Licht schickt OmegaSim im 45-ms-Takt; die Meldungen des Autos (Akku, Streckencode, Teilezähler) erscheinen im Cockpit.
  7. Zum Trennen Garage → Alle trennen. Reagiert ein Auto nicht, hilft Keine Reaktion des Fahrzeugs.

Einstellungen

Am Auto selbst gibt es keine Einstellungen; OmegaSim bietet die folgenden, die direkt Bytes des Protokolls betreffen.

Name in der App Bereich/Werte Standard Wirkung (aus dem Code) Interner Schlüssel/ID
Leseart (FAHREN → Strecke) Auf der Bahn / Ausdruck Auf der Bahn setzt in Byte 14 Bit 5 (0x20) oder Bit 7 (0x80) trackMode ('on'/'off')
Licht (Dreieck/Y) an/aus an Bit 1 in Byte 14 (LIGHT_HEAD) headlightsOn
Marke / Modell (Garage) Nicht zugeordnet, BMW, Porsche 911, Ford Mustang, Ferrari, Audi, McLaren, Mercedes, Red Bull, VW Käfer Nicht zugeordnet nur Anzeige, Ansagen und Kartensymbol; ändert kein Byte car.modellId
Leistung über Akkulaufzeit konstant halten (Optionen → Allgemein → Akku, WIP) an/aus aus multipliziert das Vorwärtsgas mit dem Ausgleichsfaktor (siehe Akku) setting-battery-comp
Referenz-Akkustand 20–100 % in 5er-Schritten 50 % Zielwert des Ausgleichs setting-battery-ref
Bekannte Autos beim Start verbinden (System, nur App) an/aus an verbindet gemerkte Autos über ihre MAC-Adresse setting-autoverbinden

Funktionsweise

Aufbau des Autos

Bauteil Aufgabe Gesichert?
Motor treibt die Hinterräder an ja
Lenkservo dreht die Vorderräder; Lenkbereich in OmegaSims Rechnung bis 45 Grad ja (Winkel geschätzt)
Akku wiederaufladbar, im Fahrzeug ja
Bluetooth-Chip Funkverbindung zum Handy Typ vermutet: Nordic nRF52 (wegen Nordic UART und Nordic DFU)
Streckensensor liest den Strichcode an der Unterseite Bauart (Kamera oder Infrarot) noch nicht gesichert
Lichter Scheinwerfer, Rück- und Bremslicht Bremslicht seit 19.08.2026 belegt
Bewegungssensor liefert Rohwerte in Byte 1 und 3 der Meldung vermutet, Bedeutung unbestätigt

Bluetooth-Schnittstelle (GATT)

Ausgelesen mit dem BLE-Explorer von OmegaSim und aus der Auswertung des Mitschnitts vom 13.08.2026 mit tools/parse_btsnoop.py (Mitschnitte und Auswertung liegen nur lokal; sie werden absichtlich nicht veröffentlicht, weil sie Geräteadressen enthalten). Die Spalte „Eigenschaften“ gibt das Eigenschaftsbyte aus dem Mitschnitt wieder: 0x02 lesen, 0x04 schreiben ohne Antwort, 0x08 schreiben mit Antwort, 0x10 Notification, 0x20 Indication.

Dienst Merkmal UUID Eigenschaften Zweck
Generic Access Device Name 00002a00-0000-1000-8000-00805f9b34fb 0x0A (lesen, schreiben) Name „HYBRID-…“
Generic Access Appearance 00002a01-… 0x02 Gerätetyp
Generic Access Preferred Connection Params 00002a04-… 0x02 gewünschte Verbindungsparameter des Autos
Generic Access Central Address Resolution 00002aa6-… 0x02 Standardfeld
Generic Attribute – 00001801-… – Standarddienst
Nordic UART Service – 6e400001-b5a3-f393-e0a9-e50e24dcca9e – Fahrzeugsteuerung
Nordic UART Service RX (App → Auto) 6e400002-b5a3-f393-e0a9-e50e24dcca9e 0x0C (mit und ohne Antwort) Befehlspakete
Nordic UART Service TX (Auto → App) 6e400003-b5a3-f393-e0a9-e50e24dcca9e 0x10 (Notification) Meldepakete
Nordic Secure DFU – 0000fe59-… – Firmware-Update, siehe Firmware
Nordic Secure DFU Bootloader-Trigger 8ec90003-f315-4f60-9fb8-838830daea50 0x28 (schreiben, Indication) versetzt das Auto in den Update-Modus

Die Original-App schreibt im Mitschnitt mit „Write Command“, also ohne Antwort; OmegaSim tut dasselbe, wenn das Merkmal es anbietet (funkSchreiben())[1].

Das Befehlspaket (App → Auto)

Jeder Befehl ist 20 Byte lang. OmegaSim baut ihn an genau einer Stelle, buildCommandPacket()[2]:

Byte OmegaSim sendet Bedeutung Stand
0 0xAF Rahmenkennung gesichert
1–5 0x00 unbenutzt konstant aus Mitschnitten
6 (0xDF + Δ) mod 256 Gas/Bremse, Δ = Gasschritte gesichert
7 Lenkwert & 0xFF Lenkung, vorzeichenbehaftet, positiv = rechts gesichert (Rechtskurve im Mitschnitt bei 0x7F)
8 0x80 nach seVen: Fahrstil Wert aus Mitschnitt der Original-App
9 Kopie von Byte 7 Lenkung (Doppel) die Original-App sendete hier teils andere Werte; Bedeutung offen
10 0x60 (Spieler), 0x20 (Selbstführung) Betriebsart; nach seVen: Fahrassistent Bedeutung offen
11 0x00 – konstant
12 0x01 nach seVen: Hersteller (0x01 Porsche) konstant
13 0x00 – konstant
14 Bitfeld Licht und Leseart, siehe unten gesichert für Bits 0, 1, 2, 5, 7
15 0x04 (Spieler), 0x0C (Selbstführung) Betriebsart aus Mitschnitt; Bedeutung offen
16–18 0x00 oder Vorausblick Typen der nächsten drei Streckenteile, nur bei Selbstführung gesichert aus Mitschnitt 20.08.2026
19 CRC-8 über Byte 0–18 Prüfsumme gesichert

Die Bytes 10 und 15 wechseln OmegaSim auf 0x20/0x0C, wenn das Auto sich selbst auf der Bahn halten soll (NPCs im Leitplanken-Modus, Autopilot, Fahrhilfe). Das sind genau die Werte, die die Original-App an ihre eigenen Gegner schickte: über 2496 und 2457 Pakete konstant[3].

Gasbyte

Das Gasbyte rechnet modulo 256 um die Neutralstellung 0xDF:

Δ     = round(Gasanteil × 127),  begrenzt auf  MIN_THROTTLE_DELTA … +127  (= −64 … +127)
Byte6 = (0xDF + Δ) mod 256

Die Byte-Bereiche nach der Protokollbeschreibung von seVen:

Byte-Bereich Bedeutung Δ
0xDF neutral 0
0xE0–0xFF, dann 0x00–0x6F vorwärts, 144 Stufen +1 … +144 (OmegaSim nutzt bis +127 = 0x5E)
0x80–0xDE rückwärts/bremsen, 95 Stufen −95 … −1
0x70–0x7F nicht beschrieben –

Damit erklärt sich ein alter Befund: Δ = −127 ergibt Byte 0x60, und das liegt im Vorwärtsbereich. Am 20.08.2026 fuhr das Auto bei vollem Rückwärtswert tatsächlich vorwärts, bei Δ = −64 (0x9F) korrekt rückwärts[4]. Die Grenze 0x80 (Δ = −95) ist am Auto noch nicht nachgefahren.

Lenkbyte

steerDelta = clamp(round(Lenkanteil × 127), −127, +127)
Byte7      = steerDelta & 0xFF        (Zweierkomplement)

127 ist der größte Wert des vorzeichenbehafteten Bereichs, und OmegaSim sendet ihn bei Vollanforderung. Ein Regler kann das Auto also nicht weiter einschlagen lassen als seine Mechanik; ein Wert über 1,0 würde umbrechen und in die Gegenrichtung lenken, deshalb ist der Deckel bei 1,0 Pflicht[5].

Licht und Leseart: Byte 14

Bit Maske Wirkung Stand
0 0x01 Bremslicht (LIGHT_BRAKE) belegt seit Mitschnitt 19.08.2026
1 0x02 Scheinwerfer (LIGHT_HEAD); das Rücklicht schaltet die Firmware mit belegt
2 0x04 Scheinwerfer blinkt statt dauerhaft zu leuchten am Auto zweimal reproduziert, von OmegaSim ungenutzt
3, 4 0x08, 0x10 kein sichtbarer Unterschied am Auto erprobt
5 0x20 Leseart „Auf der Bahn“: liest die Kunststoffschiene, Auto hält sich selbst darauf (TRACK_BIT_RAIL) gesichert
6 0x40 kam in beiden Betriebsarten der Original-App vor, Bedeutung offen; kein sichtbarer Lichtunterschied OmegaSim sendet 0
7 0x80 Leseart „Ausdruck“: liest gedruckte Muster (TRACK_BIT_PRINT) gesichert

Bit 5 und Bit 7 schließen sich aus. Gemessen in einer einzigen Aufzeichnung vom 21.08.2026, nur Meldungen während der Fahrt: mit Bit 7 kamen in 551 Meldungen 0 Lesungen, mit Bit 5 in 1194 Meldungen 1103 Lesungen und 1033 Kachelschritte (87 %)[6]. Dass Bit 7 einmal als „Licht-Grundwert“ missverstanden und dauernd gesendet wurde, kostete das Projekt zwölf Aufzeichnungen ohne eine einzige Streckenlesung.

Eine defekte Lampe (Schadensmodell) wird ebenfalls in buildCommandPacket() ausgeblendet, nicht als hartes Aus, sondern als Wackelkontakt:

Abschnitt = floor(Zeit_ms / 70) + Saat × 977
leuchtet  = ((Abschnitt × 2654435761) mod 2^32) / 2^32 > 0,86

Die Lampe leuchtet also in rund 14 % der 70-ms-Abschnitte kurz auf. Die Folge hängt an der Uhr und nicht an der Senderate, damit sie bei jedem Takt gleich aussieht[7].

Vorausblick: Bytes 16–18

Im Mitschnitt vom 20.08.2026 (Leitplanken-Modus der Original-App, 67 s Verkehr) wurden im selben Paket, in dem Bit 5 in Byte 14 aufging, erstmals die Bytes 16–18 belegt: die Typen der nächsten drei Streckenteile als Fenster über die eingescannte Strecke, das an jeder Teilegrenze weiterrückt. Alle neun beobachteten Fenster waren aufeinanderfolgende Dreiergruppen desselben Rings; zufällig wäre das mit 1,3·10−6 zu erwarten[8]. OmegaSim füllt die Bytes über ghostLookahead(), aber nur, wenn eine Strecke eingescannt ist und das Auto die Bahn liest.

Prüfsumme (CRC-8)

// src/10-ble-explorer.js, crc8()
function crc8(bytes) {
  let crc = 0xff;
  for (const b of bytes) {
    crc ^= b;
    for (let i = 0; i < 8; i++) {
      crc = (crc & 0x80) ? ((crc << 1) ^ 0x31) & 0xff : (crc << 1) & 0xff;
    }
  }
  return crc;
}

Ablauf in Worten:

  1. Startwert crc = 0xFF.
  2. Für jedes Byte 0 bis 18: crc = crc XOR Byte.
  3. Achtmal: Ist das oberste Bit (Bit 7) gesetzt, wird crc um eins nach links geschoben und mit dem Polynom 0x31 (binär 0011 0001, entspricht x8+x5+x4+1) verknüpft; sonst nur geschoben. Alles bleibt auf 8 Bit beschränkt.
  4. Das Ergebnis ist Byte 19.

Die Rechnung reproduziert drei aufgezeichnete Prüfsummen der Original-App exakt (0xA4, 0x33, 0xE0). Ein einfaches XOR über Byte 0–18, wie es seVen beschreibt, ergäbe für das Leerlaufpaket 0x17 statt der aufgezeichneten 0x33. Der Selbsttest „Protokoll: CRC-8“ prüft genau dieses Leerlaufpaket[9].

Das Meldepaket (Auto → App)

Das Auto schickt ständig Notifications auf NUS TX. Im Mitschnitt vom 13.08.2026 sind alle 670 Meldungen 19 Byte lang und beginnen ebenfalls mit 0xAF. OmegaSim verwirft Meldungen unter 16 Byte (onCarNotify()). Gelesen werden:

Byte Inhalt Auswertung in OmegaSim Stand
0 0xAF – aus Mitschnitt
1 Rohwert, ändert sich erst in Fahrt Crash-Erkennung, Crashrichtung (vorn/hinten) vermutlich Bewegungssensor, unbestätigt
3 Rohwert, wechselte in einer Aufnahme das Vorzeichen mit der Kurvenrichtung Drehsignal gyroRaw.x, Crash, Rammen „motion-ish. Unconfirmed“ (Code-Kommentar)
10 Akkustand, Rohwert Prozentanzeige, siehe Akku Skala geschätzt
11 Kachelzähler, ein Schritt je Streckenteil Rundenzählung, Ortung, Phase der Ideallinie gesichert
12 Streckencode des Teils unter dem Sensor Rundenzählung, Scan, NPC-Steuerung, Abseits gesichert, siehe Strecke
14 nach seVen: gemessenes Tempo (Kodierung wie Befehlsbyte, 0xDF neutral) nicht gelesen offen
15 Bit 3 (0x08): Ziellinien-Sperre Rundenzeit an der Ziellinie gesichert

Ein Beispiel aus dem Mitschnitt vom 13.08.2026, Auto steht, kein Code gelesen:

AF 00 9C 00 00 00 00 00 00 00 95 00 FF 00 DF 00 00 00 B3
                              ^^    ^^    ^^
                         Byte 10  Byte 12  Byte 14
                     Akku 0x95=149  0xFF=nichts gelesen  0xDF (neutral)

Das letzte Byte ist hier keine CRC-8 nach dem Befehlsverfahren (nachgerechnet ergäbe sich 0xF1); welches Verfahren das Auto für seine Meldungen benutzt, ist noch nicht gesichert.

Streckencode (Byte 12)

Das Auto liest je nach Leseart eine andere Codetabelle. Auf der Bahn:

Code Teil Code Teil
0x00 abseits der Bahn 0x07 Boxengasse / lange Gerade
0x01 Start/Ziel 0x08 / 0x09 weite 30-Grad-Kurve links / rechts
0x02 Gerade 0x0A Engstelle
0x03 Linkskurve 60 Grad 0x0B / 0x0C kleine 30-Grad-Kurve links / rechts
0x04 Rechtskurve 60 Grad 0xFF nichts gelesen (z. B. Leseart Ausdruck auf der Schiene)
0x05 / 0x06 Haarnadel links / rechts

Im Ausdruck-Modus meldet das Original-Startblatt 0x0A, die Blätter von OmegaSim 0x01; isStartCode() akzeptiert dort beide, auf der Schiene nur 0x01, damit eine Engstelle keine Phantomrunde zählt[10]. Wie das Auto aus dem Strichcode die Zahl bildet, ist offen; Einzelheiten zu Codes und Strichmaßen stehen in Strecke#Streckencode.

Kachelzähler (Byte 11)

Byte 11 springt um eins, sobald das Auto ein neues Teil erkennt. Das ist das einzige echte Ortsereignis: Das Auto meldet, dass es auf einem neuen Teil ist, nicht wo darauf. Verlässt das Auto die Bahn, läuft der Zähler schnell weiter (im Mitschnitt vom 20.08.2026 von 6 über 8, 9, 15 auf 18 in drei Sekunden), während Byte 12 0x00 meldet. OmegaSim rechnet deshalb die Position innerhalb eines Teils aus dem gefahrenen Weg seit dem letzten Zählersprung (siehe NPC-Fahrverhalten).

Ziellinie (Byte 15, Bit 3)

Auf dem Start/Ziel-Teil setzt das Auto Bit 3 in Byte 15 im Mittel 455 ms nach dem Strichcode (bei 78–84 % der Teilelänge, rund 35 cm weiter) und hält es per Zeitglied rund eine Sekunde (Median 981–1050 ms). Nur die steigende Flanke ist ein Ort. Dass es keine Rückspiegelung des eigenen Befehls ist, zeigt die Statistik: In einer Verbindung schrieb die Original-App Bit 3 in 100 % der Befehle, gemeldet war es nur in 12 % der Meldungen[11]. Seit 0.9.37 misst OmegaSim die Rundenzeit an dieser Flanke; Autos, die sie nie melden, zählen weiter über den Strichcode.

Melde-Takt

Wie oft das Auto meldet, hängt am ausgehandelten Verbindungsintervall:

Ein Meldetakt von 69 ms ist langsamer als OmegaSims Sendetakt von 45 ms. Daraus folgt, dass die Querregelung im Leitplanken-Modus im Auto selbst laufen muss: Eine Rückmeldung zur Querlage gibt es im Protokoll nicht.

Tempo und Tempo-Grenzen

Jede Tempozahl im Code von OmegaSim (0,35, 0,37, 0,1645 …) ist ein Anteil des Gasbytes, nicht die Höchstgeschwindigkeit eines bestimmten Autos. Gemessen wurde die Umrechnung an den Geraden der Mitschnitte vom 16. bis 21.08.2026 (Gasbytes 43, 50 und 56 auf 43-cm-Geraden: 0,86 s, 0,74 s und 0,63 s je Gerade)[13]:

Δ          = round(Anteil × 127)
v [m/s]    = 0,0119 × Δ
v [km/h]   = 3,6 × v  = 0,0428 × Δ
Tacho      = Anteil × 272,5 km/h  ≈ 2,146 × Δ km/h     (Maßstab 1:50)
Größe (Konstante) Anteil Δ echt (m/s) Tacho (km/h) Wer
Scan Haarnadel (SCAN_TEMPO_HAARNADEL) 0,1645 21 0,25 45 Scan
Scan Gerade bis 1.2.4 (SCAN_TEMPO) 0,2345 30 0,36 64 Scan
Boxentempo (PIT_SPEED_FACTOR) 0,2936 37 0,44 80 Boxengasse
„Leseschwelle“ GHOST_READ_MIN = Formationstempo 0,35 44 0,52 95 alle
Mindesttempo im Rennen GHOST_FAHR_MIN 0,37 47 0,56 101 NPC, Gelb
Gelb-Tempo auf der Geraden 0,4025 51 0,61 110 alle
NPC-Stufen einfach / mittel / schnell 0,45 / 0,55 / 0,65 57 / 70 / 83 0,68 / 0,83 / 0,99 123 / 150 / 177 NPC

Die „Leseschwelle“ 0,35 ist nicht gemessen, sondern die alte Untergrenze eines Reglers. Der Scan liest in der Haarnadel noch mit Δ 21, und in den Mitschnitten liefen Teilewechsel auch bei rund Δ 25. Die echte Lesegrenze liegt vermutlich bei Δ 20–25; 0,35 ist eine vorsichtige Betriebsgrenze[14]. Mit 1.2.5 fährt der Scan auf Geraden 80 % statt 67 % des Formationstempos.

Unter Autopilot und bei NPCs wirken weder der Fahrgefühl-Faktor (topSpeedScale) noch der Akku-Ausgleich; im eingeschwungenen Zustand geht also genau der Sollwert hinaus.

Akku

Byte 10 ist ein Rohwert ohne kalibrierte Skala. OmegaSim rechnet seit 0.9.87[15]:

roh_geglättet = Maximum aller Rohwerte der letzten 5 s
Prozent       = clamp( round( (roh_geglättet − 138) / (155 − 138) × 100 ), 0, 100 )

Je Auto merkt sich OmegaSim den kleinsten je gemeldeten Rohwert (akkuMinRoh, in der Garage angezeigt), damit die Untergrenze später nachgemessen werden kann. seVen nennt 131 bis 155, eine ältere Fassung von OmegaSim rechnete mit 111; alle drei Werte sind Schätzungen.

Der optionale Akku-Ausgleich[16]:

Faktor = clamp( Referenz / max(0,05, Prozent/100), 0,2, 1 )
Gas_vorwärts_gesendet = Gas_vorwärts × Faktor

Er drosselt also nur bei vollem Akku und gibt nie mehr als 100 %.

Fahrphysik: im Auto, nicht in der App

Die eigentliche Fahrdynamik entsteht in der Firmware. Nach der Dokumentation ist das Auto bei einem Vollgas-Befehl fast sofort auf Höchsttempo; OmegaSim rechnet deshalb ein eigenes Modell (Gänge, Reifen, Gewichtsverlagerung), dessen einziger Zweck ist, die zwei gesendeten Bytes Gas und Lenkung zu formen (siehe Fahrverhalten). Die Fahrzeuglayouts in OmegaSim (etwa „GT3, Heckmotor (Porsche 911 GT3 R)“ mit Achslast 39:61, Radstand 2,50 m) sind Schätzungen aus der Fahrzeugklasse für dieses Modell; das echte HYBRID-Auto kennt sie nicht und meldet nichts davon zurück.

Streckensensor

Der Sensor liest einen Strichcode aus breiten und schmalen Balken, der quer über die ganze Fahrbahn läuft. Weil der Code über die Breite gleich ist, sagt er nichts darüber, wo auf der Fahrbahn das Auto fährt. Gemessen am Start/Ziel-Blatt: Ein einzelnes Codewort von rund 54 mm in Fahrtrichtung genügt; nach einem Erkennen bleibt der Leser etwa eine Sekunde stumm (bei 4 km/h Maßstabstempo rund 1,1 m Fahrweg). Das Auto liest die Schiene auch bei vollem Lenkanschlag: In 67 830 Meldungen mit Code gab es nur vier Abrisse, ohne Zusammenhang zum Lenkwert[17].

Beispiele

Ein Befehl Byte für Byte

Spieler gibt 44 % Gas, lenkt halb rechts, Licht an, Leseart Bahn:

  1. Gas: Δ = round(0,44 × 127) = round(55,9) = 56. Byte 6 = (0xDF + 56) mod 256 = (223 + 56) mod 256 = 279 − 256 = 23 = 0x17.
  2. Lenkung: round(0,5 × 127) = round(63,5) = 64 = 0x40. Byte 7 und Byte 9 = 0x40.
  3. Byte 14: Bahn 0x20 ODER Scheinwerfer 0x02 = 0x22.
  4. Rahmen: AF 00 00 00 00 00 17 40 80 40 60 00 01 00 22 04 00 00 00.
  5. CRC-8 darüber: 0x8C. Gesendet wird AF 00 00 00 00 00 17 40 80 40 60 00 01 00 22 04 00 00 00 8C.

Echtes Tempo nach der Messung: 0,0119 × 56 = 0,67 m/s, im Maßstab 1:50 rund 120 km/h am Tacho.

Die ersten Schritte der CRC-8

Startwert 0xFF, erstes Byte 0xAF: 0xFF XOR 0xAF = 0x50 (0101 0000).

Schritt Bit 7 vorher Rechnung Ergebnis
1 0 nur schieben 0xA0
2 1 schieben (0x40), XOR 0x31 0x71
3 0 nur schieben 0xE2
4 1 schieben, XOR 0x31 0xF5
5 1 schieben, XOR 0x31 0xDB
6 1 schieben, XOR 0x31 0x87
7 1 schieben, XOR 0x31 0x3F
8 0 nur schieben 0x7E

Mit diesem Zwischenwert geht es beim zweiten Byte weiter. Für das Leerlaufpaket der Original-App (AF 00 00 00 00 00 DF 00 80 00 60 00 01 00 82 04 00 00 00) ergibt die ganze Rechnung 0x33, genau die aufgezeichnete Prüfsumme.

Bremsen mit Bremslicht

Vollbremsung aus Fahrt, voll links: Δ = −64 (Deckel) → Byte 6 = 223 − 64 = 159 = 0x9F. Lenkung −127 → 0x81. Byte 14 = 0x20 | 0x02 | 0x01 = 0x23. Paket: AF 00 00 00 00 00 9F 81 80 81 60 00 01 00 23 04 00 00 00 09.

Akkuanzeige

Rohwert 0x95 = 149: (149 − 138) / 17 × 100 = 64,7 → 65 %. Mit Akku-Ausgleich und Referenz 50 %: Faktor = 0,5 / 0,65 = 0,77; vom Vorwärtsgas gehen 77 % hinaus. Bei Rohwert 155 (100 %) wäre der Faktor 0,5, bei Rohwert 146 (47 %) 1,06 → gedeckelt auf 1.

Tempo-Umrechnung

Gelb-Tempo 0,4025: Δ = round(0,4025 × 127) = round(51,1) = 51 → Byte 0x12; v = 0,0119 × 51 = 0,61 m/s = 2,18 km/h echt; Tacho 0,4025 × 272,5 = 110 km/h.

Grenzen und bekannte Probleme

Was noch nicht gesichert ist

Versionsgeschichte

Version Änderung in OmegaSim, die das Auto betrifft
0.5.8 ein einziger Sender je Auto; das neueste Paket wird gemerkt statt verworfen
0.6.14 Leseart als eigener Schalter; Codetabellen je Leseart getrennt
0.9.37 Rundenzeit an der Ziellinie (Byte 15 Bit 3) statt am Strichcode
0.9.39 Tempo nachgemessen: 0,0119 m/s je Gasschritt, Tacho neu skaliert
0.9.87 Akkuskala 138–155, Mindestwert je Auto in der Garage
1.1.40 Tempo-Grenzen in Gasschritten dokumentiert
1.2.3 Verbindungen werden sauber getrennt, kein helles Licht mehr ohne Verbindung
1.2.5 schnellerer Streckenscan
1.2.9 Karten-Autos als Silhouetten je Marke / Modell

Einzelnachweise

  1. ↑ Auswahl writeWithoutResponse/writeValueWithResponse in funkSchreiben(), src/20-protocol.js.
  2. ↑ buildCommandPacket(), src/20-protocol.js.
  3. ↑ Konstante AUTO_MODE = { b10: 0x20, b15: 0x0c } mit Kommentar, src/60-track.js.
  4. ↑ 4,0 4,1 MIN_THROTTLE_DELTA = -64 mit Kommentar zum Fahrversuch vom 20.08.2026, src/10-ble-explorer.js.
  5. ↑ CARRERA_HYBRID.md, Abschnitt „Die Lenkgrenze: 45 Grad“.
  6. ↑ Kommentar zu TRACK_BIT_RAIL/TRACK_BIT_PRINT, src/20-protocol.js.
  7. ↑ lampFlicker(), src/20-protocol.js.
  8. ↑ Kommentar zu RAIL_MODE, src/60-track.js.
  9. ↑ Selbsttest „Protokoll: CRC-8“, src/95-selftest.js.
  10. ↑ isStartCode() und codeZuTyp(), src/60-track.js.
  11. ↑ ZIEL_SPERRE_BIT und zielSperreFlanke(), src/70-race.js.
  12. ↑ Kommentar zu RAIL_MODE, src/60-track.js.
  13. ↑ TACHO_SCALE mit Messkommentar, src/30-input.js.
  14. ↑ CARRERA_HYBRID.md, Abschnitt „Tempo-Grenzen“.
  15. ↑ AKKU_LEER, AKKU_VOLL, akkuGlaetten(), batteryPercent(), src/70-race.js.
  16. ↑ batteryCompensationScale(), src/50-drive.js.
  17. ↑ tools/querlage_messen.py, Auswertung in CARRERA_HYBRID.md.

Siehe auch

Quellen im Code