RunOS Dokumentation V3

RUNOS Wiki – Systemberg Design

RUNOS Dokumentation: Workflows, Aktionen und Changelog

Inhalt
RUNOS / WISSENSBASIS

Dokumentation.

Workflows verstehen. Aktionen konfigurieren.
Automatisierung Schritt für Schritt umsetzen.

RUNOS 3.xWindows
01 / EINSTIEG

Ihr erster Workflow ↗

Installation, Grundlagen und ein funktionierendes erstes Beispiel.

02 / REFERENZ

Aktionen im Detail ↗

Übersicht, Parameterstruktur und direkt kopierbare Beispiele.

03 / INTEGRATIONEN

Systeme verbinden ↗

Microsoft 365, Gmail und weitere Dienste über APIs anbinden.

04 / VERSIONEN

Änderungen nachlesen ↗

Veröffentlichte Updates und Vorschauen klar unterscheiden.

Wählen Sie einen Baustein. Bei Aktionen finden Sie Übersicht, Struktur und Beispiele. Vorschauen und geplante Funktionen sind gekennzeichnet.

Grundlagen / Erste Schritte

Erste Schritte

Installation, erster Workflow, Variablen und Fehlerbehandlung.

RUNOS ist ein Werkzeug zur Workflow-Automatisierung für Windows. Ein Workflow besteht aus einem Trigger, der ihn startet, und einer Liste von Aktionen, die nacheinander die Arbeit erledigen. RUNOS läuft lokal auf Ihrem Rechner, im Hintergrund im Infobereich der Taskleiste, und ist kostenlos.

Trigger

Eine neue Datei im Ordner, ein Zeitplan oder ein Klick startet den Workflow. Zu den Triggern

Aktionen

Mails senden (SMTP, Mailprogramm), APIs abfragen und E-Rechnungen erzeugen. Zu den Aktionen

Konnektoren

Zugangsdaten und OAuth-Anmeldungen einmal speichern, in allen Workflows nutzen. Zu den Konnektoren

Ein Beispiel

Jede Rechnung, die das ERP über den PDF-Drucker in den Ordner C:\RUNOS\Rechnungen druckt, soll als XRechnung an den Kunden gemailt werden.

In RUNOS ist das ein Workflow mit

  1. einem File-Trigger, der den Ordner überwacht,
  2. einer XRechnung-Aktion, die aus den Rechnungsdaten die E-Rechnung erzeugt und prüft,
  3. einer Mail-Aktion (SMTP, MAPI oder Microsoft 365), die sie verschickt.

Jeder Lauf wird protokolliert. Schlägt etwas fehl, landet die Datei im Ordner Failed, Sie werden benachrichtigt und können eigene Fehler-Aktionen ausführen lassen.

Installation und Lizenz

Voraussetzungen

  • Windows 10 (Version 1809 oder neuer) oder Windows 11, 64 Bit
  • Einmalig eine Internetverbindung zur Aktivierung, danach regelmäßig zur Verlängerung der kostenlosen Lizenz
  • Für MAPI mit Client: Outlook: das klassische Outlook
  • Für Drucke aus Programmen ohne Export: ein PDF-Drucker, siehe PDFPrinter (PDF24)

Herunterladen und starten

  1. Laden Sie die aktuelle Version von systemberg.de/runos/download herunter. Sie erhalten eine einzelne Datei runos_<Version>.exe.
  2. Legen Sie die Datei an einen festen Ort, zum Beispiel C:\Programme\RUNOS\runos.exe, und starten Sie sie. Eine Installation ist nicht nötig.
  3. Beim ersten Start fragt RUNOS, ob es anonyme Nutzungsstatistiken senden darf. RUNOS funktioniert in beiden Fällen gleich.

RUNOS läuft nur einmal pro Windows-Sitzung. Wird es ein zweites Mal gestartet, beendet sich die ältere Instanz und die neue übernimmt. Wenn Sie das Fenster schließen, läuft RUNOS im Infobereich der Taskleiste weiter, und Ihre Workflows laufen weiter. Beenden im Tray-Menü stoppt alle Workflows.

Lizenz

RUNOS ist kostenlos. Jede Installation erhält trotzdem eine eigene, an diesen PC gebundene Lizenz:

  • Aktivierung: Beim ersten Start mit Internetverbindung aktiviert sich RUNOS selbst. Ohne Internet laufen Workflows für 7 Tage nach dem ersten Start; danach pausieren sie, bis der PC einmal online war.
  • Verlängerung: Die kostenlose Lizenz gilt 30 Tage und wird automatisch verlängert, solange der PC zwischendurch online ist (RUNOS prüft etwa einmal am Tag).
  • Abgelaufen: Ist die Lizenz abgelaufen, pausieren die Workflows. Workflows und Einstellungen bleiben erhalten, und alles läuft weiter, sobald RUNOS die Lizenz erneuert hat. Eine Datei, die ein File-Trigger während einer Pause findet, bleibt im Ordner und wird danach verarbeitet.
  • Systemuhr: Steht die Uhr des PCs deutlich falsch, pausieren Workflows ebenfalls, bis die Uhrzeit korrigiert ist.

Den Status sehen Sie unter Einstellungen → Lizenz, mit der Installations-ID (für den Support) und Jetzt prüfen.

Updates

Bei der täglichen Prüfung erfährt RUNOS auch, ob eine neue Version erschienen ist, und zeigt eine Benachrichtigung mit dem Download-Link. Zum Aktualisieren beenden Sie RUNOS über das Tray-Menü, ersetzen die alte .exe durch die neue (gleicher Name, gleicher Ort) und starten RUNOS wieder. Workflows, Konnektoren und Einstellungen liegen im Datenordner und bleiben erhalten.

Was sich in welcher Version geändert hat, steht unter Änderungen.

Die Oberfläche

Links im RUNOS-Fenster liegt die Aktivitätsleiste:

AnsichtInhalt
WorkflowsListe aller Workflows mit Zustand, Trigger und den letzten Läufen; Vorlagen für neue Workflows
ProtokolleDas Protokoll aller Workflows, filterbar nach Stufe und Workflow
KonnektorenGespeicherte Zugänge zu Diensten und APIs, siehe Konnektoren
PlaygroundEine Aktion für sich ausprobieren und fertig in einen Workflow kopieren. Zur Auswahl: Print mit Druckerliste und Vorschau, SMTP mit Verbindungstest, Mailvorschau und Testmail, XRechnung mit Rechnungsformular und XML
HilfeProblem melden
EinstellungenSprache, Autostart, Protokoll, Skriptblöcke, KoSIT-Validator, Lizenz, siehe Einstellungen

Workflow-Liste: Jede Zeile zeigt Namen und Trigger, die Schaltfläche Starten / Stoppen und die letzten Läufe als Punkte: grün erfolgreich, gelb mit Warnung oder abgebrochen, rot fehlgeschlagen. Ein Klick öffnet den Workflow im Editor; über das Kontextmenü können Sie ihn starten, stoppen oder löschen. Die Reihenfolge ändern Sie per Drag-and-drop.

Workflow-Editor: Er öffnet sich in einem Tab, den Sie auch in ein eigenes Fenster ziehen können.

