Schlagwort: Smarthome

Ein Upgrade für den Homeserver Teil 12 – Mosquitto

Seit gut drei Jahren betreibe ich einen RaspberryPi als Homeserver. Zunächst reichte dieser noch gut aus. Mit der Zeit wurde aber nicht nur die Zahl der Anwendungen, die auf dem Raspberry laufen, mehr, sondern auch die Leistungsanforderungen der Anwendungen selbst. Besonders meine ich damit die Influx Datenbank, die seit über drei Jahren jede Minuten um einen Datensatz der PV-Anlage größer wird. Die Datenbank braucht mittlerweile über 10 Minuten zum Starten. Auch diese Webseite braucht zum Laden deutlich länger, als sie sollte. Wenn ich den Raspberry komplett neu starte, braucht es ca. eine Stunde, bis alle Anwendungen wieder laufen. Das ist definitiv zu viel. Es sollte also ein neuer Rechner her. In dieser Artikelserie möchte ich davon berichten.


Übersicht aller Artikel dieser Serie


Was ist MQTT?

MQTT ist ein Übertragungsprotokoll, das besonders Anwendung im IoT-Bereich findet. Dabei gibt es eine Zentrale, den Broker. Möchte man als Client etwas senden, so sendet man diese Nachricht unter einem Topic zuerst an den Broker. Das nennt man dann publish. Möchte man als Client etwas empfangen, so kann man bestimmte topics beim Broker abonnieren. Das nennt man subscribe. Das hat den Vorteil, dass Sender und Empfänger sich nicht kennen müssen, sondern nur jeweils den Broker. Die Topics sind mit „/“ aufgebaut, zum Beispiel „sensoren/küche/raumtemperatur“. Wenn man jetzt „sensoren/#“ subscribed („#“ steht für „alles“), dann bekommt man die Daten aller Sensoren. Subscribed man „sensoren/küche/#“, dann nur die der Sensoren in der Küche, usw.

Was ist Mosquitto?

Mosquitto bietet sowohl einen Client, um auf einen MQTT Server zuzugreifen, als auch den MQTT Server selbst. In diesem Beitrag soll es hauptsächlich um den Server gehen.

Installation von Mosquitto

Mosquitto lässt sich recht einfach im Terminal installieren mit:

Konfiguration von Mosquitto

Damit man auch aus dem Netzwerk auf den Server zugreifen kann, muss man noch eine kleine Einstellung vornehmen. Dazu erstellt man die Datei /etc/mosquitto/conf.d/mosquitto.conf:

Und fügt dort folgendes ein:

Um die Einstellungen zu übernehmen, muss man den Mosquitto-Server noch neu starten:

Testen

Möchte man den Server ausprobieren, kann man das zum Beispiel mit einem weiteren Linux-Rechner tun. Dazu installiert man zuerst den Mosquitto Client:

Mit folgendem Befehl lässt sich etwas auf dem Broker subscriben:

Die IP-Adresse musst du natürlich anpassen. „-v“ sorgt dafür, dass nicht nur der Inhalt der Nachricht, sondern auch das Topic angezeigt wird. Hinter dem „-t“ steht in Anführungszeichen das Topic, das man subscriben möchte. „#“ steht für alles.

Mit folgendem Befehl lässt sich eine Nachricht senden:

Die IP-Adresse musst du wieder anpassen. Hinter dem „-t“ steht wieder das Topic und in diesem Fall hinter dem „-m“ die Nachricht.

Waveshare Modbus Relais in Homeassistant

In diesem Beitrag möchte ich dir zeigen, wie ich ein 8-fach Modbus Relais von Waveshare in Homeassistant eingebunden habe.

Material

Aufbau

Der Aufbau ist nicht kompliziert. Die Anschlüsse A+, B- und GND müssen mit den entsprechend gleichnamigen Anschlüssen am Relais verbunden werden. Dann ist nur noch eine Spannungsversorgung für das Relais notwendig und man kann loslegen.

Mitgelieferte Software

Im Waveshare Wiki findet man neben zahlreichen Beispielen auch einen Beispielcode in Python. Dieser sendet die Daten direkt über „serial“ an das Modbus Relais und zur Berechnung der Paritätsbytes wird ebenfalls ein eigenes Pythonmodul mitgeliefert. Das ist etwas umständlich, da es für Modbus bereits fertige Pythonmodule wie minimalmodbus gibt.

Steuerung mit Minimalmodbus

Nach der Installation mit

kann das Modul verwendet werden. Folgendes wäre ein Beispielcode:

In Zeile 3 wird der Pfad zum USB -> Modbus Konverter und die ID des Relais angegeben. Die ID wird in den meisten Fällen 1 sein. Bei mir habe ich sie aber geändert, da am selben Modbus auch ein Stromzähler hängt, der die ID 1 bekommen hat. Mit den Funktionen get_relais() und set_relais(relais, on/off) kann man jetzt die Relais schalten und deren Status abfragen.

Einbindung in Homeassistant

Um das Modbus Relais in Homeassistant einzubinden, verwende ich MQTT. Dieses sollte bereits installiert und eingebunden sein. Mein Code sieht dann folgendermaßen aus:

Hinzu kommt jetzt die Anbindung an MQTT. Wichtig ist dabei

  • Z. 8: Siehe oben
  • S. 23+25: Hier werden die Statuswerte der Relais an MQTT gesendet
  • Z. 29: Hier wird das MQTT Topic subscribed, an das nachher die Befehle zum setzen gesendet werden
  • Z. 43: Hier findet die Verbindung zum MQTT Broker statt

In Homeassistant verwende ich nun folgende Konfiguration:

Jetzt kann ich die Relais auch in Homeassistant schalten. Dabei muss das Pythonskript dauerhaft laufen, was man bspw. mit einer systemd Service Unit erreicht.

Gleichzeitig Modbus Relais und Stromzähler auslesen

Da ich, wie bereits erwähnt, einen Stromzähler und Relais an einem Modbus hängen habe und immer nur ein Programm auf den Modbus zugreifen kann, muss ich im selben Skript auch den Stromzähler auslesen. Das Skript dazu sieht so aus:

Hinzu kommt hier die Verbindung zur Influx Datenbank (Z. 12) und das eigentliche Auslesen des Stromzählers ab Z. 57. Es werden auch noch andere Stromzähler, die über Tasmota angebunden sind, ausgelesen, um einige Werte zu berechnen. Wichtig hier ist auch die Variable relais_freigabe, die dafür sorgt, dass wenn gerade der Stromzähler ausgelesen wird, mit dem Setzen des Relais noch kurz gewartet wird, da dies nicht gleichzeitig passieren kann.

Bildquelle: waveshare.com, wikipedia.org

Putzfunktion für Raspberry Display

Wenn mein Display (hier kannst du dir anschauen, wie ich es eingebaut habe) schmutzig ist, ist es ganz praktisch, wenn es eine „Putzfunktion“ gibt, die für eine kurze Zeit alle Eingaben deaktiviert, sodass beim Putzen nichts verstellt wird. Hier möchte ich dir zeigen, wie ich das umgesetzt habe.

Installation des Webservers

Für diese Funktion verwende ich einen Webserver, der ein Request entgegennimmt. Dieser führt dann ein Shell Skript aus, das die Eingaben vom Touchscreen abschaltet.

PHP Skript

Dann verwende ich ein einfaches PHP Skript, welches ein Shell-Skript als User „pi“ startet:

Dieses habe ich in /var/www/html/cleanmode.sh gespeichert.

Shell-Skript

Für das Shell-Skript muss man zuerst die ID des Touchscreens herausfinden. Mit folgendem Befehl lassen sich alle IDs anzeigen:

Anschließend probiert man mit

alle IDs durch, bis der Touchscreen nicht mehr funktioniert. In meinem Fall war es die ID 7.

Folgendes Shell-Skript muss dann angepasst werden:

Die Zeit in Zeile 2 kann man ebenfalls nach Belieben anpassen. Mein Skript liegt in /home/pi/cleanmode.sh. Sollte das bei dir anders sein, musst du den Pfad im PHP Skript entsprechend ändern.

Den Benutzer www-data mit Root-Rechten ausstatten

Damit der User www-data (Dieser wird vom Webserver verwendet) das Shell-Skript als User pi ausführen kann, braucht er Root-Rechte.

ACHTUNG: Den Benutzer www-data mit Rootrechten auszustatten, ist ein großes Sicherheitsrisiko. Dies sollte man unter keinen Umständen auf einem vom Internet erreichbaren Webserver tun!

Wir öffnen dazu mit dem Befehl

Die Datei /etc/sudoers und tragen dort unter „User privilege specification“ folgende Zeile ein:

Nach dem Speichern mit Strg+O, dem Beenden mit Strg+X und einem Neustart hat der User www-data nun Root-Rechte. Öffnet man nun im Browser folgende URL:

http://[IP_DEINES_RPi]/cleanmode.sh

sollte sich der Touchscreen abschalten und nach 60 Sekunden wieder anschalten.

Putzfunktion in Homeassistant

