Lighting Scenes: Evening, Night, Movie, Guests, Cleaning, and Arriving Home

Module 20 · Lesson 10

Lighting Scenes: Evening, Night, Movie, Guests, Cleaning, and Arriving Home

You have the entities from Lesson 8 and manual control from Lesson 9. Now you're combining them into scenes: a safe, predictable effect. A scene describes what the light should look like. Automation, in later lessons, will decide when to trigger that scene. If you need conditions, sequencing, or a safety check, you use a script.

We're not yet building motion-based automation or schedules: that's Lessons 11 through 13. Today you're building manually triggered scenes: from a remote, a button, or the dashboard. The light_mode helper records the last deliberately chosen mode. The global lighting_automation_enabled helper stays off until Lesson 11: manual scenes neither turn it on nor off. Further on I'll shorten Home Assistant to HA.

Plan on about 110 to 120 minutes.

This lesson's rule
A scene is a snapshot of target states, not a procedure with conditions.
Start with one local Evening scene. Blinds with safety lockouts: only through a script.

A real-life problem: "turn on evening": what does that mean?

You say: "Turn on evening." A household member turns the ceiling light to 100% and switches off the floor lamp. You wanted the ceiling at 40%, a warm color, and the hallway at 15%. The smart home didn't fail: you two never had a shared definition of the scene.

Scenes solve the shared-language problem: which lamps are lit, which are off, what brightness, what white color temperature, which rooms are covered. Automation says when. A scene says what it should look like.

Scene, script, automation

A scene: target states for entities. There's no delay, no choose, and no extra steps once entities are set. A scene's entity is stateless: it records the time of the last activation, not an "is this scene active" state. There's no scene.turn_off: to end Movie mode, you trigger a different scene or manually change the lights.

A script: a procedure: ordering, conditions, safely closing a blind, then a light scene.

An automation: a trigger and a response. A good pattern for later: a trigger → a condition on the automation → scene.turn_on.

A scene isn't an active mode

A scene's entity remembers the time it was last triggered, but doesn't check whether every lamp still matches the scene. To record a logical mode, you use a separate helper.

A plain scene doesn't restore a previous state. Dynamically capturing state (scene.create) is a separate, more advanced technique.

In current YAML we use Kelvin

In older guides you'll find color_temp in mireds. In current Home Assistant, use color_temp_kelvin, e.g. 2700K for warm light or 4000K for neutral. Check the range in the min_color_temp_kelvin and max_color_temp_kelvin attributes.

In the text we talk in percentages (the living room at 40%). In scene YAML, brightness is on a 0-255 scale: 10% ≈ 26, 25% ≈ 64, 40% ≈ 102, 50% ≈ 128, 80% ≈ 204, 100% = 255.

The light_mode helper: the last deliberately chosen mode

normal isn't a scene. It means no special Movie, Night, Guests, or Cleaning mode is in effect. It doesn't pretend to restore the state from before a scene.

input_select:
  light_mode:
    name: "Light mode"
    icon: mdi:lightbulb-group
    options:
      - normal
      - evening
      - night
      - movie
      - guests
      - cleaning
      - away

Don't set initial: normal: after an HA restart the helper would revert to that value regardless of the mode before the restart. Without initial, HA restores the previous state. That restored state can also be stale relative to the physical lamps: the helper is logical memory, not confirmation.

For simple lighting scenes, we recommend including the helper as part of the scene's entity list. That way, a scene triggered from the dashboard, a remote, or an automation always sets the mode. An alternative: a script with scene.turn_on plus input_select.select_option. Don't mix both methods by accident.

input_select.light_mode doesn't continuously check whether every lamp still matches the scene. If a household member later changes one lamp by hand, the helper can still show "evening."

The global lighting_automation_enabled controls motion, schedules, and sunset logic: it doesn't block the manual Evening or Movie scene, or a remote by the bed. Manual scenes don't change this helper.

Don't hide blind movement inside a plain light scene

A light scene has no safety conditions. If Movie mode is also supposed to close a blind, build a script that first checks the patio lockout, the door sensor, window-cleaning mode, and entity availability. Only afterward does it move the blind and trigger the light scene.

Step by step: your first Evening scene

Start with one room: the living room. Don't start with the whole house. For a beginner, the order is: build the first scene in the UI → verify it works → view the generated YAML → write YAML by hand later.

After creating the scene in the UI: review the entity list, remove anything the scene shouldn't control (a blind, a media player, technical entities), and check every attribute. The "Evening: living room" scene covers the living room: it doesn't turn off private rooms without agreement.

Check whether configuration.yaml already has a scene: section, or scene: !include scenes.yaml. Don't add a second key with the same name. After YAML changes: check the configuration → scene.reload → test in Developer Tools. A full restart isn't the first step.

