NodeRED und-Sqlite
Ondics GmbH, November 2019
Aufgabenstellung
Die von den Buttons gesendeten Werte sollen datiert mit Hilfe einer SQlite Datenbank gespeichert und die letzten 10 Meldungen in einer Tabelle ausgegeben werden. Alles am Beispiel von Maschinen-Bedienpanel_mit_NodeRED.
Voraussetzungen
- NodeRED
- Verwendete Nodes: Sqlite, Dashboard, Function, Inject, Template
Kenntnisse in Function-Nodes (JavaScript) und SQL sind hilfreich. Zudem wird hier alles detailliert erklärt und kann durch "try & error" beliebig abgeändert werden.
Feedback und Anmerkungen
Gerne diskutieren wir über diese Seite mit Anwendern:
- klappt alles? Ist diese Beschreibung hilfreich?
- welche Verbesserungen sind sinnvoll?
- wie und wohin werden die Formularwerte abtransportiert?
- wie wird das Formular an der Maschine gezeigt?
Hierzu haben wir das ScaleIT-Forum eingerichtet.
Flow-Übersicht
Flow-Komponenten
SQlite Node
- Die SQlite Node erstellt lokal eine Datenbank als Datei.
- Querys werden über msg.topic übergeben und müssen in eine Sqlite Node führen.
Sqlite query übergabe in topic
Einer Inject-Node wird der Topic
CREATE TABLE maschinen_panel( Zeitpunkt INT PRIMARY KEY NOT NULL, Ereignis TEXT NOT NULL, Code TEXT , Kommentar TEXT)
übergeben um die Tabelle zu erstellen. Parallel kann eine zweite Inject-Node mit dem Topic
DROP TABLE maschinen_panel
übergeben werden um die Tabelle bei Problemen löschen zu können. Mit dem ersten Inject lässt sich die Tabelle dann wieder neu erstellen.
sqlite Node einrichten:
Bei "Database" rechts auf den Stift klicken um eine neue Datenbank zu erstellen (Gewünschten Dateipfad eingeben und den Mode "Read-Write-Create" auswählen). Wenn bereits eine Sqlite DB vorhanden ist, diese einfach im Dropdown auswählen. Wir benötigen 2 Function Nodes, eine für die Speicherung der Werte und eine für die Ausgabe in die Tabelle
- Function Node 1: INSERT der Button Objekte
var newMsg = { "topic": "INSERT INTO maschinen_panel VALUES ( CURRENT_TIMESTAMP,"+ "'" + msg.payload.action + "', "+ (msg.payload.code ? "'" + msg.payload.code + "'" : "NULL" ) + ", "+ (msg.payload.kommentar ? "'" + msg.payload.kommentar + "'" : "NULL" ) + ")" }; return newMsg;
- Function Node 2: SELECT Query für Ausgabe:
var newMsg = { "topic": "SELECT * FROM maschinen_panel ORDER BY Zeitpunkt DESC LIMIT 10;" }; return newMsg;
- Die Buttons werden an Function Node 1 (INSERT) angeschlossen.
- Diese wird nun an eine sqlite Node angeschlossen.
- Jetzt werden die Daten in die existierende Tabelle geschrieben.
- Für die Ausgabe wird nun an die sqlite Node die function Node 2 (SELECT) angeschlossen.
- Anschließend wird sie gemeinsam mit unseren beiden Inject Nodes „create table“ und "drop table" an eine weitere sqlite Node angeschlossen.
- Zuletzt wird noch eine template Node angehangen, für die Ausgabe in einer Tabelle
Ausgabe in Template Node
<table id="sqlite" style="width:100%"> <tr> <th>Zeitpunkt</th> <th>Ereignis</th> <th>Code</th> <th>Kommentar</th> </tr> <tr ng-repeat="x in msg.payload | limitTo:10"> <td>{{msg.payload[$index].Zeitpunkt}}</td> <td>{{msg.payload[$index].Ereignis}}</td> <td>{{msg.payload[$index].Code}}</td> <td>{{msg.payload[$index].Kommentar}}</td> </tr> </table>
Die Werte aus der Datenbank werden mit Hilfe eines "ng-repeat" Angular-Befehls aus dem Query der msg.payload geholt, die Anzahl wird mit "| limitTo: 10" auf 10 limiteirt, so werden maximal 10 Meldungen angezeigt.