Last active
January 26, 2026 17:42
-
-
Save Anashost/af40136333f5b8e0f4edf5c6df52b011 to your computer and use it in GitHub Desktop.
WLED Notification – Home Assistant Blueprint Turn a WLED strip into a smart notifier: each segment shows custom colors, effects, and brightness for different events, then automatically returns to its original state or a default preset when notifications clear.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| blueprint: | |
| name: WLED Segmented Notifications | |
| description: >- | |
| Control up to 4 segments on a single WLED strip for independent notifications. | |
| domain: automation | |
| input: | |
| wled_device: | |
| name: WLED Light Entity | |
| selector: | |
| entity: | |
| integration: wled | |
| domain: light | |
| notification_preset_name: | |
| name: Notification Preset Name | |
| default: "HA Notify" | |
| selector: | |
| text: | |
| default_preset_name: | |
| name: Default Preset Name | |
| default: "Default" | |
| selector: | |
| text: | |
| number_of_segments: | |
| name: Number of Notification Segments to Use | |
| selector: | |
| select: | |
| options: | |
| - label: "1 Segment" | |
| value: "1" | |
| - label: "2 Segments" | |
| value: "2" | |
| - label: "3 Segments" | |
| value: "3" | |
| - label: "4 Segments" | |
| value: "4" | |
| default: "1" | |
| # Segment inputs | |
| trigger_1: | |
| name: Segment 1 Trigger Entity | |
| selector: | |
| entity: | |
| color_1: | |
| name: Segment 1 Color | |
| selector: | |
| color_rgb: | |
| default: [255, 0, 0] | |
| effect_1: | |
| name: Segment 1 Effect | |
| selector: | |
| text: | |
| default: "Solid" | |
| speed_1: | |
| name: Segment 1 Effect Speed | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| intensity_1: | |
| name: Segment 1 Effect Intensity | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| brightness_1: | |
| name: Segment 1 Brightness | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 255 | |
| trigger_2: | |
| name: Segment 2 Trigger Entity | |
| selector: | |
| entity: | |
| color_2: | |
| name: Segment 2 Color | |
| selector: | |
| color_rgb: | |
| default: [0, 0, 255] | |
| effect_2: | |
| name: Segment 2 Effect | |
| selector: | |
| text: | |
| default: "Blink" | |
| speed_2: | |
| name: Segment 2 Effect Speed | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| intensity_2: | |
| name: Segment 2 Effect Intensity | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| brightness_2: | |
| name: Segment 2 Brightness | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 255 | |
| trigger_3: | |
| name: Segment 3 Trigger Entity | |
| selector: | |
| entity: | |
| color_3: | |
| name: Segment 3 Color | |
| selector: | |
| color_rgb: | |
| default: [0, 255, 0] | |
| effect_3: | |
| name: Segment 3 Effect | |
| selector: | |
| text: | |
| default: "Solid" | |
| speed_3: | |
| name: Segment 3 Effect Speed | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| intensity_3: | |
| name: Segment 3 Effect Intensity | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| brightness_3: | |
| name: Segment 3 Brightness | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 255 | |
| trigger_4: | |
| name: Segment 4 Trigger Entity | |
| selector: | |
| entity: | |
| color_4: | |
| name: Segment 4 Color | |
| selector: | |
| color_rgb: | |
| default: [255, 255, 0] | |
| effect_4: | |
| name: Segment 4 Effect | |
| selector: | |
| text: | |
| default: "Heartbeat" | |
| speed_4: | |
| name: Segment 4 Effect Speed | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| intensity_4: | |
| name: Segment 4 Effect Intensity | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 128 | |
| brightness_4: | |
| name: Segment 4 Brightness | |
| selector: | |
| number: | |
| min: 0 | |
| max: 255 | |
| step: 1 | |
| default: 255 | |
| mode: queued | |
| max_exceeded: silent | |
| variables: | |
| wled_entity: !input wled_device | |
| num_segments: !input number_of_segments | |
| notification_preset: !input notification_preset_name | |
| default_preset: !input default_preset_name | |
| trigger_1_entity: !input trigger_1 | |
| trigger_2_entity: !input trigger_2 | |
| trigger_3_entity: !input trigger_3 | |
| trigger_4_entity: !input trigger_4 | |
| wled_name: "{{ wled_entity.split('.')[1] }}" | |
| preset_select_entity: "select.{{ wled_name }}_preset" | |
| is_on: ['on', 'open', 'detected', 'home', 'unlocked'] | |
| trigger_1_active: "{{ (trigger_1_entity | default('')) != '' and states(trigger_1_entity) in is_on and num_segments | int >= 1 }}" | |
| trigger_2_active: "{{ (trigger_2_entity | default('')) != '' and states(trigger_2_entity) in is_on and num_segments | int >= 2 }}" | |
| trigger_3_active: "{{ (trigger_3_entity | default('')) != '' and states(trigger_3_entity) in is_on and num_segments | int >= 3 }}" | |
| trigger_4_active: "{{ (trigger_4_entity | default('')) != '' and states(trigger_4_entity) in is_on and num_segments | int >= 4 }}" | |
| any_notification_active: "{{ trigger_1_active or trigger_2_active or trigger_3_active or trigger_4_active }}" | |
| trigger: | |
| - platform: state | |
| entity_id: !input trigger_1 | |
| not_to: | |
| - unavailable | |
| - unknown | |
| for: "00:00:01" | |
| - platform: state | |
| entity_id: !input trigger_2 | |
| not_to: | |
| - unavailable | |
| - unknown | |
| for: "00:00:01" | |
| - platform: state | |
| entity_id: !input trigger_3 | |
| not_to: | |
| - unavailable | |
| - unknown | |
| for: "00:00:01" | |
| - platform: state | |
| entity_id: !input trigger_4 | |
| not_to: | |
| - unavailable | |
| - unknown | |
| for: "00:00:01" | |
| action: | |
| - choose: | |
| - conditions: | |
| - "{{ any_notification_active }}" | |
| sequence: | |
| - if: | |
| - "{{ states(preset_select_entity) != notification_preset }}" | |
| then: | |
| - choose: | |
| - conditions: | |
| - "{{ states('light.' ~ wled_name ~ '_segment_1') != 'on' and | |
| states('light.' ~ wled_name ~ '_segment_2') != 'on' and | |
| states('light.' ~ wled_name ~ '_segment_3') != 'on' and | |
| states('light.' ~ wled_name ~ '_segment_4') != 'on' }}" | |
| sequence: | |
| - service: scene.create | |
| data: | |
| scene_id: "wled_notification_snapshot_{{ wled_name }}" | |
| entities: | |
| "{{ wled_entity }}": | |
| state: "{{ states(wled_entity) }}" | |
| brightness: "{{ state_attr(wled_entity, 'brightness') | default(None) }}" | |
| effect: "{{ state_attr(wled_entity, 'effect') | default(None) }}" | |
| rgb_color: "{{ state_attr(wled_entity, 'rgb_color') | default(None) }}" | |
| hs_color: "{{ state_attr(wled_entity, 'hs_color') | default(None) }}" | |
| color_temp: "{{ state_attr(wled_entity, 'color_temp') | default(None) }}" | |
| xy_color: "{{ state_attr(wled_entity, 'xy_color') | default(None) }}" | |
| color_mode: "{{ state_attr(wled_entity, 'color_mode') | default(None) }}" | |
| white_value: "{{ state_attr(wled_entity, 'white_value') | default(None) }}" | |
| "{{ preset_select_entity }}": | |
| state: "{{ states(preset_select_entity) if states(preset_select_entity) not in ['unknown','unavailable'] else default_preset }}" | |
| - service: select.select_option | |
| target: | |
| entity_id: "{{ preset_select_entity }}" | |
| data: | |
| option: "{{ notification_preset }}" | |
| # Wait until preset selected (timeout 5s) - prefer to wait but continue if slow | |
| - wait_template: "{{ states(preset_select_entity) == notification_preset }}" | |
| timeout: "00:00:05" | |
| continue_on_timeout: true | |
| # small extra delay to let WLED create segments on device side | |
| - delay: { seconds: 0.6 } | |
| # SEGMENT 1 | |
| - if: | |
| - "{{ trigger_1_active }}" | |
| then: | |
| - service: light.turn_on | |
| data: | |
| rgb_color: !input color_1 | |
| effect: !input effect_1 | |
| brightness: !input brightness_1 | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_1" | |
| - delay: { seconds: 0.20 } | |
| # set intensity (segment-specific if available, else master) | |
| - service: number.set_value | |
| data: | |
| value: !input intensity_1 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_1_intensity' | |
| if states('number.' ~ wled_name ~ '_segment_1_intensity') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_intensity' }} | |
| - delay: { seconds: 0.05 } | |
| # set speed (segment-specific if available, else master) | |
| - service: number.set_value | |
| data: | |
| value: !input speed_1 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_1_speed' | |
| if states('number.' ~ wled_name ~ '_segment_1_speed') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_speed' }} | |
| - delay: { seconds: 0.10 } | |
| else: | |
| - service: light.turn_off | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_1" | |
| # SEGMENT 2 | |
| - if: | |
| - "{{ trigger_2_active }}" | |
| then: | |
| - service: light.turn_on | |
| data: | |
| rgb_color: !input color_2 | |
| effect: !input effect_2 | |
| brightness: !input brightness_2 | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_2" | |
| - delay: { seconds: 0.20 } | |
| - service: number.set_value | |
| data: | |
| value: !input intensity_2 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_2_intensity' | |
| if states('number.' ~ wled_name ~ '_segment_2_intensity') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_intensity' }} | |
| - delay: { seconds: 0.05 } | |
| - service: number.set_value | |
| data: | |
| value: !input speed_2 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_2_speed' | |
| if states('number.' ~ wled_name ~ '_segment_2_speed') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_speed' }} | |
| - delay: { seconds: 0.10 } | |
| else: | |
| - service: light.turn_off | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_2" | |
| # SEGMENT 3 | |
| - if: | |
| - "{{ trigger_3_active }}" | |
| then: | |
| - service: light.turn_on | |
| data: | |
| rgb_color: !input color_3 | |
| effect: !input effect_3 | |
| brightness: !input brightness_3 | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_3" | |
| - delay: { seconds: 0.20 } | |
| - service: number.set_value | |
| data: | |
| value: !input intensity_3 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_3_intensity' | |
| if states('number.' ~ wled_name ~ '_segment_3_intensity') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_intensity' }} | |
| - delay: { seconds: 0.05 } | |
| - service: number.set_value | |
| data: | |
| value: !input speed_3 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_3_speed' | |
| if states('number.' ~ wled_name ~ '_segment_3_speed') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_speed' }} | |
| - delay: { seconds: 0.10 } | |
| else: | |
| - service: light.turn_off | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_3" | |
| # SEGMENT 4 | |
| - if: | |
| - "{{ trigger_4_active }}" | |
| then: | |
| - service: light.turn_on | |
| data: | |
| rgb_color: !input color_4 | |
| effect: !input effect_4 | |
| brightness: !input brightness_4 | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_4" | |
| - delay: { seconds: 0.20 } | |
| - service: number.set_value | |
| data: | |
| value: !input intensity_4 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_4_intensity' | |
| if states('number.' ~ wled_name ~ '_segment_4_intensity') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_intensity' }} | |
| - delay: { seconds: 0.05 } | |
| - service: number.set_value | |
| data: | |
| value: !input speed_4 | |
| target: | |
| entity_id: >- | |
| {{ 'number.' ~ wled_name ~ '_segment_4_speed' | |
| if states('number.' ~ wled_name ~ '_segment_4_speed') != 'unknown' | |
| else 'number.' ~ wled_name ~ '_speed' }} | |
| - delay: { seconds: 0.10 } | |
| else: | |
| - service: light.turn_off | |
| target: | |
| entity_id: "light.{{ wled_name }}_segment_4" | |
| default: | |
| - service: select.select_option | |
| target: | |
| entity_id: "{{ preset_select_entity }}" | |
| data: | |
| option: "{{ default_preset }}" | |
| # Wait for default preset to take effect (prefer to wait, but continue after 8s) | |
| - wait_template: "{{ states(preset_select_entity) == default_preset }}" | |
| timeout: "00:00:08" | |
| continue_on_timeout: true | |
| - delay: | |
| seconds: 1 | |
| - service: scene.turn_on | |
| target: | |
| entity_id: "scene.wled_notification_snapshot_{{ wled_name }}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment