StaticFloat

Raspberry Pi – Bewegungsmelder

Zu einer modernen und gelungenen Hausautomation und/oder Alarmanlage gehört heutzutage, dass man an seinem Smartphone über jede Änderung benachrichtigt wird.
Projekte mit Bewegungsmeldern an einem Raspberry Pi gibt es viele, doch wer so technikvernarrt ist wie ich, der hat bestimmt schon einmal über die Konnektivität zwischen Raspberry und Smartphone nachgedacht.

Wir (StaticFloat und www.tutorials-raspberrypi.de) haben nun ein kleines Projekt auf die Beine gestellt, welches diese Verbindung herstellt.
Lasse dich ab jetzt von deinem Android Smartphone benachrichtigen, sobald der Bewegungsmelder an deinem Raspberry Pi eine Bewegung registriert.

Als kleine Erläuterung zu diesem Projekt.
Uns ist bewusst, dass die Wenigsten eine eigene Webseite/einen eigenen Server besitzen. Aus diesem Grund benutzen wir den Google Cloud Messaging Dienst (kurz GCM).
Dieser sendet, bei Benachrichtigung vom Raspberry Pi an alle verbundenen Android Geräte eine Nachricht, mit Ort und Zeit der Bewegung. So sparen wir uns die Programmierung eines eigenen Webservices und vor allem Akku, denn Google Benachrichtigt uns und wir fragen nicht nach.
Auf www.tutorials-raspberrypi.de findet ihr alle nötigen Anleitungen, um euren Raspberry Pi einzurichten und zu programmieren. Dieser Benachrichtigt, bei Bewegung, Google.
Auf StaticFloat findet ihr die nötigen Anleitungen, um eine Benachrichtigung unter Android anzuzeigen, die wir von Google bekommen.

Der SourceCode steht unter der Apache 2.0 Lizenz,  ihr könnt die App also benutzen/verändern/veröffentlichen, wie es euch beliebt.
Bitte achtet darauf, dass ihr die google-services.json Datei, welche ihr in diesem Artikel erstellt, mit einfügt. Wie das geht ist unter dem Punkt „Vorarbeit“ erklärt.

Raspberry Pi einrichten:

Wie bereits angesprochen findet ihr den Artikel zur Einrichtung und Programmierung eures Raspberry Pi nicht bei StaticFloat.
Bitte folgt also dieser Anleitung -> Raspberry Pi + Android: Benachrichtigung vom Bewegungmelder

 

Android App erstellen:

Solltet ihr zum ersten mal eine Android App programmieren, dann folgt bitte diesen 3 Artikeln:

Habt ihr Android Studio installiert, dann erstellt eine neue App. Dieser gebt ihr einen Namen und einen Package Namen.
Der Package Name besteht aus einem Ländercode (z. B. de), einem Entwicklernamen und dem Appnamen. Jeweils mit einem „.“ getrennt.

Als minimale Version benutzt ihr 9 und ihr wählt „Blank Activity“ (ab Android Studio 2.1 heißt es „Empty Activity“) aus.
Android Studio wird nun ein erstes Grundgerüst erstellen.

 

Vorarbeit:

Bitte folgt den Anleitungen in diesem Artikel Raspberry Pi – Google Cloud API-Key, um eure App für GCM vorzubereiten. Am Ende dieses Vorgangs wird euch der Download einer google-services.json Datei angeboten.

Diese müssen wir nun in unsere App einfügen. Klickt dazu in der linken Leiste mittels Rechtsklick auf „App“ und dann auf „Im Explorer anzeigen“ oder wie bei mir „Reveal in Finder“. Es öffnet sich der Ordner, in den wir die Datei einfach verschieben. Der Ordner kann danach wieder geschlossen werden.

 

Nun müssen wir die Dateien „gradle.build (Module: app)“ und „gradle.build (Project: ????)“ anpassen. Diese sind unter der Kategorie „Gradle“ ebenfalls in der linken Dateiliste zu finden.

In die Datei „gradle.build (Project: ????)“ fügen wir innerhalb der {}-Klammern von dependecies ein:

classpath 'com.google.gms:google-services:3.0.0'


