NodeRED und-Sqlite

Aus ScaleIT Industrie 4.0 Wiki


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

MaschinenBedienpanelFlowSqlite.png

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; 
  1. Die Buttons werden an Function Node 1 (INSERT) angeschlossen.
  2. Diese wird nun an eine sqlite Node angeschlossen.
    • Jetzt werden die Daten in die existierende Tabelle geschrieben.
  3. Für die Ausgabe wird nun an die sqlite Node die function Node 2 (SELECT) angeschlossen.
  4. Anschließend wird sie gemeinsam mit unseren beiden Inject Nodes „create table“ und "drop table" an eine weitere sqlite Node angeschlossen.
  5. 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.