Tutorial · Teil 2KommandozeileEchte Ausgaben, echter Lauf

LooT CLI

Alles, was die Oberfläche kann, auch im Terminal.

Nodes bauen, Werte schreiben und abfragen, live verfolgen, Kommandos auslösen, Datenquellen verwalten: scriptbar, kopierbar, CI-tauglich. Jeder Befehl in diesem Tutorial wurde wirklich ausgeführt, die Ausgaben sind unverändert übernommen.

Weiter mit → · Übersicht O · Teil 1: Die Weboberfläche ↗

„Keine PowerPoint-Show: Einfach mal ausprobieren.“

app.loot.apps.rheinwert.de ↗

Alpha-Status: LooT ist noch nicht freigegeben. Funktionen und Daten können sich noch ändern.

Was Sie in den nächsten Folien erleben

So spielen Sie nach

Der Tutorial-Tenant ist derselbe wie in Teil 1: Hallifax. Hier bauen wir daneben das Werk Süd, diesmal komplett per CLI. Blaue Kästen enthalten die Befehle zum Mitmachen; die schwarzen Terminal-Fenster zeigen die echten Ausgaben. Befehle kopieren übernimmt alle Zeilen mit $ in die Zwischenablage.

TEIL 1 Das Werkzeug im Überblick

Ein Programm loot, Befehlsfamilien nach Aufgabe. Jede Familie hat --help.

BefehlAufgabe
login · logoutAnmelden per Device Grant, Tokens verwalten
tenantTenants anzeigen, anlegen, umbenennen, löschen
nodeHierarchie: list, create, show, clone, delete, migrate-template
templateNode-Templates mit Versionen
write · importWerte schreiben: einzeln oder per CSV
query · liveWerte lesen: Zeitraum oder Live-Strom
upload · downloadDateien als Werte (Custom-Nodes)
streamAudio-/Video-Sitzungen ansehen, laden, starten
command · deviceKommandos definieren/auslösen; Gerätesimulator
source · source-templateDatenquellen, Zuordnung, Puffer, Vorlagen
producerProducer-Katalog, Konverter-Plugins hochladen
copy · deletionKlone und Löschungen im Hintergrund beobachten

Warum zusätzlich zur Oberfläche?

  • Reproduzierbar: Aufbauschritte stehen im Skript.
  • Automatisierbar: Cron, CI, Deployment-Pipelines.
  • Mengengerüst: Hunderte Nodes oder Millionen Werte aus CSV.
  • Diagnose: Live-Werte, Puffer, Ereignisse auf einen Blick.

Version dieses Laufs

loot --version
loot --version
0.1.1.1+6ccf80e1a3919c6e4fd15199258555a6f91bf8fa

TEIL 1 Anmelden und interaktiv arbeiten

Tipp: der interaktive Modus

loot -i startet eine Sitzung, in der Sie Befehle zeilenweise eingeben.
  • Tab vervollständigt Befehle (no → node, node cr → node create).
  • Tab vervollständigt auch Node-Pfade direkt aus Ihrer Hierarchie, mit Tenant, Ebenen und Umlauten. Lange Pfade wie Hallifax/Werk Süd.Lager.Tür offen tippen Sie nur noch an.
Damit lernen und erkunden Sie LooT am schnellsten. Einzelaufrufe und Skripte laufen weiter ohne -i.

Nachspielen: anmelden

  1. loot login --server loot.example.org. Die Namen auth., api., ingest., query. leitet die CLI vor dem Servernamen ab.
  2. Adresse im Browser öffnen, Code bestätigen: Der Browser meldet „Device Login Successful“.
  3. Fertig: Beim nächsten Mal genügt loot login, die Adressen sind gespeichert.
loot login
loot login --server loot.example.org
Zum Anmelden diese Adresse im Browser öffnen und den Code bestätigen:
  Adresse: https://auth.loot.example.org/realms/loot/device?user_code=OOKL-URGS
  Code:    OOKL-URGS
Warte auf die Bestätigung …

Gut zu wissen

  • Device Grant mit PKCE (Client loot-cli): Das Passwort geben Sie nie im Terminal ein, sondern nur im Browser.
  • Das Access Token erneuert die CLI selbst. loot logout beendet die Keycloak-Sitzung und löscht die Tokens.
  • Konfiguration: %APPDATA%/LooT (Windows) bzw. ~/.config/loot; LOOT_CONFIG_DIR verlegt den Ordner. Unter Windows sind die Tokens per DPAPI an den Benutzer gebunden.
  • Einzelne Adressen: --authority, --node-server, --ingest-server, --query-server.

TEIL 1 Pfade, Zeit, Fehler: die Spielregeln

Pfade

Tenant/Wurzel.Kind.Enkel
Ein / trennt den Tenant ab, danach trennt . die Ebenen. Pfade mit Leerzeichen oder Umlauten gehören in Anführungszeichen: "Hallifax/Werk Süd.Lager.Tür offen".

Zeit

ISO 8601. Ausgaben in lokaler Systemzeit mit Offset (…+01:00), Eingaben mit Offset (Z, +02:00) bleiben unverändert, ohne Offset gilt die Ortszeit. --utc schaltet Ein- und Ausgabe auf UTC.

Ausgabe & Exitcodes

  • Tabellen für Menschen, --json für Maschinen (unveränderte Serverantwort in UTC).
  • Fehler als Fehler: … auf stderr, Exitcode 1 (Server/Daten) oder 2 (Aufruf/Konfiguration).
Fehlerbehandlung
loot node show "Hallifax/Werk Süd.Gibt.Es.Nicht"
Fehler: Pfad 'Hallifax/Werk Süd.Gibt.Es.Nicht' existiert nicht.
[Exitcode 1]

loot write "Hallifax/Werk Süd.Lager.Temperatur" abc
Fehler: 'abc' ist kein gültiger Wert vom Typ Double (Dezimalpunkt, keine Tausendertrennung).
[Exitcode 1]

Merke

Die Meldung kommt aus den Problem Details des Servers; deshalb lesen sich Fehler in CLI und Oberfläche gleich. Skripte prüfen einfach $?.

USE CASE 1 Tenants verwalten

