Beiträge von eiche

VPN/Proxy erkannt

Es scheint, dass Sie einen VPN- oder Proxy-Dienst verwenden. Bitte beachten Sie, dass die Nutzung eines solchen Dienstes die Funktionalität dieser Webseite einschränken kann.

    Hm, das könnte mich auch interessieren.

    Hundehütte fehlt noch. ;)

    Da schließt sich eine Frage meinerseits an:

    Ich habe eine Kombinationsheizung von Truma, analog gesteuert per Drehschalter und irgendwie analogem Einstellring. Dies ist von uns sehr feinfühlig einzustellen, also ohne Sollwert, welcher digital verarbeitet werden kann. Falls ein Foto erforderlich sein sollte, kann ich dies beifügen. Das Prinzip sollte aber klar sein.

    Ich habe bisher nicht eingegriffen und auch nicht versucht, hinter den Einsteller zu schauen.

    Kennt hier jemand eine einfache Möglichkeit der digitalen Regelung per Shelly-Hardware, also Anschlussplan?

    Truma Heizung Combi Gas

    Am zusätzlichen Shelly schließt du den Doppelschalter an. Ist es kein Doppeltaster?

    Dieser Shelly braucht selbstverständlich zwei Eingänge. Falls du dafür einen Shelly kaufen willst, empfehle ich den i4.

    Auf diesem Shelly legst du für jede mögliche Schalterkombination eine Action (=Webhook) an und trägst für alle Rollladen/Jalousien Shelly, die du mit diesen Schaltern steuern willst, je einen URL ein. Wie der jeweilige URL lauten muss, kannst du der Dokumentation entnehmen.

    Noch ein Tipp:

    Bevor du einen URL in eine Action einbaust, kannst/solltest du diesen per Browser-Adresszeile testen.

    ostfriese

    Hast du mal die Methode Script.SetConfig versucht?

    Falls die Firmware eine Chance hat, darauf zu reagieren, wird mit folgendem URL der automatische Start verhindert.

    Code
    http://<ip address>/rpc/script.setconfig?id=<script id>&config={"enable":false}

    Danach reboot ...

    Teste doch einfach die Lösung von thgoebel in #2!

    Sorge zuerst dafür, dass der AP des Shelly aktiv ist und gib diesem ein Passwort!

    Deaktiviere dann die Cloud und am besten entferne den Shelly aus dem WLAN!

    Dann führe den Funktionstest durch.

    Du kannst dann immer noch den Shelly über dessen Access Point erreichen.

    ToLa62

    Dein Skriptskelett in #1 startet sich nicht selbst. Dies wäre ohnehin paradox. Ein laufendes Skript sich selbst starten zu lassen, obwohl es schon läuft? :/

    Im Ernst:

    In einem Shelly Skript gibt es keine Endlosschleife. Ein solches Skript sollte, wenn es etwas zielführendes tun soll, Ereignis gesteuert arbeiten.

    Du kannst etwas ähnliches nachbilden per Timer, der eine Funktion periodisch aufruft.

    Dafür gibt es Methoden.

    Zum Factory Reset sollte diese Methode führen: Shelly.FactoryReset

    Solange der Plus 1 bzw. Shelly ab der zweiten Generation erreichbar ist:

    http://<IP Adresse>/rpc/shelly.factoryreset

    Ich habe es nicht getestet, rechne aber wegen der eindeutigen Dokumentation damit, dass dies funktioniert.

    Edit:

    Interessant wäre ein Versuch, dies per Skript zu realisieren: ;)

    Folgende Anweisung sollte hierfür genügen.

    Code
    Shelly.call("Shelly.FactoryReset", {});

    Ich habe mir etwas tiefergehend die Webhooks (=Actions) angesehen.

    Prinzipiell ist es möglich, das Skript auf dem Plus 2PM (s. #11) durch 5 Webhooks zu ersetzen, aber ...

    1. Der Pflegeaufwand bei einer Änderung ist in den Webhooks höher und damit fehleranfälliger.
    2. Die Dokumentation zu den Tokens (${x.y}) erscheint mir nicht zufriedenstellend oder deren Konzept ist nicht sehr systematisch/ausgereift.
      Das RPC Konzept ist erheblich ausgereifter und kann leicht in einem Skript genutzt werden.

    Beispiel zu 2.

    Wenn ich einem Endpoint eine strukturierte Information übermitteln will, in welcher der Device Name enthalten ist, so kann dieser leicht per RPC Aufruf in einem Skript geholt werden. Ich habe viele Experimente per Token in einem Webhook durchgeführt und hatte keinen Erfolg, wohl hauptsächlich, weil es hierzu an Dokumentation oder durchgreifendem Konzept fehlt.

    Fazit: Wenn ausgefeilte, nicht vorgefertigte Pfade beschritten werden sollen, sind Skripte den Webhooks deutlich überlegen. Dann stoßen Webhooks bereits früh an ihre Grenzen.

    Falls per Methode Webhook.Create oder Webhook.Update doch noch ausgefeiltere Dinge möglich sein sollten, werde ich gerne meine Aussage relativieren.

    Btw, da gibt es einen kleinen verräterischen Fehler in der Dokumentation - im ersten Absatz. Vielleicht finde ich noch weitere. ;)

    Zitat


    A revision number is maintained which is incremented on every update of the schedules.

    Vermutlich wurde hier aus der Doku zu Schedule kopiert und unter Webhook eingefügt. Richtig sollte es lauten:

    A revision number is maintained which is incremented on every update of the webhooks.

    Gu123

    Sehr interessant. Mit solchen Webhooks habe ich mich noch nicht in Tiefe beschäftigt.

    Insbesondere die "condition" Komponente ist beachtenswert. Ich werde bei Gelegenheit damit experimentieren. Vielleicht kann so etwas das eine oder andere kurze Skript ersetzen.

    Und per Komponente "enable" lässt sich ein solcher Webhook bspw. per Schedule Job sperren/freigeben. Das ist eine vielversprechende Kombination.

    Es ist gut möglich, dass hiermit dein Anliegen implementierbar ist.

    Diese Webhooks, bspw. per Web UI, einzurichten, ist allerdings auch etwas gewöhnungsbedürftig. Soll heißen, wer brauchbar skripten kann, kommt damit evtl. zügiger zum Ziel - neben der höheren Flexibilität per Skripten. So gesehen bilden die Webhooks eine Teilmenge von per Skript möglichen Implementationen ab.

    Nun schließlich die fast komplette Skriptlösung. Sie ist nur deshalb fast komplett, weil ich weit weg von den Tasten bin und die im EventHandler eintreffenden Events nicht prüfen kann. Dies ist erforderlich, um daraus die Filterbedingung im EventHandler handleButton (s. Skript) zu komplettieren. Das folgende Skript für den i4 ist somit ungetestet, stellt aber die wichtigsten Dinge bereits zur Verfügung. Dabei habe ich versucht, das Skript kurz und einigermaßen verständlich zu gestalten.

    Viel mehr kann ich aus der Ferne leider nicht tun.

    Das Skript auf dem Plus 2PM bleibt so wie in #11.

    Hinweis:

    Das i4 Skript lässt sich auf alle Eingänge, also 4 Tasten, erweitern. Hierfür sind 3 weitere HTTP Endpoints, eine etwas komplexere Datenstruktur (in den ersten Skriptzeilen) und eine Erweiterung des EventHandlers erforderlich. Je durchdachter die Datenstruktur gestaltet ist, desto kürzer kann der Ablaufcode gehalten werden - bei zugleich besserer Wartbarkeit. Wenn die Skripte auf den Plus 2PM etwas flexibler gestaltet würde, d.h. bspw. dem Status noch die Quelle beigefügt, braucht man im i4 Skript keinen zusätzlichen HTTP Endpoint. Vielleicht werde ich eine solche Lösung gelegentlich aufzeigen.

    Fortsetzung zu #10

    Das Skript auf dem i4 soll eine Status-Nachricht vom Plus 2PM empfangen. Hierfür ist am besten ein HTTP Endpoint (genauer HTTPServer Endpoint) geeignet.

    Das Skript auf dem i4:

    Code
    function receiveStatusCover_0(request) {
      if(request.method==="GET" && request.query!==undefined) {
        print(request.query);
      }
    }
    
    HTTPServer.registerEndpoint("Cover_0", receiveStatusCover_0);

    Die HTTPServer Endpoint Funktion habe ich receiveStatusCover_0 genannt. Dieser Name kann auch anders gestaltet werden, bspw. statusBad1Rollladen. So oder so muss diese Funktion als Endpoint registriert werden, was per Aufruf von HTTPServer.registerEndpoint geschieht. Die Funktion gibt zunächst nur den empfangenen Wert aus.

    Nun muss noch der Plus 2PM seinen Cover:0 Status an den i4 übermitteln. Hierfür ist die Methode "HTTP.GET" geeignet, die als Parameter den URL braucht, also die IP Zieladresse (des i4) und zusätzliches für den Endpoint des Plus 2PM.

    Ich nehme im weiteren Verlauf die folgenden IP Adressen an, die für deine Zwecke anzupassen sind.

    i4: 172.16.3.68

    Plus 2PM: 172.16.3.66

    Beide Skripte mögen bspw. die Id 1 besitzen. Deren Id lassen sich leicht per Browser herausfinden: http://<IP Adresse>/rpc/script.list
    Dies listet alle auf dem Shelly gespeicherten Skripte auf - id, name, enable, running. Die Id ist entscheidend.

    Das Skript auf dem Plus 2PM:

    Code
    function sendStatus(status) {
      if(status.component==="cover:0"
        && status.delta!==undefined
        && status.delta.state!==undefined) {
          print(status.delta.state);
          Shelly.call("http.get", {url:"http://172.16.3.68/script/1/Cover_0?" + status.delta.state});
        }
    }
    
    Shelly.addStatusHandler(sendStatus);

    Der URL setzt sich wie folgt zusammen.

    Das Protokoll (http://), die IP Zieladresse (des i4), "/script/", die Skript Id des i4, Slash, Name des Endpoints (Cover_0), Fragezeichen gefolgt vom Request (geänderter Status der Component "cover:0")

    Für die Funktion, hier noch ein Test, müssen beide Skripte laufen.

    Wenn du per Plus 2PM den Rollladen steuerst, wirst du in beiden Konsolenfenstern die gleichen Ausgaben vorfinden. Die beiden jeweils gleichen Ausgaben erfolgen auf dem i4 ca. 2s nach denen auf dem Plus 2PM. Der i4 erhält also zeitnah die Mitteilungen über die Statusänderungen des Rollladens am Plus 2PM - und kann diese für die Zielfunktionalität verarbeiten. Letzteres kommt noch in einer Fortsetzung. ;) Da die Verarbeitung des empfangenen Status auf einen nächsten kurzen Tastendruck vorzubereiten hat, sollte eine Verzögerung von ca. 2s kein Problem darstellen.

    Hinweis: Diese Skripte habe ich so kurz wie möglich gehalten. Man kann weitere Dinge hinzufügen, die die Skripte ein wenig verbessern, was aber an deren Funktionalität nichts ändert.

    Ich beginne mal ganz klein, um zu zeigen, wie das Skript auf dem Plus 2PM arbeitet.

    Code
    function sendStatus(status) {
      if(status.component==="cover:0"
        && status.delta!==undefined
        && status.delta.state!==undefined) {
          print(status.delta.state);
        }
    }
    
    Shelly.addStatusHandler(sendStatus);

    Die StatusHandler Funktion habe ich "sendStatus" genannt. Diese Funktion wird per Shelly.addStatusHandler() als StatusHandler in der Firmware registriert und erhält so alle möglichen Mitteilungen bei Status-Änderungen. Weil nur der aktuelle Zustand des Rollladenantriebs gebraucht wird, muss dieser per etwas komplexerer Bedingung gefiltert werden.

    sendStatus prüft sorgfältig die auslösende Komponente und ob die zu selektierende Information, hier status.delta.state, existiert. Deren Wert wird zunächst nur per print() im Konsolenfenster ausgegeben.

    Wenn der Rollladen, bspw. per Web UI gefahren und angehalten wird, zeigt die Konsolenausgabe nacheinander alle Zustands-Strings, bspw. so:

    Code
    opening
    stopped
    opening
    open
    closing
    stopped
    closing
    closed

    Hier habe ich den Rollladen (remote, VPN, Web UI) zunächst öffnen lassen, dann angehalten, weiter öffnen lassen bis ganz offen.

    Danach habe ich den Rollladen schließen lassen, auf dem Weg dahin angehalten, erneut schließen aktiviert bis ganz geschlossen.

    Die per print() ausgegebenen Wörter müssen noch an den i4 gesendet werden, wofür ich auf dem i4 einen HTTP Endpoint vorsehe. Dann fehlt im obigen Skript nur noch eine Anweisung, die den Status per HTTP Request an den i4 sendet.

    Fortsetzung folgt ;)

    kuhniwerle

    Mir fiel noch eine Lösung ein. Ich setze kein übergeordnetes System und keinen MQTT Broker voraus.

    1. Langer Druck => runter
    2. Kurzer Druck => Status quo abhängig
      stehend => rauf
      fahrend => stop

    Ein Fazit findest du am Ende.

    Mit einem langen Druck, wie oben gewünscht, immer zu fahren, dürfte nicht gelingen, da nach einem Stop per Tastendruck vom Nutzer die Fahrrichtung festgelegt werden muss.

    Dies gelingt mit der Unterscheidung zwischen kurzem und langem Druck. Auch erscheint mir dies hinreichend intuitiv.

    Andernfalls müsste der Nutzer unter Umständen mehrmals drücken, bis die gewünschte Reaktion erfolgt.

    Ob dies zielführend gelingen kann, hängt nur noch davon ab, ob der aktuelle Status zeitnah genug erfassbar ist.

    Ich habe es remote, bin weit weg, mit einem Shelly Plus 2PM getestet.

    Die asynchrone remote Abfrage lautet

    Code
    http://<IP Adresse>/rpc/cover.getstatus?id=0

    Die Antwort in result.state ist einer der folgenden Strings: "opening", "closing", "stopped", "open", "closed"

    Somit ist das Ziel per Skript auf einem i4 implementierbar.

    Ob hierbei evtl. auftretende Verzögerungen akzeptabel sind, bleibt zu prüfen.

    Ein kurzer Tastendruck muss folgende Wirkung haben.

    state: "opening" oder "closing" => stop

    state: "stopped" oder "closed" => rauf

    state: "open" darf bei kurzem Druck keine Wirkung haben. Man könnte dann zwar herunterfahren lassen, dies täte aber vermutlich den Lernerfolg von Nutzern eher behindern.

    Da die Antwort bei einer remote Abfrage evtl. zu stark verzögert eintreffen kann und diese nicht synchron verarbeitbar ist, sind ein Skript sowohl auf dem Plus 2PM als auch auf dem i4 empfehlenswert.

    Das Skript auf dem Plus 2PM kann vermutlich recht kurz sein. Es braucht dazu nur einen Event- oder StatusHandler, der die zielführende Information selektiert und eine Nachricht mit dem Status per HTTP an den i4 sendet.

    Das Skript auf dem i4 speichert die vom Plus 2PM empfangene Info, damit ein kurzer Tastendruck, wie oben angedeutet, zur passenden Nachricht an den Plus 2PM führt.

    Die RPC Methoden sind "Cover.Open", "Cover.Close" und "Cover.Stop" - jeweils mit id=0.

    Ein langer Tastendruck hat immer ein Herunterfahren zur Folge, also http://<IP Adresse 2PM>/rpc/cover.close?id=0 .
    Die Antwort lautet leider immer null. Deshalb ist der Status zusätzlich zu übermitteln.

    Auf dem i4 sind im Skript folgende Teile erforderlich.

    1. Ein HTTP Endpoint, der die Nachricht vom Plus 2PM empfängt und geeignet verarbeitet, d.h. den übermittelten Status speichert.
      Alternativ kann vorbereitend die Methode für den nächsten kurzen Tastendruck selektiert werden.
    2. Ein EventHandler, der sowohl den langen als auch den kurzen Tastendruck verarbeitet, Letzteren wie oben erläutert.

    Das ist das Prinzip. Ich habe ein begonnenes Skript verworfen, weil ich nicht alles, weit weg von den Shelly, testen kann bzw. dies in meiner Situation relativ aufwändig wäre.

    Vielleicht habe ich in wenigen Tagen genügend Muße dazu, dies zu versuchen.

    Fazit:

    Das, was du als Ziel formuliertest, ist prinzipiell geringfügig abgewandelt implementierbar.

    Ob die Reaktionszeiten nach einem Tastendruck erträglich sind, muss im Feldversuch getestet werden. Da ich auch per i4 und Skript steuere, kann ich eine kurze Reaktionszeit in Aussicht stellen.

    Selbstverständlich sind die Handhabungen per kurzem und langem Tastendruck auch vertauschbar.

    Nachgereicht:

    Diese Lösung funktioniert auch dann, wenn zwischendurch eine andere steuernde Quelle genutzt wird, wie Shelly Button 1, Web UI, Sprachassistent (Hey Google, Alexa, Iris, ...), weil der Plus 2PM immer dann seine Nachricht an den i4 sendet, wenn sich sein Status ändert.

    Offensichtlich kennt ChatGPT kein Shelly Script. :S

    kuhniwerle

    Per Skript könnte es gelingen.

    Dazu müsste das Skript nach einem Reboot bzw. nach seinem ersten Start erst einmal den Rollladen bis zu einer Endposition fahren, rauf oder runter. Dann "kennt" das Skript die aktuelle Position.

    Ein wesentliches Problem bleibt aber.

    Du fährst mit long den Rollladen runter und stoppst diesen mit kurz.

    Wie soll danach das Skript bei einem long reagieren?

    Es könnte gegenteilig fahren, also rauf.

    So ist es unmöglich, nach einem Stop den Rollladen weiter in der zuvor genutzten Richtung zu fahren.

    Wenn dir dies genügt, kann es per Skript gelöst werden, weil das Skript die zuletzt genutzte Fahrrichtung speichern kann, evtl. sogar nichtflüchtig für den Fall eines zwischenzeitlichen Stromausfalls.

    Ich nutze zwei i4 Taster je Rollladen mit Skript hierfür. Das Skript hat den Vorteil, dass die Tastdauer erfasst und so beliebig genutzt werden kann, es gibt also nicht nur ein long push.

    Ein Skript kann also prinzipiell mit unterschiedlichen Druckdauern arbeiten. Der von horkatz vorgeschlagene double push ist erheblich leichter implementierbar.

    Flo Rian bambam

    Um welchen Shelly handelt es sich bei dir?

    Falls es ein Shelly der zweiten Generation (mit Plus im Namen) ist, wäre vermutlich ein Workaround bzw. Adaption per Skript möglich.

    Dazu wären alle erforderlichen Daten erforderlich.

    1. Welche Daten (Status, Messwerte, ...) sollen mitgeteilt werden?
    2. Wie soll der Shelly gesteuert werden?
    3. Welche Topics sind erforderlich?