Praxis

Raspberry Pi - Auslöser-Code plus Cloud-Speicher

Raspberry Pi

Die Anleitung ergänzt die Artikelserie über die Raspberry-Pi-Kamera ab FOTO HITS 12/2016. Auf dieser Seite kann man den Code kopieren, der den Kameraauslöser steuert und zudem die Bilder in einem Cloudspeicher im Internet sichert. 

Die Redaktion empfiehlt, das Zip-Paket herunterzuladen, das das fertige Skript ausloeser_cloud.py enthält, statt es unten zu kopieren. Nach einem Rechtsklick auf den folgenden Link bietet das Kontextmenü je nach Browser etwa an: "Link speichern unter ...": Download Python-Datei

Voraussetzung ist, dass ein Cloud-Service eingerichtet ist, da ein normaler Heimrechner nicht so wie etwa eine Firmen-Website von außerhalb ansprechbar ist. Dort landen die Bilder neben dem regulären "image"-Verzeichnis. Hier gibt es zwei Möglichkeiten:

  1. Am einfachsten ist, einen Cloud-Anbieter wie etwa "DropBox" zu nutzen. Die Installation wird nachfolgend beschrieben.
  2. Mit ownCloud erhält man einen Cloud-Speicher wie etwa "Google Drive", nur ist er komplett unter eigener Kontrolle. Von jedem Ort der Welt kann man darauf zugreifen, wobei eine abgestufte Rechtevergabe garantiert, dass im Zweifelsfall nur bestimmte Personen Fotos sehen oder gar herunterladen. Die Möglichkeiten sind weitreichend, doch erfordert die Installation viel Geduld und Fachkenntnisse. Eine gute Beschreibung liefert etwa tec-blogger.de

Hat man auf seinem Raspberry Pi erfolgreich "DropBox" installiert, landen alle Fotos sofort nach dem Auslösen im Cloud-Speicher.

DropBox installieren

Das Installationspaket unter www.dropbox.com/install-linux funktioniert nicht für den Raspberry Pi, aber es gibt eine Alternative. Wer schrittweise der Anleitung folgt, kommt in höchstens zehn Minuten zum Erfolg.

