Schlagwort: tutorial

Ein Upgrade für den Homeserver Teil 10 – InfluxDB und Grafana

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 InfluxDB, was ist Grafana?

InfluxDB ist eine Datenbank, die darauf spezialisiert ist, zeitbasierte Daten, z.B. Messwerte zu speichern.

Grafana ist eine Software, um diese Daten in Form von verschiedenen Diagrammen zu visualisieren.

Installation von InfluxDB

Die Installation von InfluxDB ist in deren Dokumentation sehr gut erklärt. Die Befehle von dort können wir einfach so ins Terminal übertragen.

Installation von Grafana

Grafana installiere ich als Docker-Container. Dazu lege ich in Portainer einen neuen Container an und wähle das Image „grafana/grafana-enterprise:latest“. Dann gebe ich noch den Port 3000 frei und lege ein Volume an.

Installation von Grafana in Portainer
Installation von Grafana in Portainer: Volumes

Nachdem man den Container erstellt hat, gelangt man mit http://IP_ADRESSE:3000 auf die Weboberfläche von Grafana. Dort muss man noch ein Passwort festlegen, dann ist Grafana einsatzbereit.

InfluxDB in Grafana konfigurieren

Ich gehe davon aus, dass in InfluxDB bereits eine Datenbank angelegt ist. Diese wollen wir nun in Grafana einbinden.

Dazu wähle ich im ausklappbaren Menü links den Punkt „Connections“

Erstellen einer Verbindung von InfluxDB in Grafana

Anschließend wähle ich unter „Add new Connection“ die InfluxDB.

Erstellen einer Verbindung von InfluxDB in Grafana

Dort klicke ich noch auf „Add new data source“.

Erstellen einer Verbindung von InfluxDB in Grafana

Anschließend lässt sich die Verbindung zur Datenbank konfigurieren. Als URL muss die IP-Adresse des Servers eingetragen werden. Standard-Port ist 8086. „localhost“ funktioniert hier nicht, weil „localhost“ auf die IP-Adresse des Docker-Containers zeigt, da wir Grafana ja über Docker installiert haben.

Im unteren Abschnitt muss noch der Name der Datenbank und falls vorhanden der Benutzername und das Passwort eingetragen werden.

Erstellen einer Verbindung von InfluxDB in Grafana

Nach einem Klick auf „Save & test“ erhält man ein „datasource is working“ wenn alles funktioniert hat.

Erfolgsmeldung

Fazit

Auf das Erstellen eines Dashboards gehe ich hier nicht weiter ein, da das abhängig von der Art der Daten sehr unterschiedlich sein kann. Als Inspiration zeige ich hier noch zwei meiner Dashboards.

Einmal ein Systemmonitor meines alten Servers:

Beispieldashboard Grafana
Beispieldashboard Grafana

Und hier die Visualisierung einer PV-Anlage:

Beispieldashboard Grafana
Beispieldashboard Grafana
Beispieldashboard Grafana
Beispieldashboard Grafana

Ein Upgrade für den Homeserver Teil 9 – Jellyfin

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 Jellyfin?

Jellyfin ist eine Streamingsoftware für den eigenen Server. Mit Jellyfin lassen sich Filme und Musik, die auf der Festplatte des Servers liegen, bequem im eigenen Netzwerk streamen. Es erkennt auch automatisch die Medien und fügt Informationen wie Cover, Erscheinungsjahr oder FSK-Freigabe hinzu. Kennt das Endgerät das Format der Medien nicht, konvertiert Jellyfin diese in Echtzeit um.

Einbinden einer NFS Freigabe von Openmediavault

Wer Teil 3 dieser Serie gelesen hat, weiß, dass ich meine Festplatten mit Openmediavault verwalte. Für Jellyfin habe ich dazu eine NFS Freigabe konfiguriert. Diese binde ich nun in mein Ubuntu ein.

Zuerst muss der NFS Client installiert werden:

Anschließend erstellen wir den Mountpoint, also die Stelle im Dateisystem, an dem später das Laufwerk eingehängt werden soll.

Mit dem folgenden Befehl lassen sich alle NFS Freigaben eines Rechners anzeigen. So sieht man, welchen Pfad diese haben.

