Lights that know what you need before you reach for a switch
Circadian rhythm lighting that adapts to time of day, room occupancy, and your manual overrides.
What actually happens
Circadian Wake-Up
Lights gradually warm matching sunrise.
6:30 AM alarm
Sun elevation reaches wake threshold
somni_lights calculates
Circadian curve sets 2700K→4000K transition over 30 min
Gradual warm-up
Bedroom lights gently rise from 10% warm amber to 60% daylight
6:30 AM alarm
Sun elevation reaches wake threshold
somni_lights calculates
Circadian curve sets 2700K→4000K transition over 30 min
Gradual warm-up
Bedroom lights gently rise from 10% warm amber to 60% daylight
Under the hood(for the curious)
Uses sun_elevation curve from somni_lights natural_light.py with configurable transition duration
Nighttime Navigation
Safe lighting at minimal brightness.
2 AM motion detected
Hallway mmWave sensor triggers
Night profile activates
somni_lights selects 'night light' profile: 5% brightness, 2200K amber
Safe, gentle path
Hallway and bathroom lights at 5% warm amber — no sleep disruption
2 AM motion detected
Hallway mmWave sensor triggers
Night profile activates
somni_lights selects 'night light' profile: 5% brightness, 2200K amber
Safe, gentle path
Hallway and bathroom lights at 5% warm amber — no sleep disruption
Under the hood(for the curious)
Activity profile 'night_light' selected based on time-of-day + occupancy state from somni_occupancy
Movie Mode
Lights dim when entertainment begins.
TV turns on
Media player entity state changes to 'playing'
Activity profile shifts
somni_lights detects media activity, applies 'relax' profile
Cinema atmosphere
Living room dims to 15%, shifts to 2200K warm. Adjacent rooms dim via spatial graph.
TV turns on
Media player entity state changes to 'playing'
Activity profile shifts
somni_lights detects media activity, applies 'relax' profile
Cinema atmosphere
Living room dims to 15%, shifts to 2200K warm. Adjacent rooms dim via spatial graph.
Under the hood(for the curious)
somni_spatial propagates dimming to adjacent rooms with 0.3 influence weight
Manual Override Respect
System respects your manual adjustments.
You flip a switch
Physical switch or app adjustment detected
Behavior mode shifts
somni_global BehaviorModeTracker marks room as 'manual' control
Automation pauses
Automatic adjustments pause for that room. Resumes after configurable timeout.
You flip a switch
Physical switch or app adjustment detected
Behavior mode shifts
somni_global BehaviorModeTracker marks room as 'manual' control
Automation pauses
Automatic adjustments pause for that room. Resumes after configurable timeout.
Under the hood(for the curious)
BehaviorModeTracker in somni_global tracks manual/timed/auto states per room entity
Components that power this
How they work together
somni_lights decides what each room needs. somni_spatial propagates those decisions to adjacent rooms through a Dijkstra-weighted room graph — so when you walk from the bedroom to the kitchen, lights warm ahead of you. somni_ml learns your patterns over time to pre-condition rooms before you arrive. And somni_homekit makes it all accessible from your phone or voice assistant.
Compatible hardware
Switches & Dimmers
- Lutron Caseta
- Lutron RA3
- Shelly Dimmer
- Inovelli
Bulbs
- Philips Hue
- LIFX
- Nanoleaf Essentials
Sensors
- Aqara FP2 mmWave
- Philips Hue Motion
- Shelly Motion
Explore related features
Ready to Get Started?
Tell us about your home and we'll call you within 1-2 business days. No pressure, no obligation.