- id: "living_room_evening"
  name: "Evening: living room"
  icon: mdi:weather-sunset

  entities:
    input_select.light_mode: "evening"

    light.living_room_ceiling:
      state: "on"
      brightness: 102
      color_temp_kelvin: 2700

    light.living_room_lamp:
      state: "on"
      brightness: 64
      color_temp_kelvin: 2700

    light.kitchen_counter:
      state: "on"
      brightness: 128
      color_temp_kelvin: 3000
- action: scene.turn_on
  target:
    entity_id: scene.living_room_evening
  data:
    transition: 3

scene.turn_on supports transition. The transition applies to light entities, and they have to support the feature themselves: some lamps will ignore the parameter, and a group can arrive unevenly. That doesn't automatically require a script.

The Night scene: a night mode, not a global automation shutoff

Night sets light_mode = night and turns off the daytime zones. It doesn't turn off global automation: gentle hallway, bathroom, and stairway lights can still work at night (Lesson 11). Don't turn the bathroom on permanently in the scene: motion will turn it on later at low brightness. A scene has no "turn off unless someone's there" condition: that requires a script or an automation.

- id: "night_home"
  name: "Night"
  icon: mdi:weather-night

  entities:
    input_select.light_mode: "night"

    light.bedroom_ceiling: "off"

    light.bedroom_lamp:
      state: "on"
      brightness: 20
      color_temp_kelvin: 2200

    light.living_room_ceiling: "off"
    light.living_room_lamp: "off"
    light.kitchen_counter: "off"
    light.hallway: "off"
    light.bathroom_ceiling: "off"

Movie: a light scene plus a script for the blind's conditions

The Movie scene sets only the lights: bias lighting behind the screen (not aimed at eyes or the TV), everything else in the living room off. Neutral or slightly warm white, not aggressive RGB. The blind doesn't belong in the light scene.

- id: "living_room_movie"
  name: "Movie: living room"
  icon: mdi:movie-open

  entities:
    input_select.light_mode: "movie"

    light.living_room_ceiling: "off"
    light.living_room_lamp: "off"

    light.living_room_tv_strip:
      state: "on"
      brightness: 51
      color_temp_kelvin: 2700

    light.hallway:
      state: "on"
      brightness: 13
living_room_movie:
  alias: "Movie: living room"
  description: >
    Sets the movie lighting. Only closes the blind once
    the safety conditions are met.
  icon: mdi:movie-open
  mode: single

  sequence:
    - action: scene.turn_on
      target:
        entity_id: scene.living_room_movie
      data:
        transition: 2

    - if:
        - condition: state
          entity_id: input_boolean.patio_blinds_lockout
          state: "off"

        - condition: state
          entity_id: input_boolean.window_cleaning_mode
          state: "off"

        - condition: state
          entity_id: binary_sensor.patio_door
          state: "off"

        - condition: template
          value_template: >
            {{ states('cover.living_room_blind')
               in ['open', 'closed', 'opening', 'closing'] }}

      then:
        - action: cover.close_cover
          target:
            entity_id: cover.living_room_blind

The helper in a scene or script records the user's intent, not a confirmed result: a lamp might not respond, and the mode will still read "movie." The light runs before the blind deliberately: Movie mode still works even when the blind is locked out. If you prefer "all or nothing," check the blind's conditions first and only then call scene.turn_on. This script doesn't detect a person on the patio. A cover's position: 0 = closed, 100 = open: never combine a state: open with a current_position: 0 in a way that contradicts itself.

Guests, Cleaning, Arriving, and Leaving

Guests: higher brightness in the daytime zone, light_mode: guests, so motion automation doesn't turn off the living room after a few minutes. Plan how it ends: a "Guests over" button, the Evening scene, or a dashboard status. Don't end the mode automatically at an arbitrary hour if guests are still in the house.

Cleaning: high brightness, a neutral 3500-4500K (not mandatorily a cold 6000K). Respect the entity's CCT range. For lights without CCT, remove color_temp_kelvin.

- id: "cleaning_ground_floor"
  name: "Cleaning: ground floor"
  icon: mdi:broom

  entities:
    input_select.light_mode: "cleaning"

    light.living_room_ceiling:
      state: "on"
      brightness: 255
      color_temp_kelvin: 4000

    light.kitchen_ceiling:
      state: "on"
      brightness: 255
      color_temp_kelvin: 4000

    light.kitchen_counter:
      state: "on"
      brightness: 255
      color_temp_kelvin: 4000

    light.hallway:
      state: "on"
      brightness: 255

