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
- Leg einen Block „Falls Objekt“ an und wähl als Objekt
wled.0.<MAC>.on. Stell „wurde geändert“ ein. - Prüf im Block, ob der Wert
wahrist. - Setz darin den Block „steuere“ für
wled.0.<MAC>.onmit dem Wertfalsch. Aktiviere „mit Verzögerung“, gib die Zeit an (zum Beispiel 10 Min) und hak „löschen falls läuft“ an. - Damit startet jedes neue Einschalten den Timer von vorn. Ein Ausschalten von Hand vor Ablauf schadet nicht: Dann schreibt der Timer
falseauf ein Licht, das schon aus ist.
Timer in 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:
| Datenpunkt | Bedeutung | Schreibbar |
|---|---|---|
nl.on | Nightlight starten (true) oder abbrechen (false) | ja |
nl.dur | Laufzeit in Minuten, 1 bis 255 | ja |
nl.tbri | Zielhelligkeit am Ende, 0 bis 255; bei 0 ist das Licht danach aus | ja |
nl.mode | Art: 0 sofort, 1 langsam dimmen, 2 Farbe überblenden, 3 Sonnenaufgang | nein, nur über action |
nl.rem | Restzeit in Sekunden, -1 wenn kein Nightlight läuft | nein |
So schaltest du das Licht in 10 Minuten aus:
- Schreib
10inwled.0.<MAC>.nl.durund0inwled.0.<MAC>.nl.tbri. - Schalte das Licht ein, falls es aus ist, und schreib dann
trueinwled.0.<MAC>.nl.on. - Nach Ablauf setzt WLED die Helligkeit auf
nl.tbri, also aus.nl.ongeht wieder auffalse.
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:
{"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.
Was du vorbereitest
- 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.
- Such im Objektbaum die ID deines Sensors heraus, zum Beispiel den Bewegungs-State eines Zigbee- oder Homematic-Melders. Er sollte bei Bewegung
trueund danachfalsemelden. - 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
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
- Block „Falls Objekt“ auf den Sensor, „wurde geändert“.
- 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>.psmit2. - 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>.psmit1(oderwled.0.<MAC>.onmitfalsch). - 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
psnur 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
onausgeschaltet, bleibt es deshalb aus. Schick in dem Fall{"on":true,"ps":2}anwled.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.