Skip to content

Skripte mit Blockly und JavaScript ​

Wie steuere ich WLED per JavaScript, regelmäßig oder schrittweise (zum Beispiel Sonnenaufgang)? ​

Dieser Abschnitt wird noch geschrieben.

Wie finde ich WLED-Datenpunkte im Skript-Selektor über die Rolle switch.light? ​

Dieser Abschnitt wird noch geschrieben.

Wie baue ich eine Garagentor-Beleuchtung mit WLED-Presets? ​

Dieser Abschnitt wird noch geschrieben.

Wie schalte ich WLED nach einer Zeit automatisch aus (Timer)? ​

Kurz: Es gibt zwei Wege. Entweder startet dein Skript beim Einschalten einen Timer und schreibt nach Ablauf false in wled.0.<MAC>.on. Oder du nutzt das Nightlight von WLED (nl): Dann zählt das Gerät selbst herunter und schaltet aus, auch wenn ioBroker in der Zeit nicht läuft.

Ausschalten ist für den Adapter ein ganz normaler Schreibzugriff auf on. Die Zeitlogik gehört ins Skript. Wichtig ist, einen laufenden Timer beim erneuten Auslösen zu löschen und neu zu starten, statt mit Pausen zu arbeiten.

Timer in Blockly ​

  1. Leg einen Block „Falls Objekt“ an und wähl als Objekt wled.0.<MAC>.on. Stell „wurde geändert“ ein.
  2. Prüf im Block, ob der Wert wahr ist.
  3. Setz darin den Block „steuere“ für wled.0.<MAC>.on mit dem Wert falsch. Aktiviere „mit Verzögerung“, gib die Zeit an (zum Beispiel 10 Min) und hak „löschen falls läuft“ an.
  4. Damit startet jedes neue Einschalten den Timer von vorn. Ein Ausschalten von Hand vor Ablauf schadet nicht: Dann schreibt der Timer false auf ein Licht, das schon aus ist.

Timer in JavaScript ​

javascript
const WLED = 'wled.0.<MAC>';
const DAUER_MS = 10 * 60 * 1000; // 10 Minuten
let ausTimer = null;

// WLED meldet: Licht ist an (egal ob per VIS, App oder Taster eingeschaltet)
on({ id: `${WLED}.on`, val: true, change: 'ne', ack: true }, () => {
    if (ausTimer) clearTimeout(ausTimer); // laufenden Timer neu starten
    ausTimer = setTimeout(() => {
        ausTimer = null;
        setState(`${WLED}.on`, false); // Steuerbefehl (ack=false)
    }, DAUER_MS);
});

// Wird von Hand ausgeschaltet, ist der Timer überflüssig
on({ id: `${WLED}.on`, val: false, change: 'ne', ack: true }, () => {
    if (ausTimer) clearTimeout(ausTimer);
    ausTimer = null;
});

ack: true im Auslöser bedeutet: Das Skript reagiert auf die Rückmeldung vom Gerät, nicht auf deinen eigenen Befehl. change: 'ne' sorgt dafür, dass nur eine echte Änderung den Timer startet.

WARNING

Bis v0.9.2 setzt der Adapter on auf false, sobald ein Gerät offline geht, und beim Adapterstart. Ein Skript, das auf on reagiert, wird dadurch auch ohne echtes Schalten ausgelöst. Ab v0.9.3: on und bri behalten beim Offline-Gehen und beim Start ihren letzten Wert, die echten Werte kommen beim Wiederverbinden vom Gerät (#899).

Ist das Gerät offline, wenn der Timer abläuft, kommt der Befehl nicht an. Der Adapter puffert nichts. Ab v0.9.3 steht dann eine Warnung „Device … is offline, command for … discarded“ im Log (#904). Wenn das Ausschalten sicher klappen muss, nimm das Nightlight.

Timer mit dem WLED-Nightlight ​

Das Nightlight läuft im Gerät. Der Adapter legt dafür unter wled.0.<MAC>.nl diese Datenpunkte an:

DatenpunktBedeutungSchreibbar
nl.onNightlight starten (true) oder abbrechen (false)ja
nl.durLaufzeit in Minuten, 1 bis 255ja
nl.tbriZielhelligkeit am Ende, 0 bis 255; bei 0 ist das Licht danach ausja
nl.modeArt: 0 sofort, 1 langsam dimmen, 2 Farbe überblenden, 3 Sonnenaufgangnein, nur über action
nl.remRestzeit in Sekunden, -1 wenn kein Nightlight läuftnein

Helligkeit beim Nightlight: In Modus 1 sinkt sie über nl.dur Minuten gleichmäßig auf nl.tbri, in Modus 0 bleibt sie und springt am Ende auf nl.tbri.

So schaltest du das Licht in 10 Minuten aus:

  1. Schreib 10 in wled.0.<MAC>.nl.dur und 0 in wled.0.<MAC>.nl.tbri.
  2. Schalte das Licht ein, falls es aus ist, und schreib dann true in wled.0.<MAC>.nl.on.
  3. Nach Ablauf setzt WLED die Helligkeit auf nl.tbri, also aus. nl.on geht wieder auf false.

Den Modus kannst du nur über den Datenpunkt action setzen, weil nl.mode im Adapter nicht schreibbar ist. Mit einem einzigen Befehl schaltest du ein und lässt das Licht über 10 Minuten langsam ausdimmen:

json
{"on":true,"nl":{"on":true,"dur":10,"mode":1,"tbri":0}}

In JavaScript: setState('wled.0.<MAC>.action', JSON.stringify({ on: true, nl: { on: true, dur: 10, mode: 1, tbri: 0 } }));. In Blockly schreibst du denselben Text mit „steuere“ in action.

Siehe auch: Kompletten JSON-Befehl senden · Presets per Bewegungsmelder schalten · Warum on beim Offline-Gehen false wird · Skript setzt ps oder on nicht

Wie zeige ich Status oder Countdown auf dem Streifen an? ​

Dieser Abschnitt wird noch geschrieben.

Wie schalte ich WLED-Presets per Automatik, zum Beispiel per Bewegungsmelder? ​

Kurz: Das Muster ist immer gleich: Ein Sensor-Datenpunkt löst das Skript aus, das Skript schreibt die Preset-Nummer in wled.0.<MAC>.ps, und nach einer Nachlaufzeit schaltet es auf ein anderes Preset zurück oder schreibt false in on. Das funktioniert mit Bewegungsmeldern, Tür- und Torkontakten oder jedem anderen State.

Der Adapter macht dabei nichts Besonderes: Jeder Schreibzugriff mit ack=false auf ps oder on wird sofort an das Gerät geschickt. Die Logik, wann welches Preset gilt, liegt ganz im Skript.

Zeitlicher Ablauf: Bei Bewegung wird sofort Preset 2 gesetzt. Nach dem Ende der Bewegung läuft ein Nachlauf, den neue Bewegung abbricht. Erst nach dem letzten Nachlauf wird auf Preset 1 zurückgeschaltet oder ausgeschaltet.

Was du vorbereitest ​

  1. Leg in WLED die Presets an, zum Beispiel Nummer 2 für „Bewegung“ und Nummer 1 für „Grundlicht“. Speichere das Preset für „Bewegung“ bei eingeschaltetem Licht mit „Include brightness“, damit es auch dann einschaltet, wenn das Licht vorher aus war.
  2. Such im Objektbaum die ID deines Sensors heraus, zum Beispiel den Bewegungs-State eines Zigbee- oder Homematic-Melders. Er sollte bei Bewegung true und danach false melden.
  3. Leg fest, wie lange das Licht nach der letzten Bewegung bleiben soll.

Wie ps genau funktioniert und warum ein Preset ein- oder ausschaltet, steht unter Presets per Datenpunkt ps schalten.

Beispiel in JavaScript ​

javascript
const WLED = 'wled.0.<MAC>';
const SENSOR = '<ID des Bewegungsmelders>';
const PRESET_BEWEGUNG = 2;
const PRESET_ZURUECK = 1;      // 0 bedeutet: danach ausschalten
const NACHLAUF_MS = 2 * 60 * 1000; // 2 Minuten nach der letzten Bewegung

let nachlauf = null;

// Bewegung erkannt: Preset sofort setzen, laufenden Nachlauf abbrechen
on({ id: SENSOR, val: true, change: 'ne' }, () => {
    if (nachlauf) { clearTimeout(nachlauf); nachlauf = null; }
    setState(`${WLED}.ps`, PRESET_BEWEGUNG);
});

// Keine Bewegung mehr: Nachlauf starten, danach zurückschalten
on({ id: SENSOR, val: false, change: 'ne' }, () => {
    if (nachlauf) clearTimeout(nachlauf);
    nachlauf = setTimeout(() => {
        nachlauf = null;
        if (PRESET_ZURUECK > 0) {
            setState(`${WLED}.ps`, PRESET_ZURUECK);
        } else {
            setState(`${WLED}.on`, false);
        }
    }, NACHLAUF_MS);
});

Beispiel in Blockly ​

  1. Block „Falls Objekt“ auf den Sensor, „wurde geändert“.
  2. Darin eine Abfrage auf den Wert. Ist er wahr: zuerst den Block „stop“ aus der Gruppe „Timeouts“ für die Verzögerung „nachlauf“, danach „steuere“ wled.0.<MAC>.ps mit 2.
  3. Ist er falsch: ebenfalls zuerst „stop“ für „nachlauf“, dann den Block „Ausführen“ mit dem Namen „nachlauf“ und „in“ 2 Min. Darin „steuere“ wled.0.<MAC>.ps mit 1 (oder wled.0.<MAC>.on mit falsch).
  4. So bricht jede neue Bewegung den Nachlauf ab, und jedes Ende einer Bewegung startet ihn neu. Der Block „Pause“ ist dafür nicht geeignet, weil er sich nicht abbrechen lässt.

Worauf du achten solltest ​

  • Ein Auslöser je Datenpunkt. Leg für jeden Sensor nur einen Auslöser an und lass ihn eine gemeinsame Funktion aufrufen. Mehrere Auslöser auf denselben State können sich gegenseitig stören.
  • Mehrere Sensoren (zum Beispiel Treppe oben und unten): Bestimme in einer Hilfsfunktion aus allen Sensoren, welches Preset gelten soll, und schreib ps nur dort. Eine Sperrvariable je Sensor verhindert, dass ein Ablauf den anderen abbricht.
  • Dasselbe Preset noch einmal: Ist das Preset schon aktiv, lädt WLED es nicht neu. Hast du das Licht zwischendurch über on ausgeschaltet, bleibt es deshalb aus. Schick in dem Fall {"on":true,"ps":2} an wled.0.<MAC>.action.
  • Gerät offline: Befehle an ein Gerät, das der Adapter für offline hält, kommen nicht an. Der Adapter puffert nichts. Ab v0.9.3 steht dann „Device … is offline, command for … discarded“ als Warnung im Log (#904).

TIP

Soll das Licht nach dem Nachlauf in den Zustand von vorher zurück, merk dir beim Auslösen den Wert von ps und schreib ihn danach zurück. Das klappt nur, wenn vorher ein Preset aktiv war. Zeigt ps den Wert -1, war keines aktiv.

Ein ausführliches Beispiel für ein Garagentor mit mehreren Zuständen steht unter Garagentor-Beleuchtung mit WLED-Presets.

Siehe auch: Presets per Datenpunkt ps schalten · WLED nach einer Zeit ausschalten · Skript setzt ps oder on nicht

Wie speichere ich den Zustand und stelle ihn nach einer Animation wieder her? ​

Dieser Abschnitt wird noch geschrieben.

Woran erkenne ich, ob WLED per Telegram, VIS oder Web-Oberfläche geschaltet wurde? ​

Dieser Abschnitt wird noch geschrieben.

Knowledge has no value unless you use and share it