Wichtiger Tipp: Das Tastatur-Layout ist voreingestellt amerikanisch. Es sollte  über "Menü - Einstellungen - Tastatur und Maus" auf "Deutsch" umgestellt werden.

  1. Am normalen Desktop Rechner oder dem Raspberry Pi https://www.dropbox.com ein Konto erstellen. Man sollte dann eingeloggt bleiben, um einige weitere Schritte vorzunehmen.
  2. Auf der Dropbox Seite unten geht man über "Entwickler" zu "Create your app" (Direktlink: https://www.dropbox.com/developers/apps).
  3. Auf "Create App" klicken. Dann "Dropbox API" und "Full Dropbox" wählen
  4. Ihr gibt man einen beliebigen Namen, etwa "raspi". Unten auf der Seite markiert  man "I agree ..." und klickt auf "Create App".
  5. Wichtig ist, den "App key" notieren, und das "App secret" zu notieren
  6. Darunter klickt man auf "Generated access token" und die Schaltfläche "Generate". Dieser Code wird bei der Installation des Dropbox-Uploaders abgefragt. Am besten speichert man die ellenlange Zeichenfolge In einer Textdatei. Diese kann man per USB-Stick zum Rasperry Pi übermitteln und dort öffnen.
  7. Den Raspberry Pi starten und das LXTerminal starten (das Bildschirm-Symbol oben auf der Arbeitsoberfläche)
  8. Dort eingeben: git clone github.com/andreafabrizi/Dropbox-Uploader.git
    Dies lädt und entpackt die benötigte Dropbox-Software
  9. Mit dem Befehl cd Dropbox-Uploader wechselt man in das gerade erstellte Verzeichnis.
  10. Der Befehl ./dropbox_uploader.sh startet die Installation. Als wesentlichen Punkt wird man nach dem "Access Token" gefragt, das man zuvor in der Textdatei gesichert hatte. 
  11. Man startet einen Editor ("Zubehör - Text Editor") und öffnet die Textdatei. Der Der Tastenkombination strg und a markiert alles, strg und c kopiert alles.
  12. Dann wechselt man wieder zum LXterminal.
  13. Die Tastenkombination aus Umschaltaste plus der Taste "Einfg" fügt die Zeichenfolge ein. Dann drückt man die Eingabetaste.
  14. Hat alles geklappt, wird "Configuration has been saved" gemeldet.
  15. Im Verzeichnis Dropbox-Uploader muss man eine Konfigurationsdatei ändern. Mit dem Text Editor öffnet man dropbox_uploader.sh.
  16. Dann sucht man die Zeile SHOW_PROGRESSBAR=0 und ändert die Ziffer in 1. Abschließend wird die Datei gespeichert und geschlossen.

Für einen ersten Test öffnet man im Web-Browser (entweder auf dem Raspberry Pi oder dem Desktop-Rechner die Seite www.dropbox.com und loggt sich (falls nicht schon geschehen) in den eigenen Zugang ein.

Auf dem Raspberry Pi gibt man am LXTerminal ein:

/.Dropbox-Uploader/dropbox_uploader.sh upload quelle.jpg ziel.jpg

 oder falls man im Verzeichnis "Dropbox-Uploader" ist:

/.dropbox_uploader.sh upload quelle.jpg ziel.jpg

Dabei meint quelle.jpg eine beliebige Bilddatei, die als ziel.jpg (oder einem anderen Namen) im Dropbox-Ordner landet. Auf der Dropbox-Oberfläche im Browser sollte danach die Datei auftauchen.

Für eine vernünftige Rechtevergabe sollte man unter www.dropbox.com einen eigenen Ordner anlegen. Die geht über das Ordnersymbol oben in der Benutzeroberfläche ("Neuer Ordner"). Dieser muss den Namen "photobooth" tragen, da es so im FOTO-HITS-Skript vorgegeben ist. Doch kann man das Skript im Editor ändern und dann einen Ordner mit eigenem Namen anlegen.

Auslöser-Skript

Änderbare Variablen:

dropbox_dir = "photobooth" # Nach Wunsch durch eigenen Dropbox-Ordner ersetzen
enable_dropbox = True # True durch False ersetzen, um die Dropbox-Funktion auszuschalten
Wichtig ist:

  1. Niemals den Code in einem Textverarbeitungssystem bearbeiten. Dafür darf nur ein Text-Editor verwendet werden, wie ihn Rasperry unter "Zubehör - Editor" bereitstellt.
  2. Am einfachsten markiert man die Zeilen unten mit dem Mauszeiger und kopiert sie etwa mit dem Tastenbefehl Strg und c. Dann werden sie etwa mit Strg und v in den Texteditor eingefügt.
  3. Die Zeilen müssen so wie auf der Website gezeigt eingerückt werden. Das darf keinesfalls per Leerzeichen geschehen, sondern es muss die Tab-Taste links oben auf der Tastatur genutzt werden – „Python“ ist hier eigen.
  4. Das Ergebnis erhält etwa den Dateinamen ausloeser_cloud.py.

Nachfolgend der Code im Kasten, der auf dem Skript von contractorwolf beruht:

#!/usr/bin/env python
from time import sleep
import os
import RPi.GPIO as GPIO
import subprocess
import datetime
import pygame
from pygame.locals import *
gpio = 4
#setup pins
GPIO.setmode(GPIO.BCM)
GPIO.setup(gpio,GPIO.IN)
#setup variables
count = 0
up = False
down = False
command = ""
current_dir = os.getcwd()
filename = ""
image_dir = current_dir + "/images"
camera_pause  = "1000"
enable_dropbox = True
dropbox_command = "/home/pi/Dropbox-Uploader/dropbox_uploader.sh -q upload"
dropbox_dir = "photobooth"
print("Raspberry Pi - Point & Shoot Camera v2.2")
print("-with pygame and screen, and messaging")
running = True;
pygame.init()
screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
width, height = screen.get_size()
font = pygame.font.SysFont("verdana", 65, bold=1)
font2 = pygame.font.SysFont("verdana", 55, bold=0)
textsurface = font.render("Raspberry Pi", 1, pygame.Color(255,255,255))
screen.blit(textsurface,(20,280))
textsurface = font2.render("Point & Shoot Camera", 1, pygame.Color(255,255,255))
screen.blit(textsurface,(20,350))
if(not os.path.exists(image_dir)):
command = "mkdir " + image_dir
print(command)
os.system(command)
def takepic(imageName):
    writemessage("taking photo...")
    command = "sudo raspistill -o " + imageName + " -q 100 -rot 270 -t " + camera_pause
    print(command)
    os.system(command)
    writemessage("loading photo...")
def loadpic(imageName):
    print("loading image: " + imageName)
    
    background = pygame.image.load(imageName);
    background.convert_alpha()
    background = pygame.transform.scale(background,(width,height))
    screen.blit(background,(0,0),(0,0,width,height))
    font = pygame.font.SysFont("verdana", 40, bold=0)
    textsurface = font.render(imageName, 1, pygame.Color(0,0,0))
    screen.blit(textsurface,(20,0))
def movepic(imageName):
    command = "mv " + imageName + " " + image_dir + "/" + imageName
    print(command)
    os.system(command)
def upload(imageName):
    command = dropbox_command + " " + image_dir + "/" + imageName + " " + dropbox_dir + "/" + imageName
    print(command)
    subprocess.Popen(command, shell=True)
    
def writemessage(message):
    screen.fill(pygame.Color(0,0,0))
    font = pygame.font.SysFont("verdana", 50, bold=1)
    textsurface = font.render(message, 1, pygame.Color(255,255,255))
    screen.blit(textsurface,(35,40))
    pygame.display.update()
    
while running:
    if(up == True):
        if(GPIO.input(gpio)==False):
            print("button pressed")
            now = datetime.datetime.now()
            timeString = now.strftime("%Y-%m-%d_%H:%M:%S")
            print("request received: " + timeString)
            filename = "photo-" + timeString + ".jpg"
            takepic(filename)
            loadpic(filename)
            movepic(filename)
            if(enable_dropbox == True):
                upload(filename)
            
    up = GPIO.input(gpio)
    count = count + 1
    
    pygame.display.update()
    sleep(.1)
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            running = False
#never hit
print("end of loop");