Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. WS2812b einzeln steuern

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    WS2812b einzeln steuern

    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      Worlik last edited by Worlik

      Hallo,

      ich würde für ein Projekt gerne via iobroker einzelnes WS2812b einzeln ansteuern. Die LEDs hängen dabei hinter einem ESP32.

      Ich habe über die WLED Firmware leider ja nur die Möglichkeit für jede einzelne LED ein Segment anzulegen, um dieses Segment dann entsprechend über den WLED Adapter in iobroker anzusteuern. Das ist grundsätzlich kein Problem und ich habe hier auch schon ein paar Streifen entsprechend eingebunden.

      Für das neue Projekt geht explizit nicht um eine "Lightshow", sondern eher um das ausschalten einzelner LED und das einschalten einer anderen in einer bestimmten Farbe. Dabei reicht mir die Kombination AUS/EIN in einem Interval von 1s - schneller geht natürlich immer. Es geht insgesamt um 360 LED und ich möchte ungern 360 Segmente in WLED anlegen.

      Gibt es eine alternative empfohlene Firmware oder kann ich das händisch bewerkstelligen? Es geht nur um den Teil Software. Hardware ist kein Problem.

      geschild 1 Reply Last reply Reply Quote 0
      • geschild
        geschild @Worlik last edited by

        @worlik said in WS2812b einzeln steuern:

        WLED Firmware

        Kannst du z.B. mit arduino etwas selber programmieren ? Da könnte ich dir helfen.

        1 Reply Last reply Reply Quote 0
        • W
          Worlik last edited by

          @geschild Das sollte gehen, wird dann insgesamt halt ein bisschen Handarbeit. Steuern soll der iobroker, dann bräuchte ich noch eine einfache Rest-Api oder so auf dem ESP mit 2 Kommandos (An/Aus oder welche LED mit welchen Parametern eingeschaltet werden soll). Falls du hilfreichen Code fürs schalten oder Api hast, würde ich mich freuen.

          MartinP 1 Reply Last reply Reply Quote 0
          • MartinP
            MartinP @Worlik last edited by

            @worlik Das wird aber ein Grab von Datenpunkten, wenn man an einem meterlangen LED-Strip jede LED straightforward einzeln ansteuerbar machen will....

            Datenpunkt-sparsame Lösungen sind dann nach meinem Bauchgefühl immer Frickelei... z.B ein kombinierter Adress/Farb-Datenpunkt, in den man einen Farbwert und eine LED-Adresse hineinschreibt, z. B. LED 100 auf R=FF, G=0; B=0 setzen => "100:FF0000" in den Datenpunkt schreiben ...

            W 1 Reply Last reply Reply Quote 0
            • W
              Worlik @MartinP last edited by

              @martinp Möglicherweise fehlt mir ja Wissen zum Datenprotokoll von WS2812b. Für die einzelne Ansteuerung müsste es doch bestimmt eine Library geben. Es gibt doch auch Leute, welche sich zum Beispiel einen Plan vom Haus machen, wo dann symbolisch LEDs für eingeschaltete Geräte an gehen.

              Die einzelnen Programme der WLED Firmware sind doch sicherlich nicht auf den LEDs selbst hinterlegt, sondern in der Firmware.

              Eine entsprechende benamte Liste jeder LED lässt sich ja aber relativ einfach generieren.

              geschild 1 Reply Last reply Reply Quote 0
              • geschild
                geschild @Worlik last edited by geschild

                @MartinP @worlik Ich hab schon WS2812 mit arduino programmiert (Wortuhr zum Beispiel 121 Led). Ist kein Problem. Ich mach mal ein Musterprogramm.

                W 1 Reply Last reply Reply Quote 0
                • W
                  Worlik @geschild last edited by

                  @geschild Das ist lieb. Muss nichts aufwändiges sein, hauptsache man sieht wie es geht. Weißt du noch welche Librarys du verwendet hast?

                  geschild 1 Reply Last reply Reply Quote 0
                  • geschild
                    geschild @Worlik last edited by

                    @worlik Library = Adafruit_NeoPixel.
                    Um Mehrfacharbeit zu vermeiden, schick mir deine Tel.Nummer an gerd55schild@gmail.com oder schick mir nur eine Email und ich gebe dir meine Rufnummer.

                    W 1 Reply Last reply Reply Quote 0
                    • W
                      Worlik @geschild last edited by

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

                      geschild 1 Reply Last reply Reply Quote 0
                      • geschild
                        geschild @Worlik last edited by geschild

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

                        1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer last edited by ticaki

                          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)
                          
                              }
                          
                          W geschild 2 Replies Last reply Reply Quote 0
                          • W
                            Worlik @ticaki last edited by

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

                            T 1 Reply Last reply Reply Quote 0
                            • T
                              ticaki Developer @Worlik last edited by ticaki

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

                              1CF9BC61-6F5D-4D39-A5A4-69EE0473E879.jpeg

                              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.

                              1 Reply Last reply Reply Quote 0
                              • geschild
                                geschild last edited by 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 1 Reply Last reply Reply Quote 0
                                • geschild
                                  geschild @ticaki last edited by

                                  @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 1 Reply Last reply Reply Quote 0
                                  • T
                                    ticaki Developer @geschild last edited by ticaki

                                    @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

                                    1 Reply Last reply Reply Quote 0
                                    • W
                                      Worlik @geschild last edited by 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 1 Reply Last reply Reply Quote 0
                                      • T
                                        ticaki Developer @Worlik last edited by ticaki

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

                                        1 Reply Last reply Reply Quote 0
                                        • J
                                          Jan1 last edited by

                                          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 Replies Last reply Reply Quote 0
                                          • T
                                            ticaki Developer @Jan1 last edited by

                                            @jan1

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

                                            J 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            1.0k
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            36
                                            1877
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo