himpler.com himpler.com

homee Datenlogger mit Node-RED

5 Min.

Dieser Beitrag wurde seit einem Jahr nicht mehr aktualisiert. Im Internet ist das manchmal eine halbe Ewigkeit. Es kann daher sein, dass die Informationen und Links nicht mehr aktuell sind.

Mit dem Node-RED Plugin node-red-contrib-homee lassen sich Verlaufsdaten Deines homee auch extern speichern. Gleichzeitig können Schaltvorgänge und die Aktivierung von Homeegrammen überwacht werden. Diese Anleitung zeigt wie es funktioniert.

Vorbereitungen

Bekanntlich führen viele Wege nach Rom. So gibt es auch in Node-RED viele Möglichkeiten die Aktionen Deines homee zu speichern. Neben einem einfachen Logfile oder einer CSV Datei können die Einträge z.B. auch in einer Datenbank gespeichert werden.

Welche Variante die richtige für Dich ist, musst du selbst entscheiden. In diesem Tutorial werden wir die Aktionen sowohl in einem Logfile als auch in einer NoSQL Datenbank speichern.

Das Logfile braucht keine weiteren Vorbereitungen. Als NoSQL Datenbank verwenden wir MongoDB welche wir mit dem Befehl

sudo apt-get install mongodb-server

installieren. Alternativ kann natürlich auch eine externe Datenbank verwendet werden. Eine NoSQL Datenbank bietet unter anderem den Vorteil, dass wir uns nicht lange mit der Erstellung Tabellen aufhalten müssen. Mit der Installation wird auch automatisch ein Service installiert, der sich u.a. um den Autostart der Datenbank kümmert. Mit sudo service mongodb status lässt sich überprüfen, ob MongoDB läuft. Nun erstellen wir noch eine Datenbank und einen Benutzer.

mongo admin --eval "db.getSiblingDB('homee').addUser('homee', 'geheimespasswort')"

Der Befehl erstellt eine Datenbank mit dem Namen homee und einen gleichnamigen Benutzer mit Passwort. Damit Node-RED und die Datenbank zusammenarbeiten, installieren wir mit

cd ./node-red
npm install node-red-mongodb

das Node-RED Plugin für MongoDB.

Logfile mit Node-RED

Jetzt geht es zunächst mit dem Logfile weiter. Wir erzeugen in Node-RED einen neuen Flow, der die Nachrichten von homee abfängt und in ein Logfile speichert.

Node-RED Flow homee Log

Node-RED Flow homee Log

Hinweis

Der homee Node sollte nur einmal verwendet werden. Hast du bereits einen Node erstellt, kannst du die Funktion einfach daran anbinden.

In den Einstellungen zum File-Node geben wir den Filename mit /home/pi/homee.log an. Die restlichen Einstellungen bleiben gleich.

Konfiguration des Logfiles

Konfiguration des Logfiles

Jetzt muss die Nachricht von homee noch für eine leserliche Ausgabe aufbereitet werden. Da die Ausgabe im Logfile stark von den individuellen Wünschen abhängt, zeige ich nur eine kleine Beispielfunktion. Was alles im Log gespeichert werden kann, siehst Du am einfachsten, wenn Du einen Debug-Node an den homee Node anschließt. Dann wird die komplette Nachricht von homee im Debug-Fenster angezeigt.

// DateTime-String erstellen
var new Payload = new Date().toISOString();

// Nachrichtentyp ermitteln
var type = Object.keys(msg.payload)[0];

// Abhängig vom Nachrichtentyp einen Eintrag erzeugen
switch (type) {
  case 'attribute':
    new Payload += ' Attribute ID ' + msg.payload.attribute.id + ' auf ' + msg.payload.attribute.current_value + ' geändert';
    break;
  case 'homeegram':
    new Payload += ' Homeegram ' + msg.payload.homeegram.name + ' - Status - ' + msg.payload.homeegram.state;
    break;
  case 'user':
    new Payload += ' User ' + msg.payload.user.id + ' hat sich angemeldet'
}