Jetzt können wir die Freigabe einmal testweise manuell einhängen:

Nachdem ich getestet habe, ob das Einhängen funktioniert hat, hänge ich die Freigabe wieder aus:

Um die Freigabe bei Systemstart automatisch einzuhängen, braucht es einen Eintrag in der Datei /etc/fstab.

Dieser Eintrag sieht bei mir so aus:

Nach dem Speichern mit Strg+O und Schließen mit Strg+X kannst du zum Testen entweder den Server neu starten oder nur mit folgendem Befehl alle Einträge in der fstab einhängen:

Installation von Jellyfin

Ich installiere Jellyfin als Docker-Container. Also lege ich in Portainer einen neuen Container mit dem Namen „Jellyfin“ an und wähle das Image „jellyfin/jellyfin:latest“

Installation von Jellyfin in Docker

Im nächsten Schritt lege ich 3 Volumes an. Das letzte Volume ist der Mountpoint der Festplatte, auf der die Medien liegen.

Installation von Jellyfin in Docker

Im Menü „Network“ wähle ich abschließend noch „Host“ als Netzwerk aus.

Installation von Jellyfin in Docker

Jetzt kann der Container erstellt werden. Die Weboberfläche von Jellyfin ist jetzt unter http://IP_DES_SERVERS:8096 erreichbar.

Einrichtung von Jellyfin

Unter dieser Adresse erreicht man direkt den Einrichtungsassistenten von Jellyfin. Als Sprache wähle ich Deutsch:

Einrichtungsassistent von Jellyfin

Anschließend muss man einen Benutzernamen und ein Passwort für das Admin-Konto festlegen:

Benutzer anlegen

Im nächsten Schritt werden die Medienbibliotheken hinzugefügt. Ich erstelle zu Demonstrationszwecken eine Medienbibliothek für Musik.

Bibliothek einrichten

Als Typ des Inhalts wähle ich also Musik. Auch der Anzeigename bleibt bei „Musik“. Als Verzeichnisse müssen die Verzeichnisse ausgewählt werden, in denen die Musikdateien liegen. In meinem Beispiel oben habe ich meine Festplatte mit Medien in /media/HDD1 gemountet. Im Screenshot unten ist das aber nicht so, da es sich dabei nur um eine Testinstallation handelt. Als Sprache und Land wähle ich Deutsch/Deutschland und aktivieren anschließend die Echtzeitüberwachung. Das ist praktisch, da mit diesem Feature automatisch die Medien hinzugefügt werden, die man ins Medienverzeichnis kopiert.

Erstellen einer Bibliothek

Bei den Diensten aktiviere ich grundsätzlich alle. Sowohl für Bildquellen, als auch für Metadaten.

Erstellen einer Bibliothek
Erstellen einer Bibliothek
Erstellen einer Bibliothek

Anschließend könnte man noch weitere Bibliotheken, z. B. für Filme oder Serien einrichten. Das funktioniert sehr ähnlich. Ich belasse es jetzt aber bei meiner Musikbibliothek und klicke auf „Nächstes“.

fertig eingerichtete Bibliothek in Jellyfin

Dort muss ich nochmal (wie oft habe ich jetzt schon Sprache und Land angegeben? 😅) Sprache und Land angeben, dieses Mal für die Metadaten. Im Abschnitt „Fernzugriff konfigurieren“ belasse ich alles auf Standardeinstellungen.

Konfiguration der Metadaten-Sprache
Fernzugriff konfigurieren

Sowohl die Benutzer- als auch die Administrationseinstellungen von Jellyfin erreicht man im Ausklappmenü link. Dort könnte man zum Beispiel die Bibliotheken bearbeiten.

Einstellung von Jellyfin

Ein Upgrade für den Homeserver Teil 4 – Ubuntu Server

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


Erstellen der VM

Das Erstellen der VM läuft praktisch gleich wie bei Openmediavault, nur, dass ich dieses Mal ein Ubuntu Server 22.04 nehme und diesem 4 Kerne, 256 GB Speicher und 16 GB RAM gebe.

Installation von Ubuntu Server

Im Ubuntu-Installer angekommen, wählt man zunächst die Sprache

