ESPHome Programmablauf

Hallo

Ich möchte mit einem ESP32 einen WS2812b Stripe steuern.
Ich bekomnme das auch grundsätzlich zum laufen aber nicht wie ich das gerne hätte.

Ich möchte das beim einschalten des ESP dieser nach dem booten 4 segmnente des Stripes an schaltet und sagen wir mal alle 10 Sekunden die ändert.

Ich bekomme per “partition” die 4 Segmente hin un d ich bekomme auch hin die Segmente unterschiedlich mit RGB-Werten zu versorgen.

Was noch nicht klappt ist das einschalten der Segmente nach dem boot. das habe ich probiert mit

on_boot:

Aber der Stripe bleibt aus bis ich über seine Steuerelemente auf seiner WEB-Site eine Aktion vornehme.

Und mit einem

on_loop:

habe ich es nicht hin bekommen das ein Farbwechsel alle 10 Sekunden statt findet.

Ist ESPHome für sowas zu “starr” oder bekommt man das hin?
Würde mich freuen wenn jemand helfen kann.

lg und Danke

Man kann jegliche Art von Animation programmieren. Poste mal Deinen yaml Code.

Hallo Lutz.

Bin jetzt etwas weiter gekommen. Der ESP hängt zusammen mit dem Stripe an einem Netzteil und war vom ersten flashen zusätzlich am Rechner per USB angeschlossen - das hat wohl Probleme gemacht.

Jetzt startet das Teil wie es soll und die Segmente werden auch eingeschaltet in der gewünschten Farbe und Helligketi.

Wenn ich es richtig gelesen habe müsste ich mir jetzt per “Lambda Effect” meinen gewünschten Farbwechsel programmieren und dann diesen “Effect” starten - richtig ?

lg und Danke

hier der Code

esphome:
  name: logo
  friendly_name: Logo
  min_version: 2024.11.0
  name_add_mac_suffix: false
  on_boot:
    priority: 100.0
    then:
      - light.turn_on:
          id: seg1
          brightness: 55%
          red: 100%
          blue: 0%
          green: 0%
      - light.turn_on:
          id: seg2
          brightness: 55%
          red: 0%
          blue: 100%
          green: 0%
      - light.turn_on:
          id: seg3
          brightness: 55%
          red: 100%
          blue: 0%
          green: 0%
      - light.turn_on:
          id: seg4
          brightness: 55%
          red: 0%
          blue: 100%
          green: 0%
       
esp32:
  board: esp32doit-devkit-v1
  framework: 
    type: arduino

logger:

api:

ota:
- platform: esphome

improv_serial:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap: {}

captive_portal:

esp32_improv:
  authorizer: none

web_server:

light:
  - platform: neopixelbus
    name: "LOGO"
    id: LOGO
    pin: GPIO5
    num_leds: 6
    variant: ws2812x
    type: GRB
    internal: true
     
  - platform: partition
    name: "Segment 1"
    id: seg1
    internal: true
    segments:
      - id: LOGO
        from: 0
        to: 1
   
  - platform: partition
    name: "Segment 2"
    id: seg2
    internal: true
    segments:
      - id: LOGO
        from: 2
        to: 2
  
  - platform: partition
    name: "Segment 3"
    id: seg3
    internal: true
    segments:
      - id: LOGO
        from: 3
        to: 3
 
  - platform: partition
    name: "Segment 4"
    id: seg4
    internal: true
    segments:
      - id: LOGO
        from: 4
        to: 5

P.S. Habe extra alles als “internal” definiert da eine Steuerung von außen vorest nicht nötig ist.

Hallo, ich mache das komplett anders. Ich programmiere Lichteffekte und schalte diese Effekte dann ein/aus.
Ich habe mal ein Stück aus meinem Code kopiert. Ich hoffe, dass der fehlerfrei und lauffähig ist nach dem Schneiden.
Der Lichteffekt wird über einen Serviceaufruf “wz_progress_bar” mit dem Parameter “maxtimesec” gestartet. man könnte aber auch bei on_boot

        - script.execute:
            id: script_show_progress
            iTargetSec: !lambda 'return 254;'   

reinsetzen zu Starten.

Der Lichteffekt macht einen Countdown über die angegebene Zeit in Sekunden. Beim ersten Aufruf (if(initial_run)) wird alles Notwendige berechnet und alle LEDs auf rot gesetzt. Das Ändern der angezeigten Lichter wird alle 500 Millisekunden durchlaufen (update_interval: 500ms). Da ich nur 60 LEDs habe wird im initial_run zunächst berechnet wieviele LEDs für den Countdown verwendet werden müssen und wie oft jede LED blinken muss (bei 60 Sekunden schaltet jede von rot auf grün, bei 180 Sekunden ändert jede LED drei Mal die Farbe und blinkt zwischendurch blau).

Über “it[LED-Position] = ESPColor(Rotwert, Grünwert, Blauwert);” kann man jede beliebige Farbe an jeder Stelle setzen.

Anstelle vom beschriebene Effekt “effect: ProgressBar” könnte man auch andere Effekte z.B. “effect: Fast Rainbow Effect With Custom Values” aufrufen.

substitutions:
  MaxBrightnessFloat: '0.75' #'0.75'
  MidBrightnessFloat: '0.35' #'0.35'
  strMaxBrightness: '75%' #'75%'


globals:
  - id: i_progress_cnt   
    type: int
    restore_value: no 
    initial_value: '0'      


