Human-Centric Lighting (HCL) Control: CCT Mixing & Scheduling
← Back to: Lighting & LED Drivers
Human-Centric Lighting (HCL) is an engineering control loop that turns time-based scenes (CCT + illuminance) into stable, smooth, driver-agnostic channel commands, optionally corrected by sensors to keep light consistent as temperature and conditions change.
A robust HCL system is proven by its evidence chain—CCT_target/est, Lux_target/est, Scene_ID,
Cmd_norm[ch], Temp_C, and Fault_code—so every “comfort” complaint can be diagnosed and fixed deterministically.
H2-1 — HCL definition and system boundary
Engineering thesis: Human-Centric Lighting (HCL) is an engine that converts time-based scenes and optional sensor feedback into stable tunable-white output (CCT + illuminance) using controlled transitions, constraints, and evidence-ready telemetry.
What this chapter proves (in engineering terms, not marketing): HCL is not a “feature label”. It is a control system with (1) explicit targets, (2) explicit actuators, (3) optional feedback, and (4) a state machine that makes behavior deterministic across schedule changes, overrides, and reboots.
Define the three variable layers (this is the vocabulary used by every later chapter):
- Setpoints (what the user wants): correlated color temperature and illuminance targets that can change over time (scenes, schedules).
- Actuators (what the system controls): per-channel output commands (normalized channel ratios or absolute channel current setpoints).
- Feedback/Observations (what the system measures): ambient light level (ALS), estimated CCT (color/CCT sensor), and temperature for drift compensation.
System boundary (what this page covers): circadian scheduling (RTC + scene table), CCT mixing, closed-loop stabilization using ALS/CCT sensors, smooth fades (perceptual ramps), calibration storage, and telemetry/log fields for field proof.
Explicit exclusions (keeps this page from overlapping siblings): protocol specifics (DALI/DMX/0–10V), LED driver power-stage design (buck/boost/flyback/LLC), and compliance subsystems (EMC/surge/creepage).
Minimum Evidence Bundle (the smallest log snapshot that proves the HCL engine is behaving correctly):
H2-2 — Reference architecture: dataflow + timing model
What this chapter solves: HCL becomes unstable or “feels inconsistent” when scheduling, sensing, and output updates run at the same rate or write the same variables. A robust HCL architecture separates responsibilities by rate, enforces a single source of truth for active state, and exchanges data only through timestamped buffers.
Rate separation (three loops, three responsibilities):
- Fast control/update loop (≈ 200 Hz–2 kHz): applies ramps/gamma, enforces slew limits, preserves chromaticity during fades, and outputs Cmd_norm[ch] (actuators).
- Sensor loop (≈ 10–50 Hz): samples sensors, filters noise, validates freshness, and produces CCT_est/Lux_est (observations).
- Schedule/scene loop (≈ 0.1–1 Hz): advances time-of-day scenes, resolves priority/overrides, and updates only setpoints (never raw actuator commands).
Single source of truth (state machine rules):
- One owner of: Scene_ID, schedule state, override priority, ramp phase, and persistence policy.
- Every external change (manual scene recall, schedule tick, restore on boot) must enter through the same state machine to avoid split-brain behavior.
- Persistent state must be stored with version + CRC so field issues can be proven as “bad state restore” vs “bad control”.
Dataflow contract (who writes what): This page stays interface-agnostic by defining a clean contract. Slow logic writes setpoints; sensor logic writes estimates; fast logic writes actuator commands. Cross-rate exchange uses two buffers (timestamped) so stale data never silently corrupts output.
Field-proof guideline: if output “hunts”, “steps”, or “ignores schedule”, the fastest root-cause split is to compare timestamps: (1) is the sensor fresh, (2) is the fast loop running on time, (3) is the state machine overriding schedule for a reason.
H2-3 — CCT mixing fundamentals (2-channel and multi-channel)
Design thesis: CCT mixing is not “warm% + cool%”. It is a 2D mapping from a brightness target (Total_flux / Lux proxy) and a chromaticity target (CCT, optionally duv) into a channel command vector that remains stable under gain mismatch, temperature drift, and actuator constraints.
2-channel tunable white (Warm + Cool): A warm/cool ratio moves chromaticity, but the mapping is non-linear and brightness-coupled. Two effects make naïve linear mixing drift:
- Different luminous efficacy per channel: equal current change does not produce equal lux change. Holding lux constant forces the ratio to move as brightness changes.
- Non-linear color mapping: ratio maps to chromaticity first, then to CCT (CCT is not a linear axis). Small ratio errors can create uneven CCT steps, especially near the ends.
Multi-channel mixing (W + CW + WW, or adding R): Extra channels can reduce green/magenta bias and improve CRI/duv control, but only if mixing is defined as a matrix/LUT problem. The output must be a vector that satisfies two primary axes:
- Brightness axis: Total_flux (or a lux proxy) sets overall energy.
- Chromaticity axis: CCT (and optionally duv) sets color appearance.
Control variables (recommended contract):
- Inputs: CCT_target, Lux_target (or Total_flux_target).
- Core internal representation: Ch_ratio[] (normalized per-channel weights, sum not necessarily 1 before scaling).
- Actuator-facing command: I_set[] (absolute channel current setpoints) or a normalized command vector (Cmd_norm[ch]).
- Optional chromaticity quality metric: duv_est to capture green/magenta bias even when CCT is near target.
Why a “mixing matrix” is the stable approach: Define a mixing surface that maps (CCT_target, Lux_target) into a channel vector, then apply calibration gains and constraints. This avoids ratio drift when brightness changes and provides predictable behavior across scenes.
Legal region and reachability: Not every (CCT, flux) point is physically reachable. A robust mixer must detect when a request is outside the legal region and apply a deterministic rule (project to boundary, clamp one axis, or trade brightness for chromaticity) so transitions remain smooth and explainable in logs.
Evidence-first debugging: When CCT “wanders” under dimming or across units, the fastest proof split is to compare the command vector and the estimate:
- Ch_ratio[] stable but CCT_est drifts: likely gain/temperature model mismatch or optical mixing drift.
- Ch_ratio[] changes unexpectedly with the same targets: constraints/clamps or a non-deterministic mapping (missing matrix/LUT ownership).
- CCT_est stable but perception is off: duv_est bias or sensor transfer mismatch (covered in calibration chapter).
Implementation checklist (scope-safe):
- Separate brightness and chromaticity axes; do not embed brightness control inside “ratio”.
- Use matrix/LUT output as the source of truth for the channel vector.
- Apply Gain_k[] and Temp_coeff[] as a post-map correction (calibration), then clamp.
- Always expose Ch_ratio[], I_set[], and CCT_est in telemetry for field proof.
H2-4 — Calibration: from LED binning to mixing matrix (and what must be stored)
Calibration goal: Keep color and brightness behavior consistent across units and over time. Mixing quality depends on calibration assets (gains, matrices, temperature coefficients, optional sensor transfer), and those assets must be stored with versioning and integrity so field behavior is provable.
What calibration must cover (minimum set):
- Channel gain mismatch: differences from LED binning, optics, and assembly. Without per-channel gain, the same scene produces different CCT across fixtures.
- Temperature coefficients: chromaticity and flux drift with temperature. A stable mixer needs coefficients that correct the mapping as the system warms up.
- Sensor transfer (if feedback exists): sensor offset/scale must be aligned so closed-loop control is not “correcting toward a biased measurement”.
From characterization to a mixing matrix: A practical approach is to build a 2D mapping surface over (CCT, flux) and store it as a matrix/LUT. The mixer reads the matrix entry (and interpolates between entries), then applies calibration gains and temperature correction before clamping to actuator limits.
What must be stored in NVM (non-negotiable for field proof):
- Gain_k[ ]: per-channel gain normalization that anchors brightness and color repeatability.
- Mix_matrix / Mix_LUT: maps (CCT_target, Lux_target) to a channel vector (Ch_ratio[ ]).
- Temp_coeff[ ]: corrects channel contributions vs temperature (prevents warm-up color drift).
- Sensor_offset (optional): ties estimation to reality for stable closed-loop behavior.
- CRC + version: prevents silent corruption and enables controlled updates.
Factory-only vs field-updatable boundaries: Calibration assets that require controlled measurement conditions should be factory-only, while small trims can be field-updatable. This separation avoids “fixing” a symptom by damaging the foundational mapping.
- Factory-only (recommended): Mix_matrix/Mix_LUT and baseline Gain_k[ ] (requires instrumentation and controlled optics).
- Field-updatable (limited): small offsets/trims and timestamps, always with integrity checks and audit trail.
Integrity rule: Updates must be atomic (write → verify CRC → commit). A valid Cal_version and Cal_crc are required before enabling the mixer, otherwise the system should fall back to a safe default profile and log the condition.
H2-5 — Scheduler/RTC design: Circadian curves, priorities, and overrides
Engineering goal: Convert a time-of-day idea into deterministic behavior. Ensure the system behaves predictably by defining how to switch between scenes and handle manual or safety overrides, based on a priority stack and RTC validity.
Scene Table Contract (Minimum Fields for Scheduling):
- Time window: Scene’s active time period.
- CCT_target: Desired color temperature for the scene.
- Lux_target: Desired illumination for the scene (or total flux proxy).
- Fade_time_ms: Transition time for the scene’s change.
- Min/max clamps: Boundaries for illumination or CCT.
Priority Stack (How scene priorities are handled):
- Safety clamps: Highest priority to ensure safety.
- Manual override: Allows users to override the schedule.
- Schedule: Default schedule behavior.
- Default: Fallback to default scene if no other condition applies.
RTC Design Considerations (Important for accurate timing):
- RTC_valid: Ensures RTC time is valid before running schedules.
- RTC_ppm_est: Optional parameter for time drift estimation.
- Scene_next_ts: Timestamp for when the next scene will start.
- Priority_level: Current priority level in the priority stack.
- Fade_time_ms: Time for the transition between scenes.
H2-6 — Sensor closed-loop: What to sense and how to avoid “hunting”
Engineering goal: Maintain stable feedback in closed-loop systems without oscillations or brightness/CCT fluctuations. Design rules for sensor integration and decoupling loops to avoid common issues like hunting or breathing effects.
Allowed sensors: Ambient Light Sensor (ALS), color/CCT sensor, and temperature sensor.
Closed-loop design rules:
- Low-pass sensor estimation: Use low-pass filtering on sensor data to prevent high-frequency noise.
- Deadband and rate limit: Apply deadband to reduce unnecessary actions when errors are small, and rate limits to prevent rapid changes.
- Separate lux loop vs CCT loop: Decouple the lux control loop and the CCT control loop to avoid cross-interference using a matrix or independent controllers.
Fail-safe mechanisms: In case of sensor faults, the system should either freeze the current setpoint or revert to an open-loop system to prevent erratic behavior.
Evidence chain fields for sensor closed-loop:
- ALS_raw: Raw value from the ambient light sensor.
- ALS_lpf: Low-pass filtered ALS value.
- CCTsensor_raw: Raw value from the color/CCT sensor.
- CCT_est: Estimated CCT value from sensor data.
- Loop_err_lux: Error between Lux_target and Lux_est.
- Loop_err_cct: Error between CCT_target and CCT_est.
- Sensor_status: Indicates whether the sensor is operating correctly.
H2-7 — Ramps, fades, and perceptual smoothness (no visible stepping)
Engineering goal: Ensure smooth transitions without visible stepping at all dim levels. Use perceptual gamma mapping to make “steps in code” align with human visual perception.
Key ramp design elements:
- Maximum slew rate per channel: The maximum change rate allowed for each channel to avoid abrupt transitions.
- Synchronized multi-channel ramp: Ensures that multiple channels ramp together, preserving chromaticity.
- Deep dimming stability: Keep steps sub-perceptual and avoid loop noise amplification.
Important evidence chain fields:
- Ramp_slew[ ]: Maximum allowed slew rate for each channel.
- Gamma_id: The gamma mapping applied to the ramp.
- Step_size: Size of the individual steps in the ramp.
- CCT_delta_per_step: Color temperature change per step.
- Lux_delta_per_step: Lux change per step.
H2-8 — Temperature compensation and long-term chromaticity stability
Engineering goal: Compensate for CCT drift caused by temperature and aging while maintaining stable scene performance. Ensure long-term chromaticity stability without affecting the scene consistency.
Sources of drift:
- LED junction temperature: Causes spectral shifts, which affect CCT.
- Sensor temperature sensitivity: The sensor’s response changes with temperature, affecting the measurement.
- Aging: LED channel efficacy decreases over time, which affects output brightness and color temperature.
Compensation approaches:
- Temp-indexed gain correction: Apply a gain correction based on temperature.
- Periodic re-normalization using sensor (if present): Recalibrate using sensor data at regular intervals to counteract aging effects.
Key evidence chain fields:
- Temp_C: Current temperature value.
- Gain_temp_adj[ ]: Gain adjustment based on temperature.
- CCT_drift_est: Estimated CCT drift based on temperature.
- Age_factor (optional): Optional aging compensation factor for long-term stability.
- Comp_state: The current state of compensation (whether compensation is active or not).
H2-9 — Scene persistence, interoperability boundaries, and “driver-agnostic” outputs
Goal: Define the output contract of the HCL engine to ensure portability across LED driver interfaces and topologies. The system logic should remain consistent regardless of the underlying driver hardware.
Output Contract of HCL Engine:
- Per-channel normalized command (0–1): The normalized control signal for each channel, ensuring consistent output across all drivers.
- Optional absolute current command (mA): If available, provides a more precise control value.
Persistence Rules:
- What survives reboot: Scene ID, last setpoints, and manual override (TTL).
- Reboot recovery: The system should restore the last known good state after reboot, including scene ID and last active setpoints.
Boundary Statements:
- Protocol details: The protocol-related details (e.g., DALI, PWM, 0–10V) belong to interface pages; this page focuses only on defining the output contract in a clean, abstract manner.
Key Evidence Chain Fields:
- Cmd_norm[ ]: The normalized command values for each channel.
- Cmd_abs_mA[ ] (optional): The absolute current values (if supported).
- Persist_flags: Flags indicating what data should persist across reboots.
- Boot_restore_state: The state of the system when rebooting, indicating which scene or setpoints should be restored.
H2-10 — Telemetry, fault handling, and field logs (what to record)
Goal: Ensure that HCL systems are diagnosable in the field without guesswork. Record key telemetry data, log faults, and enable efficient fault handling.
Minimum Log Set:
- Setpoints: CCT, Lux, and other key scene parameters.
- Estimates: Estimations of CCT and Lux based on sensor readings.
- Sensor Status: Monitoring the health of sensors.
- Active Scene: The currently active scene being executed.
- Ramp State: The current state of any active ramping process.
- Saturation Flags: Flags indicating if any channel has reached its saturation limit.
Fault Taxonomy:
- Sensor Stale/Out-of-Range: If the sensor data is no longer valid or is out of expected range.
- CCT Cannot Be Reached: If one or more channels are saturated and unable to reach the target CCT.
- Drift Beyond Bounds: If the CCT or Lux drift exceeds allowed limits.
First Containment Actions:
- Freeze CCT: Stop any changes to CCT to avoid further issues.
- Revert to Open-Loop: If the feedback loop is compromised, revert to open-loop control.
- Clamp Lux: Limit the Lux to a safe value if any channel reaches its saturation limit.
Key Evidence Chain Fields:
- Fault_code: The code indicating the type of fault.
- Saturation_mask: Flags indicating which channels have reached their saturation limits.
- Sensor_stale_ms: The timestamp indicating when the sensor data became stale.
- Reachability_err: Errors related to the reachability of target values.
- Fallback_mode: The current mode the system has entered during fault handling.
H2-11 — Validation & Field Debug Playbook (SOP)
Goal: turn “color looks wrong / brightness breathes / schedule unreliable” into deterministic field actions: Symptom → 10 s capture → isolate root class → first containment fix. This chapter stays driver-agnostic (no protocol or power-topology deep dive).
11.1 SOP template (always use the same 4-step format)
- Symptom: restate what the user sees (one sentence).
- What to measure (exactly 2 items): choose two fields that prove/deny the hypothesis fastest.
- How to isolate: route the case into one of the five root classes:
Sensor,Calibration,Ramp,Scheduler/RTC,Reachability/Saturation. - First fix (containment): a reversible “stop the pain” action (freeze/revert/clamp), not a final redesign.
11.2 Debug Capture Bundle (standard 10-second snapshot)
Capture last 10 seconds during the symptom (recommended 10–20 Hz logging; any stable rate is acceptable if timestamps are included). This bundle enables cross-device comparison and post-mortem debugging.
- Setpoints vs estimates:
CCT_target,CCT_est,Lux_target,Lux_est - Commands:
Cmd_norm[ch](fixed channel order Ch0..ChN; normalized 0..1) - Environment:
Temp_C - State:
Scene_ID - Fault:
Fault_code
Cal_version, Gamma_id, RTC_valid, Boot_restore_state,
Saturation_mask (if implemented). These do not change the HCL boundary and greatly reduce “guessing”.
MPN examples for building a reproducible debug rig
- Ambient light (ALS):
VEML7700,OPT3001,TSL2591 - Spectral / CCT sensor:
AS7341 - Temperature:
TMP117,MCP9808 - RTC:
DS3231M,PCF85063A,MCP7940N - Multi-channel constant-current sink (for lab fixtures):
TLC59711 - Example LED-driver backends (only to reproduce “saturation/reachability” cases):
AL8860,TPS92520-Q1
11.3 Symptom: “CCT looks wrong” (stable bias or sudden shift)
- What to measure (2):
(1)
CCT_targetvsCCT_est; (2)Cmd_norm[ch](look for rail-to-rail saturation). - How to isolate:
- Calibration if
CCT_estis stable but offset fromCCT_targetacross scenes (unit-to-unit repeatable). - Sensor if
CCT_estjumps whileCCT_targetstays smooth (often coincides with sensor status changes). - Reachability/Saturation if one channel pins near 0 or 1 for long periods; the requested chromaticity is outside the “legal region”.
- Scheduler/RTC if the mismatch appears exactly at schedule boundaries (scene transitions are wrong, not the mixer).
- Calibration if
- First fix (containment):
- Freeze chromaticity: hold last good
Cmd_normratio; continue only lux changes. - If saturated: clamp target to reachable range (scene clamps) and log
Fault_codeas “unreachable”. - If sensor suspected: revert to open-loop scene until sensor recovers; keep logs for post analysis.
- Freeze chromaticity: hold last good
11.4 Symptom: “Brightness breathes / hunts” (periodic up-down)
- What to measure (2):
(1)
Lux_targetvsLux_est; (2)Cmd_norm[ch](is the actuator “chasing”?). - How to isolate:
- Sensor if
Lux_estis noisy/stale and the command oscillates at the sensor sample rate. - Ramp if hunting only appears during fades (step/ramp quantization interacts with feedback).
- Temperature coupling if breathing correlates with fast
Temp_Cchanges (compensation overlays the lux loop).
- Sensor if
- First fix (containment):
- Increase deadband / reduce control update rate; enforce per-channel slew clamps for stability.
- Temporarily disable lux closed-loop in deep dim zones; keep schedule and CCT setpoints.
- If sensor suspected: swap to a known-good ALS module and re-capture the 10 s bundle.
11.5 Symptom: “Schedule unreliable” / “RTC invalid after reboot”
- What to measure (2):
(1)
RTC_valid; (2)Scene_ID(and whether it matches the expected time window). - How to isolate:
- Scheduler/RTC if
RTC_valid=0 but the schedule still advances scenes (missing gating rule). - Persistence if reboot restores an unexpected
Scene_ID(wrong restore priority or stale NVM). - Priority override if a manual override persists longer than intended (override TTL not enforced).
- Scheduler/RTC if
- First fix (containment):
- If
RTC_valid=0: lock to “default safe scene” and block schedule transitions until time becomes valid. - Force a single-source-of-truth reset: clear override flags; restore last known good scene; log the restore state.
- If
11.6 Symptom: “Deep dim fades look stepped” (visible quantization)
- What to measure (2):
(1)
Gamma_id; (2)Lux_est(or a lux proxy derived from output). - How to isolate:
- Ramp if step visibility aligns with command updates (too-large step size or insufficient internal update rate).
- Multi-channel sync if CCT “wobbles” during dimming (channels are not ramped coherently).
- Sensor interaction if stepping appears only when closed-loop is enabled at very low lux.
- First fix (containment):
- Switch to a finer gamma / smaller effective step size in deep-dim region.
- Enforce synchronized multi-channel ramps (coordinator clamps per-channel slew together).
- Disable lux closed-loop below a minimum lux threshold; keep CCT open-loop + temperature compensation.
11.7 Symptom: “Thermal drift over a day” (color/brightness slowly shifts)
- What to measure (2):
(1)
Temp_C; (2)CCT_targetvsCCT_est(drift direction and magnitude). - How to isolate:
- Temperature compensation if drift is strongly correlated with
Temp_C(junction spectral shift or sensor tempco). - Aging / gain change if drift accumulates without major temperature movement (channel efficacy changes).
- Reachability if compensation pushes channels into saturation in hot states (unreachable target at temperature extremes).
- Temperature compensation if drift is strongly correlated with
- First fix (containment):
- Clamp compensation gains; keep scenes stable (avoid “scene breaking” due to over-correction).
- Prefer periodic re-normalization using a stable sensor (if present); otherwise revert to a conservative temp-indexed table.
Figure F11 — Debug decision flow (symptom → capture → isolate → first fix)
The flow enforces a single entry: capture the 10-second bundle first, then isolate into one root class before applying any fix.
H2-12 — FAQs (HCL troubleshooting, evidence-based)
Format per FAQ: Short answer (1 sentence) + What to measure (2 items) + First fix (1 action). Each answer stays inside the HCL engine boundary and points back to earlier chapters.
CCT_target/est, Lux_target/est, Cmd_norm[ch],
Temp_C, Scene_ID, Fault_code before applying any containment fix.
Q1 CCT target is correct, but it still looks “green/pink”—calibration matrix or sensor bias? → H2-4 / H2-6
Short answer: A stable green/pink tint usually comes from an incorrect mixing/calibration matrix or a biased color sensor estimate, even when CCT is numerically “right”.
- What to measure: (1)
CCT_targetvsCCT_estwhile holding the same scene; (2)Cmd_norm[ch]to confirm channel ratio is not being distorted by the loop. - First fix: Freeze chromaticity (hold channel ratio), then re-validate matrix/gains with a known-good sensor reference.
Q2 Brightness “breathes” every few seconds—ALS filtering or loop gain too high? → H2-6 / H2-2
Short answer: Periodic breathing is typically a closed-loop instability driven by noisy/stale ALS data or too-aggressive control updates (gain + rate).
- What to measure: (1)
Lux_targetvsLux_estto see oscillation; (2)Cmd_norm[ch]to confirm the actuator is “chasing” the estimate. - First fix: Increase deadband and enforce a stricter slew limit; if needed, temporarily run lux in open-loop while keeping CCT control.
Q3 Scene transitions shift CCT briefly—ramp coordination or channel slew clamps? → H2-7 / H2-3
Short answer: Brief CCT shifts during transitions usually indicate multi-channel ramps are not synchronized, or per-channel slew clamps are unequal and distort chromaticity mid-fade.
- What to measure: (1)
CCT_estduring the fade window; (2)Cmd_norm[ch]trajectories to verify channels change proportionally. - First fix: Enable a ramp coordinator that enforces synchronized channel ramps and shared slew constraints.
Q4 Schedule works for a day then drifts—RTC validity, drift, or override priority? → H2-5
Short answer: “Good for one day then wrong” is often RTC drift/invalid time, or an override priority/TTL that silently takes over the schedule state machine.
- What to measure: (1)
RTC_valid(and any drift estimate if logged); (2)Scene_IDvs expected time window to spot priority overrides. - First fix: Gate schedule execution on
RTC_valid; when invalid, lock to a safe default scene and clear expired overrides.
Q5 At very low dim levels, color jumps—gamma mapping or quantization of commands? → H2-7 / H2-9
Short answer: Color jumps at deep dim are usually perceptual gamma mismatches or command quantization where tiny numeric steps become visible, especially across multiple channels.
- What to measure: (1)
Gamma_idused in deep-dim; (2)Cmd_norm[ch]step granularity near the lowest levels. - First fix: Switch to a finer deep-dim gamma/step policy and enforce synchronized multi-channel stepping.
Q6 Cold start color is off, warms up and changes—temperature compensation missing? → H2-8 / H2-4
Short answer: A cold-start CCT shift that settles after warm-up typically indicates missing/incorrect temperature compensation (LED spectral shift and sensor tempco).
- What to measure: (1)
Temp_Cduring warm-up; (2)CCT_estdrift relative toCCT_targetin a fixed scene. - First fix: Apply a conservative temperature-indexed gain correction and clamp compensation so scenes remain stable.
Q7 CCT cannot reach the warmest/coolest scenes—channel saturation or wrong mixing bounds? → H2-3 / H2-10
Short answer: Unreachable extreme CCT scenes are usually saturation/reachability issues: one channel hits its limit, or mixing bounds define a “legal region” that excludes the requested setpoint.
- What to measure: (1)
Cmd_norm[ch](look for pinned near 0/1); (2)Fault_code/ saturation flags if implemented. - First fix: Clamp scene targets to the reachable region and log the reachability fault for recalibration/model updates.
Q8 Two fixtures show different CCT on the same scene—binning variation or stored gains? → H2-4
Short answer: Unit-to-unit CCT differences with identical scene IDs typically come from LED binning variation and/or mismatched stored calibration gains and matrices.
- What to measure: (1)
Cal_versionand calibration CRC (if logged) to confirm same dataset; (2)CCT_estunder the sameCmd_normto separate hardware binning vs config drift. - First fix: Reapply the correct calibration bundle (gains/matrix) and lock factory-only regions from field overwrite.
Q9 Sensor sometimes reads nonsense—stale detection or out-of-range handling? → H2-10 / H2-6
Short answer: Intermittent “nonsense” sensor readings usually mean stale frames, I²C glitches, or out-of-range values not being gated before they enter the estimator/loop.
- What to measure: (1)
Fault_codeand sensor status flags (stale/out-of-range); (2)Lux_estorCCT_estspikes vs normal ranges to confirm gating failure. - First fix: On invalid data, freeze estimates and revert to open-loop scene until sensor recovers.
Q10 Manual override doesn’t “stick” after reboot—persistence flags or restore policy? → H2-9
Short answer: Override loss after reboot is usually a persistence/restore policy bug: flags not set, TTL not stored, or boot restore prioritizes schedule/default over manual state.
- What to measure: (1)
Boot_restore_state(what was restored); (2)Scene_IDand last override state fields (if logged) to confirm policy ordering. - First fix: Persist override with TTL and restore it only if still valid; otherwise fall back deterministically to schedule.
Q11 After months, scenes look different—aging drift or recalibration strategy? → H2-8 / H2-4
Short answer: Long-term scene changes are typically aging drift: channel efficacy shifts and sensor reference drift require periodic re-normalization or scheduled recalibration to keep chromaticity consistent.
- What to measure: (1) trend of
CCT_estvsCCT_targetover time; (2)Temp_Cto rule out “seasonal temperature” effects masquerading as aging. - First fix: Add a controlled recalibration routine (factory reference or trusted sensor) and store versioned gains with CRC.
Q12 CCT is stable, but perceived comfort is poor—scene curve design or fade timing? → H2-5 / H2-7
Short answer: Comfort issues with stable CCT often come from schedule curve choices and fade timing: transitions may be too fast/slow or occur at the wrong times, even if the setpoint is “correct”.
- What to measure: (1)
Scene_IDtimeline with fade windows; (2)CCT_targetstep/ramp profile (how aggressively it moves). - First fix: Adjust scene table curves and extend fades to keep perceptual steps below noticeability.
Figure F12 — FAQ coverage map (questions → chapter anchors)
Use this map to keep the FAQ answers “inside scope”: each question must point back to the referenced chapter(s) and the evidence chain fields.