Aus- oder Ein-Schaltverzögerung (Schalter)

  • Das ist ein Aus- oder Ein-Schaltverzögerungs Skript, mann kann bei delay die Verzögerung in Sekunden eintragen und unter invDelayModus kann man auswählen ob Aus- oder Ein-Schaltverzögerung.

    false = Ausschaltverzögerung / true = Einschaltverzögerung

    Da Aktions oder Webhooks nicht bei eingestellten Passwort funktionieren, könnte das Skript dem ein oder anderen weiter helfen.

    (Achtung, das ganze geht nur mit einem Schalter für einen Taster müsste man einfach mein Taster Event Skript etwas anpassen)

    Das Skript steht unter der "mir völlig egal, was ihr damit macht" Lizenz auch bekannt als MIT-Lizenz, habt Spaß damit!

    Einmal editiert, zuletzt von _[Deleted]_ (11. Mai 2023 um 12:10)

  • _[Deleted]_ 26. Januar 2023 um 19:19

    Hat den Titel des Themas von „Aus- oder Ein-Schaltverzögerung“ zu „Aus- oder Ein-Schaltverzögerung (Schalter)“ geändert.
  • Hallo @dekat win,

    ich finde es immer toll, wenn Software Entwicklungen (egal ob als Hobby oder professionell) einen Weg in die Öffentlichkeit finden und mit anderen zur gemeinsamen Nutzung und/oder Verbesserung geteilt werden. Mir ist aufgefallen, dass dies nicht dein erstes Skript ist und wahrscheinlich auch nicht dein letztes gewesen sein wird.

    Damit dein Skript anderen Leuten helfen kann (entweder in Teilen oder ganz), ist Lesbarkeit und Wartbarkeit sehr wichtig. Schlecht verständlicher Code wird ganz schnell ignoriert und es wird sich nach etwas anderem umgesehen, obwohl es vielleicht die perfekte Lösung zu einem Problem ist.

    Es gibt viele Wege und Arten Code zu formatieren und genauso viele Ansichten, was "richtig" ist - deswegen möchte ich eine solche Diskussion nicht beginnen. Ich würde dir aber gerne einen Denk-Anstoß geben, um selbst festzustellen, was und wieviel es nicht nur anderen, sondern auch dir selbst bringt, wenn du dir den Code in ein paar Wochen oder Jahren noch mal ansiehst (oder ansehen musst, weil ein Fehler drin steckt).

    Es gibt Anweisungen, die lassen sich nicht in die empfohlenen Maximallänge von 70-80 Zeichen packen - dann sind auch 100 Zeichen mal ok. Aber die folgende Zeile lässt sich mehrmals umbrechen und dadurch viel besser lesbar machen.

    Code
    ...
    if(Shelly.getComponentConfig("switch:"+JSON.stringify(cID)).initial_state === "match_input"){Shelly.call("Switch.SetConfig",{id: cID,config: {initial_state: "restore_last"}});print("Invalid inital_state!, changed switch:id", cID, " inital_state to restore_last");}
    ...

    Hier mal eine von mir empfohlene Formatierung - natürlich lassen sich noch mehr oder weniger Umbrüche einbauen, aber durch die folgende Formatierung wird auf einen Blick klar, dass wir eine Bedingung mit zwei Anweisungen haben und sehen auch schnell, um welche Funktionsaufrufe es sich bei den beiden Anweisungen handelt.

    Der Nachteil ist, dass man im Endeffekt mehr scrollen muss. Aber die Vorteile - vor allem bei der Fehlersuche und für jemanden, der den Code zum ersten Mal sieht - sollten überwiegen.

    Ich persönlich gehe für die Lesbarkeit sogar noch einen Schritt weiter und füge mehr Leerzeichen ein, um "Blöcke" schneller zu erkennen. Ist aber Geschmackssache und bei uns in der Abteilung hat sich das vor ein paar Jahren durchgesetzt.

    Code
    ...
    if ( Shelly.getComponentConfig( "switch:" + JSON.stringify( cID ) ).initial_state === "match_input" ) {
    ...

    Abgesehen davon noch ein paar weitere Anmerkungen:

    Code
    if (event.info.state === true) { ...

    ist das gleiche wie

    Code
    if (event.info.state) { ...

    Und:

    Code
    if (status === !invDelayModus) { ...

    schreibt man besser

    Code
    if (status !== invDelayModus) { ...

    Ich möchte dir in keinem Fall vorschreiben, wie du den von dir selbst geschriebenen und veröffentlichten Code darzustellen hast. Aber wenn man mehr und mehr Code schreibt und auch mal verbessern oder korrigieren muss, kann das viel Zeit und Kopfzerbrechen sparen. :)

  • Rexton

    Danke für das Feedback, in meiner Arbeits-Version sind die Abstände und Einrückungen alle ordentlich, ich habe den Code im Nachhinein extra derartig Komprimiert bzw. in kurze Blöcke unterteilt damit der Editor/ bzw. das Skript für normale Anwender übersichtlich bleibt. Ich habe auch bewusst eine deutliche und einfache, bzw. unnötig langen Syntax für Bedingungen von If, for oder anderen Abfragen/Schleifen gewählt, da diese für Anfänger leichter zu verstehen sind. Ebenfalls habe ich einige Code stellen, (Userdata, Erro handling etc) bewusst weggelassen da diese bei normaler Nutzung nicht benötigt werden und Anfänger nur verwirren. Es sind auch unnötig doppelte Code Stellen vorhanden, diese hätte ich zwar mit weiteren Funktionen und/oder Schleifen vermeiden können, doch mJs hat so seine Probleme mit verschachtelten Funktionen und Performance Technisch benötigen verschachtelte Funktion am meisten, gefolgt von Schleifen wie for, while, dann if else und am besten und schnellsten sind immer noch einfache if Abfragen ohne else, idealerweise mit einem return. Deswegen siehst du in meinen Skripts recht viele if Sätze ohne else und nur wenige Funktionen oder Schleifen.

    Wenn du ernsthaft an meinem Code arbeiten willst dann jag ihn durch einen beautifier das dauert keine 2 Sekunden: https://beautifier.io/

    (Auch in der Software Entwicklung wird abgeschlossener Code stark komprimiert, die hier geteilte Version ist eine Mischung aus Komprimierung und übersichtlichen Code Blöcken.)

    Also zusammen gefasst, ja ich bin mir der komprimierten und unnötigen Code Stellen bewusst, sie sind mit Absicht drin um die Verständlichkeit für Anfänger zu erhöhen und um den fehlerhaften Shelly Editor bzw. der stark begrenzten Performance besser entgegen zu wirken.

    Am Code Block "Prüfen der Input/Output Einstellung" hat ein normaler Anwender nichts zu ändern, jemand der weiß was er tut der kann die Stelle einfach durch einen beautifier jagen, aber für das eigentliche Skript wird die Logik nicht benötigt, der Code Block ist nur drin da einige Anwender es nicht mal hinbekommen ihren Shelly passend einzustellen. Deswegen ist dieser Code Block komprimiert.

    Was stimmt nicht mit dem Editor?

    (Der Editor liefert Fehlermeldungen zu Fehlern die nicht im Code existieren, kopiert manchmal beim speichern Code Stellen doppelt oder zerreißt bestehenden Code bzw. bringt Code Blöcke durcheinander beim speichern und/oder neu laden)

    25 Mal editiert, zuletzt von _[Deleted]_ (28. Januar 2023 um 00:23)