Zum Inhalt springen

Referenz der Knoten ​

Jede Art von Knoten, die ein Experiment enthalten kann, in den Gruppen des Hinzufügen-Menüs: Aktionen, Warteknoten, Emulation, Störungen, Daten, Prüfungen und Ablauf. Wie man sie hinzufügt und verdrahtet, steht in Der Editor; signallab nodes gibt denselben Katalog als JSON aus, für Skripte und Assistenten (Die Kommandozeile).

Diese Seite lesen ​

Jeder Knoten hat eine Tabelle seiner Felder:

  • Feld ist der Name im Bereich der Eigenschaften; In der Datei ist der Schlüssel im JSON des Experiments.
  • Standard ist, was ein Knoten erhält, wenn Sie ihn im Editor hinzufügen. Wo eine Datei einen Schlüssel weglassen darf, ist der Wert, den er dann annimmt, als falls nicht vorhanden angegeben; andere Schlüssel sind in einer Datei erforderlich.
  • Vorlagen: ja — das Feld nimmt {{templates}}: Parameter, früher gesetzte Variablen, Geheimnisse und Generatoren, aufgelöst, während der Schritt läuft (Daten und Vorlagen). Nur Parameter — es wird vor dem ersten Schritt geöffnet, wenn nur Parameter bekannt sind. Nein — der Wert wird so genommen, wie er geschrieben ist.

Zeiten sind in Millisekunden. Grenzen werden vor dem Start eines Durchlaufs geprüft; ein Feld außerhalb des Bereichs hält das Experiment vom Laufen ab und wird am Knoten angezeigt.

Ein Knoten in einer Datei ​

In einer Experimentdatei ist ein Knoten ein Objekt mit einer id (eindeutig im Experiment), seinem type, seinem Platz auf der Arbeitsfläche (x, y, null oder mehr), seinen Feldern und den Einstellungen, die er verwendet (retry, repeat, load, weggelassen, wenn aus). Eine Verbindung ist eine Kante von einem Ausgang eines Knotens (port, next falls nicht vorhanden) zu einem anderen Knoten:

json
{
  "nodes": [
    { "id": "start", "type": "start", "x": 40, "y": 80 },
    { "id": "ping", "type": "udp", "x": 270, "y": 80, "target": "127.0.0.1:9000", "text": "PING",
      "retry": { "attempts": 3, "delay_ms": 500, "backoff": "fixed" } },
    { "id": "end", "type": "end", "x": 500, "y": 80 }
  ],
  "edges": [
    { "from": "start", "to": "ping", "port": "next" },
    { "from": "ping", "to": "end", "port": "next" }
  ]
}

Die Beispiele unten zeigen je einen Knoten, wie eine Datei ihn hält.

Von vielen Knoten geteilte Einstellungen ​

Diese werden im unteren Teil der Eigenschaften eines Knotens eingeschaltet. Welcher Knoten welche annimmt, steht unter jedem Knoten.

EinstellungNimmt sieWas sie tut
NeuversuchKnoten, die senden oder lauschen: HTTP-Anfrage, TCP-Nachricht, OSC-Nachricht, UDP-Datagramm, MQTT veröffentlichen, WebSocket verbinden, WebSocket senden, und jeden WarteknotenVersucht es erneut, wenn der Schritt fehlschlägt
WiederholungKnoten, die senden: HTTP-Anfrage, TCP-Nachricht, OSC-Nachricht, UDP-Datagramm, MQTT veröffentlichen, WebSocket sendenSendet immer wieder, eine Anzahl von Malen oder eine Zeit lang
LastHTTP-AnfrageSendet die Anfrage nach einem Lastprofil, gemessen und an Schwellenwerten beurteilt
Auf eine Antwort wartenOSC-Nachricht, UDP-DatagrammSendet und wartet im selben Schritt auf die Antwort

Neuversuch ​

bei Fehler erneut versuchen: Wenn der Schritt fehlschlägt — keine Verbindung, eine Zeitüberschreitung, ein Warten ohne Treffer —, pausiert er und läuft erneut. Jeder fehlgeschlagene Versuch ist eine Zeile in der Zeitleiste; der Schritt schlägt fehl, wenn der letzte Versuch es tut. Eine Vorlage, die sich nicht auflösen lässt, wird nicht erneut versucht. Stoppen beendet auch eine Pause.

FeldIn der DateiWasStandard und Grenzen
Versucheretry.attemptsVersuche insgesamt, der erste eingeschlossen3; 2–10 im Editor (eine Datei darf auch 1 sagen)
Pause, msretry.delay_msDie Pause vor dem zweiten Versuch500; 0–60 000
Pausenretry.backoffgleichbleibend (fixed): jede Pause gleich; verdoppelnd (exponential): nach jedem Fehlschlag doppelt so langfixed (auch falls nicht vorhanden)

Keine Pause ist länger als 60 Sekunden, wie sehr sie sich auch verdoppelt. Ein Warten, dessen Ausgang Timeout verdrahtet ist, schlägt bei einer Zeitüberschreitung nicht fehl — es geht durch diesen Ausgang —, wird dann also nicht erneut versucht.

Wiederholung ​

wiederholt senden: Der Knoten sendet immer wieder — ein Herzschlag, eine Abfrage, ein gleichmäßiger Strom —, ohne eine Schleife im Graphen. Jede Sendung liest ihre Vorlagen neu ({{counter}} ist ihre Nummer, {{now}} ihre Zeit), und Neuversuch, wenn an, gilt für jede Sendung. Der Schritt besteht, wenn jede Sendung es tat; eine Sendung, die endgültig fehlschlägt, lässt den Schritt fehlschlagen. Die Zeitleiste berichtet den Fortschritt höchstens einmal pro Sekunde.

FeldIn der DateiWasStandard und Grenzen
Wiederholenrepeat.untilnach Anzahl (count) oder nach Dauer (duration)count (auch falls nicht vorhanden)
Anzahlrepeat.countSendungen insgesamt, die erste eingeschlossen10 (auch falls nicht vorhanden); 2–10 000
Dauer, msrepeat.duration_msWie lange weiter gesendet wird, ab der ersten Sendung10 000 (auch falls nicht vorhanden); 1–300 000
Intervall, msrepeat.interval_msDie Pause zwischen zwei Sendungen1 000; 10–60 000; in einer Datei erforderlich
Jitter, msrepeat.jitter_msJede Pause bis zu so viel länger, gezogen aus dem Startwert des Durchlaufs0 (auch falls nicht vorhanden); 0–60 000

