- alias: Ambient Light | Set Quantize Values description: 'This automation ''quantizes'' the raw lux values reported by the ambient sensor devices into text values of Bright, Dim, Dark, or Night. These quantized values are what I use to trigger ambient light related automations.
**04/25/2025**: Created this automation to update both of the ''real'' sensors.' triggers: - trigger: time_pattern minutes: /5 conditions: [] actions: - repeat: for_each: - sensor: sensor.ambient_light_sensor_s2_bh1750_lux quantized: input_text.ambient_s2_quantized night_lux: input_number.ambient_s2_quant_night_lux dark_lux: input_number.ambient_s2_quant_dark_lux dim_lux: input_number.ambient_s2_quant_dim_lux - sensor: sensor.adafruit_feather_sensors_bh1750_illuminance quantized: input_text.ambient_s1_quantized night_lux: input_number.ambient_s1_quant_night_lux dark_lux: input_number.ambient_s1_quant_dark_lux dim_lux: input_number.ambient_s1_quant_dim_lux sequence: - choose: - conditions: - condition: template value_template: '{% set lux = states(repeat.item.sensor) | float %} {% set n = states(repeat.item.night_lux) | float %} {% set d = states(repeat.item.dark_lux) | float %} {{ lux > n and lux < d }} ' sequence: - target: entity_id: '{{ repeat.item.quantized }}' data: value: Dark action: input_text.set_value - conditions: - condition: template value_template: '{% set lux = states(repeat.item.sensor) | float %} {% set d = states(repeat.item.dark_lux) | float %} {% set di = states(repeat.item.dim_lux) | float %} {{ lux > d and lux < di }} ' sequence: - target: entity_id: '{{ repeat.item.quantized }}' data: value: Dim action: input_text.set_value - conditions: - condition: template value_template: '{% set lux = states(repeat.item.sensor) | float %} {% set di = states(repeat.item.dim_lux) | float %} {{ lux > di }} ' sequence: - target: entity_id: '{{ repeat.item.quantized }}' data: value: Bright action: input_text.set_value default: - target: entity_id: '{{ repeat.item.quantized }}' data: value: Night action: input_text.set_value mode: single - alias: Ambient Sensors | State Changed description: 'This is part of my handling of changes to ambient light and the day-dim application. This automation catches an ambient light level change for any of the lux sensors and to then calls the ''lightset_assess_conditions'' script.
**04/25/2025**: Implemented and is working.' triggers: - trigger: state entity_id: - input_text.ambient_s9_quantized - input_text.ambient_s1_quantized - input_text.ambient_s2_quantized from: null to: null conditions: [] actions: - variables: trigger_map: input_text.ambient_s9_quantized: input_text.ambient_s9_lightset_label input_text.ambient_s1_quantized: input_text.ambient_s1_lightset_label input_text.ambient_s2_quantized: input_text.ambient_s2_lightset_label sensor_label_helper: '{{ trigger_map[trigger.entity_id] }}' lightset_label: '{{ states(sensor_label_helper) | default(''NoLightsetLabel'') }}' alias: Define Needed Variables - alias: Debug - Show Variables data: name: Lightset Debug message: 'VARIABLE: [sensor_label_helper: {{ sensor_label_helper }}] || VARIABLE: [lightset_label: {{lightset_label }}] ' action: logbook.log - action: script.turn_on metadata: {} data: entity_id: script.lightset_assess_conditions variables: lightset_label: '{{ lightset_label }}' mode: parallel - alias: Light Set - Lset App Test Light Set | Deactivate Requested description: '' triggers: - trigger: state entity_id: - input_button.light_set_lset_app_test_light_set_deactivate - input_button.light_set_lset_app_test_light_set_disable from: null to: null conditions: [] actions: - variables: button_map: input_button.light_set_lset_app_test_light_set_deactivate: target_lightset_label: Light Set - Lset App Test Light Set target_exit_state: Deactivated input_button.light_set_lset_app_test_light_set_disable: target_lightset_label: Light Set - Lset App Test Light Set target_exit_state: Disabled target_lightset_label: '{{ button_map[trigger.entity_id].target_lightset_label }}' target_exit_state: '{{ button_map[trigger.entity_id].target_exit_state }}' - action: script.turn_on metadata: {} data: variables: lightset_label: '{{ target_lightset_label }}' exit_state: '{{ target_exit_state }}' target: entity_id: - script.lightset_deactivate_disable mode: parallel - alias: lightset | State Changed description: '**Membership**: *Lightset Virtual Object* and an element of the Day-Dim App.
**Purpose**: React to light-set state changes and route actions to the appropriate action scripts that are part of the app.
**Note-1**: I am using the non-blocking form of calling the routed to scripts in the ''''choose'''' section so that this automation can be called again immediately (i.e., by a different light-set having been triggered).
**Note-2**: *mode: queued* is important as the call out to the LED set indicator script is recursive and will fail if mode is single. (Actually it should likely be mode: parallel if ever I use the feature to set a ''''start_state'''' in the scripts that turn the lights on and off).
**04/26/2025**: Fixed error in lightset strings in the trigger_map table.
**04/25/2025**: Fixed up for new naming of helpers.
**04/22/2025**: Added case for ''''Inactive'''' to set * | Operational State* to ''''Activate''''
**Documentation** .../HomeAssistant/Documentation/doc_diagrams.odg ' triggers: - trigger: state entity_id: - input_select.lightset_test_set_state - input_select.lightset_kitchen_state - input_select.lightset_living_area_state conditions: [] actions: - variables: trigger_map: input_select.lightset_test_set_state: lightset: Light-Set - Day-Dim | Test Set operational_state_helper: input_select.lightset_test_set_operational_state input_select.lightset_kitchen_state: lightset: Light-Set - Day-Dim | Kitchen operational_state_helper: input_select.lightset_kitchen_operational_state input_select.lightset_living_area_state: lightset: Light-Set - Day-Dim | Living Area operational_state_helper: input_select.lightset_living_area_operational_state lightset: '{{ trigger_map[trigger.entity_id].lightset }}' ops_state_helper: '{{ trigger_map[trigger.entity_id].operational_state_helper }}' alias: Define Needed Variables - alias: Debug - Show Variables data: name: Lightset Debug message: 'VARIABLE: [lightset: {{ lightset }}] || VARIABLE: [ops_state_helper: {{ ops_state_helper }}] || VALUE: [trigger.entity_id: {{ trigger.entity_id }}] || VALUE: [trigger.to_state.state: {{ trigger.to_state.state }}] || ' action: logbook.log - action: script.lightset_set_state_indicators metadata: {} data: changed_helper: '{{ trigger.entity_id }}' new_state: '{{ trigger.to_state.state }}' alias: CALL Script to Set ESPHome LED Indicators for New State - alias: CASE Section | Route to Appropriate Handler Based on New State choose: - alias: CASE-0 State Changed to 'In Process - ON' conditions: - condition: template alias: IF State is In Process - On value_template: '{{ trigger.to_state.state == ''In Process - ON''}}' sequence: - alias: Turn on the Light Set action: script.turn_on data: entity_id: script.lightset_on_by_label variables: lightset_label: '{{ lightset }}' - alias: CASE-1 State Changed to 'Pending - OFF' conditions: - condition: template alias: IF State is Pending - OFF value_template: '{{ trigger.to_state.state == ''Pending - OFF''}}' sequence: - alias: Turn on Delay Timer for Light Set action: script.turn_on data: entity_id: script.lightset_goto_pending_off variables: lightset_label: '{{ lightset }}' - alias: CASE-2 State Changed to 'In Process - OFF' conditions: - condition: template alias: IF State is In Process - OFF value_template: '{{ trigger.to_state.state == ''In Process - OFF''}}' sequence: - alias: Turn off the Light Set action: script.turn_on data: entity_id: script.lightset_off_by_areas variables: lightset_label: '{{ lightset }}' - alias: CASE-3 State Changed to Cancel In Process conditions: - condition: template alias: IF State is Cancel In Process value_template: '{{ trigger.to_state.state == ''Cancel In Process''}}' sequence: - alias: Cancel any active light-set activity action: script.turn_on data: entity_id: script.lightset_cancel variables: lightset_label: '{{ lightset }}' - alias: CASE-4 State Changed to 'Inactive' from 'Cancel In Process' conditions: - condition: template alias: IF State went to 'Inactive' from 'Cancel In Process' value_template: '{{ trigger.to_state.state == ''Inactive'' and trigger.from_state.state == ''Cancel In Process''}}' sequence: - alias: Set Light-Set's Operational State to 'Activate.' action: input_select.select_option metadata: {} data: option: Activate target: entity_id: '{{ ops_state_helper }}' mode: queued - alias: lightset | Transition Timer Expired description: '**Purpose**: Detect when a light-set''s transition delay timer has expired and take appropriate action.
**04/26/2025**: Fixed helper name errors. Added test for valid timer in loopup map.
**04/25/2025**: Fixed up for new naming of helpers and added in the two non-test light-sets.
**04/12/2025**: Initial Creation ' triggers: - trigger: state entity_id: - timer.lightset_test_set_timer - timer.lightset_kitchen_timer - timer.lightset_living_area_timer from: null to: idle alias: When any Light-Set's timer has finished conditions: [] actions: - variables: trigger_map: timer.lightset_test_set_timer: label: Light-Set - Day-Dim | Test Set state_helper: input_select.lightset_test_set_state timer.lightset_kitchen_timer: label: Light-Set - Day-Dim | Kitchen state_helper: input_select.lightset_test_set_state timer.lightset_living_area_timer: label: Light-Set - Day-Dim | Living Area state_helper: input_select.lightset_test_set_state NoMappedTimer: label: NoLightsetLabel state_helper: NoStateHelper timer_to_act_on: "{% if trigger.entity_id in trigger_map %}\n {{ trigger.entity_id\ \ }}\n{% else %}\n NoMappedTimer\n{% endif %}\n" target_lightset_label: '{{ trigger_map[timer_to_act_on].label }}' target_state_helper: '{{ trigger_map[timer_to_act_on].state_helper }}' - alias: Debug - Show Variables data: name: Lightset Debug message: 'VARIABLE: [timer_to_act_on: {{ timer_to_act_on }}] || VARIABLE: [target_lightset_label: {{ target_lightset_label }}] || VARIABLE: [target_state_helper: {{ target_state_helper }}] || VALUE: [trigger.entity_id: {{ trigger.entity_id }} ] || VALUE: [trigger.to_state.state: {{ trigger.to_state.state }} ] || ' action: logbook.log - alias: If we have valid timer call assess conditions script, else error choose: - alias: Call the Light-Set Assess Conditions Script. conditions: - condition: template value_template: '{{ timer_to_act_on != ''NoMappedTimer'' }}' sequence: - action: script.turn_on metadata: {} data: variables: lightset_label: '{{ target_lightset_label }}' target: entity_id: - script.lightset_assess_conditions default: - alias: No timer, report error sequence: - data: name: Automation | lightset Transition Timer Expired - ERROR message: Triggering timer - '{{ trigger.entity_id }}' - has no entry in trigger_map lookup table. action: logbook.log mode: parallel - alias: Away Random Lights by Label description: 'When I''m away, randomly toggle any light tagged “Light Set – Night Random” between night and bedtime. ' trigger: - platform: time_pattern minutes: /5 variables: lights: "{{ states.light\n | selectattr('attributes.label','eq','Light Set -\ \ Night Random')\n | map(attribute='entity_id')\n | list }}" condition: - condition: state entity_id: input_boolean.away_from_home state: 'on' - condition: template value_template: '{{ is_state(''sensor.daypart'',''nighttime'') }} ' - condition: template value_template: '{{ now().strftime(''%H:%M'') < states(''input_datetime.bedtime_normal'') }} ' - condition: template value_template: '{{ (range(0,5) | random) == 0 }} ' action: - choose: - conditions: '{{ lights | length > 0 }}' sequence: - service: light.toggle target: entity_id: '{{ lights | random }}' mode: parallel