Shelly Plug S von extern (Webserver) schalten

  • Hallo zusammen,

    ich habe mir schon das halbe Wochenende um die Ohren geschlagen und finde bisher leider keine Lösung für meine Idee. Vielleicht kann mir ja jemand helfen?

    Zur Ausgangssituation: Shelly Plug S mit int. IP-Adresse: 192.168.10.x und aktivierten Benutzernamen und Passwort vorhanden.

    An dem Shelly hängt ein Rechner "Medien-PC" welcher ein Fotoarchiv hostet. Parallel dazu gibt es auf einem externen Webserver in einem geschützten Verzeichnis eine HTML-Seite . Diese HTML-Seite bindet mittels Funktion I-frame eine Anwendung auf dem Medien-PC (privates Netz via Portfreigabe) ein. Soweit funktioniert das alles. Wenn der Rechner an ist können wir auf die Bilder auf dem medien-PC zugreifen. usw.

    Die Idee ist nun auf der gleichen HTML-Seite einen Button für den Shelly Plug S bereitzustellen um die Spannungsversorgung für den Medien-PC, angeschlossen an dem Shelly Plug S, einzuschalten. Das könnte auch so funktionieren:

    Code
    http://user:password@adresse.dyndns.org:port/relay/0?turn=on

    Wenn ich diesen Befehl nativ in die Webseite einbaue, dann liefert der Shelly eine Rückmeldung die mir im Browser wiederum als "Ergebnis" angezeigt wird. Damit bin ich von der Ursprungsadresse weg und der i-frame wird nicht mehr angezeigt.

    Zusätzlich habe ich auch schon mehrere Versuche unternommen das Thema mithilfe der Javascript Anleitung von Seven of Nine (Danke für die Anleitung - Shelly per Javascript steuern - MQTT & REST-API - Offizielles Shelly Support Forum (smarthome-forum.eu)) umzusetzen. Immer, wenn ich das script verändern möchte das z.B. die Portnummer, der Benutzername oder das vergebene Passwort eingebaut wird, erhalte ich die Fehler Meldung "Befehl nicht ausgeführt".

    Hier das angepasste Script:

    Kann mir jemand helfen und mir den passenden Code abändern / liefern?

    Vielen Dank schon jetzt für eure Hilfe.

    Ich hoffe doch sehr das ich die Funktion irgendwie umgesetzt bekommen!

    Einmal editiert, zuletzt von neo-v (13. Dezember 2021 um 18:54) aus folgendem Grund: Code-Tag gesetzt.

  • ip ist dann dein dyndns-name, dann sollte es von der Theorie her klappen.. aber warum nimmst du nicht direkt die Shelly-Cloud, die ist doch genau dafür gemacht..

    >100 Shellies, darunter so gut wie alles was der Hersteller produziert hat. ;)
    :!: ich beantworte grundsätzlich keine Fragen per persönlicher Nachricht:!:

  • Hallo, vielen Dank für die Rückmeldung. Ja die Shelly Cloud wollte ich nicht nehmen, weil ich den Button auf der Webseite mit dem Fotoarchiv einbauen wollte und somit der berechtigten Gemeinde (Benutzer der Familie und ein paar weitere) die Möglichkeit geben vor betrachten Bilder den Rechner hochzufahren.

    Also so: Webseite besuchen und Anmelden --> Weiterleitung auf int. geschützten Bereich mit Button zum hochfahren des Rechners und anschließender Einbindung der Anwendung im Iframe auf der Webseite.

    Übrigens das Script wie oben angezeigt gibt mit direkter IP oder mit eingetragener Dyndns-Adresse immer die Meldung "Befehl nicht ausgeführt" aus. Sobald ich den Shelly ohne Benutzername und ohne Passwort anspreche (vorher Authentifizierung am Shelly aus) funktioniert der Befehl und der Shelly wird eingeschaltet. Aus Sicherheitsgründen möchte ich halt den Shelly, wenn der schon aus dem Netz erreichbar ist, mit BN und PW betreiben.

    Ich habe aktuell 10 Plug S und mehrere 1PM im Einsatz alle ohne Cloud Zugriff und nur Mithilfe der Shelly Home App. das funktioniert alles tadellos und kein Gerät muss in die Cloud (Ich bin ausgebildeter ISB und auch DSB). Stehe Clouddiensten daher skeptisch gegenüber. Shelly habe ich extra, wie auch meine Heizungssteuerung, nach dem Motto "zu betreiben ohne Cloudanbindung" angeschafft.

  • Das die Funktion grundsätzlich funktioniert, aber im Falle von Username/Kennwort nicht, spricht meines Erachtens dafür, dass der Zugriff (aus Sicherheitsgründen) blockiert wird.

    Generell: die Authentifizierung beim Shelly ist mittels Basic auth gelöst, das ist hochgradig unsicher und ich (hab oft beruflich mit IT-Sicherheit zu tun) würde dir dringend empfehlen einen anderen Weg einzuschlagen.

    Meines Erachtens gibt es hier zwei Varianten, wie das funktionieren kann:

    1) du nutzt statt dem direkten Aufruf via .fetch ein PHP-Script als Proxy, dann wird die Anweisung an den Shelly nicht via browser geschickt sondern vom Server (und den interessieren die Sicherheitsbeschränkungen deines Browsers nicht.

    Ein Beispiel hätte ich hier dafür:

    GitHub - shelly-tools/shelly-php-proxy-examples
    Contribute to shelly-tools/shelly-php-proxy-examples development by creating an account on GitHub.
    github.com

    Aber: das bleibt weiterhin hochgradig unsicher (kein TLS, Passwörter nur Basic und im Klartext)

    2) Du erstellst dir ein Mini-Script, welches auf deinem Server eine Text-Datei mit dem Inhalt "an" oder "aus" beinhaltet und nutzt einen Shelly Plus 1 um minütlich zu prüfen, was in der Datei drin steht und anhand des Textes das Relais an- oder auszuschalten.

    Vorteile:

    - die Shelly Plus können im Script auch mit Basic auth über TLS-Verschlüsselung arbeiten.

    - der Aufruf passiert nur von intern nach extern, also kein potentielles Einbruch-Szenario in deinem Router.

    - du bleibst unabhängig von einer Cloud.

    Ein PHP-Script welches eine Datei mit 2 möglichen Texten erstellt ist ein 5-Zeiler.

    Das ShellyScript, welches im Internet nach einer bestimmten Datei schaut hab ich bereits für eine andere Idee mal umgesetzt:
    https://github.com/shelly-tools/s…me-Contest-2021
    Das anzupassen ist schnell gemacht.

    Als ISB wirst du dich ganz bestimmt für Variante 2 entscheiden ;) , ich kann da gerne unterstüztend tätig sein.

    >100 Shellies, darunter so gut wie alles was der Hersteller produziert hat. ;)
    :!: ich beantworte grundsätzlich keine Fragen per persönlicher Nachricht:!:

  • Dieses Thema enthält einen weiteren Beitrag, der nur für registrierte Benutzer sichtbar ist, bitte registrieren Sie sich oder melden Sie sich an um diesen lesen zu können.