Die Wiederholungen müssen in die 300 Sekunden eines Durchlaufs passen, und eine Zeit lang muss weniger als 10 000 Sendungen brauchen (ihre Zeit geteilt durch das Intervall).

Last ​

unter Last senden, nur an einer HTTP-Anfrage: Die Anfrage wird nach einem Profil gesendet — eine konstante Rate, eine Rampe, Stufen, eine Spitze oder zufällige Ankünfte —, mit bis zu 512 gleichzeitig unterwegs (standardmäßig 32), und gemessen: Latenzen, Fehler, die erreichte Rate. Schwellenwerte entscheiden, ob der Schritt besteht. Last ersetzt Wiederholung und Neuversuch (eine fehlgeschlagene Anfrage wird gezählt, nicht erneut versucht) und hinterlässt keine Antwort für die Prüfungen danach. Ihre Felder und Ergebnisse stehen in Lasttests.

Auf eine Antwort warten ​

auf eine Antwort warten, an einer OSC-Nachricht oder einer UDP-Datagramm: Die Nachricht wird von dem Port gesendet, auf dem die Antwort erwartet wird, sodass ein Gerät, das dem Absender antwortet, gehört wird, und der Schritt besteht nur, wenn rechtzeitig eine passende Antwort eintrifft. Keine Antwort lässt den Schritt fehlschlagen — Neuversuch sendet erneut. Die Antwort wird in einer Variablen gespeichert, wie bei einem Warteknoten.

