Ich erkenne nicht die Notwendigkeit darin, dass meine Kaffeemaschine automatisch um 8 Uhr beginnt einen Kaffee für mich aufzusetzen, oder, dass am Abend vorm Fernseher automatisch das Licht gedimmt wird und die Rollos runtergehen, oder, ... bla bla ...
Man erkennt, dass ich dem Begriff Hausautomation sehr skeptisch gegenüber stehe. Worin ich jedoch einen Sinn für ein intelligentes Haus bzw. einer intelligenten Wohnung sehe, ist u.a. bei Logikverknüpfungen:
Wenn dann noch einige relevanten Daten und Informationen ersichtlich sind und das System gut geschützt ist, genügt mir das schon. Wem das zu wenig ist, der kann immer noch mittels Modbus (oder, sollte man etwas zu viel Geld übrig haben, KNX) vereinzelte Hausgeräte in das System einbinden.
Dieses Projekt ist nichts für Anfänger! Vorkenntnisse mit Raspberry Pi bzw. mit Linux und zumindest einer Programmiersprache sollten vorhanden sein.
Folgender Wissensstand sollte erreicht sein bzw. aufgefrischt werden: Übersicht Lektüre
Mir persönlich liegt sehr viel an der Sicherheit von Daten bzw. dem Datenzugriff. Da jedes System - manche mehr, manche weniger - anfällig ist, sollte man NIE auf die Haussteuerung außerhalb vom Heim-Netzwerk zugreifen können.
Das bedeutet: KEINE PORT-WEITERLEITUNG am Router einrichten.
Um dennoch Daten von Unterwegs zu sehen und ggf. ins System eingreifen zu können, ist eine passive Datenübertragung (die Daten werden nicht "geschickt" sondern "geholt") vorzuziehen.
Szenario: Über ein passwortgeschütztes Webinterface kann man Haus-/Wohnungs-Daten einsehen und Einstellungen am System vornehmen. Die Änderungen an den Einstellungen werden jedoch nicht direkt an den SmartPi übertragen, sondern als Befehle am Webserver abgelegt. Der SmartPi greift alle 5-10 Minuten auf den Webserver zu und überprüft auf neue Befehle und aktualisiert die Daten.
Auch wenn es sich um zwei Raspberry Pis im selben Haushalt (1x SmartPi, 1x Webinterface am privaten Server) handelt, sollte dennoch kein direkter Zugriff auf die Haussteuerung außerhalb vom Heim-Netzwerk möglich sein.
Wir beginnen am Anfang: die aktuelle Raspbian Version wurde mittels "Win32 Disk Imager" auf die Speicherkarte übertragen und in den Kartenslot gesteckt; der Raspberry Pi muss nun an Bildschirm (HDMI), Tastatur, Router (Ethernet-Kabel) und am Strom angeschlossen werden.
Nach dem Bootvorgang gelangt man zum Desktop und das "Welcome to Raspberry Pi" Fenster öffnet sich. Dieses "Willkommen"-Fenster gibt es seit Debian Version 9 (Stretch) und ist im aktuellen Debian Version 10 (Buster) sehr verständlich aufgebaut. Deshalb gehe ich hier nicht darauf näher ein, geht es einfach Schritt für Schritt durch.
Nun gehen wir ins Desktop Menü und wählen "Raspberry Pi Konfiguration" und nehmen folgende Änderungen vor:
Außerdem nehmen wir die Aktualisierungen übers Terminal vor:
sudo apt update && sudo apt full-upgrade
Änderung von Hostname, Username, Passwort, SSH-Port, usw. nach eigenem Ermessen.
In der boot/config werden folgende Zeilen ergänzen bzw. auf folgendes geändert:
sudo nano /boot/config.txt
#Touchscreen
framebuffer_width=1024
framebuffer_height=768
framebuffer_depth=16
hdmi_group=2
hdmi_mode=87
hdmi_cvt=1024 768 68 34 3 0 0 0
sdtv_mode=1
display_rotate=0
sudo shutdown -h 0
Nun schließen wir unseren Touchscreen inkl. USB an und starten den RasPi. Das Display sollte bereits funktionieren, jedoch noch ohne Touch-Funktion.
Test ob das Touchscreen als USB-Device erkannt wird:
lsusb
Bus 001 Device 005: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax TouchScreen
Bus 001 Device 004: ID abcd:1234 Unknown
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Pakete installieren und Reihenfolge der Dateien verändern (um 40-libinput.conf vorher zu laden):
sudo apt update
sudo apt install xserver-xorg-input-evdev xinput-calibrator
sudo mv /usr/share/X11/xorg.conf.d/10-evdev.conf /usr/share/X11/xorg.conf.d/45-evdev.conf
Kalibrierungssoftware am RasPi starten (Einstellungen > Touchscreen Kalibrieren).
Sollte die Touchfunktion nicht erkannt werden, dann USB-Kabel rausziehen und erneut einstecken.
Fenster nicht schließen, neues Terminal öffnen und Textabschnitt Section……EndSection kopieren:
sudo nano /usr/share/X11/xorg.conf.d/99-calibration.conf
Beispiel:
Section "InputClass"
Identifier "calibration"
MatchProduct "eGalax Inc. Touch"
Option "Calibration" "43 1990 94 1983"
Option "SwapAxes" "0"
EndSection
Unter Einstellungen das Programm „Appearance Settings" starten und im Reiter „Menu Bar“ Size auf „very Large“ setzen UND im Reiter „Defaults“ aufs „Set Defaults“ von „For large screens“ klicken.
Raspbian-Bildschirmschoner dauerhaft deaktivieren:
sudo apt-get install xscreensaver
Unter Einstellungen das Programm „Bildschirmschoner“ starten und dann den Bildschirmschoner deaktivieren.
Touchscreen um 180° drehen:
Wenn man mein 3D-Gehäuse verwendet, dann muss man das Bild um 180° drehen. Folgende Änderungen sich erforderlich:
sudo nano /boot/config.txt
display_rotate=2
ÄNDERN ZU
display_rotate=2
sudo nano /usr/share/X11/xorg.conf.d/99-calibration.conf
Zeile Option "Calibration" anpassen zu...
Option "Calibration" "1983 43 1990 94"
Dann starte den RasPi neu und führe die Kalibrierungssoftware erneut, wie oben beschrieben, aus.
Python3 ist bereits am Pi enthalten, wir installieren jedoch noch einige Erweiterungen die benötigt werden:
sudo apt install python3 python3-pip python3-dev
sudo pip3 install mysqlclient
PyQt5 installieren:
sudo apt install python3-pyqt5 python3-pyqt5.qtwebkit python3-pyqt5.qtmultimedia
Mit einer simplen Messagebox, die wir uns von Github holen, testen wir ob PyQt am RasPi funktioniert:
cd
wget https://raw.githubusercontent.com/DIY-Blub/codeschnipsel/master/smartpi/messagebox.py
python3 ./messagebox.py
MariaDB installieren, Datenbank anlegen und Benutzer hinzufügen:
sudo su
apt install mariadb-server
mysql -u root
Datenbank Anlegen:
CREATE DATABASE smartpi;
Benutzer Anlegen:
CREATE USER 'userpi'@'localhost' IDENTIFIED BY 'Passwort';
GRANT ALL ON *.* TO 'userpi'@'localhost';
exit
# Ausstieg mysql
exit # Abmeldung Superuser
OPTIONALER SCHRITT: automatisches Backup der Datenbank
Um etwaige Datenverluste zu minimieren, erstellen wir uns ein Shell-Script für ein tägliches Backup der Datenbank. Man kann Pfade und Dateinamen nach eigenen Wunsch anpassen, Beispiel für das Homeverzeichnis von Benutzer pi:
cd
sudo mkdir MySQL-Backups
sudo nano MySQLbackup.sh
#!/bin/bash
cd /home/pi/
TIMESTAMP=$(date +"%F")
FILENAME="mysql_smartpi-backup-$TIMESTAMP.sql"
sudo mysqldump smartpi --single-transaction --quick --lock-tables=false > $FILENAME -u root 2>> MySQL-Backups/Backup_MySQL.log
if [ -f /home/pi/$FILENAME ]; then
sudo mv $FILENAME MySQL-Backups/ 2>> MySQL-Backups/Backup_MySQL.log
else
echo "$TIMESTAMP - Datei $FILENAME konnte nicht angelegt werden" >> MySQL-Backups/Backup_MySQL.log
fi
sudo chmod +x MySQLbackup.sh
sudo su
nano /etc/crontab
Wir tragen den Crontab (täglich um 04:05 Uhr) am Ende der Datei ein:
5 4 * * * root /home/pi/
MySQLbackup.sh
/etc/init.d/cron restart
exit # Abmeldung Superuser
nginx und php7 installieren:
sudo apt install nginx php7.3 php7.3-fpm php7.3-mysql php7.3-mbstring
PHP-Testdatei und nginx-Konfigurationsdatei herunterladen:
sudo wget -O /var/www/html/index.php https://raw.githubusercontent.com/DIY-Blub/codeschnipsel/master/php/phpinfo
sudo wget -O /etc/nginx/conf.d/server.conf https://raw.githubusercontent.com/DIY-Blub/codeschnipsel/master/smartpi/server.conf
sudo rm /etc/nginx/sites-enabled/default
sudo service nginx restart
Am RasPi öffnet man nun den Browser und ruft die Seite (URL) "localhost" auf.
in Bearbeitung
Die CCU gibt es als Image für den Raspberry Pi. Jedoch bleibt dabei ein großer Teil der Ressourcen, die ein RasPi hat, ungenützt. Deshalb rate ich zu der virtuellen CCU, mit dem Namen "piVCCU", von Alex Reinert.
Sein Projekt befindet sich auf Github: https://github.com/alexreinert/piVCCU
Darunter auch eine 10 Schritte Anleitung für den Raspberry Pi: zur Anleitung
Das Projekt von RedMatic befindet sich ebenfalls auf Github: https://github.com/rdmtc/RedMatic
Die Installation erolgt über das Webinterface der CCU (piVCCU): zur Anleitung
Generell ist die Wiki von RedMatic sehr gut (und auf Deutsch): zur Wiki
MySQL Addon hinzufügen (siehe auch Wiki):
In Node-Red einloggen, Rechts oben im Eck das Menü öffnen, auf „Manage palette“ klicken und zum Reiter „Install“ wechseln. Dort nach „mysql“ suchen und „node-red-node-mysql“ installieren.
CCU Benutzer in MariaDB hinzufügen:
Damit wir von Node-RED direkt in die Datenbank schreiben (und auch lesen) können, benötigt die CCU Zugriff auf die MySQL-Datenbank. Benutzer hinzufügen:
sudo su
mysql -u root
CREATE USER 'ccu'@'192.168.253.2' IDENTIFIED BY 'newPasswort';
GRANT ALL ON *.* TO 'ccu'@'192.168.253.2';
exit
# Ausstieg mysql
exit # Abmeldung Superuser
In Node-RED erstellen wir uns einen MySQLDatabase-Knoten mit folgender Eingabe:
Host: 192.168.253.1
Port: 3306
User: ccu
Password: newPasswort
Database: smartpi
Timezone:
Der Knoten befindet sich unter "Speicher" mit der Bezeichnung "mysql".
Zum Nachrichtenaustausch zwischen Python und Node-RED verwenden wir einen MQTT Broker. Der Vermittlungsserver hat zwei Kanäle: publish (veröffentlichen) und subscribe (abonnieren)
sudo apt install mosquitto mosquitto-clients
Installation vom Paket zur Einbindung in Python3:
sudo pip3 install paho-mqtt
Benutzer anlegen:
mosquitto_passwd -c passwordfile Benutzername
sudo mv passwordfile /etc/mosquitto/
cd /etc/mosquitto/conf.d
sudo nano mymqtt.conf
ERGÄNZE
allow_anonymous false
password_file /etc/mosquitto/passwordfile
sudo service mosquitto restart
Beispiel und Test im Terminal:
Wir öffnen ein zweites Terminal und erstellen den "Zuhörer" (sub)
mosquitto_sub -h localhost -u 'Benutzername' -P 'Passwort' -v -t test_channel
Im anderen Terminal schicken wir unsere Nachricht weg (pub)
mosquitto_pub -h localhost -u 'Benutzername' -P 'Passwort' -t test_channel -m 'Testnachricht'
Dokumentation mosquitto:
In Node-RED erstellen wir uns einen MQTT-Broker-Knoten mit folgender Eingabe:
Name: MQTT-Broker |
||
Verbindung | Sicherheit | Nachrichten |
Server: 192.168.253.1 |
Benutzername: Benutzername |
Die Knoten befinden sich unter "network" mit der Bezeichnung "mqtt in" (sub) und "mqtt out" (pub).
Die Konfiguration vom SmartPi ist nun soweit abgeschlossen. Vereinfachte Darstellung vom Setup:
Für einen ausführlichen Test und um euch den Umgang mit PyQt5, Node-RED und MQTT zu erleichtern, habe ich euch eine Test-GUI samt Testflow für Node-RED erstellt:
Anleitung:
Fehler oder Probleme? ⇒ Github
Kaffee spendieren? ⇒ PayPal
Hier jetzt meinen "fertigen" Code zu übergeben, wäre sinnlos. Mein Code ist auf meine Wünsche und individuellen Bedürfnisse zugeschnitten und wird laufend erweitert / verändert. Dementsprechend ist der Code nicht gerade übersichtlich oder hält sich an den Profi-Programmier-Standard. Das ist dann bei über 3.000 Zeilen Code vermutlich nicht mehr einfach zu durchschauen.
Dennoch biete ich euch gerne meine Ideen und Erfahrung an. Vieles davon wird bei einem Codeschnipsel bleiben: Einbindung von OpenWeatherMap, Nachrichten, usw.; Umsetzung von Sommerzeit, Animation, u.ä.
Folgender Wissensstand sollte erreicht sein bzw. aufgefrischt werden: Übersicht Lektüre
Für den ersten Einstieg hilft das Zip-Archiv aus "SmartPi konfigurieren: Testphase". Die darin enthaltene Datei "testwindow.ui" wurde mit dem Qt-Designer erstellt. Die Datei "main.py" beinhaltet bereits folgendes:
in Bearbeitung (u.a. checkWLAN,config)
Ein wichtiger Bestandteil der GUI sind Icons, Bilder, Fotos und Grafiken! Kostenlose Icons, Bilder und Fotos bekommt man u.a. unter:
Für eine 3D-Ansicht der eigenen Wohnung kann man den kostenlosen Raumplaner von SCHÖNER WOHNEN verwenden. Die 3D-Ansichten kann man je Raum als Hintergrundbild mit Bedienelemente verwenden.
Grafiken und Diagramme sollten direkt am SmartPi generiert werden. Hierfür bieten sich die kostenlosen Highcharts an.
Themen in Bearbeitung
Mein persönliches Interesse führt mich immer wieder zu verschiedenen Fachgebieten. Die meisten sind nicht schwer zu erlernen, aber die Recherche kann zeitaufwendig sein. Auf meiner privaten Website möchte ich meine Erfahrungen und mein Wissen weitergeben, um den Einstieg in die Welt des Bastelns zu erleichtern!