// Das sieht in etwa so aus:
dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
    classpath 'com.google.gms:google-services:3.0.0'
}

 

In die Datei „gradle.build (Module: app)“ müssen wir 2 Stellen bearbeiten.
Als Erstes fügen wir ganz am Ende der Datei ein:

apply plugin: 'com.google.gms.google-services'

Und wieder fügen wir innerhalb der {}-Klammern von dependencies ein:

compile "com.google.android.gms:play-services-gcm:9.4.0"

// Das sieht dann in etwas so aus:
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile "com.google.android.gms:play-services-gcm:9.4.0"
}

 

Damit ist unsere Vorarbeit auch schon geleistet.
Wir haben Android Studio mit diesen kleinen Anpassungen nun beauftragt zur Erstellung der App die Google Play Services mit einzubinden. Dadurch bekommen wir die Möglichkeit diese zu benutzen. Das Google Cloud Messaging ist ein Teil der Google Play Services.

Melvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

10 Kommentare

*Pflichtfeld

  • Hallo Melvin,

    gibt es schon eine Grund-APP von dir oder wird diese noch kommen?
    Ich habe versucht, mich mit der Anleitung durchzuhangeln. Aber leider sind viele Programmversionen oder Dienste inzwischen überholt und in der Bedienung nun ganz anders (Google Firebase, AndroidStudio 3.2). Die eigene APP nach Kochbuchmanier bekomme ich so nicht hin bzw. wächst mir dieses „Neben“-Projekt über den Kopf…
    Gruß Hermann

  • Hallo, ich habe ein Problem mit deiner Anleitung, ich erhalte beim Gradle Sync immer diese beiden Fehler, leider kann ich damit nichts anfangen.
    Die Versionsfehler konnte ich eleminieren, jedoch weiß ich nicht ob dies Auswirkungen auf den restlichen Code hatte.

    Error: Attribute permission#de.Andre.PiBewegungsmelder.permission.C2D_MESSAGE@name value=(.permission.C2D_MESSAGE) from AndroidManifest.xml:7:17-55 is also present at AndroidManifest.xml:29:9-63 value=(de.Andre.PiBewegungsmelder.permission.C2D_MESSAGE). Suggestion: add ‚tools:replace=“android:name“‚ to element at AndroidManifest.xml:7:5-94 to override. app main manifest (this file), line 6

    Error: Attribute uses-permission#de.Andre.PiBewegungsmelder.permission.C2D_MESSAGE@name value=(.permission.C2D_MESSAGE) from AndroidManifest.xml:8:22-60 is also present at AndroidManifest.xml:32:22-76 value=(de.Andre.PiBewegungsmelder.permission.C2D_MESSAGE). Suggestion: add ‚tools:replace=“android:name“‚ to element at AndroidManifest.xml:8:5-63 to override. app main manifest (this file), line 7

    Desweiteren habe ich hier auf „v4“ anstatt „v7“ umgeswiched, da ich sonst hätte eine neue Class erstellen müssen, wird zumindest vorgeschlagen…

    Vielleicht kannst du Helfen.
    Danke
    import android.support.v4.content.LocalBroadcastManager;

    • Hallo Lenny,

      selbiges Problem hatte ich die Tage auch. Werde den Artikel gleich noch einmal korrigieren. Danke dir.

      Bitte gehe einmal in die AndroidManbifest.xml Datei und Ersetze die beiden Zeilen:
      <permission android:name=".permission.C2D_MESSAGE" />
      <uses-permission android:name=".permission.C2D_MESSAGE" />

      durch folgendes:
      <permission android:name=".permission.C2D_MESSAGE" tools:replace="android:name" android:protectionLevel="signature" />
      <uses-permission android:name=".permission.C2D_MESSAGE" tools:replace="android:name" />

      Der Wechsel von v7 auf v4 war genau richtig.

      Ich nehme des Weiteren an, dass du Android Studio 3+ benutzt.
      Achte bitte darauf, dass in den build.gradle Dateien, in denen „jcenter()“ steht auch noch zusätzlich (am Besten darunter) „google()“ aufgeführt wird. In meiner build.gradle Datei stand jcenter zwei mal.

      Bei weiteren Fragen kannst du gerne wieder schreiben. Ich hoffe geholfen zu haben.

      Gruß,
      Melvin

  • Hallo, danke für das Tutorial 🙂
    Ich bin noch komplett unerfahren und habe alles Schritt für Schritt befolgt, allerdings habe ich in 4 Skripten Errors.
    Alle haben fangen mit R. … . … an also das R wird iwie nicht akzeptiert.
    Und zu dem MainActivity Script, dass hat wshl scheinlich dann meinen Projektnamen oder ? Weil eins welches MainActivity habe ich nicht, soll ich meins (welches RPI) heißt lieber dazu umbenennen oder den Code einfach da einfügen.

    Weiter so !
    LG

    • Hallo,

      bei den Pfaden, die „R. … . …“ heißen handelt es sich um den Packagepfad der Ressource.
      Meistens kannst du diesen Fehler beheben, indem du einen „Gradle Sync“ durchführst.

      Das heißt, dass alle Ressourcen, die mit einem beginnenden „R.“ aufgeführt sind auch so bleiben müssen. Alle weiteren Java Klassen, die du selber erstellt hast (wie die MainActivity) müssen natürlich mit deinem Packagenamen beginnen.

      Gruß,
      Melvin

      • Thx für deine Antwort.
        Der Gradle Sync hat leider nichts bewirkt.
        Mein package wird in der ersten Zeile immer geladen, wie es in diesem Tutorial beschrieben ist.

        Aber bei :
        GcmListener ist der error hier:
        .setSmallIcon(R.mipmap.ic_launcher) –> bei R
        MainActivity:
        setContentView(R.layout.activity_main); –> bei R
        RegistrationIntentService:
        String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), –> auch bei R

        Und ich gehe mal davon aus, dass diese Pfade nicht geändert werden sollten?!

        Lieben Gruß

      • Dein Fehler kann mehrere Gründe haben, aber in jedem Fall fehlt die Datei R.java oder sie ist fehlerhaft. Diese Datei wirst du nicht sehen können und du solltest sie auch nicht selber erstellen. Sie wird von Android Studio generiert. Fehlt sie, dann gibt es den von dir beschriebenen Fehler.
        Manchmal kann diese R.java Datei aber auch „einfach so“ mal fehlen und ein Gradle Sync und/oder Build helfen weiter, ohne dass explizit Fehler vorliegen müssen.

        Versuche als Erstes mal über den Menüpunkt „Build“ einen „Clean Project“ und dann einen „Build Project“ mit anschließendem „Gradle Sync“.

        Hilft das nicht, dann gibt es höchstwahrscheinlich einen Fehler in einer der XML-Dateien. Bitte prüfe einmal alle .xml-Dateien.
        Der/Die Fehler werden in der Regel in der rechten Scrollbar von Android Studio als rote Balken oder Quadrate dargestellt.

        Hier mal ein Beispiel mit Warnungen (gelb) und weiteren Hinweisen (grün):

        Ich versuche es gleich mal nachzustellen.

        Gruß,
        Melvin

      • Ich habe es jetzt noch mal mit einem neuen Projekt ausprobiert, dort entsteht der gleiche Fehler.

        Eine Sache muss ich anders machen als im Tutorial:

        Bei dem build.gradle(modul:app) muss ich folgende Zeile schreiben:
        compile „com.google.android.gms:play-services-gcm:10.2.1“

        -> die 9.4.0 ist zu alt.

        Es ist ja von eurer Seite aus in Planung eine fertige App in den Playstore zu stellen ? Gibt es da schon weitere Pläne ?

      • Den Tipp werde ich mir merken.

        Die App ist weiterhin in Arbeit. Leider habe ich momentan nicht die nötige Zeit parat mich intensiv mit der App zu beschäftigen und weiter daran zu programmieren.
        Aber nächste Woche ist wieder Land in sich, dann geht es weiter. 🙂
        Wird sich also nicht mehr um Monate handeln.
        Gruß,
        Marvin

3D Drucker – Die häufigsten Probleme

Du hast Probleme mit deinem Drucker?
Vielleicht hilft dir diese Seite, mit Problemen und Lösungen zum Druck von Modellen.

Auf geht's!