Auf meinem Display läuft zur Zeit Homeassistant. Dort möchte ich die Putzfunktion gerne als Button haben. Außerdem möchte ich einen Timer, der mir anzeigt, wie viel Zeit ich noch habe, bis der Touchscreen wieder aktiviert wird.

In der config.yaml habe ich folgende Konfiguration hinterlegt:

Ersteres ist der Aufruf der URL, Zweiteres der Timer.

Anschließend habe ich im Homeassistant UI einen Button unter „Helfer“ erstellt.
Eine Automatisierung steuert dann das ganze, startet also den Timer und ruft dann die URL auf:

Homeassistant Automatisierung Putzfunktion

Und hier noch in Textform:

Solaranzeige Daten in Homeassistant

Heute Morgen habe ich mich an ein Problem gesetzt, das ich schon länger habe: Wie bekomme ich die Daten meiner Solaranzeige in Homeassistant? Oder ist es vielleicht sinnvoller, die Homeassistant SolarEdge Modbus Integration zu verwenden und die Daten dann von Homeassistant in die InfluxDB zu schicken?
Ich habe mich für die erste Variante entschieden. Dabei ist ein kleines PHP Programm entstanden. Dort gibt man einen MQTT „Block“ ein und heraus kommt dabei eine fertige Homeassistant Konfiguration, die man nur noch kopieren muss. Eine ausführlichere Anleitung wie’s funktioniert ist auch dabei.

Link: https://jojokorpi.ddns.net/solaranzeigetohomeassistant
Quellcode: https://github.com/jjk4/solaranzeigetohomeassistant

Mobile Alerts Sensoren mit Proxy lokal auslesen und an Homeassistant senden

Vor knapp zwei Jahren habe ich einen Beitrag darüber veröffentlicht, wie ich meine Mobile Alerts Temperatursensoren per Weboberfläche mit einem Pythonskript auslese. Diese Variante funktionierte bei mir und funktioniert immer noch ohne Probleme. Letztens bin ich aber auf eine andere Möglichkeit gestoßen, die mir deutlich besser gefällt, da sie zuverlässiger und unabhängig von der Cloud ist. Mit einem Proxy, der zwischen den Gateway und das Internet geschalten wird, können die Daten abgefangen und weiter verarbeitet werden.
Hierfür gibt es das Programm „maserver„. Es nimmt auch direkt die Einstellungen am Gateway vor. Dieses sendet die Daten anschließend an einen MQTT Broker. Bei mir läuft es auf einem RaspberryPi mit Ubuntu Server 22.04.

Vorbereitungen

Auf dem Server müssen zunächst nodejs und npm installiert werden:

Danach kann man den maserver herunterladen:

Im Ordner „MMMMobilealerts“ befindet sich jetzt der maserver.

Konfiguration

Darin befindet sich die Datei „config-example.json“. Benenne diese in „config.json“ um. Folgende Konfigurationsmöglichkeiten gibt es:

  • localIPv4Address: Die IP-Adresse des Geräts, auf dem der Proxy läuft. Wird nur benötigt, wenn es mehrere IP-Adressen hat, z. B. wenn es über mehrere Netzwerkschnittstellen angebunden ist oder Docker oder ein VPN Server darauf läuft.
  • mqtt: Die Adresse zum MQTT Broker.
  • mqtt_home: Das Topic, in dem die Daten auf dem MQTT Broker gesendet werden sollen.
  • mqtt_username, mqtt_password, logfile: Selbsterklärend.
  • logGatewayInfo: Ob Infos über gefundene Gateways angezeigt werden sollen.
  • proxyServerPort: Der Port, auf dem der Proxyserver laufen soll.
  • mobileAlertsCloudForward: Ob die Daten an die Mobilealerts Cloud gesendet werden sollen.
  • serverPost: Die Daten können zusätzlich auch per POST versendet werden.
  • serverPostUser, serverPostPassword, locale: Selbsterklärend.

Meine Konfiguration sieht dann so aus:

Installation

Der Proxy wird mit

installiert, während man sich im „maserver“ Verzeichnis befindet.

Start

Gestartet werden kann das Programm mit:

Es findet automatisch den Gateway im Netzwerk und konfiguriert sich selbst im Gateway als Proxy. Nach spätestens 15 Minuten sollten die ersten Daten zu sehen sein.

Daten an Homeassistant senden

Im Homeassistant fügen wir zuerst die MQTT Integration unter „Einstellungen“->“Geräte und Dienste“->“Integration Hinzufügen“ hinzu.

Die Konfiguration der einzelnen Sensoren erfolgt dann über die configuration.yaml Datei und sieht beispielsweise so aus:

Dabei ist XXXXXXXXXXXX die 12-stellige Geräte-ID, die man in der Mobile Alerts App oder direkt auf der Rückseite der Sensoren findet.

Nach einem Neustart sollten die Daten in Homeassistant erscheinen:

Mobile Alerts Sensoren in Homeassistant

RaspberryPi als Überwachungskamera

Hier möchte ich dir gerne zeigen, wie ich mit einem Raspberry Pi eine Überwachungskamera gebaut habe und wie auch du das machen kannst.

Hardware

Materialliste

Raspberry: Ein Raspberry Pi Zero ist klein, günstig und verbraucht nur wenig Strom. Er ist aber auch in der Leistung stark beschränkt. Bei HD Auflösung (1280×720) hat er bei mir bei Bewegungserkennung und beim Speichern der Bilder ca. 1FPS erreicht. Das reicht mir aus. Wer mehr braucht, sollte lieber zu einem Raspberry Pi 4 greifen.

Netzteil: Ich verwende hier ein Hutschienennetzteil (Für den Pi4 hier). Wer lieber eines mit Stecker (Für den Pi4 hier) mag, kann das auch verwenden.

Kühlung: Da bei einer Videoübertragung und Bewegungserkennung der RPi ganz schön viel zu tun hat, ist eine Kühlung auf jeden Fall sinnvoll. Ich verwende diese Kühlkörper (Für den Pi4 hier). Da auch der USB Stick ziemlich heiß wurde und ich vom RPi Zero noch den kleinen Kühlkörper übrig hatte, habe ich diesen zum Kühlen des USB Sticks genutzt. In eine normale USB-Buchse passt er dann aber nicht mehr.

SD Karte: Ich verwende diese hier. 16 GB sind für das Projekt völlig ausreichend. Theoretisch würden auch weniger reichen, kleinere SD Karten kosten aber fast genau so wenig.

Kameramodul: Hier hat man eine große Auswahl. Ob mit Weitwinkel, Infrarot, gleich beidem, in extrem klein oder in High Quality (nicht für den Pi Zero zu empfehlen). Es gibt aber auch sehr günstige Kameras wie diese hier, die absolut ausreichend sind.

Flachbandkabel: Die meisten Kameras kommen bereits mit einem Kabel. Da Raspberry Pi Zero aber einen kleineren CSI Anschluss hat, braucht man dafür ein Adapterkabel.

USB Stick: Wenn Aufnahmen gespeichert werden sollen, macht man das wegen der begrenzten Haltbarkeit am besten nicht auf der SD Karte. Stattdessen kann man einen USB Stick verwenden oder die Aufnahmen auf einem NAS speichern. Ich verwende diesen Stick.

Adapter für USB-Stick: Da der Raspberry Pi Zero nur einen Micro USB Anschluss hat, braucht man für den USB Stick einen Adapter. Ich verwende diesen hier.

Gehäuse: Hier gibt es auch sehr viel Auswahl. Es gibt das offizielle Raspberry Pi Zero Gehäuse, welches schon eine Aussparung für eine Kamera hat, aber ich verwende gerne Kamera Dummys. Diese sehen dann nicht nur aus wie echte Kameras, sondern lassen sich auch gut einstellen.

Zusammengerechnet komme ich dann nach aktuellem Stand auf ca. 60€.

Zusammenbau

Zum Zusammenbau braucht man nicht viel sagen. Alles kommt in den Stecker, wo es reinpasst ;). Zusammengebaut sieht die Kamera (ohne Gehäuse) so aus:

Einbau in das Gehäuse

Meine Kamera soll in einen Kameradummy. Ich habe diese hier verwendet. Vermutlich sind aber die meisten Kamera Dummys auf eBay sehr ähnlich, wenn nicht sogar gleich. Er lies sich sehr gut zerlegen. Das sieht dann so aus:

Das Schutzglas lässt sich ebenfalls noch ausbauen. So kann man es reinigen. Die Kameralinse und die LED werden nicht benötigt. Zwischen den beiden Hälften des Gehäuses lässt sich sehr gut eine Kunststoffplatte befestigen. Auf dieser habe ich dann den Raspberry festgeschraubt.

Hinter der Platte mit den IR LED Attrappen kann man mit Heißkleber die Kamera befestigen. Das sieht dann so aus:

Jetzt muss nur noch alles wieder zusammengebaut werden. Der Raspberry hängt bei mir in der unteren Kamerahälfte, da es wegen dem Batteriefach oben sehr eng wird.

Von vorne sieht die Kamera dann so aus:

Software

Installation des Images

Als Software für die Überwachungskamera verwende ich Motioneye OS. Das ist eine für verschiedene Einplatinencomputer optimierte Linuxdistribution, mit der man sehr einfach und benutzerfreundlich Überwachungskameras bauen kann.