FeldIn der DateiWasStandard und GrenzenVorlagen
Antwort auf (IP:Port)reply.bindIP:port, von dem gesendet und auf dem gelauscht wird; Port 0 nimmt einen beliebigen freien Port0.0.0.0:0Nein
Adressmuster der Antwort (OSC)reply.addressDas Adressmuster der Antwort, wie in Auf OSC warten/*Ja
Argumentregeln (OSC)reply.argsArgumentregeln, wie in Auf OSC wartenkeine; höchstens 16Werte: ja
Nutzdaten der Antwort (UDP)reply.modeany, contains, regex oder hex — siehe Nutzdaten abgleichenany (auch falls nicht vorhanden)Nein
Muster (UDP)reply.patternWas die Antwort enthalten oder worauf sie passen mussleer; erforderlich außer bei anyJa
Timeout, msreply.timeout_msWie lange gewartet wird2 000 (auch falls nicht vorhanden); 1–120 000Nein
Antwortvariablereply.variableDie Variable, in die die Antwort geschrieben wirdreply (auch falls nicht vorhanden)Nein

Der Port der Antwort wird vor dem ersten Schritt geöffnet, wie der eines Warteknotens.

Aktionen ​

Knoten, die senden. Ein Warten nach einer Aktion zählt Nachrichten ab dem Moment, in dem die Aktion begann.

HTTP-Anfrage ​

Sendet eine HTTP-Anfrage und behält die Antwort für die Prüfungen, Zweige und Knoten Wert extrahieren danach.

FeldIn der DateiWasStandard und GrenzenVorlagen
Methoderequest.methodGET, HEAD, POST, PUT, PATCH, DELETE oder OPTIONS (eine Datei darf jede Methode nennen)GETNein
URLrequest.urlEine http://- oder https://-URLhttp://127.0.0.1:8080/Ja
Timeout (ms)request.timeout_msFür den ganzen Austausch4 000 (10 000 falls nicht vorhanden); 1–120 000Nein
Anfrage-Headerrequest.headers[[name, value], …]; eine Zeile mit leerem Namen wird übersprungenkeineJa, Namen und Werte
Bodyrequest.bodyText, oder null für keinennullJa
Authentifizierungrequest.authKeine, Basic, Bearer-Token oder Digest, mit Benutzername und Passwort, oder TokenkeineJa
  • Jede Antwort lässt den Schritt bestehen, 404 und 500 eingeschlossen: Prüfen Sie den Status mit HTTP-Status oder verzweigen Sie mit Statusverzweigung darauf. Eine Anfrage, die keine Antwort erhält — abgelehnt, eine Zeitüberschreitung, ein Name, der sich nicht auflöst, ein Zertifikat, dem nicht vertraut wird —, lässt den Schritt fehlschlagen.
  • Weiterleitungen werden verfolgt, höchstens zehn. https://-Zertifikate werden geprüft.
  • Der Antwort-Body wird bis zu 256 KiB für die Prüfungen behalten; ein größerer Body wird dort abgeschnitten (die Prüfungen sagen es, wenn das Gesuchte hinter dem Schnitt liegen könnte).
  • Digest beantwortet die 401-Challenge des Servers und sendet die Anfrage erneut. Die Anmeldedaten gehen nur in die Anfrage: Schritte, Berichte und der Inspektor zeigen nie den Authorization-Header. Schreiben Sie ein Passwort als {{secret.NAME}}.
  • Solange das Experiment Cookies behält (standardmäßig an, unter Parameter), wird, was Server setzen, mit den späteren Anfragen des Durchlaufs an sie zurückgesendet.

Ausgänge: Ausgang. Einstellungen: Neuversuch, Wiederholung, Last.

json
{ "id": "cue", "type": "http", "x": 270, "y": 80,
  "request": { "method": "POST", "url": "{{api}}/cue", "headers": [["Content-Type", "application/json"]],
               "body": "{\"cue\": 1}", "timeout_ms": 5000,
               "auth": { "scheme": "bearer", "token": "{{secret.API_TOKEN}}" } } }

Siehe auch HTTP.

TCP-Nachricht ​

Verbindet sich über TCP mit einem Host, schreibt die Nutzdaten, wartet bis zu 250 ms auf die ersten Bytes einer Antwort (es liest höchstens 1 024 Bytes, einmal) und schließt die Verbindung. Die Größe der Antwort wird berichtet, nicht geprüft.

Im Inspektor ist der Schritt zwei tcp-Frames mit der Quelle experiment: die geschriebenen Nutzdaten und, wenn eine kam, die gelesene Antwort. Verwendete Geheimnisse werden in beiden maskiert, wie in jedem Frame.

FeldIn der DateiWasStandard und GrenzenVorlagen
HosthostEin Hostname oder eine IP-Adresse127.0.0.1Ja
Portport9000; 1–65 535Nein
Timeout (ms)timeout_msFür Verbinden, Schreiben und die Antwort zusammen4 000 (auch falls nicht vorhanden); 1–120 000Nein
NutzdatenpayloadDer Text, der nach dem Verbinden geschrieben wird, als UTF-8helloJa

Der Schritt schlägt fehl, wenn die Verbindung abgelehnt wird, der Name sich nicht auflöst oder die Zeit abläuft. Ausgänge: Ausgang. Einstellungen: Neuversuch, Wiederholung. Jetzt senden verbindet sich und schreibt die Nutzdaten einmal, und das Ergebnis des Knotens sagt, wie viele Bytes gesendet wurden und zurückkamen.

json
{ "id": "go", "type": "tcp", "x": 270, "y": 80, "host": "127.0.0.1", "port": 5000, "payload": "GO\r\n", "timeout_ms": 2000 }

OSC-Nachricht ​

Sendet eine OSC-1.0-Nachricht über UDP.

FeldIn der DateiWasStandard und GrenzenVorlagen
Ziel Host:PorttargetIP:port oder host:port; ein Hostname wird beim Senden des Schritts aufgelöst, seine IPv4-Adresse genommen, wenn er eine hat127.0.0.1:9000Ja
OSC-AdresseaddressBeginnt mit //testJa
Argumenteargs[{ "type", "value" }, …] — int, float, str, long, double, bool, blob (Bytes), nil (kein Wert)keineTextwerte (str): ja
auf eine Antwort wartenreplyOptional: senden und auf die Antwort warten — siehe Auf eine Antwort wartenaus

Ausgänge: Ausgang; mit erwarteter Antwort wird er nur gefolgt, wenn die Antwort kam. Einstellungen: Neuversuch, Wiederholung, eine Antwort. ⚡ Über eine Störung leiten in seinen Eigenschaften stellt ihm eine Störung voran.

json
{ "id": "fader", "type": "osc", "x": 270, "y": 80, "target": "{{device}}", "address": "/fader/1",
  "args": [{ "type": "float", "value": 0.75 }] }

Siehe auch OSC.

UDP-Datagramm ​

Sendet eine Textnutzlast als ein UDP-Datagramm an ein oder mehrere Ziele.

FeldIn der DateiWasStandard und GrenzenVorlagen
Ziel Host:PorttargetIP:port oder host:port; mehrere durch Kommas, Semikolons oder Zeilenumbrüche getrennte erhalten je das Datagramm. Ein Hostname wird beim Senden des Schritts aufgelöst, seine IPv4-Adresse genommen, wenn er eine hat127.0.0.1:9000Ja
NutzdatentextDie Nutzdaten, als UTF-8hello; höchstens 65 507 BytesJa
auf eine Antwort wartenreplyOptional: senden und auf die Antwort warten — siehe Auf eine Antwort wartenaus

Der Schritt schlägt fehl, wenn ein Ziel nicht erreichbar ist. Ausgänge: Ausgang. Einstellungen: Neuversuch, Wiederholung, eine Antwort.

json
{ "id": "ping", "type": "udp", "x": 270, "y": 80, "target": "{{device}}", "text": "PING {{run.id}}",
  "reply": { "bind": "0.0.0.0:0", "mode": "contains", "pattern": "PONG", "timeout_ms": 1000, "variable": "pong" } }

MQTT-Veröffentlichung ​

Verbindet sich mit einem MQTT-Broker, veröffentlicht eine Nachricht und trennt sich. Die Verbindung ist MQTT 3.1.1 über einfaches TCP, mit sauberer Sitzung und ohne Benutzername oder Passwort. Verbinden, Veröffentlichen und die Bestätigung des Brokers müssen alle innerhalb von 15 Sekunden geschehen.

FeldIn der DateiWasStandard und GrenzenVorlagen
Broker-HosthostDer Hostname oder die Adresse des Brokers127.0.0.1Ja
Portport1883; 1–65 535Nein
TopictopicKeine Wildcards (+, #)lab/testJa
NutzdatenpayloadDie Nachricht, als TexthelloJa
QoSqos0, 1 oder 20Nein
Retain-Flag setzenretaintrue: Der Broker behält sie als Wert des TopicsfalseNein

Alle sechs Schlüssel sind in einer Datei erforderlich. Der Schritt schlägt fehl, wenn der Broker nicht erreichbar ist oder die Verbindung oder die Nachricht verweigert. Ausgänge: Ausgang. Einstellungen: Neuversuch, Wiederholung.

json
{ "id": "light", "type": "mqtt", "x": 270, "y": 80, "host": "{{broker}}", "port": 1883,
  "topic": "lab/light/1/set", "payload": "on", "qos": 1, "retain": false }

Siehe auch MQTT.

WebSocket verbinden ​

Öffnet einen WebSocket für den Rest des Durchlaufs oder bis zu einem WebSocket schließen. Was von da an eintrifft, wird für die Auf WebSocket warten-Schritte darauf behalten. URL und Header werden aufgelöst, wenn der Schritt läuft, sodass ein früher extrahiertes Token darin stehen kann. Erneut ausgeführt — in einer Schleife —, schließt er zuerst seine vorherige Verbindung und öffnet eine neue. Wenn der Durchlauf endet, wie auch immer, werden seine Verbindungen mit einem Close-Frame geschlossen.

FeldIn der DateiWasStandard und GrenzenVorlagen
URLurlEine ws://- oder wss://-URLws://127.0.0.1:9001/Ja
Anfrage-Headerheaders[[name, value], …], mit der Upgrade-Anfrage gesendetkeineJa, Namen und Werte
SubprotokolleprotocolsSubprotokolle, die angeboten werden, in Reihenfolge der Präferenz; der Server wählt eineskeineNein
Timeout (ms)timeout_msFür Verbinden und das Upgrade5 000 (10 000 falls nicht vorhanden); 1–120 000Nein

wss:// vertraut denselben Zertifikaten wie https://. Der Schritt schlägt fehl, wenn die Verbindung oder das Upgrade fehlschlägt; der Status des Servers steht im Grund. Ausgänge: Ausgang. Einstellungen: Neuversuch (keine Wiederholung).

json
{ "id": "socket", "type": "ws_connect", "x": 270, "y": 80, "url": "ws://127.0.0.1:9001/chat",
  "headers": [["Authorization", "Bearer {{token}}"]], "protocols": ["chat.v1"], "timeout_ms": 5000 }

Siehe auch WebSocket.

WebSocket senden ​

Sendet eine Nachricht auf der Verbindung, die ein WebSocket verbinden geöffnet hat.

FeldIn der DateiWasStandard und GrenzenVorlagen
VerbindungconnectionDie id eines WebSocket verbinden-Knotens dieses Experimentsder ersteNein
FormatbinaryText (false) oder Binär (Hex) (true): Die Nutzdaten sind Bytes, als Hex geschrieben, de ad be effalse (auch falls nicht vorhanden)Nein
NutzdatentextDie Nachrichthello; höchstens 16 MiBJa

Der Connect muss auf seinem Pfad vor dem Senden kommen; ein Senden, dessen Verbindung nicht offen ist, schlägt fehl. Antworten zählen ab dem Moment, in dem die Nachricht geschrieben wird. Ausgänge: Ausgang. Einstellungen: Neuversuch, Wiederholung.

json
{ "id": "hello", "type": "ws_send", "x": 500, "y": 80, "connection": "socket",
  "text": "{\"type\":\"ping\",\"id\":\"{{uuid}}\"}", "binary": false }

WebSocket schließen ​

Schließt eine Verbindung mit einem Close-Handshake. Die Zeitleiste sagt, wer sie geschlossen hat: dieser Schritt, der Server früher (mit seinem Code) oder eine Verbindung, die abgerissen war.

FeldIn der DateiWasStandard und GrenzenVorlagen
VerbindungconnectionDie id eines WebSocket verbinden-Knotensder ersteNein
Schließcodecode1000 (normal) oder 3000–4999 für einen eigenen einer Anwendung1000 (auch falls nicht vorhanden)Nein
GrundreasonWird mit dem Code gesendetleer; höchstens 123 Bytes, nach den VorlagenJa

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "bye", "type": "ws_close", "x": 960, "y": 80, "connection": "socket", "code": 1000, "reason": "done" }

Log-Marke ​

Schreibt eine Zeile in die Zeitleiste und den Bericht — einen Kontrollpunkt oder die Werte, die ein Durchlauf erreichte.

FeldIn der DateiWasStandard und GrenzenVorlagen
NachrichtmessageDer TextCheck point; höchstens 10 000 ZeichenJa

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "ready", "type": "log", "x": 500, "y": 80, "message": "device {{device}} ready" }

Warteknoten ​

Die Gruppe Beobachten: Knoten, die darauf warten, dass etwas eintrifft. Sie teilen diese Regeln:

  • Sie lauschen vom Start des Durchlaufs an. Der Port oder das Broker-Abonnement eines Warteknotens wird vor dem ersten Schritt geöffnet, sodass ein Gerät, das schneller antwortet als der nächste Schritt beginnt, nicht verpasst wird. Zwei Warteknoten auf derselben Adresse teilen sich einen Socket.
  • Sie zählen ab der letzten Aktion auf ihrem Zweig. Eine Nachricht, die vor der letzten Anfrage des Zweigs eintraf, ist keine Antwort darauf; vor jeder Aktion zählt alles seit dem Start des Durchlaufs.
  • Die erste passende Nachricht wird genommen. Eine Nachricht, die ein Warteknoten genommen hat, wird von einem anderen nicht gesehen.
  • Treffer oder Timeout. Bei einem Treffer wird die Nachricht in der Variablen des Warteknotens gespeichert und der Ablauf folgt Treffer. Wenn die Zeit abläuft, folgt er Timeout, wenn dieser Ausgang verdrahtet ist; andernfalls schlägt der Schritt fehl und sagt, wie viele andere Nachrichten eintrafen.
  • Jeder Socket behält die neuesten 1 024 Nachrichten (und 64 MiB); ältere werden verworfen, und eine Zeitüberschreitung sagt, wie viele.
  • Jetzt empfangen lauscht mit diesem einen Schritt, von jetzt an.

Ausgänge: Treffer (erforderlich), Timeout (optional). Einstellungen: Neuversuch.

Nutzdaten abgleichen ​

Auf UDP warten, Auf MQTT warten, Auf WebSocket warten und eine UDP-Antwort wählen, wie die Nutzdaten aussehen müssen:

OptionIn der DateiPasst, wenn die Nutzdaten
Beliebiges Datagrammanyirgendetwas sind
Enthält Textcontainsals UTF-8-Text gelesen das Muster enthalten (Schreibweise beachtet)
Passt auf Regexregexals UTF-8-Text gelesen auf den regulären Ausdruck passen
Enthält Bytes (Hex)hexdie Bytes enthalten, als Hex-Paare geschrieben: de ad be ef, deadbeef, 0xde,0xad, DE:AD

Die passende Nachricht wird als Objekt gespeichert. Spätere Schritte lesen ihre Felder als {{reply.text}} (mit dem Namen der Variablen anstelle von reply):

FeldWas
textDie Nutzdaten als Text
hex, bytesDie Nutzdaten als Hex (ihre ersten 1 024 Bytes) und ihre Größe in Bytes
matchWas gepasst hat: der Text, die erste Gruppe des regulären Ausdrucks (oder der ganze Treffer) oder die Bytes
fromIP:port des Absenders
msMillisekunden von der letzten Aktion des Zweigs (oder dem Start des Durchlaufs) bis zur Nachricht
topicAuf MQTT warten: das Topic, an das sie veröffentlicht wurde
json, kindAuf WebSocket warten: die als JSON geparste Nachricht (null, wenn nicht), und text oder binary

Auf OSC warten ​

Wartet auf eine OSC-Nachricht, deren Adresse auf ein Muster passt und deren Argumente jede Regel erfüllen. In einem Bundle ist die erste passende Nachricht die genommene.

FeldIn der DateiWasStandard und GrenzenVorlagen
Empfang auf (IP:Port)bindIP:port, auf dem gelauscht wird; 0.0.0.0 für jede Netzwerkkarte127.0.0.1:9001Nein
Adressmusteraddress* beliebige Zeichen, ? eines, [0-9] eine Menge ([!0-9] außerhalb), {ping,pong} eines von beiden; Wildcards bleiben innerhalb eines /-Segments/pong; höchstens 512 ZeichenJa
Argumentregelnargs[{ "index", "op", "value" }, …]: Argument index wird mit value durch op verglichen (Vergleiche); alle müssen geltenkeine; höchstens 16, Index 0–63Werte: ja
Timeout, mstimeout_ms2 000 (auch falls nicht vorhanden); 1–120 000Nein
AntwortvariablevariableWo die Nachricht gespeichert wirdreply (auch falls nicht vorhanden)Nein

Ein Argument wird als Text verglichen: Zahlen wie geschrieben, Zeichenketten ohne Anführungszeichen, true/false, ein Blob als Hex. Eine Regel zu einem Argument, das die Nachricht nicht hat, gilt nicht. Die gespeicherte Nachricht hat address, args ({{reply.args[0]}}), from und ms.

json
{ "id": "status", "type": "wait_osc", "x": 500, "y": 80, "bind": "0.0.0.0:9001", "address": "/status",
  "args": [{ "index": 0, "op": "eq", "value": "ready" }], "timeout_ms": 5000, "variable": "reply" }

Auf UDP warten ​

Wartet auf ein UDP-Datagramm, dessen Nutzdaten passen.

FeldIn der DateiWasStandard und GrenzenVorlagen
Empfang auf (IP:Port)bindIP:port, auf dem gelauscht wird127.0.0.1:9001Nein
NutzdatenmodeSiehe Nutzdaten abgleichencontains (any falls nicht vorhanden)Nein
MusterpatternWas die Nutzdaten enthalten oder worauf sie passen müssenpong; erforderlich außer bei anyJa
Timeout, mstimeout_ms2 000 (auch falls nicht vorhanden); 1–120 000Nein
Antwortvariablevariablereply (auch falls nicht vorhanden)Nein
json
{ "id": "ready", "type": "wait_udp", "x": 500, "y": 80, "bind": "0.0.0.0:9002", "mode": "contains",
  "pattern": "READY", "timeout_ms": 5000, "variable": "reply" }

Auf MQTT warten ​

Wartet auf eine Nachricht, die an ein Topic bei einem Broker veröffentlicht wurde und deren Nutzdaten passen. Der Durchlauf verbindet sich und abonniert vor seinem ersten Schritt. Retained-Nachrichten, die der Broker beim Abonnieren erneut zustellt, werden ignoriert: Nur was nach dem Start des Durchlaufs veröffentlicht wird, zählt.

FeldIn der DateiWasStandard und GrenzenVorlagen
Broker-HosthostDer Broker127.0.0.1Nur Parameter
Portport1883; 1–65 535Nein
Topic-FiltertopicEin Filter: + ist genau eine Ebene, # alles darunter (nur zuletzt)lab/#Nur Parameter
NutzdatenmodeSiehe Nutzdaten abgleichenany (auch falls nicht vorhanden)Nein
Musterpatternleer; erforderlich außer bei anyJa
Timeout, mstimeout_ms2 000 (auch falls nicht vorhanden); 1–120 000Nein
Antwortvariablevariablereply (auch falls nicht vorhanden)Nein
json
{ "id": "state", "type": "wait_mqtt", "x": 500, "y": 80, "host": "{{broker}}", "port": 1883,
  "topic": "lab/+/state", "mode": "contains", "pattern": "on", "timeout_ms": 5000, "variable": "reply" }

Auf HTTP-Anfrage warten ​

Wartet auf eine HTTP-Anfrage — einen Webhook, einen Callback — an den Emulator des Durchlaufs auf dieser Adresse oder, wenn der Durchlauf dort keinen HTTP-Emulator hat, an einen eigenen Empfänger des Durchlaufs, der jede Anfrage mit 204 beantwortet. Die Anfrage muss zur Methode, zum Pfad und zu jeder Bedingung passen.

FeldIn der DateiWasStandard und GrenzenVorlagen
Empfang auf (IP:Port)bindIP:port127.0.0.1:18080 — wo ein neuer Emulator lauschtNein
MethodemethodEine Methode oder Beliebig (ANY); GET nimmt auch HEADANY (auch falls nicht vorhanden)Nein
Pfadpath/hooks/:name benennt ein Segment ({{request.params.name}}); ein abschließendes /* nimmt den Rest/* (auch falls nicht vorhanden); höchstens 512 ZeichenJa
Bedingungenwhen[{ "on", "name", "op", "value" }, …] zu einem header, einem query-Parameter, dem body oder einem json-Pfad; jede muss geltenkeine; höchstens 16Ja, Namen und Werte
Timeout, mstimeout_ms5 000 (2 000 falls nicht vorhanden); 1–120 000Nein
Antwortvariablevariablerequest (auch falls nicht vorhanden)Nein

Die gespeicherte Anfrage hat method, path, query, headers, body, json, params, from und ms: {{request.json.event}}, {{request.headers.x-key}}.

json
{ "id": "hook", "type": "wait_http", "x": 500, "y": 80, "bind": "127.0.0.1:18081", "method": "POST",
  "path": "/hooks/:name", "when": [{ "on": "json", "name": "$.event", "op": "eq", "value": "deploy" }],
  "timeout_ms": 5000, "variable": "request" }

Auf WebSocket warten ​

Wartet auf eine Nachricht auf der Verbindung, die ein WebSocket verbinden geöffnet hat, deren Nutzdaten passen. Nachrichten seit der letzten Aktion des Zweigs zählen — der Connect selbst, ein Senden oder jede andere Anfrage.

FeldIn der DateiWasStandard und GrenzenVorlagen
VerbindungconnectionDie id eines WebSocket verbinden-Knotensder ersteNein
NutzdatenmodeSiehe Nutzdaten abgleichenany (auch falls nicht vorhanden)Nein
Musterpatternleer; erforderlich außer bei anyJa
Timeout, mstimeout_ms2 000 (auch falls nicht vorhanden); 1–120 000Nein
Antwortvariablevariablereply (auch falls nicht vorhanden)Nein

Eine JSON-Nachricht ist Feld für Feld lesbar: {{reply.json.type}}. Der Connect muss auf seinem Pfad vor dem Warten kommen.

json
{ "id": "pong", "type": "wait_ws", "x": 730, "y": 80, "connection": "socket", "mode": "contains",
  "pattern": "pong", "timeout_ms": 3000, "variable": "reply" }

Emulation ​

Emulator ​

Spielt eine Abhängigkeit — eine HTTP-API, ein OSC-, UDP- oder TCP-Gerät, einen MQTT-Broker — für den ganzen Durchlauf. Er öffnet vor dem ersten Schritt und antwortet, bis der Durchlauf endet; im Ablauf besteht der Schritt sofort. Was er empfangen hat, wird Regel für Regel im Bericht des Durchlaufs gezählt.

FeldIn der DateiWasStandard
Bearbeiten…emulatorDer Emulator: name, bind (IP:port), protocol (http, osc, udp, tcp, mqtt), seine Routen oder Regeln und ein optionaler outageEine HTTP-API namens API auf 127.0.0.1:18080, die /health beantwortet

Die Eigenschaften zeigen in einer Zeile, was er spielt. Bearbeiten… öffnet seine Regeln, denselben Editor wie in der Ansicht Emulatoren; In die Bibliothek behält eine Kopie in der Emulator-Bibliothek, und Aus der Bibliothek ersetzt diesen durch eine Kopie von dort. Die Regeln — Routen, Antworten, Fehlverhalten, Ausfälle — sind dort beschrieben.

  • Ein HTTP-Emulator ist auch das, worauf ein Auf HTTP-Anfrage warten an seiner Adresse hört; ein OSC- oder UDP-Emulator teilt seinen Port mit den Warteknoten des Durchlaufs dort.
  • Zwei Emulatoren eines Transports können sich in einem Durchlauf keinen Port teilen.
  • Emulator aus/an schaltet ihn aus und wieder ein.

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "api", "type": "emulator", "x": 270, "y": 80,
  "emulator": { "name": "Orders API", "bind": "127.0.0.1:18080", "protocol": "http",
    "routes": [{ "method": "GET", "path": "/orders/:id", "order": "sequence",
                 "responses": [{ "status": 503 }, { "status": 200, "body": "{\"id\":\"{{request.params.id}}\"}" }] }] } }

Störungen ​

Knoten, die Dinge auf Kommando kaputtmachen. Ein Zweig aus Verzögerung-Knoten und diesen neben dem Verkehr liest sich als Zeitplan; Störungen nach Zeitplan zeigt, wie.

Störung ​

Ein Störungs-Relais für den ganzen Durchlauf: Das getestete System sendet an (oder verbindet sich mit) Empfang auf statt an das echte Ziel; das Relais leitet an Weiterleiten an weiter, und die Antworten kommen denselben Weg zurück, gestört durch das Profil. Es öffnet vor dem ersten Schritt und schließt, wenn der Durchlauf endet, wie auch immer, sodass nichts gestört bleibt; im Ablauf besteht der Schritt sofort. Jede Entscheidung zieht aus dem Startwert des Durchlaufs: Derselbe Startwert und derselbe Verkehr erleiden dasselbe Schicksal.

FeldIn der DateiWasStandard und GrenzenVorlagen
Empfang auflistenIP:port, an das das getestete System sendet127.0.0.1:9010Nur Parameter
Weiterleiten antargetIP:port des echten Ziels oder host:port — ein Hostname wird beim Start des Durchlaufs aufgelöst, und ein Name, der nicht gefunden wird, stoppt den Durchlauf an diesem Knoten127.0.0.1:9000Nur Parameter
ProtokollprotocolUDP (udp): jedes Datagramm erleidet sein eigenes Schicksal; TCP (tcp): jede Verbindung wird mit einer eigenen zum Ziel gekoppelt, und beide Ströme werden gestörtUDP (udp falls nicht vorhanden)Nein
Vorgabe und die Werte darunterprofileWas das Relais dem Verkehr antut — siehe Das ProfilLAN (keine Störung falls nicht vorhanden)Nein

Die Lauschadresse eines Relais kann kein anderer Socket des Durchlaufs sein, und Relais dürfen nicht im Kreis zueinander weiterleiten. Ein per Name gegebenes Ziel wird verfolgt, sobald es aufgelöst ist, sodass ein Kreis über einen Namen den Durchlauf bei seinem Start stoppt. Der Bericht zählt jede Phase eines Relais einzeln.

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "relay", "type": "impairment", "x": 270, "y": 80, "listen": "127.0.0.1:9010", "target": "{{device}}",
  "profile": { "name": "lan", "latency_ms": 1, "jitter_ms": 1 } }

Das Profil ​

Ein Vorgabe-Chip — LAN, Volles WLAN, 4G, Satellit, Instabil, Offline — füllt jeden Wert aus; ändern Sie danach einen beliebigen davon. Ein Relais liest nur die Werte seines Protokolls; in einer Datei darf jeder Schlüssel weggelassen werden (null, aus).

FeldIn der DateiWasGrenzenProtokoll
—nameEine Bezeichnung für die Zeitleiste und den Bericht: der Schlüssel einer Vorgabe (lan, wifi, 4g, satellite, intermittent, offline) oder eine eigenehöchstens 60 Zeichenbeide
Offline — nichts kommt durchofflineNichts kommt durchtrue / falsebeide
Latenzlatency_msVerzögerung, die jedem Paket oder Block eines Stroms hinzugefügt wird0–60 000 (der Schieberegler geht bis 1 000)beide
Jitterjitter_msEine zufällige zusätzliche Verzögerung bis zu so viel; ein TCP-Strom bleibt in der Reihenfolge0–60 000 (der Schieberegler geht bis 500)beide
Bandbreite, kbit/srate_kbpsEine Bandbreitengrenze, 0 für keine. UDP: ab einer Sekunde Warteschlange werden Datagramme als gedrosselt verworfen; TCP: der Sender wird gebremst, nichts wird verworfen0 oder 8–10 000 000beide
PaketverlustlossDie Wahrscheinlichkeit, dass ein Datagramm verworfen wird0–1 (der Schieberegler zeigt %)UDP
Burst-Verlust, Burst-Länge, Datagrammeburst_start, burst_lengthDie Wahrscheinlichkeit, dass ein Verlust-Burst beginnt, und wie viele Datagramme er im Mittel dauert0–1; 1–1 000, wenn Bursts an sindUDP
DuplizierungduplicateDie Wahrscheinlichkeit, dass ein Datagramm zweimal gesendet wird0–1UDP
VerfälschungcorruptDie Wahrscheinlichkeit, dass ein Bit eines Datagramms gekippt wird0–1UDP
UmordnungreorderDie Wahrscheinlichkeit, dass ein Datagramm zurückgehalten wird, sodass spätere es überholen0–1UDP
Verbindungs-ResetresetDie Wahrscheinlichkeit, dass ein Block eines Stroms stattdessen seine Verbindung zurücksetzt — beide Seiten erhalten ein Reset0–1TCP
HalboffenstallDie Wahrscheinlichkeit, dass ein Block seine Verbindung halboffen lässt: nichts geht mehr in beide Richtungen durch, und keiner Seite wird es gesagt0–1TCP

Mehr über Relais, Vorgaben und was sie modellieren auf der Seite Störung.

Störung ändern ​

Schaltet einen der Störung-Knoten des Durchlaufs ab diesem Schritt auf ein anderes Profil um, ohne seinen Port zu verlieren. Die bisherige Phase wird geschlossen und im Bericht gezählt.

FeldIn der DateiWasStandardVorlagen
StörungrelayDie id eines Störung-Knotens dieses Experimentsder ersteNein
Vorgabe und die Werte darunterprofileWomit es von jetzt an stört — siehe Das Profil; das Relais liest die Werte seines eigenen ProtokollsOffline (keine Störung falls nicht vorhanden)Nein

Der Schritt schlägt fehl, wenn das Relais nicht läuft — es konnte etwa nicht weiterleiten. Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "cut", "type": "impairment_change", "x": 730, "y": 200, "relay": "relay",
  "profile": { "name": "offline", "offline": true } }

Emulator aus und an ​

Schaltet einen der Emulatoren des Durchlaufs aus oder wieder ein. Während er aus ist, antwortet ein HTTP-Emulator, wie Im Ausfall sagt; ein TCP-Gerät und ein MQTT-Broker trennen ihre Verbindungen und verweigern neue; OSC- und UDP-Geräte antworten nichts. Wieder an, folgt der Emulator seinem eigenen Ausfallplan, wenn er einen hat.

FeldIn der DateiWasStandard
EmulatoremulatorDie id eines Emulator-Knotens dieses Experimentsder erste
ZustanddownAus (true) oder An (false)aus (false falls nicht vorhanden)
Im AusfallfaultNur HTTP: 503 Unavailable (unavailable), Verbindung schließen (reset: die Verbindung wird ohne Antwort geschlossen) oder Keine Antwort (timeout: die Anfrage wird festgehalten, bis der Client aufgibt, höchstens 120 s)unavailable (auch falls nicht vorhanden)

Ausgänge: Ausgang. Keine Einstellungen. Nichts wird mit Vorlagen gefüllt.

json
{ "id": "down", "type": "emulator_state", "x": 500, "y": 200, "emulator": "api", "down": true, "fault": "unavailable" }

Daten ​

Wert extrahieren ​

Speichert einen Teil der neuesten HTTP-Antwort auf seinem Pfad als Variable für spätere Felder ({{token}}), Prüfungen und Zweige. Eine HTTP-Anfrage muss auf jedem Pfad davor kommen. Ein Klick auf einen Wert in einer Jetzt senden-Antwort fügt einen für Sie hinzu.

FeldIn der DateiWasStandard und GrenzenVorlagen
VariablevariableDer Name: Buchstaben, Ziffern und _, nicht mit einer Ziffer beginnend, kein reserviertes Wort, kein Name eines ParameterstokenNein
Entnehmen ausfromJSON-Feld (json), Header (header), Statuscode (status), Gesamter Body (body) oder Regulärer Ausdruck (regex)jsonNein
JSON-Pfad, Header-Name oder Muster (Gruppe 1, falls vorhanden)exprEin JSON-Pfad ($.data.token, $.items[0], $["first name"]), ein Headername (beliebige Schreibweise) oder ein regulärer Ausdruck — seine erste Gruppe oder der ganze Treffer$.token; nicht verwendet für Status und BodyNein

Der Schritt schlägt fehl, wenn es nichts zu nehmen gibt: Der Body ist kein JSON, der Pfad oder Header fehlt, der Ausdruck passt nicht, oder — bei einem JSON-Feld oder dem ganzen Body — der Body war länger als die behaltenen 256 KiB. Ein Status wird als Zahl gespeichert; der Rest als Text oder als der gefundene JSON-Wert. Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "token", "type": "extract", "x": 500, "y": 80, "variable": "token", "from": "json", "expr": "$.data.token" }

Mehr über Variablen in Daten und Vorlagen.

Prüfungen ​

Eine Prüfung besteht oder lässt den Durchlauf fehlschlagen. Die vier Antwortprüfungen lesen die neueste HTTP-Antwort auf ihrem Pfad, daher muss eine HTTP-Anfrage — keine unter Last — auf jedem Pfad vor ihnen kommen.

HTTP-Status ​

Besteht, wenn der Status der neuesten Antwort genau der angegebene ist.

FeldIn der DateiWasStandard und GrenzenVorlagen
Erwarteter Statusstatus200; 100–599Nein

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "ok", "type": "assert_status", "x": 500, "y": 80, "status": 200 }

Antworttext ​

Besteht, wenn der Body der neuesten Antwort den Text exakt enthält (Schreibweise eingeschlossen). Nur die ersten 256 KiB eines Bodys werden behalten: Text, der in einem abgeschnittenen Body nicht gefunden wird, schlägt mit diesem Grund fehl.

FeldIn der DateiWasStandard und GrenzenVorlagen
Enthält Textcontainsok; erforderlichJa

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "ready", "type": "assert_body", "x": 500, "y": 80, "contains": "ready" }

Antwort-Header ​

Besteht, wenn die neueste Antwort den Header hat und sein Wert den Text enthält. Der Name des Headers wird in beliebiger Schreibweise abgeglichen, der Wert exakt.

FeldIn der DateiWasStandard und GrenzenVorlagen
Header-Namenamecontent-type; erforderlichJa
Enthält TextcontainsWas sein Wert enthalten muss; leer: Der Header muss nur da seinapplication/jsonJa

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "json", "type": "assert_header", "x": 500, "y": 80, "name": "Content-Type", "contains": "json" }

Antwortzeit ​

Besteht, wenn die neueste Antwort höchstens so lange dauerte, vom Senden der Anfrage bis zum Ende ihres Bodys.

FeldIn der DateiWasStandard und GrenzenVorlagen
Höchstdauer, msmax_ms1 000; 1–120 000Nein

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "fast", "type": "assert_latency", "x": 500, "y": 80, "max_ms": 250 }

Wert prüfen ​

Vergleicht einen Wert — meist eine Variable, als Vorlage geschrieben — mit einem erwarteten und besteht, wenn der Vergleich gilt.

FeldIn der DateiWasStandardVorlagen
WertvalueWas verglichen wird: {{token}}, {{reply.args[0]}}{{token}}Ja
BedingungopSiehe Vergleicheist nicht leerNein
ErwartetexpectedNicht von ist leer und ist nicht leer verwendetleer (auch falls nicht vorhanden)Ja

Ausgänge: Ausgang. Keine Einstellungen.

json
{ "id": "state", "type": "assert_value", "x": 730, "y": 80, "value": "{{state}}", "op": "eq", "expected": "ready" }

Vergleiche ​

Wert prüfen, Nach Wert verzweigen, die Abbruchbedingung einer Schleife, OSC-Argumentregeln und HTTP-Bedingungen vergleichen gleich:

OptionIn der DateiGilt, wenn der Wert
gleicheqdem erwarteten entspricht — als Zahlen, wenn beide Zahlen sind (200 = 200.0), sonst als exakter Text
ungleichneihm nicht entspricht, nach derselben Regel
kleiner als, höchstens, größer als, mindestenslt, le, gt, gekleiner, höchstens, größer, mindestens ist — beide müssen Zahlen sein: andernfalls lässt eine Prüfung, ein Zweig oder eine Schleife den Schritt fehlschlagen, und eine Argumentregel oder eine HTTP-Bedingung gilt nicht
enthältcontainsden erwarteten Text enthält
passt auf Regexmatchesauf den erwarteten regulären Ausdruck passt
ist leer, ist nicht leerempty, not_emptyleer ist (Leerzeichen zählen als leer) / nicht

Ablauf ​

Knoten, die entscheiden, wohin der Durchlauf geht. Mehr über Zweige, Joins und Schleifen in Ablauf.

Start ​

Wo der Durchlauf beginnt; jedes Experiment hat genau einen. Er hat keinen Eingang und keine Felder. Die erste Zeile der Zeitleiste gibt den Startwert des Durchlaufs.

Ausgänge: Ausgang, erforderlich. Mehrere Verbindungen von ihm starten auf einmal parallele Zweige.

json
{ "id": "start", "type": "start", "x": 40, "y": 80 }

Ende ​

Wo der Durchlauf vollständig wird; jedes Experiment hat genau ein Ende, und es hat keine Ausgänge. Mehrere Zweige können dorthin führen: Der Durchlauf geht einmal weiter, nachdem der letzte Zweig fertig ist, und nur, wenn keiner fehlschlug. Ein Durchlauf, der Ende nie erreicht, schlägt fehl.

json
{ "id": "end", "type": "end", "x": 960, "y": 80 }

Verzögerung ​

Wartet eine feste Zeit vor dem nächsten Schritt.

FeldIn der DateiWasStandard und GrenzenVorlagen
Verzögerung (ms)ms300; 0–60 000Nein

Ausgänge: Ausgang. Keine Einstellungen. Für längere Wartezeiten setzen Sie mehrere hintereinander oder in eine Schleife.

json
{ "id": "pause", "type": "delay", "x": 500, "y": 80, "ms": 500 }

Statuszweig ​

Wählt Ja, wenn die neueste HTTP-Antwort diesen Status hat, sonst Nein. Eine HTTP-Anfrage muss auf jedem Pfad davor kommen.

FeldIn der DateiWasStandard und GrenzenVorlagen
Erwarteter Statusstatus200; 100–599Nein

Ausgänge: Ja und Nein, beide erforderlich. Keine Einstellungen.

json
{ "id": "branch", "type": "branch_status", "x": 500, "y": 80, "status": 200 }

Zweig auf einen Wert ​

Wählt Ja, wenn ein Vergleich gilt, sonst Nein. Seine Felder und Vergleiche sind die von Wert prüfen; ein Vergleich, der sich nicht anstellen lässt (lt auf Text), lässt den Schritt fehlschlagen.

FeldIn der DateiWasStandardVorlagen
WertvalueWas verglichen wird{{token}}Ja
BedingungopgleichNein
Erwartetexpectedleer (auch falls nicht vorhanden)Ja

Ausgänge: Ja und Nein, beide erforderlich. Keine Einstellungen.

json
{ "id": "ok", "type": "branch_value", "x": 730, "y": 80, "value": "{{reply.args[0]}}", "op": "eq", "expected": "ok" }

Paralleler Zweig ​

Führt, was auf Zweig 1 und Zweig 2 folgt, zur selben Zeit aus, jeder Zweig mit seiner eigenen Kopie der Variablen. Jeder Ausgang darf mehr Verbindungen für mehr Zweige haben. Keine Felder.

Ausgänge: Zweig 1 und Zweig 2, beide erforderlich.

json
{ "id": "split", "type": "fork", "x": 270, "y": 80 }

Zweige zusammenführen ​

Wartet, bis jede in ihn führende Verbindung erreicht wurde, und fährt dann einmal fort, mit den zusammengeführten Variablen der Zweige — wo zwei Zweige dieselbe Variable setzen, gewinnt die, deren Verbindung später in der Datei steht — und der neuesten HTTP-Antwort des letzten von ihnen, der eine hatte. Keine Felder.

Nur Zweige, die alle laufen, treffen sich hier: Ein Zweige zusammenführen hinter einem Statusverzweigung, dessen Ja und Nein nie beide geschehen, fährt nie fort; wenn kein anderer Pfad Ende erreicht, schlägt der Durchlauf an diesem Knoten fehl und sagt, auf wie viele Zweige er noch wartete.

Ausgänge: Ausgang, erforderlich.

Jeder andere Knoten mit mehreren in ihn führenden Verbindungen läuft einmal für jedes Eintreffen.

json
{ "id": "joined", "type": "join", "x": 730, "y": 80 }

Schleife ​

Führt die Schritte an Rumpf — die zurück zu ihr führen — immer wieder aus: höchstens eine Anzahl von Malen und, wenn sie eine Abbruchbedingung hat, bis diese gilt.

FeldIn der DateiWasStandard und GrenzenVorlagen
Max. IterationenmaxHöchstens so viele Iterationen5; 1–1 000Nein
vorzeitig beenden, wennuntilOptionale Abbruchbedingung { "value", "op", "expected" }, wie bei Wert prüfenausWert und erwarteter Wert: ja
  • Der Rumpf läuft immer mindestens einmal. Die Abbruchbedingung wird nach jeder Iteration gelesen, sodass der Rumpf setzen kann, was er prüft.
  • Fertig folgt, wenn die Bedingung gilt — oder, ohne Bedingung, nach der letzten Iteration.
  • Limit folgt, wenn die Iterationen vor der Bedingung ausgingen. Ohne eine Verbindung daran lässt das den Schritt fehlschlagen.
  • Im Rumpf ist {{counter}} die Nummer der Iteration.
  • Ein Rumpf läuft als ein Zweig: Jeder Ausgang in ihm hat eine Verbindung; er enthält kein Start, Ende, Paralleler Zweig, Zweige zusammenführen oder anderes Schleife; er wird nur durch Rumpf betreten; und jede Verbindung in ihm führt im Rumpf weiter oder zurück zur Schleife.

Ausgänge: Rumpf und Fertig (erforderlich), Limit (optional). Keine Einstellungen.

json
{ "id": "poll", "type": "loop", "x": 270, "y": 80, "max": 10,
  "until": { "value": "{{status.args[0]}}", "op": "eq", "expected": "ready" } }