Danach werde ich gefragt, ob ich den Installer updaten möchte. Das mache ich.

Anschließend lässt sich das Tastaturlayout wählen:

Als Installationsart wähle ich das normale Ubuntu Server

Jetzt gibt es die Möglichkeit, die Netzwerkverbindung zu konfigurieren. Hier lege ich gleich eine feste IP-Adresse fest. Unter meiner Netzwerkkarte unter „Edit IPv4“ konfiguriere ich diese.

Der eingestellte Paketspiegelserver passt für mich. Nachdem der Test erfolgreich war, klicke ich auf „Done“.

Bei der Partitionierung sollte es wieder nur ein Gerät zur Auswahl geben. Hier nehme ich den Haken bei „LVM Group“ raus.

Als Nächstes wird nochmal eine Zusammenfassung der Partitionierung gezeigt, sodass man überprüfen kann, welche Geräte evtl. gelöscht werden.

Während im Hintergrund das System schon installiert wird, wird man nach Benutzername, Passwort und Hostname des Servers gefragt.

Ubuntu Pro möchte ich vorerst nicht benutzen. Auch weitere Software brauche ich zunächst nicht.

Sobald die Installation fertig ist, erscheint oben ganz unscheinbar „Install complete!“. Bevor ich neu starte, entferne ich im Menü „Hardware“ wieder die ISO.

Sobald Ubuntu wieder gestartet ist, kann ich mich von meinem PC aus über SSH mit ssh benutzername@IP_Adresse anmelden.

Updates installieren

Per SSH im Terminal angekommen, installiere ich nun Updates mit

VM automatisch beim Booten starten

Startet man jetzt den Server neu, so startet die VM nicht automatisch neu. Das kann man ändern, indem man unter „Optionen“ den Punkt „Beim Booten starten“ auf ja setzt.

VM in Openmediavault automatisch starten

Ubuntu ist jetzt fertig installiert. Im nächsten Schritt werde ich Docker auf Ubuntu installieren.

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:

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

Unifi Accesspoints per API deaktivieren

Im Unifi Controller gibt es die Möglichkeit, WLAN-Netzwerke zeitgesteuert zu (de-)aktivieren. Was allerdings nicht möglich ist, ist nur einzelne Accesspoints zeitgesteuert ein- und auszuschalten. Eine kurze Suche im Netz ergab, dass man das wohl über die API des Unifi Controllers lösen kann:

1. ID des Unifi-Geräts herausfinden

An dieser Stelle sind die Entwicklertools im Browser nützlich. Einmal geöffnet, sieht man im „Network“ Tab alle Netzwerkanfragen, die die Seite stellt. Ändert man nun eine Einstellung eines Accesspoints (Unter „Unifi Devices“), sieht man eine Anfrage in folgendem Format:

https://IP:8443/api/s/default/rest/device/XXXXXXXXXXXXXXXXXXXXXXXX

Eine HTTP Anfrage des Unifi Controllers

Die 24-stellige ID am Ende der URL ist die ID von dem Gerät, das du gerade bearbeitet hast.

2. Skript zum Aktivieren und Deaktivieren

Folgendes Bashskript verwende ich, um den AP zu aktivieren:

Das Skript kann auf einem beliebigen Server, z.B. einem RaspberryPi (auf dem auch mein Unifi Controller läuft) laufen und per Cronjob automatisiert werden.

In den Zeilen 3, 5, 7 und 9 müssen die Werte entsprechend angepasst werden. Um den AP zu deaktivieren, muss in Zeile 15 das „false“ in ein „true“ geändert werden.

Quelle: https://community.ui.com/questions/DISABLE-ENABLE-your-AP-with-time-scheduler-Turn-off-radio-transmitter/3c32439b-a731-4de9-9130-d82d68f409c0

Shelly Plug S in Grafana visualisieren

