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.

    Zum Gedankenversuch, es ausschließlich mit Schedule Jobs (Zeitplänen) zu lösen.

    Ich denke, dass dies deshalb nicht gelingen kann, weil per solchem Job immer nur zu Zeitpunkten etwas ausgelöst werden kann.

    Meine erste Idee dazu war, einen Job zu kreieren, der um 7 Uhr den sunrise Job aktiviert. Frage bitte erst einmal nicht, wii das gelingt und glaube mir, dass dies möglich ist - aber nicht per Klicken und Cloud oder Web UI.

    Der sunrise Job kann hochfahren lassen und sich selbst deaktivieren - noch nicht getestet, müsste aber gehen.

    Das Problem liegt darin, dass dies nicht gelingt, wenn sunrise vor 7 Uhr ist, weil dies ab 7 Uhr bereits vergangen ist und nicht mehr wirkt. Somit fällte diese Lösung komplett aus.

    Zum Prinzip Schedule Jobs plus Skript:

    Es kommen zwei Jobs zum Einsatz, die derzeit nicht per Web UI bzw. App angelegt werden können. Zusätzlich ist ein kleines Skript erforderlich, welches zwei Funktionen und zwei Freigabevariablen sunrised und timed braucht.

    1. Der sunrise Job ruft eine Skriptfunktion rised() auf, welche sunrised auf true setzt. Ist zu diesem Zeitpunkt timed bereits true, veranlasst sie das Öffnen.
    2. Der 7 Uhr Job ruft eine andere Skriptfunktion time() auf, welche timed auf true setzt. Ist zu diesem Zeitpunkt sunrised bereits true, veranlasst sie das Öffnen.

    Somit wird nur dann geöffnet, wenn beide Variablen true beinhalten - das ist immer mit dem letzten beider Jobs der Fall. Zusammen mit dem Öffnen werden die beiden Variablen auf false gesetzt.

    Diese zwei Jobs sind so einzustellen, dass sie ausschließlich zwischen dem 10.03. und dem 10.09. wirken, was per Web UI (nachträglich) gelingt.

    Für die komplementäre Zeitspanne ist ein dritter Schedule Job einzurichten, der unmittelbar den Rollladen hochfährt, wozu bereits die Web UI (oder App, Cloud) geeignet ist.

    Wenn du zur Schedules-Skript-Lösung bereit bist, kann ich dir (hoffentlich) erklären, wie die die ersten beiden Jobs anlegen kannst. Nach deren Anlegen können deren Zeiten per Web UI geändert werden.

    1. Ich nutze Cloud allenfalls mal optional, keineswegs zur Konfiguration eines Shelly - nur mal so. Du kannst selbstverständlich tun, was du willst.
    2. Ich finde die Einstellung von Schedule Jobs in der Web UI mit Zeitspannen von Monaten und Tagen in Verbindung mit sunrise, du vermutlich auch.
    3. Ich verstehe deine Bedingung so:
      Vom 10.03. bis 10.09. soll der Rollladen mit Sonnenaufgang öffnen, aber nicht vor 07:00 Uhr.
      Ist das dein Ziel?

    Wenn 3. zutrifft, dann täte ich dies

    1. entweder mit sehr speziellen Schedule Jobs zu implementieren versuchen
    2. oder mit einer Kombination aus Schedule Job(s) und Skript.

    Zu 1. Dazu muss ich etwas länger nachdenken und vielleicht auch experimentieren.

    Zu 2. Mit Skript geht so etwas immer.

    Soweit ich es verstehe, werden solche Dinge ausschließlich per vom Shelly gelieferten Code (JavaScript) auf dem Frontend-Gerät (Web Browser) implementiert, was ja auch am fetch-Aufruf zu sehen ist.

    Ohne entsprechende und relativ aktuelle JavaScript Kenntnisse geht das ja nicht.

    Danke für deine Anregung.

    Edit:

    Deine Funktion full_time() gefällt mir nicht. Ich werde eine imho zielführendere anbieten - gleich ...

    Was hältst du von folgendem Code?

    Code
    function twoDigits(d) { // d ist als Zahl zu importieren mit 0 <= d <= 99
      return d<10 ? "0" + d : "" + d; // liefert einen String
    }
    
    function full_time() {
      let d = new Date();
      return twoDigits(d.getHours()) + ':' + twoDigits(d.getMinutes()) + ':' + twoDigits(d.getSeconds());
    }

    Btw, das ist eine (Teil-)Lösung zu einer Aufgabe meiner Skripteinführung. 8)

    Sorry, Sekunden fehlen noch - ich ergänze ...

    Wie auch immer, dein Skript arbeitet, wie es soll. :thumbup:

    Inzwischen fand ich einen Artikel, welcher mich nach ersten Eindrücken überzeugt. Dessen Beschreibung stützt sich aber auf einen Linux Server.

    Ein solcher Server ist auf einem Raspberry Pi (Zigarettenschachtel kleiner Computer) nutzbar, was bspw. ich tue.

    Ich werde den Inhalt dieses Artikels gelegentlich testen.

    Hier ist er: https://edv.mueggelland.de/tuya-geraete-m…kal-ohne-cloud/

    Für dich ist so etwas vermutlich nicht geeignet.

    Das musst du selbst wissen.

    Vielleicht gibt es hier jemanden, der mit so etwas bereits Erfahrung hat bzw. eine Kommunikation über die Tuya-Cloud kennt.

    Eine rein lokal arbeitende Lösung ist aber in jedem Fall zu bevorzugen.

    Eine schnelle und einfache Lösung kann ich dir leider (noch) nicht bieten.

    Nutzt du ein Abo von Heise (Zeitschriftenverlag)?

    Nutzt du Home Assistant? Ich nicht.

    Nutzt du ein sonstiger übergeordnetes System? Ich nutze einen Raspberry Pi mit Node-RED und weiterem.

    Edit:
    Ich nutze derzeit kein Tuya Gerät,

    Es gäbe eine Möglichkeit mit viel Aufwand und nicht unerheblicher Experimentierfreude per OTA (Over The Air) eine andere Firmware, hier Tasmota, aufzuspielen.

    Dazu habe ich einen Aktiekel gefunden. Vermutlich wirst du davor zurückschrecken.

    Einen vielleicht geeigneten Artikel aus dem Heise Verlag kann ich mangels Abo nicht weiterlesen.

    Es gibt offenbar Möglichkeiten per Home Assistant - kenne ich mich nicht aus.

    fm-maniac und thgoebel

    Eine Idee meinerseits zum Einsatz eines Plus 1PM:

    Solange die Pumpe laufen muss, wodurch auch immer ausgelöst, und ein Abschalten verhindert werden soll kann dies per Skript gelöst werden.

    Das Skript schaltet wegen Notfall die Pumpe ein.

    Dieser Notfallstatus wird in einer Variablen gespeichert, bspw. emergency= true.

    Der EventHandler reagiert bei ausschalten der Pumpe und emergency === true (if(emergency) ...) mit einem sofortigen Weidereinschalten.

    ...

    Das genügt nicht.

    Wenn die smarten Lampen keine Shelly Lampen sind und kein Shelly diese Lampen schaltet, dann sind Hersteller/Anbieter und der genaue Typ der Lampen erforderlich, um mehr zu deren Nachrichtenprotokoll erfahren zu können.

    Falls es Shelly Lampen sind, bitte den genauen Typ!

    Das ist sehr schlecht für eine Fehlersuche bzw. zum suchen nach der Ursache des nicht gewünschten Verhaltens.

    Trotzdem ein Versuch:

    Vergleiche bitte alle Einstellungen beider Shelly miteinander. Diese sollten sich zunächst ausschließlich in ihren IP Adressen unterscheiden - bei DHCP sollten beide unterschiedlich sein. Dies kannst du in deinem Router (FRITZ!Box ?) nachsehen.

    Alle anderen Einträge sollten gleich lauten.

    Solltest du mindestens einen Unterschied feststellen, teile dies mit!

    Lege dazu eine Action an und trage als URL etwas geeignetes für den Schaltaktor ein!

    Welchen Schaltaktor nutzt du für diese Lampe?

    Du brauchst dazu Informationen, auf welche Nachrichten dieser Aktor schaltet, insbesondere auf welche Nachricht er umschaltet (toggelt).

    Evtl. beinhaltet die Lampe selbst ihren Schaltaktor.

    Diese Nachricht kannst du dann in den URL einer Action einsetzen.

    Bzw. du kannst mehrere Actions konfigurieren mit verschiedenen URL.

    Wenn es viele Lampen sind, kann es zielführend sein, ein Skript einzusetzen.

    Also zwei Lampen -> zwei Actions.

    Eine Nachricht (URL) an eine Alaxa-Cloud kenne ich nicht. Vielleicht geht so etwas. Ich täte dies nicht verwenden, weil dann immer eine Internetverbindung erforderlich ist.

    Das Skript ist dafür gemacht, auf demselben Gerät (hier Shelly Plus 1 mit AddOn), Temperaturen zu messen und ein anderes Gerät zum schalten zu beauftragen. Die URLs zeigen, dass das andere Gerät ein Shelly der ersten Generation sein soll.

    Da dies nicht gut zu deinem einzig eingesetzten Gerät passt, erscheint es mir zweckmäßig, dafür die originären Schaltanweisungen zu verwenden.

    Ersetze also bitte die vorhandenen Schaltanweisungen wie

    Shelly.call("http.get", {url:'http://127.0.0.1/relay/' + JSON.stringify(Config.relay) + '?turn=off'});

    print('Relay(', Config.relay, ') off. Kamin temp <= ', Config.temp_min);

    durch folgende. Ob dies helfen wird, weiß ich nicht. Es ist aber deinem Einsatzzweck angemessen, da hierfür kein HTTP GET gebraucht wird. Zunächst ohne eine Ausgabe.

    Code
    Shelly.call("Switch.Set", {id:0, on:false}); // schaltet den Ausgang aus, zum einschalten on:true verwenden 

    Die obige print() Anweisung tut nur so, als ob geschaltet wurde, weil sich diese Mitteilung nicht auf eine Antwort stützt. Dafür ist eine callback Funktion zu nutzen. Nun die komplette Anweisung hierfür.

    Code
    Shelly.call("Switch.Set", {id:0, on:false},
        function (result, errcode, errmsg) { // anonyme Funktion als Parameter
          if(errcode!==0) print("Fehler bei ausschalten ", errcode, ", ", errmsg);
          else print(JSON.stringify(result), "\nAusgang ausgeschaltet");
        }
    );

    Oder du verwendest einfach zwei Funktionen switchOff() und switchOn() dafür, was ich hiermit empfehle. Diese kannst du einfach aufrufen lassen und auch per Eingabezeile testen.

    Damit erhältst du bei Nichterfolg des Schaltens wie auch bei Erfolg passende Ausgaben, die sich nicht auf Vermutungen stützen.

    Wenn du solches besser verstehen willst und Muße hast, sieh dir gelegentlich meine Skripteinführung an! Bisher existieren Teil 1 bis Teil 3.

    Config.relay brauchst du nicht, weil der Plus 1 nur einen Ausgang besitzt. Wenn du unbedingt an Config.relay festhalten willst, setze diese Komponente wie folgt ein.

    Code
    Shelly.call("Switch.Set", {id:Config.relay, on:false}, ...

    Auch kannst du beide obige, von mir bereitgestellte Funktionen durch eine parametrierte Funktion ersetzen.

    Code
    function doSwitch(on) {
      Shelly.call("Switch.Set", {id:0, on:on},
        function (result, errcode, errmsg) {
          if(errcode!==0) print("Fehler bei " + (on ? "ein" : "aus") + "schalten ", errcode, ", ", errmsg);
          else print(JSON.stringify(result), "\nAusgang " + (on ? "ein" : "aus") + "geschaltet");
        }
      );
    }

    Diese rufst du zum einschalten mit doSwitch(true) und zum ausschalten mit doSwitch(false) auf. So täte ich es.

    Der Kreativität sind keine Grenzen gesetzt. ;)

    Du kannst auch einen zweiten Parameter für die Ausgabe nutzen, wozu aber im Aufruf von Shelly.call() ein vierter Parameter und im Kopf der anonymen Funktion ebenfalls ein vierter Parameter erforderlich sind.

    Code
    function doSwitch(on, msg) {
      Shelly.call("Switch.Set", {id:0, on:on},
        function (result, errcode, errmsg, text) {
          if(errcode!==0) print("Fehler bei " + (on ? "ein" : "aus") + "schalten ", errcode, ", ", errmsg);
          else print(JSON.stringify(result), "\nAusgang " + (on ? "ein" : "aus") + "geschaltet, " + text);
        }, msg
      );
    }

    Damit kannst du bspw. zum ausschalten folgenden Aufruf nutzen. Zuerst dein Codestück.

    Code
    if (temp_kamin<= Config.temp_min) {
        Shelly.call("http.get", {url:'http://127.0.0.1/relay/' + JSON.stringify(Config.relay) + '?turn=off'});
        print('Relay(', Config.relay, ') off. Kamin temp <= ', Config.temp_min);
    }
    
    // ersetzen durch:
    if (temp_kamin<= Config.temp_min) doSwitch(false, 'Relay(0) off. Kamin temp <= ' + Config.temp_min);

    Die anderen Schaltaufträge können ebenso kurz gestaltet werden, wodurch auch das gesamte Skript kürzer, einfacher, leichter pflegbar und überschaubarer wird. 8)