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 staticfloat.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:
- PIR Bewegungssensor(en)
- Magnet Fensterkontakt(e)
- 10kΩ Widerstand pro Magnetkontakt
- Jumper Kabel
- ggf. (Mini) Breadboard
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 staticfloat.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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import RPi.GPIO as GPIO import time, os, json # Configuration AUTH_KEY = "xxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx"; SEND_URL = "https://gcm-http.googleapis.com/gcm/send"; SENDER_CHANNEL = "/topics/bewegung"; COOLDOWN = 10; # Seconds that should be waited between messages NUM_MODULES = 2; # amount of used modules (motion detector, magnetic switch, etc.) MODULES = range(NUM_MODULES); MODULES[0] = { "name": "Wohnzimmer Bewegungsmelder", "gpio": 23}; MODULES[1] = { "name": "Flur Fenster-Magnetkontakt", "gpio": 24}; # Function def sentMessage(channel): for m in MODULES: if channel == m["gpio"]: if not ("lastMessageSent" in m) or ("lastMessageSent" in m and m["lastMessageSent"]+COOLDOWN <= time.time()): m["lastMessageSent"] = int(time.time()); obj = { "O": m["name"], "T": m["lastMessageSent"]}; message = json.JSONEncoder().encode(obj).replace('"', '\\"'); os.system('curl --header "Authorization: key="'+AUTH_KEY+' --header Content-Type:"application/json" '+SEND_URL+' -d \'{"to":"'+SENDER_CHANNEL+'", "data": {"message": "'+message+'" }}\''); return; # Setup GPIO.setmode(GPIO.BCM); GPIO.setwarnings(False); for m in MODULES: GPIO.setup(m["gpio"], GPIO.IN); GPIO.add_event_detect(m["gpio"], GPIO.RISING, callback=sentMessage); # Infinite Loop while True: pass |
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.
47 Kommentare
gibt es so was auch für iOS?
Nein, jedenfalls ist es bisher nicht geplant (aus den im Artikel erwähnten Gründen).
Gibt es eine neue App oder eine App Alternative, weil dir Webseite nicht mehr vorhanden ist?
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.
ist das mit großem Aufwand verbunden?
lg
Hallo Michael,
ich verstehe nicht ganz, was du vor hast?
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
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
Zeile 25:
message = "Hallo Welt"
Ich danke dir.
Jetzt stürzt mir die APP ab.
Muss ich mal drüben nachfragen 😉
Danke Danke
Cool… Ist eine App inzwischen im PlayStore?
Nein, noch nicht. Vermutlich Anfang Oktober.
ok das ist cool. Ich lese in manchen Quellen davon, dass Google Cloud Messaging Dienst (GCM) kostenpflichtig ist. Ist das korekt?
Erst ab einer gewissen Anzahl, die du als alleinger Nutzer nicht erreichst.
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?
Die App gibt es auch noch nicht im PlayStore (dauert noch etwas). Vorerst müsstest du sie selbst erstellen (wie steht auch droid-lernen). Hier steht wie du den Cloud API Key bekommst.
Ich mein wie ich die App GCM finde. Ich hab keine Ahnung wo das ist?
Der Google Cloud Messaging Dienst ist keine App. Unter dem Link steht doch alles weitere dazu?
Ich werde allerdings immer wieder darauf aufmerksam gemacht, dass Google Cloud kostenpflichtig ist. Wie umgehe ich das?
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.
Dort steht immer was von 30Tage kostenlos testen und was von 15gb Kontingent.
brauche ich das speech api?
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.
Und was ist das? Mein Entwickleraccount ist aber kostenpflichtig?
medienpapst.com/android-entwickler-account-erstellen/
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.
Wofür benötige ich nun den API KEY?
Steht doch mehrfach dabei: Um dir Push Nachrichten senden zu können…
Das ist doch klar… aber wo muss der verwendet oder eingetragen werden. Das finde ich nicht
Das steht auf droid-lernen.de, bevor du die App kompilierst fügst du den API Key ein (steht alles im zugehörigen Tutorial).
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
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
Du könntest ein (Python) Skript schreiben, welches eben jene Push-Nachricht versendet (siehe Beispiel hier) und dieses statt dem send_script aufrufen.
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??
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
Hallo Tim,
Droid-Lernen.de ist wieder online.
Ich entschuldige mich für die längere DownTime.
Gruß,
Marvin von Droid-Lernen
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
Ups könntest du die Zeile mit den AUTH-KEY löschen.
Nur zur Sicherheit.
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!
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.
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 😉
Hallo zusammen,
Ich habe ein Problem mit dem Script.
Wenn ich es starten will steht da:
Was könnte das sein?
Hallo Felix,
ich wollte dein Tutorial gerade mal durchspielen aber musste feststelle, dass es die Seite “ droid-lernen.de“ im Moment nicht mehr gibt bzw. dass sie gewartet wird.
Wo kann ich nun eine Erklärung für die entsprechende Android-App finden?
Schon mal Danke im Vorraus.
Du kannst versuchen die Seite über https://archive.org/ aufzurufen.
Hallo,
Ich kann die Seite staticfloat.de, die oben verlinkt, nicht öffnen. Ebenso wie droid-lernen.de. Auch über https://archive.org/. Wie kann ich dieses Problem lösen. Ist die App denn schon im Play Store, weil dann wären die Probleme gelöst. Wenn es die App schon gibt, wie heißt die denn?
Ich glaube hier passiert nicht mehr viel… Vom neuem Pi hat hier auch keiner was mitbekommen.
Ist das so (das hier ist hauptsächlich eine Tutorial Seite, kein Nachrichtenportal)? Leider habe ich auf eine externe Seite wie staticfloat keinen Einfluss.
Als Tipp: staticfloat hieß früher „droid-lernen.de“, vielleicht ist darüber mehr im Cache zu finden.
Guten Tag,
Ich bin auf der Suche nach einer Bewegungsfunkmelder (Rezeptionseingang Hotel), der in der Lage ist ein Signal/Benachrichtigung an eine Smartwatch/Armand zu schicken, die dann vibriert, wenn ein Gast den Eingang betritt. Ich stelle mir, vor dass Sender und Empfänger über Wlan oder Funk miteinander kommunizieren. Ist dieses Projekt mit ihrem Tutorial hier umsetzbar? Das wäre wirklich sehr gut, da ich dann nicht mehr von einem nervigen Signalton abhängig wäre. Für Hilfe bin ich wirklich sehr sehr dankbar!
Vielen Dank und einen schönen Tag noch.
Unter „Vorbereitung und Aufbau“ funktioniert der erste Hyperlink nicht, in dem gezeigt wird, wie man die App zum Empfangen der Daten erstellt
Und unter „Code um Push Benachrichtigungen zu senden“ funktioniert der Link ebenfalls nicht (wo beschrieben wird, wie man den Google Cloud API Key bekommt)
Also das dieses Tutorial nicht aktualisiert wird ich beiß mir auch die zähne aus 1 welche App??? nen Name wäre schon hilfreich 2. wenn diese nicht im store sein sollte bitte Aternative anbieten ! 3 läuft das Skript so nicht auf dem pi3b+ da es noch ein älterer Python code ist. bitte aktualisieren da ich es gern umsetzen würde !