Wenn man Strom sparen möchte, ist es vorteilhaft zu wissen, welche Geräte wann wie viel Strom verbrauchen. Um das herauszufinden, gibt es Messsteckdosen, die man zwischen Steckdose und Stecker stecken kann, um den Stromverbrauch zu messen. Eine Möglichkeit dafür ist die Shelly Plug S. Diese Steckdose lässt sich per App bedienen. Dort kann man neben der aktuellen Leistung auch den Stromverbrauch sehen. Ein Diagramm, welches die Leistung über einen Zeitraum angibt, gibt es hier aber leider nicht. Und außerdem ist die Steckdose in dieser Form von der Cloud abhängig – das möchte auch nicht jeder.

Was ich an Shellys gut finde, ist, dass man sie auch völlig Lokal per Webinterface oder MQTT bedienen kann. Theoretisch kann man auf den meisten von ihnen sogar eine eigene Firmware flashen (Info dazu hier: https://templates.blakadder.com/index.html ), aber das wäre mir an dieser Stelle zu viel.

Material

Installation von MQTT

Auf dem Server müssen wir einen MQTT Server installieren, an den die Shelly die Daten senden kann:

Konfiguration der Shelly

Die Shelly macht bei ersten Start einen Hotspot auf, mit dem man sich beispielsweise mit dem Handy verbinden kann. Im Browser gibt man dann die Adresse http://192.168.33.1 ein, wo man dann die Zugangsdaten zum WLAN eingeben kann. Danach startet die Shelly neu und man kann nun das Webinterface aus dem Heimnetz öffnen und dort sämtliche Einstellungen vornehmen.

Unter „Internet & Security“, „Advanced Developer Settings“ gibt es hier den Punkt „Enable action execution via MQTT“. Diesen aktivieren wir und geben dann unter „Server“ die IP-Adresse des Servers und den Port (Standard ist 1883) an. Danach das Speichern nicht vergessen!

Shelly MQTT Einstellungen

Eine andere wichtige Einstellung wäre noch unter dem Punkt „Settings“ „POWER ON DEFAULT MODE“, also was passieren soll, wenn die Shelly mal keinen Strom mehr bekommt (z.B. bei einem Stromausfall). Das hängt davon ab, was an der Shelly hängt. Bei einer Lampe macht es Sinn, sie nach einem Stromausfall auszuschalten, während ein Kühlschrank immer an bleiben sollte.

Test

Mit dem Befehl

werden alle Nachrichten im Terminal angezeigt, die per MQTT verschickt werden. Nach spätestens 30 Sekunden (Die Shelly sendet alle 30 Sekunden Daten) sollte es eine Ausgabe geben, die ungefähr so aussieht:

Interessant sind hier die Punkte „Power“ (aktuelle Leistung in Watt) und „Energy“ (Gesamtverbrauch in Wattminuten)

Python Skript

Zuerst müssen folgende Python Module installiert werden:

Mein Code dafür ist folgender:

Kurze Erklärung: (Diese stellen müssen angepasst werden!)

Z. 7-8: Es wird eine Verbindung zur Datenbank hergestellt
Z. 14-15: Die topics von power und energy der Shelly werden subscribed. Hier können auch noch zusätzliche topics hinzukommen, z.B. für die Betriebstemperatur oder weitere Shellys, siehe Abschnitt „Test“)
Z. 19-30: Auch hier muss das topic angepasst werden. In diesem Abschnitt wird dann der Wert in der Konsole ausgegeben und anschließend in die Datenbank in das measurement „shellyplugs1“ in das Feld „leistung“ eingetragen. Dieser Abschnitt muss auch wiederholt werden, falls weitere topics nach Z. 15 hinzugefügt wurden.
Z. 44: Es wird eine Verbindung zum MQTT Broker hergestellt.

Dieses Skript kann nun laufen, zum Beispiel als Systemd Service Unit und schreibt die Daten dann in die Influx Datenbank, von wo sie beispielsweise mit Grafana visualisiert werden können.

Beispiel Visualisierung mit Grafana

Die Shelly hängt bei mir am Kühlschrank. Im folgenden Diagramm sieht man gut, dass die Ausschläge in der Nacht im Gesamtstromverbrauch (gelb) vom Kühlschrank kommen (grün):

Grafna Grafik

Android Apps mit ADB auf eine SD Karte verschieben

