Eine eigene PHP-Web-API bauen

Um Daten aus dem SmartHome auf eine eigene Website zu bringen, habe ich mir eine Authentifizierung gebaut, die es mir erlaubt, per POST Request Daten bereitzustellen – und zwar nur mir. Einfach nur ein festes Passwort war mir da zu unsicher. Daher habe ich eine zeitbasierte Komponente mit eingebaut.

Zum Einsatz kommt seitens Node-RED node-red-contrib-cryptography.

Ich generiere einen Auth Token, dieser basiert auf der aktuellen Zeit und einem geheimzuhaltenden Passwort, quasi einem Salt.

msg.payload = Math.round(Date.now()/10000) + "dasGeheimePasswort1234!";
msg.headers = {};
msg.headers["Content-Type"] = "application/x-www-form-urlencoded";
return msg;

Beim Token habe ich mich für eine Gültigkeit von 10 Sekunden (daher geteilt durch 10.000) entschieden, dann sind minimale Ungenauigkeiten bei den Uhrzeiten zwischen SmartHome und Webserver nicht so dramatisch. Der Payload wird dann durch die hash-Funktion sha256 gehasht. Anschließend wird der POST Request mit Daten bepackt und der http request abgeschickt.

msg.payload = {
"auth": msg.payload,
"temperatur": msg.temperatur
};
return msg;

Um dem POST Request zu empfangen und zu authentifizieren muss die PHP Gegenstelle den gleichen Token generieren und mit dem mitgeschickten Token abgleichen. Dazu braucht die Gegenstelle natürlich auch den auf 10 Sekunden gerundeten Timestamp und das gleiche geheime Passwort, wie es im Node-RED hinterlegt ist.

<?php
   if($_POST["auth"] == hash('sha256',(round(time()/10))."dasGeheimePasswort1234!")) {
echo "true";
}
?>

Achtung! PHP arbeitet bei den Timestamps in Sekunden, während JavaScript in Millisekunden arbeitet. Daher ist hier nur eine Division durch 10 nötig.

Statt dem echo „true“; kann man natürlich beliebiges mit den mitgeschickten Werten anfangen.

Flot mit min / max / mittel nutzen

Ich schätze Flot als schlankes Tool um ansehnliche Diagramme zu zeichnen. Diese binde ich per iframe in Node-RED Dashboard ein. Bisher war es mir jedoch nicht gelungen, die Daten abseits der Glättung zu aggregieren und die Eingangsdaten-Arten min, max und mittel zu nutzen. Dabei ist es eigentlich einfach und logisch. Im Reiter „Zeit“ muss nur unter „Aggregation“ der Schritttyp auf Sekunden und die Sekunden entsprechend angepasst werden. Für eine tageweise Aggregation zum Beispiel 86400.

Kaputt gespielt – Backup und Wiederherstellung

Was soll ich sagen, irgendwie habe ich mein Raspberry Pi OS (Raspbian) kaputt gespielt. Es fing damit an, dass ich nicht per VNC auf das System kam (für deCONZ). Zeitweise ging nicht mal raspi-config. Und: jedes mal ging nach ein paar Betriebsstunden die CPU Last massiv in die Höhe – ausgelöst durch einen Fehler mit oder durch kworker. Also fiel die Entscheidung: neu aufsetzen. Ein praktischer Präzedenzfall für Backup & Restore.

In meinem Setup waren drei, oder besser vier Dinge zu sichern und zu überspielen. Da ich noch einen Raspberry Pi 4 herumliegen hatte, konnte ich die Systeme parallel laufen lassen, und musste nicht ständig zwischen alt und neu wechseln, sofern mir noch Infos fehlten. Auch konnte ich so die Vollständigkeit der Daten gut prüfen.

Zum Kopieren der Daten zwischen den Raspberrys nutze ich immer WinSCP.

1. deCONZ/Phoscon

Bei Phoscon einfach über die Weboberfläche unter „Gateway“ ein Backup ziehen und an gleicher Stelle auf dem neuen System wieder einspielen. Das Einspielen des Backups habe ich jedoch erst gemacht, als die microSD-Karte mit dem neuen System auch im Raspberry Pi mit dem Conbee II steckte, um mögliche Probleme zu vermeiden.

2. InfluxDB

Hier sollte man zwingend mit den Backup & Restore Befehlen von influxd arbeiten, ein Kopieren der Datenordner führte (zumindest bei mir) nicht zum Erfolg.

Es müssen sowohl der META-STORE als auch die Datenbank(en) gesichert werden.

$ influxd backup <speicherort-fuer-backup>
$ influxd backup -database iobroker <speicherort-fuer-backup>

Das Wiederherstellen ist ähnlich leicht.

$ influxd restore -metadir /var/lib/influxdb/meta <speicherort-des-backups>
$ influxd restore -database iobroker -datadir /var/lib/influxdb/data <speicherort-des-backups>     

Anschließend muss man ggf. noch die Benutzerrechte des Ordners anpassen.

$ sudo chown -R influxdb:influxdb /var/lib/influxdb

3. ioBroker

