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.

    Das hatte ich zunächst so. Ich neige durchaus auch zu anonymen Funktionen.

    Dann las ich während meiner Fehlersuche in den Dokus, dass es in der Tiefe von anonymen Funktionen Beschränkungen gibt und lagerte sie in benannte Funktionen aus.

    Leider half auch das nicht.

    Außerdem lasse ich das Skript laufen, ohne zu schalten. So läuft es seit Stunden ohne Unterbrechung durch, wie ich in den Datenbankaufzeichnungen sehen kann.

    Mit den Callbacks von Shelly.call hatte ich dasselbe Problem.

    Ja, mit großen Anfangsbuchstaben hatte ich begonnen.

    Meiner Erfahrung nach sind die Methodennamen case unsensitiv.

    In anderen Projekten funktioniert das Schalten fehlerfrei auch mit Kleinschreibung.

    Btw, der Shelly schaltet mitunter (oder immer?) noch, bevor das Skript abbricht.

    Somit ist es kaum möglich, dass der Methodenaufruf fehlerhaft ist.

    Tja ...

    Danke für die Reaktionen.

    Devil

    Das große S hat leider keine Besserung gebracht.

    Seven of Nine

    Oh ja, klar - mit http:// - ich war zu diesem Zeitpunkt schon etwas abgearbeitet.

    Nun, mit Switch.toggle hatte ich bereits gearbeitet - leider das selbe Problem wie mit Switch.set.

    Merkwürdig ist auch, dass beide Schaltaufrufe in einem anderen Projekt keinerlei Probleme bereiten. So etwas gehört ja auch zu den absoluten basics.

    Ich versuchte es soeben mit http.get und komplettem URL. Leider genau dasselbe Problem, Skriptabbruch mit obiger Fehlermeldung.

    Es sieht so aus, als ob der RPC-Methodenaufruf ein Problem darstellt, unabhängig vom Weg dorthin.

    Hallo,

    Ich entwickle eine Anwendung für Shellies der zweiten Generation mit per Scheduling ausgelöstem Schalten.

    device: shelly plus 1

    firmware: 0.14.1, alternativ getestet mit 0.13.0

    Mein schedule job:

    Code
    {"id":1,"enable":true,"timespec":"0 * * * * *","calls":[{"method":"Script.Eval","params":{"id":1,"code":"clockTrigger(5000)"}}]}

    Dieser bewirkt zu jeder vollen Minute den Aufruf der Funktion clockTrigger mit 5000 (ms) als Parameter, welche das unten stehenden Skript enthält.

    Und hier mein bisheriges Skript:

    Der Abbruch des Skript ereignet sich in der Funktion pulseOut, wenn geschaltet wird - Zeilen 31 und Zeilen 37.

    Das Skript arbeitet einwandfrei, wenn die Schaltmethodenaufrufe auskommentiert sind.

    Die Methoden http.get habe ich nur zwecks Fehlersuche eingesetzt. Sie sind also nur alternativ zu switch.set bzw. switch.toggle zu verstehen.

    Wenn ich die Schaltmethoden einbaue, bspw. per switch.set, gibt es den Skriptabbruch mit der Fehlermeldung:

    "onEvent callback error: type error"

    Ich kann keinen Typfehler finden. Dieser müsste sich in den Shelly.call Aufrufen zum schalten befinden, da ohne diese Aufrufe das Skript fehlerfrei abgearbeitet wird.

    Manchmal erscheint diese Meldung beim Einschalten, spätestens nach dem Ausschalten - verlässlich reproduzierbar.

    Mir fällt nichts mehr ein, was ich noch tun kann, um diesen Fehler zu beseitigen oder mich der Ursache zu nähern.

    horkatz

    Wenn ich es richtig verstand, dann werden die Nebenuhren ohne eigenes "Zeitgerät" von der Masteruhr gesteuert.

    Hier eine SPS einzusetzen, halte ich für sehr übertrieben - um es vorsichtig auszudrücken. ;)

    Mit jeweils einem Shelly könnten die Nebenuhren auch relativ autonom betrieben werden.

    Ein Shelly kann leicht, auch ohne Programmierung (s.a. Projekt von Th. Goebel) sehr präzise jede Minute - oder auch bspw. jede Sekunde - einen Schaltvorgang auslösen/durchführen.

    Zur Umstellung zwischen "Sommerzeit" und physikalischer Zeit kann ein Skript erstellt werden - von wem auch immer. ;)

    Dieses Skript kann zu bekannten Umstellzeiten die Nebenuhr vorstellen oder für eine Stunde anhalten.

    Ob diese Umstellzeiten gleich bleiben, weiß ich derzeit nicht, vermute es aber.

    Wie du die Zeitsynchronisation per Zeitserver realisierst, bleibt dir überlassen.

    Prinzipiell wäre es auch möglich, hierfür die Impulse der Masteruhr einzusetzen, was jedoch ziemlich retrospektiv wäre.

    Um die Dauer eines Stromausfalls zu erfassen - und die Nebenuhr nachzustellen, wäre in den Shellies immer der letzte Unix-Zeitstempel zu einem Nebenuhr-Schaltimpuls im nichtflüchtigen Speicher (nvs = non volatile storage) abzulegen. Auch dies wäre prinzipiell noch ohne Skriptprogrammierung möglich. Hierfür sind aber Kenntnisse zu den RPC (remote procedure calls) erforderlich, welche von der Firmware bereitgestellt sind.

    In der Firmware von Allterco wird statt nvs die Bezeichnung KVS verwendet - key value storage. key value bezeichnet allerdings eine Datenstruktur, auf deren Elemente (Werte) per key zugegriffen wird.

    Nachteil: Der nvs verträgt deutlich weniger Schreibzugriffe als der flüchtige Speicher, auch als RAM geläufig.

    Dieser kleine Nachteil ist aber vermutlich nicht entscheidend.

    Jedenfalls kann der Shelly per Skript zu jedem erfassten Unix-Zeitstempel die ausgefallenen Minutentakte an die Nebenuhr ermitteln und diese quasi nachreichen.

    Versuch eines relativ simplen Lösungsentwurfs:

    Lichtschranke, durch welche das Pendel "läuft" oder Reflektionslichtschranke.

    Die Impulse (von Lichtschranke) werden im Shelly (oder anderem Mikrocontroller) gezählt.

    Der Zählerstand wird mit der vergangenen Zeit verglichen und gelegentlich bzw. bei zu großer Abweichung das Pendel temporär angehalten.

    Für diesen Zweck sollte die Uhr also ein klein wenig schneller laufen.

    Ich möchte das Prinzip "inkrementale Regelung" nennen - ohne Kenntnis davon, ob es so etwas im Sprachgebrauch gibt. ;)

    @dekat win

    Vielen Dank für deine Reaktion. Stimmt, ich könnte versuchen, das selbst zu ermitteln. Allerdings könnte ich so nur die Phänomene erkennen und müsste interpretieren.

    Ok, das ist wohl ein etwas ungewöhnliches Thema.

    Mein Projekt:

    Nutzen eines Shelly Plus 1 mit Addon und DHT 22 zwecks autarker, lokaler Temperaturregelung (Heizkörper/Raum).

    Hierfür werde ich KVS und insbesondere den Scheduler nutzen. Letzterer kann ja mehr als nur Wochenpläne, auch wenn die für Anwender genügen.

    Ich entwickle daran, bis schon soweit fertig - außer Komfortfunktionen.

    Der wichtige Nebeneffekt daran ist, dass ich während der Implementation und Verbesserungen die Firmware genauer kennenlernen muss(te). ;)

    Mir gefällt sie immer besser. Ich möchte selbstverständlich auch eine sehr hohe Funktionssicherheit erreichen.

    Dann können solche Shellies locker die TRV ablösen.

    Meine Projektlösung wird stabiler arbeiten, immer erreichbar sein, zügig reagieren und erweiterbar sein.

    Ok, ein angepasstes Webinterface fehlt. Hierfür habe ich ein Node-RED Dashboard erstellt.

    Ob es möglich ist, per Skript ein solches Webinterface zu implementieren, weiß ich derzeit nicht.

    Btw, ich nutze teilweise noch Shellies der 1. Gen. mit Addon. Die Regelung findet per Node-RED Flows statt. Das ist nicht ganz gut, weil die Autarkie der Shellies fehlt.

    thgoebel

    Ganz wie du willst. Trotzdem könntest du mal folgendes testen:

    Code
    http://<ip-address>/rpc/Schedule.Create?timespec="0 * * * * *"&calls=[{"method":"Switch.Set", "params":{"id":0,"on":true,"toggle_after":10}}]

    Dies erstellt auf deinem Shelly einen Schedule-Eintrag. Dieser Eintrag bewirkt zu jedem Sekundenstand von 0, also jede abgelaufene Minute, das Auslösen der Methode Switch.Set mit den angegebenen Parametern.

    Der Default-Wert von enable ist true, könnte aber auch zwischen dem timespec- und dem calls-Teil eingefügt werden. Das ist eher interessant, wenn man testen will, ob Schedule.Create erfolgreich abgearbeitet wurde, ohne den Eintrag zu aktivieren.

    Code
    http://<ip-address>/rpc/Schedule.Create?timespec="0 * * * * *"&enable="false"&calls=[{"method":"Switch.Set", "params":{"id":0,"on":true,"toggle_after":10}}]

    Das zusätzlich Interessante daran ist, dass es verlässlich funktioniert und du kein Skript hierfür benötigst.

    Die Einschaltdauer von 10s ist selbstverständlich für den Test gedacht. Hier wirst du für den Betrieb bspw. eher 1 einsetzen.

    Willst du diese Dauer oder andere Dinge im selben Schedule-Eintrag ändern, brauchst du dessen id dazu. Diese erhältst du mit

    Code
    http://<ip-address>/rpc/Schedule.List

    Angenommen, diese id ist 1, dann änderst du obige Einschaltdauer auf 1s mit

    Code
    http://<ip-address>/rpc/Schedule.Update?id=1&timespec="0 * * * * *"&calls=[{"method":"Switch.Set",%20"params":{"id":0,"on":true,"toggle_after":1}}]

    Die kürzere Variante lautet:

    Code
    http://<ip-address>/rpc/Schedule.Update?id=1&calls=[{"method":"Switch.Set",%20"params":{"id":0,"on":true,"toggle_after":1}}]

    Es muss nur das angegeben werden, was im Schedule-Eintrag zu ändern ist. In diesem Fall muss es der gesamte calls-Teil sein.

    Das Ganze lässt sich auch per MQTT und RPC gestalten, ebenfalls ohne Skript.

    Ich betone noch einmal, dass für diesen Zweck Timer.set suboptimal ist.

    Hinweis: Der Scheduler ist Teil des Betriebssystems mongoose und entspricht dem von Unixen, also bspw, Linux.

    Gruß aus Rheinland-Pfalz

    Ich würde dafür den Scheduler einsetzen, der zu jeder Sekunde 0 (oder bspw. 59) die Script.Eval Methode aufruft und die entsprechende Funktion im Skript dazu schreiben. Es geht selbstverständlich auch ohne Script.Eval, wenn eine passende andere Methode greift. Der Scheduler bekäme dann folgenden timespec: 0 * * * * * - oder statt der 0 die 59, wenn du eine Sekunde Reserve einbauen willst.

    Die RPC Methode heißt Schedule.Create oder Schedule.Update, falls der Zeitplan bereits existiert.

    Wenn du direkt mit dem Schelly 2. Gen. schalten willst, geht selbstverständlich auch die Methode Swich.Set ...

    Die RPC Schedule Methoden sind unter https://shelly-api-docs.shelly.cloud/gen2/Component…vices/Schedule/ recht gut beschrieben.

    Ein Timer.set würde ich dafür nicht einsetzen, weil es vermutlich sukzessive zu Verzögerungen käme. Der Scheduler ist dafür bestens geeignet.

    Btw. ich implementiere gegenwärtig ein Thermostat auf Basis eines Shelly Plus 1 mit Sensor AddOn, dem Scheduling für Zeitpläne und zwei Skripten, welche die Funktion der Initialisierung und Temperaturregelung sowie deren Parametrierung realisieren. Ich priorisiere MQTT, es geht aber auch all das per HTTP. Alles funktioniert bereits bestens - auf dem Labortisch (hier eine Fensterbank ;-)). Die Mensch-Maschinen-Schnittstelle ist auch fertig (per Node-RED Dashboard, von meiner Frau akzeptiert). Ich werde aber noch überarbeiten und Komfortfunktionen einbauen. Deshalb habe ich mich eingehend mit RPC, KVS, Scheduling, Script.Eval und der Skriptfunktion Shelly.emitEvent() beschäftigt.

    Falls du genaueres bzw. fertig nutzbares von mir haben möchtest, muss ich den genauen Kontext kennen.

    daniel b

    Unter settings -> "Movement time limits"

    Ich habe so etwas bisher nicht gebraucht, da meine Rollladenantriebe hinreichend kompatibel zur Shelly Firmware sind.

    Ich weiß also nicht, ob du damit weiterkommen kannst. Ich würde es damit versuchen.

    Vermutlich könntest du mit diesen Einstellungen allenfalls komplett öffnen und schließen - ungetestet.

    daniel b

    Zitat

    Aus deinem Log: "data": "shelly_notification:161 Status change of cover:0: {\"id\":0,\"errors\":[\"cal_abort:implausible_power_consumption_in_close_dir\"],\"state\":\"closed\"}\n"

    Vermutlich hat die Firmware ein Problem mit einer Nichtrollladenanlage wie in deinem Fall. Hast du mal mit "Reverse Direction" experimentiert? Dein Kettenantrieb ergibt im Lastmoment vermutlich kaum Unterschiede zwischen öffnen und schließen. Die Firmware kann evtl. deshalb nicht erkennen, ob das Fenster geöffnet oder geschlossen wird. Vielleicht kannst du ohne Kalibrierung auskommen und die reinen Bewegungsdauern händisch eintragen.

    I've got the same issue with http get request.

    I think the following syntax would be appropriate:

    .../rpc/Schedule.update?id=1&timespec="0 5 16 * * 0"&calls=[{method:"Script.Eval",params:{id:7,code:"dummy()"}]

    I tested with some additional ", \" and ' alternatively, without any success.

    This requests comes without an error message and the updated revision number, but it don't succeed. Only the items enable and timespec get updated without the calls argument.

    Ich untersuche derzeit die Möglichkeit, auf einem Shelly Plus 1 mit Firmware 0.13.0-beta3 KVS und Schedule-Jobs zu verwenden.

    Dazu gibt es die Limits 50 KVS Einträge (keys) und 20 Schedule-Jobs.

    Frage: Fängt die Firmware das Anlegen solcher Einträge - evtl. mit entsprechenden Fehlerinfos - ab, wenn ein solches Limit bereits erreicht ist?

    Wenn dies nicht der Fall ist, wäre eine Skript-Implementation hierzu zweckmäßig, was aber einigen zusätzlichen Aufwands bedürfte.

    Ich reagiere nun sehr spät, weil ich mich derzeit mit den Schedule-Jobs per Skripts beschäftige.

    Ich kenne keine Methode "disableswitch". Deshalb gibt es auch keinen Handler dazu. Jedenfalls nicht auf Shelly Plus 1 Geräten.

    Wenn du alle verfügbaren Methoden deines Device wissen willst, nutze bspw. http:<device ip address>/rpc/shelly.listmethods !

    Du kannst bspw. die Methode "script.eval" nutzen, welche als Parameter die Script Id und den Namen der aufzurufenden Funktion braucht.

    Hierzu gibt es ein Beispiel-Skript namens "register-scheduled-script.js".

    Der damit angelegte Schedule-Job beinhaltet "calls":[{"params":{"code":"scheduledTask()","id":2},"method":"script.eval"}].

    Der Parameter "id":2 kann selbstverständlich einen anderen id-Wert haben, abhängig von den gerade gespeicherten Skripts bzw. der id des o.a. Skripts.

    In diesem Skript muss die Funktion scheduledTask() existieren. Sie kann aber auch in einem anderen Skript existieren, welches notwendigerweise laufen muss.

    Statt scheduledTask() ist selbstverständlich eine andere Funktion wie "myFunction()" verwendbar, die dann im Schedule-Job einzutragen ist.

    Du kannst auch die optionalen Schedule-Einträge deines Device verwenden und per http://<device ip address>/rpc/schedule.list analysieren.

    ... ;)