tenant
loot tenant list
Id  Name
--  --------
2   Demo
3   Hallifax
1   Monsters

loot tenant create CliDemo
Tenant 'CliDemo' angelegt (Id 5).

loot tenant rename CliDemo Labor && loot tenant list
Tenant 'CliDemo' heißt jetzt 'Labor'.
Id  Name
--  --------
2   Demo
3   Hallifax
5   Labor
1   Monsters

Nachspielen

  1. loot tenant list: alle Tenants mit Id.
  2. loot tenant create CliDemo (Systemadmin).
  3. loot tenant rename CliDemo Labor (Tenant-Admin oder Systemadmin).
  4. Löschen kommt am Ende (Folie „Aufräumen“).

Dasselbe in der Weboberfläche

Startseite → „Tenant anlegen“ (Teil 1, Folie 5). Der Tenant „Labor“ ist nur ein Wegwerf-Mandant für diese Demo.

USE CASE 2 Eine Hierarchie bauen: node create

node create
loot node create "Hallifax/Werk Süd" --description "Zweites Werk, komplett per CLI aufgebaut"
Node 'Hallifax/Werk Süd' angelegt (Id 79).

loot node create "Hallifax/Werk Süd.Lager" --description "Hochregallager"
Node 'Hallifax/Werk Süd.Lager' angelegt (Id 80).

loot node create "Hallifax/Werk Süd.Lager.Temperatur" --type double --unit °C --description "Lufttemperatur im Lager"
Node 'Hallifax/Werk Süd.Lager.Temperatur' angelegt (Id 81).

loot node create "Hallifax/Werk Süd.Lager.Tür offen" --type bool --description "Hallentor" && loot node create "Hallifax/Werk Süd.Lager.Paletten" --type int --description "Belegte Stellplätze" && loot node create "Hallifax/Werk Süd.Lager.Position" --type geo --description "Gabelstapler 1" && loot node create "Hallifax/Werk Süd.Lager.Status" --type string --description "Betriebszustand"
Node 'Hallifax/Werk Süd.Lager.Tür offen' angelegt (Id 82).
Node 'Hallifax/Werk Süd.Lager.Paletten' angelegt (Id 83).
Node 'Hallifax/Werk Süd.Lager.Position' angelegt (Id 84).
Node 'Hallifax/Werk Süd.Lager.Status' angelegt (Id 85).

Nachspielen

  1. Hallifax/Werk Süd legt eine Wurzel im Tenant an, Hallifax/Werk Süd.Lager ein Kind.
  2. Werttyp: --type double|float|int|long|bool|string|geo|compound|custom|stream; ohne Angabe ist der Node reine Struktur.
  3. Einheit --unit °C, Text --description ….
  4. Optional: --direction in|out|inout|none, --duplicate first|last (wer gewinnt bei gleichem Zeitstempel).

Reihenfolge

Der Elternknoten muss existieren, sonst scheitert der Aufruf mit Fehler und Exitcode 1.

Dasselbe in der Weboberfläche

Rechtsklick → Neu → Kind-Node oder Schaltfläche „Neuer Node“ (Teil 1, Folie 11).

USE CASE 2 Nodes auflisten und ansehen

node list · node show
loot node list Hallifax
Id  Name       Werttyp  Einheit  Richtung
--  ---------  -------  -------  --------
41  Werk Nord  -        -        -
79  Werk Süd   -        -        -

loot node list "Hallifax/Werk Süd.Lager"
Id  Name        Werttyp  Einheit  Richtung
--  ----------  -------  -------  --------
83  Paletten    Int      -        InOut
84  Position    Geo      -        InOut
85  Status      String   -        InOut
81  Temperatur  Double   °C       InOut
82  Tür offen   Bool     -        InOut

loot node show "Hallifax/Werk Süd.Lager.Temperatur"
Pfad:         Hallifax/Werk Süd.Lager.Temperatur
Id:           81
Name:         Temperatur
Beschreibung: Lufttemperatur im Lager
Werttyp:      Double
Einheit:      °C
Richtung:     InOut
Duplikate:    LastServe
Letzter Wert: (kein Wert)

Nachspielen

  1. loot node list Hallifax: Wurzel-Nodes des Tenants (Teil 1 hat „Werk Nord“ angelegt, jetzt steht „Werk Süd“ daneben).
  2. loot node list "Hallifax/Werk Süd.Lager": Kinder mit Id, Werttyp, Einheit, Richtung.
  3. loot node show <pfad>: alle Eigenschaften und der letzte Wert.
Die Id in der ersten Spalte ist dieselbe wie in der Weboberfläche (?node=73 in der Adresse).

USE CASE 3 Werte schreiben: write

write
loot write "Hallifax/Werk Süd.Lager.Temperatur" 4.5 --ts 2026-11-04T05:00:00
Wert geschrieben: Hallifax/Werk Süd.Lager.Temperatur = 4.5 (2026-11-04T05:00:00.000000+01:00).

h=5; for v in 5.0 5.4 6.1 6.8 7.2; do h=$((h+1)); loot write "Hallifax/Werk Süd.Lager.Temperatur" $v --ts $(printf "2026-11-04T%02d:00:00" $h) > /dev/null; done; echo "5 Werte geschrieben"
5 Werte geschrieben

loot write "Hallifax/Werk Süd.Lager.Tür offen" true --ts 2026-11-04T07:30:00 && loot write "Hallifax/Werk Süd.Lager.Paletten" 412 --ts 2026-11-04T07:30:00 && loot write "Hallifax/Werk Süd.Lager.Status" "Einlagerung läuft" --ts 2026-11-04T07:30:00
Wert geschrieben: Hallifax/Werk Süd.Lager.Tür offen = true (2026-11-04T07:30:00.000000+01:00).
Wert geschrieben: Hallifax/Werk Süd.Lager.Paletten = 412 (2026-11-04T07:30:00.000000+01:00).
Wert geschrieben: Hallifax/Werk Süd.Lager.Status = Einlagerung läuft (2026-11-04T07:30:00.000000+01:00).