msg.payload = new Payload;

return msg;

Solltet ihr alle Daten in einem Logfile speichern wollen, empfehle ich Dir den Einsatz von Logrotate.

Um die Datenmenge etwas zu reduzieren, lassen sich die Nachrichten mit Bedingungen vorher filtern oder es können auch unterschiedliche Ausgänge des Funktions-Node angesteuert werden. Damit könnte man eine Verteilung auf verschiedene Logdateien erreichen. Mehr zu Funktionen mit mehreren Ausgängen findest Du in der Dokumentation von Node-RED.

Speichern in einer Datenbank

Als nächstes erstellen wir den Flow, der die Nachrichten von homee in einer NoSQL Datenbank abspeichert.

Node-RED Flow homee Log mit MongoDB

Node-RED Flow homee Log mit MongoDB

Zuerst konfigurieren wir den MongoDB-Node. Die Verbindungseinstellungen tragen wir über das Stiftsymbol ein. Dazu verwendest Du die Angaben die Du zuvor bei der Erzeugung der Datenbank verwendet hast.

Node-RED MongoDB Verbindungseinstellungen

Node-RED MongoDB Verbindungseinstellungen

Das Feld Collection bleibt leer, da dieses später über die Nachricht gefüllt wird. Als Operation wählen wir save zum Speichern eines Eintrags.

MongoDB Einstellungen in Node-RED

MongoDB Einstellungen in Node-RED

Um später eine bessere Übersicht zu haben werden wir die Nachrichten nach Kategorie (Attributänderung, Homeegrammstatus, User-Login usw.) in verschiedenen Collections abspeichern sowie einen Zeitstempel ergänzen.

Dazu fügen wir in den Funktionsnode folgenden Inhalt ein:

// die collection festlegen
msg.collection = Object.keys(msg.payload)[0];

// diese Nachrichten werden berücksichtigt
types = ['attribute', 'homeegram'];

if (types.indexOf(msg.collection) === -1) {
  return;
}

msg.payload = msg.payload[msg.collection];

// hinzufügen eines Timestamps
msg.payload.timestamp = Date.now();
return msg;

Die Funktion sorgt nun dafür, dass jede Nachricht in einer passenden Collection landet. Das war es schon.

Beispiel eines Eintrags in der Attribut-Collection

Beispiel eines Eintrags in der Attribut-Collection

Einmaliges Abfragen aller Geräte

homee überträgt bei Attributänderungen nur das geänderte Attribut. Um später die Veränderungen der Attribute mit den Geräten in Verbindung zu bringen, fragen wir einmalig die Geräte von homee ab und speichern diese in der Datenbank. Dazu erstellen wir folgenden Flow.

Node-RED Flow zum Abfragen der homee-Geräte

Node-RED Flow zum Abfragen der homee-Geräte

Den Inject-Node konfigurieren wir im Bild.

Konfiguration des Inject Nodes in Node-RED

Konfiguration des Inject Nodes in Node-RED

Wie im vorherigen Flow bereitet eine Funktion die Daten auf und gibt sie an den MongoDB Node weiter.

if (Object.keys(msg.payload)[0] !== 'nodes')
  return;

msg.payload.nodes.forEach(function(obj){
 node.send({
   collection: 'nodes',
   payload: obj
 });
});

return;

Wird nun der kleine Button vorne am Inject Node gedrückt, werden die Geräte von homee abgefragt und die Funktion speichert diese in die Datenbank. Fügst Du neue Geräte hinzu, muss die bestehende Collection gelöscht und der Schritt wiederholt werden.

Die abgefragten Geräte in der nodes-Collection

Die abgefragten Geräte in der nodes-Collection

Zusammenfassung

Die beiden Beispiele zeigen eine Möglichkeit der externen Protokollierung von Zustandsänderungen Eures homee. Während das Logfile direkt mit Linux Bordmitteln (z.B. nano oder vi) aufgerufen werden kann, braucht es bei MongoDB etwas mehr. Dafür sind dort die Möglichkeiten viel größer.

Das könnte dir auch gefallen