Einzelne LED auf adressierbarem LED Streifen ansteuern

Hi,

ich möchte auf einem adressierbaren LED streifen einzelne LED ansteuern. Also gedacht ist das ganze als Status LED rot grün weiß oder ähnlich je nach Zustand der visualisiert werden soll.

Ich habe ein ESP32 Bord an dem ich auch schon einen adressierbaren LED Strip mit Neopixelbus ans laufen bekommen.

Jetzt wäre die Frage ob das einfach möglich ist?
Ich bin neu in der ganzen ESP Welt und versuche gerade zu lernen…

Suche hat mir bis jetzt noch nicht geholfen. Auf ESP Home gibt es zwar schon ein beispiel:

Das sieht dort so aus:

on_...:
  - light.addressable_set:
      id: my_light
      range_from: 0
      range_to: 50
      red: 100%
      green: 0%
      blue: 0%

Und um festzulegen auf welchem Pin der Stripo liegt brauch ich scheinbar noch den neopixelbus.

Das könnte dann so aussehen:


light:          
  - platform: neopixelbus
    name: "Addressable"
    id: addressable
    pin: GPIO21
    num_leds: 6
    variant: WS2812x
    type: GRB

on_turn_on:
   - light.addressable_set:
       id: addressable
       range_from: 0
       range_to: 1
       color_brightness: 100%
       red: 100%
       green: 50%
       blue: 0%

Soweit so gut.
Wenn ich den code so nutze sagt mir ESP Home das on_turn_on nicht bekannt ist.

Also brauch ich noch einen template Button damit ich das über HomeAssistant auslösen kann?
Hier komme ich irgendwie nicht weiter…
Habe zwar schon einen Template button angelegt aber verstehe nicht ganz wie man nun noch festlegt das er das light.adressable_set aktiviert.
Vielleicht kann mir hier jemand etwas helfen?

Ich kenne Neopixelbus nicht. Auf meinen esp läuft WLED https://install.wled.me/
Und da kann man einzelne Segmente erstellen. Die dann auch einzeln von HA angesteuert werden können.

WLED kenne ich auch. Habe ich auch schon überlegt.
Dann wäre aber die Frage ob man auf dem ESP32 neben WLED auch noch andere Funktionen über ESPHome realisieren kann?
Ich möchte auch noch Schalter an den ESP als Sensoren anschließen.
Dachte halt das ganze könnte ich als „komplettpaket“ in der .yaml haben

Keine gute Lösung, getrennt macht die Sache einfacher

Ja aber wozu hat denn so ein Entwicklerbord mehrere Pins? Ich dachte jetzt schon das man da Eingänge nutzen kann und Ausgänge als Status LED nutzen kann?

Habs doch noch hinbekommen.
geht mit Light Partition — ESPHome

Falls es noch jemanden interessiert oder später mal noch braucht:

light:
  - platform: partition
    name: "Segment 1"
    segments:
      - id: addressable
        from: 0
        to: 0

  - platform: partition
    name: "Segment 2"
    segments:
      - id: addressable
        from: 1
        to: 1

  - platform: partition
    name: "Segment 3"
    segments:
      - id: addressable
        from: 2
        to: 2
         
  - platform: neopixelbus
    name: "Addressable"
    id: addressable
    pin: GPIO3
    num_leds: 3
    variant: WS2812x
    type: GRB
    internal: true

Screenshot 2024-03-05 223536

2 „Gefällt mir“

Hi,

soweit habe ich das heute auch hinbekommen.
Hat jemand jetzt noch eine Idee, wie man den einzelnen Segmenten eine default Helligkeit und/oder Farbe geben kann?
Ich habe aktuell einen SW2811 Streifen mit 8 LEDs.

So gehen die entsprechenden LEDs an, auch in der korrekten Farbe, jedoch ändert sich dies auf 100% Helligkeit und in die Farbe weiß, egal was eingestellt wurde.

light:
  - platform: neopixelbus
    type: GRB
    variant: WS2812
    id: light1
    pin: GPIO04
    num_leds: 8
    name: "NeoPixel Light 1"
    internal: true

  - platform: partition
    name: "Fenster_offen"
    segments:
      - id: light1
        from: 0
        to: 3
    on_turn_on:
    - light.addressable_set:
        id: light1
        range_from: 0
        range_to: 3
        red: 0%
        green: 30%
        blue: 0%

  - platform: partition        
    name: "Balkonlicht_an"
    segments:
      - id: light1
        from: 4
        to: 7
    on_turn_on:
    - light.addressable_set:
        id: light1
        range_from: 4
        range_to: 7
        red: 0%
        green: 60%
        blue: 0%

Wie kann ich die abändern? Oder woran kann es liegen, das die LEDs nicht grün bleiben?

Danke im Voraus für Vorschläge.

:crayon:by HarryP: Codezeilen formatiert (bitte immer über </> einbinden)

1 „Gefällt mir“

Kann es sein das hier noch 2 Leerzeichen fehlen?

Ich kenn mich mit den Codes aber leider auch nicht so gut aus :frowning:

Bei mir war das dann so ok da ich die restliche Ansteuerung der LED über HA mache?

Auch mit 2 Leerzeichen bleibt mein Problem bestehen.
Wie steuerst du die Farben und die Helligkeit der LED´s? Oder leuchten sie dann bei dir nur weiß?

Die einzelnen Segmente erscheinen dann als Licht in HA mit allen Steuermöglichkeiten:


Und in den Automationen kann man auch alles einstellen was das Herz begehrt:

Im Code hast du WS2812 stehen?

Das müsstest du vielleicht auch noch auf WS2811 (stimmt SW2811?) ändern

Schreibfehler von mir, es ist ein WS8212.
Das mit den Automatisierungen muß ich mir wohl noch einmal ansehen, ich habe da keine Auswahlfelder.
Ich habe die Automationen händisch erstellt, keine Vorlagen oder ähnliches genutzt.

Aber du müsstest ja dennoch unter den Steuerelementen im Gerät die Farbe ändern können?

Hi, hast Du das mit dem ungewollten Farbwechsel hinbekommen. Bei mir werden die LEDs erst rot dann wieder weiß.

Ich hatte anfangs Probleme mit störsignalen. Ist deine steuerleitung recht kurz? Meine ist einige Meter lang und ergibt somit wohl einen Widerstand der bisschen was rausfiltert… Es wird aber empfohlen ein 470 Ohm Widerstand vor die Datenleitung zu hängen.

Guck mal hier unter Schaltungsaufbau:

https://raydiy.de/neopixel-mit-arduino-und-esp32-der-led-streifen-ultra-guide/

Ich hatte glaube auch Probleme mit den Pins vom ESP Board. Das hatte bei mir glaube nicht mit allen richtig funktioniert.

Ich steuere einzelne LEDs über das Programmieren von Effekten an und ich habe einen ESPHome Service erstellt, über welchen ich die Effekte aufrufen kann:

  services:
    # Switch on Muell state light
    - service: set_active_muell_state_lights
      variables:
        stateNo : int
      then:
        - script.execute:
            id: reset_states_lights
        - script.wait: reset_states_lights
        - script.execute:
            id: set_state_Lights
            stateno: !lambda 'return stateNo;' 



# Example configuration entry
light:
  - platform: neopixelbus
    #RGB, RBG, GBR, BGR, BRG, RGB
    type: GRB
    variant: WS2812X
    #pin: D4, GPIO2 -für ESP8266 empfohlen
    pin: GPIO2
    num_leds: 60
    name: "Neopixel_WS2812B_60_Kueche"
    id: kueche_60_leds
    gamma_correct: 1.0


    effects:
      - flicker:
          name: Flicker Stronger
          alpha: 85%
          intensity: 6.5%  

      - addressable_lambda:
          name: ResetLights
          update_interval: 50ms
          lambda:
            for (int iPaintCnt = 0; iPaintCnt < it.size(); iPaintCnt++)
            {
              it[iPaintCnt] = esphome::Color::BLACK;
            }

      - addressable_lambda:
          name: BlaueTonne
          update_interval: 50ms
          lambda:
            for (int iPaintCnt = 0; iPaintCnt < it.size(); iPaintCnt+=10)
            {
              it[iPaintCnt] = ESPColor(0, 0, 255);
            }

      - addressable_lambda:
          name: GelberSack
          update_interval: 50ms
          lambda:
            for (int iPaintCnt = 2; iPaintCnt < it.size(); iPaintCnt+=10)
            {
              it[iPaintCnt] = ESPColor(255, 255, 0);
            }

      - addressable_lambda:
          name: Biotonne
          update_interval: 50ms
          lambda:
            for (int iPaintCnt = 4; iPaintCnt < it.size(); iPaintCnt+=10)
            {
              it[iPaintCnt] = ESPColor(0, 255, 0);
            }

      - addressable_lambda:
          name: Restmuell
          update_interval: 50ms
          lambda:
            for (int iPaintCnt = 6; iPaintCnt < it.size(); iPaintCnt+=10)
            {
              it[iPaintCnt] = ESPColor(255, 0, 0);
            }



script:
  - id: reset_states_lights
    mode: single
    then:
      - light.turn_on:
          id: kueche_60_leds
          effect: "ResetLights"
          brightness: 0.5
      - delay: 500 ms
      - light.turn_off: kueche_60_leds



 # Switching on a state light according to the given parameter
  - id: set_state_Lights
    mode: single
    parameters:
      statelightno: int
    then:
      - if:
          condition:
            lambda: return statelightno == 1;
          then:
            - light.turn_on:
                id: kueche_60_leds
                effect: "BlaueTonne"
                brightness: 0.5
...

Mann kann in so einem Effekt auch statische Variablen verwenden, welche sich den Wert vom letzten Durchlauf merken und es gibt auch eine Möglichkeit einen speziellen Initialisierungscode beim ersten Interval auszuführen:

      - addressable_lambda:
          name: Alarm2_RunningLights
          update_interval: 30ms
          lambda:
            static int iRestartRandomCnt = 0;
            static int iResetStartPos = 0;

            if(initial_run)
            {
              iRestartRandomCnt = 700;
              id(kueche_60_leds).remote_values.set_brightness(${MaxBrightnessFloat});

                for (int iPaintCnt = 0; iPaintCnt < it.size(); iPaintCnt++)
                {
                  it[iResetStartPos] = esphome::Color::BLACK;
                }
            }

            if (iRestartRandomCnt >= 600)
            {
		...