Nachspielen

  1. loot write <pfad> <wert> [--ts …]. Ohne --ts gilt „jetzt“.
  2. Zahlen mit Dezimalpunkt, true/false für Bool, Text für String; null heißt „kein Wert“.
  3. Die Schleife schreibt fünf Stundenwerte in einem Rutsch, jeder Aufruf ist ein normaler Shell-Befehl.

Typprüfung

Der Wert muss zum Werttyp des Nodes passen. Sonst kommt Fehler: 'abc' ist kein gültiger Wert vom Typ Double (Folie „Konventionen“).

Dasselbe in der Weboberfläche

Ingest-Test oder „Wert schreiben“ im Kontextmenü (Teil 1, Folie 25).

USE CASE 4 Werte abfragen: query

query
loot query "Hallifax/Werk Süd.Lager.Temperatur"
Zeitstempel                       Wert [°C]
--------------------------------  ---------
2026-11-04T05:00:00.000000+01:00  4.5
2026-11-04T06:00:00.000000+01:00  5
2026-11-04T07:00:00.000000+01:00  5.4
2026-11-04T08:00:00.000000+01:00  6.1
2026-11-04T09:00:00.000000+01:00  6.8
2026-11-04T10:00:00.000000+01:00  7.2

loot query "Hallifax/Werk Süd.Lager.Temperatur" --from 2026-11-04T06:00:00 --to 2026-11-04T08:00:00
Zeitstempel                       Wert [°C]
--------------------------------  ---------
2026-11-04T06:00:00.000000+01:00  5
2026-11-04T07:00:00.000000+01:00  5.4

loot query "Hallifax/Werk Süd.Lager.Temperatur" --order desc --limit 3
Zeitstempel                       Wert [°C]
--------------------------------  ---------
2026-11-04T10:00:00.000000+01:00  7.2
2026-11-04T09:00:00.000000+01:00  6.8
2026-11-04T08:00:00.000000+01:00  6.1
Hinweis: Die Ausgabe ist auf 3 Werte begrenzt (--limit erhöhen oder den Zeitraum eingrenzen).

Nachspielen

  1. loot query <pfad>: alle Rohwerte, Spaltenkopf nennt die Einheit.
  2. --from (einschließlich) und --to (ausschließlich) grenzen den Zeitraum ein.
  3. --order desc --limit 3: die letzten drei Werte. Bei Abschneiden erscheint ein Hinweis.

Standard

Höchstens 1000 Werte (--limit), aufsteigend sortiert.

Dasselbe in der Weboberfläche

Node-Seite: Zeitfenster-Knöpfe, „Letzte Werte“ und Verlauf (Teil 1, Folie 26).

USE CASE 4 Anders ausgeben: Einheit, JSON, UTC

query --unit · --json · --utc
loot query "Hallifax/Werk Süd.Lager.Temperatur" --unit °F --limit 3 --order desc
Zeitstempel                       Wert [°F]
--------------------------------  ---------
2026-11-04T10:00:00.000000+01:00  44.96
2026-11-04T09:00:00.000000+01:00  44.24
2026-11-04T08:00:00.000000+01:00  42.98
Hinweis: Die Ausgabe ist auf 3 Werte begrenzt (--limit erhöhen oder den Zeitraum eingrenzen).

loot query "Hallifax/Werk Süd.Lager.Temperatur" --limit 2 --json
{"nodeRef":81,"valueType":"Double","points":[{"ts":"2026-11-04T04:00:00.000000Z","value":4.5},{"ts":"2026-11-04T05:00:00.000000Z","value":5}],"truncated":true,"unit":"\u00B0C"}

loot query "Hallifax/Werk Süd.Lager.Temperatur" --limit 2 --utc
Zeitstempel                  Wert [°C]
---------------------------  ---------
2026-11-04T04:00:00.000000Z  4.5
2026-11-04T05:00:00.000000Z  5
Hinweis: Die Ausgabe ist auf 2 Werte begrenzt (--limit erhöhen oder den Zeitraum eingrenzen).

Nachspielen

  1. --unit °F: Umrechnung nur der Ausgabe. Gespeichert bleibt °C (wie die Anzeigeeinheit in der Weboberfläche).
  2. --json: unveränderte Serverantwort, Zeiten immer in UTC, mit unit und truncated.
  3. --utc: Tabelle in UTC statt Ortszeit. Die globale Option darf überall stehen.

Dasselbe in der Weboberfläche

Feld „Anzeigeeinheit“ an jedem Node (Teil 1, Folie 14).

USE CASE 5 Geodaten schreiben und lesen

Geo-Werte
loot write "Hallifax/Werk Süd.Lager.Position" "51.9625;7.6256" --ts 2026-11-04T07:00:00 && loot write "Hallifax/Werk Süd.Lager.Position" --lat 51.9631 --lon 7.6262 --speed 2.5 --heading 90 --ts 2026-11-04T07:10:00 && loot write "Hallifax/Werk Süd.Lager.Position" "{\"lat\":51.9640,\"lon\":7.6270}" --ts 2026-11-04T07:20:00
Wert geschrieben: Hallifax/Werk Süd.Lager.Position = 51.9625, 7.6256 (2026-11-04T07:00:00.000000+01:00).
Wert geschrieben: Hallifax/Werk Süd.Lager.Position = 51.9631, 7.6262 (2026-11-04T07:10:00.000000+01:00).
Wert geschrieben: Hallifax/Werk Süd.Lager.Position = 51.964, 7.627 (2026-11-04T07:20:00.000000+01:00).

loot query "Hallifax/Werk Süd.Lager.Position"
Zeitstempel                       Breite   Länge   Höhe [m]  Genauigkeit [m]  Geschwindigkeit [m/s]  Richtung [°]
--------------------------------  -------  ------  --------  ---------------  ---------------------  ------------
2026-11-04T07:00:00.000000+01:00  51.9625  7.6256  -         -                -                      -
2026-11-04T07:10:00.000000+01:00  51.9631  7.6262  -         -                2.5                    90
2026-11-04T07:20:00.000000+01:00  51.964   7.627   -         -                -                      -