ElementFunktion
NameKlick auf den Namen zum Umbenennen. Der Name im JSON wird mit angepasst.
Speichern (Strg+S)Prüft das JSON und speichert. Danach gilt der Wert von Autostart.
Ausführen (F5)Führt die Aktionen einmal aus, mit dem JSON im Editor, gespeichert oder nicht.
LauschenSchaltet den Trigger zum Testen ein, solange der Tab offen ist.
JSON-EditorNach {{ schlägt er die Variablen dieses Workflows vor, nach einem Punkt deren Felder.
ProtokollUnter dem Editor, gefiltert auf diesen Workflow. Doppelklick zeigt einen Eintrag vollständig.

Protokoll: Jede Zeile hat Zeit, Stufe (Trace, Debug, Info, Erfolg, Warnung, Fehler, Kritisch), Quelle, Titel und Nachricht. Protokoll in Datei speichern exportiert die sichtbaren Einträge als Text oder CSV. Für die Fehlersuche lohnt sich der Filter Trace: Dann sehen Sie, wie jede Variable aufgelöst wurde und welche Parameter jede Aktion bekam.

Der erste Workflow

In diesem Beispiel überwacht RUNOS einen Ordner. Für jedes PDF, das dort landet, öffnet sich eine neue Mail im Mailprogramm, mit dem PDF als Anhang.

  1. Öffnen Sie links Workflows, klicken Sie auf Neu, geben Sie einen Namen ein, zum Beispiel PDF per Mail, und bestätigen Sie mit Erstellen.
  2. Fügen Sie im Editor dieses JSON ein und speichern Sie:
JSON
{
  "Name": "PDF per Mail",
  "Autostart": false,


  "Trigger": {
    "Type": "File",
    "Name": "Eingang",
    "Parameters": {
      "Pool": "C:\\RUNOS\\Eingang",
      "Filter": "*.pdf",
      "CronExpression": "0/10 * * * * ?"
    }
  },


  "Actions": [
    {
      "Type": "MAPI",
      "Name": "MailOeffnen",
      "Parameters": {
        "Client": "Default",
        "Mode": "Display",
        "To": "kunde@example.com",
        "Subject": "Ihr Dokument vom %DATE%",
        "Body": "Guten Tag,\n\nanbei das Dokument {{FileName}}.",
        "Attachments": "{{FilePath}}"
      }
    }
  ]
}
  1. Klicken Sie auf Lauschen und legen Sie ein PDF in C:\RUNOS\Eingang. Nach spätestens 10 Sekunden öffnet sich die Mail.
  2. Beenden Sie das Lauschen, setzen Sie "Autostart": true und speichern Sie. Ab jetzt läuft der Workflow dauerhaft, auch nach einem Neustart.

Unter der Workflow-Liste finden Sie Vorlagen. Ein Klick legt einen neuen Workflow mit dem Inhalt der Vorlage an; Kommentare (/* … */) im JSON erklären jede Einstellung.

VorlageZeigt
ClassicOutlookMailMail mit Anhang über das klassische Outlook (MAPI)
Outlook365MailMail über Microsoft 365 / Outlook.com mit einem Konnektor
WeatherEmailNotificationHTTP-Abfrage einer Wetter-API, IF-Entscheidung, Mail per SMTP
XRechnungInvoiceEmailXRechnung aus Rechnungsdaten erzeugen, prüfen und mailen
XRechnungInvoiceReferenceAlle Felder einer XRechnung mit Beschreibung, als Nachschlagewerk

Aufbau eines Workflows

Ein Workflow ist ein JSON-Objekt. Groß- und Kleinschreibung der Feldnamen spielt keine Rolle. Kommentare /* … */ und // … sind erlaubt.

JSON
{
  "Name": "Rechnungen versenden",
  "Autostart": true,
  "InitialData": { "Empfaenger": "buchhaltung@example.com" },
  "Trigger": { "Type": "File", "Name": "Eingang", "Parameters": { "Pool": "C:\\RUNOS\\Rechnungen", "Filter": "*.pdf" } },
  "Actions": [
    { "Type": "SMTP", "Name": "Senden", "Parameters": { "To": "{{InitialData.Empfaenger}}" } }
  ],
  "OnError": [
    { "Type": "SMTP", "Name": "Fehlermail", "Parameters": { "Subject": "Fehler: {{Error.Message}}" } }
  ],
  "TimeoutSeconds": 0,
  "OnErrorPolicy": { "Strategy": "CancelRun" },
  "OnWarningPolicy": { "Strategy": "LogOnly" }
}
FeldPflichtBedeutung
NamejaName des Workflows
Autostartneintrue: läuft nach dem Speichern und nach jedem Start von RUNOS. Standard false.
InitialDataneinBeliebige Daten, die alle Aktionen als {{InitialData.…}} lesen, z. B. Adressen oder feste Rechnungsdaten
TriggerjaDer Trigger: File, Time oder Manual
ActionsjaListe der Aktionen, mindestens eine. Sie laufen nacheinander.
OnErrorneinAktionen, die laufen, wenn ein Lauf fehlschlägt, siehe Fehlerbehandlung
TimeoutSecondsneinZeitlimit je Aktion in Sekunden. 0 = kein Limit.
OnErrorPolicy, OnWarningPolicyneinWas bei Fehlern und Warnungen passiert, für alle Aktionen ohne eigene Richtlinie

Trigger und Aktionen haben denselben Aufbau:

FeldBedeutung
TypeArt des Triggers (File, Time, Manual) oder der Aktion (XRechnung, SMTP, MAPI, Outlook365, HttpRequest, If, Loop, StopWorkflow)
NameEindeutiger Name. Über ihn lesen spätere Aktionen das Ergebnis, z. B. {{Senden.Response.Results.Status}}.
ParametersDie Einstellungen; welche es gibt, steht auf der Seite der jeweiligen Aktion. Unbekannte Parameter werden ignoriert.
OnErrorPolicy, OnWarningPolicyNur bei Aktionen: eigene Richtlinie, die die des Workflows ersetzt

Ein # vor dem Typ schaltet eine Aktion vorübergehend ab: { "Type": "#SMTP", … }.

Jede Aktion legt ihr Ergebnis unter ihrem Namen ab, mit diesem Grundaufbau:

JSON
{
  "Name": "Senden",
  "Type": "SMTP",
  "Parameters": { … },
  "Response": { "Results": [ { … } ], "SuccessCount": 1, "ErrorCount": 0 },
  "Meta": { "Host": "PC-BUCHHALTUNG" },
  "Status": { "State": "Completed", "Warnings": [], "Errors": [] }
}

Status.State ist Completed, Failed, Skipped oder Cancelled. Jedes Auslösen startet einen eigenen, unabhängigen Lauf.

Variablen und Platzhalter

In fast jedem Parameter sind Platzhalter erlaubt. RUNOS ersetzt sie unmittelbar bevor die Aktion läuft:

  • %…% für Datum, Uhrzeit, Ordner und Umgebungsvariablen. Sie werden zuerst ersetzt.
  • {{…}} für Daten aus dem Workflow: Ergebnisse von Trigger und Aktionen, InitialData, Konnektoren.

Daten mit {{…}}

Ein Platzhalter ist ein Pfad aus Namen, getrennt durch Punkte, z. B. {{RechnungErstellen.Response.Results.FilePath}}. Groß- und Kleinschreibung spielt keine Rolle.

WurzelInhaltVerfügbar
InitialDataInitialData des Workflows, ergänzt durch Parametersätze und Skriptblöckeimmer
Trigger oder Name des TriggersErgebnis des Triggersimmer
Name einer AktionErgebnis dieser Aktionnach der Aktion
FilePath, FileName, FileContentDatei dieses Laufs und ihr TextFile-Trigger
Errorder Fehler, der den Lauf beendet hatin OnError
item, index, countaktuelles Element, Position (ab 0), Anzahlin einer Loop
connectorgespeicherte Konnektorenimmer
eigene Werteglobale Werte aus einem SkriptblockFile-Trigger
SchreibweiseErgebnis
Results.0 oder Results[0]erstes Element einer Liste (ab 0)
Results.first / .last / .count / .anyerstes / letztes Element, Anzahl, nicht leer
Results.FilePathein Feldname auf einer Liste greift automatisch auf das erste Element zu
.toString(), .toInt(), .toDouble(), .toBool()Wert umwandeln
.toBase64()Base64 des Textes; ist der Wert ein vorhandener Dateipfad, des Dateiinhalts
.length()Länge eines Textes
  • Steht der Platzhalter allein im Parameter, wird der Wert mit seinem Typ übernommen (ein Objekt bleibt ein Objekt).
  • Steht er in einem Text, wird er als Text eingesetzt; Objekte erscheinen als kompaktes JSON. {{!pfad}} liefert immer Text.
  • Ein Platzhalter, der nicht aufgelöst werden kann, wird zu leerem Text, mit einer Warnung im Protokoll.

Datum, Ordner und System mit %…%

PlatzhalterBeispielHinweis
%DATE% / %TIME%2026-10-08 / 14-05-09
%yyyy% / %yy% / %MM% / %dd%2026 / 26 / 10 / 08%MM% = Monat, groß
%HH% / %hh% / %mm% / %ss% / %fff%14 / 02 / 05 / 09 / 123%mm% = Minute, klein
%userdesktop%, %userdocuments%, %userdownloads%Desktop, Dokumente, Downloads
%userprofile%, %userappdata%, %local%Benutzerordner, AppData\Roaming, AppData\Local
%programdata%, %programfiles%, %base%C:\ProgramData, C:\Program Files, Ordner von RUNOS
%username%, %machinename%, %osversion%Benutzer, PC-Name, Windows-Version
%NAME%jede Windows-Umgebungsvariable, z. B. %TEMP%

Beispiel: Export_%yyyy%-%MM%-%dd%_%HH%-%mm%.csv → Export_2026-10-08_14-05.csv. Platzhalter dürfen direkt aneinanderstehen (%HH%%mm%%ss%). Ein unbekanntes %…% bleibt stehen.

Die Parameter Body und Signatur der Mail-Aktionen nehmen auch den Pfad einer Text- oder HTML-Datei; Platzhalter darin werden ebenfalls ersetzt. Platzhalter rechnen nicht; für Entscheidungen gibt es IF.

Fehlerbehandlung

Ein Lauf kann an einer Aktion, am Zeitlimit (TimeoutSeconds) oder schon am Trigger scheitern (Ordner nicht lesbar, fehlerhafter Skriptblock). Dann:

  1. Die Fehlerrichtlinie der Aktion entscheidet: wiederholen, überspringen oder den Lauf beenden.
  2. Wird der Lauf beendet, laufen die folgenden Aktionen nicht mehr.
  3. Die Datei des Laufs wird nach <Pool>\Spooler\Failed\<ID>\ verschoben.
  4. Die OnError-Aktionen laufen, mit dem Fehler in {{Error…}}.
  5. Gibt es keine OnError-Aktionen oder schlägt eine fehl, zeigt RUNOS eine Benachrichtigung (und auf Wunsch ein Fehler-Pop-up).
  6. Der Workflow läuft weiter. Nur CancelWorkflow und die Aktion StopWorkflow halten ihn an.

OnErrorPolicy

JSON
"OnErrorPolicy": { "Strategy": "RetryThenNotify", "MaxRetries": 3, "InitialDelaySeconds": 5, "BackoffStrategy": "exponential" }
StrategyWirkung
CancelRunStandard. Der Lauf endet als fehlgeschlagen, der Workflow läuft weiter.
CancelWorkflowDer Lauf endet und der Workflow wird gestoppt, auch über einen Neustart hinweg.
SkipActionAktion als übersprungen markieren, mit der nächsten weitermachen
Retry / RetryThenNotifyBis zu MaxRetries Wiederholungen, danach wie CancelRun
RetryThenSkipBis zu MaxRetries Wiederholungen, danach wie SkipAction

MaxRetries (Standard 0), InitialDelaySeconds (Standard 1) und BackoffStrategy (exponential: 1×, 2×, 4× … oder linear) steuern die Wiederholungen. Die Richtlinie einer Aktion hat Vorrang vor der des Workflows.

OnWarningPolicy gilt für Aktionen, die mit Warnungen enden: LogOnly (Standard), Retry (mit RetryCount und RetryDelaySeconds) oder SkipAction.

OnError-Aktionen

OnError ist eine zweite Aktionsliste, die nur läuft, wenn ein Lauf fehlschlägt:

JSON
"OnError": [
  {
    "Type": "SMTP",
    "Name": "FehlerMelden",
    "Parameters": {
      "To": "it@example.com",
      "Subject": "RUNOS: {{Error.Workflow}} fehlgeschlagen",
      "Body": "Aktion: {{Error.Action}}\nFehler: {{Error.Message}}\nDatei: {{Error.FileName}}\nZeit: {{Error.Time}}",
      "SmtpServer": "smtp.example.com", "SmtpUser": "runos@example.com",
      "SmtpPassword": "{{connector.Mailserver.Password}}", "From": "runos@example.com"
    }
  }
]
Feld von ErrorInhalt
Message, ErrorsFehlermeldung, alle Meldungen als Liste
SourceAction oder Trigger
Action, ActionTypeName und Typ der fehlgeschlagenen Aktion
Workflow, Machine, InstanceIdWorkflow, PC, Kennung des Laufs
Time / TimeUtcZeitpunkt (lokal / UTC)
FileName, FilePathDatei des Laufs, falls vorhanden

Sind alle OnError-Aktionen erfolgreich, gilt der Fehler als behandelt. OnError-Aktionen nutzen nur ihre eigene OnErrorPolicy; schlägt eine fehl, werden die restlichen übersprungen.

Testen

  • Ausführen (F5) startet die Aktionen genau einmal, als hätte der Trigger ausgelöst, ohne den Trigger einzuschalten. Bei einem File-Trigger gibt es dabei keine Datei; {{FilePath}} bleibt leer.
  • Parametersätze (Pfeil neben Ausführen) sind JSON-Objekte, die über InitialData gelegt werden. So probieren Sie einen Workflow mit verschiedenen Daten aus, ohne das JSON zu ändern. Sie gelten nur für Ausführen.
  • Lauschen schaltet den Trigger im Testmodus ein, solange der Tab offen ist. Läuft derselbe Workflow schon aus der Liste, fragt RUNOS, ob er gestoppt werden soll.
  • Playground in der Aktivitätsleiste probiert eine einzelne Aktion ohne Workflow aus, z. B. Print mit Vorschau und Testdruck, SMTP mit Testmail oder XRechnung.

Im Protokoll sehen Sie je Lauf TriggerFired, ActionCompleted je Aktion, Fehler und Warnungen sowie eine Summary.

Einstellungen

Die Einstellungen öffnen Sie über das Zahnrad unten in der Aktivitätsleiste. Den PDF-Drucker richten Sie in PDF24 ein, siehe PDFPrinter (PDF24).

EinstellungBedeutung
AnzeigespracheSystemstandard, Deutsch, Englisch, Französisch, Italienisch oder Spanisch. Wird nach einem Neustart wirksam (Jetzt neu starten).
Mit Windows startenRUNOS startet bei der Anmeldung minimiert im Infobereich. Beim ersten Start eingeschaltet.
Fehler-Pop-up anzeigenBei einem fehlgeschlagenen Lauf öffnet sich ein Fenster im Vordergrund.
Protokolleinträge aufbewahren fürNur aktuelle Sitzung, 1 Tag oder mehrere Tage (Standard 7)
SkriptblöckeBlockmarkierungen (Standard #RUNOS / #RUNOS) und Markierungen für mehrzeiligen Text (***), siehe Skriptblöcke
E-Rechnungs-PrüfungZustand des KoSIT-Validators (Läuft, Wird gestartet…, Gestoppt, Fehler) mit Starten / Neu starten
LizenzZustand der Lizenz, Installations-ID mit ID kopieren, Jetzt prüfen
Nutzungsstatistik sendenEinmal am Tag Zahlen wie App-Starts, Abstürze, Zahl und Erfolg der Läufe, Aktionstypen mit Fehlern, Versionen. Niemals Workflow-Namen, Dateinamen, Pfade, Inhalte oder Meldungen.

Datenordner

PfadInhalt
C:\ProgramData\RUNOS\Settings.jsonEinstellungen
C:\ProgramData\RUNOS\DB\Workflows, Konnektoren, Protokoll, Verlauf der Läufe, Parametersätze
C:\ProgramData\RUNOS\Repository\Vorlagen und mitgelieferte Dateien
%LOCALAPPDATA%\RUNOS\Arbeitsordner der XRechnung-Aktion, KoSIT-Validator und Prüfberichte

Zum Sichern beenden Sie RUNOS und kopieren C:\ProgramData\RUNOS\DB. Verschlüsselte Geheimnisse von Konnektoren kann nur derselbe Windows-Benutzer auf demselben PC lesen.

Häufige Fragen

Ist RUNOS kostenlos? Ja, RUNOS ist kostenlos.

Laufen Workflows, wenn niemand angemeldet ist? Nein. RUNOS läuft in der Sitzung eines angemeldeten Benutzers. Für einen PC, der unbeaufsichtigt arbeitet, bleibt ein Benutzer angemeldet (gesperrter Bildschirm ist in Ordnung).

Mein Workflow startet nicht, wenn eine Datei ankommt. Läuft der Workflow (die Liste zeigt Stoppen)? Passt die Datei zu Filter? Überwacht ein anderer Workflow denselben Ordner? Steht im Protokoll eine Lizenzmeldung?

Mein Workflow war plötzlich gestoppt. Durch "Strategy": "CancelWorkflow", eine StopWorkflow-Aktion oder durch Speichern mit "Autostart": false. Die Ursache steht im Protokoll.

Ein Platzhalter bleibt leer. Protokoll mit Filter Trace öffnen: Dort steht, wozu jeder Platzhalter aufgelöst wurde. Häufig: Tippfehler im Aktionsnamen, die Aktion lief noch nicht, oder der Wert steckt unter Response.Results.Body.

Funktioniert RUNOS mit dem neuen Outlook? Das neue Outlook lässt sich von keinem Programm steuern. Senden Sie über Microsoft 365; für das klassische Outlook gibt es MAPI.

Werden meine Rechnungen irgendwohin hochgeladen? Nein. Erzeugung und Prüfung der XRechnung laufen vollständig auf Ihrem PC.

Support

Öffnen Sie Hilfe in der Aktivitätsleiste und klicken Sie bei Problem melden auf Melden. Wählen Sie den Typ (Frage, Fehler, Funktionswunsch, Sonstiges), geben Sie E-Mail, Betreff und Beschreibung ein und lassen Sie bei Fehlern Aktuelles Protokoll anhängen eingeschaltet. Hilfreich sind die Version (Einstellungen → Info), die Installations-ID und das Workflow-JSON ohne Passwörter.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Grundlagen / Changelog

Changelog

Veröffentlichte Versionen und Änderungen in Vorbereitung.

Die aktuelle Version steht unter Einstellungen → Info. Neue Versionen gibt es unter systemberg.de/runos/download; RUNOS weist Sie selbst darauf hin.

In Vorbereitung

Nächste Version (in Vorbereitung)

  • Neu: Aktion Print. Eine oder mehrere Dateien (PDF, Bilder, Text) auf dem Standarddrucker oder einem bestimmten Drucker ausgeben, mit Kopien, Duplex, Seitenbereich, Farbe, Ausrichtung, Papierformat, Fach, Auflösung und Rändern (oben, unten, links, rechts in mm). Ein fehlender Drucker, eine fehlende Datei oder ein Druckfehler lässt die Aktion und damit den Lauf fehlschlagen.
  • Neu: Playground in der Aktivitätsleiste. Eine Aktion für sich ausprobieren und fertig in einen Workflow kopieren. Für Print: alle Drucker mit Zustand, die Papierformate, Fächer und Auflösungen des gewählten Druckers, Vorschau jeder Seite, Testdruck und Aktion kopieren.
  • Neu: Aktion FTP. Dateien per SFTP, FTPS oder FTP hochladen, herunterladen, auflisten oder löschen; Anmeldung mit Passwort oder SSH-Schlüssel, Fingerprint legt den Server fest. Jede Übertragung wird über die Größe geprüft, Downloads kommen erst vollständig unter ihrem Namen an, Move löscht die Quelle erst danach. Schlägt eine Datei, die Verbindung oder die Anmeldung fehl, schlägt die Aktion fehl.
  • Playground für FTP: Verbinden mit Anzeige des Fingerprints, Ordner des Servers durchsuchen und als Quelle oder Ziel übernehmen, Prüfungen, echter Lauf mit einer Zeile pro Datei und Aktion kopieren.
  • Playground für SMTP: Anbieter-Vorlagen, Anmeldung über einen Basic-Konnektor, Verbindungstest (SMTP und IMAP), Vorschau der Mail mit den wirklich verwendeten Empfängern und Anhängen, Warnungen, Testmail und Aktion kopieren.
  • Die Spielwiese XRechnung ist jetzt Teil des Playgrounds (Aktion XRechnung) und hat keinen eigenen Eintrag mehr in der Aktivitätsleiste.
  • If: Schlägt eine Aktion in Do oder Else fehl, schlägt jetzt auch das If fehl, statt den Lauf fortzusetzen.
  • Loop: Eine fehlgeschlagene Aktion in Do zählt als Fehler des Durchlaufs und wird für BreakOnErrors gezählt.
  • HttpRequest: Gelingt eine Wiederholung, ist die Aktion erfolgreich (vorher fehlgeschlagen). Parallel mit Urls fragt jetzt wirklich jede Adresse ab.
  • Zeitplan: RepeatCount = n ergibt genau n Läufe (vorher n − 1).
  • Platzhalter: %HH%%mm%%ss% direkt hintereinander funktioniert; NewName mit %filename% wird nicht mehr verdoppelt.
  • Vorlage WeatherEmailNotification korrigiert (Temperatur wurde nicht gelesen, Mailtext war leer).
  • Einstellungen → Dokumentation führt zu dieser Dokumentation. Sie ist neu gegliedert in Trigger, Aktionen, Operationen, Konnektoren und Einstellungen; jede Aktion hat Übersicht, Struktur und Beispiele. Neu ist die Anleitung zum Einrichten von PDF24 als PDF-Drucker.
  • Die Frage nach Nutzungsstatistiken beim ersten Start ist jetzt kurz und einfach.
Veröffentlicht

3.46 — 7. Oktober 2026

  • Neu: Aktion Outlook365. Mails über ein Microsoft-365- oder Outlook.com-Postfach senden, als Entwurf speichern oder in Outlook im Web öffnen. Funktioniert ohne Mailprogramm und mit dem neuen Outlook. Große Anhänge bis 150 MB.
  • Aktion MAPI überarbeitet. Wahl des Mailprogramms (Client: Standardprogramm, klassisches Outlook oder z. B. Thunderbird), Mode Anzeigen / Senden / Entwurf, Absenderkonto, Antwortadresse, Wichtigkeit, Lese- und Übermittlungsbestätigung, Outlook-Signatur, Anhänge per Muster (*.pdf) und MissingAttachments. Ältere Workflows laufen unverändert weiter.
  • Neue Vorlagen ClassicOutlookMail und Outlook365Mail, neue Konnektor-Vorlage Microsoft Outlook Mail.
Veröffentlicht

3.45 — 6. Oktober 2026

  • Skriptblöcke: Listen mit Zeilennummern (BG25.2.BT126=…) und automatische Zeilen für die wiederholbaren Gruppen der XRechnung, sodass ein ERP Rechnungspositionen einfach hintereinander drucken kann.
  • Beim ersten Start fragt RUNOS, ob es anonyme Nutzungsstatistiken senden darf. Änderbar unter Einstellungen → Nutzungsstatistik senden.
Veröffentlicht

3.42 — 3. Oktober 2026

  • Jede Datei des Datei-Auslösers bekommt im Spooler einen eigenen Jobordner. Gleichnamige Dateien kommen sich nicht mehr in die Quere; fehlgeschlagene Dateien liegen in Spooler\Failed\<ID>\.
  • RUNOS läuft nur noch einmal pro Windows-Sitzung; ein neuer Start übernimmt von der älteren Instanz.
  • Ein Ordner kann nur noch von einem laufenden Workflow überwacht werden.
Veröffentlicht

3.41 — 30. September 2026

  • Skriptblöcke verwenden die Markierung #RUNOS.
  • Bessere Fehlermeldungen bei Dateien, die nicht gelesen werden können.
Veröffentlicht

3.40 — 29. September 2026

  • Neu: Aktion StopWorkflow und Aktionsliste OnError für die eigene Fehlerbehandlung.
  • Kurzform für Skriptblöcke (Pfad=Wert), eigene Markierungen in den Einstellungen und je Datei-Auslöser, mehrzeilige Werte und Textmarkierungen ***.
Veröffentlicht

3.39 — 28. September 2026

  • XRechnung: Parameter SaveToFolder. Ohne ihn liegt die XML nur so lange in einem Arbeitsordner, wie die folgenden Aktionen sie brauchen.
  • Parameter aus Skriptblöcken werden tief zusammengeführt: Ein Block kann einzelne Felder einer Rechnung ändern, ohne die übrigen zu verlieren.
Veröffentlicht

3.37 — 25. September 2026

  • Offizieller KoSIT-Validator prüft jede XRechnung; Java ist enthalten. Zustand unter Einstellungen → E-Rechnungs-Prüfung.
  • Die Workflow-Liste zeigt die letzten Läufe als farbige Punkte.
  • Benachrichtigung bei fehlgeschlagenen Läufen und gestoppten Workflows; Fehler des Auslösers zählen als fehlgeschlagener Lauf.
Veröffentlicht

3.36 — 23. September 2026

  • Vorschläge im Workflow-Editor: Nach {{ bietet der Editor die Variablen des Workflows an.
  • Einstellung Fehler-Pop-up anzeigen.
Veröffentlicht

3.35 — 22. September 2026

  • Skriptblöcke können Aktionen mitbringen, die der Workflow nicht hat.
  • Umgebrochene Zeilen in Skriptblöcken aus PDFs werden repariert; fehlende Markierungen werden erkannt und gemeldet.
  • XRechnung 3.0.2 mit eingebauter Regelprüfung, Spielwiese XRechnung und Workflow-Editor mit Tabs.
RUNOS Dokumentation · SystembergZur Übersicht ↑
Trigger / File

File

Dateien erkennen und automatisch verarbeiten.

Übersicht

Der File-Trigger überwacht einen Ordner, den Pool. Jede Datei, die dort ankommt und zum Filter passt, startet einen Lauf. Typische Quellen sind ein ERP, das Belege als PDF ablegt, ein Scanner oder ein PDF-Drucker wie PDF24.

Bevor der Lauf startet, liest der Trigger den Text der Datei. Enthält er Skriptblöcke (#RUNOS … #RUNOS), übernimmt RUNOS daraus Werte für diesen Lauf, zum Beispiel Rechnungsnummer und Empfänger aus dem ERP-Druck.

Ablauf je Datei:

  1. Bei jeder Prüfung (CronExpression) listet der Trigger die passenden Dateien im Pool auf.
  2. Er wartet kurz, bis eine Datei vollständig geschrieben und nicht leer ist. Ist sie nach etwa zwei Sekunden noch leer oder gesperrt, kommt sie bei der nächsten Prüfung dran.
  3. Die Datei wird in einen eigenen Jobordner verschoben: <Pool>\Spooler\<ID>\<Dateiname>. Damit gehört sie diesem Lauf, und keine Datei wird zweimal verarbeitet.
  4. Falls NewName gesetzt ist, wird sie umbenannt.
  5. Bei GetFileContent liest RUNOS den Text und wertet die Skriptblöcke aus.
  6. Der Lauf startet.
Ergebnis des LaufsWas mit der Datei passiert
erfolgreich, DeleteAfter: falsebleibt im Jobordner im Spooler (Archiv)
erfolgreich, DeleteAfter: truewird gelöscht, samt Jobordner
fehlgeschlagenwird nach <Pool>\Spooler\Failed\<ID>\ verschoben. Nach dem Beheben der Ursache legen Sie sie wieder in den Pool.

Hat eine Aktion die Datei schon woanders hin verschoben, bleibt sie dort. Ein Pool-Ordner kann nur von einem laufenden Workflow überwacht werden; ein zweiter Workflow mit demselben Ordner startet nicht, und RUNOS nennt den Workflow, der ihn belegt.

Struktur

JSON
"Trigger": {
  "Type": "File",
  "Name": "Eingang",
  "Parameters": {
    "Pool": "C:\\RUNOS\\Rechnungen",
    "Filter": "*.pdf",
    "CronExpression": "0/15 * * * * ?",
    "ProcessMode": "Single",
    "ConcurrentJobs": 5,
    "DeleteAfter": false,
    "GetFileContent": true
  }
}
ParameterStandardBedeutung
Pool–Der überwachte Ordner. Wird angelegt, falls er fehlt. Platzhalter wie %userdocuments% sind erlaubt.
Filter*.*Dateimuster, z. B. *.pdf oder RE_*.txt
CronExpression0/15 * * * * ?Wie oft der Ordner geprüft wird, siehe Cron-Ausdrücke. Standard: alle 15 Sekunden.
ProcessModeSingleSingle: ein Lauf je Datei. Multi: ein Lauf für alle Dateien einer Prüfung.
ConcurrentJobs5Im Modus Single: wie viele Dateien gleichzeitig verarbeitet werden
DeleteAfterfalsetrue: Die Datei wird nach einem erfolgreichen Lauf gelöscht.
NewName–Neuer Dateiname im Spooler, z. B. Rechnung_%yyyy%-%MM%-%dd%. Ohne Endung bleibt die alte Endung.
RepeatCount0Nach so vielen Prüfungen stoppt der Trigger. 0 = unbegrenzt.
GetFileContenttrueText der Datei lesen und als {{FileContent}} bereitstellen. Nötig für Skriptblöcke.
RemoveScriptfalseSkriptblöcke nach dem Lesen aus der Datei entfernen. Nur bei TXT, JSON und XML.
ScriptStart, ScriptEndaus den EinstellungenEigene Markierungen für Skriptblöcke dieses Triggers

Single ist fast immer die richtige Wahl: Jede Datei hat ihren eigenen Lauf mit eigenen Daten. Bei Multi enthält {{Trigger.Response.Results}} alle Dateien einer Prüfung, und {{FilePath}} zeigt auf die zuletzt gelesene.

Gelesener Text

DateitypWie
.txt, .json, .xmlals Text
.pdfText aller Seiten wird extrahiert. Gescannte PDFs ohne Textebene liefern keinen Text.
anderekein Text; der Workflow läuft trotzdem, ohne FileContent und Skriptblöcke

Verfügbare Werte

PlatzhalterInhalt
{{FilePath}}voller Pfad der Datei im Spooler
{{FileName}}Dateiname (nach NewName)
{{FileContent}}gelesener Text, bei PDF der extrahierte Text
{{Trigger.Response.Results}}Bericht je Datei, siehe unten
{{Trigger.Meta.SpoolerFolder}}Pfad des Spooler-Ordners
JSON
{
  "FilePath": "C:\\RUNOS\\Rechnungen\\Spooler\\3f2a…\\RE-2026-0001.pdf",
  "FileName": "RE-2026-0001.pdf",
  "OriginalName": "RE-2026-0001.pdf",
  "FileSize": 48211,
  "Content": { "Loaded": true, "Chars": 1834, "Preview": "Rechnung Nr. …" },
  "Scripts": { "Found": 1, "Parsed": 1, "Ignored": 0, "Invalid": 0 }
}

Skriptblöcke

Ein Skriptblock ist ein kurzer Text in der Datei, der diesen einen Lauf ändert: Er setzt Werte in InitialData, ändert Parameter von Aktionen oder fügt Aktionen hinzu. Das gespeicherte Workflow-JSON bleibt unverändert. So kann ein ERP, das nur drucken oder Textdateien schreiben kann, RUNOS sagen, an wen eine Rechnung geht und welche Daten in die XRechnung gehören.

TEXT
#RUNOS InitialData.Invoice.BT1=RE-2026-0001 #RUNOS
#RUNOS SendMail.To=buchhaltung@kunde.de #RUNOS

Ein Block steht zwischen Start- und Endmarkierung, standardmäßig beide #RUNOS (änderbar unter Einstellungen → Skriptblöcke oder mit ScriptStart / ScriptEnd). Beginnt der Inhalt mit { und endet mit }, ist er JSON; beginnt er mit Pfad=, ist er die Kurzform; alles andere wird ignoriert.

Kurzform

Jeder Block enthält genau eine Anweisung Pfad=Wert. Der erste Teil des Pfads entscheidet das Ziel:

Pfad beginnt mitZielBeispiel
InitialData.ein Wert in InitialData dieses LaufsInitialData.Invoice.BT1=4711
Name einer Aktionein Parameter dieser Aktion (.Parameters darf fehlen)SendMail.To=a@b.de
newAction.eine neue Aktion, siehe untennewAction.Notify=SMTP
alles andereein globaler Wert, lesbar als {{Name}}Kunde=ACME → {{Kunde}}
  • Der Wert reicht vom ersten = bis zur Endmarkierung, auch über mehrere Zeilen (z. B. ein Mailtext).
  • Werte sind Text (Menge=5 → "5"). Als JSON geschriebene Werte werden als JSON gelesen: Tags=["a","b"] ist eine Liste.
  • "…" behält führende und folgende Leerzeichen. Text zwischen den Textmarkierungen (Standard ***) wird genau so übernommen.
  • {{…}}-Platzhalter bleiben Text und werden später beim Ausführen der Aktion aufgelöst.

JSON-Form

TEXT
#RUNOS {"InitialData":{"Invoice":{"BT1":"RE-2026-0001","BT2":"2026-10-08"}}} #RUNOS
SchlüsselWirkung
InitialDatawird über die InitialData des Laufs gelegt
ActionsParameter für Aktionen, {"SendMail":{"To":"a@b.de"}}, oder Aktionsblöcke {"Name":…, "Type":…, "Parameters":{…}}
alles andereglobale Werte

Schreibt ein Programm einen langen JSON-Block in ein PDF und bricht dabei die Zeile mitten in einem Wert um, fügt RUNOS den Wert wieder zusammen.

Zusammenführen, Listen und Zeilen

  • Ein vorhandener Schlüssel bekommt den neuen Wert, ein neuer wird hinzugefügt, alles andere bleibt. Objekte werden Schlüssel für Schlüssel zusammengeführt, Listen werden komplett ersetzt.
  • Mehrere Blöcke werden in ihrer Reihenfolge angewendet; der spätere gewinnt.
  • Ein Zahlensegment im Pfad ist eine Zeile einer Liste, gezählt ab 1: InitialData.Positionen.2.Artikel=Mutter. Es darf keine Nummer fehlen.
  • Für die wiederholbaren Gruppen der XRechnung (BG-25 Positionen, BG-23, BG-17 …) geht es ohne Nummern: Ein Feld, das die aktuelle Zeile schon hat, beginnt die nächste. Siehe XRechnung-Beispiel.

Neue Aktionen

TEXT
#RUNOS newAction.Hinweis=SMTP #RUNOS
#RUNOS Hinweis.To=chef@example.de #RUNOS
#RUNOS Hinweis.Subject=Neue Datei {{FileName}} #RUNOS

Fehlerhafte Blöcke

Ein Block, der nicht gelesen werden kann (ungültiges JSON, Pfad=Wert nicht erkennbar, fehlende Zeilennummer, unbekannter Aktionstyp …), lehnt die Datei ab: Sie landet im Failed-Ordner, und Sie erhalten eine Meldung mit der Nummer des Blocks und dem Grund. Dasselbe gilt für eine Datei, die erkennbar Skriptdaten enthält, aber keine Markierungen. Was RUNOS gelesen hat, steht im Protokoll unter ScriptShorthandParsed bzw. ScriptJsonParsed.

Beispiel

Jedes PDF, das im Ordner C:\RUNOS\Eingang landet, wird nach einem erfolgreichen Lauf gelöscht. Das Programm, das die PDFs erzeugt, schreibt den Empfänger als Skriptblock hinein:

TEXT
#RUNOS Senden.To=kunde@example.com #RUNOS
JSON
{
  "Name": "Eingang mailen",
  "Autostart": true,
  "Trigger": {
    "Type": "File",
    "Name": "Eingang",
    "Parameters": {
      "Pool": "C:\\RUNOS\\Eingang",
      "Filter": "*.pdf",
      "CronExpression": "0/10 * * * * ?",
      "NewName": "Dokument_%yyyy%-%MM%-%dd%_%HH%%mm%%ss%",
      "DeleteAfter": true
    }
  },
  "Actions": [
    {
      "Type": "MAPI",
      "Name": "Senden",
      "Parameters": {
        "Client": "Outlook",
        "Mode": "Display",
        "To": "",
        "Subject": "Ihr Dokument {{FileName}}",
        "Attachments": "{{FilePath}}"
      }
    }
  ]
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Trigger / Time

Time

Workflows zu festen Zeiten oder in Intervallen starten.

Übersicht

Der Time-Trigger startet einen Lauf zu festen Zeiten, zum Beispiel jeden Werktag um 7 Uhr oder alle fünf Minuten. Der Lauf bekommt vom Trigger nur den Zeitpunkt ({{Trigger.Response.Results.TriggeredAt}}); alle weiteren Daten kommen aus InitialData oder von den Aktionen, zum Beispiel einer HTTP-Abfrage.

  • Die Zeiten gelten in der Zeitzone des PCs.
  • Ein Zeitplan feuert nur, solange RUNOS läuft. Termine, in denen RUNOS beendet war, werden nicht nachgeholt.
  • Dauert ein Lauf länger als der Abstand bis zum nächsten Termin, startet der nächste trotzdem pünktlich. Läufe können sich überschneiden.

Struktur

JSON
"Trigger": {
  "Type": "Time",
  "Name": "Werktags7Uhr",
  "Parameters": {
    "CronExpression": "0 0 7 ? * MON-FRI",
    "RepeatCount": 0
  }
}
ParameterStandardBedeutung
CronExpression0/30 * * * * ?Wann ausgelöst wird. Standard: alle 30 Sekunden.
RepeatCount0Nach so vielen Läufen stoppt der Zeitplan. 0 = unbegrenzt.

Cron-Ausdrücke

RUNOS verwendet Cron-Ausdrücke im Quartz-Format mit Sekunden am Anfang, 6 oder 7 Felder:

TEXT
Sekunde  Minute  Stunde  Tag-im-Monat  Monat  Wochentag  [Jahr]
ZeichenBedeutungBeispiel
*jeder Wert* im Feld Stunde = jede Stunde
?kein bestimmter Wert; genau eines der Felder Tag-im-Monat und Wochentag muss ? sein? * MON
a/bab a alle b0/15 in Sekunden = alle 15 s
a-bBereichMON-FRI, 8-17
a,bListeMON,WED,FRI
Lletzter Tag des MonatsL im Feld Tag-im-Monat

Wochentage: SUN MON TUE WED THU FRI SAT (oder 1–7, Sonntag = 1). Monate: JAN–DEC oder 1–12. Dieselben Ausdrücke verwendet der File-Trigger, um festzulegen, wie oft er seinen Ordner prüft.

Beispiel

AusdruckWann
0/30 * * * * ?alle 30 Sekunden
0 0/5 * * * ?alle 5 Minuten
0 0 * * * ?zu jeder vollen Stunde
0 0 7 * * ?täglich um 7:00
0 0 7 ? * MON-FRIwerktags um 7:00
0 30 17 ? * FRIfreitags um 17:30
0 0 8-17 ? * MON-FRIwerktags stündlich von 8 bis 17 Uhr
0 0 6 1 * ?am 1. jedes Monats um 6:00
0 0 22 L * ?am letzten Tag jedes Monats um 22:00

Werktags um 7:00 eine Liste offener Aufträge abrufen und per Mail melden, wenn es welche gibt:

JSON
{
  "Name": "Offene Aufträge",
  "Autostart": true,
  "Trigger": { "Type": "Time", "Name": "Morgens", "Parameters": { "CronExpression": "0 0 7 ? * MON-FRI" } },
  "Actions": [
    {
      "Type": "HttpRequest",
      "Name": "Abfrage",
      "Parameters": {
        "Url": "{{connector.Shop.BaseUrl}}/orders?status=open",
        "AuthType": "Bearer",
        "AuthToken": "{{connector.Shop.ApiKey}}"
      }
    },
    {
      "Type": "If",
      "Name": "GibtEsWelche",
      "Parameters": {
        "Condition": "{{Abfrage.Response.Results.Body.items.count}} > 0",
        "Do": [
          { "Type": "SMTP", "Name": "Melden", "Parameters": { "To": "vertrieb@example.com", "Subject": "Offene Aufträge: {{Abfrage.Response.Results.Body.items.count}}", "Body": "…" } }
        ]
      }
    }
  ]
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Trigger / Manuell

Manuell

Einen Workflow gezielt per Klick ausführen.

Übersicht

Ein Workflow mit manuellem Trigger läuft, wenn Sie ihn starten: im Editor mit Ausführen (F5) oder in der Workflow-Liste mit Starten. Er eignet sich für Aufgaben, die jemand bei Bedarf anstößt, und zum Ausprobieren neuer Aktionen. Alle Vorlagen beginnen deshalb mit einem manuellen Trigger.

  • Starten in der Workflow-Liste löst einen Lauf mit der InitialData des Workflows aus. Der Workflow wird danach weiter als aktiv angezeigt, bis Sie ihn stoppen.
  • Mit "Autostart": true läuft ein manueller Workflow bei jedem Start von RUNOS einmal.
  • Ausführen im Editor kann einen Parametersatz verwenden. So starten Sie denselben Workflow mit unterschiedlichen Daten.

Das Ergebnis des Triggers enthält nur den Zeitpunkt ({{Trigger.Response.Results.TriggeredAt}}).

Struktur

JSON
"Trigger": {
  "Type": "Manual",
  "Name": "ManualStart",
  "Parameters": {
    "AllowOnlyOnce": true
  }
}
ParameterStandardBedeutung
AllowOnlyOncetruetrue: löst nur beim ersten Starten aus. Ein erneutes Starten über die Liste löst erst wieder aus, nachdem der Workflow gespeichert oder RUNOS neu gestartet wurde. false: Jedes Starten löst einen Lauf aus (stoppen und wieder starten).

Beispiel

Ein Rundschreiben an alle Kunden aus einer CSV-Datei, das jemand bei Bedarf startet:

JSON
{
  "Name": "Rundschreiben",
  "Autostart": false,
  "InitialData": { "Betreff": "Neue Öffnungszeiten" },
  "Trigger": { "Type": "Manual", "Name": "Start", "Parameters": { "AllowOnlyOnce": false } },
  "Actions": [
    {
      "Type": "Loop",
      "Name": "JedenKunden",
      "Parameters": {
        "Items": "C:\\RUNOS\\Daten\\kunden.csv",
        "DelayMs": 1000,
        "Do": [
          { "Type": "SMTP", "Name": "Anschreiben", "Parameters": { "To": "{{item.Email}}", "Subject": "{{InitialData.Betreff}}", "Body": "…" } }
        ]
      }
    }
  ]
}

Zum Testen mit einem anderen Betreff legen Sie über den Pfeil neben Ausführen einen Parametersatz an, zum Beispiel { "Betreff": "TEST" }.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Trigger / Webhook

Webhook

Geplant

Workflows künftig über einen HTTP-Aufruf starten.

Übersicht

Mit einem Webhook soll ein anderes Programm einen Workflow über einen HTTP-Aufruf starten und dabei Daten mitgeben können.

Bis dahin starten Sie Workflows mit einem File-Trigger: Das andere Programm legt eine Datei (zum Beispiel JSON mit einem Skriptblock) in den überwachten Ordner.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / XRechnung

XRechnung

XRechnung und ZUGFeRD erzeugen, prüfen und weitergeben.

Übersicht

Die Aktion XRechnung erzeugt aus Rechnungsdaten eine E-Rechnung im Format XRechnung 3.0.2 (UN/CEFACT CII), prüft sie mit dem offiziellen KoSIT-Validator und bettet sie auf Wunsch als ZUGFeRD / Factur-X in ein PDF/A-3 ein. Alles läuft lokal auf Ihrem PC; die Rechnung wird an niemanden gesendet.

TEXT
Rechnungsdaten (JSON) ──▶ Prüfung der Daten ──▶ XML (CII) ──▶ KoSIT-Validator ──▶ ZUGFeRD-PDF (optional)
                                                                       │
                                               nur geprüfte Rechnungen gehen an die nächste Aktion (Mail, Ablage …)
  • Wie die Daten aussehen und alle Parameter: Struktur
  • Vom ERP-Druck zur versendeten XRechnung, Schritt für Schritt: Beispiel

Woher die Rechnungsdaten kommen

Die Rechnung ist ein JSON-Objekt mit den Kennungen der EN 16931 (BT1 Rechnungsnummer, BG4 Verkäufer, BG25 Positionen …). Meist steht der feste Teil (Verkäufer, Bankverbindung) einmal im Workflow, und der veränderliche Teil (Nummer, Käufer, Positionen) kommt per Skriptblock aus der gedruckten Rechnung, aus einer JSON-Datei oder von einer HTTP-Abfrage.

Sie müssen Ihr ERP nicht umbauen: Es genügt, dass die gedruckte Rechnung die Rechnungsdaten als Skriptblöcke enthält. Wie das ERP in einen Ordner druckt, steht unter PDFPrinter (PDF24).

Prüfung

Bevor eine XRechnung RUNOS verlässt, wird sie zweimal geprüft:

  1. Prüfung der Rechnungsdaten (ValidateRequiredFields, Standard an) vor dem Schreiben der XML, nach der Spezifikation XRechnung 3.0.2: Pflichtfelder und -gruppen, Formate (Datum, Zahlen, höchstens zwei Nachkommastellen), Codelisten (Länder, Währungen, Einheiten, Steuerkategorien …), CustomizationID (BR-DE-21), Dokumentregeln (USt-IdNr., IBAN, Zahlungsart, Kontakt des Verkäufers), Zu- und Abschläge, Positionen (Menge × Preis), Umsatzsteuer-Aufschlüsselung und alle Summen (BR-CO-10 bis BR-CO-16). Fehler nennen Feld und Regel, z. B. BT-10 Buyer reference (BT10) is required.
  2. KoSIT-Validator (ValidateWithKosit, Standard an): dieselbe Prüfung, die die Rechnungseingangsplattformen von Bund und Ländern durchführen (XML-Schema, Schematron der EN 16931 und der XRechnung).

Der Validator samt Java-Laufzeit ist in RUNOS enthalten und wird beim ersten Mal nach %LOCALAPPDATA%\RUNOS\KositValidator\ entpackt. Er startet mit RUNOS im Hintergrund; das Laden der Regeln dauert etwa 15–20 Sekunden, danach dauert eine Prüfung deutlich unter einer Sekunde. Den Zustand sehen Sie unter Einstellungen → E-Rechnungs-Prüfung.

XRechnung oder ZUGFeRD?

FormatWas es istFür wen
XRechnung (XML)reine Daten-Datei nach XRechnung 3.0.2öffentliche Auftraggeber (mit Leitweg-ID in BT10) und alle, die strukturierte Rechnungen verlangen
ZUGFeRD / Factur-X (PDF)lesbares PDF mit eingebetteter XMLGeschäftskunden, die ein PDF ansehen und die Daten trotzdem maschinell verarbeiten möchten

RUNOS erzeugt ZUGFeRD in den Profilen XRECHNUNG und EN 16931. Beide enthalten die vollständige Rechnung. MINIMUM, BASIC WL, BASIC und EXTENDED bietet RUNOS bewusst nicht an.

Die Spielwiese XRechnung

Unter Playground in der Aktivitätsleiste (Aktion XRechnung) liegt eine Spielwiese für E-Rechnungen: Sie füllen ein Formular aus und sehen sofort das Rechnungs-JSON und die erzeugte XML.

ElementFunktion
Formularalle Felder der XRechnung 3.0.2 nach Gruppen. Pflichtfelder mit *, die Beschreibung aus dem Standard beim Überfahren der Beschriftung. Wiederholbare Gruppen mit … hinzufügen.
Beispiel laden / Leerengültige Beispielrechnung laden / alles leeren
Summen berechnenPositionsbeträge (BT-131), Umsatzsteuer-Aufschlüsselung (BG-23) und Summen (BG-22)
JSONdas Rechnungs-JSON zum Kopieren in einen Workflow; JSON übernehmen lädt ein eingefügtes JSON ins Formular
XML / Prüfungdie erzeugte XRechnung und dieselbe Datenprüfung wie in der Aktion
Speichernspeichert die XML, sobald alle Pflichtfelder gefüllt sind

Nutzen Sie sie, um mit dem ERP-Anbieter die nötigen Felder festzulegen, den festen Teil der Rechnung vorzubereiten oder eine abgelehnte Rechnung Feld für Feld zu korrigieren. Den KoSIT-Validator führt erst die Aktion aus.

Struktur

Die Aktion

JSON
{
  "Type": "XRechnung",
  "Name": "XR",
  "Parameters": {
    "ContextKey": "Invoice",
    "AutoCalculateTotals": true,
    "ValidateWithKosit": true,
    "EnableZugferd": true,
    "PdfSourcePath": "{{FilePath}}"
  }
}

Quelle der Rechnungsdaten

Die Aktion nimmt die erste vorhandene dieser Quellen. In allen Fällen werden {{…}}-Platzhalter in der Rechnung ersetzt.

ReihenfolgeParameterQuelle
1Invoicedie Rechnung direkt als Objekt, oft ergänzt per Skriptblock aus der Datei
2InvoiceJsonFilePfad einer JSON-Datei
3InvoiceJsondie Rechnung als JSON-Text
4ContextKeyein Schlüssel unter InitialData (Standard Invoice), oder ein Pfad mit Punkten wie Abfrage.Response.Results.Body

Eingabe und Prüfung

ParameterStandardBedeutung
AutoCalculateTotalsfalsePositionsbeträge (BT-131), Umsatzsteuer-Aufschlüsselung (BG-23) und Summen (BG-22) aus den Positionen berechnen
ValidateRequiredFieldstrueRechnungsdaten vor dem Erzeugen prüfen; Fehler lassen die Aktion fehlschlagen
ValidateWithKosittrueDie fertige XML mit dem KoSIT-Validator prüfen
FailOnKositRejecttrueEine abgelehnte Rechnung lässt die Aktion fehlschlagen. false: nur Warnung.
KeepKositReportfalsePrüfbericht (XML + HTML) aufbewahren
KositReportFolder%LOCALAPPDATA%\RUNOS\KositValidator\ReportsOrdner für aufbewahrte Prüfberichte

Ausgabe

ParameterStandardBedeutung
SaveToFolderfalsefalse: Die XML liegt nur in einem temporären Arbeitsordner (nach einem Tag gelöscht), lange genug für die folgenden Aktionen. true: Sie wird in OutputFolder gespeichert.
OutputFolder.Zielordner bei SaveToFolder: true. Eine gleichnamige Datei wird ersetzt.
FileNamePatternXRechnung_{BT1}_{now:yyyyMMddHHmmss}.xml{BT1} = Rechnungsnummer, {BT2} = Rechnungsdatum (yyyyMMdd), {now:Format} = aktuelle Zeit; {{…}} ist ebenfalls erlaubt
PrettyPrinttrueXML mit Einrückung schreiben
AttachFiles–Liste von Dateipfaden, die als rechnungsbegründende Unterlagen (BG-24) eingebettet werden

ZUGFeRD

ParameterStandardBedeutung
EnableZugferdfalseZusätzlich ein ZUGFeRD-PDF erzeugen
PdfSourcePath–Das vorhandene Rechnungs-PDF, in das die XML eingebettet wird, z. B. {{FilePath}}. Schriften müssen eingebettet sein.
ZugferdConformanceLevelaus CustomizationIDXRECHNUNG oder EN 16931

Das Ergebnis heißt <Name des PDFs>_ZUGFeRD.pdf (PDF/A-3B, XML als factur-x.xml eingebettet) und liegt neben der XML. Gelingt das Einbetten nicht, gibt es eine Warnung; die XML ist trotzdem gültig.

Kennungen

ParameterStandardBedeutung
CustomizationIDurn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0XRechnung 3.0. Erlaubt sind außerdem die Extension-Kennung und urn:cen.eu:en16931:2017 (EN 16931).
ProfileIDurn:fdc:peppol.eu:2017:poacc:billing:01:1.0Geschäftsprozess (BT-23)

Das Rechnungs-JSON

Die Schlüssel sind die Kennungen der EN 16931: BT (Business Term) für ein Feld, BG (Business Group) für eine Gruppe.

  • Kennungen ohne Bindestrich: BT-1 → "BT1", BG-4 → "BG4".
  • Zusatzangaben mit Suffix: "BT34-1": "EM" ist das Schema der elektronischen Adresse des Verkäufers (EM = E-Mail), ebenso BT49-1, BT125-1/BT125-2, BT157-1.
  • Wiederholbare Gruppen (Positionen BG25, Umsatzsteuer BG23, Bankverbindungen BG17 …) sind Listen; ein einzelnes Objekt wird ebenfalls akzeptiert.
  • Datum als JJJJ-MM-TT (auch JJJJMMTT und TT.MM.JJJJ). Beträge mit Punkt: "119.00", ohne Tausendertrennzeichen.
  • BG2 (Prozesssteuerung) schreibt die Aktion selbst aus CustomizationID und ProfileID.
KennungFeld
BT1 / BT2 / BT3Rechnungsnummer / Rechnungsdatum / Rechnungsart (380 Rechnung, 381 Gutschrift)
BT5 / BT9Währung (EUR) / Fälligkeitsdatum
BT10Käuferreferenz, bei öffentlichen Auftraggebern die Leitweg-ID
BT20Zahlungsbedingungen als Text
BG4Verkäufer: BT27 Name, BT31 USt-IdNr. (oder BT32 Steuernummer), BT34 + BT34-1 elektronische Adresse
BG4.BG5 / BG4.BG6Anschrift (BT35 Straße, BT37 Ort, BT38 PLZ, BT40 Land) / Kontakt (BT41 Name, BT42 Telefon, BT43 E-Mail)
BG7Käufer: BT44 Name, BT49 + BT49-1 elektronische Adresse
BG7.BG8Anschrift des Käufers: BT50 Straße, BT52 Ort, BT53 PLZ, BT55 Land
BG16 / BG16.BG17Zahlungsart BT81 (58 = SEPA-Überweisung) / Bankverbindung BT84 IBAN, BT85 Kontoinhaber, BT86 BIC
BG22Summen: BT106 Positionen, BT109 netto, BT110 Steuer, BT112 brutto, BT115 fällig
BG23Umsatzsteuer-Aufschlüsselung: BT116 Basis, BT117 Steuer, BT118 Kategorie, BT119 Satz
BG25Positionen: BT126 Nr., BT129 Menge, BT130 Einheit (C62 Stück, HUR Stunde), BT131 Nettobetrag
BG25.BG29 / .BG30 / .BG31Nettopreis BT146 / Steuer BT151 Kategorie (S), BT152 Satz / Bezeichnung BT153

Was „Pflicht“ ist, richtet sich nach der XRechnung (CIUS), nicht nur nach der EN 16931; so sind etwa BG6, BT10 und BG16 Pflicht. Alle Felder mit Beschreibung und [REQUIRED] / [optional] enthält die Workflow-Vorlage XRechnungInvoiceReference, und die Spielwiese XRechnung zeigt sie als Formular.

Minimales Rechnungs-JSON

JSON
{
  "BT1": "RE-2026-0001",
  "BT2": "2026-10-08",
  "BT3": "380",
  "BT5": "EUR",
  "BT9": "2026-11-07",
  "BT10": "04011000-12345-03",
  "BG4": {
    "BT27": "Muster GmbH",
    "BT31": "DE123456789",
    "BT34": "rechnung@muster.de",
    "BT34-1": "EM",
    "BG5": { "BT35": "Musterstraße 1", "BT37": "Berlin", "BT38": "10115", "BT40": "DE" },
    "BG6": { "BT41": "Buchhaltung", "BT42": "+49 30 1234567", "BT43": "rechnung@muster.de" }
  },
  "BG7": {
    "BT44": "Musterkunde GmbH",
    "BT49": "rechnung@musterkunde.de",
    "BT49-1": "EM",
    "BG8": { "BT50": "Beispielweg 2", "BT52": "München", "BT53": "80331", "BT55": "DE" }
  },
  "BG16": {
    "BT81": "58",
    "BG17": [ { "BT84": "DE89370400440532013000", "BT85": "Muster GmbH" } ]
  },
  "BG25": [
    {
      "BT126": "1",
      "BT129": "2",
      "BT130": "HUR",
      "BG29": { "BT146": "50.00" },
      "BG30": { "BT151": "S", "BT152": "19" },
      "BG31": { "BT153": "Beratung" }
    }
  ]
}

Mit AutoCalculateTotals: true ergibt das eine Rechnung über 100,00 EUR netto und 119,00 EUR brutto.

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "FilePath": "C:\\Users\\…\\RUNOS\\XRechnung\\Work\\…\\XRechnung_RE-2026-0001_20261008141233.xml",
      "SavedToFolder": false,
      "Sha256": "…",
      "SizeBytes": 8421,
      "Validation": { "Errors": [], "Warnings": [] },
      "Kosit": { "Ran": true, "Accepted": true, "Scenario": "…", "Errors": [], "Warnings": [], "ReportHtml": null, "ReportXml": null },
      "Zugferd": { "ZugferdCreated": true, "ZugferdPath": "C:\\…\\RE-2026-0001_ZUGFeRD.pdf", "Error": null }
    }
  ],
  "SuccessCount": 1,
  "ErrorCount": 0
}

Die XML steht in {{XR.Response.Results.FilePath}}, das ZUGFeRD-PDF in {{XR.Response.Results.Zugferd.ZugferdPath}}, der Prüfbericht (mit KeepKositReport) in {{XR.Response.Results.Kosit.ReportHtml}}.

Wann die Aktion fehlschlägt

  • Pflichtfelder fehlen oder Geschäftsregeln sind verletzt. Die Meldung nennt alle Felder und Regeln auf einmal.
  • Der KoSIT-Validator lehnt die Rechnung ab (mit FailOnKositReject) oder konnte gar nicht laufen.
  • Keine Rechnungsdaten gefunden, oder die XML-Datei ist in einem anderen Programm geöffnet.

Beispiele

Viele ERP- und Warenwirtschaftsprogramme können Rechnungen drucken, aber keine XRechnung erzeugen. Mit RUNOS genügt es, dass die gedruckte Rechnung ein paar zusätzliche Zeilen enthält. RUNOS liest sie, erzeugt daraus die XRechnung, prüft sie mit dem KoSIT-Validator und verschickt sie.

TEXT
ERP druckt Rechnung ──▶ PDF24 speichert PDF im Pool ──▶ RUNOS File-Trigger
                                                        │
                        Skriptblöcke im PDF-Text ◀──────┘
                                                        │
                        XRechnung erzeugen + KoSIT-Prüfung + ZUGFeRD-PDF
                                                        │
                        Mail an den Kunden (SMTP / MAPI / Microsoft 365)

1. Den Druck in einen Ordner leiten

Richten Sie in PDF24 einen Drucker ein, der jedes Dokument automatisch in den Ordner C:\RUNOS\Rechnungen speichert, und wählen Sie ihn im ERP für Rechnungen. Wie das geht, steht unter PDFPrinter (PDF24).

Das PDF muss echten Text enthalten (keine eingescannte Grafik), damit RUNOS die Skriptblöcke lesen kann.

2. Die Rechnungsdaten in den Druck schreiben

Ergänzen Sie das Rechnungsformular Ihres ERP um Zeilen in der Kurzform der Skriptblöcke. Jede Zeile setzt ein Feld der Rechnung. XR ist der Name der XRechnung-Aktion im Workflow (Schritt 3):

TEXT
#RUNOS XR.Invoice.BT1=RE-2026-0001 #RUNOS
#RUNOS XR.Invoice.BT2=2026-10-08 #RUNOS
#RUNOS XR.Invoice.BT9=2026-11-07 #RUNOS
#RUNOS XR.Invoice.BT10=04011000-12345-03 #RUNOS
#RUNOS XR.Invoice.BG7.BT44=Musterkunde GmbH #RUNOS
#RUNOS XR.Invoice.BG7.BT49=rechnung@musterkunde.de #RUNOS
#RUNOS XR.Invoice.BG7.BG8.BT50=Beispielweg 2 #RUNOS
#RUNOS XR.Invoice.BG7.BG8.BT52=München #RUNOS
#RUNOS XR.Invoice.BG7.BG8.BT53=80331 #RUNOS
#RUNOS XR.Invoice.BG25.BT126=1 #RUNOS
#RUNOS XR.Invoice.BG25.BT129=2 #RUNOS
#RUNOS XR.Invoice.BG25.BT130=HUR #RUNOS
#RUNOS XR.Invoice.BG25.BG29.BT146=50.00 #RUNOS
#RUNOS XR.Invoice.BG25.BG30.BT151=S #RUNOS
#RUNOS XR.Invoice.BG25.BG30.BT152=19 #RUNOS
#RUNOS XR.Invoice.BG25.BG31.BT153=Beratung #RUNOS
#RUNOS XR.Invoice.BG25.BT126=2 #RUNOS
#RUNOS XR.Invoice.BG25.BT129=1 #RUNOS
#RUNOS XR.Invoice.BG25.BT130=C62 #RUNOS
#RUNOS XR.Invoice.BG25.BG29.BT146=120.00 #RUNOS
#RUNOS XR.Invoice.BG25.BG30.BT151=S #RUNOS
#RUNOS XR.Invoice.BG25.BG30.BT152=19 #RUNOS
#RUNOS XR.Invoice.BG25.BG31.BT153=Einrichtung #RUNOS
#RUNOS SendMail.To=rechnung@musterkunde.de #RUNOS
#RUNOS SendMail.Subject=Rechnung RE-2026-0001 #RUNOS
  • Jede Position beginnt mit BT126 (Positionsnummer). Ein erneutes BT126 beginnt die nächste Position. Schreiben Sie jede Position vollständig, bevor die nächste beginnt.
  • Je Position: Menge (BT129), Einheit (BT130), Nettopreis (BG29.BT146), Steuerkategorie und -satz (BG30.BT151, BG30.BT152) und Bezeichnung (BG31.BT153).
  • Beträge mit Punkt als Dezimaltrennzeichen und ohne Tausendertrennzeichen.
  • Die Zeilen dürfen klein gedruckt werden (z. B. 4-Punkt-Schrift am Seitenende, auch weiß auf weiß), müssen aber im Text des PDFs stehen. Lassen Sie keine Zeile umbrechen.
  • Die letzten beiden Zeilen setzen Empfänger und Betreff der Mail-Aktion SendMail.

Welche Felder es gibt, steht unter Struktur. In der Spielwiese XRechnung können Sie eine Rechnung vorher ausprobieren.

3. Der Workflow

Die festen Daten (Ihr Unternehmen, Bankverbindung, Zahlungsbedingungen) stehen einmal im Parameter Invoice der XRechnung-Aktion. Die Werte aus dem PDF werden darübergelegt.

JSON
{
  "Name": "ERP-Rechnung als XRechnung",
  "Autostart": true,


  "Trigger": {
    "Type": "File",
    "Name": "Rechnungsdruck",
    "Parameters": {
      "Pool": "C:\\RUNOS\\Rechnungen",
      "Filter": "*.pdf",
      "CronExpression": "0/10 * * * * ?"
    }
  },


  "Actions": [
    {
      "Type": "XRechnung",
      "Name": "XR",
      "Parameters": {
        "AutoCalculateTotals": true,
        "EnableZugferd": true,
        "PdfSourcePath": "{{FilePath}}",
        "SaveToFolder": true,
        "OutputFolder": "C:\\RUNOS\\Archiv\\%yyyy%",
        "Invoice": {
          "BT3": "380",
          "BT5": "EUR",
          "BT20": "Zahlbar innerhalb von 30 Tagen ohne Abzug.",
          "BG4": {
            "BT27": "Muster GmbH",
            "BT31": "DE123456789",
            "BT34": "rechnung@muster.de",
            "BT34-1": "EM",
            "BG5": { "BT35": "Musterstraße 1", "BT37": "Berlin", "BT38": "10115", "BT40": "DE" },
            "BG6": { "BT41": "Buchhaltung", "BT42": "+49 30 1234567", "BT43": "rechnung@muster.de" }
          },
          "BG7": {
            "BT49-1": "EM",
            "BG8": { "BT55": "DE" }
          },
          "BG16": {
            "BT81": "58",
            "BG17": [ { "BT84": "DE89370400440532013000", "BT85": "Muster GmbH" } ]
          }
        }
      }
    },
    {
      "Type": "SMTP",
      "Name": "SendMail",
      "Parameters": {
        "SmtpServer": "smtp.example.com",
        "SmtpUser": "{{connector.Mailserver.Username}}",
        "SmtpPassword": "{{connector.Mailserver.Password}}",
        "From": "rechnung@muster.de",
        "FromName": "Muster GmbH",
        "To": "",
        "Subject": "Ihre Rechnung",
        "Body": "Guten Tag,\n\nanbei erhalten Sie unsere Rechnung als ZUGFeRD-PDF.",
        "Attachments": "{{XR.Response.Results.Zugferd.ZugferdPath}}"
      }
    }
  ]
}

AutoCalculateTotals berechnet Positionsbeträge, Umsatzsteuer-Aufschlüsselung und Summen, sodass das ERP sie nicht drucken muss. Die Zugangsdaten zum Mailserver liegen in einem Basic-Konnektor namens Mailserver.

4. Testen

  1. Öffnen Sie den Workflow im Editor und klicken Sie auf Lauschen.
  2. Drucken Sie eine Rechnung aus dem ERP auf den PDF24-Drucker.
  3. Im Protokoll sehen Sie die gefundene Datei, die gelesenen Skriptblöcke (ScriptShorthandParsed), das Ergebnis der Prüfung und den Versand.

Schlägt die Prüfung fehl, nennt die Meldung jedes fehlende oder falsche Feld mit der Regel aus dem Standard. Das PDF liegt dann in C:\RUNOS\Rechnungen\Spooler\Failed\. Korrigieren Sie Formular oder Daten und drucken Sie erneut.

Varianten

  • Nur XML statt ZUGFeRD-PDF: EnableZugferd weglassen und {{XR.Response.Results.FilePath}} anhängen. Öffentliche Auftraggeber verlangen meist die reine XRechnung mit Leitweg-ID in BT10.
  • Ablage statt Mail: SaveToFolder: true mit OutputFolder legt XML und ZUGFeRD-PDF dauerhaft ab; die Mail-Aktion entfällt.
  • Daten als JSON-Block: Statt vieler Kurzform-Zeilen kann das ERP einen JSON-Block drucken: #RUNOS {"Actions":{"XR":{"Invoice":{"BT1":"RE-2026-0001", …}}}} #RUNOS.
  • Daten aus einer Datei: Schreibt das ERP die Rechnung als JSON-Datei, nimmt der File-Trigger *.json und die Aktion "InvoiceJsonFile": "{{FilePath}}".
  • Vorlage: Die Workflow-Vorlage XRechnungInvoiceEmail enthält einen fertigen Workflow zum Erzeugen, Prüfen und Mailen.
RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / SMTP

SMTP

E-Mails direkt über einen Mailserver versenden.

Übersicht

Die Aktion SMTP sendet eine Mail direkt über einen Mailserver. Sie braucht kein Mailprogramm und eignet sich deshalb für PCs, die unbeaufsichtigt laufen. Mit SaveInSent legt RUNOS zusätzlich per IMAP eine Kopie im Gesendet-Ordner ab.

  • Die Mail wird als HTML gesendet. Enthält der Text bereits HTML-Tags, wird er unverändert übernommen; reiner Text behält seine Zeilenumbrüche.
  • Steht in Body oder Signatur der Pfad einer .txt- oder .html-Datei, nimmt RUNOS deren Inhalt, mit ersetzten Platzhaltern.
  • Ungültige Einträge in To, Cc und Bcc werden übergangen. Anhänge, die es nicht gibt, werden ohne Meldung weggelassen; soll ein fehlender Anhang ein Fehler sein, nehmen Sie MAPI mit MissingAttachments: Error.

Server, Anmeldung und Mail probieren Sie am einfachsten im Playground aus.

Struktur

JSON
{
  "Type": "SMTP",
  "Name": "RechnungSenden",
  "Parameters": {
    "SmtpServer": "smtp.example.com",
    "SmtpPort": 587,
    "UseSsl": true,
    "SmtpUser": "{{connector.Mailserver.Username}}",
    "SmtpPassword": "{{connector.Mailserver.Password}}",
    "From": "rechnung@example.com",
    "FromName": "Buchhaltung Muster GmbH",
    "To": "{{InitialData.Empfaenger}}",
    "Subject": "Rechnung {{InitialData.Invoice.BT1}}",
    "Body": "Guten Tag,\n\nanbei Ihre Rechnung.",
    "Attachments": "{{FilePath}}"
  }
}
ParameterStandardBedeutung
SmtpServer–Adresse des Mailservers
SmtpPort587Port, meist 587 (STARTTLS) oder 465 (SSL)
UseSsltrueVerschlüsselung verwenden (STARTTLS oder SSL, je nach Server)
SmtpUser, SmtpPassword–Anmeldung am Server. Ohne Benutzer wird ohne Anmeldung gesendet.
From, FromName–Absenderadresse und Anzeigename
To, Cc, Bcc–Empfänger, getrennt durch ; oder ,, oder der Pfad einer Textdatei mit Adressen
Subject–Betreff. Zeilenumbrüche werden zu Leerzeichen.
Body, Signatur–Text oder Pfad einer Text- bzw. HTML-Datei. Die Signatur steht unter dem Text.
Attachments–Dateipfade, getrennt durch ; oder ,
SaveInSentfalsetrue: Kopie per IMAP im Gesendet-Ordner ablegen
ImapServer, ImapPort, ImapUser, ImapPasswordPort 993Zugang für SaveInSent
Timeout60Zeitlimit in Sekunden

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "Recipients": "kunde@example.com",
      "Subject": "Rechnung RE-2026-0001",
      "Attachments": [ "C:\\…\\RE-2026-0001.pdf" ],
      "Status": "OK",
      "Message": "Email sent successfully"
    }
  ],
  "SuccessCount": 1,
  "ErrorCount": 0
}

Schlägt das Senden fehl, endet die Aktion mit Failed, und die Meldung des Servers steht in Message und im Protokoll.

Playground

Unter Playground in der Aktivitätsleiste (Aktion SMTP) stellen Sie die Aktion zusammen und probieren sie aus, ohne JSON zu schreiben:

  1. Mailserver: Unter Anbieter füllen Microsoft 365 / Outlook.com, Gmail, IONOS, Strato, GMX, WEB.DE und Telekom Server und Port aus; sonst tragen Sie den Server selbst ein. Unter Anmeldung wählen Sie einen Basic-Konnektor, dann stehen in der Aktion {{connector.Name.Username}} und {{connector.Name.Password}} statt des Passworts. Ein Passwort, das Sie stattdessen eintippen, steht im Klartext in der Aktion; der Playground weist darauf hin.
  2. Verbindung testen verbindet sich mit derselben Verschlüsselung wie die Aktion und meldet sich an, ohne etwas zu senden. Ist Kopie im Gesendet-Ordner ablegen angehakt, wird auch der IMAP-Server geprüft (mit denselben Zugangsdaten).
  3. Nachricht: Absender, Empfänger, Betreff, Text, Signatur und Anhänge (Durchsuchen…, auch mehrere).
  4. Vorschau: Rechts sehen Sie die Mail so, wie die Aktion sie baut: die Empfänger, die wirklich verwendet werden, Betreff, Anhänge mit Größe und den Text als HTML. Darunter stehen Fehler und Warnungen, z. B. übergangene Empfänger, fehlende Anhänge (die die Aktion ohne Meldung weglässt) oder Anhänge über 20 MB. Platzhalter wie {{FilePath}} haben erst im Workflow-Lauf einen Wert und sind hier leer; %DATE% und Konnektoren werden schon ersetzt.
  5. Testmail senden führt die Aktion nach einer Rückfrage wirklich aus.
  6. Aktion kopieren legt das fertige Aktions-JSON in die Zwischenablage. Fügen Sie es unter Actions eines Workflows ein. Ist In der kopierten Aktion die Datei des Triggers ({{FilePath}}) statt dieser Dateien anhängen angehakt, steht bei Attachments {{FilePath}}, passend für Workflows mit Datei-Trigger.

Beispiel

Jeden Morgen um 6 Uhr die Exportdatei des Tages an die Buchhaltung senden, mit Kopie im Gesendet-Ordner und drei Wiederholungen bei Netzwerkproblemen:

JSON
{
  "Name": "Export an Buchhaltung",
  "Autostart": true,
  "Trigger": { "Type": "Time", "Name": "Morgens", "Parameters": { "CronExpression": "0 0 6 * * ?" } },
  "Actions": [
    {
      "Type": "SMTP",
      "Name": "Senden",
      "OnErrorPolicy": { "Strategy": "RetryThenNotify", "MaxRetries": 3, "InitialDelaySeconds": 5 },
      "Parameters": {
        "SmtpServer": "smtp.example.com",
        "SmtpPort": 587,
        "SmtpUser": "{{connector.Mailserver.Username}}",
        "SmtpPassword": "{{connector.Mailserver.Password}}",
        "From": "runos@example.com",
        "FromName": "RUNOS",
        "To": "buchhaltung@example.com",
        "Subject": "Export vom %DATE%",
        "Body": "C:\\RUNOS\\Vorlagen\\export.html",
        "Attachments": "C:\\Export\\Export_%yyyy%-%MM%-%dd%.csv",
        "SaveInSent": true,
        "ImapServer": "imap.example.com",
        "ImapUser": "{{connector.Mailserver.Username}}",
        "ImapPassword": "{{connector.Mailserver.Password}}"
      }
    }
  ]
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / MAPI

MAPI

E-Mails im lokalen Mailprogramm öffnen oder versenden.

Übersicht

Die Aktion MAPI übergibt eine Mail an ein Mailprogramm, das auf diesem PC installiert ist. Die Mail geht über das Konto, das dort eingerichtet ist, und landet in dessen Gesendet-Ordner. Sie können sie vor dem Senden anzeigen lassen, direkt senden oder als Entwurf speichern.

ClientBedeutung
Defaultdas Standard-Mailprogramm von Windows (Standard)
Outlookdas klassische Outlook, mit allen Optionen dieser Seite
ein Nameein bestimmtes Mailprogramm, z. B. Thunderbird oder eM Client, so wie es in Windows registriert ist
ModeWirkung
DisplayDie Mail öffnet sich im Mailprogramm. Sie prüfen sie und senden selbst. (Standard)
SendDie Mail wird ohne Rückfrage gesendet. Braucht mindestens einen Empfänger.
DraftDie Mail wird im Ordner Entwürfe gespeichert. Nur mit Client: Outlook.

Über Default oder den Namen eines anderen Programms nutzt RUNOS die Windows-Schnittstelle „Simple MAPI“. Sie kennt nur reinen Text und weniger Optionen: RUNOS wandelt HTML in Text um und lässt ReplyTo, Importance, DeliveryReceipt, OutlookSignature und From weg; jede ausgelassene Option steht als Warnung im Ergebnis.

Sie haben …Nehmen Sie
Zugangsdaten zu einem SMTP-ServerSMTP
das klassische Outlook und möchten Mails vor dem Versand prüfenMAPI mit Client: Outlook und Mode: Display
Thunderbird, eM Client oder ein anderes MailprogrammMAPI mit Client: Default oder dem Namen des Programms
Microsoft 365 / das neue Outlook, oder kein MailprogrammMicrosoft 365

Struktur

JSON
{
  "Type": "MAPI",
  "Name": "MailErstellen",
  "Parameters": {
    "Client": "Outlook",
    "Mode": "Display",
    "To": "{{InitialData.Empfaenger}}",
    "Subject": "Ihre Unterlagen vom %DATE%",
    "Body": "Guten Tag,\n\nanbei die gewünschten Unterlagen.",
    "Attachments": "C:\\RUNOS\\Out\\*.pdf",
    "MissingAttachments": "Error"
  }
}
ParameterStandardBedeutung
ClientDefaultsiehe oben
ModeDisplaysiehe oben
Profile–Outlook-Profil (nur Outlook)
From–Nur Outlook: Konto oder freigegebenes Postfach, von dem gesendet wird
To, Cc, Bcc–Empfänger, getrennt durch ; oder ,. Name <a@b.de>, eine Liste oder der Pfad einer Datei mit Adressen.
ReplyTo–Antwortadresse (nur Outlook)
Subject–Betreff
Body, Signatur–Text oder Pfad einer Text- bzw. HTML-Datei
BodyFormatAutoAuto, Html oder Text. Auto nimmt HTML, wenn Text oder Signatur HTML-Tags enthalten.
OutlookSignaturefalseOutlook-Signatur des sendenden Kontos anhängen (nur Outlook)
Attachments–Ein Pfad, mehrere getrennt durch ; oder Zeilenumbrüche, eine Liste oder ein Muster wie C:\Out\*.pdf
MissingAttachmentsErrorError: Fehlt ein Anhang, schlägt die Aktion fehl. Skip: ohne ihn senden, mit Warnung.
ImportanceNormalLow, Normal, High (nur Outlook)
ReadReceiptfalseLesebestätigung anfordern
DeliveryReceiptfalseÜbermittlungsbestätigung anfordern (nur Outlook)
Timeout60Sekunden, die RUNOS wartet, bis Outlook gesendet hat, falls Outlook vorher nicht lief

Alle Werte dürfen Platzhalter enthalten, auch Ja/Nein-Werte ("true", "ja", "1"). Die früheren Parameter DisplayBeforeSend, HighImportance und IsHtml funktionieren weiter.

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "Client": "Outlook",
      "Mode": "Display",
      "Status": "Sent",
      "To": "kunde@example.com",
      "Cc": "", "Bcc": "",
      "Subject": "Ihre Unterlagen vom 2026-10-08",
      "Attachments": [ "C:\\RUNOS\\Out\\angebot.pdf" ],
      "Message": "Mail sent."
    }
  ],
  "SuccessCount": 1,
  "ErrorCount": 0
}

