NEWS
WS2812b einzeln steuern
-
@geschild Danke für das Angebot. Ein wenig Beispielcode würde mir aber schon reichen. Gerne auch aus einem anderen Projekt, wo man den Schaltvorgang und die Ansteuerung sieht. Bereinigen oder anpassen würde ich mir den dann selbst und kann den auch gerne dann wieder mit diesem Forum teilen. Vielleicht gibt es ja noch andere Menschen, die ebenfalls eine einzelne Ansteuerung benötigen.
-
@worlik Auch wenn ich diesen Weg sehr ineffektiv finde.
Ich habe das bis jetzt so verstanden:
Mit z.B. Blockly willst du eine Led festlegen, diese in einen DP eintragen, den an den ESP senden (oder der ESP holt ihn per subscribe ab) und der ESP soll dann die gewählte LED anmanchen. Wie schnell willst du die Led wechseln ? Willst du die Farbe festlegen ? -
Hab jetzt nicht alles gelesen sondern antworte auf das eingangsposting. Das geht mit wled. Ob der Interval von 1 Sekunde geht weiß ich nicht.
Ich hab das bei mir so gelöst:
let change = false; let p = [[0,0,0]]; for (let a = 1; a < ledMaxCount; a++) { p.push([120,0,0]) } p.push([0,0,0]) // die erste und letzte LED sind nicht sichtbar try { const {data} = await axios.post('http://'+getState('wled.0.c049efe62f6c._info.ip').val+'/json', { "bri":250, "seg": [{ "id": 0, "i": p }]}, { headers: { "Content-Type": 'application/json' } } ) } catch(error) { console.warn('wled unten nicht erreichbar!' + error) }
-
@ticaki Ach das ist ja genial, vielen Dank. Ich habe ehrlicherweise nicht mit einer API auf Seite der WLED Api gerechnet. Dann ist da ja extrem einfach. Super. Habe die API-Doku auch gefunden: https://kno.wled.ge/interfaces/json-api/ - Aber eigentlich ja auch irgendwie Logisch, der WLED Adapter für iobroker muss ja auch mit dem Teil kommunizieren.
Die 1 Sekunde sollte nur zum Ausdruck bringen, dass ich keine hohe Frequenz der Updates brauche. Tatsächlich wird nur etwas am Zustand des Streifens geändert, wenn sich auch in der echten Welt etwas ändert.
@geschild Ich danke dir wirklich ganz herzlich für deine Hilfsbereitschaft und auch das Angebot zu telefonieren. Um deine letzte Frage trotzdem noch zu beantworten: iobroker soll aus einem JavaScript heraus den Zustand bestimmter LEDs ändern können. Ich habe dazu eine Art Tabelle (die Anordnung der WS2812b ist in einer 2D Matrix mit sehr großen Abständen dazwischen), wo dann der entsprechende Index der gewünschten LED steht. Die Farbe soll entsprechend natürlich dann neben dem Schaltzustand auch geändert werden.
-
@worlik sagte in WS2812b einzeln steuern:
@ticaki Ach das ist ja genial, vielen Dank. Ich habe ehrlicherweise nicht mit einer API auf Seite der WLED Api gerechnet. Dann ist da ja extrem einfach. Super. Habe die API-Doku auch gefunden: https://kno.wled.ge/interfaces/json-api/ - Aber eigentlich ja auch irgendwie Logisch, der WLED Adapter für iobroker muss ja auch mit dem Teil kommunizieren.
Die 1 Sekunde sollte nur zum Ausdruck bringen, dass ich keine hohe Frequenz der Updates brauche. Tatsächlich wird nur etwas am Zustand des Streifens geändert, wenn sich auch in der echten Welt etwas ändert.
ledSchedule = schedule('*/5 * * * *', setDesk1)
Will damit sagen, ich aktualisiere es im 5 Sekundentakt - bzw. überprüfe ob die Welt sich geändert hat, wenn ja, aktualisiere ich.
-
@worlik Alles klar. Das dahinter ein fertiges Projekt mit Adapter steckt war mir nicht bewusst. Sollte es mal mit dem LED Wechsel schneller gehen sollen, kannst du dich ja nochmal melden. Meine Email Adresse hast du ja.
-
@ticaki Bin kein js-experte, komme eher von der c++ Ecke, darum zwei Fragen:
let p = [[0,0,0]]; was bedeuten doppelte eckige Klammern ?
Wie wirkt sich in der 'for-Schleife' die Variable 'a' auf den Speicherort im array 'p' aus ?
-
@geschild sagte in WS2812b einzeln steuern:
@ticaki Bin kein js-experte, komme eher von der c++ Ecke, darum zwei Fragen:
let p = [[0,0,0]]; was bedeuten doppelte eckige Klammern ?
Wie wirkt sich in der 'for-Schleife' die Variable 'a' auf den Speicherort im array 'p' aus ?
Die doppelten Klammern erzeugen ein Array in dem der erste Eintrag ein Array mit dem Inhalt 0, 0, 0 ist. Wled erwartet ein Array mit der Anzahl der LEDs das jeweils ein Array enthält das aus r, g, b besteht.
Die For Schleife zählt nur bis zur max. Anzahl der LEDs hoch und in dem Beispiel ist zwar a == index, aber a ist nur ein Zähler damit ich die richtige LED einschalte. Das Array wird duch erweitern mit Push erstellt. In meinem Skript ist da ein if else if else if else
Die ganze Funktion sieht so aus, ist aber jetzt 2 Jahre alt, zuerst würde recht die Temperatur und Energieverbrauch des Boilers angezeigt, das ist aber teils ohne Funktion heute. Jetzt ist da die Batterie.
async function setDesk(obj) { let bat = 0 let sol = obj == undefined ? getState('shelly.0.SHEM-3#BCFF4DFD10B1#1.Total.InstantPower').val* -1: obj.state.val * -1 let use = sol - psurplus + getState('sma-em.0.3015986450.pregard').val sol = (sol > 0 ? sol : 0) sol = sol > maxPower ? maxPower : sol use = use > maxPower ? maxPower : use let s = Math.round(ledcount * sol /maxPower)+2 let u = Math.round(ledcount * use /maxPower)+2 //let b = ledMaxCount - Math.round((ledcount) * bat /100) - 1 let tt = getState('bydhvs.0.State.SOC').val tt = tt > 100 ? 100 : tt tt = tt < 5 ? 5 : tt let t = ledMaxCount - Math.round((ledcount) * (tt-5) / 95) let b = ledMaxCount - Math.round((ledcount) * getState('0_userdata.0.MQTT.k.heizungsraum.switch:0.apower').val / maxPower) let c = getState('0_userdata.0.MQTT.k.heizungsraum.switch:0.output').val ? ledMaxCount-1 : ledMaxCount let bri = 220 let oBri = 180 if ( s <= u && sol < 800) { if (!getState('sonoff.0.Gosund Steckdose 7.POWER').val) return Promise.resolve(true); oBri = 80 if (!deactiveWledTimer /*&& bat < 20*/) deactiveWledTimer = setTimeout(function(){ setState('sonoff.0.Gosund Steckdose 7.POWER', false) deactiveWledTimer = null; }, 60 * 60000) //stunde } else { if (deactiveWledTimer) { clearTimeout(deactiveWledTimer) deactiveWledTimer = null } if (!getState('sonoff.0.Gosund Steckdose 7.POWER').val) { setState('sonoff.0.Gosund Steckdose 7.POWER', true) } } if (getState('wled.0.c049efe62f6c._info._online').val != true) return if (!getState('sonoff.0.Gosund Steckdose 7.POWER').val) return let change = false; let p = [[0,0,0]]; for (let a = 1; a < ledMaxCount; a++) { if (a < u ) { p.push([bri,0,0]) if (a > s) { p[a][0] = bri-20 p[a][2] = bri+20 } } else if (a < s) { p.push([0,bri,0]) } else if (a >= c ) { p.push([bri,bri,bri]) } else if (a == tomorrow ) { p.push([0,254,0]) } else if (a >= b ) { p.push([bri,bri,bri]) } else if (a >= t ) { p.push([bri-20,bri-20,0]) } else { p.push([0,0,0]) } if (lastLed[a] == undefined || p[a][0] != lastLed[a][0] || p[a][1] != lastLed[a][1] || p[a][2] != lastLed[a][2]) change=true } p.push([0,0,0]) // die erste und letzte LED sind nicht sichtbar lastLed = p; if (!change) return Promise.resolve(true); try { const {data} = await axios.post('http://'+getState('wled.0.c049efe62f6c._info.ip').val+'/json', { "bri":oBri, "seg": [{ "id": 0, "i": p }]}, { headers: { "Content-Type": 'application/json' } } ) } catch(error) { console.warn('wled unten nicht erreichbar!' + error) } return Promise.resolve(true); }
u = aktuelle Verbrauch
s = aktuelle Solarertrag
t = Batterieladestand
tomorrow = ist die erwartete Solareinstrahlung am nächsten Tag
c und b sind jetzt ohne Funktion.EDIT: ganze Funktion hinzugefügt
-
@geschild Moin, ne das ist kein fertiges Projekt. Für die Ansteuerung von verschiedenen LED Streifen oder auch Matrixen gibt es die Firmware WLED. Die flasht man einfach auf den ESP. Passend dazu gibt es den WLED Adapter für iobroker. Damit kann man dann über Datenpunkte schon einiges steuern. Aber der Adapter selbst ist für die Steuerung von zuvor angelegten Segmenten gedacht (vermutlich auch, um nicht tausende Datenpunkte zu benötigen).
Für das was tikaci hier nun zeigt, braucht es den WLED Adapter für iobroker eigentlich nicht. Hier wird lediglich die IP Adresse aus dem Datenpunkt des Adapters geholt. Der Adapter kann Autodiscovery und findet passende ESP mit der WLED Firmware automatisch.
-
Ich hab oben die ganze Funktion (auch wenn ich sie heute wohl anders schreiben würde) gepostet. Ich nutzen den Adapter auch noch um zu sehen ob WLED online ist.
EDIT: Und um die Rechnung zu verstehen der Led string ist am Stück - links von 0- 63 rechts von 64-124 (geschätzt) ist ja nicht wichtig.
-
Ich muss hier kurz ein Frage zu einem Problemchen mit WLED stellen, wenn schon User da sind, die sich mit WLED auskennen.
Ich möchte ein Stripe von ca.10m mit zwei ESP32 steuern, weil einer alleine das zwar schaffen würde, aber die Effekte dann sehr langsam werden. Somit wird dann der Stripe zweigeteilt, soll aber wie einer laufen, also nicht synchron, sondern da fortgeführt wo der eine fertig hat. Wie und wo kann ich das in WLED einstellen?
-
Meine Infos sind älter als 1 Jahre, aber AFAIK ging das damals nicht.
-
@ticaki
Ok, danke für die Info. Da ich WLED eigentlich gut verstehe und damit einige Dinge am Laufen habe, wird das wohl immer noch so sein, wenn ich in den vielen Möglichkeiten nichts gefunden habe.
Für das Projekt ist es auch nicht so tragisch (wird ne Beleuchtung für ne Küchenrückwand mit Kanten Einspeisung), wollte aber beim Verbauen eben gleich alles so vorbereiten, dass ich mir es später recht einfach aussuchen kann, wie cg es dann haben möchte. Dann werde ich eben zwei gleich lange Strippen für die obere und untere Hälfte verbauen und die getrennt steuern. Falls dann doch noch einer ne Idee hätte sollte man das problemlos über WLED umsetzten können. -
@jan1 Bei einem ESP32 sollte die Bandbreite doch aber locker ausreichen für 10m. Hier bei der Multi-Strip Beschreibung steht einiges dazu: https://kno.wled.ge/features/multi-strip/
-
@worlik
Die schreiben, dass man es wohl auf mehrere Ausgänge an einem ESP32 verteilen soll (kann). Ich baue das mal auf und teste mich durch. Die Angaben der zu steuernden LEDs ist wesentlich höher als das was ich mit ca. 600 LEDs haben werde.Wobei da auch sowas steht:
ESP8266 können ca. 15k LEDs pro Sekunde berechnen (das bedeutet 250LEDs @~60fps, 500 LEDs @~30fps, 1000 LEDs @~15fps)Ich hatte gerade letzte Woche zum Basteln 3x 8x32 Matrix an einen ESP8266 gehangen und der ging bei den Effekten voll in die Knie. Bei voller Helligkeit auf weiß und 40A Stromaufnahme ist mir dann der 5V Stecker geschmolzen LOL
-
@jan1 sagte in WS2812b einzeln steuern:
Ich muss hier kurz ein Frage zu einem Problemchen mit WLED stellen, wenn schon User da sind, die sich mit WLED auskennen.
Ich möchte ein Stripe von ca.10m mit zwei ESP32 steuern, weil einer alleine das zwar schaffen würde, aber die Effekte dann sehr langsam werden. Somit wird dann der Stripe zweigeteilt, soll aber wie einer laufen, also nicht synchron, sondern da fortgeführt wo der eine fertig hat. Wie und wo kann ich das in WLED einstellen?
Die Länge alleine sagt nichts aus, weil es ja verschiedene Anzahlen von LEDs pro Meter gibt.
Ich habe einen Streifen mit 865 LEDs incl. SoundReactive (Audio-gesteuerte Effekte) im Einsatz, da gibt es keinerlei Performance-Probleme.Übrigens gibt es unter den Settings einen Punkt "Sync Interfaces", damit kann man auch zwei WLED-Instanzen verbinden.
-
@labersack
Ich schreib ja, 60 LED/m.
Hast die 865 LED an einem GPIO oder aufgeteilt wie empfohlen? Die Sync Geschichte hatte ich schon probiert und komm da nur zu dem Ergebnis, dass beide Strippen dann zur selben Zeit das selbe tun, aber eben nicht wie ein langer Stripe laufen. Ich versuchs einfach mal mit einem Controller und schau wie es läuft bevor ich es fest verbaue.
Der Vermutung, dass es langsam wird, hatte ich nach dem Test mit der LED Matrix was dann 768 LEDs sind und da hatte der ESP8266 eben sehr deutliche Einbußen. -
@jan1
Die LEDs sind alle an einem GPIO. Gibt auch in Bezug auf die Performance keinen Sinn den auf zwei GPIOs aufzuteilen, der Rechenenaufwand wird dadurch ja auch nicht geringer.
Habe einen NodeMCU mit ESP32 für SoundReactive mit vielen LEDs und Wemos D1 Mini für kleinere Sachen im Einsatz.
Firmware: WLED_0.14.0_ESP32_audioreactive.bin -
@labersack
Die Aufteilung wird auf der oben verlinkten Seite so angegeben wobei ich da genau Deiner Meinung bin, was das Berechnen angeht. Hier hast dann aber ein deutlich kürzeren String der durch muss und das hat bei einer seriellen Anbindung eben doch einige Performanz Vorteile. Ich teste mal obs wirklich was ausmacht.
Die 8266 hatte ich vorher auch laufen, ebenfalls WEMOS D1 und ein NodeMUC. Gerade beim Ambi am TV mit 107 LEDs läufts mit dem ESP32 deutlich runder. Kann aber auch am WLAN Teil liegen, da der ESP32 hier auch deutlich schneller ist. Die WEMOS nerven auch etwas mit der blauen LED, was die 32er S2 mini nicht verbaut haben. Der Preis ist beim Ali für beide ESP eh fast identisch -
@jan1
Ich sehe gerade, du schreibst abwechselnd von ESP32 und ESP8266.
Das ist ein Unterschied, und bei paarhundert LEDs wird der 8266 durchaus an seine Grenzen kommen, der ESP32 schafft das aber locker.