Läuft: Pi schaltet automatisch Musik und Licht an, wenn ich zu Hause bin

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    auch ich habe wochenlang nach einem geeigneten Projekt für meinen Pi gesucht und schließlich folgende Idee realisiert & nun schon 2 Monate lang erfolgreich getestet:

    Wenn ich nach Hause komme, schalte ich für gewöhnlich meine Stereoanlage ein, wähle einen Internet-Chillout-Radiosender und schalte die gemütliche Beleuchtung in meinem Wohnzimmer ein (2 Stehlampen + LED-Beleuchtung am Weinregal). Was für ein Aufwand dachte ich mir. Das wollte ich nicht mehr manuell machen UND dafür auch keine Buttons auf einer Website, App o.ä. klicken, es sollte alles automatisch funktionieren. Das habe ich nun wie folgt realisiert:

    • Automatische Erkennung, wenn ich zu Hause bin: dafür wollte ich mein iPhone nutzen. Erster Versuch war zu erkennen, ob mein iPhone sich im WLAN befindet. Das ging schief, da dass iPhone sich erst ins WLAN einlogged, wenn es aus dem Stand-by-Modus aufgeweckt wird. Dafür müsste ich jedes mal, wenn ich nach Hause komme, das iPhone einmal antippen - geht natürlich gar nicht. Zweiter und erfolgreicher Ansatz: Bluetooth. Hab mir diesen Dongel hier gekauft (https://www.modmypi.com/blog/installin…luetooth-dongle). Damit pinge ich die MAC-Adresse meines iPhones (z.B. alle 5 Sekunden). Der Dongle hat eine Reichweite von ca. 20 Metern und bemerkt mich, sobald ich die Wohnung betrete. Beim iPhone muss natürlich Bluetooth aktiviert sein, habe übrigens kaum Veränderungen in der Akku-Laufzeit bemerkt.
    • Einschalten des AV-Receivers: mein Pi ist über HDMI mit meinem AV-Receiver verbunden. Ich nutze die Libcec-Bibliothek von Pulse-Eight (http://libcec.pulse-eight.com). War zwar etwas nervenaufreibend die Library für den Pi zu kompilieren, aber irgendwann ging's. Bei Interesse kann ich hier ins Detail gehen. Für Internet-Radio-Streamen nutze ich die Anwendung "MPC" mit einer Playlist meiner Lieblings-Radiosender.
    • Einschalten der Beleuchtung: dafür habe ich bei Amazon zunächst Funksteckdosen von Itertechno bestellt (http://www.amazon.de/Intertechno-Funksteckdosen-fach-Set-IT-1500/dp/B0054IPASK/ref=sr_1_4?ie=UTF8&qid=1378907159&sr=8-4&keywords=funksteckdose&tag=psblog-21 [Anzeige]). Als Funksender habe ich mir bei Ebay einen USB-Sender von Telldust gekauft (http://www.ebay.com/itm/TellStick-…r-/281099221064). Und weil ich noch Zeit hatte, schalte ich die Beleuchtung abhängig von der Uhrzeit des Sonnenuntergangs ein. Den dazu passenden Webservice gibt es hier: http://www.earthtools.org/webservices.htm#sun


    Ablauf: ich komme nach Hause, der Bluetooth-Dongle erkennt das, der Pi schaltet über HDMI die Musik + TV ein, wenn die Sonne untergeht schaltet er auch noch das Licht ein. Alles super, wie gewünscht. Funktioniert jedoch nur ein mal und danach musste ich alles händisch resetten. Geht natürlich auch nicht.

    Damit das System vollständig autonom agiert, starte ich (nach dem das System alles eingeschaltet hat) einen Timer, der die Musik automatisch nach ca. 1 Stunde wieder abschaltet, sonst läuft sie dauernd weiter. Nach dem der Abschalt-Timer zugeschlagen hat, wird das System resettet. Da es jedoch sofort wieder anfangen würde die Musik etc. einzuschalten, habe ich eingebaut, dass die Verbindung zum iPhone vorher verloren gegangen sein muss, d.h. dass ich die Wohnung verlassen haben muss. Das erkenn ich, in dem der Ping über Bluetooth "Null" o.ä. zurückliefert. Da ich Java-Entwickler bin, läuft das alles mit Java + OSGi (letzteres nur zum Spaß). Wenn gewünscht, kann ich gerne den Quellcode hier posten.

    So kann ich jeden Tag nach Hause kommen, die Musik + Licht geht an und ich muss nix machen. Sobald ich die Wohnung verlasse wird das ganze System re-initialisiert und wenn ich wieder da bin, geht das Spiel von vorn los.

    So, viel Text für dieses kleine Ergebnis, war aber ne Arbeit von netto ca. einer Woche.

    Einmal editiert, zuletzt von ObiBalwan (11. September 2013 um 16:17)

  • Läuft: Pi schaltet automatisch Musik und Licht an, wenn ich zu Hause bin? Schau mal ob du hier fündig wirst!

  • Hey, cooles Projekt. Das hat mich auf eine Idee gebracht und zwar möchte ich nun realisieren, dass mein PC gestartet wird, sobald mein iPhone in Bluetoothreichweite kommt.
    Kannst du mir vielleicht deinen Code für die "Detection" geben? Dann kann ich mir das sparen ;)

    Vielen Dank und Grüße

    Tobi

  • Hi,

    ich rufe bei mir die native Pi-Funktionalität über Java-Process auf:

    [font="Monaco"]package de.me.homeautomation;[/font]

    [font="Monaco"]import java.io.BufferedReader;[/font]
    [font="Monaco"]import java.io.IOException;[/font]
    [font="Monaco"]import java.io.InputStream;[/font]
    [font="Monaco"]import java.io.InputStreamReader;[/font]
    [font="Monaco"]import java.util.HashSet;[/font]
    [font="Monaco"]import java.util.Set;[/font]
    [font="Monaco"]import java.util.TimerTask;[/font]

    [font="Monaco"]import org.apache.log4j.Logger;[/font]

    [font="Monaco"]/**[/font]
    [font="Monaco"] * Ping the iPhone each x minutes. After it finds the iPhone, observers are[/font]
    [font="Monaco"] * informed.[/font]
    [font="Monaco"] */[/font]
    [font="Monaco"]public class DetectIPhoneTask extends TimerTask {[/font]
    [font="Monaco"] private Logger logger = Logger.getLogger(DetectIPhoneTask.class.getName());[/font]

    [font="Monaco"] private Set<IPhoneObserver> iPhoneObserver = new HashSet<IPhoneObserver>();[/font]

    [font="Monaco"] protected void addIPhoneObserver(IPhoneObserver observer) {[/font]
    [font="Monaco"] iPhoneObserver.add(observer);[/font]
    [font="Monaco"] }[/font]

    [font="Monaco"]@Override[/font]
    [font="Monaco"] public void run() {[/font]
    [font="Monaco"] try {[/font]
    [font="Monaco"] Process process = Runtime.getRuntime().exec([/font]
    [font="Monaco"]"sudo l2ping -c 1 YOUR:MOBILE:MAC:ADDRESS");[/font]
    [font="Monaco"] process.waitFor();[/font]
    [font="Monaco"] InputStream in = process.getInputStream();[/font]
    [font="Monaco"] InputStreamReader inReader = new InputStreamReader(in);[/font]
    [font="Monaco"] BufferedReader bufReader = new BufferedReader(inReader);[/font]

    [font="Monaco"]// erste Zeile langt, um zu erkennen, ob iPhone online oder offline[/font]
    [font="Monaco"]// ist[/font]
    [font="Monaco"] String line = bufReader.readLine();[/font]
    [font="Monaco"] if (line != null) {[/font]
    [font="Monaco"] if (line.startsWith("Ping: [font="Monaco"]YOUR:MOBILE:MAC:ADDRESS[/font]")) {[/font]
    [font="Monaco"]logger.debug("... scanning: iPhone detected");[/font]
    [font="Monaco"] handleIPhoneOnline();[/font]
    [font="Monaco"] } else if (line.startsWith("Can't connect")) {[/font]
    [font="Monaco"]logger.debug("... scanning: iPhone not found");[/font]
    [font="Monaco"] handleIPhoneOffline();[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"] } else {[/font]
    [font="Monaco"]logger.debug("Ping return line is null");[/font]
    [font="Monaco"] handleIPhoneOffline();[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"] } catch (IOException e) {[/font]
    [font="Monaco"] logger.error(e.getMessage());[/font]
    [font="Monaco"] e.printStackTrace();[/font]
    [font="Monaco"] } catch (InterruptedException e) {[/font]
    [font="Monaco"] logger.error(e.getMessage());[/font]
    [font="Monaco"] e.printStackTrace();[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"] }[/font]

    [font="Monaco"] private void handleIPhoneOnline() {[/font]
    [font="Monaco"] for (IPhoneObserver observer : iPhoneObserver) {[/font]
    [font="Monaco"] logger.debug("Inform observer iPhone found: " + observer.toString());[/font]
    [font="Monaco"] observer.iPhoneDetected();[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"] }[/font]

    [font="Monaco"] private void handleIPhoneOffline() {[/font]
    [font="Monaco"] for (IPhoneObserver observer : iPhoneObserver) {[/font]
    [font="Monaco"] observer.iPhoneOffline();[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"] }[/font]

    [font="Monaco"]@Override[/font]
    [font="Monaco"] public String toString() {[/font]
    [font="Monaco"]return"Detect iPhone scanner task";[/font]
    [font="Monaco"] }[/font]
    [font="Monaco"]}[/font]

  • Hi, dein Projekt finde ich mal richtig cool...Ich würde das ebenfalls gerne realisieren...Aber nur das mit dem Bluetooh und Licht einschalten.... Wie genau führst du denn dein Java- Code auf dem Pi aus?! Sprich der muss ja irgendwie für das System kompiliert werden?!

    Des weiteren wäre ich sehr an dem Quellcode interessiert...:)

    Einmal editiert, zuletzt von chrizstone (19. September 2013 um 15:08)

    • Offizieller Beitrag

    ObiBalwan

    Könntest du deine Quellcode in die code Tags schreiben. [code]

    Well in my humble opinion, of course without offending anyone who thinks differently from my point of view, but also by looking into this matter in a different way and without fighting and by trying to make it clear and by considering each and every one's opinion, I honestly believe that I completely forgot what I was going to say.

  • Hallo,

    Das ist ein super Projekt. Ich bin Neueinsteiger im Raspberry PI , würde dieses gern bei mir im Carport Realisieren. Habe da aber noch ein Frage.

    Welches Betriebssystem ist auf dem Pi drauf?
    Wie werden die Scripte gestartet?


    :danke_ATDE:

  • Also ich habe mir nun auch den Bluetooth Stick gekauft und eben konfiguriert. Das Problem was ich habe ist, das ich mein iPhone erfolgreich pingen kann kann solange dieses nicht gesperrt ist! Sperre ich mein iPhone kann ich es auch nicht mehr pingen! Also wie mit dem Problem wenn man das ganze per Wlan umsetzen möchte! Ist dies bei dir nicht so ?!

    Ok, das Problem ist gelöst! Musste mein iPhone erst koppeln mit dem Stick! Jetzt kann ich es auch erfolgreich pingen wenn es im Standby ist! Aber kannst du vielleicht nochmal erklären wie du deine .jar ausführst?!

    Einmal editiert, zuletzt von chrizstone (22. September 2013 um 16:19)

  • Also ich habe mir jetzt auch mein kleines Java- Programm geschrieben, funktioniert auch alles wunderbar! Doch mein Problem ist, das mein iPhone, trotz eingeschaltetem Bluetooth, irgendwann nicht mehr von meinem Programm gelingt werden kann, obwohl ich in 3 Meter Reichweite bin! Also loggt sich Bluetooth auch irgendwann aus?!

  • Hallo,

    war im Urlaub, daher erst die späten Antworten:
    1. Probleme mit Pingen des iPhones:
    danke an chrizstone für den Hinweis, den ich vergessen habe. Ich habe im Wheezy-Betriebssystem mein iPhone über den Bluetooth-Manager "registriert". Ich weiss zwar nicht genau, warum das nötig war (hab's per Zufall rausgefunden), aber danach hat alles bestens funktioniert. Sorry, das habe ich vergessen.

    2. Android vs. iPhone: sollte auch mit Android klappen, da Bluetooth geräteunabhängig ist.

    3. Java: ich habe mir die Java-Version für den Pi installiert (http://www.oracle.com/technetwork/ar…pi-1704896.html). Bei mir läuft das ganze zusätzlich über einen OSGi-Container. Das ist allerdings Spielkram, wer sich mit OSGi nicht auskennt, sollte einfach nur Java benutzen.

    Man muss bedenken, dass auf dem PI nur eine reduzierte Java-Version läuft. Dadurch können viele Java-Bibliotheken nicht benutzt werden. Ich hatte bislang z.B. Probleme mit XML-Parsen mit JDOM. Die Java-Projekte müssen aber nicht für den PI gesondert kompiliert werden. Ich exportiere mein Projekt als JAR-File über Eclipse, kopiere die JAR auf mein Raspberry Pi (einfach über z.B. "scp" oder umständlicher mit USB-Stick) und starte die JAR auf dem Pi im Terminal über "java -jar mein.project.jar -console".

    4. Betriebssytem: Wheezy

    5. Zusammenspiel Java und Raspberry Pi: ich hab mir das Leben einfach gemacht und führe einfach aus Java Heraus native Prozesse auf dem Pi aus. Also z.B. für das Einschalten des Lichts mache ich folgendes:


    Zitat


    ps915 ObiBalwan

    Könntest du deine Quellcode in die code Tags schreiben


    Code
    Wenn ich meinen Java-Quellcode aus Eclipse kopiere und in die Code-Tags schreibe, passiert folgendes:
    int radioStationNumber = determineRadioStationNumber();
    [size=10][font="Monaco"] Process process = Runtime.getRuntime().exec([/font][/size]
    [size=10][font="Monaco"] [color=#3933ff]"mpc play "[/color] + radioStationNumber);[/font][/size]
    [size=10][font="Monaco"] process.waitFor();[/font][/size]
    [size=10][font="Monaco"] [color=#0326cc]logger[/color].info([color=#3933ff]"MPC play "[/color] + radioStationNumber[/font][/size]
     + " - command sent to AVR");

    Einmal editiert, zuletzt von ObiBalwan (24. September 2013 um 14:39)

  • Hey, also das "registrieren" des iPhone im Bluetooth Manager in der Oberfläche von Wheezy habe ich ebenfalls gemacht! Trotzdem verliert mein iPhone manchmal die Verbindung und schaltet, nach 10 mal nicht erfolgreich pingen des iPhones, dann das Licht aus obwohl ich im Raum bin...Das ist natürlich sehr nervig...

    Kann man bei dem registrieren des iPhone´s irgendwas falsch machen?! Wie sehen deine Einstellung im Bluetooth Menü auf dem iPhone aus?!

  • Hi Chrizstone,

    so langsam verstehe ich dein Problem. Das Pingen an sich funktioniert, auch wenn das Telefon im Stand-by-Modus ist, aber halt nicht zuverlässig. Das ist bei mir auch so und auch in anderen Foren habe ich über ähnliche Probleme gelesen. Liegt an Bluetooth, das eine gewisse Fehlerquote hat.

    Ich habe das Problem programmatisch gelöst. In meinem Java-Code müssen min. 3 Ping-Versuche hintereinander scheitern, um relativ zuverlässig zu erkennen, dass ich nicht zu Hause bin. Scheitert lediglich einer oder zwei und der nächste klappt, setze ich einen sog. Ping-failed-Counter wieder zurück auf 0. Das hat die letzten Monate sehr gut geklappt, mehr als 2 hintereinander fehlgeschlagene Pings hatte ich noch nie, wenn ich zu Hause war.

    Einmal editiert, zuletzt von ObiBalwan (24. September 2013 um 15:54)

  • Ja genauso mache ich es ja auch! Bloss das bei mir erst einmal 10 Versuche scheitern müssen....:) Trotzdem hatte ich gestern einmal das des Licht ausging obwohl ich im Raum war, das hat mich sehr gewundert....

    Und nun öffnet sich auch mein Bluetooth Manager in der Oberfläche nicht mehr! Woran kann das liegen?!

  • Code
    timer = new Timer();
    timer.schedule(new TimerJob(), 0, 5 * 1000);

    Ich pinge so...Sollten ja 5 Sekunden sein....

    Achja eine Frage noch, wie führeich meine Jar im Hintergrund aus ohne das meine Console hängt?! Und auch das die Jar beim starten des Pi ausgeführt wird?!

    Einmal editiert, zuletzt von chrizstone (24. September 2013 um 16:20)

  • Was meinst du mit "Console hängt"? Ich hab ein Terminal-Fenster immer offen für die Java-Anwendung, für allen anderen Kram kann man sich ja neue öffnen. Im Hintergrund geht das glaub ich gar nicht. Um die Anwendung beim Hochfahren auszuführen musst du das Startup-Script erweitern. Ich hab zwar gelesen, wie es funktioniert, habs aber noch nicht gemacht.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!