esphome:
  name: demolight
  friendly_name: demolight

  on_boot:
    then:
      - delay: 500 ms

esp8266:
  board: d1_mini

# Enable logging
logger:
   
ota:
  - platform: esphome
    password: !secret STECKDOSEN_WZ

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: !secret STECKDOSEN_WZ_FBACK
    password: !secret STECKDOSEN_WZ_WIFI_FBACK_PW

#removed to save memory
#captive_portal:

# Enable Home Assistant API
api:
  encryption:
    key: !secret STECKDOSEN_WZ_API_KEY

  services:
    #Service to show  (1 < maxtimesec <= 60) or switch off (maxtimesec==0) progress bar
    - service: wz_progress_bar
      variables:
        maxtimesec: int
      then: 
        - script.execute:
            id: script_show_progress
            iTargetSec: !lambda 'return maxtimesec;'   
          




light:
  - platform: neopixelbus
    #RGB, RBG, GBR, BGR, BRG, RGB
    type: GRB
    variant: WS2812X
    pin: GPIO2 #D4  -für ESP8266 empfohlen
    num_leds: 60
    name: "Neopixel_WS2812B_60_WZ"
    id: wz_60_leds
    gamma_correct: 1.0
    method:
      type: bit_bang 


#******************* Start of light effects ********************************************
    effects:
      - addressable_rainbow:
      - addressable_rainbow:
          name: Rainbow Effect With Custom Values
          speed: 10
          width: 60
      - addressable_rainbow:
          name: Fast Rainbow Effect With Custom Values
          speed: 60
          width: 60
      - addressable_fireworks:
          name: Fireworks Effect With Custom Values
          update_interval: 32ms
          spark_probability: 15%
          use_random_color: true
          fade_out_rate: 120
      - pulse:
          name: "Fast Pulse LL"
          transition_length: 0.1s
          update_interval: 0.2s
          min_brightness: 0%
          max_brightness: ${strMaxBrightness} #90%

      - addressable_lambda:
          name: ProgressBar
          update_interval: 500ms
          lambda:
            static int iMaxPosCnt = 2;
            static int iLedPos = 0;
            static int iMaxLedPos = 59;
            static int iMaxRepeatCnt = 2;
            static int iPosCnt = 0;
            static bool bToggel = true;

            if(initial_run)
            {
              iLedPos = 0;
              id(wz_60_leds).remote_values.set_brightness(${MidBrightnessFloat});

              if (id(max_progress_sec) > 60)
              {
                iMaxRepeatCnt = (id(max_progress_sec) / 60) + 1;
                iMaxPosCnt = iMaxRepeatCnt *2;
                iMaxLedPos = id(max_progress_sec) / iMaxRepeatCnt;
                if (id(max_progress_sec) % iMaxPosCnt > 0)
                {
                  iMaxLedPos++;
                }
                
                ESP_LOGD("ProgressBar", "Maximum displayed time is %i seconds => MaxLeds=%i, iMaxRepeatCnt=%i, iMaxPosCnt=%i", id(max_progress_sec), iMaxLedPos, iMaxRepeatCnt, iMaxPosCnt);
              }
              else
              {
                iMaxLedPos = id(max_progress_sec)-1;
                iMaxPosCnt =  2;
                iMaxRepeatCnt = 1;
                ESP_LOGD("ProgressBar", "Maximum displayed time is %i seconds => MaxLeds=%i, iMaxRepeatCnt=%i, iMaxPosCnt=%i", id(max_progress_sec), iMaxLedPos, iMaxRepeatCnt, iMaxPosCnt);
              }

              it.all() = Color::BLACK;
              it.range(0, iMaxLedPos) = ESPColor(255, 0, 0);
            }

            if (iLedPos < 60)
            {
              if (bToggel == true)
              {
                it[iLedPos] = ESPColor(0, 0, 255);
                bToggel = false;
              } 
              else
              {
                it[iLedPos] = ESPColor(0, 255, 0);
                bToggel = true;
              }   

              iPosCnt++;
              if (iPosCnt >= iMaxPosCnt)
              {
                iPosCnt = 0;
                it[iLedPos] = ESPColor(0, 255, 0);
                iLedPos ++;
              }
            }
            else
            {
               iLedPos = 0;
            }



#**************************************************************END of Light effects ******************************





script:

  - id: script_show_progress
    mode: restart
    parameters:
      iTargetSec: int
    then:
      - if: 
          condition:
            lambda: |-
              if (iTargetSec > 0) {return true; } else {return false; }      
          then:  
            - lambda: id(max_progress_sec) = iTargetSec; 
            - logger.log:
                format: "Switching ON progress bar for %i seconds..."    
                args: [id(max_progress_sec)]
            - light.turn_on:
                id: wz_60_leds
                effect: ProgressBar
                brightness: 25%
            - lambda: id(i_progress_cnt) = 0;
            - while:
                condition:
                  and:
                    - lambda: "return iTargetSec > 0;"
                    - lambda: "return id(i_progress_cnt) < iTargetSec;"
                then:
                  - lambda: id(i_progress_cnt) += 1; 
                  - delay: 1000ms
            - logger.log: "Progress bar cmpleted"
            - light.turn_off: wz_60_leds
          else:
            - logger.log: "Switching OFF Progress bar"
            - light.turn_off: wz_60_leds
            - lambda: id(max_progress_sec) = 0; 



Also ich würde das über WLED ansteuern, da gibt es auch eine gute Integration.

Kann mir jemand sagen wieso ich diese Meldung kriege