Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. WS2812b einzeln steuern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

WS2812b einzeln steuern

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
36 Beiträge 6 Kommentatoren 3.7k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • geschildG geschild

    @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 ?

    T Nicht stören
    T Nicht stören
    ticaki
    schrieb am zuletzt editiert von ticaki
    #16

    @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

    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

    Spenden

    1 Antwort Letzte Antwort
    0
    • geschildG geschild

      @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.

      W Offline
      W Offline
      Worlik
      schrieb am zuletzt editiert von Worlik
      #17

      @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.

      T 1 Antwort Letzte Antwort
      0
      • W Worlik

        @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.

        T Nicht stören
        T Nicht stören
        ticaki
        schrieb am zuletzt editiert von ticaki
        #18

        @worlik

        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.

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        1 Antwort Letzte Antwort
        0
        • J Offline
          J Offline
          Jan1
          schrieb am zuletzt editiert von
          #19

          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?

          T L 2 Antworten Letzte Antwort
          0
          • J Jan1

            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?

            T Nicht stören
            T Nicht stören
            ticaki
            schrieb am zuletzt editiert von
            #20

            @jan1

            Meine Infos sind älter als 1 Jahre, aber AFAIK ging das damals nicht.

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            J 1 Antwort Letzte Antwort
            0
            • T ticaki

              @jan1

              Meine Infos sind älter als 1 Jahre, aber AFAIK ging das damals nicht.

              J Offline
              J Offline
              Jan1
              schrieb am zuletzt editiert von
              #21

              @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.

              W 1 Antwort Letzte Antwort
              0
              • J Jan1

                @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.

                W Offline
                W Offline
                Worlik
                schrieb am zuletzt editiert von
                #22

                @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/

                J 1 Antwort Letzte Antwort
                0
                • W Worlik

                  @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/

                  J Offline
                  J Offline
                  Jan1
                  schrieb am zuletzt editiert von
                  #23

                  @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

                  1 Antwort Letzte Antwort
                  0
                  • J Jan1

                    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?

                    L Offline
                    L Offline
                    Labersack
                    schrieb am zuletzt editiert von
                    #24

                    @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.

                    J 1 Antwort Letzte Antwort
                    0
                    • L Labersack

                      @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.

                      J Offline
                      J Offline
                      Jan1
                      schrieb am zuletzt editiert von
                      #25

                      @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.

                      L 2 Antworten Letzte Antwort
                      0
                      • J Jan1

                        @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.

                        L Offline
                        L Offline
                        Labersack
                        schrieb am zuletzt editiert von Labersack
                        #26

                        @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

                        SBC-NodeMCU-ESP32-01-1816667783.png

                        J 1 Antwort Letzte Antwort
                        0
                        • L Labersack

                          @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

                          SBC-NodeMCU-ESP32-01-1816667783.png

                          J Offline
                          J Offline
                          Jan1
                          schrieb am zuletzt editiert von
                          #27

                          @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 😉

                          L 1 Antwort Letzte Antwort
                          0
                          • J Jan1

                            @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.

                            L Offline
                            L Offline
                            Labersack
                            schrieb am zuletzt editiert von
                            #28

                            @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.

                            1 Antwort Letzte Antwort
                            0
                            • J Jan1

                              @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 😉

                              L Offline
                              L Offline
                              Labersack
                              schrieb am zuletzt editiert von Labersack
                              #29

                              @jan1 sagte in WS2812b einzeln steuern:

                              @labersack
                              Die WEMOS nerven auch etwas mit der blauen LED, was die 32er S2 mini nicht verbaut haben.

                              Die blaue LED kann dem Lötkolben nur wenige Sekunden standhalten... 😉
                              Ist für die Funktion nicht wichtig.
                              (Und für Ungeduldige: Auch ein Seitenschneider macht das Ding schnell dunkel.)

                              J 1 Antwort Letzte Antwort
                              0
                              • L Labersack

                                @jan1 sagte in WS2812b einzeln steuern:

                                @labersack
                                Die WEMOS nerven auch etwas mit der blauen LED, was die 32er S2 mini nicht verbaut haben.

                                Die blaue LED kann dem Lötkolben nur wenige Sekunden standhalten... 😉
                                Ist für die Funktion nicht wichtig.
                                (Und für Ungeduldige: Auch ein Seitenschneider macht das Ding schnell dunkel.)

                                J Offline
                                J Offline
                                Jan1
                                schrieb am zuletzt editiert von
                                #30

                                @labersack
                                ich weiß, aber wenn der bessere ESP den Mist erst gar nicht mit drauf hat, dann doch lieber gleich den.
                                Die ESP32 S2 mini laufen mittlerweile mit WLED. Hab mir aus Spaß dann noch die minimal ESP32 C3 bestellt, der Kamerad hat ein paar Probleme bei den Effekten und wie blöd, auch ne LED verbaut.

                                L 1 Antwort Letzte Antwort
                                0
                                • J Jan1

                                  @labersack
                                  ich weiß, aber wenn der bessere ESP den Mist erst gar nicht mit drauf hat, dann doch lieber gleich den.
                                  Die ESP32 S2 mini laufen mittlerweile mit WLED. Hab mir aus Spaß dann noch die minimal ESP32 C3 bestellt, der Kamerad hat ein paar Probleme bei den Effekten und wie blöd, auch ne LED verbaut.

                                  L Offline
                                  L Offline
                                  Labersack
                                  schrieb am zuletzt editiert von
                                  #31

                                  @jan1
                                  Komm jetzt langsam nicht mehr mit...

                                  @jan1 sagte in WS2812b einzeln steuern:

                                  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.

                                  Welche Hardware war denn das genau, die da in die Knie ging?

                                  J 1 Antwort Letzte Antwort
                                  0
                                  • L Labersack

                                    @jan1
                                    Komm jetzt langsam nicht mehr mit...

                                    @jan1 sagte in WS2812b einzeln steuern:

                                    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.

                                    Welche Hardware war denn das genau, die da in die Knie ging?

                                    J Offline
                                    J Offline
                                    Jan1
                                    schrieb am zuletzt editiert von
                                    #32

                                    @labersack
                                    War ein WEMOS D1 mini. Konnte aber nicht wirklich lange testen, da mir ja der Stecker geschmolzen ist und das ganze nur ein Testaufbau war. Eine Matrix alleine lief noch ganz passabel, aber bei 3 kann man schon nicht mehr wirklich von Effekten sprechen.

                                    L 1 Antwort Letzte Antwort
                                    0
                                    • J Jan1

                                      @labersack
                                      War ein WEMOS D1 mini. Konnte aber nicht wirklich lange testen, da mir ja der Stecker geschmolzen ist und das ganze nur ein Testaufbau war. Eine Matrix alleine lief noch ganz passabel, aber bei 3 kann man schon nicht mehr wirklich von Effekten sprechen.

                                      L Offline
                                      L Offline
                                      Labersack
                                      schrieb am zuletzt editiert von
                                      #33

                                      @jan1
                                      Der ist für ~600 LEDs natürlich wirklich zu schwach.
                                      Aber eine NodeMCU (mit ESP32, nicht ESP8266) kann das ohne Schwierigkeiten leisten, und es genügt ein GPIO dazu.

                                      1 Antwort Letzte Antwort
                                      0
                                      • W Offline
                                        W Offline
                                        Worlik
                                        schrieb am zuletzt editiert von Worlik
                                        #34

                                        Ich habe die Ansteuerung von WLED soweit fertig. Ich werde da für mich noch dran weiter schreiben (die user kommen bei mir dann beispielsweise aus Datenobjekten und angrenzende Streifen sollen LINKS und RECHTS vom gewünschten Punkt leuchten). Ich mache es aber hier für das Forum mal nicht noch komplizierter.

                                        @ticaki Die Zeile verstehe ich übrigens in deinem Skript nicht:

                                        p.push([0,0,0]) // die erste und letzte LED sind nicht sichtbar
                                        

                                        WLED scheint die weg zu ignorieren, zumindest macht es in meinem Test komischerweise keinen Unterschied - ich vermute das wird zu 0 und dann als Index interpretiert? Das Array i besteht entweder aus Farben oder aus Bereichen. Dabei wiederholen sich dann immer wieder 3 Werte: Startindex, Endindex (exklusiv) und Farbe (dieser entweder als Array oder als Hex-Code). Aber vielleicht bezieht sich das bei dir ja auch auf eine unsichtbare LED wegen der Bauweise deines Leuchtobjekts. 🙂 Ich nutze die Indizes zur Optimierung, um den Traffic zu reduzieren. In der Regel ist bei mir fast alles Schwarz, bis auf wenige LEDs. In der API-Dokumentation wird auch die Verwendung von hexadezimal Schreibweise für die Farben präferiert. Ich vermute das spart etwas traffic und WLED arbeitet vermutlich intern auch mit den Hex Zahlen. Geht aber natürlich beides.

                                        So sind die Segmente bei mir in WLED konfiguriert:
                                        Bild_2023-11-28_103225570.png

                                        // Hier können alle WLED Instanzen und die entsprechenden Segmente einmal mit Namen versehen werden. Wenn für einen Namen mehrere LEDs leuchten sollen, kann der Name beliebig oft wiederholt werden, dann gehen alle LEDs mit dem entsprechenden Namen an.
                                        let instances = [
                                            {
                                                id: 'wled.0.a0b765587278', 
                                                segments: [
                                                    ['AA01', 'AA02', 'AA03', 'AA04', 'AA05', 'AA06', 'AA07', 'AA08', 'AA09', 'AA10', 'AA11', 'AA12', 'AA13', 'AA14', 'AA15', 'AA16', 'AA17', 'AA18', 'AA19', 'AA20', 'AA21'],
                                                    ['AB01', 'AB02', 'AB03', 'AB04', 'AB05', 'AB06', 'AB07', 'AB08', 'AB09', 'AB10', 'AB11', 'AB12', 'AB13', 'AB14', 'AB15', 'AB16', 'AB17', 'AB18', 'AB19', 'AB20'],
                                                    ['AC01', 'AC02', 'AC03', 'AC04', 'AC05', 'AC06', 'AC07', 'AC08', 'AC09', 'AC10', 'AC11', 'AC12', 'AC13', 'AC14', 'AC15', 'AC16', 'AC17', 'AC18', 'AC19', 'AC20'],
                                                    ['AD01', 'AD02', 'AD03', 'AD04', 'AD05', 'AD06', 'AD07', 'AD08', 'A109', 'AD10', 'AD11', 'AD12', 'AD13', 'AD14', 'AD15', 'AD16', 'AD17', 'AD18', 'AD19', 'AD20', 'AD21'],
                                                ]
                                            },
                                        ];
                                        
                                        // Das Objekt hier könnte man vorab mit Datenobjekten füllen. Jeder User hat eine eigene Farbe. Die Farben werden "gemischt", wenn zwei User gleichzeitig LEDs aktivieren.
                                        let users = {
                                            person1: {
                                                color: 'ff0000',
                                                storage: 'AB03',
                                            },
                                            person2: {
                                                color: '00ff00',
                                                storage: 'AC01',
                                            }
                                        };
                                        
                                        // -------------------------------------------------------------------------------------------------------------------
                                        
                                        function hexToRgb(h) {
                                            return [
                                                Number('0x' + h[0] + h[1]) | 0, 
                                                Number('0x' + h[2] + h[3]) | 0,
                                                Number('0x' + h[4] + h[5]) | 0
                                            ];
                                        }
                                        
                                        function rgbToHex(r, g, b) {
                                            return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
                                        }
                                        
                                        function avgHex(h1, h2) {
                                            let a = hexToRgb(h1);
                                            let b = hexToRgb(h2);
                                            
                                            return rgbToHex(
                                                ~~((a[0] + b[0]) / 2), 
                                                ~~((a[1] + b[1]) / 2), 
                                                ~~((a[2] + b[2]) / 2)
                                            );
                                        }
                                        
                                        function getActiveLights(users) {
                                            let activeLights = {};
                                        
                                            for(const [username, opts] of Object.entries(users)) {
                                                if(activeLights[opts.storage])
                                                    activeLights[opts.storage] = avgHex(activeLights[opts.storage], opts.color);
                                                else
                                                    activeLights[opts.storage] = opts.color;
                                            }
                                        
                                            return activeLights;
                                        }
                                        
                                        function initInstances() {
                                            for(let s = 0; s < instances.length; s++) {
                                                instances[s]['name'] = getState(instances[s]['id'] + '._info.name').val;
                                                instances[s]['ipAddress'] = getState(instances[s]['id'] + '._info.ip').val;
                                            }
                                        
                                            resetInstancesData();
                                        }
                                        
                                        function resetInstancesData() {
                                            for(let s = 0; s < instances.length; s++) {
                                                instances[s]['data'] = {
                                                    bri: 255,
                                                    seg: [],
                                                };
                                            }
                                        }
                                        
                                        function updateInstancesData() {
                                            let activeLights = getActiveLights(users);
                                        
                                            resetInstancesData();
                                        
                                            for(let s = 0; s < instances.length; s++) {
                                                for(let sl = 0; sl < instances[s].segments.length; sl++) {
                                                    let i = [];
                                                    
                                                    for(let led = 0; led < instances[s].segments[sl].length; led++) {
                                                        if(activeLights[instances[s].segments[sl][led]])
                                                            i.push(activeLights[instances[s].segments[sl][led]]);
                                                        else
                                                            i.push('000000');
                                                    }
                                        
                                                    instances[s].data.seg.push({i: i});
                                                }
                                            }
                                        }
                                        
                                        // Optimiert die Daten so, dass gleiche Farben in Farbbereiche zusammengefasst werden und reduziert so den Traffic zu den WLED Instanzen:
                                        function optimizeInstancesData() {
                                            for(let s = 0; s < instances.length; s++) {
                                                if(!instances[s].data.seg)
                                                    continue;
                                        
                                                for(let sg = 0; sg < instances[s].data.seg.length; sg++) {
                                                    if(!instances[s].data.seg[sg].i)
                                                        continue;
                                        
                                                    let oldI = instances[s].data.seg[sg].i;
                                        
                                                    if(oldI && oldI.length > 0 && typeof oldI[0] !== 'number') {
                                                        let optI = [0, 1, oldI[0]];
                                                        
                                                        for(let k = 1; k < oldI.length; k++) {
                                                            if(optI[optI.length - 1] == oldI[k])
                                                                optI[optI.length - 2]++;
                                                            else {
                                                                let idx = optI[optI.length - 2];
                                                                
                                                                optI.push(idx);
                                                                optI.push(idx + 1);
                                                                optI.push(oldI[k]);
                                                            }
                                                        }
                                        
                                                        instances[s].data.seg[sg].i = optI;
                                                    }
                                                }
                                            }
                                        }
                                        
                                        async function submitInstancesData() {
                                            optimizeInstancesData();
                                        
                                            for(let s = 0; s < instances.length; s++) {
                                                try {
                                                    let {data} = await axios.post(
                                                        'http://' + instances[s].ipAddress + '/json',
                                                        instances[s].data, { 
                                                            headers: {
                                                                'Content-Type': 'application/json'
                                                            }
                                                        }
                                                    )
                                        
                                                    if(data.success === true)
                                                        console.log('Daten wurden zu WLED Instanz "' + instances[s].name + '" übertragen.');
                                                    else
                                                        console.error('Die WLED Instanz "' + instances[s].name + '" hat die Daten abgelehnt: ' + JSON.stringify(data));
                                                } 
                                                catch(error) {
                                                    console.error('WLED Instanz "' + instances[s].name + '" ist nicht erreichbar: ' + error);
                                                }
                                            }
                                        }
                                        
                                        // -------------------------------------------------------------------------------------------------------------------
                                        
                                        const axios = require('axios');
                                        
                                        initInstances();
                                        updateInstancesData();
                                        submitInstancesData();
                                        
                                        
                                        T 1 Antwort Letzte Antwort
                                        0
                                        • W Worlik

                                          Ich habe die Ansteuerung von WLED soweit fertig. Ich werde da für mich noch dran weiter schreiben (die user kommen bei mir dann beispielsweise aus Datenobjekten und angrenzende Streifen sollen LINKS und RECHTS vom gewünschten Punkt leuchten). Ich mache es aber hier für das Forum mal nicht noch komplizierter.

                                          @ticaki Die Zeile verstehe ich übrigens in deinem Skript nicht:

                                          p.push([0,0,0]) // die erste und letzte LED sind nicht sichtbar
                                          

                                          WLED scheint die weg zu ignorieren, zumindest macht es in meinem Test komischerweise keinen Unterschied - ich vermute das wird zu 0 und dann als Index interpretiert? Das Array i besteht entweder aus Farben oder aus Bereichen. Dabei wiederholen sich dann immer wieder 3 Werte: Startindex, Endindex (exklusiv) und Farbe (dieser entweder als Array oder als Hex-Code). Aber vielleicht bezieht sich das bei dir ja auch auf eine unsichtbare LED wegen der Bauweise deines Leuchtobjekts. 🙂 Ich nutze die Indizes zur Optimierung, um den Traffic zu reduzieren. In der Regel ist bei mir fast alles Schwarz, bis auf wenige LEDs. In der API-Dokumentation wird auch die Verwendung von hexadezimal Schreibweise für die Farben präferiert. Ich vermute das spart etwas traffic und WLED arbeitet vermutlich intern auch mit den Hex Zahlen. Geht aber natürlich beides.

                                          So sind die Segmente bei mir in WLED konfiguriert:
                                          Bild_2023-11-28_103225570.png

                                          // Hier können alle WLED Instanzen und die entsprechenden Segmente einmal mit Namen versehen werden. Wenn für einen Namen mehrere LEDs leuchten sollen, kann der Name beliebig oft wiederholt werden, dann gehen alle LEDs mit dem entsprechenden Namen an.
                                          let instances = [
                                              {
                                                  id: 'wled.0.a0b765587278', 
                                                  segments: [
                                                      ['AA01', 'AA02', 'AA03', 'AA04', 'AA05', 'AA06', 'AA07', 'AA08', 'AA09', 'AA10', 'AA11', 'AA12', 'AA13', 'AA14', 'AA15', 'AA16', 'AA17', 'AA18', 'AA19', 'AA20', 'AA21'],
                                                      ['AB01', 'AB02', 'AB03', 'AB04', 'AB05', 'AB06', 'AB07', 'AB08', 'AB09', 'AB10', 'AB11', 'AB12', 'AB13', 'AB14', 'AB15', 'AB16', 'AB17', 'AB18', 'AB19', 'AB20'],
                                                      ['AC01', 'AC02', 'AC03', 'AC04', 'AC05', 'AC06', 'AC07', 'AC08', 'AC09', 'AC10', 'AC11', 'AC12', 'AC13', 'AC14', 'AC15', 'AC16', 'AC17', 'AC18', 'AC19', 'AC20'],
                                                      ['AD01', 'AD02', 'AD03', 'AD04', 'AD05', 'AD06', 'AD07', 'AD08', 'A109', 'AD10', 'AD11', 'AD12', 'AD13', 'AD14', 'AD15', 'AD16', 'AD17', 'AD18', 'AD19', 'AD20', 'AD21'],
                                                  ]
                                              },
                                          ];
                                          
                                          // Das Objekt hier könnte man vorab mit Datenobjekten füllen. Jeder User hat eine eigene Farbe. Die Farben werden "gemischt", wenn zwei User gleichzeitig LEDs aktivieren.
                                          let users = {
                                              person1: {
                                                  color: 'ff0000',
                                                  storage: 'AB03',
                                              },
                                              person2: {
                                                  color: '00ff00',
                                                  storage: 'AC01',
                                              }
                                          };
                                          
                                          // -------------------------------------------------------------------------------------------------------------------
                                          
                                          function hexToRgb(h) {
                                              return [
                                                  Number('0x' + h[0] + h[1]) | 0, 
                                                  Number('0x' + h[2] + h[3]) | 0,
                                                  Number('0x' + h[4] + h[5]) | 0
                                              ];
                                          }
                                          
                                          function rgbToHex(r, g, b) {
                                              return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
                                          }
                                          
                                          function avgHex(h1, h2) {
                                              let a = hexToRgb(h1);
                                              let b = hexToRgb(h2);
                                              
                                              return rgbToHex(
                                                  ~~((a[0] + b[0]) / 2), 
                                                  ~~((a[1] + b[1]) / 2), 
                                                  ~~((a[2] + b[2]) / 2)
                                              );
                                          }
                                          
                                          function getActiveLights(users) {
                                              let activeLights = {};
                                          
                                              for(const [username, opts] of Object.entries(users)) {
                                                  if(activeLights[opts.storage])
                                                      activeLights[opts.storage] = avgHex(activeLights[opts.storage], opts.color);
                                                  else
                                                      activeLights[opts.storage] = opts.color;
                                              }
                                          
                                              return activeLights;
                                          }
                                          
                                          function initInstances() {
                                              for(let s = 0; s < instances.length; s++) {
                                                  instances[s]['name'] = getState(instances[s]['id'] + '._info.name').val;
                                                  instances[s]['ipAddress'] = getState(instances[s]['id'] + '._info.ip').val;
                                              }
                                          
                                              resetInstancesData();
                                          }
                                          
                                          function resetInstancesData() {
                                              for(let s = 0; s < instances.length; s++) {
                                                  instances[s]['data'] = {
                                                      bri: 255,
                                                      seg: [],
                                                  };
                                              }
                                          }
                                          
                                          function updateInstancesData() {
                                              let activeLights = getActiveLights(users);
                                          
                                              resetInstancesData();
                                          
                                              for(let s = 0; s < instances.length; s++) {
                                                  for(let sl = 0; sl < instances[s].segments.length; sl++) {
                                                      let i = [];
                                                      
                                                      for(let led = 0; led < instances[s].segments[sl].length; led++) {
                                                          if(activeLights[instances[s].segments[sl][led]])
                                                              i.push(activeLights[instances[s].segments[sl][led]]);
                                                          else
                                                              i.push('000000');
                                                      }
                                          
                                                      instances[s].data.seg.push({i: i});
                                                  }
                                              }
                                          }
                                          
                                          // Optimiert die Daten so, dass gleiche Farben in Farbbereiche zusammengefasst werden und reduziert so den Traffic zu den WLED Instanzen:
                                          function optimizeInstancesData() {
                                              for(let s = 0; s < instances.length; s++) {
                                                  if(!instances[s].data.seg)
                                                      continue;
                                          
                                                  for(let sg = 0; sg < instances[s].data.seg.length; sg++) {
                                                      if(!instances[s].data.seg[sg].i)
                                                          continue;
                                          
                                                      let oldI = instances[s].data.seg[sg].i;
                                          
                                                      if(oldI && oldI.length > 0 && typeof oldI[0] !== 'number') {
                                                          let optI = [0, 1, oldI[0]];
                                                          
                                                          for(let k = 1; k < oldI.length; k++) {
                                                              if(optI[optI.length - 1] == oldI[k])
                                                                  optI[optI.length - 2]++;
                                                              else {
                                                                  let idx = optI[optI.length - 2];
                                                                  
                                                                  optI.push(idx);
                                                                  optI.push(idx + 1);
                                                                  optI.push(oldI[k]);
                                                              }
                                                          }
                                          
                                                          instances[s].data.seg[sg].i = optI;
                                                      }
                                                  }
                                              }
                                          }
                                          
                                          async function submitInstancesData() {
                                              optimizeInstancesData();
                                          
                                              for(let s = 0; s < instances.length; s++) {
                                                  try {
                                                      let {data} = await axios.post(
                                                          'http://' + instances[s].ipAddress + '/json',
                                                          instances[s].data, { 
                                                              headers: {
                                                                  'Content-Type': 'application/json'
                                                              }
                                                          }
                                                      )
                                          
                                                      if(data.success === true)
                                                          console.log('Daten wurden zu WLED Instanz "' + instances[s].name + '" übertragen.');
                                                      else
                                                          console.error('Die WLED Instanz "' + instances[s].name + '" hat die Daten abgelehnt: ' + JSON.stringify(data));
                                                  } 
                                                  catch(error) {
                                                      console.error('WLED Instanz "' + instances[s].name + '" ist nicht erreichbar: ' + error);
                                                  }
                                              }
                                          }
                                          
                                          // -------------------------------------------------------------------------------------------------------------------
                                          
                                          const axios = require('axios');
                                          
                                          initInstances();
                                          updateInstancesData();
                                          submitInstancesData();
                                          
                                          
                                          T Nicht stören
                                          T Nicht stören
                                          ticaki
                                          schrieb am zuletzt editiert von ticaki
                                          #35

                                          @worlik

                                          Bei mir ist es so das die erste und letzte LED unterhalb der Fräsung sitzen, und deshalb nicht angesteuert werden.

                                          Über den Traffic hab ich mir keine gedanken gemacht, das ist unter 1kb alle 3 sekunden. Wenn ich den Wled mit Hyperion verbinde sind es die gleichen Daten nur 30-50 mal in der Sekunde.

                                          EDIT: Link damit man weiß was ich meine https://docs.hyperion-project.org/de/user/leddevices/network/wled.html

                                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                          Spenden

                                          W 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          751

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe