Nachdem ich in meinem letzten Artikel von der Ansteuerung eines Elro-Funksteckdosen-Sets per Internet über einen Arduino Ethernet berichtet habe, bin ich nun einen Schritt weiter.
Ich bin durch Zufall auf das iWebKit gestoßen, mit dem sich „WebApps“ für iOS erstellen lassen, und da ich selbst ein leidenschaftlicher iPhone-Nutzer bin, lag die Überlegung nahe, selbst eine kleine WebApp zu schreiben, mit der ich dann die Steckdosen von überall schalten kann.
Mittlerweile habe ich eine laufende „Beta„, wenn man so will – meine Programmierkenntnisse in PHP sind schon seit vielen Jahren eingerostet; trotzdem habe ich’s hinbekommen ein paar HTML-Templates auf Basis des iWebKits in ein paar PHP-Seiten zu implementieren, mit denen ich u.A. Daten aus dem Arduino parse und ordentlich in einer schönen WebApp ausgebe.
Dabei läuft auf dem Arduino ein kleiner Webserver der auf GET-Anfragen antwortet (schalten von Dosen, Infos ausgeben, etc.) und mehrere PHP-Scripte auf einem Webserver, der als User Interface und zum steuern des Arduino (und den Funk-Steckdosen) dient.
Das Ergebnis kann sich bisher sehen lassen:
Dabei bediene ich mich eines einfachen Logins mit $_SESSION’s. Die Aktionen auf dem Arduino werden per GET-Befehl über das PHP-Script ausgeführt und liefern jeweils als Antwort ein „OK“ mit 1 oder 0 – je nachdem, wie der Zustand der Dose gerade ist.
Damit nicht jeder Zugriff auf den Arduino hat, wird als GET-Parameter ein Passwort-String übergeben, der – wenn nicht vorkommt oder falsch ist – eine leere Seite lädt. Das ist zwar nicht viel Sicherheit – sollte aber für den privaten Gebrauch reichen.
Die Screenshots wurden aus Google Chrome heraus gemacht – unter Safari oder auf iOS-Geräten sieht’s natürlich etwas hübscher aus.
Die kommenden Tage, sobald ich meinen Code etwas leserlich und kommentiert habe, werde ich meine Arbeit hier veröffentlichen – vielleicht kann der ein oder andere damit etwas anfangen 🙂
Update vom 10.11.2013:
Auf mehrfachen Wunsch in den Kommentaren stelle ich hier den Code zur Verfügung.
Ich habe seither an diesem kleinen Projekt nicht weitergearbeitet (und habe es aktuell auch nicht vor); daher gebe ich auch keinen Support.
Der Code ist also als Beispiel anzusehen.
Arduino Ethernet-Sketch:
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
/* Original Version by Poldi modified by Katsu modified by Basti */ #include <RCSwitch.h> // Steckdosen-Controlling #include <SPI.h> #include <Ethernet.h> // Netzwerk-Bibliothek #include <MemoryFree.h> // Freien RAM auslesen byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 }; // entspricht einer MAC von 84.85.88.16.0.36 byte ip[] = { 192, 168, 0, 5 }; // IP-Adresse byte gateway[] = { 192, 168, 0, 1 }; // Gateway byte subnet[] = { 255, 255, 255, 0 }; EthernetServer server(80); String readString = String(100); // string for fetching data from address boolean rc[] = {false, false, false, false, false, false, false, false, false}; boolean result = false; RCSwitch rcControl = RCSwitch(); void setup(){ Ethernet.begin(mac, ip, gateway, subnet); server.begin(); // Transmitter is connected to Arduino Pin #2 rcControl.enableTransmit(2); } void loop(){ CheckforConnection(); } void CheckforConnection() { EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //read char by char HTTP request if (readString.length() < 100) { //store characters to string readString = readString + c; } if (c == '\n') { //if HTTP request has ended client.print("HTTP/1.1 200 OK\n"); client.print("Content-Type: text/html\n\n"); client.print(""); //---------------------Schaltprofile-------------------- // Steckdose 1 rcDO("1=1&pass=d92kDKl23lBDk23k2dbD", "on", 1, rc[1]); rcDO("1=0&pass=d92kDKl23lBDk23k2dbD", "off", 1, rc[1]); // Steckdose 2 rcDO("2=1&pass=d92kDKl23lBDk23k2dbD", "on", 2, rc[2]); rcDO("2=0&pass=d92kDKl23lBDk23k2dbD", "off", 2, rc[2]); // Steckdose 3 rcDO("3=1&pass=d92kDKl23lBDk23k2dbD", "on", 3, rc[3]); rcDO("3=0&pass=d92kDKl23lBDk23k2dbD", "off", 3, rc[3]); // Steckdose 4 rcDO("4=1&pass=d92kDKl23lBDk23k2dbD", "on", 4, rc[4]); rcDO("4=0&pass=d92kDKl23lBDk23k2dbD", "off", 4, rc[4]); // Steckdose 5 rcDO("5=1&pass=d92kDKl23lBDk23k2dbD", "on", 5, rc[5]); rcDO("5=0&pass=d92kDKl23lBDk23k2dbD", "off", 5, rc[5]); // Steckdose 6 rcDO("6=1&pass=d92kDKl23lBDk23k2dbD", "on", 6, rc[6]); rcDO("6=0&pass=d92kDKl23lBDk23k2dbD", "off", 6, rc[6]); // Steckdose 7 rcDO("7=1&pass=d92kDKl23lBDk23k2dbD", "on", 7, rc[7]); rcDO("7=0&pass=d92kDKl23lBDk23k2dbD", "off", 7, rc[7]); // Steckdose 8 rcDO("8=1&pass=d92kDKl23lBDk23k2dbD", "on", 8, rc[8]); rcDO("8=0&pass=d92kDKl23lBDk23k2dbD", "off", 8, rc[8]); // Schaltet alle Steckdosen aus if(readString.indexOf("alloff=go&pass=d92kDKl23lBDk23k2dbD") > -1){ int i; for (i = 1; i <= 8; i++) { // Alle Steckdosen-Zustände auf false setzen rc[i] = false; // Alle Steckdosen ausschalten rcControl.switchOff('a', 1, i); } } // Gibt das Ergebnis der letzten Schaltung aus (binär) if(readString.indexOf("result") > -1) { client.print(result); } // Statusseite ausgeben if(readString.indexOf("status&pass=d92kDKl23lBDk23k2dbD") > -1) { // Gibt einen String mit mehreren Werten, getrennt durch : aus - Status int i; for(i = 1; i <= 8; i++) { client.print(rc[i]); client.print(":"); } client.print(freeMemory()); client.print(":"); client.print(millis()/1000/60); } //clearing string for next read readString=""; client.stop(); } } } } } // Schaltet die Steckdosen an oder aus void rcDO(char *phrase, char *onoff, int nummer, boolean &rc) { if(readString.indexOf(phrase) > -1) { if(onoff == "on") { rcControl.switchOn('a', 1, nummer); rc = 1; } if(onoff == "off") { rcControl.switchOff('a', 1, nummer); rc = 0; } result = rc; } } |
Zusätzlich könnt ihr euch hier den PHP-Code für den WebServer herunterladen.
Ich bitte zu beachten, dass ich kein Programmierer bin – der Code dient also nur als Beispiel und sollte nicht produktiv eingesetzt werden!
Hallo Basti
Ich habe mit erfolg die Arduino Schaltung Funksteckdosen nachgebaut ,sie funktioniert sehr gut nun habe ich deinen Beitrag fürs IPhone gelesen und da ich von PHP keinen Plan habe wollt ich mal anfragen ob ich deine Betaversions app bekommen könnte da ich auch ein IPhone habe.
Mit freundlichen Gruß
Andreas
and.f@gmx.de
Hallo,
bin ebenfalls sehr gespannt, wie es mit dem Projekt weiter geht ind wäre für die Zusendung der Betaversions app sehr dankbar.
Viele Grüße
Adolf
Hallo Bastian
Wann wirst du dein Beispielcode veröffentlichen?
Würde gerne das ganze Nachbauen.
Gruss
Hallo Oli,
ich habe die damaligen Sources im Artikel hinzugefügt.
Ich hoffe, du hast auch was davon – aber ich habe damals nicht weiterprogrammiert…
Lg,
Hallo,
ich wäre auch an diesem Code und der App interessiert. Könntest du mir das schicken bzw. veröffentlichen?
Vielen Dank.