Raspberry Pi + Android: Benachrichtigungen von Bewegungsmelder

30. August 2016
38 Comments

In diesem Tutorial geht es um das Zusammenspiel von dem Raspberry und Android Geräten. Im speziellen nutzen wir die Push Benachrichtigungen vom Android System, welche wir bei bestimmten Aktionen auslösen: Dazu soll z.B. bei der Aktivierung eines Bewegungsmelder oder dem Öffnen von Fenstern eine Nachricht an verbundene Android Devices gesendet werden. Anwendung finden kann dies in einer Raspberry Pi Alarmanlage.

Dies ist der erste von mehreren Teilen, in denen wir die Zusammenarbeit mit Android Smartphones und Tablets nutzen.

Alle Android-relevanten Tutorials findest du dazu auf droid-lernen.de.

 

Zubehör

Neben einem Android Device (Smartphone/Tablet/Phablet), welches mit dem Internet verbunden ist, brauchst du noch folgendes, um den Aufbau dieses Tutorials nachzubauen:

 

Dabei spielt die Anzahl der Bewegungssensoren keine Rolle, da das Skript sehr einfach anpassbar ist. Du kannst sogar mehrere Raspberry Pi’s z.B. in verschiedenen Zimmern aufstellen und das unten verfügbare Skript mit kleinen Änderungen auf allen laufen lassen.

Falls sich jemand fragt, warum das Tutorial nur für Android OS erscheint und nicht für iOS oder Windows Mobile: Nicht nur aufgrund des enorm größeren Marktanteil, sondern auch aufgrund des einfacheren Zugriffs und Erstellung eigener Apps, bietet sich Android mehr als andere mobile Betriebssysteme an. Außerdem sind gute Android-Mittelklasse Smartphone bereits ab 100€ verfügbar, wohingegen selbst veraltete iPhones noch ein vielfaches kosten.

Im Folgenden kannst du dir bereits einmal ein solches Setup ansehen:

 

 

Vorbereitung und Aufbau

Bevor wir auf dem Raspberry Pi loslegen, sollten wir die App zum Empfangen der Daten erstellen. Wie das genau funktioniert und was zu beachten ist, ist hier auf droid-lernen.de ausführlich erklärt. Die App muss auf dem Smartphone installiert sein und einmalig gestartet sein, da sie als Empfänger der Daten, die wir anschließend senden, dient.
Geplant ist von unserer Seite bald auch eine App im PlayStore zu veröffentlichen, sobald wir mehrere Projekte erstellt haben.

 

Anschließend kümmern wir uns um den Aufbau. Es müssen nicht sowohl PIR Bewegungsmelder als auch die Fenster Magnetkontakte verwendet werden, aber es können auch mehrere Module von beiden genutzt werden. Der Aufbau dazu ist immer der gleiche, wobei jeweils an freier GPIO verwendet werden muss und das Skript anschließend angepasst wird.

Die generelle Benutzung von PIR Bewegungsmelder und Fenster Reed-Relais wurde ja bereits in vorherigen Tutorials gezeigt. Der Aufbau unterscheidet sich nicht sonderlich davon und sieht schematisch folgendermaßen aus:

Raspberry Pi Android Bewegungsmelder Alarmanlage Steckplatine

PIR Bewegungsmelder und Fenster Magnetkontakt richtig anschließen.

Wie du siehst habe ich GPIO23 als Datenpin des PIR Sensors benutzt und für das Magnetrelais GPIO24. Falls der Magnetkontakt „geschlossen“ ist (d.h. Magnete nah beieinander), bekommt der GPIO eine Spannung von 3.3V. Andernfalls besteht eine Verbindung zu GND über einen 10kΩ Widerstand, damit der GPIO einen eindeutigen Zustand (LOW) bekommt. Für uns ist in beiden Fällen nur die Flanke von HIGH zu LOW interessant, da diese aussagt, dass eine Bewegung stattfand (Bewegungsmelder aktiviert oder Fenster geöffnet).

 

 

Code um Push Benachrichtigungen zu senden

Falls du die App erstellt und kompiliert hast, wirst du den Google Cloud API Key bereits haben (falls nicht, steht hier wie man ihn bekommt). Diesen werden wir gleich im Skript eintragen müssen.

Zuerst erstellen wir ein Skript

sudo nano android-bewegung.py

mit folgendem Inhalt:

 

In Zeile 5 gilt es deinen API Schlüssel einzutragen. Nach dem Speichern und Beenden (STRG+O, STRG+X) kann das Skript bereits ausgeführt werden (sudo python android-bewegung.py). Die Benachrichtigungen sollten nun auf dem Smartphone eintreffen. Damit direkte Bewegungen hintereinander mehrfach erkannt werden, gibt es eine sog. „Cooldown“ Zeit, die nach der letzten Aktivierung dieses Moduls gewartet wird, bis die nächste Nachricht gesendet wird. Dies, sowie alle anderen Parameter kannst du natürlich individuell deinen Ansprüchen anpassen.

Wichtig: Falls du mehrere gleiche Module benutzt (z.B. für mehrere Fenster), sollte jeder vergebene Name eindeutig sein, um die Push Nachrichten auf dem Android Gerät auch eindeutig identifizieren zu können. Auch falls du einen zweiten Pi mit diesem Skript (und selben API Key) nutzt, müssen sich die Modulnamen von jenen unterscheiden.

 

Autostart

Damit das Skript nun auch immer startet, sobald der Pi bootet, tragen wir es noch in den Autostart ein. Dies können wir mittels rc.local machen oder eben Crontab.

In diesem Tutorial nutze ich crontab. Wir öffnen den Konsoleneditor

crontab -e

und fügen folgende Zeile ans Ende (Pfad ggf. anpassen):

@reboot sudo python ~/android-bewegung.py

Nach einem Neustart (sudo reboot) wird das Skript nun automatisch gestartet und läuft im Hintergrund weiter. Um es rauszunehmen, brauchst du einfach nur diese Zeile zu löschen und nach einem Neustart wird es nicht mehr automatisch geöffnet.

 

38 Kommentare

  1. Hallo,

    Erstmal danke für dieses grandiose Projekt.

    Ich würde gerne aus einer normalen If-Anweisung herraus zb „Hallo Welt“ schicken.

    Leider beiße ich mir an der Zeile die Zähne aus.

    os.system('curl --header "Authorization: key="'+AUTH_KEY+' --header Content-Type:"application/json" '+SEND_URL+' -d \'{"to":"'+SENDER_CHANNEL+'", "data": {"message": "'+message+'" }}\'');

    ist das mit großem Aufwand verbunden?

    lg

    Antworten
    • Ich nutze ein Programm welches mir Backups erstellt.
      Nach fertigstellung hätte ich gerne eine Benachrichtigung auf mein Smartphone.

      Ich müsste also nicht auf gpio’s reagieren.

      Sondern einfach am ende des Programms die Meldung schicken.

      lg

      Antworten
      • Dann kannst du den Befehl so verwenden und musst nur die Variablen ersetzen. Sprich den API_Key, ein Topic und eine Nachricht (wir geben hier ein JSON Objekt als String an) angeben.

    • Aber wie müsste ich den Befehl dann bearbeiten damit er mir zb einfach „Hallo Welt“ schickt?

      Es scheitert am syntax

      lg

      Antworten
  2. ok das ist cool. Ich lese in manchen Quellen davon, dass Google Cloud Messaging Dienst (GCM) kostenpflichtig ist. Ist das korekt?

    Antworten
  3. Achso das ist ja super. Wo finde ich denn Daten wie lange das nichts kostet. Und ich bin irgendwie zu blöd, weil ich finde die App nicht. Kann mir da jemand helfen?

    Antworten
  4. Ich werde allerdings immer wieder darauf aufmerksam gemacht, dass Google Cloud kostenpflichtig ist. Wie umgehe ich das?

    Antworten
    • Hallo,

      Wo wirst du denn darauf aufmerksam gemacht?

      Wenn ich in die Cloud Konsole schaue, dann finde ich dort kein Kontingent.
      Bei allen Dingen, die kostenpflichtig sind oder auch nur ein Kontingent haben bekomme ich dieses angezeigt. Wie zum Beispiel bei der Google Speech API.

      Antworten
  5. Dort steht immer was von 30Tage kostenlos testen und was von 15gb Kontingent.
    brauche ich das speech api?

    Antworten
  6. Hallo,

    wie bereits angesprochen.
    Die Google Cloud Platform vereint hunderte von Schnittstellen und Business-Services in einer Oberfläche.
    Die Nutzung der Cloud Platform Oberfläche an sich und vieler Schnittstellen (z.B. GCM) ist kostenlos.

    Wer mehr brauch, der muss auch zahlen.
    Deine angesprochenen 30 Tage Testversion für die Google Cloud Platform, sind in Wirklichkeit 60 Tage zum Ausprobieren der Business-Services.
    Darunter zählen zum Beispiel Datenbanken, Cloud Computing, Big-Data Analysen, Online Speicher und natürlich sind dort auch alle Schnittstellen integriert, die wir auch kostenlos nutzen können.

    Hier findest du mehr Infos zu den 60 Tagen Testversion: https://cloud.google.com/free-trial/?hl=de

    Wenn du wissen möchtest, wie was berechnet wird, dann siehe hier: https://cloud.google.com/products/calculator/?hl=de

    Ich kann natürlich nicht dafür garantieren, dass die Services nicht mal kostenpflichtig waren oder in Zukunft wieder kostenpflichtig werden, aber momentan musst du nichts bezahlen, wenn du dich an unsere Anleitung hältst.

    Antworten
  7. Und was ist das? Mein Entwickleraccount ist aber kostenpflichtig?
    medienpapst.com/android-entwickler-account-erstellen/

    Antworten
    • Willst du deine persönliche App etwa in den PlayStore hochladen? Das macht keinen Sinn. Du kannst die App selbst kompilieren und ohne Store auf dein Android Smartphone übertragen.

      Antworten
  8. Super Tutorial funktioniert auch alles super!!
    Wie müsste ich den Quelltext anpassen um einfach einen vordefinierten Text ans Handy zu schicken? Was müsste ich also am Ende eines Programms ergänzen? Als Beispiel wenn ich meinem Handy etwas über Telegramm schicke:
    Im /home/pi/tg/test.lua Verzeichnis

    elseif (string.lower(msg.text) == 'pc an') then
      local handle = io.popen("/home/pi/pc1")
      local res = handle:read("*a")
      os.execute("/home/pi/tg/send_script "..msg.from.print_name.." 'Computer wurde eingeschaltet' ")
      handle:close()
      return

    Was müsste ergänzt werden damit ich auf mein Handy die Push-Nachricht „Computer wurde eingeschaltet“ bekomme anstelle der Antwort per Telegram.
    Hoffe es war eine verständliche Frage

    Antworten
    • Du könntest ein (Python) Skript schreiben, welches eben jene Push-Nachricht versendet (siehe Beispiel hier) und dieses statt dem send_script aufrufen.

      Antworten
  9. Hey Felix,
    Leider geht der link droid-lernen.de nicht mehr. Dort Seite sind wartungsarbeiten. Aber eigendlich habe ich eine ganz andere frage. An sich das programm ist nicht schlecht nur das ich kein android habe sondern ios. Kann man das ganze nicht mit dem push narichten dienst Prowl verbinden??

    Antworten
    • Hallo Tim,
      wann Droid-Lernen wieder verfügbar ist, kann ich leider nicht sagen. Im Zweifelsfall kannst du archive.to (WaybackMachine) bzw. den Google Cache verwenden.
      Für IOS hatten wir es nicht vor zu portieren. Auch wenn ich früher mal ein paar kleine Apps für IOS geschrieben habe, müsste ich mein Wissen dazu sehr auffrischen. Falls du aber selbst Apps erstellen kannst, sollte die Portierung nicht all zu schwer sein, nehme ich an.
      LG, Felix

      Antworten
  10. Hallo Felix,
    erstmal vielen Dank für das Tutorial.
    Ich hab jetzt schon viel herum probiert mit deinem Code, aber sobald ich ihn erweitere funktioniert er nicht mehr.
    Ich will nämlich einen RFID-Reader in dem Code auslesen und überprüfen und wenn die Karte mit der richtigen UID vorgehalten wird möchte ich das die abfrage der Sensoren aufhört, aber irgendwie funktioniert das noch nicht.
    Hier der Code: http://pastebin.com/H3AALkEt

    Und das ist die Fehlermeldung:

    "Traceback (most recent call last):
    File "alarmscript.py", line 108, in
    GPIO.add_event_detect(m[„gpio“], GPIO.RISING, callback=sentMessage);
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel“

    Siehst du den Fehler?
    Vielen Dank im vorraus

    Antworten
  11. Erstmal super Projekt!
    Bei mir funktioniert alles. Aber eine Frage hätte ich noch: Wie kann man die Push-Benachrichigungen deaktivieren? Gibt´s da irgendwie eine Möglichkeit in der App?
    Ich will nämlich keine Benachrichtigungen erhalten, wenn ich durch die Wohnung laufe 😉
    Danke!

    Antworten
    • Wie du sie manuell aktivierst, fragst du am besten bei Marvin unter droid-lernen.de nach 🙂
      Per Raspberry Pi kannst du einfach keine Nachrichten senden lassen, wenn Bedingung X erfüllt ist.

      Antworten
  12. Hallo hallo,
    die Zeile 26 ist doch für´s Senden verantwortlich, oder? Daher hab ich mir mal ein kleines Skript geschrieben, welches nur aus den Zeilen 5-7 (Key), 25, 26 besteht.
    In die Zeile message (Z. 25) hab ich einen Text geschrieben, der gesendet werden soll…

    Das Skript geht, aber auf meinem Handy kommt nicht´s an 🙁
    Mein Ansatz ist richtig, oder?

    Danke und schönen Sonntag 😉

    Antworten
  13. Hallo zusammen,
    Ich habe ein Problem mit dem Script.
    Wenn ich es starten will steht da:

      File "android-bewegung.py", line 6
        AUTH_KEY        = "Mein_APIKEY";
                       ^
    SyntaxError: invalid syntax

    Was könnte das sein?

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.