Beiträge von eiche

    Mad Marc

    Um hierauf eine hilfreiche Reaktion erhalten zu können, musst du erheblich mehr darlegen. Dazu ist die Beschaltung ja bereits geklärt.

    Hierzu gehört insbesondere, auf welche Weisen der Shelly geschaltet wird.

    • Actions bzw. Webhooks?
      Wie sind diese zusammengestellt?
    • Szenen?
      Zusammenstellung?
    • Skript?
      Wirst du vermutlich nicht nutzen.

    Wie ist der Eingang konfiguriert?

    Lebreton

    In Ergänzung zu den Mitteilungen seitens Thomas ... bzgl. #11.

    Das mit R bezeichnete Bauteil ist die Relaisspule. Die zu R parallel liegende Diode ist deren Freilaufdiode.

    Der Plus 2PM verfügt über zwei Eingänge, welche je nach Anwendung unterschiedliche Funktionen bewirken können.

    Das sollte eine allgemeine Feststellung sein, als Reaktion auf deine Ansicht:

    Ich dachte immer, dieser Shelly kann nur einen Eingang auf zwei Ausgänge schalten

    Mit der Anwendung als Hauptuhr haben diese Eingänge tatsächlich nichts zu tun. In dieser Anwendung werden die beiden Ausgänge per Zeit und per Ereignisse gesteuert.

    Einen Shelly Plus mit zwei Ausgängen und elektromagnetischem Relais oder Halbleiter-IC zur Hauptuhr zu machen ist relativ leicht und hat nichts mit eigener Programmierung zu tun.

    Nach dem Basteln sind nur vier Schritte zu erledigen, welche unter Hauptuhr-Emulation per Shelly - Installationsanleitung beschrieben sind.

    1. Das Skript von meiner Webseite per Copy & Paste in ein neu angelegtes noch leeres Skript einfügen, speichern und starten. zum Skript
    2. Drei Schedule Jobs anlegen, was unter Anwendung meiner Website tools.eichelsdoerfer.net so unterstützt wird, dass hierfür keine besonderen Kenntnisse gebraucht werden.
    3. Die Uhr per Webseite, ebendort zu finden, stellen.
    4. Das Skript für den automatischen Start nach dem booten freigeben (Web UI Klick).

    Nach einem Reboot bzw. Stromausfall wird sich die Uhr automatisch richtig stellen. Das ist alles, was zu tun ist und wofür es, außer lesen können, fast nichts braucht.

    Mehr Komfort für eine solche Anwendung wirst du kaum finden können.

    Wer Optionen nutzen will, wie ich sie in der Installationsanleitung beschreibe, kann das tun. Wer solches nicht möchte oder braucht, lässt es halt.

    Vermutlich wirst du auf Grund meiner hier aufgeführten vier Schritte noch nicht einmal die Installationsanleitung lesen müssen, auch wenn dies empfehlenswert ist.

    Dazu wird Ausgang O2 zwischen den Minutenimpulsen (also z.B. zur Sekunde 30) ein- oder ausgeschaltet.

    Ich wusste es nicht mehr und habe nachgeschaut.

    Mit der fallenden Flanke an O1 wird (per EventHandler) O2 0.5s später umgeschaltet (toggle). Dies ist die für den nachfolgenden Impuls vorbereitete Polwende, weil damit das Polwenderelais seinen Zustand wechselt.

    Dies wäre auch zur Sekunde 30, also ca. 30s verzögert möglich. Weil die Kombination aus Skript und dreier erforderlicher Schedule Jobs aber teilweise zeitlich verzahnt arbeiten, ist die beschriebene Lösung am besten.

    Diese zeitliche Verzahnung sorgt für die Stabilität/Robustheit der Implementation.

    Ich könnte weiter ausholen, lasse es aber besser. ;)

    Sowie dem Verbrauch von Elektroenergie bei gleichzeitiger Erzeugung von beispielsweise Wärmeenergie.

    :thumbup: Genau



    Nach aktuellem Kenntnisstand verschwindet Energie nicht. Wo solche "verbraucht" wird, entstehen durch die Umwandlung andere Energien. Auf der Seite der Quelle wird Energie verbraucht, auf der Seite der Senke werden Energien erzeugt. Verbrauch und Erzeugung bilden zusammen die Umwandlung.

    Ich bin nach wie vor davon überzeugt, dass eine Pegelmessung mit Ultraschall und Tasmota32 auf einem ESP32 Board genauer ist als diese Druckdifferenzmessungen. Und die Aktor/Sensor Kombination ist preisgünstig. Allerdings gibt es mitunter Messausreißer, welche ich per Programm und auf die Anwendung zugeschnittener Mittelwertbildung beseitige. 8)

    Was ist die Bedeutung der Log-Einträge in den geschweiften Klammern?

    Das sind die Werte des Parameters status, welcher vom StatusHandler processStatus importiert wird. Dieser Parameter ist ein Objekt, was in JavaScript eine Datenstruktur aus Schlüssel-Wert-Paaren ist (und bei Bedarf können auch Objekt-interne Funktionen enthalten sein, was hier nicht der Fall ist).

    Code
    {"component":"switch:0","name":"switch","id":0,"delta":{"id":0,"apower":9.7}}

    Dies ist ein Objekt bzw. Datenstruktur mit folgenden Komponenten, welche alle Schlüssel-Wert-Paare sind. Der Wert des Objekts muss in geschweiften Klammern stehen und er ist zumeist komplex, d.h. aus verschiedenen Teilen, den Komponenten, zusammengesetzt.

    Schlüssel="component", Wert="switch:0"

    Schlüssel="name", Wert="switch"

    Schlüssel="id", Wert=0

    Schlüssel="delta", Wert={"id":0, "apower":9.7}

    Der letzte Wert ist ein Objekt, weshalb er in geschweiften Klammern steht und zwei Komponenten beinhaltet.

    Die Grundlagen hierfür ist das sog. JSON Format. JSON = JavaScript Object Notation

    Dieses Format hat sich bestens bewährt und wird in vielen Anwendungen genutzt, auch außerhalb von JavaScript.

    Das Objekt für den StatusHandler (als Parameter) wird von der Firmware geliefert. An dem Log lässt sich erkennen, was es enthält. Auf die Komponenten kann man im Skript zugreifen lassen.

    Objektname.Schlüssel, bspw. status.component - ohne Anfühtrungszeichen

    Ich dachte immer, dieser Shelly kann nur einen Eingang auf zwei Ausgänge schalten

    Der Plus 2PM verfügt über zwei Eingänge, welche je nach Anwendung unterschiedliche Funktionen bewirken können.

    deswegen hatte ich nach dem Polwenerrelais noch ein zweites 2xein für den eigentlichen Impuls zur Uhr geplant. Braucht man das gar nicht?

    Doch, das braucht man. Da der Plus 2PM zwei Ausgänge hat, kann der eine Ausgang den Impuls liefern und der andere Ausgang das Polwenderelais schalten. Ein weiteres Relais ist somit nicht erforderlich.

    allerdings muss man irgendwie mehr tun als in der Shelly-App mit dem Finger auf dem Handy tippen

    Den Shelly als Hauptuhr zu nutzen, dürfte alles andere als eine Standardanwendung sein. Deshalb genügen Klicks oder auf Handy tippen nicht. ;)

    deebeo

    Endlich die bessere Variante des Skripts.

    Changelog

    Mit erstmaligem Unterschreiten von Level 1 oder erstmaligem Überschreiten von Level2 wird ein Timer gestartet, der periodisch (bspw. nach jeder Sekunde)

    1. den Status abfragt,
    2. einen Periodenzähler inkrementiert,
    3. bei erreichen der konfigurierten Dauer (in Perioden) den Schaltausgang ausschaltet
      und den Timer rücksetzt (löschen und Periodenzähler auf 0).

    Wird vor erreichen der konfigurierten Dauer Level 1 nicht mehr unterschritten, wird der Timer rückgesetzt, ohne den Schaltausgang zu ändern.

    Entsprechendes gilt bei erstmaligem Überschreiten von Level2.

    Bei Skriptstart wird der Status gelesen und apower verarbeitet. Liegt apower (=CurrentPower) unter Level1 oder über Level2, wird der Timer gestartet.

    Somit ist sichergestellt, dass bei Skriptstart bereits die gemessene Leistung zur Verfügung steht und geeignet verarbeitet wird.

    Nach dem Schalten des konfigurierten Ausgangs wird der Timer rückgesetzt. Somit wird der Timer erst bei einer hinreichenden Änderung der gemessenen Leistung gestartet.

    Der Ablauf wird per print-Ausgaben dokumentiert.

    Meine Erwartungen ;)

    Das Skript erfüllt deine Wünsche.

    Tut es das nicht geeignet -> möglichst präzise Beschreibung des Fehlverhaltens

    Eine Rückmeldung in jedem Falle.

    Edit:

    Ändert sich irgendwann, unabhängig davon, ob der Timer läuft oder nicht, die gemessene Leistung, verarbeitet dies der StatusHandler processStatus und startet ggf. den Timer (neu).

    deebeo

    Hier mein Skriptentwurf. Ich konnte es nicht komplett testen, vermute aber, dass es so funktioniert, wie du es haben willst.

    Das Problem besteht darin, dass der Status keine erforderliche Zeitinformation mitbringt.

    Deshalb habe ich in der StatusHandler Funktion per Methode "Sys.GetStatus" diese Zeit abgefragt.

    Weil aber eine solche Abfrage asynchron ist, muss die Verarbeitung von Zeit, Dauer und Leistung in der callback Funktion des Methodenaufrufs erfolgen.

    Wenn die aktuelle Leistung erstmals oberhalb Level2 liegt, wird die Zeit gespeichert, ebenso wenn die aktuelle Leistung erstmals unter Level1 liegt.

    Liegt die aktuelle Leistung zwischen Level1 und Level2 einschließlich, wird die gespeicherte Zeit ungültig gemacht.

    Solange die Leistung unter Level1 liegt, wird deren Dauer per Zeitdifferenz ermittelt und bei Überschreitung der konfigurierten Dauer der Schaltausgang ausgeschaltet.

    Entsprechendes gilt, solange die Leistung über Level2 liegt.

    Ich habe das Skript möglichst schlank gehalten, damit es leichter verständlich ist. Außerdem ist es bereits so imho sehr robust gestaltet.

    Als Zeitwert nutze ich die uptime, weil diese immer existiert, was mit unixtime nicht zwingend der Fall ist.

    Ich bin gespannt, wie es laufen wird und überarbeite das Skript gerne, wenn die gewünschte Funktionalität nicht erfüllt sein sollte.

    Dann brauche ich möglichst detaillierte Informationen über das Fehlverhalten.

    Edit:

    Es kann sein, dass der Status nicht hinreichend oft gesendet wird. In diesem Fall muss ich noch einen Timer einbauen, der gestartet wird, wenn erstmalig Level1 unterschritten oder Level2 überschritten wird. Das ist kein Problem. Aber teste erst einmal ...!

    Ich überarbeite das Skript, weil mit Sicherheit ein Timer erforderlich ist. Dann kann statt der uptime-Differenz vielleicht besser ein Periodenzähler genutzt werden. Ich denke über Vor- und Nachteile nach ...

    Ich hoffe, dass das die richtigen Antworten auf deine Fragen sind.

    Teilweise.

    Zunächst eine kleine Vereinfachung im Code:

    Code
    let value = JSON.parse(result.body)*-1;         // damit Wert positiv wird  
    // einfacher und ein wenig kürzer und vermutlich geringfügig schneller ;-)
    let value = -JSON.parse(result.body);         // damit Wert positiv wird  

    Zum Wesentlichen

    Du nutzt also http. Somit arbeitet auf deinem Windows (am Pfad erkennbar) ein HTTP Server.

    Die Dokumentation hierzu sagt, dass die Methode PUT per HTTP.Request gelingen soll.

    Ich teste es jetzt aus verschiedenen Gründen nicht, täte es aber per Skript wie folgt versuchen. Ob dies gelingt, ist vermutlich nicht dokumentiert, weshalb man sich selbst durchärgern muss

    Code
    Shelly.call("http.request", {method:"PUT", url:"http://<IP Adresse>/" + Config.BKW_URL, body:JSON.stringify(dein_Messwert)});

    Nach den Beschreibungen wäre diese Parameterstruktur logischerweise passend.

    Ich habe dies ausschließlich der Doku entnommen und keine Erfahrung damit.

    Auch bin ich gespannt darauf, ob es funktioniert.

    Wenn ja, kann weiter verfeinert werden, indem noch ein timeout und insbesondere eine callback Funktion ergänzt wird.

    1. Also wäre es möglich, dass der Shelly defekt ist?

    2. Somit wäre ein Austausch die Lösung?

    3. Also müsste ich dann auch den neuen Shelly integrieren und konfigurieren?

    zu 1. Ja, möglich, aber nicht sicher.

    zu 2. Das wäre zu prüfen. Wenn du noch einen geeigneten Shelly auf Lager hast, solltest du diesen probehalber einbauen.

    zu 3. Ja sicher. An einem bereits genutzten, bereitliegenden Shelly evtl. vorher Werksreset vornehmen und nach Einbindung Firmware aktualisieren!

    Es kann für solche Fälle nützlich sein, einen kleinen Lagervorrat zu haben. ;)

    Sie sollten ja in ihrer Datenbank irgendwo die gesendeten Signale persistieren.

    Nein! Aus welchem Grund sollten "sie" dies tun?

    Dass "sie" es tun könnten, ist klar.

    Es könnte am betroffenen Shelly 2.5 eine Störung wegen gealtertem Elektrolytkondensator vorliegen. In einem solchen Fall wäre der (oder die) Kondensator(en) auszutauschen.

    Dazu kann thgoebel mehr mitteilen. Du kannst im Forum nach "defekte Elkos" o.ä. suchen lassen.

    Edit:

    Nimm sicherheitshalber die Web UI des betroffenen Shelly statt der App und sieh damit unter Zeitplänen nach!

    Ich habe einen Shelly mit dem ich von einer IP-Adresse (192.162.172.8/Text1.txt, PC im gleichen Netz) ) den Inhalt einer Datei (beinhaltet nur eine Zahl mit Komma) per JS in den Shelly holen kann

    Eigentlich "tut man so etwas nicht".

    Grund: Wo sieht denn der PC im Verzeichnisbaum nach, um die Datei Text1.txt zu finden? Und wie lautet der komplette URI (Uniform Ressource Identifier), also die komplette Quellenangabe?

    Mit http als Protokoll braucht es auf dem PC einen HTTP-Server, auch Webserver genannt.

    Ein solcher Server hat seinen eigenen Teil-Verzeichnisbaum, welcher wie ein Ast mit Zweigen ein Teil eines natürlichen Baumes ist.

    Mit dem URI 'http://192.162.172.8/Text1,txt' sucht dann der Server in der Wurzel (=Astansatz) seines Teilbaumes nach.

    Nun wäre es interessant zu wissen, wie auf dem PC das Holen des Dateiinhaltes (=Zahlenwert) abgearbeitet wird. Dazu folgende Fragen/Bitten:

    1. Welches Betriebssystem arbeitet auf diesem PC?
    2. Wie lautet der komplette von dir genutzte URI beim holen des Wertes?
      Dazu gehört auch die Protokollangabe, bspw. http, ftp, file.
    3. Notiere bitte die Anweisung(sfolge), mit welcher du in JavaScript das Holen des Wertes implementiert hast!