Bei ioBroker kann man ein komplettes Backup sehr leicht über die Kommandozeile erstellen:

$ cd /opt/iobroker
$ sudo iobroker stop
$ sudo iobroker backup
$ sudo iobroker start

Das Backup liegt dann unter /opt/iobroker/backups/.

Ebenso einfach ist das Wiederherstellen. Das Backup-Archiv muss man dazu in den gleichen Ordner auf dem neuen System kopieren.

$ sudo iobroker stop 
$ sudo iobroker restore 0
$ sudo iobroker start all
$ sudo iobroker start
$ sudo iobroker upload all

(der Befehl „sudo iobroker upload all“ lädt die Webseiten aus den Ordnern „www“ und „admin“ aus den Adaptern in den ioBroker-Dateispeicher hoch)

Nun dauert es je nach Umfang der ioBroker-Installation einige Minuten, bis automatisch wieder alle Adapter installiert sind. Über die Weboberfläche – Instanzen kann man den Prozess rudimentär beobachten.

4. Node-RED

Die Flows werden beim ioBroker-Backup (3.) mitgesichert. Allerdings werden die zusätzlich installierten Node-Module (über „Palette verwalten“) beim Wiedereinspielen nicht automatisch installiert. Hier hilft ein Screenshot der Liste oder eine kurze Notiz der installierten Node-Module. Aber: zur Not lassen sich die auch anhand der Auflistung fehlender Nodes recherchieren und rekonstruieren.

Probleme

Probleme gab es eigentlich gar nicht. Einzig der ioBroker PING Adapter ändert den Objektpfad anhand des Hostnames – wählt man hier bei der neuen Installation einen anderen, muss man sämtliche Pfadangaben des PING Adapters z.B. im Node-RED korrigieren.

Nachtrag 23.06.2021

Inzwischen (?) kann man im PING Adapter einstellen, dass der Hostname nicht im Zustandsnamen verwendet werden soll. Wenn man bei der Einrichtung darauf achtet, kann man beim Backup & Restore dieses Problem umschiffen.

Messungen in einer InfluxDB löschen

Manchmal gibt es Messungen in einer InfluxDB, die zerstören das schöne Bild – verursacht durch Messfehler, Programmierfehler oder Schnittstellenproblemen. Bei mir sind das manchmal fehlerhafte 0-Werte.

Leider gestaltet sich das Löschen von einzelnen Messungen aus einer InfluxDB nicht so einfach, wie der ein oder andere es vielleicht von anderen Datenbanken gewohnt ist, da die Zeit das einzig zugelassene Identifikationsmerkmal einer DELETE Operation ist.

Update 02.10.2022: Inzwischen unterstützt der ioBroker InfluxDB Adapter das Löschen von Messwerten. Dazu einfach den Datensatz auswählen und das Löschicon betätigen.

Hier meine Vorgehensweise (unter Windows):

  1. Über die Software InfluxDB Studio (nur für Windows) mit der Datenbank verbinden.
  2. Über folgenden Befehl und das Anpassen der Zeit (und der Datenbank) die zu löschenden Werte identifizieren.
    SELECT * FROM „coronavirus-statistics.0.Germany.cases“ WHERE time > now() – 5d – 19h AND time < now() – 5d – 17h

    Dabei steht „5d“ für fünf Tage, „19h“ für 19 Stunden, und so weiter.
  3. Werden bei dem SELECT nur noch die Messungen angezeigt, welche gelöscht werden sollen, das “ SELECT * “ durch “ DELETE “ ersetzen und den Befehl ausführen.
  4. Fertig.

Ich übernehme keine Garantie für ungewollte Datenverluste.

delete measurment influxdb

Schnelles Smartphone UI

Ich mag ioBroker, ich mag Node-RED – aber ein User Interface, welches innerhalb von drei Sekunden auf dem Smartphone zur Verfügung steht, ist weder mit vis noch mit Node-RED UI / Dashboad möglich. Vielleicht liegt es am eingesetzten Raspberry PI und eine Monster-Hardware würde es schneller ermöglichen – so ist die Ladezeit je nach Verbindungsqualität (WLAN, VPN) jedoch belastend – gerade für den schnellen Blick auf die Haustechnik (z.B. Solarthermie) oder die Straßenbahn-Abfahrtszeiten.

Einzige Lösung kann eine native App fürs Smartphone sein, dachte ich mir. Doch weder für vis noch für Node-RED UI gibt es entsprechende perfomante Ansätze. Also musste eine weitere Lösung her. Erste Tests mit MQTT Dashboard-Apps waren verheißungsvoll, doch offenbarten sie dann Probleme. Denn bei MQTT muss die App weitgehend online sein, um die aktuellen Werte empfangen zu können. Frisst Akku und Leistung auf Seiten des Smartphones. Ein Abrufen der Werte nach einer längeren Offline-Phase ist nicht ohne weiteres möglich.

Covergestaltung

