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.
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.
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.
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.
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.
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.
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.
Den Inject-Node konfigurieren wir im Bild.
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.
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.