Nachdem das Image heruntergeladen und mit z. B. dem Raspberry Pi Imager auf die SD Karte gespielt wurde, muss noch das WLAN, falls vorhanden eingestellt werden. Erstelle dazu auf der kleineren der beiden Partitionen auf der SD Karte (boot Partition) eine Datei mit dem Namen „wpa_supplicant.conf“. Diese Datei braucht folgenden Inhalt:

Die SSID und das Passwort müssen natürlich angepasst werden.

Konfiguration von Motioneye

Nach dem Booten und aufrufen der IP im Browser sieht man direkt das Bild der Kamera:

Userinterface Motioneye

Um weitere Einstellungen vorzunehmen, muss man sich aber anmelden. Das geht über den „switch user“ Button oben links. Der Benutzername ist „admin“ und das Passwort muss leer gelassen werden.

Jetzt kann man im seitlichen Menü alle möglichen Einstellungen vornehmen. Diese sind meist selbsterklärend, trotzdem gibt es noch neben jeder Einstellung ein ?, welches die Einstellung noch mal erklärt. Meine Einstellungen sehen so aus:

Wenn man auf den Livestream und anschließend auf das „Foto“ Icon klickt, kann man sich Kameraaufnahmen anschauen:

Picture Browser

Mobile Alerts Sensoren ohne Rest API auslesen

Ich habe einige Mobile Alerts Sensoren im Haus. Diese wollte ich ursprünglich mit dem RaspberryPi über die Mobile Alerts Rest API auslesen. Da dort aber nur bestimmte Sensoren funktionieren (meine leider nicht) habe ich es auf eine etwas andere Art versucht. Diese Variante ist zwar nicht so zuverlässig und auch etwas umständlich, aber sie funktioniert immerhin.

Tipp: Es gibt auch eine andere Methode

Vorbereitungen

Die Sensoren sollten schon mit dem Gateway verbunden und in die Mobile Alerts App integriert sein. In den Einstellungen der App findet man relativ weit unten die Phone ID. Diese wird später noch gebraucht.

Dann besucht man die Seite https://measurements.mobile-alerts.eu/Home/SensorsOverview?phoneid=XXXXXXXXXXXX

Am Ende muss noch die Phone ID ergänzt werden. Dort sollte man nun alle Sensoren sehen.

Skript erstellen

Jetzt brauchen wir einige Zeilen aus dem Quellcode. So wird auch später das Python Skript, welches die Daten ausliest, funktionieren. Dazu macht man einen Rechtsklick auf die Seite und wählt dann „Seitenquelltext anzeigen“ (Kann je nach Browser variieren).

Hier sehe ich zum Beispiel, dass sich die Temperatur des Badezimmers in Zeile 66 befindet. Die Luftfeuchtigkeit befindet sich in Zeile 70. Und da ist dann auch die Schwachstelle des Skripts. Sollte sich die Temperatur des Badezimmers mal nicht mehr in Zeile 66 befinden, funktioniert das Skript nicht mehr und muss angepasst werden. In der Regel gibt es so eine Änderung aber nur, wenn ein weiterer Sensor hinzugefügt oder entfernt wird.

Das ist auch schon das Skript. Es liest vorerst nur die Daten aus.

Zeile 4: Hier wird der Quelltext der Webseite heruntergeladen. Er wird in /home/pi/sensors.txt gespeichert. (nicht vergessen, die Phone ID zu ersetzen) (Update: Seit 15.4.21 Wird der Download per wget von Mobilealerts blockiert. Die zusätzliche Option „-U firefox“ lässt die Webseite denken, dass es sich um einen firefox browser handelt. Ich hoffe, dass das so weiterhin funktionieren wird.)

Zeile 5 und 6: Hier wird eine Variable auf die entsprechenden Zeilen (66 und 70) gesetzt und dann alles, bis auf die Zahl entfernt. Bei Der Temperatur muss noch das Komma durch einen Punkt ersetzt werden.

Zeile 8 und 9: Hier werden die ausgelesenen Daten ausgegeben. Natürlich kann hier auch etwas ganz anderes stehen. Die Daten könnten zum Beispiel in eine Datenbank geschrieben werden oder anderweitig verarbeitet werden (z.B: Wenn es im Schlafzimmer zu heiß aber draußen kälter ist, soll das Fenster geöffnet werden)

Zeile 10: Der Quelltext wird gelöscht. Er wird ja nicht mehr benötigt.

Ich hoffe, ich konnte dir mit diesem kurzen Tutorial weiterhelfen 😉