Wer viel Fotos, Videos, Musik und Apps auf seinem Handy hat, dem wird vielleicht schon mal der Speicher vollgelaufen sein. Auf den meisten Androidgeräten kann man diesen aber mit einer SD-Karte einfach erweitern. Dateien lassen sich darauf ohne Probleme speichern, Apps seit Android 6 leider nicht mehr. Über einen Umweg funktioniert das aber.

Mit dem tool adb kann man über USB auf die shell des Mobilgeräts zugreifen. Dazu müssen dort zuerst die Entwicklereinstellungen aktiviert werden

Entwicklereinstellungen aktivieren

In den Einstellungen des Geräts befindet sich ein Punkt „Telefoninfos“, „Über das Telefon“ oder ähnlich. Meist ganz oben oder ganz unten. Darin befindet sich die Buildnummer, wo du nun so oft drauf tippst, bis die Meldung „Du bist jetzt Entwickler“ erscheint.

Das Aktivieren von den Entwicklereinstellungen kann von Gerät zu Gerät unterschiedlich sein. Bei Xiaomi ist es zum Beispiel nicht die Buildnummer, sondern die MIUI Version.

Entwicklereinstellungen unter MIUI aktivieren
Entwicklereinstellungen unter MIUI aktivieren

ADB aktivieren

Nun öffnen wir die Entwicklereinstellungen. Wo sich diese befinden, ist wieder von Gerät zu Gerät unterschiedlich. Hier ein Beispiel für Xiaomi:

ADB unter MIUI aktivieren
ADB unter MIUI aktivieren

In den Entwicklereinstellungen gibt es einen Punkt „USB-Debugging“. Wenn du diesen aktivierst, kannst du nun auf dein Gerät über USB zugreifen.

ADB installieren und Shell öffnen

Auf Debian basierenden Linuxdistributionen geht das beispielsweise mit

Bei anderen Betriebssystemen hilft dir das Internet weiter! -> https://www.xda-developers.com/install-adb-windows-macos-linux/

Nachdem du dein Gerät über USB angeschlossen hast, kannst du jetzt mit

In die Shell des Mobilgeräts wechseln. Es kann sein, dass du den Zugriff noch bestätigen musst.

Paketname einer App herausfinden

Um eine App auf die SD Karte zu verschieben, musst du zuerst den Paketnamen er App herausfinden. Die meisten Apps bestehen aus nur einem Paket, manche aber auch aus mehreren.

1. Möglichkeit: Playstore

Öffne den Playstore, am besten im Browser und klicke die gewünschte App an. In der Adresszeile findest du jetzt den App-Namen. Beispiel:

https://play.google.com/store/apps/details?id=org.mozilla.firefox

Der Paketname ist hier org.mozilla.firefox.

2. Möglichkeit: Suchen

Gib in der Shell des Mobilgeräts pm list packages ein. So werden dir alle installierten Pakete aufgelistet und du kannst nach dem gewünschten suchen.

UUID der SD Karte herausfinden

Bevor wir nun endlich mit dem Verschieben anfangen können, brauchen wir noch die UUID der SD Karte. Gib in der Shell ls /storage ein. Neben „emulated“, was der interne Speicher ist, sollte dir auch noch die SD Karte angezeigt werden. Diese müsste im Format XXXX-XXXX sein.

App auf die SD Karte verschieben

Mit folgendem Befehl lässt sich nun ein Paket verschieben:

Wenn nach etwas Warten die Ausgabe „Success“ kommt, hat es funktioniert. Es ist auch möglich, dass es nicht funktioniert, da dich nicht alle Apps auf die SD-Karte verschieben lassen. Nun solltest du auch testen, ob die App noch funktioniert. Manche Apps lassen sich zwar verschieben, funktionieren dann aber nicht mehr.

Möchtest du eine App wieder zurück auf den internen Speicher verschieben, gibst du beim oberen Befehl statt der UUID „internal“ ein.

Bonus: Bloatware entfernen

Mithilfe von pm lassen sich auch Apps deinstallieren, die man am Gerät selbst nicht deinstallieren kann. Hierzu gibt es den Befehl

Aber Achtung: Man sollte sich vorher gut überlegen, was man löscht. Manche Apps sind wichtig und sollten nicht gelöscht werden.