Shelley Plus 1 - eigene Scripte erstellen und ausführen

Überblick

Der Shelly Plus 1 kann lokal per Script gesteuert werden. Die Scripts laufen direkt auf dem Gerät und nutzen eine JavaScript-ähnliche Sprache. Typische Komponenten sind input:0 für den Eingang und switch:0 für den Relaisausgang.

  1. Script starten
  2. Einfacher Funktionstest
  3. Relais ein- und ausschalten
  4. Relais zeitgesteuert schalten
  5. Eingang abfragen
  6. Tastendruck schaltet Relais um
  7. Maximale Laufzeit begrenzen
  8. Pumpe zeitbegrenzt starten
  9. HTTP-Request senden
  10. Status regelmäßig ausgeben

1. Script starten

In der Weboberfläche des Shelly:

http://IP-DES-SHELLY

Dann:

Scripts → Create Script → Code einfügen → Save → Start
Für dauerhaften Betrieb nach einem Neustart sollte Run on startup aktiviert werden.

2. Einfacher Funktionstest

Dieses Script prüft, ob die Script-Umgebung läuft und gibt Geräteinformationen in der Console aus.

// Shelly Plus 1 - einfacher Test

console.log("Script gestartet");

let info = Shelly.getDeviceInfo();
console.log("Gerät:", info.app);
console.log("Firmware:", info.ver);

3. Relais einschalten und ausschalten

Der Shelly Plus 1 besitzt einen Relaisausgang. Dieser hat die ID 0.

Relais einschalten

// Relais einschalten

Shelly.call("Switch.Set", {
  id: 0,
  on: true
});

Relais ausschalten

// Relais ausschalten

Shelly.call("Switch.Set", {
  id: 0,
  on: false
});

4. Relais für 5 Sekunden einschalten

Das Relais wird eingeschaltet und nach 5 Sekunden automatisch wieder ausgeschaltet.

// Relais 5 Sekunden einschalten, dann automatisch aus

Shelly.call("Switch.Set", {
  id: 0,
  on: true
});

Timer.set(5000, false, function () {
  Shelly.call("Switch.Set", {
    id: 0,
    on: false
  });
});

Timer.set(5000, false, ...) bedeutet: nach 5000 ms einmal ausführen.

5. Eingang abfragen und Relais entsprechend setzen

Das Script prüft jede Sekunde den Zustand des Eingangs und schaltet das Relais entsprechend.

// Eingang lesen und Relais entsprechend schalten

function checkInput() {
  let input = Shelly.getComponentStatus("input:0");

  console.log("Eingang:", input.state);

  Shelly.call("Switch.Set", {
    id: 0,
    on: input.state
  });
}

Timer.set(1000, true, checkInput);

6. Tastendruck schaltet Relais um

Bei einer Änderung am Eingang wird das Relais umgeschaltet.

// Bei Änderung am Eingang Relais umschalten

Shelly.addStatusHandler(function (event) {
  if (event.component === "input:0") {
    console.log("Eingang geändert");

    Shelly.call("Switch.Toggle", {
      id: 0
    });
  }
});
Für echte Taster muss man später genauer unterscheiden, ob auf Drücken, Loslassen oder kurzen Tastendruck reagiert werden soll.

7. Sicherheit: maximale Laufzeit begrenzen

Wenn das Relais eingeschaltet wird, schaltet es sich nach einer festgelegten Zeit automatisch wieder aus.

// Wenn Relais eingeschaltet wird, nach 30 Sekunden automatisch ausschalten

let maxLaufzeit = 30000; // 30 Sekunden

Shelly.addStatusHandler(function (event) {
  if (event.component === "switch:0") {
    if (event.delta.output === true) {
      console.log("Relais wurde eingeschaltet - Timer startet");

      Timer.set(maxLaufzeit, false, function () {
        console.log("Maximale Laufzeit erreicht - Relais aus");

        Shelly.call("Switch.Set", {
          id: 0,
          on: false
        });
      });
    }
  }
});
Diese Schutzfunktion ist besonders sinnvoll bei Pumpen, Lüftern oder anderen Verbrauchern, die nicht dauerhaft laufen sollen.

8. Pumpe per Taster für 10 Sekunden starten

Ein Tastendruck startet die Pumpe für 10 Sekunden. Mehrfaches Drücken während der Laufzeit startet keinen zweiten Timer.

// Taster startet Pumpe für 10 Sekunden

let laufzeit = 10000; // 10 Sekunden
let pumpeLaeuft = false;

function pumpeStarten() {
  if (pumpeLaeuft) {
    console.log("Pumpe läuft bereits");
    return;
  }

  pumpeLaeuft = true;
  console.log("Pumpe EIN");

  Shelly.call("Switch.Set", {
    id: 0,
    on: true
  });

  Timer.set(laufzeit, false, function () {
    console.log("Pumpe AUS");

    Shelly.call("Switch.Set", {
      id: 0,
      on: false
    });

    pumpeLaeuft = false;
  });
}

Shelly.addStatusHandler(function (event) {
  if (event.component === "input:0") {
    if (event.delta.state === true) {
      pumpeStarten();
    }
  }
});

9. HTTP-Request an anderes Gerät senden

Der Shelly kann lokal einen HTTP-Request an einen ESP32, einen zweiten Shelly oder einen kleinen Webserver senden.

// HTTP-Request an anderes Gerät senden

let url = "http://192.168.178.50/status?pumpe=ein";

Shelly.call("HTTP.GET", {
  url: url
}, function (result, error_code, error_message) {
  if (error_code === 0) {
    console.log("HTTP erfolgreich:", result.code);
  } else {
    console.log("HTTP Fehler:", error_message);
  }
});

10. Status regelmäßig ausgeben

Dieses Diagnose-Script gibt alle 5 Sekunden den Zustand von Eingang und Relais aus.

// Alle 5 Sekunden Status anzeigen

function statusAusgeben() {
  let input = Shelly.getComponentStatus("input:0");
  let sw = Shelly.getComponentStatus("switch:0");

  console.log("Eingang:", input.state, "Relais:", sw.output);
}

Timer.set(5000, true, statusAusgeben);

Wichtige Grundbefehle

// Gerätedaten
Shelly.getDeviceInfo();

// Status einer Komponente
Shelly.getComponentStatus("input:0");
Shelly.getComponentStatus("switch:0");

// Relais ein/aus
Shelly.call("Switch.Set", { id: 0, on: true });
Shelly.call("Switch.Set", { id: 0, on: false });

// Relais umschalten
Shelly.call("Switch.Toggle", { id: 0 });

// Einmaliger Timer
Timer.set(5000, false, function () {
  console.log("Nach 5 Sekunden");
});

// Wiederholender Timer
Timer.set(1000, true, function () {
  console.log("Jede Sekunde");
});

Didaktische Reihenfolge

  1. Script startet und schreibt in die Console
  2. Relais per Script ein- und ausschalten
  3. Timer: Relais nach 5 Sekunden ausschalten
  4. Eingang lesen
  5. Taster startet eine zeitbegrenzte Aktion
  6. Schutzlogik: maximale Laufzeit
  7. HTTP-Request an ESP32 oder zweiten Shelly

Diese Reihenfolge ist für Unterricht und AG gut geeignet: Erst Ausgabe, dann Aktor, dann Sensor, dann Logik und Kommunikation.