Nachspielen

  1. Kurzform "51.9625;7.6256" (Breite;Länge[;Höhe]).
  2. Einzeloptionen: --lat --lon [--alt --accuracy --speed --heading].
  3. JSON-Objekt: '{"lat":51.964,"lon":7.627}'.
  4. query zeigt Breite, Länge, Höhe, Genauigkeit, Geschwindigkeit und Richtung als Spalten.

Dasselbe in der Weboberfläche

Die Karte mit Route erscheint am Node und im Chart (Teil 1, Folien 32 bis 34). Die Adresssuche gibt es nur in der Oberfläche.

USE CASE 6 Massendaten: import

import
cat paletten.csv && loot import paletten.csv --path "Hallifax/Werk Süd.Lager.Paletten"
zeitstempel,wert
2026-11-04T05:00:00,380
2026-11-04T05:30:00,384
2026-11-04T06:00:00,391
2026-11-04T06:30:00,398
2026-11-04T07:00:00,405
5 Werte angenommen, 0 abgelehnt.

cat multi.csv && loot import multi.csv
pfad,zeitstempel,wert
Hallifax/Werk Süd.Lager.Status,2026-11-04T05:00:00,Anfahren
Hallifax/Werk Süd.Lager.Status,2026-11-04T06:00:00,Betrieb
Hallifax/Werk Süd.Lager.Tür offen,2026-11-04T05:10:00,false
Hallifax/Werk Süd.Lager.Tür offen,2026-11-04T06:45:00,true
4 Werte angenommen, 0 abgelehnt.

loot import bad.csv
Fehler: Zeile 3: 'viele' ist kein gültiger Wert vom Typ Int.
[Exitcode 1]

loot query "Hallifax/Werk Süd.Lager.Paletten" --limit 6
Zeitstempel                       Wert
--------------------------------  ----
2026-11-04T06:00:00.000000+01:00  380
2026-11-04T06:30:00.000000+01:00  384
2026-11-04T07:00:00.000000+01:00  391
2026-11-04T07:30:00.000000+01:00  398
2026-11-04T08:00:00.000000+01:00  405

Nachspielen

  1. Mit festem Ziel: loot import datei.csv --path <pfad>, Spalten zeitstempel,wert.
  2. Mehrere Nodes in einer Datei: Spalten pfad,zeitstempel,wert. --separator ; für Excel-Exporte.
  3. Alles oder nichts: Bei einem Fehler (Zeile 3) wird nichts gesendet. Batches zu 10 000 Werten.

Falle: Zeitstempel ohne Offset

In CSV-Dateien gelten Zeitstempel ohne Offset immer als UTC, nicht als Ortszeit wie bei write. Deshalb stehen die Paletten-Werte unten eine Stunde später (05:00 UTC = 06:00+01:00). Mit +01:00 oder Z in der Datei ist das eindeutig.

USE CASE 7 Live mitverfolgen: live

live
loot live "Hallifax/Werk Süd.Lager.Temperatur" --unit °F
Warte auf Werte von 1 Node(s) … (Strg+C beendet)
2026-11-04T10:24:46.675583+01:00  Hallifax/Werk Süd.Lager.Temperatur = 45.5 °F
2026-11-04T10:24:49.243818+01:00  Hallifax/Werk Süd.Lager.Temperatur = 46.22 °F
2026-11-04T10:24:51.783008+01:00  Hallifax/Werk Süd.Lager.Temperatur = 46.94 °F
^C

Im Beispiel schrieb ein zweites Terminal alle 1,5 s einen neuen Wert (7,5 · 7,9 · 8,3 °C). Die Anzeige in °F kommt von --unit.

Nachspielen

  1. Terminal 1: loot live "Hallifax/Werk Süd.Lager.Temperatur" --unit °F
  2. Terminal 2: loot write "Hallifax/Werk Süd.Lager.Temperatur" 7.5
  3. Mehrere Nodes: einfach weitere Pfade anhängen. Strg+C beendet.
Dahinter steckt dieselbe Live-Verbindung (SignalR) wie bei „● Live“ in der Weboberfläche. Verliert Ihr Benutzer das Leserecht, endet das Abonnement serverseitig.

USE CASE 8 Kommandos: Geräte fernsteuern

Ein Kommando ist eine benannte Aktion an einem Node mit typisierten Parametern („Tor öffnen“, „Ventil schließen“). Dafür braucht ein Gerät den Rückkanal. Das Ausführen verlangt das Recht Execute.

command define · list
loot command define "Hallifax/Werk Süd.Lager.Tür offen" "Tor öffnen" --description "Hallentor fahren" --param "Dauer:Int;default=10;min=1;max=60" --param "Modus:String;required;allowed=schnell|langsam"
Kommando 'Tor öffnen' an 'Hallifax/Werk Süd.Lager.Tür offen' angelegt (2 Parameter).

loot command list "Hallifax/Werk Süd.Lager.Tür offen"
Name        Parameter                    Beschreibung
----------  ---------------------------  ----------------
Tor öffnen  Dauer:Int=10, Modus:String*  Hallentor fahren

Nachspielen

  1. loot command define <pfad> "Tor öffnen" --param "Dauer:Int;default=10;min=1;max=60" --param "Modus:String;required;allowed=schnell|langsam"
  2. Parameterformat: name:Typ[;required][;default=…][;min=…][;max=…][;allowed=a|b][;description=…]
  3. loot command list <pfad>: Dauer:Int=10 = Typ und Standardwert, * = Pflicht.
  4. --replace ersetzt ein vorhandenes Kommando, command delete löscht es.

Dasselbe in der Weboberfläche

Abschnitt „Kommandos“ im Node-Detail zeigt dasselbe als Knöpfe mit Parameterformular.

USE CASE 8 Auslösen, abwarten, nachlesen

Gerät · command send · history
loot device run --node "Hallifax/Werk Süd.Lager.Tür offen" --delay 2
Gerät 'loot-cli@50b0aa0cafd7' verbindet sich …
Verbunden (Sitzung 2ac747e499e24abab6bb0db003941523).
  Hallifax/Werk Süd.Lager.Tür offen: zuständig (Node 82)
Warte auf Kommandos … (Strg+C beendet)
Kommando 'Tor öffnen' (Auslösung 1, Node 82) mit Dauer=15, Modus=schnell
  -> erfolgreich gemeldet
