Christian's Ecke im Web

smartpi

SmartPi & Homematic-IP

Einleitung

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:

  • ist die Luftfeuchtigkeit (Schimmelgefahr) im Winter, Frühling oder Herbst zu hoch?
    → Meldung: Fenster öffnen, lüften (oder verwende die Klimaanlage zum Entfeuchten)
  • steht das Fenster im Winter (Kaltluft) schon lange offen?
    → Meldung: Fenster schließen
  • ist es im Freien kühler als in der Wohnung (im Sommer)?
    → Meldung: Fenster öffnen
  • ...es bieten sich noch viele weitere Möglichkeiten.

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.

 

Überblick

über Hardware:

über Software:

Vorkenntnisse / Know-How:

Dieses Projekt ist nichts für Anfänger! Vorkenntnisse mit Raspberry Pi bzw. mit Linux und zumindest einer Programmiersprache sollten vorhanden sein.

persönliche Anmerkung:
Ich selbst hatte zuvor nur wenig Erfahrung im objektorientierter Python-Programmierung und keine Erfahrung eine GUI in Python aufzusetzen. Also lasst euch nicht entmutigen!

Folgender Wissensstand sollte erreicht sein bzw. aufgefrischt werden: Übersicht Lektüre

 

Sicherheit

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.

 

 

Raspberry Pi - SmartPi konfigurieren

1. Grundkonfiguration

Welcome to Raspberry Pi

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.

Einstellungen, Sicherheit und Konfiguration

Nun gehen wir ins Desktop Menü und wählen "Raspberry Pi Konfiguration" und nehmen folgende Änderungen vor:

  • SSH → aktiviert
  • SPI → aktiviert
  • Serial Port → aktiviert
  • Audio → Force 3.5mm
  • Bluetooth → deaktiviert

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.

 

top

2. Touchscreen

Hinweis:
Die folgende Anleitung bezieht sich auf das LCD-Touchscreen von Pollin.de / Produkt-Modell: JD70M6M- HL080IA-01E C35-HX/M

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.

 

top

3. Python3, PyQt5

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

 

top

4. MariaDB, nginx, PHP7

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.

 

top

5. phpMyAdmin (Optional)

in Bearbeitung

 

top

6. piVCCU

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

 

top

7. RedMatic (Node-RED)

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".

 

top

8. MQTT Broker (mosquitto)

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
Port: 1883
Benutzername: Benutzername
Kenntwort: Passwort
 

Die Knoten befinden sich unter "network" mit der Bezeichnung "mqtt in" (sub) und "mqtt out" (pub).

 

top

9. Testphase

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:


Test-GUI (Python3 + PyQt5)

Testflow (Node-RED)
 

Anleitung:

  1. am RasPi Zip-Archiv herunterladen und entpacken.
  2. Datei "main.config":
    Unter [MYSQL] ist PASSWORT und unter [MQTT] sind BENUTZERNAME und PASSWORT, die im Zuge der Konfiguration festgelegt wurden, entsprechend abzuändern.
  3. Datei "main.py"
    Datei ausführen: sudo python3 ./main.py
    Verbindungsstatus von MySQL und MQTT sollten Grün sein!
    Verbindungsstatus ist Rot? ⇒ Error beachten; main.config anpassen; status der Dienste prüfen; etc.
  4. Datei "Node-RED_testflow.txt"
    Importiere den Inhalt der Datei in Node-RED: Menü → Import → ins Textfeld einfügen → Import (siehe auch Wiki)
    Klicke die 3 Tests durch. Es sollten Symbole in Grün erscheinen.

Fehler oder Probleme?Github
Kaffee spendieren?PayPal

top

 

 

Python3 / PyQt5 - SmartPi programmieren

1. Vorwort

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:

  • Import der erforderlichen Bibliotheken
  • GUI laden, einbinden und ausführen
  • Anbindung an MySQL
  • Verbindung mit MQTT samt Client (Thread)
  • Erstellung und Darstellung eines PyQt - Dialogs

 

top

2. Struktur und Aufbau

in Bearbeitung (u.a. checkWLAN,config)

 

top

3. Icons, Bilder & Grafiken

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

  • Sommerzeit
  • Befehle für die Shell aus Python
  • Bildschirmschoner samt Infos
  • E-Mail versenden
  • zeitgesteuerte Aufrufe (myRefresh)
  • Wetter, Nachrichten, WienerLinien