Redis-API-Referenz

Alle Librescoot-Services kommunizieren über Redis auf dem MDB. Hier findest du State-Hashes, Command-Queues und Pub/Sub-Channels.

Verbindung
Redis läuft auf dem MDB unter 192.168.7.1:6379. Das DBC verbindet sich per USB-Ethernet. Von einem verbundenen Rechner aus:
redis-cli -h 192.168.7.1
# Oder per SSH-Tunnel:
ssh -L 6379:localhost:6379 root@<mdb-ip>
redis-ipc-Bibliothek
Go-Services nutzen die redis-ipc-Bibliothek, die go-redis um Helfer für Hash-Publishing, Queue-Verarbeitung und Pub/Sub erweitert. Im README stehen die Patterns, die quer durch alle Services verwendet werden.

State-Hashes

Zustand wird in Redis-Hashes abgelegt. Services aktualisieren Felder per HSET und publizieren Änderungsbenachrichtigungen auf gleichnamigen Channels.

vehicle

redis-cli -h 192.168.7.1 HGETALL vehicle
FeldWerteBeschreibung
statestand-by / ready-to-drive / parked / booting / shutting-down / hibernating / updatingBetriebszustand des Fahrzeugs
handlebar:positionon-place / off-placeLenkerposition-Sensor
handlebar:lock-sensorlocked / unlockedLenkschloss-Zustand
seatbox:lockopen / closedHelmfach-Verschluss
seatbox:buttonon / offHelmfach-Öffner-Taste
kickstandup / downSeitenständer
brake:left / brake:righton / offBremshebel-Zustand
blinker:switchleft / right / both / offBlinker-Schalterposition
blinker:stateon / offBlinker aktuell aktiv
main-poweron / offHauptstrom-Zustand
horn:buttonon / offHupen-Taste

battery:0 / battery:1

redis-cli -h 192.168.7.1 HGETALL battery:0
FeldTypBeschreibung
presenttrue / falseIst ein Akku eingelegt
statestringAkkuzustand
chargeinteger (%)Ladestand
voltageinteger (mV)Akkuspannung
currentinteger (mA)Akkustrom
temperature:0temperature:3integer (°C)Temperatursensoren
state-of-healthinteger (%)Akku-Gesundheit
cycle-countintegerLadezyklen
serial-numberstringSeriennummer des Akkus
fw-versionstringBMS-Firmware-Version

engine-ecu

redis-cli -h 192.168.7.1 HGETALL engine-ecu
FeldTypBeschreibung
speedinteger (km/h)Geschwindigkeit
rpmintegerMotor-Drehzahl
odometerinteger (m)Gesamtstrecke
motor:voltageinteger (mV)Motorspannung
motor:currentinteger (mA)Motorstrom
temperatureinteger (°C)ECU-Temperatur
throttleon / offGasgriff aktiv
kerson / offRekuperation aktiv
kers-reason-offstringWarum KERS aus ist (none / cold / hot)
gearintegerGangstufe
fw-versionhex stringECU-Firmware-Version

internet

FeldBeschreibung
statusVerbindungsstatus (connected / disconnected)
access-techAccess-Technologie (z.B. LTE)
signal-qualitySignalstärke 0–100
ip-addressAktuelle IP-Adresse
modem-stateModem-Power-State

gps

FeldBeschreibung
stateoff / searching / fix-established / error
latitude / longitudeAktuelle Position (6 Nachkommastellen)
altitudeHöhe in Metern
speedGPS-Geschwindigkeit
courseKurs in Grad
timestampGPS-Zeitstempel (ISO-Format)

alarm

FeldWerte
statusdisabled / disarmed / delay-armed / armed / level-1-triggered / level-2-triggered / seatbox-access. motion-service beobachtet dieses Feld und programmiert das BMX055-Chip-Profil reaktiv.

motion

Wird vom motion-service (BMX055-Eigner) geschrieben. Heading-Felder werden mit jedem Magnetometer-Sample (5 Hz) aktualisiert.

FeldBeschreibung
current-profileidle / armed-awake / armed-hibernation / level1 / waiting – aktuell programmiertes Chip-Profil
heading0–359 Grad, Ganzzahl, Fahrzeug-NED-Frame
heading-degTilt-kompensiert, EMA-geglättet
heading-accuracyHeuristische 1-σ-Schätzung in Grad
heading-tiltNeigungswinkel des Fahrzeugs gegenüber der Horizontalen
initialized / streaming / polling-rate-hzService-Status
last-interrupt-timestampUnix-ms des letzten Motion-Engine-Auslösens
wake-causeWird einmalig beim Start gesetzt, falls INT_STATUS einen latched Bit zeigt (Wake-from-Hibernation-Indikator). Wird vom alarm-service gelesen + gelöscht.

Pub/Sub-Channels, die motion-service veröffentlicht:

  • motion:sensors – 10 Hz JSON-IMU-Stream {accel, gyro, mag}
  • motion:heading – 5 Hz JSON HeadingReading mit roh + EMA-geglättetem Winkel, Genauigkeit, Tilt
  • motion:interrupt – JSON {type, timestamp, engine} Bewegungs-Edges; type:"wake-hibernation" für das Post-Resume-Signal
  • motion:ready – einmal beim Start ausgelöst
  • motion:rpc – Request-Channel für synchrone Methoden (prepare-hibernation, get-calibration, clear-latch, soft-reset)