^C

loot command send "Hallifax/Werk Süd.Lager.Tür offen" "Tor öffnen" --param Modus=schnell --param Dauer=15 --wait
Kommando 'Tor öffnen' an 'Hallifax/Werk Süd.Lager.Tür offen' ausgelöst (Auslösung 1, ausstehend, läuft ab 2026-11-05T10:25:34.375795+01:00).
Status: zugestellt
Status: erfolgreich
Erfolgreich: Vom Gerätesimulator ausgeführt.

loot command history "Hallifax/Werk Süd.Lager.Tür offen" --limit 5
Id  Ausgelöst                         Kommando    Parameter                Status       Von    Meldung
--  --------------------------------  ----------  -----------------------  -----------  -----  -------------------------------
1   2026-11-04T10:25:34.375795+01:00  Tor öffnen  Dauer=15, Modus=schnell  erfolgreich  admin  Vom Gerätesimulator ausgeführt.

Nachspielen

  1. Terminal 1: loot device run --node "Hallifax/Werk Süd.Lager.Tür offen" --delay 2. Der Gerätesimulator meldet sich über den gRPC-Gerätekanal für den Node an, bestätigt jedes Kommando und meldet nach --delay Sekunden Erfolg (--fail simuliert Fehlschlag).
  2. Terminal 2: loot command send … --param Modus=schnell --param Dauer=15 --wait. Der Exitcode ist 0 nur bei Erfolg.
  3. loot command history <pfad>: die letzten Auslösungen mit Status, Absender und Meldung (90 Tage).
Pflichtparameter
loot command send "Hallifax/Werk Süd.Lager.Tür offen" "Tor öffnen" --param Dauer=15
Fehler: Pflichtparameter fehlen: Modus.
[Exitcode 1]

Merke

Ablaufzeit mit --expires 30m (Standard 24 h, höchstens 30 d). Ist das Gerät offline, wartet das Kommando bis zum Ablauf.

USE CASE 9 Datenquellen: ein Gateway anbinden

Eine Datenquelle liefert Werte für Datenpunkte, ohne den Node-Baum zu kennen. Wohin sie gehören, bestimmen Sie per Zuordnung.

source create · show
loot source create "Hallifax/Gateway Halle S" --point Temperatur:Double --point Feuchte:Double --point Alarm:Bool --overflow Reject
Datenquelle 'Gateway Halle S' angelegt (Id 14, 3 Datenpunkt(e), Puffer 5000 Werte, Reject).

Token: loot_ds_<geheim>

Das Token wird nur jetzt angezeigt; LooT speichert es nicht im Klartext. Geht es verloren, hilft nur 'loot source token'.

loot source show "Hallifax/Gateway Halle S"
Datenquelle:  Gateway Halle S
Id:           14
Art:          extern
Zustand:      aktiv
Template:     -
Token:        …iagQ (erzeugt 2026-11-04T10:26:05.567408+01:00)
Puffer:       5000 Werte, Regel Reject
Rechte:       Manage

Datenpunkt  Typ     Node              Umwandlung
----------  ------  ----------------  ----------
Alarm       Bool    nicht zugeordnet  -
Feuchte     Double  nicht zugeordnet  -
Temperatur  Double  nicht zugeordnet  -

Nachspielen

  1. loot source create "Hallifax/Gateway Halle S" --point Temperatur:Double --point Feuchte:Double --point Alarm:Bool --overflow Reject
  2. Das Token erscheint nur jetzt. Im Tutorial ist es durch <geheim> ersetzt. Verloren? loot source token erzeugt ein neues, das alte ist sofort ungültig.
  3. Puffer: --buffer-size 5000, Überlaufregel DropOldest (älteste verwerfen) oder Reject (neue abweisen).
  4. Mit Vorlage: --template <name>. Compound-Punkt: --point "Log:compound{message:String,severity:Int}".

Dasselbe in der Weboberfläche

Datenquellen → „Neu …“ (Teil 1, Folie 22).

USE CASE 9 Zuordnen und Werte senden

Nodes · source map · source send
loot node create "Hallifax/Werk Süd.Halle S" --description "Halle S" && loot node create "Hallifax/Werk Süd.Halle S.Temperatur" --type double --unit °C && loot node create "Hallifax/Werk Süd.Halle S.Feuchte" --type double --unit % && loot node create "Hallifax/Werk Süd.Halle S.Alarm" --type bool
Node 'Hallifax/Werk Süd.Halle S' angelegt (Id 86).
Node 'Hallifax/Werk Süd.Halle S.Temperatur' angelegt (Id 87).
Node 'Hallifax/Werk Süd.Halle S.Feuchte' angelegt (Id 88).
Node 'Hallifax/Werk Süd.Halle S.Alarm' angelegt (Id 89).

loot source map "Hallifax/Gateway Halle S" Temperatur "Hallifax/Werk Süd.Halle S.Temperatur" && loot source map "Hallifax/Gateway Halle S" Feuchte "Hallifax/Werk Süd.Halle S.Feuchte" && loot source map "Hallifax/Gateway Halle S" Alarm "Hallifax/Werk Süd.Halle S.Alarm"
Datenpunkt 'Temperatur' (Double) → Hallifax/Werk Süd.Halle S.Temperatur (Double).
Datenpunkt 'Feuchte' (Double) → Hallifax/Werk Süd.Halle S.Feuchte (Double).
Datenpunkt 'Alarm' (Bool) → Hallifax/Werk Süd.Halle S.Alarm (Bool).

loot source send "Hallifax/Gateway Halle S" --token loot_ds_<geheim> Temperatur 21.5
Wert angenommen: Gateway Halle S.Temperatur = 21.5 (Eingangszeitpunkt); er liegt jetzt im Puffer.
Wert angenommen: Gateway Halle S.Feuchte = 48 (Eingangszeitpunkt); er liegt jetzt im Puffer.
Wert angenommen: Gateway Halle S.Alarm = false (Eingangszeitpunkt); er liegt jetzt im Puffer.

