Einfache Heimautomatisierung auf dem Raspberry Pi mit Python
Thomas Koch @tomy_koch
Pi and More 9Uni Trier 11. Juni 2016
über mich• Thomas Koch
• Bonn
• Software-Entwickler
• Python, JavaScript, Web ...
• Python User Group PyCologne
• Orga PythonCamp
• Hobby-Bastler
• Raspberry Pi
• OrbiTeam Software (Bonn)
• BSCW (Collaboration Server)
Agenda• Heimautomatisierung
• Hintergrund und Anwendungsbeispiele
• Heimautomatisierung mit dem Raspberry Pi
• Kurzeinführung: Hardware, GPIO mit Python
• Praktische Anwendungen
• Bewegungsmelder
• Temperaturmessung
• Funksteckdose(n) steuern
• Anbindung einer WebCam
• Benutzerschnittstelle leicht gemacht
• PyHome - einfache Web-App zur Heimautomatisierung
HEIMAUTOMATISIERUNGMo#va#on
4
Heimautomatisierung (Home Automation)
• Idee: Überwachung und Steuerung elektrischer Geräte im Haushalt
• durch Verbindung von Sensoren und Aktoren über eine Steuereinheit im Haushalt
• Sensoren: Thermometer, Bewegungsmelder, Rauchmelder, Kamera, Druckschalter
• Aktoren: (Funk)steckdose, Relais, LED, Servo-Motor
• Steuereinheit (Controller): Hardware + Software
• Ziele
• Kostenersparnis durch 'intelligente' Steuerung (Heizkosten/Stromkosten)
• Mehr Komfort durch automatische Anpassung der Umgebung (z.B. Lichtsteuerung: zeitgesteuert, je nach Helligkeit/Bewegung etc.)
• Spaß & Spiel
Heimautomatisierung: Beispiele
• Automatische Heizungssteuerung und Monitoring der Energiekosten
• Automatisch Rolladen zu bestimmter Zeit hochfahren
• Lampen im Haus in Gruppen anordnen und per FB steuern
• Bei Annäherung das Garagentor öffnen
• E-Mail wenn Briefkasten geöffnet wird
• Foto wenn Türklingel betätigt wird
• Alarmanlage
Heimautomatisierung: Komponenten
• Controller (Steuereinheit)
• Hardware: PC, RaspberryPi, Arduino, NAS, Fritzbox etc.
• Software: Make or Buy !?
• fertige Lösung - z.B.
• FHEM (Perl, www.fhem.de)
• openHAB (Java, www.openhab.org)
• eigene Lösung entwickeln
• auf Basis von Python & bestehenden Bibliotheken
• HCI (Human Computer Interface)
• Fernbedienung (IR)
• Touchscreen (z.B. Tablet)
• Web-GUI
• Smartphone App
Controller
Sensor Aktor
HCI
HardwareSoftware
RASPBERRYPI,GPIO,PYTHONGrundlagen
Vorstellung: Der Raspberry Pi
• SOC Minicomputer: "System on a chip"
• GPU + CPU + RAM = BCM2835
• on-board: Ethernet-Schnittstelle und zwei USB-Anschlüsse (Modell B)
• "BYOP"-Prinzip: "bring your own peripherals“
• Lieferung ohne Maus, Tastatur, Netzstecker etc.
• Nackte Platine (ohne Gehäuse), ohne SD-Card und OS
• Einsetzbar für Elektronikprojekte
• Steuerung elektronischer Geräte mittels Ein-/Ausgabekontakte (GPIOs)
Thomas Koch
Hardware: Raspberry Pi
• GPIO
• General Purpose Input/Output
• CSI
• CameraSerial Interface
• HDMI
• Video out
• micro USB
• PowerRaspberry Pi2 Model B2nd generation Raspberry Pi
Datenblatt: Raspberry Pi
• aktuelles Modell: Raspberry Pi3 Model B— 3rd generation Raspberry Pi
• Kosten: ca. 30 € (nur Board)
• 1 GB RAM / CPU: 64-Bit-QUAD-Core ARMv8-Prozessor BCM2837 (1,2 GHz)
• Betriebsspannung: 5 V (Micro-USB Buchse)
• Datenträger: Micro SD Speicherkartenslot
• Anschlüsse: HDMI, LAN 10/100 Mbps, 4x USB 2.0, Audio, Video-Out
• Erweiterte 40-Pin-GPIO
• Integrierter WiFi-Adapter BCM43438
• Integriertes Bluetooth Low Energy (BLE) Modul
• Quelle: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/
Python auf dem Raspberry PI
• Batteries included : Python & Raspbian OS
• Raspbian kommt mit Python 2.7 und 3.4
• aktuell: Raspbian Wheezy4.1 mit Python 2.7.9 und Python 3.4.2
• Entscheidung für eigene Projekte: Py27 oder Py3x (aktuell: 3.5)
• Should I use Python 2 or Python 3: https://wiki.python.org/moin/Python2orPython3
• Zusatzpakete per apt-get oder ‚pip install‘ installieren
• GPIO mit Python
• In Raspbian vorinstalliert: RPi.GPIO
• Python Bibliothek für einfachen GPIO Zugriff https://pypi.python.org/pypi/RPi.GPIO
• Hinweis: Zugriff auf GPIO erfordert root Recht
Beispiel: RPi.GPIO
• LED einschalten
import RPi.GPIO as io
# header pin numbering io.setmode(io.BCM) # Setup one output channelio.setup(18, io.OUT)# set pin output highio.output(18, io.HIGH)
https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/
BACKEND PRAKTISCHEANWENDUNGEN
Bewegungsmelder
• Bewegungsmelder als einfacher Sensor
• PIR-Bewegungsmelder (passive infrared) sind kostengünstig und effizient
• Anschluss über GPIO
• Steuerung per Python-Script (RPi Library)
• Achtung: nur Sensoren mit 3.3 V Ausgangsspannung verwenden!
• Schaltung
• PIR-Bewegungsmelder schaltet gelben PIN auf 3.3V
• Anschluss an 5V (rot) und GND (schwarz)
siehe https://learn.adafruit.com/adafruits-raspberry-pi-lesson-12-sensing-movement/
Bewegungsmelder auslesen
• Python Codeimport timeimport RPi.GPIO as io
io.setmode(io.BCM)
pir_pin = 18io.setup(pir_pin, io.IN)
while True: if io.input(pir_pin): print("PIR MOTION") time.sleep(1)
Temperaturmessung
• Um Temperaturen zu messen, braucht man
• einen Sensor, der Temperatur in eine Spannung umsetzt
• einen A/D-Wandler, der das analoge Signal digitalisiert
• aber: Raspberry Pi unterstützt nur digitale Signale (via GPIO)
• Temperatursensor für Raspi: DS1820(B)
• ist Temperatursensor und A/D-Wandler in einem
• ist bereits kalibriert (Genauigkeit +-0,5°C)
• verwendet 1-Wire-Ausgang
• d.h. man benötigt nur einen einzigen GPIO-Pin (auch für mehrere Sensoren)
Temperatursensor: Anschluss
• Vorbereitung (Linux)
• 1. Aktivierung des Device Tree Overlay für 1-wire - in /boot/config.txtdtoverlay=w1-gpio
• 2. Kernelmodule laden (permanent) - in /etc/modules w1-gpio pullup=1 w1-therm
• Schaltung
• DQ an GPIO Port 4 (ist für den Einsatz als 1wire-Bus vorgesehen!)
• VDD an 3,3V (rot)
• GND an GND (schwarz)
• Pull-up Widerstand 4,7 kOhm
Quelle: https://www.raspiprojekt.de/machen/basics/schaltungen/9-1wire-mit-temperatursensor-ds18b20.html
Temperatursensor auslesen
• Python Code
• verwendet Bibliothek "W1ThermSensor"https://timofurrer.github.io/w1thermsensor
• $ pip install w1thermsensor
from w1thermsensor import W1ThermSensor
sensor = W1ThermSensor()temperature_in_celsius = sensor.get_temperature()
Funksteckdose
• Technik
• Funksteckdosen mit Fernbedienung sind verbreitet und kostengünstig (z.B. Elro AB440S/3C Funksteckdosen Set)
• Steuerung Funksteckdose erfolgt über 433 MHz Frequenz
• via 434MHz RF Link Transmitter (Sendemodul)
• Python Bibliotheken
• elropi.py - verwendet RPi.GPIO Libraryhttp://pastebin.com/aRipYrZ6
• elro_wiringpi.py - verwendet WiringPi Libraryhttp://www.raspberrypi.org/forums/viewtopic.php?f=32&t=32177
$ python elro_wiringpi.py 8 1 # Switch D is turned on
Funksteckdose: Anschluss des Sendemoduls
• Schaltung
• DATA an GPIO Port (gelb)
• VCC an 5V (rot)
• GND an GND (schwarz)
• ANT
• Antennenkabel (17 cm)
• Bild: https://www.raspberrypi.org/forums/viewtopic.php?f=37&t=66946s. auch https://alexbloggt.com/funksteckdosen-raspberry-pi-teil1/
Funksteckdose steuern
• Python Code
• verwendet elro.py
import time from elro import RemoteSwitch
# Variablen entsprechend der dip-Schalter anpassen!default_key = [1,0,0,0,1] # Gerätecode („system code“)device_num = 1 # 1. Steckdose („unit code“)# GPIO pin an Verdrahtung auf Raspberry Pi anpassen!default_pin =17device = RemoteSwitch(device=device_num, key=default_key, pin=default_pin)
device.switchOn()time.sleep(5)device.switchOff()
Kamera
• Anbindung einer Kamera
• Fotos lassen sich am einfachsten mit einer USB-WebCam aufnehmen
• Bild aufnehmen von WebCam (Linux)
$ apt-get install fswebcam $ fswebcam -v -r "640×480" test.jpg
• Ausblick
• Das (Linux) motion-Paket bietet Bewegungs-Erkennung (Motion Detection)
• Die Python-Bibliothek OpenCV bietet weitreichende Möglichkeiten zur Weiterverarbeitung (inkl. Bilderkennung) …
Kamera
• Python Code
• Ziel: Foto aus Python heraus mit USB-WebCam aufnehmen
• Lösung: shell-wrapper Bibliothek ‚sh’ plus ‚fswebcam’ Kommando
import sh, os, datetime
timeString = datetime.datetime.now().strftime(„%Y%m%d_%H%M")snapshot = "snapshot-%s.jpg" % timeStringsnapshot = os.path.join("static", "webcam", snapshot)
sh.fswebcam("--title", "Home", "--save", snapshot)
Hardware-Setup
• Bastel-Lösung auf Breakout Board
Bewegungsmelder
USB-Webcam
Temperatursensor
433MHz Transmitter
FRONTEND PYHOME-WEB-GUI
PyHome - einfache Web-App zur Heimautomatisierung
• Anforderungen an die Benutzerschnittstelle
• Anzeige der Daten von Sensoren
• Bewegungsmelder
• Temperaturmessung
• aktuelles Bild der WebCam
• Steuerung der Aktoren
• Funksteckdose(n) steuern
• Allgemein
• einfache Bedienung, mobile friendly
PyHome - Bedienung der Web-App Screenshots
• Home Screen Anzeige der Sensoren
PyHome - Bedienung der Web-App Screenshots
• Home Screen Steuerung der Aktoren
PyHome - Web-App Technik: Python, HTML, JavaScript
• Flask Web-App
• basiert auf Flask Web-Framework
• verwendet jQuery Mobile (JavaScript UI Framework)
• one pager
• Umfang
• 3 Python Module (174 LOC)
• 1 JavaScript Modul (54 LOC)
• 1 HTML Template (index.html - 85 Zeilen)
PyHome - Web-App Flask
• Flask Web-Framework http://flask.pocoo.org
• schnell eine Web-Anwendung erstellen
• Templates einbinden (Jinja2 template engine)
• einfach Funktionen über URLs ansprechen http://myapp.local/turn/1
• oder auch Klassenbasierte Views einsetzen ...
• Beispiel @app.route("/turn/<switch>", methods=["POST"])def turn(switch): on = request.form['cmd']=="on" details = {} if turnSwitch(switch, on): timeString = datetime.now().strftime(„%Y-%m-%d %H:%M") details.update({'time': timeString}) return jsonify(**details)
PyHome Howto
• Kurzanleitung zum Selbermachen
• $sudoapt-getinstallgit-core
• [email protected]:tommykoch/pyhome.git
• $sudopipinstall-rrequirements.txt
• $sudoapt-getinstallfswebcam
• $sudopythonhome.pystartetflaskwebserver(development)aufport80
Kontakt / Fragen• Thomas Koch
• Twitter: @tomy_koch
• Folien: http://de.slideshare.net/tomykoch
• PyCologne
• http://wiki.python-forum.de/pycologne
• http://www.pycologne.de
• PyHome (Quellcode)
• https://github.com/tommykoch/pyhome
Links
• Raspberry Pi Tutorials & Seiten zum Einstieg
• Raspberry Pi Wiki: http://elinux.org/RPi_Hub
• Flask on Pi Tutorial http://flaskpi.com/tutorials
• Tutorial-Übersicht: http://www.forum-raspberrypi.de/Thread-tutorial-uebersicht
• Tutorial-Website: http://raspberrypiguide.de
• Nützliche Raspberry Pi Websites
• Raspberry Foundation (EN): http://www.raspberrypi.org
• Adafruit (Tutorials, hardware kits, etc. - EN): http://learn.adafruit.com
• Online-Magazin (EN): http://www.themagpi.com
Literatur
• Raspberry Pi - Einstieg • Optimierung • Projekte
Maik Schmitd, dpunkt Verlaghttp://www.dpunkt.de/raspi
• Getting Started with Raspberry Pi (Englisch)
Verlag: o’reilly/makershttp://blog.makezine.com/2012/12/25/ten-raspberry-pi-tips
• Hacking Electronics: An Illustrated DIY Guide for Makers and Hobbyists (Englisch)
Verlag: Mcgraw-Hill Publ.Comp.http://www.amazon.de/Hacking-Electronics-Illustrated-Makers-Hobbyists/dp/0071802363
Copyrights• Markennamen
• The Raspberry Pi Word Mark and Raspberry Pi Logo are owned by the Raspberry Pi Foundation.
• All brand names names and marks mentioned may be trademarks or registered trademarks of their respective owners.
• Bildquellen:
• Logos: python.org, http://www.raspberrypi.org , pycologne.de
• PIR Sensor Closeup, PIR Breadboard Layout, ...
• https://learn.adafruit.com/assets
• by Simon Monk (Attribution Creative Commons License)
• Indy Car in Garage: Flickr (creative commons share-alike) Thanks to John P.
• House in rural Puxin Township: Flickr (Attribution-NonCommercial 2.0 Generic) Thanks to Alexander Synaptic
Top Related