36
Einfache Heimautomatisierung auf dem Raspberry Pi mit Python Thomas Koch @tomy_koch Pi and More 9 Uni Trier 11. Juni 2016

Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

Embed Size (px)

Citation preview

Page 1: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

Thomas Koch @tomy_koch

Pi and More 9Uni Trier 11. Juni 2016

Page 2: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

ü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)

Page 3: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 4: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

HEIMAUTOMATISIERUNGMo#va#on

4

Page 5: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 6: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 7: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 8: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

RASPBERRYPI,GPIO,PYTHONGrundlagen

Page 9: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 10: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 11: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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/

Page 12: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 13: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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/

Page 14: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

BACKEND PRAKTISCHEANWENDUNGEN

Page 15: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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/

Page 16: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 17: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 18: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 19: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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()

Page 20: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 21: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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/

Page 22: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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()

Page 23: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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) …

Page 24: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 25: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

Hardware-Setup

• Bastel-Lösung auf Breakout Board

Bewegungsmelder

USB-Webcam

Temperatursensor

433MHz Transmitter

Page 26: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

FRONTEND PYHOME-WEB-GUI

Page 27: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 28: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

PyHome - Bedienung der Web-App Screenshots

• Home Screen Anzeige der Sensoren

Page 29: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

PyHome - Bedienung der Web-App Screenshots

• Home Screen Steuerung der Aktoren

Page 30: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 31: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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)

Page 32: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

PyHome Howto

• Kurzanleitung zum Selbermachen

• $sudoapt-getinstallgit-core

[email protected]:tommykoch/pyhome.git

• $sudopipinstall-rrequirements.txt

• $sudoapt-getinstallfswebcam

• $sudopythonhome.pystartetflaskwebserver(development)aufport80

Page 33: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 34: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 35: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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

Page 36: Einfache Heimautomatisierung auf dem Raspberry Pi mit Python

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