Status ist Sent, Displayed, Saved (Entwurf), Cancelled (geöffnet und ohne Senden geschlossen) oder Error.

Beispiel

Jedes PDF aus dem Ordner C:\RUNOS\Angebote als Entwurf im klassischen Outlook ablegen, aus dem gemeinsamen Postfach vertrieb@example.com, mit Outlook-Signatur:

JSON
{
  "Name": "Angebote als Entwurf",
  "Autostart": true,
  "Trigger": { "Type": "File", "Name": "Angebote", "Parameters": { "Pool": "C:\\RUNOS\\Angebote", "Filter": "*.pdf" } },
  "Actions": [
    {
      "Type": "MAPI",
      "Name": "Entwurf",
      "Parameters": {
        "Client": "Outlook",
        "Mode": "Draft",
        "From": "vertrieb@example.com",
        "To": "{{InitialData.Kunde}}",
        "Subject": "Ihr Angebot {{FileName}}",
        "Body": "C:\\RUNOS\\Vorlagen\\angebot.html",
        "OutlookSignature": true,
        "Attachments": "{{FilePath}}",
        "Importance": "High"
      }
    }
  ]
}

Der Empfänger kommt per Skriptblock aus dem PDF: #RUNOS InitialData.Kunde=kunde@example.com #RUNOS.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / HTTPRequest

HTTPRequest

APIs anbinden, Daten austauschen und Cloud-Dienste verbinden.

Übersicht

Die Aktion HttpRequest ruft eine Webadresse auf, typischerweise eine REST-API. Damit verbinden Sie RUNOS mit fast jedem Dienst: Mails über Microsoft 365 senden, Gmail lesen, Kontakte in Odoo anlegen, Aufträge aus einem Shop abrufen, Wetterdaten lesen, Dateien herunterladen.

Die Antwort steht den folgenden Aktionen zur Verfügung, JSON-Antworten bereits als Objekt:

JSON
{
  "Type": "HttpRequest",
  "Name": "WetterAbfragen",
  "Parameters": {
    "Url": "https://api.open-meteo.com/v1/forecast",
    "QueryParameters": { "latitude": "52.52", "longitude": "13.41", "current_weather": "true" }
  }
}

Die Temperatur steht danach in {{WetterAbfragen.Response.Results.Body.current_weather.temperature}}.

Was die Aktion kann

AufgabeWie
Daten abfragenMethod: GET mit QueryParameters
Daten sendenPOST, PUT oder PATCH mit Body als JSON, Formular oder Text
AnmeldenAuthType Bearer, Basic oder ApiKey, mit Zugangsdaten aus einem Konnektor
Mehrere SeitenAutoPagination folgt @odata.nextLink, next und nextPageUrl
Viele AdressenUrls mit Parallel: true
Dateien herunterladenDownloadPath
Robust bei NetzproblemenMaxRetries (Standard 2) wiederholt bei Verbindungsfehlern und Zeitüberschreitung