Arriving: a local entryway scene: the mudroom, the hallway, optionally one daytime-zone lamp. Don't set "everything else off": it could turn off lights for people already home. Arriving doesn't turn global automation back on: a household member might have deliberately turned it off.

Leaving is a procedure, not a plain scene. The lights_off scene sets only the lights. The leaving_home script triggers the scene and sets the away mode. At this stage, don't close the blinds.

- id: "lights_off"
  name: "All lights off"
  icon: mdi:lightbulb-off

  entities:
    light.living_room_ceiling: "off"
    light.living_room_lamp: "off"
    light.kitchen_ceiling: "off"
    light.hallway: "off"
    light.bedroom_ceiling: "off"

leaving_home:
  alias: "Leaving home"
  icon: mdi:exit-run
  mode: single

  sequence:
    - action: scene.turn_on
      target:
        entity_id: scene.lights_off

    - action: input_select.select_option
      target:
        entity_id: input_select.light_mode
      data:
        option: "away"

Rollout order and classification

Stage 1: a local Evening scene plus All lights off (no blinds).

Stage 2: Night, Movie.

Stage 3: Guests, Cleaning.

Stage 4: Arriving as a local entryway scene, Leaving as a script.

Local (living room Evening), zonal (ground-floor Guests), global (All lights off): global scenes need more thorough testing and household agreement. Name entities by function (light.living_room_ceiling), not by manufacturer: a scene has to survive a hardware swap.

Testing and diagnostics

Don't test only right after saving: at that point everything's already in the target state. Before triggering it: set the ceiling to 100%, turn off the floor lamp, set a different color, turn on a light the scene is meant to switch off. Trigger it from several different starting states, from a button, and from the dashboard. Check the partial effect with one lamp unavailable: it doesn't "technically break the whole scene," but the result is incomplete. scene.turn_on sends commands: it doesn't confirm every device reached its target state.

The scene doesn't run: check the entity exists, the YAML, scene.reload, a duplicate id.

One lamp doesn't respond: the entity_id, unavailable, color modes, the Kelvin range, an override by a different automation.

The mode doesn't match the light: check whether the helper is included as a scene entity, or whether manual changes turned it into just a historical label.

A scene design card

Scene Scope Lights on Lights off Brightness Kelvin Mode Trigger Test
Evening Living room ceiling, lamp — 40%, 25% 2700K evening remote date
____ ____ ____ ____ ____ ____ ____ ____ ____

Common mistakes

A patio blind inside a light scene: it bypasses the lockouts from Lesson 7.

color_temp in mireds instead of color_temp_kelvin.

A Night scene that globally turns off automation, or Arriving that turns it back on.

A living room scene that turns off the bedroom without agreement.

Treating the mode helper as confirmation of every lamp's physical state.

Twelve separate light.turn_on actions instead of one scene.

Hands-on exercise

☐ Create the input_select.light_mode helper without a forced initial.
☐ Build one local Evening scene for one room first.
☐ Use color_temp_kelvin, not color_temp in mireds.
☐ Add the mode helper as a scene entity, or use a script: don't mix both methods unnecessarily.
☐ Don't add the patio blind to the scene.
☐ Trigger the scene from at least three different starting states.
☐ Check the effect with one lamp unavailable.
☐ Assign the Evening scene to the remote from Lesson 9.
☐ Have a household member test the scene without you explaining the values.
☐ Only afterward build Night and Movie.
☐ Replace the Leaving scene with a script that calls the all-lights-off scene.
☐ Don't let the Arriving scene automatically turn global automation back on.
☐ Leave the global automation helper off until Lesson 11's rollout and testing.

Key takeaways

  • A scene describes target states, not a sequence of actions.
  • A scene is stateless and doesn't confirm every device still matches its settings.
  • The light mode records the last deliberately chosen mode, but doesn't measure every lamp's physical state.
  • normal means no special mode: not an automatic restoration of the state before a scene.
  • In current YAML you use color_temp_kelvin.
  • You trigger scenes with scene.turn_on; there's no scene.turn_off.
  • scene.turn_on can take a transition parameter, if the lights support it.
  • Blinds that need safety lockouts get triggered through a script, not hidden inside a light scene.
  • The Night scene changes how automation behaves instead of turning it off globally.
  • The Arriving scene doesn't automatically restore global permission for automation.
  • Leaving home is a procedure, so it's better built as a script.
  • One unavailable entity can produce an incomplete effect, even though the rest of the scene works.
  • You test one local scene first, and only later build whole-house scenes.

In Lesson 11 you'll add motion-triggered lighting: with a condition on light_mode and lighting_automation_enabled. Before moving on, make sure Evening works from a button: not only from the YAML editor.

Finished this lesson?