loot source send "Hallifax/Gateway Halle S" --token loot_ds_<geheim> Temperatur heiß
Fehler: 'heiß' ist kein gültiger Wert vom Typ Double (Dezimalpunkt, keine Tausendertrennung).
[Exitcode 1]

Nachspielen

  1. Ziel-Nodes anlegen (Halle S.Temperatur usw., Werttypen passend).
  2. loot source map <quelle> <punkt> <node> ordnet zu; bei Umwandlung (z. B. Int → Double) zeigt die CLI eine Warnung. source unmap löst.
  3. loot source send <quelle> --token loot_ds_… <punkt> <wert> spielt ein Gerät nach. Die CLI prüft den Werttyp vorab.
Wie ein echtes Gerät: HTTP
curl -X POST https://ingest.example.org/api/source/values \
    -H "Authorization: Bearer loot_ds_<geheim>" -H "Content-Type: application/json" \
    -d '{"values":[{"name":"Temperatur","value":22.1},{"name":"Feuchte","value":47.5}]}'
{"accepted":2,"rejected":0,"rejections":[],"droppedValues":0}
HTTP 202

Merke

Das ist derselbe Weg, den ein Sensor nimmt: POST /api/source/values mit Bearer-Token. Optional trägt jeder Wert ein "ts".

USE CASE 9 Datenquellen im Betrieb

Betrieb
loot source show "Hallifax/Gateway Halle S"
Datenquelle:  Gateway Halle S
Id:           14
Art:          extern
Zustand:      aktiv
Template:     -
Token:        …iagQ (erzeugt 2026-11-04T10:26:05.567408+01:00)
Puffer:       5000 Werte, Regel Reject
Rechte:       Manage

Datenpunkt  Typ     Node             Umwandlung
----------  ------  ---------------  ----------
Alarm       Bool    Alarm (89)       -
Feuchte     Double  Feuchte (88)     -
Temperatur  Double  Temperatur (87)  -

loot source buffer "Hallifax/Gateway Halle S"
Füllstand:    0/5000 (0 %), 0 Einträge, Regel Reject
Ältester:     -
Letzter:      2026-11-04T10:26:37.494887+01:00
Verworfen:    0 Werte (DropOldest), abgewiesen 0 (Reject)

loot source events "Hallifax/Gateway Halle S" --limit 5
Zeit                              Art           Anzahl  Text
--------------------------------  ------------  ------  -----------------------------------------------------------
2026-11-04T10:27:59.247329+01:00  TokenRotated  1       Token erneuert von admin; das bisherige Token ist ungültig.
2026-11-04T10:27:57.593775+01:00  TokenRotated  1       Token erneuert von admin; das bisherige Token ist ungültig.

loot query "Hallifax/Werk Süd.Halle S.Temperatur"
Zeitstempel                       Wert [°C]
--------------------------------  ---------
2026-11-04T10:26:35.415520+01:00  21.5

Nachspielen

  1. loot source show: Zuordnungen der Datenpunkte, Tokenalter, Puffer.
  2. loot source buffer <quelle> [--clear]: Füllstand, älteste/letzte Lieferung, verworfene oder abgewiesene Werte.
  3. loot source events <quelle>: Ereignisprotokoll (Ablehnungen, Überläufe, Token-Wechsel).
  4. Die zugeordneten Werte stehen sofort am Node: loot query.
source list · lock · unlock
loot source list Hallifax
Id  Name                  Art     Zustand  Datenpunkte  Unzugeordnet  Puffer        Letzter Eingang
--  --------------------  ------  -------  -----------  ------------  ------------  --------------------------------
9   Band-Simulator        intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:44.887857+01:00
13  Band-Simulator        intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.217933+01:00
7   Druck-Simulator       intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.225062+01:00
12  Druck-Simulator       intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.215096+01:00
8   Energie-Simulator     intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.213606+01:00
14  Gateway Halle S       extern  aktiv    3            0             0/5000 (0 %)  2026-11-04T10:26:37.494887+01:00
10  Hallensensor-Gateway  extern  aktiv    2            0             0/5000 (0 %)  2026-11-04T08:38:30.051834+01:00
6   Kessel-Simulator      intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.225087+01:00
11  Kessel-Simulator      intern  aktiv    1            0             0/5000 (0 %)  2026-11-04T10:26:45.212442+01:00

loot source lock "Hallifax/Gateway Halle S" && loot source unlock "Hallifax/Gateway Halle S"
Datenquelle 'Gateway Halle S' gesperrt; Lieferungen werden abgewiesen, gepufferte Werte gehen weiter an die Nodes.
Datenquelle 'Gateway Halle S' entsperrt; sie nimmt wieder Werte an.

USE CASE 9 Datenquellen-Templates

source-template
loot source-template create --from-source "Hallifax/Gateway Halle S" && loot source-template list Hallifax
Datenquellen-Template 'Gateway Halle S' angelegt (Tenant 3, Id 1, 3 Datenpunkt(e)).
Id  Name             Gültig    Datenpunkte  Beschreibung
--  ---------------  --------  -----------  ------------
1   Gateway Halle S  Tenant 3  3            -

Nachspielen

  1. loot source-template create --from-source "Hallifax/Gateway Halle S": Vorlage aus den Datenpunkten einer vorhandenen Quelle.
  2. Neue Geräte desselben Typs: loot source create … --template "Gateway Halle S".
  3. Von Hand: source-template create Hallifax/Name --point Temperatur:Double …, systemweit mit --system (Systemadmin).
Templates sind lose Referenzen: Ein später gelöschtes Template hinterlässt nur einen leeren Verweis, vorhandene Quellen laufen weiter.

USE CASE 10 Producer im Katalog

producer list
loot producer list --tenant Hallifax
Id  Name               Version  Art        Katalog     Ausführung
--  -----------------  -------  ---------  ----------  ----------
6   Chart              1.0.0    Konverter  systemweit  LooT
1   LFO Simple         1.0.0    getaktet   systemweit  LooT
2   LFO Simple         1.1.0    getaktet   systemweit  LooT
4   Schwelle           1.0.0    Konverter  systemweit  LooT
3   Skalieren          1.0.0    Konverter  systemweit  LooT
5   Zuordnungstabelle  1.0.0    Konverter  systemweit  LooT