settings

Persistente Konfiguration, verwaltet vom settings-service. Alle Felder sind per lsc settings get/set les- und schreibbar. Wichtige Keys:

KeyBeschreibung
alarm.enabledtrue/false, Alarmanlage an/aus
alarm.honktrue/false, Hupe während des Alarms
alarm.durationAlarmdauer in Sekunden
updates.mdb.channelOTA-Kanal: testing / nightly / stable
updates.mdb.methodfull oder delta
dashboard.valhalla-urlRouting-Engine-Endpunkt
dashboard.map.typeonline / offline
scooter.auto-standby-secondsTimeout für automatisches Abschließen (0 = aus)
pm.hibernation-timerVerzögerungsbasierter Hibernate-Timeout in Sekunden (0 = aus; Minimum 300 s — Werte 1–299 werden auf 300 s angehoben). Standard 259200 (3 Tage). Der Timer läuft in jedem Ruhezustand und wird bei Aktivität zurückgesetzt.
pm.default-stateZielzustand im Leerlauf: run (wach bleiben) oder suspend (Auto-Sleep nach Vorlaufverzögerung)
pm.scheduled-hibernate-enabledtrue/false — aktiviert den Cron-basierten Hibernate-Zeitplan. Setzt einen gültigen pm.scheduled-hibernate-cron, eine Dauer > 0 in pm.scheduled-hibernate-duration und eine synchronisierte Uhr voraus, bevor überhaupt etwas ausgelöst wird.
pm.scheduled-hibernate-cron5-stelliger Cron-Ausdruck (Minute Stunde Tag Monat Wochentag), der festlegt, wann der geplante Hibernate auslöst. Leer = deaktiviert. Auslösungen sind auf eine pro 15 Minuten begrenzt — pathologische Ausdrücke wie * * * * * oder */5 * * * * können den Roller nicht in einen Hibernate-Loop zwingen. Beispiel: 0 22 * * * (täglich um 22:00).
pm.scheduled-hibernate-durationWake-by-Dauer beim Auslösen als Go-Duration-String (z. B. 8h, 30m). Aufwachen erfolgt zu Auslösezeit + Dauer (Wanduhr-Ziel). Ist der Roller bei Auslösung nicht im Stand-by, wird die Anforderung bis zum nächsten Stand-by aufgeschoben; das Ziel bleibt erhalten.
pm.wake-timer-max-secondsSicherheitsobergrenze für die an den nRF52 gesendete Wake-Timer-Dauer bei hibernate-for (ad-hoc oder geplant). Höhere Anforderungen werden begrenzt. Minimum 60, Maximum/Standard 604800 (1 Woche).
pm.wake-timer-ack-timeoutWie lange pm-service auf die nRF52-Bestätigung des armierten Wake-Timers wartet, bevor der Hibernate abgebrochen wird. Go-Duration-String, Minimum 1 s, Standard 10s.

ota

FeldBeschreibung
status:mdb / status:dbcidle / downloading / installing / rebooting / error
download-progress:mdbDownload-Fortschritt 0–100
update-version:mdbZielversions-String
error-message:mdbFehlerbeschreibung bei Status error

version:mdb / version:dbc

Wird vom version-service aus /etc/os-release geschrieben. Enthält Felder wie version_id, build_id, id.

Command-Queues

Services nehmen Befehle über Redis-Listen entgegen. Senden per LPUSH, Services lesen per BRPOP.

QueueBefehle
scooter:statelock, unlock, lock-hibernate
scooter:seatboxopen
scooter:powerrun, suspend, hibernate, hibernate-manual, reboot
scooter:blinkerleft, right, both, off
scooter:hornon, off
scooter:alarmenable, disable, start:<seconds>, stop
scooter:modemenable, disable, gps:enable, gps:disable
scooter:updatecheck-now
scooter:bluetoothadvertising-start-with-whitelisting, advertising-restart-no-whitelisting, advertising-stop, delete-all-bonds

Beispiel:

redis-cli -h 192.168.7.1 LPUSH scooter:state unlock
redis-cli -h 192.168.7.1 LPUSH scooter:alarm start:30

Pub/Sub

Sobald ein Service ein Hash-Feld aktualisiert, veröffentlicht er den geänderten Feldnamen auf einem Channel mit demselben Namen wie der Hash. Abonnent*innen lesen danach gezielt nur dieses eine Feld neu.

# Auf Änderungen am Vehicle-State subscriben
redis-cli -h 192.168.7.1 SUBSCRIBE vehicle

# Auf Akku-Updates subscriben
redis-cli -h 192.168.7.1 SUBSCRIBE battery:0 battery:1

Als Message-Payload kommt der Feldname, der sich geändert hat (z.B. "state", "charge"). Empfänger*innen holen den neuen Wert mit HGET <hash> <field>.

Dieses Pattern ist in der redis-ipc-Bibliothek umgesetzt.

← Build-Guide