Frage zu Heimautomation mit Arduino und Raspberry Pi

Hallo Zusammen,

ich bin auf der Suche nach einer Lösung bzw. Ratschlägen zur Herangehensweise für mein Heimautomatisierungsprojekt und würde mich freuen, wenn ihr mich unterstützen könntet.

Kurzfassung:
Suche eine Lösung, um über eine Webseite, die auf einem Raspberry Webserver läuft, mein Bussystem zu steuern.

Langfassung:
Unser Haus ist mit einem Bussystem von net4home ausgestattet, d.h. Licht, Jalousien, Heizung etc. können elektronisch geschaltet werden. Für diesen Bus gibt es eine serielle Schnittstelle, die ich soweit nachgebaut und eine entsprechende Klasse programmiert habe, dass ich mit dem Arduino sowohl auf dem Bus lesen als auch schreiben kann (falls jemand Interesse daran hat, kann ich den Code gerne zuschicken).

Nun möchte ich im lokalen Netzwerk einen Webserver betreiben, der mir eine Seite bereitstellt auf der ich den Status der diversen Busteilnehmer sehen kann bzw. über die ich Lichter an- und ausschalten kann. Hier hab ich mir aus den Beispielen vom Ethernetshield auch schon mal was zusammengebaut, dass ich über eine Webseite, die direkt auf dem Arduino lief, LEDs an und aus geschaltet habe. Theoretisch müsste ich die beiden Sketches nur noch miteinander verheiraten, um mein Ziel zu erreichen, allerdings setzt der geringe Speicher des Arduino einer umfangreicheren Seite, die das ganze Haus mit allen Schalten und Sensoren abbildet, doch recht enge Grenzen.
Daher war meine Idee das Ganze mit einem Raspberry, auf dem dann der Webserver läuft, umzusetzen. Etwas ähnliches habe ich auf
http://www.fritz-hut.com/arduinopi-web-based-controller-for-arduino/
auch schon im Netz gefunden, allerdings findet die Kommunikation von Arduino und Raspberry da über die serielle Schnittstelle statt, und die ist bei mir schon mit dem Bussystem belegt (Software Serial würde ich zum Empfangen ungern nutzen). Dazu kommt noch, dass ich von php bislang keinen blassen Schimmer habe, und mich die Abstraktion von serieller Schnittstelle (wie im Beispiel) auf Ethernet (wie in meinem Fall) bislang überfordert.

Nun habe ich folgende Fragen:

  1. Was ist aus eurer Sicht ein sinnvoller Weg mein Ziel zu erreichen?
  2. Kann man die serverseitigen Skripte auf dem Raspberry auch in Python schreiben und einbinden, da habe ich im Gegensatz zu php zumindest schon mal Fingerübungen gemacht.
  3. Hat jemand ein Codebeispiel einer HTMLSeite (mit welcher Skriptsprache auch immer), die bei Klick auf einen Knopf einen Statusrequest/Befehl via Ethernet an einen Arduino schickt.
  4. Wie stelle ich in meinem Szenario sicher, dass die Webseite ein Update erfährt und an den Client sendet, wenn sich ein anzuzeigender Wert ändert, ohne das ich vorher aktiv angefragt habe? Polling?
  5. Die Kür wäre das Codebeispiel aus Punkt 3 mit jQuery Mobile, damit es auch noch hübsch aussieht XD

Zu meinen bisherigen Programmiererfahrungen:
In C++ und mit der Arduino IDE komme ich für den Hausgebrauch gut zurecht. Python und HTML habe ich rudimentäre Grundkenntnisse, die zum Lesen und verstehen/nachbauen/ändern reichen, aber nicht um selbstständig große Dinge zu erfinden.

Schon mal besten Dank an alle, die bis hierhin gelesen haben. Ich würde mich freuen, wenn jemand ein wenig Licht ins Dunkel bringen könnte.

Gruß
Felix

Hallo Felix,

das klingt nach einem schönen Projekt!
Grundsätzlich ist das keine komplizierte Sache.

Kalle_Grabowski:
Nun habe ich folgende Fragen:

  1. Was ist aus eurer Sicht ein sinnvoller Weg mein Ziel zu erreichen?
  2. Kann man die serverseitigen Skripte auf dem Raspberry auch in Python schreiben und einbinden, da habe ich im Gegensatz zu php zumindest schon mal Fingerübungen gemacht.
  3. Hat jemand ein Codebeispiel einer HTMLSeite (mit welcher Skriptsprache auch immer), die bei Klick auf einen Knopf einen Statusrequest/Befehl via Ethernet an einen Arduino schickt.
  4. Wie stelle ich in meinem Szenario sicher, dass die Webseite ein Update erfährt und an den Client sendet, wenn sich ein anzuzeigender Wert ändert, ohne das ich vorher aktiv angefragt habe? Polling?
  5. Die Kür wäre das Codebeispiel aus Punkt 3 mit jQuery Mobile, damit es auch noch hübsch aussieht XD
  • Das Sinnvollste ist imho ein Befehlsverzeichnis zu entwickeln, welches per GET oder POST an den Arduino gesendet und ausgewertet werden kann. Also z.B. die Art des Steuerungsgerätes festlegen: Schalter (Button) = B1, Sensoren = S3 oder andere Geräte mit Werten = O4.
    Dann wird einfach bei dem Befehl ?B4=1 der Button4 auf An gesetzt. ?S4 liefert den Wert von Sensor 4 zurück, usw.
  • Dazu reicht erstmal vollkommen aus eine reine HTML-Seite mit einem Formular zu erstellen. Weitere Skripte nicht ausgeschlossen
  • Anbei im Link (Funkschalter in Webserver einbinden) ist eigentlich alles erklärt, wie das Prinzip funktioniert und wie man z.B. Pins steuern kann. Das lässt sich leicht adaptieren und auf Befehle "trimmen"
  • Das wirst du ohne Polling so nicht hinbekommen. Aber man kann die Webseite so designen, dass sich nur die entsprechenden Stellen aktualisieren müssen und nicht die gesamte Seite.
  • Wenn das Konstrukt mit dem Befehlsverzeichnis steht, kannst du jedwede Art der Programmierung nutzen um die Haussteuerung zu nutzen. Android, IOS oder Windows Phone Apps wären ein Kinderspiel :slight_smile:

Viel Erfolg!

Hallo Trib,

schon mal besten Dank für deine Hilfe. Ich hab es leider noch nicht geschafft dein Codebeispiel vollständig nachzuvollziehen.
Wenn ich das richtig verstanden habe, liegt die html-Seite bei dir auf der sd-karte vom Ethernet-Shield und über die geparsten Parameter beim GET Aufruf löst du die Aktion z.B. Pin schalten auf dem Arduino aus. Leider habe ich noch die alte Variante ohne SD-Karte, daher würde ich die (große statische) Seite gerne auf dem Raspberry hosten und dann über einen Button eine entsprechende Statusanfrage/Befehle an den Arduino zu senden. Soweit ich das bis hierhin verstanden habe, würde sich das Handling auf dem Arduino gegenüber deinem Beispiel nicht ändern, sofern es mir gelingt den Rückgabewert dynamisch in die auf dem Raspberry laufende Seite zu integrieren.
Kannst du mir noch einen Hinweis geben, wie der Code aussehen würde wenn man das trennt? Fällt das, was ich suche unter das Stichwort AJAX?

Gruß
Felix

hi,

hiermit schalte ich mein wohnzimmerlicht. es werden schieberegister bedient, das muß man halt anpassen, ebenso die IP-adresse.
aufrufen vom handy/tablet mit 192.168.2.152/rgb

gruß stefan

steuerung_2.ino (4.25 KB)

Hallo Stefan,

vielen Dank, das probiere ich morgen gleich mal aus.

Gruß
Felix

hi,

war eigentlich die antwort auf punkt3 und 5 vom ersten post, mit jQuery Mobile, Du brauchst also internetzugang...

gruß stefan

So,

hab es jetzt endlich mal geschafft mich noch mal an mein Problem zu setzen.
Der JQuery Code-Schnipsel von Stefan hat mir sehr geholfen - nochmal besten Dank!
Teil 1 meines Problems ist damit gelöst. Über die Jquery Seite, kann ich Knöpfe drücken, um Lichter und Jalousien an und aus zu schalten. Momentan befindet sich noch der ganze Code auf dem Arduino, daher bin ich im Umfang etwas begrenzt, aber ich hoffe, dass ich mich demnächst mal damit beschäftigen kann, wie ich den Jquery Code auf dem Raspberry dazu bringen kann python-Scripte auszuführen, die dann über Ethernet mit dem Arduino kommunizieren.
Alternativ bin ich dabei zu überlegen wie aufwändig es wohl wäre den Code vollständig auf dem Raspberry laufen zu lassen und mein Arduino-Shield so umzubauen, dass es auch an der 3.3 Volt Schnittstelle vom Raspberry läuft.

Vielen Dank noch mal an alle die unterstützt haben.

Gruß
Felix

hi,

welches arduino shield? versteh ich jetzt nicht, der raspberry braucht ja kein ethernet-shield (Du hast ja wohl keinen raspberry A).

ob Du überhaupt einen arduino brauchst, hängt davon ab, wieviel Du schalten willst. und selbst wenn die gpio-pins von raspberry nicht reichen, gibt's ja zb. schieberegister zum erweitern. bei dem beispiel-sketch von mir schalte ich mit drei pins vom arduino 26 lampen, wobei es auch wesentlich mehr sein könnten.

gruß stefan

Hi zusammen,

dann mag ich nochmal schnell das Wort Gertboard in den Raum werfen :slight_smile:
Das kann man an die GPIO Pins des Pi anschließen und hat einen ATMega mit einer Vielzahl von Pins zur Verfügung. Vielleicht ist das ja auch eine Option.

Gruß,
trib

Das Shield brauche ich, um von der seriellen Schnittstelle auf den Bus zu kommen, wobei das im wesentlichen nur ein l9637d ist. Sofern der auch mit 3.3 v zurecht kommt sollte das auch ohne arduino gehen. Ich habe nur leider mit c und der einbindung der ethernet Schnittstelle auf dem raspberry noch keine Erfahrung.

Gruß,
Felix