Dann stolperte ich über die App IOT Dashboard, welche mich gerade sehr begeistert. Die App von Ciprian Savastre ermöglicht es, via REST im JSON-Format Daten abzurufen, und auch Befehle zu senden. Ein paar Nodes in Node-RED ermöglichen sowohl die Auslieferung der Daten an die App, als auch das Empfangen von Befehlen aus der App.

  • Ja, die App ist funktionell noch ausbaufähig. Der Entwickler ist aber nett und ansprechbar für Bugs und Ideen.
  • Ja, es ist nur eine Ergänzung zu einem ausgefeilten UI via vis oder Node-RED Dashboard.
  • Ja, man muss auf dem Smartphone einigen Konfigurationsaufwand betreiben.

Dafür hat man aber in atemberaubender Geschwindigkeit den aktuellen Stand des Smart-Homes auf dem Schirm.

Und so sieht es gerade bei mir aus:

Aktuell benutze ich noch keine Steuerungsfunktionen, sondern nur das reine Auslesen von Werten. Daher sieht es im Node-RED auch bisher sehr einfach aus.

Die Steuerung realisiere ich bisher über Node-RED UI / Dashboard – einige häufig genutzte Funktionen werde ich aber sicher auch in der App IOT Dashboard abbilden – außer es läuft mir etwas besseres über den Weg.

Gedanken zur KWL

Kontrollierte Wohnraumlüftungen (kurz KWL) sind eine feine Sache. Man stelle sich vor, man müsste tagsüber mehrmals lüften … Klar: sie ist keine Klimaanlage. Und doch sollte man nicht nur beim Thema „wärmen“, bzw. Wärme erhalten im Winter (was sie über die Wärmerückgewinnung ja macht) ein paar Dinge beachten.

Standort

Wer die Gelegenheit hat, den Standort des KWL Geräts zu bestimmen, tue dies weise. So sollten sie klar innerhalb der thermischen Hülle des Hauses stehen – für die entsprechende Effizienz im Winter. Erfahrungen zeigen aber auch: der Heizraum ist meist nicht der geeignete Ort für das Gerät – gerade in einer Kombination mit Solarthermie. Die steht im Sommer schließlich fast unbegrenzt zur Verfügung und hebt die Temperatur im Heizraum (wo in der Standardausführung meist auch der Warmwasser-Speicher steht) auf unschöne Höhen. Jegliche Kaltluft, die möglicherweise in der Nacht die KWL dank Bypass ohne Wärmerückgewinnung passieren könnte, wird so stark durch die Heizraumtemperatur beeinflusst, dass nicht mal eine minimale Abkühlung der Räume über die KWL stattfindet. Also: vielleicht gibt es einen Wäscheraum oder einen Kellerraum – sofern man über einen solchen verfügt – in dem die KWL besser aufgehoben ist.

Funktionen / Abhilfe

Eine wichtige Funktion für ein angenehmes Raumklima ist der schon erwähnte Sommer-Bypass. Er leistet – wenn nicht von der Raumtemperatur beeinflusst – einen Beitrag für ein angenehmes kühles Raumklima im Sommer, indem er die Wärmerückgewinnung umgeht. Interessant und wichtig – auch für alle, die das gleiche Dilemma der Interaktion zwischen Solarthermie und Lüftung haben – ist der Fensterlüftungsmodus. Bei ihm wird die Zuluft komplett abgeschaltet, sodass die KWL nur absaugt und das Zuströmen kalter Luft (in der Nacht) durch die Fenster unterstützt.

Beispiel: Pluggit

Bei meinem Lüftungsgerät von Pluggit Avent P310 lässt sich der Fensterlüftungsmodus über die Modbus Schnittstelle aktivieren:

modbus.0.holdingRegisters.40169_prmRamIdxUnitMode

Manuel = 4 / Wochenprogramm = 8 / Start Sommer = 2048 / Ende Sommer = 2048

Leider ist es ein Toggle – sprich man sendet sowohl zum Einschalten, als auch zum Ausschalten „2048“.

Hallo Welt!

Ich baue mir mein eigenes SmartHome. Da ich dies nicht während eines Neubaus, sondern in einer (unserer) Bestandsimmobilie tue, sind die meisten Lösungen auf Funkbasis.

Ich versuche beim Bau einigen Grundsätzen zu folgen:

  • kein Smartphone Zwang – alle wichtigen Funktionen wie Licht und Rollläden müssen auch über die normalen Schalter bedienbar sein.
  • keine Insellösung – das Festlegen auf einen einzelnen Hersteller schränkt nur unnötig ein und verteuert es.
  • my home is my castle – das SmartHome läuft bei mir zuhause – nicht in der Cloud.
  • Open Source – soweit es geht. Bei der Firmware (gerade von Zigbee-Geräten) stößt man hier natürlich an seine Grenzen.
  • kein „Alexa“, kein „Hey Google“ – Daten fallen in einem SmartHome wahre Unmengen an. Doch die bleiben bei mir.
  • es hat auch Grenzen: zumindest sage ich das jetzt noch.

Ich bin in dem Bereich kein Profi. Vor gut einem Jahr habe ich mit ioBroker und NodeRED angefangen. Trotzdem gibt es vielleicht die ein oder andere Erkenntnis, die ich hier teilen kann.