Node-RED
Daten lesen und schreiben, auf Änderungen reagieren, Buchungszeitplan, Check-in am Leser und eigene Schlösser mit node-red-contrib-inwendo-erp.
Das Paket node-red-contrib-inwendo-erp verbindet Node-RED mit vynst (inwendo ERP). Es eignet sich besonders für Technik vor Ort: Relais, Türöffner, Shelly, GPIO, Kartenleser, Thermostate. Node-RED kann hinter einem normalen Router laufen; Befehle von vynst kommen über den MQTT-Broker von vynst an.
Installation
cd ~/.node-red
npm install node-red-contrib-inwendo-erp
Oder im Editor über Palette verwalten → Installieren. Nötig ist Node.js 18 oder neuer.
Nodes
| Node | Wofür |
|---|---|
| inwendo-erp-config | Adresse eurer Instanz und API-Token; „Test token“ prüft ihn |
| inwendo erp | Daten lesen, anlegen, ändern, PDFs laden: Buchung, Firma, Veranstaltung, Anmeldung, Rechnung, News, Angebot, Person, Projekt, Schloss, Ticket, Zeiteintrag, Ausleihe, Anwesenheitsliste, Schicht, Belegung, Zähler, Benachrichtigung, dazu freie API-Aufrufe |
| inwendo erp trigger | startet einen Flow, wenn in vynst etwas angelegt, geändert oder gelöscht wird |
| inwendo erp booking schedule | startet einen Flow vor, zu Beginn, zum Ende und nach einer Buchung |
| inwendo erp check-in | Karten- oder QR-Leser: Check-in in eine Anwesenheitsliste oder Stempeluhr für Mitarbeiter |
| inwendo-erp-lock-bridge, inwendo erp lock, inwendo erp lock result | eigene Schlösser in vynst anbieten |
| inwendo erp access check | prüft bei vynst, ob ein gelesener Code die Tür öffnen darf |
Fehler von vynst werfen die Nodes mit Fehlercode und Text (X-IW-ERROR-CODE, X-IW-ERROR-JSON); fangt sie mit einem catch-Node.
API-Token
Legt einen langlebigen Token unter Einstellungen → API-Zugänge an. Je nach Nodes braucht er:
| Funktion | Recht |
|---|---|
| Schlösser, Zutrittsprüfung | Veranstaltungen (event) schreiben |
| Trigger, Buchungszeitplan über vynst | Webhook schreiben |
| Buchungszeitplan, den Node-RED selbst liest | Buchungen (event_booking) lesen |
| Check-in Anwesenheitsliste / Stempeluhr | Anwesenheits-Scanner (eas) / Arbeitszeit-Scanner (wtes) schreiben |
| inwendo erp | die Rechte der genutzten Bereiche |
Beschränkt den Token am besten auf den Pfad /api/nodered/.* plus die Bereiche, die eure Flows lesen.
Auf Änderungen reagieren
Der Trigger meldet beim Deploy einen Webhook an (POST /api/nodered/webhook) und bekommt Ereignisse auf zwei Wegen:
| Zustellung | Wann |
|---|---|
| HTTPS | Node-RED ist öffentlich per https erreichbar; vynst ruft <öffentliche URL>/inwendo-erp/webhook/<Node-ID> auf |
| MQTT von vynst | keine öffentliche Adresse; vynst gibt Zugangsdaten für seinen Broker (wss), der Node meldet sich alle 24 Stunden neu an. Einstellung integration_mqtt_trigger_enabled |
Änderungen, die Node-RED selbst macht, schickt vynst nicht zurück: die Nodes senden X-IW-Trigger-Source: nodered.
Buchungszeitplan
Für Heizung, Licht und Türen zur richtigen Zeit:
{
"type": "booking_start",
"due_at": "2026-10-11T18:00:00+02:00",
"booking_id": 123,
"booking_title": "Training U12",
"bookable_id": 7,
"bookable_name": "Halle 1",
"participants": 14,
"pre_start_minutes": 30,
"post_end_minutes": 15
}
Typen sind booking_pre_start, booking_start, booking_end und booking_post_end. Am zuverlässigsten schickt vynst die Ereignisse selbst (Einstellung integration_booking_timed_events_enabled). vynst prüft jede Minute, schickt nie doppelt und überspringt abgesagte Buchungen. Vorlauf und Nachlauf kommen aus den Feldern automation_pre_start_minutes und automation_post_end_minutes des Raums, sonst aus den Einstellungen (30 und 15 Minuten). Ohne die Einstellung liest Node-RED die Buchungen selbst.
Check-in am Eingang
Der Leser liefert eine Kartennummer, Mitgliedsnummer oder den QR-Code der digitalen Mitgliedskarte:
| Modus | Aufruf | Ergebnis |
|---|---|---|
| Anwesenheitsliste | GET /api/event/scanner/attendancelist/{liste}/{person} |
check_in oder check_out (nicht innerhalb von 60 Sekunden) |
| Stempeluhr | GET /api/time/work_entry_scanner/{person} |
clock_in oder clock_out |
Abgelehnte Scans kommen am zweiten Ausgang mit Grund an, etwa unknown_person, scanned_too_often oder no_employment_contract.
Eigene Schlösser
- Einen inwendo erp lock-Node anlegen und eine lock bridge dafür. Instanz-ID und Schlüssel entstehen automatisch.
- Jedem Schloss eine eindeutige Lock ID und den Namen in vynst geben. In der App erscheint ein Öffnen-Knopf oder ein QR-Code, den ein Scanner an der Tür prüft.
- Deployen. Die Bridge meldet ihre Schlösser bei vynst an (
/api/nodered/smart_lock/register). In vynst erscheint eine Smartlock-Verbindung vom Anbieter Node-RED. Dort einmal Geräte synchronisieren und Rechte vergeben. - Den Ausgang des Lock-Nodes an euer Relais hängen. Den Zustand (
locked,unlocked,open,jammed) meldet ihr über den Eingang zurück.
| Zustellung | Wann | Wie |
|---|---|---|
| MQTT (Standard) | hinter NAT | vynst gibt Lesezugriff nur auf das Topic dieser Bridge, alle 10 Minuten erneuert; Ergebnis per https zurück |
| Push | Node-RED per https erreichbar | vynst ruft <öffentliche URL>/inwendo-erp/lock/<Instanz-ID> auf |
Jeder Befehl ist mit HMAC-SHA256 signiert (X-IW-Signature), trägt Zeitstempel und Nonce und wird höchstens 30 Sekunden nach dem Tippen in der App ausgeführt. Haltet die Uhr des Node-RED-Rechners per NTP synchron.
Zutritt am Leser prüfen
Was der Leser liest, geht in inwendo erp access check (POST /api/nodered/smart_lock/check_access). vynst prüft mit denselben Regeln wie die App und schreibt ins Schloss-Protokoll:
| Code | Herkunft |
|---|---|
access_code |
QR-Code aus der App für genau dieses Schloss, 5 Minuten gültig |
member_card |
QR-Code der digitalen Mitgliedskarte |
card |
RFID- oder Chipkartennummer an der Person |
Die reine Mitgliedsnummer wird nicht angenommen, weil sie zu erraten ist. Die Antwort:
{
"granted": true,
"reason": "granted",
"credential_type": "card",
"smart_lock": { "id": 12, "name": "Haupteingang" },
"person": { "id": 345, "name": "Erika Mustermann" },
"opened": null
}
Mit „vynst öffnet das Schloss“ öffnet vynst bei Erfolg selbst, zum Beispiel eine Nuki-Tür mit Kartenleser an Node-RED.
Beispiel-Flows
Unter Importieren → Beispiele → node-red-contrib-inwendo-erp: Tür mit Leser, Halle vor der Buchung heizen, Flutlicht während Buchungen, RFID-Leser mit Relais, Check-in am Eingang, virtuelle Schlösser.
Virtuelle Schlösser ausprobieren
Ohne Hardware testen, wie Schlösser aus Node-RED in vynst funktionieren: Der Flow vynst-virtuelle-schloesser.json bringt zwei virtuelle Schlösser hinter einer MQTT-Bridge mit, eine Tür mit Öffnen-Knopf in der App und einen Fitnessraum mit QR-Scanner. Genau dieser Flow läuft in den automatischen Tests von vynst in einem echten Node-RED.
- In Node-RED Importieren wählen und die Datei hochladen (oder ihren Inhalt einfügen).
- Den Node inwendo ERP öffnen: Adresse eurer Instanz und einen API-Token mit dem Recht Veranstaltungen (
event) schreiben eintragen. - Die Bridge Vereinsheim (virtuell) einmal öffnen und mit Fertig schließen. Dabei entstehen Instanz-ID und Schlüssel.
- Deployen. In der Verwaltung von vynst unter SmartLock-Verbindungen die neue Node-RED-Verbindung öffnen, Geräte synchronisieren und Rechte vergeben.
- In der App Öffnen tippen. Der Befehl kommt über den MQTT-Broker von vynst an, das virtuelle Schloss öffnet, bestätigt und schließt nach 5 Sekunden wieder ab. Den neuen Zustand meldet es an vynst zurück.
| Ausprobieren | So geht es |
|---|---|
| Karte am Leser | Inject-Node „reader: card 04A1B2C3“ drücken oder POST /virtual-locks/front_door/reader mit {"credential": "04A1B2C3"}; ohne Person mit dieser Kartennummer lehnt vynst ab |
| QR-Code der App | den Code am Fitnessraum mit POST /virtual-locks/gym/reader prüfen |
| Zustand und Verlauf | GET /virtual-locks |
| Klemmendes Schloss | POST /virtual-locks/front_door/jam mit {"jammed": true}; vynst meldet den Befehl als fehlgeschlagen und schreibt das Fehlerprotokoll |
Die Function-Nodes „virtual lock …“ ersetzt ihr später durch euer Relais (GPIO, Shelly, Modbus …), den Inject-Node durch euren Leser.
Funktionen hinter Schaltern
Ist eine Funktion in vynst aus, antwortet die API mit HTTP 400, X-IW-ERROR-CODE: 404 und ["feature disabled: <einstellung>"]. Der Node zeigt dann „Funktion im ERP deaktiviert“. Die Schalter stehen unter Einstellungen → Smart Home & Automationen.
API
Die Endpunkte unter /api/nodered/ stehen im Bereich Smart Home und Automationen. Quellcode: github.com/inwendo/node-red-contrib-inwendo-erp.