Mit Arduino und Android 434MHz Funk Steckdosen schalten

Posted on 10. April 2013 Comments

Schon lange wollte ich die Funksteckdosen wieder hervorräumen und mit meinem ebenfalls schon eingestaubten Arduino Uno (rev 3)und einem 434MHz Sender von watterot wieder in Gange bringen. Das Ganze gestaltet sich aufgrund der RCSwitch Library relativ einfach. Ich benutze hier im Gegensatz zum homecontrol4me-Projekt (mit kostenpflichtiger Android App) die Arduino IDE 1.0 aus den Ubuntu Repositories. Das hatte zur Folge, dass man den Beispielcode etwas anpassen muss. Dazu muss man aber auch sagen, dass ich hier keine Sicherheit eingebaut habe, jeder der die (interne) IP vom Arduino kennt, kann HTTP-Requests absenden und damit wild meine Geräte an- und ausschalten, NAT ist ja nicht wirklich ein Sicherheitsfeature.

Arduino

Sketch: Download (github)

Weil Arduino 1.0 die neuen libraries enthält muss für Server immer EthernetServer und für Client immer EthernetClient geschrieben werden. Ausserdem müssen die beiden Dateien EthernetServer.h und EthernetClient.h included werden. Am besten kann man das mit Strg+F(Suchen+Ersetzen) machen.

Die Funktion httpResponseHome() stellt die Website dar. Im Grunde bräuchte man das nicht, wenn man nur die Android App benutzen möchte.

 

Android

Android-Projekt für Eclipse: Download (github)screenshot-lichtsteuerung

Im Grunde muss man nur HTTP-Requests absetzen, die /?1-On usw. hinter der IP stehen haben. In Android dürfen keine langen Operationen, also hier Netzwerkverbindungen, in der MainActivity aufgebaut werden. Dafür habe ich die Klasse Network.java geschrieben, welche über einen AsyncTask Threads mit den HTTP-Requests startet. Weil sich das bei Lampen anbietet, habe ich ToggleButtons genommen. Diese haben das Attribut  android:onClick=”onToggleButton1Clicked”. Für jeden dieser Button habe ich eine entsprechende Methode in der mainActivity.java, die diesem Schema folgen. update: weil es manchmal hakte, hab ich eine loop eingebaut, die die Requests an die Network-Klasse drei mal sendet. Das löst zwar nicht das Problem(was immer es war), aber es funktioniert.

public void onToggleButton1Clicked(View v) {

boolean on = ((ToggleButton) v).isChecked();

        if (on) {
            loop(LICHT1ON);
        } else {
            loop(LICHT1OFF);
        }

 

In Requests.java finden sich ein Haufen Strings nach dem Schema:

public static final String IP = "http://192.168.1.42/";
public static final String LICHT1ON = IP + "?1-on";

Da ich den Code hier sehr simpel (und damit natürlich auch unsicher) gehalten habe, war’s das auch schon. Den Arduino und den Sender habe ich dann in eine Box hinter den Schrank gestellt und ein altes Netzteil zur Stromversorgung benutzt.

arduino-lichtsteuerung

Credits
Den Async Task Code habe ich (leicht editiert) von Konstantin Burov von stackoverflow.com.

Den Code für die ToggleButtons habe ich aus der Developer API von Google.

Der Arduino Code stammt überwiegend von RCSwitch aus der Datei /examples/Webserver/Webserver.pde. Ich habe die oben genannten Anpassungen an Arduino 1.0 vorgenommen, mal abgesehen von der Anpassung an meine Steckdosen.

Flattr this!

Comments

  1. “Dazu muss man aber auch sagen, dass ich hier keine Sicherheit eingebaut habe, jeder der die (interne) IP vom Arduino kennt, kann HTTP-Requests absenden und damit wild meine Geräte an- und ausschalten”

    Wenn man eine Sicherheit einbaut ist es dann ganz Sicher ?

  2. Nein. Man kann z.B. immer noch die Empfänger mit einer bzw. DER mitgelieferten 443MHz-Fernbedienung steuern, sofern man die Pinstellungen weiß. Ich bezweifel auch, dass SSL performant bzw. überhaupt auf dem Arduino Uno läuft, also selbst wenn man dort ein Login baut, hat man damit wahrscheinlich nicht wirklich Spaß. Ein schnelles Googeln bestätigt das auch. Vielleicht gibt es andere den Zugriff auf den Arduino halbwegs zu sichern aber dann bleibt halt immer die Fernbedienung.

  3. ist es möglich das android app auch für raspberry pi umprogrammieren so das ich auf eine php Seite zugreifen kann ? und zwar http:// ip/sende.php

  4. Na klar, du kannst ja einfach den String für die IP in Requests.java verändern. Den Quellcode findest du auf https://github.com/repat/arduinoRCLightSwitchApp.

    PHP ist eine serverseitige Skriptsprache, d.h. der Client Code(hier die App) ist von der Ausführung von PHP unabhängig.

    Ich hoffe, ich habe deine Frage richtig verstanden…

    Wenn ich Zeit finde, werde ich die App nochmal ausmisten, ordentlich mit einem Menü schreiben und in den Google Play Store stellen.

  5. ich bin neu auf dem gebit android apps kannst du mir das mal zeigen wie ich das Schreiben soll . Danke

  6. Am besten guckst du dir mal an, wie git funktioniert. Dann klonst du mein Projekt, öffnest es in Eclipse(Anleitung für SDK) und veränderst wie in der README erklärt die IP zu deiner PHP Seite in Requests.java. Wenn du die Treiber für dein Handy installiert hast und es per USB anschliesst und den Developer Modus aktiviert hast, kannst du die App direkt installieren und sie erscheint so, also hättest du sie aus dem Play Store.

  7. danke läuft alles kanns mir noch ein Tipp geben wie ich im Menü einen eintrag mit ip adresse machen kann un speichern

  8. Wenn du ein bisschen Android Programmierung machen möchtest, klar. Stichwort wäre da Persistence, Settings bzw. Preference API. Findet man reichlich StackOverflow Beiträge und z.B. auch http://www.vogella.com/tutorials/AndroidFileBasedPersistence/article.html

    Es gibt verschiedene Ansätze dazu. Wie gesagt, wenn ich Zeit finde, werde ich das nochmal updaten und auch im Play Store veröffentlichen. Frage ist halt nur wann. Du kannst mir das sonst auch gerne zukommen lassen 😉

    http://developer.android.com/guide/topics/ui/settings.html
    http://developer.android.com/reference/android/preference/Preference.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *