# ===== LED Bar (WS2812B) ===== light: - platform: esp32_rmt_led_strip id: led_bar chipset: WS2812 rgb_order: GRB pin: ${led_pin} num_leds: ${led_num_leds} name: "Voice Satellite LEDs" default_transition_length: 200ms effects: - addressable_lambda: name: "Idle Breathe" update_interval: 50ms lambda: |- static float brightness = 0; static int direction = 1; brightness += direction * 0.02; if (brightness >= 1.0) { brightness = 1.0; direction = -1; } if (brightness <= 0.1) { brightness = 0.1; direction = 1; } for (int i = 0; i < it.size(); i++) { it[i] = Color(0, 0, (int)(40 * brightness)); } - addressable_lambda: name: "Listening Pulse" update_interval: 30ms lambda: |- static int pos = 0; pos = (pos + 1) % (it.size() * 2); for (int i = 0; i < it.size(); i++) { int dist = abs(pos - i); if (pos >= it.size()) dist = abs((it.size() * 2 - pos) - i); int bright = max(0, 255 - dist * 60); it[i] = Color(0, bright, bright); } - addressable_lambda: name: "Processing" update_interval: 80ms lambda: |- static int offset = 0; offset = (offset + 1) % it.size(); for (int i = 0; i < it.size(); i++) { if ((i + offset) % 2 == 0) { it[i] = Color(80, 0, 180); } else { it[i] = Color(0, 0, 0); } } - addressable_lambda: name: "Speaking" update_interval: 40ms lambda: |- static int wave = 0; wave = (wave + 1) % 16; for (int i = 0; i < it.size(); i++) { int bright = (sin((wave + i * 2) * 0.4) + 1) * 127; it[i] = Color(0, bright, 0); } - addressable_lambda: name: "Error Flash" update_interval: 100ms lambda: |- static bool on = false; on = !on; for (int i = 0; i < it.size(); i++) { it[i] = on ? Color(255, 0, 0) : Color(0, 0, 0); }