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;