Nachspielen

  1. loot producer list --tenant Hallifax: systemweite Producer plus die des Tenants, mit Art (getaktet oder Konverter) und Ausführung (LooT, Plugin, extern).
  2. Eigene Konverter als ZIP: loot producer upload datei.zip --tenant Hallifax (oder --system). Das Ziel ist ausdrücklich anzugeben.

Hinweis

Instanzen (z. B. „Kessel-Simulator“ aus Teil 1) legen Sie in der Weboberfläche an. Ihre Ausgänge erscheinen als interne Datenquellen in loot source list.

USE CASE 11 Node-Templates: einmal beschreiben, oft verwenden

template · node create --template
loot template create "Hallifax/Werk Süd.Lager" --name Lagerhalle
Template 'Lagerhalle' angelegt (Id 1, Version 1); 'Hallifax/Werk Süd.Lager' verweist darauf.

loot template list Hallifax && loot template show Hallifax/Lagerhalle
Id  Name        Neueste Version  Versionen  Verwendet
--  ----------  ---------------  ---------  ---------
1   Lagerhalle  1                1          1
Template:     Lagerhalle
Id:           1
Arbeitsstand: wie neueste Version
Verwendet:    1 Node(s)

Version  Angelegt                          Von    Nodes  Verwendet
-------  --------------------------------  -----  -----  ---------
1        2026-11-04T10:27:19.571507+01:00  admin  6      1

Nodes der Version 1:
Pfad        Werttyp  Einheit  Richtung  Defaultwert
----------  -------  -------  --------  -----------
(Wurzel)    -        -        -         -
Paletten    Int      -        InOut     -
Position    Geo      -        InOut     -
Status      String   -        InOut     -
Temperatur  Double   °C       InOut     -
Tür offen   Bool     -        InOut     -
Links: 0, Producer-Instanzen: 0, Kommandos: 1, Verbindungen: 0

loot node create "Hallifax/Werk Süd.Lager 2" --template Lagerhalle && loot node list "Hallifax/Werk Süd.Lager 2"
Node 'Hallifax/Werk Süd.Lager 2' aus Template 'Lagerhalle' (Version 1) angelegt (Id 96); 0 Defaultwert(e) geschrieben.
Id   Name        Werttyp  Einheit  Richtung
---  ----------  -------  -------  --------
97   Paletten    Int      -        InOut
98   Position    Geo      -        InOut
99   Status      String   -        InOut
100  Temperatur  Double   °C       InOut
101  Tür offen   Bool     -        InOut

loot node show "Hallifax/Werk Süd.Lager 2"
Pfad:         Hallifax/Werk Süd.Lager 2
Id:           96
Name:         Lager 2
Beschreibung: Hochregallager
Werttyp:      - (keine Zeitreihe)
Einheit:      -
Richtung:     None
Duplikate:    LastServe
Letzter Wert: (kein Wert)
Template:     Lagerhalle, Version 1 (neueste 1), keine Abweichung

Nachspielen

  1. loot template create "Hallifax/Werk Süd.Lager" --name Lagerhalle macht aus dem Teilbaum die Version 1.
  2. loot node create "Hallifax/Werk Süd.Lager 2" --template Lagerhalle erzeugt daraus einen neuen Teilbaum (inklusive Kommandos).
  3. loot node show nennt Template, Version und Abweichungen.
  4. Nach neuen Versionen: loot node migrate-template <pfad> [--version n] stellt ohne Werteverlust um.

USE CASE 11 Teilbäume klonen

node clone · copy list
loot node clone "Hallifax/Werk Süd.Halle S" "Hallifax/Werk Süd" --name "Halle T" --wait
Node 'Hallifax/Werk Süd.Halle S' nach 'Hallifax/Werk Süd' geklont als 'Halle T' (Id 102).

loot node list "Hallifax/Werk Süd" && loot copy list Hallifax --all
Id   Name     Werttyp  Einheit  Richtung
---  -------  -------  -------  --------
86   Halle S  -        -        -
102  Halle T  -        -        -
80   Lager    -        -        -
96   Lager 2  -        -        -
Keine Klone.

Nachspielen

  1. loot node clone <pfad> <ziel> --name "Halle T": Teilbaum samt Links, Verbindungen und Producer-Instanzen, ohne Werte und Rechte. Ziel ist ein Tenant (Kopie wird Wurzel) oder ein Node (Kopie wird Kind).
  2. --with-commands nimmt auch Kommandos mit.
  3. Große Teilbäume klont der Server im Hintergrund: --wait zeigt den Fortschritt, sonst loot copy show <id>, copy list, copy cancel.

USE CASE 12 Dateien als Werte: upload und download

Custom-Node
loot node create "Hallifax/Werk Süd.Lager.Bericht" --type custom --description "Schichtberichte als Datei"
Node 'Hallifax/Werk Süd.Lager.Bericht' angelegt (Id 106).

loot upload "Hallifax/Werk Süd.Lager.Bericht" lagerbericht.txt --type text/plain --ts 2026-11-04T08:00:00
Datei hochgeladen: Hallifax/Werk Süd.Lager.Bericht (63 Bytes, text/plain, Datenbank) um 2026-11-04T08:00:00.000000+01:00.

loot query "Hallifax/Werk Süd.Lager.Bericht"
Zeitstempel                       Größe [Bytes]  Inhaltstyp  Dateiname
--------------------------------  -------------  ----------  ----------------
2026-11-04T08:00:00.000000+01:00  63             text/plain  lagerbericht.txt

rm -f lagerbericht.txt && loot download "Hallifax/Werk Süd.Lager.Bericht" --ts 2026-11-04T08:00:00 && cat lagerbericht.txt
Inhalt gespeichert: lagerbericht.txt (63 Bytes, text/plain).
Lagerbericht 04.11.2026: Regal 3 gereinigt, Temperatur stabil.

Nachspielen

  1. Node mit --type custom anlegen.
  2. loot upload <pfad> datei.txt --type text/plain --ts …: bis 64 KB in der Datenbank, größere im Object Storage.
  3. loot query zeigt Größe, Typ und Dateiname. loot download <pfad> --ts … [-o datei] holt den Inhalt zurück.

Mehr

Auch Bilder und Videos funktionieren so. In der Weboberfläche erscheinen sie als Galerie. Für Stream-Nodes (Audio/Video) gibt es loot stream list|download|start|stop.

USE CASE 13 In Skripten und Pipelines

Shell-Skript
loot node show "Hallifax/Werk Süd.Lager.Temperatur" > /dev/null && echo "Node vorhanden" ; loot node show "Hallifax/Gibt/es/nicht" 2>/dev/null || echo "Node fehlt (Exitcode $?)"
Node vorhanden
Node fehlt (Exitcode 1)

for n in Temperatur Paletten Status; do printf "%-12s" $n; loot query "Hallifax/Werk Süd.Lager.$n" --order desc --limit 1 --json | python3 -c "import sys,json; print(json.load(sys.stdin)[\"points\"][0][\"value\"])"; done
Temperatur  8.3
Paletten    405
Status      Einlagerung läuft

Bausteine

  • Exitcode: 0 = Erfolg, 1 = Server/Daten, 2 = Aufruf/Konfiguration. Skripte brechen mit set -e sauber ab.
  • JSON: --json + jq oder Python. Zeiten stets in UTC.
  • stderr/stdout: Fehlermeldungen getrennt, Tabellen nur auf stdout.
  • Idempotenz: Gleiche Zeitstempel überschreiben (Duplikat-Regel am Node), Importe sind „alles oder nichts“.

Ideen zum Ausprobieren

  • Cronjob: loot write Hallifax/Server.Last $(uptime …)
  • CI: Node-Struktur aus einer Textdatei per Skript anlegen.
  • Nachts loot query … --json in einen Report exportieren.

USE CASE 14 Aufräumen: Löschen mit Sicherheitsnetz

delete
loot node delete "Hallifax/Werk Süd.Lager 2" --recursive
Gelöscht: Hallifax/Werk Süd.Lager 2

loot node delete "Hallifax/Werk Süd.Lager"
Fehler: Der Node hat Kind-Nodes; zum Löschen samt Teilbaum recursive=true angeben.
[Exitcode 1]

loot tenant delete Labor --recursive && loot tenant list
Gelöscht: Labor
Id  Name
--  --------
2   Demo
3   Hallifax
1   Monsters

Nachspielen

  1. loot node delete <pfad> löscht einen Node ohne Kinder. Mit Kindern oder Werten verlangt LooT --recursive.
  2. loot tenant delete <name> --recursive entfernt den Tenant samt aller Nodes (Systemadmin).
  3. Große Löschungen laufen im Hintergrund: Fortschritt in der CLI, --no-wait kehrt sofort zurück, loot deletion show <id> fragt den Stand ab.

Hinweis

In der Fehlermeldung steht noch „recursive=true“. Gemeint ist die CLI-Option --recursive.

TEIL 3 Interaktiv arbeiten und Hilfe finden

loot node --help
loot node --help
Description:
  Nodes anzeigen, anlegen, klonen, löschen und auf neue Template-Versionen umstellen

Usage:
  loot node [command] [options]

Options:
  -?, -h, --help  Show help and usage information
  --utc           Zeiten in UTC ausgeben und Zeiten ohne Offset als UTC lesen (Standard: lokale Systemzeit)

Commands:
  list <pfad>              Wurzel-Nodes eines Tenants oder die Kinder eines Nodes auflisten
  create <pfad>            Node anlegen, mit --template aus einem Template
  show <pfad>              Eigenschaften und letzten Wert eines Nodes anzeigen
  clone <pfad> <zielpfad>  Node samt Teilbaum, Links, Verbindungen und Producer-Instanzen klonen (ohne Werte und Rechte); große Teilbäume im Hintergrund
  delete <pfad>            Node löschen; große Teilbäume werden im Hintergrund gelöscht
  migrate-template <pfad>  Node ohne Werteverlust auf eine neuere Version seines Templates umstellen (E305)

Interaktiver Modus

  1. loot -i startet eine Sitzung, in der Sie Befehle zeilenweise eingeben.
  2. Tab vervollständigt Befehle und Node-Pfade. Das spart das Tippen langer Pfade mit Umlauten.

Hilfe

  • loot --help, loot <familie> --help, loot <familie> <befehl> --help.
  • Alle Optionen mit Beschreibung auf Deutsch, auch --utc und -i an jedem Befehl.

Spickzettel

Ich will …Befehl
anmeldenloot login --server host
Struktur ansehenloot node list "T/Pfad" · node show
Node anlegenloot node create "T/A.B" --type double --unit °C
Wert schreibenloot write "T/A.B" 21.5 [--ts …]
Werte lesenloot query "T/A.B" --from … --to … [--unit °F] [--json]
live zuschauenloot live "T/A.B"
CSV ladenloot import datei.csv [--path …]
Ich will …Befehl
Kommando auslösenloot command send "T/A" "Name" --param k=v --wait
Gerät simulierenloot device run --node "T/A"
Datenquelle anlegenloot source create "T/Name" --point X:Double
Datenpunkt zuordnenloot source map "T/Name" X "T/A.B"
Struktur kopierenloot template create · node clone
Datei ablegenloot upload "T/A.B" datei
löschenloot node delete "T/A" --recursive

Was Sie jetzt gebaut haben

Struktur

Werk Süd mit Lager und Halle S: 16 Nodes in 6 Werttypen, ganz ohne Maus. Zusätzlich ein Template „Lagerhalle“ und ein geklonter Teilbaum.

Werte

Einzelwerte, Schleifen, CSV mit Zeitstempeln, Geo-Positionen, eine Datei und ein Gateway über Token und HTTP.

Betrieb

Live-Strom, Kommando mit Rückmeldung eines Geräts, Puffer und Ereignisse einer Datenquelle, sicheres Löschen.

Weiter in Teil 1

Dieselbe Welt in der Weboberfläche: Charts, Karten, Editor, Rechte, Aufbewahrung. Zum Web-Tutorial ↗

Weiter ausprobieren

app.loot.apps.rheinwert.de ↗
Alpha-Status: noch nicht freigegeben, Funktionen und Daten können sich ändern.