Alle Parameter und das Ergebnis stehen unter Struktur.

Anmeldung über Konnektoren

Zugangsdaten gehören nicht ins Workflow-JSON. Legen Sie einen Konnektor an und verweisen Sie mit Platzhaltern darauf:

Dienst meldet an mit …KonnektorIn der Aktion
nichtsNone"Url": "{{connector.Name.BaseUrl}}/…"
API-SchlüsselApiKey"AuthType": "Bearer", "AuthToken": "{{connector.Name.ApiKey}}" oder eigener Header
Benutzer und PasswortBasic"AuthType": "Basic", "AuthToken": "{{connector.Name.Username}}:{{connector.Name.Password}}"
Anmeldung im Browser (Microsoft, Google)OAuth2"AuthType": "Bearer", "AuthToken": "{{connector.Name.AccessToken}}"

Ein OAuth2-Token erneuert RUNOS selbst, wenn es in weniger als einer Minute abläuft.

Beispiele

  • MS365: Mails über Microsoft 365 senden, Kontakte lesen
  • Gmail: ungelesene Mails abrufen, als gelesen markieren, über Gmail senden
  • Odoo Contacts: Kontakte in Odoo suchen und anlegen

Struktur

JSON
{
  "Type": "HttpRequest",
  "Name": "AuftragSenden",
  "Parameters": {
    "Url": "{{connector.Shop.BaseUrl}}/orders",
    "Method": "POST",
    "Headers": { "Accept": "application/json" },
    "BodyType": "json",
    "Body": {
      "Value": {
        "rechnung": "{{InitialData.Invoice.BT1}}",
        "betrag": "{{InitialData.Invoice.BG22.BT112}}"
      }
    },
    "AuthType": "Bearer",
    "AuthToken": "{{connector.Shop.ApiKey}}",
    "Timeout": 30000,
    "MaxRetries": 2
  }
}

Parameter

ParameterStandardBedeutung
Url–Adresse der Anfrage
MethodGETGET, POST, PUT, PATCH, DELETE, HEAD
Headers–Kopfzeilen als Objekt, z. B. { "Accept": "application/json" }
QueryParameters–Werte, die an die URL angehängt werden (?a=1&b=2), richtig kodiert
Body–Inhalt der Anfrage, als { "Value": … }. Nur bei Methoden außer GET und HEAD.
BodyTypejsonWie Body.Value gesendet wird, siehe unten
AuthTypeNoneNone, Bearer, Basic oder ApiKey, siehe unten
AuthToken–Token, Zugangsdaten oder Schlüssel für AuthType
Timeout30000Zeitlimit je Anfrage in Millisekunden
MaxRetries2Wiederholungen bei Verbindungsfehlern und Zeitüberschreitung, mit wachsender Pause. Gelingt eine Wiederholung, ist die Aktion erfolgreich; die gescheiterten Versuche stehen als Warnung im Ergebnis.
Urls, Parallel– , falseMit Parallel: true und einer Liste in Urls wird jede Adresse abgefragt, bis zu MaxParallelRequests (Standard 5) gleichzeitig
AutoPaginationfalseWeiteren Seiten automatisch folgen: @odata.nextLink (Microsoft Graph), next und nextPageUrl. Jede Seite wird ein Eintrag in Response.Results.
RateLimitDelay0Pause nach jeder Anfrage in Millisekunden
DownloadPath–Antwort als Datei speichern. Endet der Pfad auf \ oder ist er ein Ordner, wird der Dateiname vom Server oder aus der URL übernommen; sonst ist er der vollständige Dateiname.
IfNoneMatch, IfModifiedSince–Bedingte Anfrage mit ETag bzw. Datum

Alle Texte, auch in Headers, QueryParameters und Body, dürfen Platzhalter enthalten.

Body

BodyTypeGesendet als
jsonJSON (application/json). Ein Objekt in Value wird zu JSON, ein Text wird unverändert gesendet.
formFormular (application/x-www-form-urlencoded). Value ist ein Objekt mit den Feldern.
rawText (text/plain)
binaryBytes des Textes in Value
noneohne Inhalt

Der Inhaltstyp ergibt sich aus BodyType. Ein Content-Type in Headers wird bei Anfragen mit Body derzeit durch diesen Typ ersetzt.

Anmeldung

AuthTypeAuthTokenGesendet wird
Bearerdas Token oder der SchlüsselAuthorization: Bearer <Token>
Basicbenutzer:passwortAuthorization: Basic <Base64>
ApiKeyder SchlüsselX-API-KEY: <Schlüssel>

Braucht eine API einen anderen Header, setzen Sie ihn in Headers: { "x-api-key": "{{connector.Wetter.ApiKey}}" }. Welche Werte ein Konnektor liefert, steht bei None, ApiKey, Basic und OAuth2.

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "Url": "https://api.open-meteo.com/v1/forecast",
      "StatusCode": 200,
      "Status": "OK",
      "Reason": "OK",
      "ETag": null,
      "CacheHit": false,
      "ElapsedMs": 182.4,
      "DownloadedFile": null,
      "Body": { "current_weather": { "temperature": "18.3", … } }
    }
  ],
  "SuccessCount": 1,
  "ErrorCount": 0
}
  • Body ist bei JSON-Antworten ein Objekt, sonst der Text der Antwort. Mit DownloadPath steht der Pfad der Datei in DownloadedFile.
  • In JSON-Antworten werden alle Werte als Text abgelegt: Zahlen als Text (18.3 → "18.3"), true als "true", false und null als leerer Text. Vergleiche in IF wie > 25 funktionieren trotzdem.
  • Antwortet der Server mit einem Fehlercode (4xx, 5xx), endet die Aktion mit Failed. Der Code steht in StatusCode, die Antwort trotzdem in Body.
  • Felder, deren Name password, token, apikey, api_key oder secret enthält, werden als ***MASKED*** gespeichert, damit sie nicht im Protokoll landen.

Beispiele

Microsoft 365

Microsoft 365 und Outlook.com erreichen Sie über Microsoft Graph. Es muss kein Mailprogramm laufen, und es funktioniert auch mit dem neuen Outlook. Für den häufigsten Fall, eine Mail mit Anhängen senden, gibt es außerdem die fertige Aktion Outlook365.

Einmalig: Konnektor anlegen

  1. Öffnen Sie Konnektoren, klicken Sie auf Neu und wählen Sie die Vorlage Microsoft Outlook Mail (für Kontakte: Outlook Contacts).
  2. Nennen Sie den Konnektor OutlookMail (bzw. OutlookContacts) und speichern Sie.
  3. Klicken Sie auf Im Browser anmelden, melden Sie sich mit dem Postfach an und bestätigen Sie die Berechtigungen.

Der Status zeigt danach Bereit. RUNOS erneuert die Anmeldung selbst. Mehr unter OAuth2.

Mail senden

JSON
{
  "Type": "HttpRequest",
  "Name": "MailSenden",
  "Parameters": {
    "Url": "https://graph.microsoft.com/v1.0/me/sendMail",
    "Method": "POST",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.OutlookMail.AccessToken}}",
    "BodyType": "json",
    "Body": {
      "Value": {
        "message": {
          "subject": "Ihr Dokument {{FileName}}",
          "body": { "contentType": "Text", "content": "Guten Tag,\n\nanbei Ihr Dokument." },
          "toRecipients": [ { "emailAddress": { "address": "kunde@example.com" } } ],
          "attachments": [
            {
              "@odata.type": "#microsoft.graph.fileAttachment",
              "name": "{{FileName}}",
              "contentBytes": "{{FilePath.toBase64()}}"
            }
          ]
        },
        "saveToSentItems": true
      }
    }
  }
}
  • {{FilePath.toBase64()}} liest die Datei und liefert ihren Inhalt als Base64, so wie Graph ihn für Anhänge erwartet.
  • Graph antwortet mit StatusCode 202 und leerem Body; die Mail liegt danach in Gesendete Elemente.
  • Auf diesem Weg sind Anfragen bis etwa 4 MB möglich. Für größere Anhänge nehmen Sie die Aktion Outlook365, sie lädt Dateien bis 150 MB in Teilen hoch.

Kontakte lesen

JSON
{
  "Type": "HttpRequest",
  "Name": "Kontakte",
  "Parameters": {
    "Url": "https://graph.microsoft.com/v1.0/me/contacts?$select=displayName,emailAddresses,companyName&$top=100",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.OutlookContacts.AccessToken}}",
    "AutoPagination": true
  }
}

Mit AutoPagination folgt RUNOS dem @odata.nextLink von Graph; jede Seite ist ein Eintrag in Response.Results. Die Kontakte der ersten Seite stehen in {{Kontakte.Response.Results.Body.value}} und lassen sich mit einer Loop durchlaufen:

JSON
{
  "Type": "Loop",
  "Name": "JederKontakt",
  "Parameters": {
    "Items": "{{Kontakte.Response.Results.Body.value}}",
    "Do": [
      { "Type": "SMTP", "Name": "Anschreiben", "Parameters": { "To": "{{item.emailAddresses.0.address}}", "Subject": "Hallo {{item.displayName}}", "Body": "…" } }
    ]
  }
}

Die Aktion Outlook365

Die Aktion Outlook365 sendet Mails über denselben Konnektor, ohne dass Sie das Graph-JSON selbst schreiben. Sie lädt große Anhänge in Teilen hoch und kann Entwürfe anlegen.

JSON
{
  "Type": "Outlook365",
  "Name": "RechnungMailen",
  "Parameters": {
    "Connector": "OutlookMail",
    "Mode": "Send",
    "To": "{{InitialData.Empfaenger}}",
    "Subject": "Rechnung {{InitialData.Invoice.BT1}}",
    "Body": "Guten Tag,\n\nanbei Ihre Rechnung.",
    "Attachments": "{{FilePath}}"
  }
}
ParameterStandardBedeutung
ConnectorOutlookMailName des Microsoft-Konnektors
ModeSendSend sendet; Draft speichert im Ordner Entwürfe; Display speichert als Entwurf und öffnet ihn in Outlook im Web
From–Leer: das angemeldete Postfach. Sonst ein freigegebenes Postfach oder eines mit „Senden als“-Rechten.
To, Cc, Bcc, ReplyTo–Empfänger, getrennt durch ; oder ,. Name <a@b.de>, Listen und Dateien mit Adressen sind erlaubt.
Subject–Betreff
Body, Signatur–Text oder Pfad einer Text- bzw. HTML-Datei
BodyFormatAutoAuto, Html oder Text
Attachments–Pfad, mehrere getrennt durch ;, eine Liste oder ein Muster wie C:\Out\*.pdf. Bis 150 MB je Datei.
MissingAttachmentsErrorError oder Skip
ImportanceNormalLow, Normal, High
ReadReceipt, DeliveryReceiptfalseBestätigungen anfordern
SaveToSentItemstrueKopie in Gesendete Elemente. Bei großen Anhängen bleibt sie immer dort.
Timeout100Zeitlimit je Anfrage an Microsoft in Sekunden

Das Ergebnis enthält je Mail Mode, Status (z. B. Sent), From, To, Subject, Attachments und Message; bei Draft und Display außerdem MessageId und WebLink zum Entwurf.

MeldungLösung
No connector named “…”Konnektor anlegen oder den Namen in Connector korrigieren
… is not signed inAuf der Seite Konnektoren Im Browser anmelden klicken
Fehler 403 bei FromFür das Postfach fehlen „Senden als“-Rechte

Die Workflow-Vorlage Outlook365Mail enthält ein fertiges Beispiel.

Gmail

Über die Gmail API liest RUNOS Mails aus einem Google-Konto, ohne Mailprogramm: ungelesene Mails suchen, ihre Details abrufen und sie als gelesen markieren. Zum Senden über Gmail nehmen Sie die Aktion SMTP.

Einmalig: Zugang einrichten

Google verlangt eine eigene OAuth-Anwendung:

  1. Legen Sie in der Google Cloud Console ein Projekt an und aktivieren Sie die Gmail API.
  2. Richten Sie den OAuth-Zustimmungsbildschirm ein und tragen Sie Ihr Google-Konto als Testnutzer ein.
  3. Legen Sie unter Anmeldedaten eine OAuth-Client-ID vom Typ Desktop-App an. Notieren Sie Client-ID und Clientschlüssel.
  4. In RUNOS: Konnektoren → Neu → Vorlage Gmail API. Nennen Sie den Konnektor Gmail, tragen Sie Client ID und Client secret ein und speichern Sie.
  5. Im Browser anmelden und den Zugriff bestätigen.

Die Vorlage fordert die Berechtigungen gmail.send und gmail.readonly an. Zum Markieren als gelesen ergänzen Sie in den Scopes https://www.googleapis.com/auth/gmail.modify und melden sich erneut an. Mehr unter OAuth2.

Ungelesene Mails abrufen

JSON
{
  "Type": "HttpRequest",
  "Name": "Ungelesen",
  "Parameters": {
    "Url": "https://gmail.googleapis.com/gmail/v1/users/me/messages",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.Gmail.AccessToken}}",
    "QueryParameters": { "q": "is:unread has:attachment", "maxResults": "20" }
  }
}

q versteht dieselben Suchbegriffe wie das Suchfeld von Gmail. Die Antwort enthält in Body.messages eine Liste mit id je Mail. Die Details lesen Sie je Mail in einer Loop:

JSON
{
  "Type": "Loop",
  "Name": "JedeMail",
  "Parameters": {
    "Items": "{{Ungelesen.Response.Results.Body.messages}}",
    "Do": [
      {
        "Type": "HttpRequest",
        "Name": "MailLesen",
        "Parameters": {
          "Url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{{item.id}}",
          "AuthType": "Bearer",
          "AuthToken": "{{connector.Gmail.AccessToken}}",
          "QueryParameters": { "format": "metadata", "metadataHeaders": "Subject" }
        }
      }
    ]
  }
}

Im Durchlauf steht die Kurzvorschau in {{MailLesen.Response.Results.Body.snippet}}. Prüfen Sie vorher mit IF, ob es überhaupt Mails gibt: {{Ungelesen.Response.Results.Body.resultSizeEstimate}} > 0.

Als gelesen markieren

Im selben Durchlauf entfernt diese Aktion das Label UNREAD, damit die Mail beim nächsten Abruf nicht wieder erscheint (Scope gmail.modify nötig):

JSON
{
  "Type": "HttpRequest",
  "Name": "AlsGelesen",
  "Parameters": {
    "Url": "https://gmail.googleapis.com/gmail/v1/users/me/messages/{{item.id}}/modify",
    "Method": "POST",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.Gmail.AccessToken}}",
    "Body": { "Value": { "removeLabelIds": [ "UNREAD" ] } }
  }
}

Mit einem Time-Trigger (z. B. alle 5 Minuten) wird daraus ein Postfach, das RUNOS regelmäßig abarbeitet.

Mail senden

Die Gmail API erwartet zum Senden den vollständigen Mailtext als Base64. Das lässt sich mit HttpRequest derzeit nicht aus Platzhaltern zusammensetzen. Senden Sie über Gmail deshalb mit der Aktion SMTP:

  1. Schalten Sie im Google-Konto die Bestätigung in zwei Schritten ein und erzeugen Sie unter Sicherheit → App-Passwörter ein App-Passwort.
  2. Legen Sie einen Basic-Konnektor GmailSmtp an: Benutzername = Gmail-Adresse, Passwort = App-Passwort.
JSON
{
  "Type": "SMTP",
  "Name": "GmailSenden",
  "Parameters": {
    "SmtpServer": "smtp.gmail.com",
    "SmtpPort": 587,
    "UseSsl": true,
    "SmtpUser": "{{connector.GmailSmtp.Username}}",
    "SmtpPassword": "{{connector.GmailSmtp.Password}}",
    "From": "{{connector.GmailSmtp.Username}}",
    "To": "kunde@example.com",
    "Subject": "Ihr Auftrag {{InitialData.Auftrag}}",
    "Body": "Guten Tag,\n\nIhr Auftrag ist eingegangen.",
    "Attachments": "{{FilePath}}"
  }
}

Gmail legt die Mail selbst im Ordner Gesendet ab.

Odoo Contacts

Odoo speichert Kontakte (Kunden, Lieferanten, Ansprechpartner) im Modell res.partner. Ab Odoo 19 bietet Odoo dafür die JSON-2-API: Jede Methode eines Modells ist eine Adresse /json/2/<Modell>/<Methode>, die Anmeldung erfolgt mit einem API-Schlüssel.

Einmalig: API-Schlüssel und Konnektor

  1. In Odoo: Klicken Sie oben rechts auf Ihren Namen → Mein Profil → Kontosicherheit → Neuer API-Schlüssel. Kopieren Sie den Schlüssel; Odoo zeigt ihn nur einmal.
  2. In RUNOS: Konnektoren → Neu → Leerer Konnektor. Name Odoo, Base URL https://ihrefirma.odoo.com, Auth-Typ API key, den Schlüssel einfügen. Speichern.
  3. Haben Sie mehrere Datenbanken auf einem Server, tragen Sie unter Erweitert → Extra JSON die Datenbank ein: { "Database": "ihrefirma" }.

Mehr unter ApiKey.

Kontakte suchen

JSON
{
  "Type": "HttpRequest",
  "Name": "KontaktSuchen",
  "Parameters": {
    "Url": "{{connector.Odoo.BaseUrl}}/json/2/res.partner/search_read",
    "Method": "POST",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.Odoo.ApiKey}}",
    "Headers": { "X-Odoo-Database": "{{connector.Odoo.ExtraJson.Database}}" },
    "Body": {
      "Value": {
        "domain": [ [ "email", "=ilike", "{{InitialData.Email}}" ] ],
        "fields": [ "name", "email", "phone", "company_name" ],
        "limit": 5
      }
    }
  }
}
  • domain ist der Suchfilter von Odoo: eine Liste von Bedingungen [Feld, Operator, Wert], z. B. ["is_company", "=", true] oder ["name", "ilike", "Muster"].
  • Die Antwort ist eine Liste der gefundenen Kontakte. Den ersten Treffer lesen Sie mit {{KontaktSuchen.Response.Results.Body.0.name}}, die Anzahl mit {{KontaktSuchen.Response.Results.Body.count}}.
  • Ohne X-Odoo-Database (bei nur einer Datenbank) bleibt der Header leer und wird nicht gesendet.

Kontakt anlegen, wenn er fehlt

Zusammen mit IF: Nur wenn die Suche nichts gefunden hat, wird der Kontakt angelegt.

JSON
{
  "Type": "If",
  "Name": "NeuerKontakt",
  "Parameters": {
    "Condition": "{{KontaktSuchen.Response.Results.Body.count}} == 0",
    "Do": [
      {
        "Type": "HttpRequest",
        "Name": "KontaktAnlegen",
        "Parameters": {
          "Url": "{{connector.Odoo.BaseUrl}}/json/2/res.partner/create",
          "Method": "POST",
          "AuthType": "Bearer",
          "AuthToken": "{{connector.Odoo.ApiKey}}",
          "Headers": { "X-Odoo-Database": "{{connector.Odoo.ExtraJson.Database}}" },
          "Body": {
            "Value": {
              "vals_list": [
                {
                  "name": "{{InitialData.Name}}",
                  "email": "{{InitialData.Email}}",
                  "phone": "{{InitialData.Telefon}}",
                  "is_company": false
                }
              ]
            }
          }
        }
      }
    ]
  }
}

Odoo antwortet mit der Liste der neuen Kennungen, z. B. [42]; die Kennung steht in {{KontaktAnlegen.Response.Results.Body.0}}.

Der ganze Workflow

Ein Webformular oder ein anderes Programm legt eine kleine JSON-Datei mit einem Skriptblock in den Ordner C:\RUNOS\Kontakte:

TEXT
#RUNOS {"InitialData":{"Name":"Erika Muster","Email":"erika@example.com","Telefon":"+49 30 1234567"}} #RUNOS
JSON
{
  "Name": "Kontakte nach Odoo",
  "Autostart": true,
  "Trigger": {
    "Type": "File",
    "Name": "Eingang",
    "Parameters": { "Pool": "C:\\RUNOS\\Kontakte", "Filter": "*.json", "DeleteAfter": true }
  },
  "Actions": [
    { "Type": "HttpRequest", "Name": "KontaktSuchen", "Parameters": { /* wie oben */ } },
    { "Type": "If", "Name": "NeuerKontakt", "Parameters": { /* wie oben */ } }
  ]
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / Print

Print

Vorschau

PDFs, Bilder und Texte auf einem Drucker ausgeben.

Diese Aktion ist in der Dokumentation beschrieben, im Changelog aber noch der nächsten Version zugeordnet. Verfügbarkeit mit Ihrer RUNOS-Version abgleichen.

Übersicht

Die Aktion Print druckt eine oder mehrere Dateien auf einem Drucker, der auf diesem PC installiert ist – zum Beispiel jede eingehende Rechnung zusätzlich auf Papier. Es öffnet sich kein Fenster; der Druck läuft ohne Rückfrage.

DateitypEndungen
PDF.pdf
Bilder.png, .jpg, .jpeg, .bmp, .gif, .tif, .tiff (mehrseitige TIFF-Dateien Seite für Seite)
Text.txt, .log, .csv, .xml, .json (Schrift Consolas 9 pt, ohne eingestellte Ränder 1,27 cm Rand, zu lange Zeilen werden abgeschnitten)

PDF-Seiten und Bilder werden auf den bedruckbaren Bereich des Papiers (oder den Bereich innerhalb der eingestellten Ränder) verkleinert, wenn sie größer sind, aber nie vergrößert, und mittig gesetzt. Ohne feste Ausrichtung (Landscape) wird jede Seite so gedreht, wie sie angelegt ist: Querformat-Seiten quer, Hochformat-Seiten hoch.

Fehler: RUNOS prüft vor der ersten Seite den Drucker, alle Dateien, die Dateitypen und die Optionen. Ist etwas davon ungültig, schlägt die Aktion fehl, ohne etwas zu drucken. Danach werden die Dateien nacheinander gedruckt. Schlägt eine fehl, werden die übrigen nicht mehr gedruckt (Skipped) und die Aktion schlägt fehl. Wie bei jeder Aktion endet der Lauf dann bzw. greift die Fehlerbehandlung des Workflows.

Welche Drucker es gibt, was sie können und wie eine Datei gedruckt aussieht, zeigt der Playground.

Den umgekehrten Weg, vom Drucken eines Programms in einen Ordner, beschreibt PDFPrinter (PDF24).

Struktur

JSON
{
  "Type": "Print",
  "Name": "Drucken",
  "Parameters": {
    "Source": "{{FilePath}}",
    "Printer": "default",
    "Copies": 1,
    "Duplex": "LongEdge"
  }
}
ParameterStandardBedeutung
Source–Die zu druckende(n) Datei(en): ein Pfad, mehrere getrennt durch ; oder Zeilenumbrüche, eine Liste oder ein Muster wie C:\Out\*.pdf. Die Dateien werden in dieser Reihenfolge gedruckt; Treffer eines Musters alphabetisch.
MissingFilesErrorError: Fehlt eine Datei oder findet ein Muster nichts, schlägt die Aktion fehl. Skip: ohne sie weiterdrucken, mit Warnung. Fehlen alle, druckt die Aktion nichts und endet erfolgreich mit Warnungen.
Printerdefaultdefault = der Standarddrucker von Windows, sonst der Name eines installierten Druckers, wie er unter Einstellungen → Drucker & Scanner steht (Groß-/Kleinschreibung egal). Ist der Drucker nicht installiert, schlägt die Aktion fehl; die Fehlermeldung nennt die installierten Drucker.
Copies1Anzahl Exemplare jeder Datei (sortiert). Kann der Druckertreiber nicht so viele Kopien, wird die Datei entsprechend oft gedruckt.
DuplexdefaultSimplex (einseitig), LongEdge (beidseitig, Bindung an der langen Kante) oder ShortEdge (an der kurzen Kante). Kann der Drucker nicht beidseitig drucken, wird einseitig gedruckt, mit Warnung.
FromPage, ToPagedefaultErste und letzte Seite (ab 1), bei jeder Datei; bei Textdateien zählen die gedruckten Seiten. Ein ToPage hinter der letzten Seite druckt bis zum Ende; ein FromPage hinter der letzten Seite ist ein Fehler.
Colordefaulttrue = farbig, false = schwarzweiß. Druckt der Drucker nicht farbig, gibt es eine Warnung.
Landscapedefaulttrue = quer, false = hoch. default: PDF-Seiten und Bilder nach ihrer eigenen Ausrichtung, Text wie im Drucker eingestellt.
PaperSizedefaultPapierformat, wie der Drucker es nennt, z. B. A4 oder Letter.
PaperSourcedefaultPapierfach, wie der Drucker es nennt, z. B. Fach 2.
ResolutiondefaultHigh, Medium, Low, Draft oder dpi wie 600 bzw. 600x600.
MarginTop, MarginBottom, MarginLeft, MarginRightdefaultRand in Millimetern vom Papierrand, z. B. 15 oder 12.5. Der Inhalt wird in den Bereich innerhalb der Ränder eingepasst. Ein Rand kleiner als der nicht bedruckbare Rand des Druckers zählt als dieser. default: der Rand des Druckers, bei Textdateien zusätzlich 1,27 cm. Lassen die Ränder weniger als 1,27 cm Platz, schlägt die Aktion fehl.

default (oder ein leerer Wert) lässt die Einstellung des Druckers unverändert. Kennt der Drucker ein angegebenes Papierformat, Fach oder eine Auflösung nicht, schlägt die Aktion fehl; die Fehlermeldung nennt die verfügbaren Werte. Alle Werte dürfen Platzhalter enthalten, auch Zahlen und Ja/Nein-Werte ("true", "ja", "1").

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "Source": "C:\\RUNOS\\Out\\RE-1001.pdf",
      "Printer": "Brother HL-L2350DW",
      "Status": "Printed",
      "Pages": 2,
      "Copies": 1,
      "Message": "Sent to the print queue of 'Brother HL-L2350DW'."
    }
  ],
  "SuccessCount": 1,
  "ErrorCount": 0
}

Status ist Printed, Error (die Datei, an der es scheiterte) oder Skipped (nach einem Fehler nicht mehr gedruckt). Pages zählt die Seiten eines Exemplars. Schlägt schon die Prüfung vor dem Druck fehl (Drucker, Datei, Option), ist Results leer und ErrorCount 1; die Meldung steht in Status.Errors. Warnungen (kein Duplex, keine Farbe, übersprungene Dateien) stehen in Status.Warnings.

Playground

Unter Playground in der Aktivitätsleiste (Aktion Print) stellen Sie die Aktion zusammen, ohne JSON zu schreiben:

  1. Drucker: Links stehen alle installierten Drucker, der Standarddrucker zuerst, mit Zustand (Bereit / Offline). Die Schaltfläche neben einem Drucker kopiert seinen Namen für Printer.
  2. Einstellungen: Dateien wählen (Durchsuchen…, auch mehrere), dann Exemplare, Duplex, Seitenbereich, Farbe, Ausrichtung und die Ränder oben, unten, links und rechts in mm (leer = Rand des Druckers). Papierformat, Papierfach und Auflösung bieten genau die Werte an, die der gewählte Drucker kennt.
  3. Vorschau: Rechts sehen Sie jede Seite auf dem Papier, so wie RUNOS sie druckt: verkleinert, mittig, gedreht, nur der gewählte Seitenbereich, bei Color: false in Graustufen. Die gestrichelte Linie ist der Bereich, in den gedruckt wird: innerhalb der Ränder bzw. des nicht bedruckbaren Rands des Druckers. Die Seite füllt die Breite der Vorschau; mit Strg+Mausrad zoomen Sie, der Zoom bleibt beim Blättern erhalten. Darunter stehen dieselben Fehler und Warnungen, die die Aktion melden würde.
  4. Testdruck druckt die gewählten Dateien nach einer Rückfrage wirklich, z. B. um Duplex oder Papierfach zu prüfen.
  5. Aktion kopieren legt das fertige Aktions-JSON in die Zwischenablage. Fügen Sie es unter Actions eines Workflows ein. Ist In der kopierten Aktion die Datei des Triggers ({{FilePath}}) statt dieser Dateien drucken angehakt, steht dort {{FilePath}} statt der gewählten Dateien – passend für Workflows mit Datei-Trigger.

Beidseitig, Papierfach, Auflösung und Exemplare erledigt der Drucker selbst; die Vorschau zeigt sie nicht, sondern nennt sie unter dem Bild.

Beispiel

Jede Rechnung, die im Ordner C:\RUNOS\Rechnungen ankommt, zweimal beidseitig auf dem Drucker „Buchhaltung“ ausgeben:

JSON
{
  "Name": "Rechnungen drucken",
  "Autostart": true,
  "Trigger": { "Type": "File", "Name": "Rechnungen", "Parameters": { "Pool": "C:\\RUNOS\\Rechnungen", "Filter": "*.pdf" } },
  "Actions": [
    {
      "Type": "Print",
      "Name": "Drucken",
      "Parameters": {
        "Source": "{{FilePath}}",
        "Printer": "Buchhaltung",
        "Copies": 2,
        "Duplex": "LongEdge",
        "PaperSize": "A4"
      }
    }
  ]
}

Mehrere Dateien auf einmal, z. B. alle PDFs und ein Deckblatt:

JSON
"Source": "C:\\RUNOS\\Deckblatt.pdf; C:\\RUNOS\\Out\\*.pdf"
RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / FTP

FTP

Vorschau

Dateien über SFTP, FTPS oder FTP übertragen.

Diese Aktion ist in der Dokumentation beschrieben, im Changelog aber noch der nächsten Version zugeordnet. Verfügbarkeit mit Ihrer RUNOS-Version abgleichen.

Übersicht

Die Aktion FTP tauscht Dateien mit einem Server aus: Sie lädt Dateien von diesem PC hoch, lädt sie herunter, listet sie auf oder löscht sie. Sie beherrscht drei Protokolle:

ProtokollPortVerschlüsselung
SFTP (Standard)22SSH; Anmeldung mit Passwort und/oder Schlüsseldatei
FTPS21 (ImplicitTls: 990)TLS. Ein Server ohne TLS ist ein Fehler; RUNOS weicht nie auf unverschlüsseltes FTP aus.
FTP21keine: Passwort und Dateien gehen im Klartext

Damit Übertragungen zuverlässig sind, macht die Aktion Folgendes:

  • Jede Übertragung wird über die Größe geprüft. Nach dem Hochladen vergleicht RUNOS die Dateigröße auf dem Server mit der lokalen; beim Herunterladen muss die Datei mit der Größe ankommen, die der Server gemeldet hat. Weichen sie ab, zählt die Datei als Fehler. Einem Server, der keine Größe meldet, wird vertraut.
  • Heruntergeladene Dateien werden unter einem vorläufigen Namen geschrieben (name.part) und erst umbenannt, wenn sie vollständig und geprüft sind. Ein Datei-Trigger, der den Ordner überwacht, sieht nie eine halbe Datei.
  • Move löscht die Quelle erst nach der Prüfung. Lässt sich die Quelle nicht löschen, ist die Datei trotzdem angekommen: Das ist eine Warnung, kein Fehler, und die Datei wird beim nächsten Mal noch einmal übertragen.
  • Eine fehlerhafte Datei hält die anderen nicht auf. Am Ende schlägt die Aktion fehl, wenn eine Datei fehlgeschlagen ist oder Verbindung bzw. Anmeldung nicht geklappt haben. Wie bei jeder Aktion endet dann der Lauf oder die Fehlerbehandlung des Workflows greift (z. B. drei Wiederholungen mit RetryThenNotify).
  • Fehlende Ordner auf der Zielseite werden angelegt.

Server, Anmeldung und Übertragung probieren Sie am einfachsten im Playground aus; dort sehen Sie auch die Ordner auf dem Server.

Struktur

JSON
{
  "Type": "FTP",
  "Name": "RechnungSenden",
  "Parameters": {
    "Protocol": "SFTP",
    "Server": "sftp.partner.de",
    "User": "{{connector.Partner.Username}}",
    "Password": "{{connector.Partner.Password}}",
    "Fingerprint": "SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og",
    "Operation": "Upload",
    "Source": "{{FilePath}}",
    "Destination": "/eingang/rechnungen"
  }
}

Verbindung

