Home Atomation mit Ethernet Shield via Web Interface

Hallo,

ich suche hier nach einer optimalen sauberen Lösung für folgende Hausautomatisierung.

Ich möchte von intern über LAN, W-LAN sowie von extern zu Hause die Jalousien steuern und die aktuelle Position (oben, mitte od. unten) abfragen.
Die Steuerung sollte überein Webinterface mit Benutzeranmeldung und SSL gesicherte Verbindung stattfinden.

Vorhandene Hardware:

-Ubuntu Server mit einem Intel I3 und 64G RAM und Gigabit LAN welcher bereits als Sambaserver, DLNA und Asterisk verwendet wird.
-2 Jalousiensteuerungen (eine je Wohneinheit) mit Arduino Due
-Uno mit Ethernet Shield.

Aktuell:
Zu den ersten Testzwecken habe ich eine simple html Datei mit 2 Buttons (LED 1 ein /LED1 aus) geschrieben die per GET dies an den Arduino Uno gibt und eine LED schaltet. Diese html Datei liegt auf der SD Karte des Ethernet Shields.

Ich habe ein DYNDNS eingerichtet und eine Portweiterleitung auf meiner Fritzbox an Port 80 der IP des Arduino Ethernet Shields.

Dieser Test funktioniert. Ich kann intern über die IP des Ethernet Shields oder extern über die DYNDNS auf die Website der SD Karte zugreifen und darüber die Test LED an und ausschalten.

Hier fehlt mir jedoch die Rückmeldung, dass der Befehl auch angekommen und ausgeführt wurde und zudem die gesicherte SSL Verbindung mit Benutzerauthentifizierung.

Weiteres Vorgehen:

Auf dem bereits vorhandenen Ubuntu Server einen Apache2 Webserver zu installieren auf dem die Webseiten abgelegt sind (Anstatt auf der SD Karte des Ethernet Shields) Dieser Server übernimmt die SSL Verbindung und Benutzerverwaltung.
Wie funktioniert in einem solchen Fall die Kommunikation mit dem Arduino (senden von Steuerbefehlen, Empfangen von Bestätigungen und Status)?

Wie würdet ihr so etwas lösen?

Danke & Gruß

Wie würdet ihr so etwas lösen?

Ich in Perl oder Python, aber das hängt ganz von Deinen Skills ab. Wenn Du PHP kennst, mach es in der Sprache, obwohl solch einfache Sachen auch gut in einem Shell-Script erledigt werden können. Wenn Du keine dieser Script-Sprachen beherrschst, käme auch eine Programmierung in C++ in Frage, auch wenn das meiner Meinung nach eher umständlich ist.

Die ganz einfache (sowohl was Aufwand als auch Erscheinungsbild angeht) Lösung ist die Verwendung der Apache-Module mod_auth (Benutzeranmeldung) und mod_proxy (Weiterleitung des Traffics an den Arduino).

Vielen Dank.

Was mir aktuell noch am meisten verwirrt ist wie ich den anzuzeigenden Status vom Arduino in die Webseite bekomme.

Bei allen Beispielprogrammen die ich finden konnte wird die html Datei direkt vom Arduino generiert und an den Client gesendet.
Wie wird dies gelöst wenn die Website auf einem anderen Server liegt? Wie gibt der Arduino Werte an den Apache die der Client dann angezeigt bekommt?

ibiza1425:
Bei allen Beispielprogrammen die ich finden konnte wird die html Datei direkt vom Arduino generiert und an den Client gesendet.
Wie wird dies gelöst wenn die Website auf einem anderen Server liegt? Wie gibt der Arduino Werte an den Apache die der Client dann angezeigt bekommt?

Du kannst einen Arduino nicht nur als Webserver programmieren, sondern auch als Web-Client.

Dann könnte zum Beispiel der Arduino als Webclient die Daten immer regelmäßig an Deinen Webserver senden (GET oder POST), dier diese Daten dann einfach loggt oder in eine MySQL-Datenbank einpflegt, und dann bei Anfragen auf verschiedene Art auswertet und anzeigt.

Also es geht beides: Der Arduino arbeitet als Webserver, generiert die Daten beim Seitenabruf oder loggt sie erstmal auf SD-Karte und stellt sie bei Anfragen zur Verfügung. Oder der Arduino arbeitet als Webclient und sendet seine Daten an einen anderen Server, der die Daten dann weiter verarbeitet.

Es besteht natürlich auch die Möglichkeit, Daten in einem "Frame" einer Webseite darzustellen. Also die Webseite liegt woanders auf dem Server und ein Frame oder iFrame der darzustellenden Seite wird von einem anderen Webserver (z.B. dem Arduino) bereitgestellt.

Allerdings hat ein Arduino nicht genügend RAM und Rechenleistung für SSL-verschlüsselte Verbindungen. Allenfalls eine HTTP-BASIC Authentifikation mit Username/Passwort im Klartext wäre möglich. So dass die Verbindung, egal wohin der Arduino seine Daten überträgt, unverschlüsselt wären. Möglichkeiten wie "SSL-Tunnel" zwischen Deinem Heim-Router und einem anderen Computer im Internet mal außen vor gelassen.

Wenn Du SSL-verschlüsselte Verbindungen von Dir zuhause ins Internet benötigst, muß bei Dir zuhause immer ein mit dem Arduino verbundener Rechner mit genügend RAM/Rechenleistung die Außenverbindung ins Internet übernehmen.

Also z.B. Arduino ==> Raspberry/PC ==> Heim-Router ==> Internet
Wobei dann die Daten bis zum Raspberry/PC unverschlüsselt in Deinem Heim-Netz laufen und erst ab dort verschlüsselt sind.

Vielen Dank für die ausführliche Erklärung.

Bitte noch einmal kurz bestätigen ob ich es richtig aufgefasst habe.

Arduino sendet die Daten mit Get an meinen Apache (Intel I3, 64G RAM mit Ubuntu Server 24h Betrieb) in eine MySQL- Datenbank
Der Client greift mit Benutzeranmeldung und SSL auf den Apache zu und bekommt die Daten in einem Webinterface angezeigt

Andere Richtung:

In diesem Webinterface belege ich Buttons mit Get-Befehlen und sende diese via den Apache zu dem Arduino

Hallo,
"darüber die Test LED an und ausschalten"
"Hier fehlt mir jedoch die Rückmeldung, dass der Befehl auch angekommen und ausgeführt wurde"

An D1 hast Du Deine leuchtende LED, sendest "ausschalten"
Mit A0 mist Du die Spannung an D1.
Abfragen mußt Du nur A0, Spannung ja/nein. Ob Befehle an kommen oder nicht,
halte ich nicht für wichtig. Wichtiger ist, ob die Funktion erfüllt worden
ist.
Du gehst Morgens aus dem Haus. KaffeeMaschine?
Du sendest StatusAbfrage, KaffeeMaschine aus?
Antwort, Kaffee Maschine aus.

Um 14:07h Anruf von der freiwilligen Feuerwehr Timbuktu, HausNiederBrand.
Du hast hier einen unbekannte Status überprüft, aber nicht- ob noch Spannung
an der KaffeeMaschine anliegt.
In diesem Fall hatte Dein Transistor/Relais einen Defekt und versorgte die
KaffeeMaschine weiterhin mit Spannung.
Gruß und Spaß
Andreas

Tuh dir das nicht an. Es gibt bereits sowas in fertig.
Schau dir souliss und openHAB an.
Ich nutze Modbus RTU (RS485) und openHAB.
Souliss kommt aufs Arduino und openHAB auf Raspberry.

ibiza1425:
Andere Richtung:

In diesem Webinterface belege ich Buttons mit Get-Befehlen und sende diese via den Apache zu dem Arduino

Normalerweise entscheidest Du Dich dafür, dass der Arduino entweder als Webclient oder als Webserver arbeitet. Und je nachdem läßt Du die Daten fließen.

Arduino als Webclient:

  • Baut in regelmäßigen Zeitabständen Verbindung zu einem Server auf, sendet Daten hin, bekommt Antwort zurück

Arduino als Webserver:

  • Wartet auf Anfragen von Clients, wertet die Daten der Anfragen aus, sendet Antwort zurück

