i4 per Script vielseitig nutzen

Die Verwendung von Skripten liegt im eigenen Ermessen des Benutzers. Unterstützung für Skripte wird vom Autor des Skripts bereitgestellt.
  • Hallo und guten Tag.

    Ich nutze mehrere Shelly i4 zusammen mit Shelly 4fach Tastenfeldern. Diese steuern derzeit überwiegend Rollläden, sind aber auch für andere Zwecke nutzbar, bspw. zum schalten von Lampen.

    Hierfür habe ich ein kleines Script erstellt, welches per Konfiguration nutzbar ist. Wer es einsetzen will, braucht nur in der vorgesehenen Datenstruktur für ihn/sie passende Einträge zu erstellen.

    Mein Script wertet per Eventhandler die gedrückte Taste (id) und die Dauer des Tastendrucks aus, um daraufhin die gewünschte Nachricht zu senden. Eine solche Nachricht kann derzeit ein HTTP Request oder eine MQTT Nachricht sein.

    In der Allterco Terminologie wird ein HTTP Request auch als "IO URL action" oder "Webhook" bezeichnet.

    Mein Englisch ist eingeschränkt. Ich bitte ggf. vorhandene englischsprachige Verfehlungen zu entschuldigen oder/und zu korrigieren.

    Hinweis - insbesondere für Anfänger: Das folgende Script soll dazu dienen, es per Konfiguration zu verwenden. Die Konfiguration ist in deren Möglichkeiten etwas komplex, kann aber auch relativ einfach zusammengesetzt werden.

    Hier mein Script für einen i4:

    Dieses Script für ein 4fach Tastenfeld steuert zwei Rollläden, einer per Shelly Plus 2, der andere per Shelly 2.5. Zusätzlich wird eine Leuchte damit geschaltet, wenn der Tastendruck einer der 4 Tasten mindestens 1 Sekunde dauert.

    Die print() Aufrufe dienen nur der Betrachtung von Laufzeitwerten zwecks Debugging oder Erkenntnisgewinnung. Sie sind bei Bedarf zu "entkommentieren", d.h. die linksseitig terminierten Kommentarsymbole (//) sind dann zu entfernen.

    Erforderliche bzw. zweckdienliche Anpassungen im Script:

    1. Selbstverständlich sind die definierten IP-Adressen und die MQTT Topics anzupassen.
    2. In erster Linie sind die Einträge in der Datenstruktur (in JavaScript ist dies bereits ein Objekt) "cfg" anzupassen und/oder zu erweitern. Dazu unten mehr.
    3. "dependState()" ist eine Funktion, die bei Bedarf einen zu sendenden Wert (MQTT Payload oder Teil von HTTP Get - ?key=value) vor dem Senden bearbeitet. Bei Bedarf können weitere Geräte abhängige Funktionen solcher Art erstellt und in die Datenstruktur cfg eingetragen werden.
    4. State ist hier ein Datenfeld aus zwei Elementen. Dies kann entfallen oder gar um weitere Elemente erweitert werden. Dessen Struktur hängt letztlich von der Anwendung ab.
    5. Im Eventhandler kann der Abschnitt unterhalb von "if(!done)" (ab Zeile 90) nach Bedarf abgeändert werden. Die dortigen Anweisungen werden abgearbeitet, wenn kein zum Tastendruck passender Eintrag in cfg gefunden wurde.

    Zu Punkt 2: Datenstruktur cfg

    cfg ist ein Datenfeld (array) aus 4 Einträgen, die komplex sein können - zu jeder Taste ein Eintrag. Die Tasten Id wird als Index zum Zugriff auf das Datenfeldelement verwendet.

    In jedem dieser 4 Datenfeldelemente sind im JSON Format in knapper Form die gewünschten Nachrichten und deren Rahmenbedingungen einzutragen. Ein Element darf auch leer sein, wenn es nicht gebraucht wird. Dann ist hier ein Paar eckiger Klammern [ ] einzutragen.

    In diesen eckigen Klammern (Datenfeld) können beliebig viele JavaScript Objekte bzw. Strukturen eingetragen werden, jeweils per Komma getrennt.

    Die einzelen Eigenschaften (d, i, msg, url, f) der Objekte können auch in anderer Reihenfolge eingetragen werden. Entscheidend sind die Namen der Eigenschaften bzw. keys (d ... f). Die Bedeutung der einzelnen Eigenschaften eines solchen Objektes sind:

    • d (duration upper bound in seconds): Obere Grenze der Tastendruckdauer. Die Nachricht wird dann gesendet, wenn die Dauer des Tastendrucks kürzer ist als der d-Wert. Hier wirkt "first fit", d.h. der erste passende Eintrag wirkt, die folgenden Einträge werden dann nicht weiter geprüft. Darum sind die Dauerwerte in aufsteigender Folge einzusetzen.
    • msg (MQTT message): Wenn diese Eigenschaft vorliegt, wird sie als MQTT Nachricht gesendet. Diese besteht aus t für Topic und p für Payload. Alternativ hierzu kann url eingesetzt werden.
    • url (http request url): Wenn diese Eigenschaft vorliegt, wird sie als HTTP Get Nachricht gesendet. Dies erfolgt nur, wenn es im selben Objekt keine msg Eigenschaft gibt. msg und url sind alternativ und nicht etwa beide im selben Objekt einzutragen.
    • f (pre send function), optional: Falls der zu sendende Wert vorher zu bearbeiten ist, ist hierfür die aufzurufende Funktion einzutragen. Dies sollte der Übersicht wegen der Name einer an anderer Stelle definierten Funktion sein. Für JavaScript affine: Es kann selbstverständlich auch eine an dieser Stelle eingetragene anonyme Funktion sein. Diese Funktion importiert zwei Parameter - einen Index-Wert und den zu verarbeitenden Wert. Wie der Index-Wert verwendet wird, evtl. gar nicht, obliegt dem Ersteller der Funktion. In diesem Sript wird ausschließlich "dependState()" als eine solche Funktion verwendet.
    • i (index) bedingt optional: Hier ist immer dann und nur dann ein Wert einzutragen, wenn ein optionaler f-Eintrag vorliegt. Im obigen Script wird der i-Wert als Index im State Datenfeld verwendet.

    Da dieses Script recht vielseitig verwendbar ist ( a generic script ;) ), erscheint dessen Konfiguration etwas gewöhnungsbedürftig.

    Wenn bspw. eine Taste für mehrere unterschiedliche Nachrichten in Abhängigkeit deren Druckdauer verwendet werden soll, ist ein Eintrag in cfg folgender Struktur einzusetzen:

    Code
    [ // Eintrag zu einer id, also zu einer der 4 Tasten
        {d:1 /* kürzer als 1s */, url:'http://...', p:...}, // Hier sind f und i weggelassen, was durchaus zulässig ist. http get request
        {d:3 /* >1s und <3s */, msg:{t:..., p:...}}, // mqtt message
        {d:6 /* >3s und <6s */, url:'http://...', p:...}
    ]

    Ich stehe bei Fragen gerne zur Verfügung.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

    13 Mal editiert, zuletzt von eiche (11. Mai 2022 um 00:26)

  • ich verschiebe mal in "User Scripte"

    Theorie ist wenn man alles weiß und nichts funktioniert. Praxis ist wenn alles funktioniert und keiner weiß warum.

    FAQ Fehlerbehebung / FAQ troubleshooting         http-Request - Überblick / http-Request - overview

    Spoiler anzeigen

    Homematic/IP mit CCU3, iOBroker auf Raspberry Pi4 mit M.2 SSD / Diagramme per Flot / Visualisierung mit Mediola AIO CREATOR NEO / FRITZ!Mesh-WLAN

    Shelly (1, 1L, 1PM, 2.5, Dimmer/2, RGBW2, EM, UNI, PlugS, Flood, TRV, Gas, Motion, Motion2, Duo, Vintage, Button/1, Temp-AddOn / PLUS: 1, 1PM, 2PM, i4, H&T2, PlugS, Smoke / PRO: 1,1PM, 2, 2PM, 3EM)

  • Vielleicht ist dies hier keine passende Stelle, na ja ... dann halt verschieben. ;)

    Ich möchte einmal an dieser Stelle ein dickes Lob an Allterco Robotics gerichtet aussprechen.

    Die praktizierte offene Philosophie gefällt mir außerordentlich. Das ist alles andere als selbstverständlich.

    Ich hoffe, dass Allterco noch lange seine Produkte vermarkten kann.

    Insbesondere die zweite Generation mit den Scriptmöglichkeiten sagt mir besonders zu. Bis auf weiteres brauche ich nicht auf Tasmota auszuweichen, obwohl mir derzeit Tasmota32 und Berry noch etwas besser gefallen und die aktuelle Firmware 0.10.1 noch Fehler hat.

    Die Zielrichtung ist aber sehr überzeugend.

    :) :)

    P.S.: Nein, ich werde nichts davon auf FB verlauten lassen. Ich bin kein FB Mitglied und mag FB nicht - sehr zurückhaltend ausgedrückt.

    An Cloud-/Szenen-Benutzer (insbesondere für Regelungen): Was erwartest du, wenn Internet oder Cloud sabotiert werden? Nicht nur dafür meine kleine Skripteinführung  8)

    Die einzig existierende Konstante ist der Wandel. Oft liegt die größte Schwierigkeit darin, das Anliegen des Klienten zu verstehen.

  • Code
    [ // Eintrag zu einer id, also zu einer der 4 Tasten
        {d:1 /* kürzer als 1s */, url:'http://...', p:...}, // Hier sind f und i weggelassen, was durchaus zulässig ist. http get request
        {d:3 /* >1s und <3s */, msg:{t:..., p:...}}, // mqtt message
        {d:6 /* >3s und <6s */, url:'http://...', p:...}
    ]

    Ich stehe bei Fragen gerne zur Verfügung.

    Dann will ich dich beim Wort nehmen. Ich versuche die Tasten 3+4 eines Shelly Plus i4 abzufragen. id 0 und 1 ist kein Problem aber wie bekomme ich die inputs 2 und 3? In deinem Beispiel sind die höheren id's Lange push. Ist das irgendwo beschrieben?