Overcast compensation for a north-facing kitchen
A kitchen with no direct sun still swings from 120 lx to 900 lx as cloud cover changes. This recipe tops up the under-cabinet strip to keep the counter at 350 lx while the ceiling stays off all day.
# HearthNodes recipe 09 - overcast compensation
alias: "Light - north kitchen overcast top-up"
id: hn_light_overcast_topup
description: "Top up the under-cabinet strip to hold 350 lx, ceiling stays off"
mode: single
max_exceeded: silent
trigger:
- platform: numeric_state
entity_id: sensor.kitchen_counter_lux
below: 300
for: "00:00:30"
- platform: numeric_state
entity_id: sensor.kitchen_counter_lux
above: 420
for: "00:00:30"
variables:
target_lx: 350
measured: "{{ states('sensor.kitchen_counter_lux') | float(350) }}"
strip_current: "{{ state_attr('light.under_cabinet_strip','brightness') | int(0) / 2.55 }}"
raw: "{{ strip_current + ((target_lx - measured) / 6) }}"
topup: "{{ [[raw, 10] | max, 85] | min | round(0) }}"
condition:
- condition: state
entity_id: binary_sensor.kitchen_occupied
state: "on"
- condition: time
after: "06:30:00"
before: "21:00:00"
- condition: template
value_template: >-
{{ is_state('select.kitchen_task_scene','ambient')
or is_state('select.kitchen_task_scene','off') }}
action:
- service: light.turn_on
target:
entity_id: light.under_cabinet_strip
data:
brightness_pct: "{{ topup }}"
color_temp_kelvin: 3000
transition: 3
- service: light.turn_off
target:
entity_id: light.kitchen_ceiling
- choose:
- conditions:
- condition: numeric_state
entity_id: sensor.kitchen_counter_lux
below: 200
sequence:
- service: select.select_option
target:
entity_id: select.kitchen_task_scene
data:
option: counter
# The strip's own controller minimum (8 percent) is why the automation floor is
# 10 percent. Scene selection beats time-of-day here: dinner happens at different
# hours and the automation must not argue with a pressed button.
Trigger · state
sensor.kitchen_counter_lux
Counter illuminance drops below 300 lx or rises above 420 lx.
Step-by-step
- light.under_cabinet_stripSet the strip to the top-up level, clamped between 10 % and 85 %; above 85 % the strip is brighter than the ceiling and looks wrong.
turn_on · brightness_pct {{ topup }} · color_temp_kelvin 3000 - light.kitchen_ceilingExplicitly hold the ceiling off during the day; this is what removes the biggest energy draw in the room.
keep off - select.kitchen_task_sceneBelow 200 lx, switch to the counter-weighted scene that puts more light on the work surface and less on the room.
set 'counter' when lux < 200
Shield the sensor from the window
A kitchen lux sensor that can see the window will read 800 lx on a bright day and dim the strip exactly when the counter is in shadow. Put a small baffle above the sensor so its view is the work surface and the cupboard doors, nothing else.
Cap the strip below the ceiling's brightness
An under-cabinet strip at 100 % creates harsh shadows down the cupboard faces and makes the room look badly lit even when the counter is bright. 85 % is the practical ceiling; the ceiling circuit takes over above that.
Do not fight the evening scene
This recipe must yield the moment someone selects the dinner or cleaning scene. Wire a scene-selector condition rather than a time condition, because dinner happens at different times and the automation should not be arguing with a person who just pressed a button.
Hardware
| Model | Protocol | Link | Role in this chain |
|---|---|---|---|
| LED strip on a Zigbee CCT controller (e.g. GLEDOPTO or Gledopto-class controller) | zigbee |
wireless | Under-cabinet strip; choose a controller that supports a real 1 % minimum so the 10 % floor is accurate. |
| Counter-height lux sensor | zigbee |
wireless | Mounted under the upper cabinets, pointing down at the work surface, shielded from the window so it reads task light. |
| Kitchen zone presence sensor | zigbee |
wireless | Non-imaging occupancy so the compensation only runs when someone can see the result. |
When it fails
If the lux sensor is unavailable, the strip falls back to a fixed 45 % whenever the kitchen is occupied, which is the level that measured best across the widest range of conditions during commissioning. The ceiling stays off; if the person needs more light, the wall switch still controls the ceiling directly.