Ob Du es problemlos hinbekommst, dass der Arduino gleichzeitig als Webclient und als Webserver arbeiten kann und das dann flüssig abläuft, weiß ich nicht. Das habe ich noch nocht ausprobiert. Dafür dürftest Du wohl auch wenige fertige Beispiele finden.

Wenn Datentransfers eigentlich von beiden Seiten aus gestartet werden sollen, legt man den Arduino meistens als Webserver aus, der sehr oft zum Aktualisieren gepollt wird (z.B. in Abständen von fünf Sekunden).

Danke für die Antworten,

@ SkobyMobil
die Jalousiensteuerung besteht aus 2 Relais und Feinsicherung die den Motor ansteuern.
Die Netzspannung wird entweder abgeschaltet wenn der Endlagenschalter der Jalousie erreicht ist oder der Arduino den Steuerbefehl unterbricht.

Die Steuerung funktioniert so ähnlich wie bei einem Fensterheber im Auto:

Tippen auf Taster „hoch“ < 1S -> komplette Hochfahrt
Halten des Tasters „hoch“ >1S -> Hochfahrt bis loslassen oder Endwert erreicht ist
Tippen auf Taster „hoch“ während einer Hochfahrt -> stop
Tippen auf Taster „runter“ während einer Hochfahrt -> stop, delay, runterfahrt
Usw.

5mal tippen auf hoch innerhalb 800ms startet eine Lernfahrt zum Anlernen der Fahrtdauer
3mal tippen auf hoch innerhalb 500ms startet eine Referenzfahrt (überlanges Hochfahren bis sicher die Position erreicht ist)

Als Status bekomme ich die aktuelle Position 0 – 100 0= unten, 100= hoch
Für das ext. Steuern bekommt der Arduino Due die Anweisung (Nummer der Jalousie, Sollwert 0-100)

In dem späteren Webinterface möchte ich ein Layout z.B. eine Etage in dem die Jalousien eingezeichnet sich und in einer kleinen Animation der Stand visualisiert wird. In der Animation soll durch klicken auf den gewünschten Stand ein Befehl mit der Jalousien Nummer und dem Sollwert an den Arduino übergeben werden. In der Animation soll das Fahren der Jalousie ebenfalls visualisiert werden und auf dem Wert stehen bleiben.

Wird also eine Fahrt ausgelöst müsste der Wert etwa im 2 s Tackt in die MySQL gelangen. Ist die Fahrt abgeschlossen ist keine weitere Aktualisierung notwendig um den Traffic auf dem Netzwerk gering zu halten.
Erst wenn eine weitere Aktion erfolgt (Fahrt oder Reset durch Spannungsabfall) müssten wieder Werte an die MySQL gelangen.

Wenn ich den Arduino als Webserver konfiguriere, kann ich dann trotzdem Werte in die MySQL senden?

Ich hoffe ich bin gerade nicht zu schwer von Begriff

Hallo,
ich weiß schon, wie so eine Steuerung funktioniert. Nur wenn der Schalter
defekt ist, oder die Sicherung durch ist- dann merkst Du das nicht!

Du merkst nur, das etwas in Deiner Hausautomatisierung nicht stimmt.
Was dort nicht stimmt, das weißst Du nicht. Deine Hausautomatisierung
befindet sich in einem Dir unbekannten Zustand.
Das finde ich etwas "kitzelig".
Gruß und Spaß
Andreas

klar wäre es sauberer gewesen wenn ich noch die Stromaufnahme messe und überwache ob der Motor läuft und ein Diagnosemodul mir mitteilt das etwas nicht stimmt.
Aber spätestens wenn ich heimkomme und die Jalousie nicht da steht wo sie soll merk ich das doch auch? Es kommt hier niemand zu schaden
Die Steuerung ist jetzt seit einem Jahr im Einsatz und arbeitet ohne Probleme.

Ich möchte diese jetzt nur um eine Anbindung ans Netzwerk und Steuerung und Statusabfrage via Webinterface erweitern

Wenn ich den Arduino als Webserver konfiguriere, kann ich dann trotzdem Werte in die MySQL senden?
gibt es hier Beispiele? Ich konnte leider nichts finden.