ParameterStandardBedeutung
ProtocolSFTPSFTP, FTPS oder FTP. Ist er leer und Server eine URL, entscheidet deren Schema.
Server–Host (sftp.example.com), Host mit Port (sftp.example.com:2222) oder URL (sftp://…, ftps://…, ftp://…)
Port00 = der übliche Port des Protokolls (22, 21 bzw. 990 mit ImplicitTls). Geht einem Port in der URL vor.
User, Password–Anmeldung. FTP/FTPS ohne User meldet sich anonym an.
PrivateKeyFile, PrivateKeyPassphrase–SFTP: Schlüsseldatei (OpenSSH- oder PuTTY-Format) statt oder zusätzlich zum Passwort
Fingerprint–Nur diesen Server annehmen, siehe Fingerprint
ImplicitTlsfalseFTPS: TLS ab dem ersten Byte (Port 990) statt AUTH TLS (Port 21)
PassiveModetrueFTP/FTPS: passiver Modus. Nur false, wenn der Server aktiven Modus verlangt.
IgnoreCertificateErrorsfalseFTPS: auch ein Zertifikat annehmen, dem Windows nicht vertraut (selbst signiert). Besser: Fingerprint.
Timeout60Sekunden für den Verbindungsaufbau und jede Antwort des Servers

Übertragung

ParameterStandardBedeutung
OperationUploadUpload, Download, List oder Delete
Source–Was übertragen, aufgelistet oder gelöscht wird, siehe unten
Destination–Upload: Ordner auf dem Server (leer = Anmeldeordner). Download: Ordner auf diesem PC (Pflicht).
Filter*Ist Source ein Ordner: nur diese Dateien, z. B. *.pdf;*.xml
RecursivefalseUnterordner einbeziehen; ihre Struktur bleibt am Ziel erhalten
IfExistsOverwriteDie Zieldatei gibt es schon: Overwrite (überschreiben), Skip (überspringen, zählt als Skipped) oder Error (zählt als Fehler)
MovefalseUpload/Download: Quelle nach geprüfter Übertragung löschen
NewName–Upload/Download: Name der Datei am Ziel. Kennt %filename%, %filenamewithoutextension%, %extension% (der jeweiligen Datei) sowie %yyyy%, %MM%, %dd%, %HH%, %mm%, %ss%.

Source ist je nach Operation:

  • Upload: ein oder mehrere Pfade auf diesem PC, getrennt durch ;: eine Datei ({{FilePath}}), ein Ordner (seine Dateien, die zu Filter passen) oder ein Muster wie C:\Export\*.xml. Eine Datei oder ein Ordner, den es nicht gibt, ist ein Fehler.
  • Download, List, Delete: ein Pfad auf dem Server: eine Datei (/ausgang/auftrag.xml), ein Ordner (/ausgang, seine Dateien, die zu Filter passen) oder ein Muster (/ausgang/*.xml). Eine Datei oder ein Ordner, den es nicht gibt, ist ein Fehler; ein Muster, zu dem nichts passt, nicht. Ein Pfad ohne führenden / beginnt im Anmeldeordner.

Delete löscht nur Dateien, nie Ordner, und braucht eine Source. List listet die Dateien auf (mit Recursive auch die der Unterordner).

Platzhalter in Pfaden: {{FilePath}}, {{InitialData…}}, Konnektoren und %yyyy%, %MM%, %dd% (z. B. /archiv/%yyyy%/%MM%) werden vor der Übertragung ersetzt.

Fingerprint

Ohne Fingerprint nimmt die Aktion jeden SFTP-Server an, der unter der Adresse antwortet, und jeden FTPS-Server, dessen Zertifikat Windows vertraut. Mit Fingerprint nimmt sie nur diesen einen Server an und lehnt jeden anderen vor der Anmeldung ab; das Passwort erreicht also nie einen falschen Server.

  • SFTP: der Host-Schlüssel, wie ssh, WinSCP oder FileZilla ihn zeigen: SHA256:ohD8VZ… (die ältere MD5-Form aa:bb:cc:… geht auch).
  • FTPS: der SHA-256- oder SHA-1-Hash des Zertifikats in Hex (mit oder ohne Doppelpunkte). Ein so festgelegtes Zertifikat wird auch angenommen, wenn es selbst signiert ist.

Am einfachsten geht es im Playground: Verbinden zeigt den Fingerprint des Servers, und Diesen Fingerprint verwenden übernimmt ihn in die Aktion. Jeder Lauf schreibt ihn außerdem nach Meta.Fingerprint. Ändert sich der Schlüssel des Servers (neuer Server, neues Zertifikat), schlägt die Aktion mit einer entsprechenden Meldung fehl; tragen Sie dann den neuen Fingerprint ein.

Ergebnis

JSON
"Response": {
  "Results": [
    {
      "Source": "C:\\RUNOS\\Spooler\\…\\RE-2026-0001.xml",
      "Destination": "/eingang/rechnungen/RE-2026-0001.xml",
      "Size": 18342,
      "Status": "OK",
      "Message": ""
    }
  ],
  "SuccessCount": 1,
  "SkippedCount": 0,
  "ErrorCount": 0
},
"Meta": {
  "Host": "PC-01",
  "Protocol": "SFTP",
  "Server": "sftp.partner.de:22",
  "Fingerprint": "SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og"
}

Status ist OK, Skipped (gibt es schon, IfExists: Skip) oder Error mit dem Grund in Message. List liefert die Dateien stattdessen in Files, jede mit Name, Path, Size (Bytes, -1 wenn unbekannt) und Modified. Eine folgende Aktion liest sie als {{DateienAuflisten.Response.Files}}, z. B. in einem Loop.

Playground

Unter Playground in der Aktivitätsleiste (Aktion FTP) stellen Sie die Aktion zusammen und probieren sie am echten Server aus:

  1. Server: Protokoll, Server und Port (ein Wechsel des Protokolls setzt den üblichen Port). Unter Anmeldung wählen Sie einen Basic-Konnektor, dann stehen in der Aktion {{connector.Name.Username}} und {{connector.Name.Password}} statt des Passworts. Bei SFTP optional eine Schlüsseldatei, bei FTPS implizites TLS und das Annehmen nicht vertrauenswürdiger Zertifikate, bei FTP/FTPS der passive Modus.
  2. Verbinden verbindet sich und meldet sich genauso an wie die Aktion und zeigt den Anmeldeordner unter Dateien auf dem Server. Unter der Schaltfläche steht der Fingerprint des Servers; Diesen Fingerprint verwenden übernimmt ihn in die Aktion.
  3. Dateien auf dem Server: Doppelklick öffnet einen Ordner, der Pfeil geht eine Ebene nach oben, und Sie können einen Pfad eintippen und Enter drücken. Als Quelle übernimmt die gewählte Datei bzw. den Ordner (oder den angezeigten Ordner) als Source für Herunterladen, Auflisten und Löschen; Als Ziel als Zielordner für das Hochladen.
  4. Übertragung: Vorgang, Quelle (Durchsuchen… für Dateien auf diesem PC), Ziel (Durchsuchen… für einen lokalen Ordner beim Herunterladen), Filter, Unterordner, Verhalten bei vorhandener Datei, Verschieben und neuer Name. Rechts stehen Fehler und Warnungen, z. B. eine lokale Datei, die es nicht gibt, unverschlüsseltes FTP oder ein Server ohne Fingerprint.
  5. Ausführen führt die Aktion wirklich aus (fragt vorher, außer beim Auflisten) und zeigt eine Zeile pro Datei. Danach wird die Dateiliste des Servers neu geladen.
  6. Aktion kopieren legt das fertige Aktions-JSON in die Zwischenablage. Fügen Sie es unter Actions eines Workflows ein. Ist In der kopierten Aktion die Datei des Triggers ({{FilePath}}) statt dieser Dateien hochladen angehakt, steht bei Source {{FilePath}}, passend für Workflows mit Datei-Trigger.

Beispiel

Jede Rechnung an den Partner senden. Ein Datei-Trigger nimmt jede XRechnung aus dem Exportordner und lädt sie auf den SFTP-Server des Partners, in einen Ordner pro Monat. Drei Wiederholungen bei Netzwerkproblemen:

JSON
{
  "Name": "Rechnungen an Partner",
  "Autostart": true,
  "Trigger": { "Type": "File", "Name": "Export", "Parameters": { "Pool": "C:\\Export\\XRechnung", "Filter": "*.xml" } },
  "Actions": [
    {
      "Type": "FTP",
      "Name": "Hochladen",
      "OnErrorPolicy": { "Strategy": "RetryThenNotify", "MaxRetries": 3, "InitialDelaySeconds": 10 },
      "Parameters": {
        "Server": "{{connector.Partner.BaseUrl}}",
        "User": "{{connector.Partner.Username}}",
        "Password": "{{connector.Partner.Password}}",
        "Fingerprint": "SHA256:ohD8VZEXGWo6Ez8GSEJQ9WpafgLFsOfLOtGGQCQo6Og",
        "Operation": "Upload",
        "Source": "{{FilePath}}",
        "Destination": "/eingang/%yyyy%-%MM%",
        "IfExists": "Error"
      }
    }
  ]
}

Alle 15 Minuten Aufträge abholen. Alle neuen XML-Dateien aus dem ausgang des Partners herunterladen und dort entfernen (Move), in einen Ordner, den ein anderer Workflow überwacht. Weil Downloads unter einem vorläufigen Namen ankommen, sieht dieser Workflow nur vollständige Dateien:

JSON
{
  "Name": "Aufträge abholen",
  "Autostart": true,
  "Trigger": { "Type": "Time", "Name": "Alle15Min", "Parameters": { "CronExpression": "0 0/15 * * * ?" } },
  "Actions": [
    {
      "Type": "FTP",
      "Name": "Abholen",
      "Parameters": {
        "Protocol": "FTPS",
        "Server": "ftp.partner.de",
        "User": "{{connector.PartnerFtp.Username}}",
        "Password": "{{connector.PartnerFtp.Password}}",
        "Operation": "Download",
        "Source": "/ausgang/*.xml",
        "Destination": "C:\\Import\\Auftraege",
        "Move": true
      }
    }
  ]
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / PDFEditor

PDFEditor

Geplant

PDF-Dateien zusammenführen und aufteilen.

Übersicht

Mit PdfEditor sollen Workflows PDF-Dateien bearbeiten können, zum Beispiel Dateien zusammenführen oder aufteilen.

Ein ZUGFeRD-PDF aus einem vorhandenen Rechnungs-PDF erzeugt bereits die Aktion XRechnung.

Struktur

Für diese geplante Aktion ist noch keine Parameterstruktur veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

Beispiel

Für diese geplante Aktion ist noch kein ausführbares Beispiel veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / SMB

SMB

Geplant

Dateien auf Windows-Netzwerkfreigaben verarbeiten.

Übersicht

Mit SMB sollen Workflows Dateien auf Windows-Netzwerkfreigaben kopieren und verschieben können.

Bis dahin kann die XRechnung-Aktion ihre Dateien mit SaveToFolder und OutputFolder direkt in einem Ordner ablegen, auch auf einem Netzlaufwerk.

Struktur

Für diese geplante Aktion ist noch keine Parameterstruktur veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

Beispiel

Für diese geplante Aktion ist noch kein ausführbares Beispiel veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / Run

Run

Geplant

Programme, Befehle und Skripte starten.

Übersicht

Mit Run sollen Workflows ein Programm, einen Befehl oder ein Skript starten können.

Struktur

Für diese geplante Aktion ist noch keine Parameterstruktur veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

Beispiel

Für diese geplante Aktion ist noch kein ausführbares Beispiel veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / IoT

IoT

Geplant

Geräte anbinden und Messwerte lesen.

Übersicht

Mit IOT sollen Workflows Geräte im Netzwerk ansteuern und ihre Werte lesen können.

Geräte mit einer HTTP-Schnittstelle (REST) erreichen Sie schon heute mit HTTPRequest.

Struktur

Für diese geplante Aktion ist noch keine Parameterstruktur veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

Beispiel

Für diese geplante Aktion ist noch kein ausführbares Beispiel veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Aktionen / AI

AI

Geplant

Texte und Dokumente mit KI verarbeiten.

Übersicht

Mit AI sollen Workflows Texte und Dokumente mit einem KI-Modell verarbeiten können, zum Beispiel Daten aus einem Beleg auslesen oder eine Antwort formulieren.

KI-Dienste mit REST-API (z. B. OpenAI) erreichen Sie schon heute mit HTTPRequest und einem ApiKey-Konnektor; die Konnektor-Vorlage OpenAI gibt es bereits.

Struktur

Für diese geplante Aktion ist noch keine Parameterstruktur veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

Beispiel

Für diese geplante Aktion ist noch kein ausführbares Beispiel veröffentlicht. Die Referenz wird mit der Veröffentlichung ergänzt.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Operationen / IF

IF

Den nächsten Schritt von einer Bedingung abhängig machen.

Übersicht

Die Operation If prüft eine Bedingung und führt dann die Aktionen in Do aus, oder, wenn die Bedingung nicht zutrifft, die in Else. Do und Else enthalten Aktionen mit demselben Aufbau wie Actions, auch weitere If oder Loop. Ihre Namen müssen im ganzen Workflow eindeutig sein; ihre Ergebnisse sind danach wie gewohnt über den Namen erreichbar.

Eine Bedingung vergleicht einen Wert links mit einem festen Wert rechts: {{Pfad}} Operator Wert.

OperatorBedeutungFür
==, !=gleich, ungleichZahlen, Texte, Wahrheitswerte
>, <, >=, <=größer, kleiner …nur Zahlen
&&, ||und, odermehrere Vergleiche
  • Links steht ein Platzhalter (oder ein Wert), rechts ein fester Wert. Platzhalter rechts werden nicht ersetzt.
  • Zahlen werden auch als Text erkannt, mit Punkt oder Komma: "1234,50" und "1234.50" ja, "1.234,50" nicht.
  • Texte rechts in Anführungszeichen: {{Land}} == "DE". Groß- und Kleinschreibung zählt.
  • Wahrheitswerte: == true nur bei echten Wahrheitswerten. Aus einer HTTP-Antwort kommen sie als Text; vergleichen Sie dann mit "true".
  • Kann der Platzhalter links nicht aufgelöst werden, ist der Vergleich falsch, auch bei !=.
  • && und || lassen sich mischen, aber nicht klammern: a && b || c bedeutet „(a und b) oder c“.

Struktur

JSON
{
  "Type": "If",
  "Name": "GrosseRechnung",
  "Parameters": {
    "Condition": "{{InitialData.Invoice.BG22.BT112}} > 1000",
    "Do": [ { "Type": "SMTP", "Name": "FreigabeAnfordern", "Parameters": { … } } ],
    "Else": [ { "Type": "SMTP", "Name": "DirektSenden", "Parameters": { … } } ]
  }
}
ParameterBedeutung
ConditionDie Bedingung
DoAktionen, die laufen, wenn die Bedingung zutrifft
ElseAktionen, die sonst laufen (optional)

Ergebnis

JSON
"Response": {
  "ExecutedBranch": "If",
  "SuccessCount": 1,
  "ErrorCount": 0,
  "Condition": "{{InitialData.Invoice.BG22.BT112}} > 1000"
}

ExecutedBranch ist If (Do lief), Else oder None (Bedingung falsch und kein Else). Welchen Wert RUNOS verglichen hat, steht im Protokoll unter ConditionEvaluated.

Schlägt eine Aktion in Do oder Else fehl, laufen die restlichen Aktionen des Zweigs nicht mehr, und das If schlägt mit deren Fehlermeldung fehl. Danach gilt die Fehlerrichtlinie des If; mit RetryThenNotify wird der ganze Zweig wiederholt.

Workflow anhalten mit StopWorkflow

Die Aktion StopWorkflow beendet den aktuellen Lauf sofort und stoppt danach den Workflow. Es starten keine neuen Läufe mehr, auch nicht nach einem Neustart von RUNOS, bis Sie ihn in der Liste wieder starten. Bei Ausführen im Editor endet nur der Lauf.

JSON
{ "Type": "StopWorkflow", "Name": "Anhalten", "Parameters": { "Reason": "Fehler bei {{Error.Action}}: {{Error.Message}}" } }
ParameterBedeutung
ReasonBegründung für das Protokoll, mit Platzhaltern. Ohne Angabe: „Stopped by action.“ Das Ergebnis enthält sie als Response.Reason.

StopWorkflow funktioniert überall: in einem If, in einer Loop oder am Ende von OnError, damit nach einer Fehlermeldung nicht jede weitere Datei am selben Problem scheitert.

Beispiel

FrageBedingung
Hat ein Wert einen Inhalt?{{InitialData.Email}} != ""
Ist eine Liste nicht leer?{{Abfrage.Response.Results.Body.items.count}} > 0
War eine Aktion erfolgreich?{{Senden.Response.Results.Status}} == "OK"
Betrag und Land{{Betrag}} > 1000 && {{Land}} == "DE"
Einer von zwei Werten{{Status}} == "Fehler" || {{Status}} == "Abgelehnt"

Rechnungen ohne Empfängeradresse nicht senden, sondern melden und den Workflow anhalten. Der Workflow enthält "InitialData": { "Email": "" }, ein Skriptblock in der Datei setzt die Adresse. Ohne diesen Vorgabewert wäre {{InitialData.Email}} nicht auflösbar und der Vergleich immer falsch.

JSON
{
  "Type": "If",
  "Name": "EmpfaengerFehlt",
  "Parameters": {
    "Condition": "{{InitialData.Email}} == \"\"",
    "Do": [
      { "Type": "SMTP", "Name": "Melden", "Parameters": { "To": "buchhaltung@example.com", "Subject": "Rechnung {{FileName}} ohne Empfänger", "Body": "…" } },
      { "Type": "StopWorkflow", "Name": "Anhalten", "Parameters": { "Reason": "Empfänger fehlt in {{FileName}}" } }
    ],
    "Else": [
      { "Type": "SMTP", "Name": "RechnungSenden", "Parameters": { "To": "{{InitialData.Email}}", "Attachments": "{{FilePath}}", "Body": "…" } }
    ]
  }
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Operationen / Loop

Loop

Aktionen für mehrere Datensätze wiederholen.

Übersicht

Die Operation Loop führt die Aktionen in Do einmal für jedes Element von Items aus, zum Beispiel für jede Zeile einer CSV-Datei oder jeden Eintrag einer API-Antwort.

ItemsDurchläufeitem
eine Zahl, z. B. 55{{item.value}} = 1 … 5
Range(10,15)6{{item.value}} = 10 … 15
eine JSON-Liste, z. B. ["a","b"] oder {{Abfrage.Response.Results.Body.items}}je ElementObjekte bleiben Objekte ({{item.id}}), einfache Werte stehen in {{item.value}}
Pfad einer .json-Datei mit einer Listeje Elementwie oben
Pfad einer .csv-Datei oder CSV-Text über mehrere Zeilenje Zeile{{item.<Spaltenname>}}
irgendetwas anderes1{{item.value}} = der Text

CSV: Trennzeichen ist ;, wenn die erste Zeile eines enthält, sonst ,. Die erste Zeile ist die Kopfzeile, außer eine ihrer Zellen ist eine ganze Zahl; ohne Kopfzeile heißen die Spalten col0, col1, … Werte in Anführungszeichen mit Trennzeichen darin werden nicht unterstützt.

Struktur

JSON
{
  "Type": "Loop",
  "Name": "JedenKundenAnschreiben",
  "Parameters": {
    "Items": "C:\\RUNOS\\Daten\\kunden.csv",
    "Do": [ { "Type": "SMTP", "Name": "Anschreiben", "Parameters": { … } } ],
    "MaxLoopCount": 100,
    "BreakOnErrors": 3,
    "DelayMs": 1000
  }
}
ParameterStandardBedeutung
Items–Was durchlaufen wird, siehe oben
Do–Aktionen je Durchlauf
MaxLoopCountalleHöchstens so viele Durchläufe
BreakOnErrorsunbegrenztNach so vielen fehlgeschlagenen Durchläufen abbrechen; die Schleife endet dann als fehlgeschlagen
DelayMs–Pause nach jedem Durchlauf in Millisekunden
Platzhalter im DurchlaufInhalt
{{item}}das aktuelle Element (immer ein Objekt)
{{item.value}}der Wert bei einfachen Elementen
{{index}}Position, beginnend bei 0
{{count}}Anzahl aller Elemente

Das Ergebnis einer Aktion in Do steht unter ihrem Namen und wird bei jedem Durchlauf überschrieben; nach der Schleife enthält es den letzten Durchlauf. Verschachtelte Schleifen teilen sich item, index und count: In der inneren Schleife beziehen sie sich auf deren Element.

Ergebnis

JSON
"Response": {
  "Results": [ { … Ergebnis jeder Aktion jedes Durchlaufs … } ],
  "ExecutedCount": 12,
  "ErrorCount": 0,
  "StopReason": "Completed"
}

StopReason ist Completed, BreakOnErrors oder StopWorkflow (eine StopWorkflow-Aktion in Do hat Schleife und Lauf beendet).

Schlägt eine Aktion in Do fehl, werden die restlichen Aktionen dieses Durchlaufs übersprungen, und der Fehler wird mit der Nummer des Elements in Status.Errors und ErrorCount vermerkt. Die Schleife macht mit dem nächsten Element weiter, bis BreakOnErrors erreicht ist. Ein Lauf mit Fehlern in einzelnen Durchläufen erscheint in der Workflow-Liste rot.

Beispiel

kunden.csv:

TEXT
Name;Email;Kundennummer
Muster GmbH;info@muster.de;1001
Beispiel AG;post@beispiel.de;1002
JSON
{
  "Type": "Loop",
  "Name": "JedenKundenAnschreiben",
  "Parameters": {
    "Items": "C:\\RUNOS\\Daten\\kunden.csv",
    "DelayMs": 1000,
    "BreakOnErrors": 3,
    "Do": [
      {
        "Type": "SMTP",
        "Name": "Anschreiben",
        "Parameters": {
          "SmtpServer": "smtp.example.com",
          "SmtpUser": "{{connector.Mailserver.Username}}",
          "SmtpPassword": "{{connector.Mailserver.Password}}",
          "From": "service@example.com",
          "To": "{{item.Email}}",
          "Subject": "Ihre Kundennummer {{item.Kundennummer}}",
          "Body": "Guten Tag {{item.Name}},\n\nIhre Kundennummer lautet {{item.Kundennummer}}."
        }
      }
    ]
  }
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Operationen / AI

AI

Geplant

Geplante KI-Operation für Workflows.

Übersicht

Mit der Operation AI soll ein KI-Modell entscheiden können, welcher Weg im Workflow genommen wird, zum Beispiel anhand des Inhalts einer Mail oder eines Belegs.

Bis dahin entscheiden Sie mit IF anhand fester Bedingungen.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Konnektoren / None

None

Gemeinsame Werte ohne Authentifizierung verwalten.

Übersicht

Ein Konnektor speichert, wie RUNOS einen Dienst erreicht: Adresse und Zugangsdaten. Workflows verweisen über den Namen darauf, so stehen keine Geheimnisse im Workflow-JSON, und ein geändertes Passwort pflegen Sie an einer Stelle.

Auth-TypFürSeite
NoneDienste ohne Anmeldung, oder nur gemeinsame Wertediese Seite
ApiKeyAPI-Schlüssel, z. B. OpenAI, GitHub, Odoo, WetterdiensteApiKey
BasicBenutzername und Passwort, z. B. SMTP-Server, interne APIs, FTPBasic
OAuth2Anmeldung im Browser, z. B. Microsoft 365, GmailOAuth2

Ein Konnektor vom Typ None hat keine Zugangsdaten. Er speichert nur die Basis-URL und unter Erweitert → Extra JSON beliebige eigene Werte, etwa eine Mandantennummer oder eine Region. Nützlich für öffentliche APIs und für Werte, die mehrere Workflows teilen.

Konnektor anlegen

  1. Öffnen Sie links Konnektoren und klicken Sie auf Neu.
  2. Wählen Sie Leerer Konnektor oder eine Vorlage.
  3. Vergeben Sie einen Namen ohne Leerzeichen, zum Beispiel Wetter. Über diesen Namen sprechen Workflows den Konnektor an.
  4. Wählen Sie den Auth-Typ, füllen Sie die Felder aus und klicken Sie auf Speichern.

Testen sendet eine angemeldete Anfrage an die Basis-URL und zeigt die Antwort. Der Status oben zeigt Bereit, Token läuft bald ab, Token abgelaufen, Zugangsdaten fehlen oder Keine Authentifizierung. Duplizieren legt eine Kopie an, zum Beispiel für ein zweites Postfach.

VorlageAuth-Typ
Microsoft Outlook Mail, Outlook ContactsOAuth2 (Microsoft Graph)
Azure Service PrincipalOAuth2 Client Credentials
Gmail APIOAuth2 (Google)
GitHub, OpenAI, OpenWeatherMapApiKey
FTP Server, Internal REST APIBasic

Sicherheit

Mit Geheimnisse verschlüsseln (Standard) speichert RUNOS API-Schlüssel, Passwörter, Client Secret und Tokens verschlüsselt für den angemeldeten Windows-Benutzer. Ein anderer Benutzer oder ein anderer PC kann sie nicht lesen; auf einem neuen PC geben Sie sie neu ein.

Struktur

Unter In einem Workflow verwenden zeigt RUNOS den Platzhalter und kopiert ihn auf Klick:

TEXT
{{connector.<Name>.<Feld>}}
FeldInhaltAuth-Typ
BaseUrlBasis-URLalle
ExtraJson.<Schlüssel>eigene Werte aus Extra JSONalle
ApiKeyAPI-SchlüsselApiKey
Username, PasswordZugangsdatenBasic
AccessTokenOAuth2-Zugriffstoken, wird bei Bedarf erneuertOAuth2

Extra JSON ist ein JSON-Objekt:

JSON
{ "Mandant": "4711", "Region": "eu" }

Beispiel

Konnektor Wetter, Auth-Typ None, Basis-URL https://api.open-meteo.com/v1, Extra JSON { "Lat": "52.52", "Lon": "13.41" }:

JSON
{
  "Type": "HttpRequest",
  "Name": "WetterAbfragen",
  "Parameters": {
    "Url": "{{connector.Wetter.BaseUrl}}/forecast",
    "QueryParameters": {
      "latitude": "{{connector.Wetter.ExtraJson.Lat}}",
      "longitude": "{{connector.Wetter.ExtraJson.Lon}}",
      "current_weather": "true"
    }
  }
}

Ändert sich der Standort, passen Sie nur den Konnektor an; alle Workflows übernehmen den neuen Wert beim nächsten Lauf.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Konnektoren / ApiKey

ApiKey

Dienste mit einem API-Schlüssel authentifizieren.

Übersicht

Viele Dienste vergeben einen API-Schlüssel, den jede Anfrage in einem Header mitschickt. Ein Konnektor vom Typ ApiKey speichert den Schlüssel verschlüsselt, zusammen mit dem Header und dem Präfix, die der Dienst erwartet. Wie Sie einen Konnektor anlegen, steht unter None.

Den Schlüssel erzeugen Sie beim Dienst selbst, meist unter Einstellungen → API oder Profil → API-Schlüssel.

Struktur

FeldBedeutung
API keyder Schlüssel (verschlüsselt gespeichert)
HeaderName des Headers, Standard Authorization; z. B. x-api-key
SchemePräfix vor dem Schlüssel, wenn der Header Authorization ist, z. B. Bearer oder token
Base URLAdresse der API, für Testen und als {{connector.<Name>.BaseUrl}}

Testen sendet den Schlüssel so, wie Header und Scheme es festlegen: Authorization: Bearer <Schlüssel>, oder x-api-key: <Schlüssel>.

In der Aktion HTTPRequest setzen Sie den Header selbst und holen nur den Schlüssel aus dem Konnektor:

Der Dienst erwartetIn der Aktion
Authorization: Bearer <Schlüssel>"AuthType": "Bearer", "AuthToken": "{{connector.<Name>.ApiKey}}"
X-API-KEY: <Schlüssel>"AuthType": "ApiKey", "AuthToken": "{{connector.<Name>.ApiKey}}"
einen anderen Header"Headers": { "x-api-key": "{{connector.<Name>.ApiKey}}" }

Beispiel

Konnektor OpenAI aus der Vorlage OpenAI: Header Authorization, Scheme Bearer, Basis-URL https://api.openai.com/v1/. Eine Zusammenfassung des gelesenen PDF-Textes anfordern:

JSON
{
  "Type": "HttpRequest",
  "Name": "Zusammenfassen",
  "Parameters": {
    "Url": "{{connector.OpenAI.BaseUrl}}chat/completions",
    "Method": "POST",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.OpenAI.ApiKey}}",
    "Timeout": 60000,
    "Body": {
      "Value": {
        "model": "gpt-4o-mini",
        "messages": [
          { "role": "user", "content": "Fasse diesen Text in drei Sätzen zusammen:\n{{FileContent}}" }
        ]
      }
    }
  }
}

Die Antwort steht in {{Zusammenfassen.Response.Results.Body.choices.0.message.content}}. Ein weiteres Beispiel mit API-Schlüssel ist Odoo Contacts.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Konnektoren / Basic

Basic

Benutzername und Passwort zentral hinterlegen.

Übersicht

Ein Konnektor vom Typ Basic speichert Benutzername und Passwort, das Passwort verschlüsselt. Das ist der richtige Ort für jedes Passwort, das ein Workflow braucht: das Postfach für SMTP, den Zugang zu einer internen REST-API oder einem FTP-Server. Wie Sie einen Konnektor anlegen, steht unter None.

Struktur

FeldBedeutungPlatzhalter
UsernameBenutzername{{connector.<Name>.Username}}
PasswordPasswort (verschlüsselt gespeichert){{connector.<Name>.Password}}
Base URLAdresse des Dienstes{{connector.<Name>.BaseUrl}}

Testen meldet sich wirklich an, wenn die Basis-URL eine Serveradresse ist (smtp://, imap://, ftp://, ftps://, sftp://, z. B. sftp://sftp.partner.de:22); bei jeder anderen Adresse sendet es eine Anfrage mit Authorization: Basic … an die Basis-URL.

Beispiel

Mailserver für SMTP. Konnektor Mailserver, Auth-Typ Basic, Benutzername rechnung@example.com, Passwort des Postfachs:

JSON
{
  "Type": "SMTP",
  "Name": "Senden",
  "Parameters": {
    "SmtpServer": "smtp.example.com",
    "SmtpUser": "{{connector.Mailserver.Username}}",
    "SmtpPassword": "{{connector.Mailserver.Password}}",
    "From": "{{connector.Mailserver.Username}}",
    "To": "kunde@example.com",
    "Subject": "Ihre Rechnung",
    "Body": "Guten Tag,\n\nanbei Ihre Rechnung.",
    "Attachments": "{{FilePath}}"
  }
}

Interne REST-API mit Basic-Anmeldung. Konnektor Intern aus der Vorlage Internal REST API:

JSON
{
  "Type": "HttpRequest",
  "Name": "Auftraege",
  "Parameters": {
    "Url": "{{connector.Intern.BaseUrl}}orders",
    "AuthType": "Basic",
    "AuthToken": "{{connector.Intern.Username}}:{{connector.Intern.Password}}"
  }
}

SFTP-Server für FTP. Konnektor Partner, Basis-URL sftp://sftp.partner.de, Benutzername und Passwort des Zugangs. Die Aktion FTP nimmt Protokoll, Host und Port aus der Basis-URL:

JSON
{
  "Type": "FTP",
  "Name": "Hochladen",
  "Parameters": {
    "Server": "{{connector.Partner.BaseUrl}}",
    "User": "{{connector.Partner.Username}}",
    "Password": "{{connector.Partner.Password}}",
    "Operation": "Upload",
    "Source": "{{FilePath}}",
    "Destination": "/eingang"
  }
}
RUNOS Dokumentation · SystembergZur Übersicht ↑
Konnektoren / OAuth2

OAuth2

Dienste über OAuth 2.0 verbinden.

Übersicht

Mit OAuth2 melden Sie sich einmal im Browser beim Anbieter an; RUNOS bekommt dafür ein Zugriffstoken und ein Erneuerungstoken und erneuert den Zugriff danach selbst. Ein Passwort speichert RUNOS dabei nicht. So arbeiten Microsoft 365, Outlook.com und Google (Gmail). Wie Sie einen Konnektor anlegen, steht unter None.

OAuth-FlowWann
Authorization CodeEin Benutzer meldet sich im Browser an, z. B. mit seinem Postfach. Für MS365 und Gmail.
Client CredentialsEin Dienstkonto ohne Benutzer, z. B. eine App-Registrierung in Microsoft Entra (Vorlage Azure Service Principal). Es gibt keine Browser-Anmeldung; RUNOS holt das Token mit Client ID und Client Secret.

Anmelden: Bei Authorization Code klicken Sie auf Im Browser anmelden. RUNOS öffnet die Anmeldeseite des Anbieters und wartet an der Redirect URI (Standard http://localhost:5000/) auf die Rückmeldung. Danach sind Access- und Refresh-Token gespeichert.

Erneuern: RUNOS erneuert das Token automatisch, wenn ein Workflow den Konnektor verwendet und das Token in weniger als einer Minute abläuft. Mit Token erneuern fordern Sie sofort ein neues an. Lässt sich das Token nicht mehr erneuern (Passwort geändert, Zugriff widerrufen), zeigt der Status Token abgelaufen; melden Sie sich dann erneut an.

Struktur

FeldBedeutung
Client ID, Client secretKennung und Geheimnis der Anwendung beim Anbieter (für Microsoft-Vorlagen ist die Client ID vorbelegt)
ScopesBerechtigungen, getrennt durch Leerzeichen, z. B. offline_access Mail.Send
Auth endpoint, Token endpointAdressen des Anbieters für Anmeldung und Token
Redirect URIAdresse, an der RUNOS die Anmeldung entgegennimmt; muss beim Anbieter eingetragen sein
OAuth flowAuthorization Code oder Client Credentials
Access token, Refresh token, Expiresnach der Anmeldung: die Tokens (verschlüsselt) und ihr Ablauf

Im Workflow nutzen Sie das Zugriffstoken:

JSON
"AuthType": "Bearer",
"AuthToken": "{{connector.<Name>.AccessToken}}"

Die Aktion Outlook365 bekommt nur den Namen des Konnektors ("Connector": "OutlookMail") und kümmert sich selbst um die Anmeldung.

Beispiel

Microsoft 365, Benutzer meldet sich an. Vorlage Microsoft Outlook Mail, Name OutlookMail, Im Browser anmelden. Danach die eigenen Kalendereinträge der nächsten Tage lesen (dafür in den Scopes Calendars.Read ergänzen und erneut anmelden):

JSON
{
  "Type": "HttpRequest",
  "Name": "Termine",
  "Parameters": {
    "Url": "https://graph.microsoft.com/v1.0/me/events?$select=subject,start,end&$top=20",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.OutlookMail.AccessToken}}",
    "AutoPagination": true
  }
}

Dienstkonto mit Client Credentials. Vorlage Azure Service Principal: In Microsoft Entra eine App registrieren, Anwendungsberechtigungen (z. B. User.Read.All) erteilen und mit Administratorzustimmung bestätigen; Client ID, Client Secret und im Token endpoint die Mandanten-ID eintragen. Scope https://graph.microsoft.com/.default.

JSON
{
  "Type": "HttpRequest",
  "Name": "Benutzer",
  "Parameters": {
    "Url": "https://graph.microsoft.com/v1.0/users?$select=displayName,mail",
    "AuthType": "Bearer",
    "AuthToken": "{{connector.Entra.AccessToken}}",
    "AutoPagination": true
  }
}

Mit Client Credentials gibt es kein me; Sie sprechen Benutzer und Postfächer über ihre Adresse an, z. B. /users/info@example.com/messages.

RUNOS Dokumentation · SystembergZur Übersicht ↑
Einstellungen / PDF-Drucker

PDF-Drucker

PDF24 als Eingang für automatisierte Prozesse einrichten.

Viele Programme, etwa ein ERP oder eine Warenwirtschaft, können Belege nur drucken. RUNOS arbeitet aber mit Dateien in einem Ordner. Die Brücke ist ein PDF-Drucker: Er erscheint in jedem Programm als normaler Drucker, schreibt aber ein PDF in einen Ordner. Diesen Ordner überwacht ein File-Trigger.

RUNOS verwendet dafür den kostenlosen PDF24 Creator. Sie richten ihn einmal ein; danach landet jeder Druck auf diesem Drucker ohne Rückfrage als PDF im Ordner, und RUNOS verarbeitet ihn.

TEXT
ERP: Drucken auf „RUNOS“ ──▶ PDF24 speichert C:\RUNOS\Rechnungen\2026-10-08 14-05-09 Rechnung.pdf ──▶ File-Trigger ──▶ Workflow

1. PDF24 installieren

Laden Sie den PDF24 Creator von tools.pdf24.org herunter und installieren Sie ihn. Dabei wird der Drucker PDF24 angelegt.

2. Einstellungen öffnen

Öffnen Sie die PDF24 Toolbox und darin die Einstellungen, Bereich PDF-Drucker.

3. Einen eigenen Drucker für RUNOS anlegen

Klicken Sie oben neben der Druckerauswahl auf + und legen Sie einen zweiten PDF-Drucker an, zum Beispiel mit dem Namen RUNOS. So bleibt der normale Drucker PDF24 unverändert, und nur Drucke auf RUNOS gehen an den Workflow. Wählen Sie oben den neuen Drucker aus, bevor Sie weitermachen.

4. Automatisch speichern einstellen

So sollen die Einstellungen aussehen (englische Oberfläche):

PDF24-Einstellungen: PDF Printer Tool auf „Automatically save documents after printed“, Output Directory C:\Users<user>\pool, Filename „%Y-%m-%d %H-%M-%S $fileName“, Profil „Best quality“, alle Häkchen darunter aus

EinstellungWertWarum
PDF-Drucker-WerkzeugDokumente nach dem Drucken automatisch speichern (Automatically save documents after printed)Kein Dialog, kein Assistent: Jeder Druck wird sofort als Datei gespeichert.
Erstellte PDF-Dateien im Creator öffnen, wenn die Anwendung geöffnet istausSonst öffnet sich ein Fenster statt zu speichern.
Ausgabeverzeichnis (Output Directory)der Pool des File-Triggers, z. B. C:\RUNOS\RechnungenGenau diesen Ordner überwacht RUNOS. Keine Platzhalter wie %Y im Ordner, der Pool ist ein fester Ordner.
Dateiname (Filename)%Y-%m-%d %H-%M-%S $fileNameDatum und Uhrzeit vor dem Dokumentnamen machen jeden Dateinamen eindeutig.
Profil (Profile)Beste Qualität (Best quality)Der Text bleibt als Text im PDF; nur so kann RUNOS Skriptblöcke lesen.
Fortschritt beim Speichern anzeigenaus
Ordner nach dem Speichern öffnenausSonst öffnet sich bei jedem Druck ein Explorer-Fenster.
Vorhandene Datei überschreibenausEine Datei, die RUNOS noch nicht abgeholt hat, darf nicht überschrieben werden.
Dateinamen vor dem Speichern abfragenausDer Druck soll ohne Rückfrage durchlaufen.
Folgenden Befehl nach dem Speichern ausführenausDie Verarbeitung übernimmt RUNOS.

Die Platzhalter im Dateinamen: %Y Jahr, %m Monat, %d Tag, %H Stunde, %M Minute, %S Sekunde, $fileName Name des Dokuments, den das druckende Programm übergibt. Speichern Sie die Einstellungen.

5. Den Workflow darauf ausrichten

Der Pool des File-Triggers ist das Ausgabeverzeichnis aus Schritt 4, der Filter *.pdf:

JSON
"Trigger": {
  "Type": "File",
  "Name": "Rechnungsdruck",
  "Parameters": {
    "Pool": "C:\\RUNOS\\Rechnungen",
    "Filter": "*.pdf",
    "CronExpression": "0/10 * * * * ?"
  }
}

Der File-Trigger wartet, bis PDF24 die Datei vollständig geschrieben hat, und verschiebt sie dann in seinen Spooler. Der Ordner bleibt so leer, und PDF24 kann jederzeit weiter hineinschreiben.

6. Im Programm den Drucker wählen und testen

  1. Wählen Sie im ERP (bzw. im Programm, aus dem gedruckt wird) den Drucker RUNOS, zum Beispiel für das Rechnungsformular.
  2. Öffnen Sie den Workflow in RUNOS und klicken Sie auf Lauschen.
  3. Drucken Sie einen Beleg. Nach wenigen Sekunden erscheint im Protokoll TriggerFired mit dem Dateinamen und, wenn vorhanden, den gefundenen Skriptblöcken.

Wie Sie daraus eine geprüfte XRechnung machen, zeigt das XRechnung-Beispiel.

Wenn es nicht klappt

ProblemUrsache und Lösung
Beim Drucken öffnet sich ein PDF24-FensterFür diesen Drucker ist nicht Automatisch speichern eingestellt, oder oben war beim Einstellen ein anderer Drucker gewählt.
Es kommt keine Datei im Ordner anDas Ausgabeverzeichnis stimmt nicht mit dem Pool überein, oder die Einstellung gilt nur für einen anderen Windows-Benutzer (siehe Schritt 2).
Die Datei kommt an, aber der Workflow startet nichtLäuft der Workflow (Liste zeigt Stoppen)? Passt der Filter?
Skriptblöcke werden nicht gefundenDas PDF enthält keinen Text. Profil Beste Qualität wählen; das Formular darf die Zeilen nicht als Grafik drucken.
RUNOS Dokumentation · SystembergZur Übersicht ↑