-
Notifications
You must be signed in to change notification settings - Fork 14
Diagnostic Sensors
Every decision the integration makes is visible in a diagnostic sensor. This page is the per-sensor / per-attribute reference. For a symptom-driven walkthrough, see Troubleshooting.
Entity IDs follow the pattern sensor.{device_name}_{suffix} (or binary_sensor.…), where {device_name} is the slug of the device name you chose at setup.
Most "why did it do that?" questions are answered by four sensors:
| Sensor | What it tells you |
|---|---|
sensor.{device}_decision_trace |
The winning pipeline handler (state) plus every handler that was evaluated (attribute). |
sensor.{device}_cover_position |
The target position, with reason, control_method, and position_explanation attributes explaining how it was chosen. |
sensor.{device}_last_skipped_action |
Why the most recent commanded move was suppressed (delta-position / delta-time / dry-run / disabled). |
sensor.{device}_control_status |
The current operational state and why automatic control isn't running, when it isn't. |
If you're not sure where to look, start with decision_trace.
State: the winning pipeline handler's identifier — one of solar, default, manual_override, force_override, weather_override, cloud_suppression, custom_position, glare_zone, motion_timeout, summer, winter. unknown until the first pipeline run.
| Attribute | Meaning |
|---|---|
trace |
List of every handler evaluated in priority order. Each entry has handler, matched (true/false), reason (why it matched or was skipped), position (what it would have proposed), and optionally tilt. |
reason |
One-line explanation of why the winning handler won. |
enabled_handlers |
Which handlers are configured for this entry (the rest are skipped before the pipeline even runs). |
bypass_auto_control |
True when the winning handler bypasses the Automatic Control switch (Force Override and Weather Override do; safety handlers must always fire). |
default_position, configured_default, configured_sunset_pos, is_sunset_active
|
The fallback the pipeline would use absent any override, plus whether the sunset window is currently active. |
in_time_window |
True when inside the configured operational hours. |
sun_azimuth, sun_elevation, gamma
|
Current solar geometry — see also sun_position. |
in_field_of_view, elevation_valid, in_blind_spot, sunset_window_active
|
Sun-validity flags the solar/default handlers consult. |
sun_state |
One-word classification of the sun's relationship to the window, derived from the validity primitives: hitting (direct sun is valid and the solar handler is engaging), in_fov_not_valid (sun is within the field of view but not driving the cover — e.g. elevation out of range, blind spot, or sunset window active), or outside_fov (sun is outside the tracking arc). Mirrored into the downloaded diagnostics under sun_validity. |
weather_active_conditions, weather_in_clear_delay
|
Only present when the weather handler is winning. |
custom_position_active_slot |
Only present when a Custom Position handler wins. 1-based slot number (1–4) identifying which custom position slot is in control. Lets automations and the companion card branch on the active slot without parsing the reason string. |
custom_position_minimum_mode |
Only present when the winning slot uses minimum mode. true when the configured floor is raising the cover above the raw autonomous calculation (floor is actively constraining); false when the raw calc already meets or exceeds the floor (floor is a no-op). Absent in exact mode or on the use_my path. |
Example trace shape:
trace:
- handler: force_override
matched: false
reason: "no configured sensor active"
position: null
- handler: weather_override
matched: false
reason: "wind 12 km/h below threshold 40"
position: null
- handler: solar
matched: true
reason: "sun in FOV at gamma -23°"
position: 67Standalone sensor whose state mirrors decision_trace's state. Useful when you want a single string in an automation trigger without parsing attributes. Same value set as above, plus the historical names solar and default for the calculated/idle cases.
State: the operational state of automatic control, summarising why the integration is (or isn't) actively driving the cover. Examples: manual_override, outside_time_window, invalid_elevation, in_blind_spot, plus the winning-handler name during normal operation.
| Attribute | Meaning |
|---|---|
reason |
Human-readable explanation of the current state. |
automatic_control_enabled |
Mirrors the Automatic Control switch. |
time_window_status, after_start_time, before_end_time
|
Where you are in the operational time window. |
sun_validity_status, valid_elevation, in_blind_spot
|
Why solar tracking is or isn't engaging. |
manual_covers |
List of cover entity_ids currently in manual-override state (only when state == manual_override). |
delta_position_threshold, delta_time_threshold_minutes
|
The thresholds the command service uses to decide whether to send. |
position_delta_from_last_action, seconds_since_last_action
|
How close the current calculation is to triggering a fresh command. |
last_updated |
Timestamp of the last full update cycle. |
State: short summary of the most recent move, e.g. set_cover_position → living_room_blind at 14:23:07.
| Attribute | Meaning |
|---|---|
entity_id, service, position, timestamp
|
What was sent, to which cover, when. |
calculated_position, inverse_state_applied
|
The position before HA's inverse-state convention was applied. |
covers_controlled |
How many covers the same command targeted. |
threshold_used, threshold_comparison
|
The delta threshold the command had to clear, and the comparison that passed. |
State: the machine-readable reason the most recent commanded move was suppressed. No action skipped when nothing has been suppressed yet.
| State | Meaning |
|---|---|
delta_too_small |
Change less than the configured minimum delta. Check position_delta vs. min_delta_required attributes. |
time_delta_too_small |
Not enough time since the last move. Check elapsed_minutes vs. time_threshold_minutes attributes. |
manual_override |
Automatic control is paused because a manual move was detected. |
auto_control_off |
The Automatic Control switch is off. |
no_capable_service |
No usable HA service found for this cover entity. |
service_call_failed |
HA service call was sent but threw an error. Check the HA logs. |
integration_disabled |
The integration is disabled in HA. Re-enable it under Settings → Devices & Services. |
dry_run |
Dry-run mode is active; commands are logged but not sent. Disable in the integration options. |
cover_unavailable |
The underlying cover entity is not yet registered or is reporting unavailable. Common right after HA restart on platforms that load late (e.g. Homematic IP); the integration retries automatically once the entity comes online. |
| Attribute | Meaning |
|---|---|
entity_id, current_position, calculated_position
|
The candidate move that was skipped. |
position_delta, elapsed_minutes
|
How far below threshold the move was. |
min_delta_required, time_threshold_minutes
|
The thresholds the move had to clear. |
trigger |
What initiated the attempt (solar, startup, sunset, etc.). |
timestamp |
When the skip happened. |
State: current solar azimuth in degrees.
| Attribute | Meaning |
|---|---|
elevation |
Sun elevation above the horizon. |
gamma |
Signed angle between the sun and the window normal — the core input to all position calculations. |
gamma_interpretation |
Plain-English bucket: nearly perpendicular (<10°), oblique angle (<45°), steep angle (<80°), nearly parallel. |
gamma_absolute_angle, gamma_direction
|
Absolute value and left / center / right of the window normal. |
window_azimuth, fov_left, fov_right
|
The configured window orientation and field-of-view spread. |
azimuth_min, azimuth_max, in_fov
|
Computed FOV edges and whether the sun is currently inside them. |
min_elevation, max_elevation
|
Configured elevation cut-offs for solar tracking. |
blind_spot_range |
When a blind spot is configured, the angular range it covers. |
State: time of day the sun enters / exits the window's field of view (5-minute resolution). Attributes carry the corresponding azimuth and elevation.
on when the sun is geometrically in front of the window inside the configured FOV. The same flag fed into the solar handler.
State: timestamp when the most-recent-expiring manual override will release. unknown when no cover is currently in manual mode.
| Attribute | Meaning |
|---|---|
per_entity |
Dict of cover_entity_id → ISO timestamp for every cover currently in manual override. |
State: count of configured Force Override sensors that are currently on. null when no Force Override sensors are configured.
| Attribute | Meaning |
|---|---|
per_sensor |
Dict of sensor_entity_id → state for every configured Force Override sensor. |
total_configured |
How many Force Override sensors the entry has configured. |
on when any managed cover is currently in manual-override state. Attribute manual_controlled lists the affected entity_ids.
on when the Glare Zones handler is currently extending the cover to shield a protected floor zone (vertical blinds only, when Glare Zones is enabled).
State: Summer Mode, Winter Mode, or Intermediate. Only present when Climate Mode is configured.
| Attribute | Meaning |
|---|---|
active_temperature, temperature_unit
|
The temperature value driving the decision. |
indoor_temperature, outdoor_temperature, temp_switch
|
Both readings and which direction (summer / winter) the comparison is using. |
is_presence, is_sunny
|
Presence-entity state and weather-state-matches-sunny-conditions flag. |
lux_active, irradiance_active
|
True when the corresponding sensor is below its low-light threshold (only present when configured). |
State: motion_detected, timeout_pending, no_motion, holding, waiting_for_data, or not_configured.
| Attribute | Meaning |
|---|---|
motion_timeout_seconds |
The configured timeout. |
last_motion_time |
ISO timestamp of the last motion event. |
motion_timeout_end_time |
When the timeout will fire (only present when a timeout is pending or active). |
State: the maximum retry count across all managed covers (0 when everything is at target). Use it to spot covers that aren't honouring their commands.
| Attribute | Meaning |
|---|---|
max_retries |
The configured retry ceiling. |
per_entity |
Dict of cover_entity_id → {retry_count, last_reconcile_time, …} per-cover diagnostics. |
last_reconcile_time |
Latest reconcile timestamp across all covers. |
See Position Verification for the reconcile loop's full behaviour.
on when any managed cover's reported position diverges from the integration's target by more than the configured tolerance. Disabled by default — enable it in the entity registry when you want a single alert flag.
sensor.{device}_cover_position is a main sensor (not diagnostic), but it carries several attributes that are essential when the number looks wrong even though decision_trace looks right:
| Attribute | Meaning |
|---|---|
raw_calculated_position |
The pure geometric sun-tracking position before min/max limits, climate adjustments, or HA's inverse-state convention are applied. Compare against the published state to see what's modifying it. |
edge_case_detected |
true when the geometric solver tripped an edge-case branch (very low elevation, near-parallel sun, etc.). Combined with safety_margin > 1, this explains "the position jumped". |
safety_margin |
Multiplier (≥1.0) applied to the geometric calculation at steep gamma or extreme elevations. Adds conservative coverage. |
effective_distance |
The distance used by the solver after sill-height offset. Useful when the calculated position seems off for a given window geometry. |
actual_positions |
Dict of cover_entity_id → current reported position for every managed cover. |
all_at_target |
true when every cover is within position tolerance of the target. false means at least one cover is still moving or stuck. |
reason, control_method, position_explanation
|
The same fields exposed on decision_trace and control_method — mirrored here for convenience. |
For step-by-step diagnosis, start at Troubleshooting. The table below is the quick index when you already know what symptom you're chasing.
| Symptom | First sensor to check |
|---|---|
| Cover moved unexpectedly |
decision_trace.state then decision_trace.trace
|
| Cover didn't move when expected | last_skipped_action.state |
| Target position doesn't match calculation |
cover_position.raw_calculated_position + cover_position.safety_margin
|
| Cover is in manual mode and won't release | manual_override_end_time.per_entity |
| Climate mode isn't switching to summer/winter |
climate_status.active_temperature + temp_switch
|
| Motion timeout never fires |
motion_status.state + last_motion_time
|
| A Force Override sensor isn't taking effect | force_override_triggers.per_sensor |
| Calculated position is right but cover isn't moving there |
position_verification.per_entity + binary_sensor.{device}_position_mismatch
|
| Solar tracking is paused |
control_status.sun_validity_status + sun_position.in_fov
|
| Outside operational hours unexpectedly | control_status.time_window_status |
Download path: Settings → Devices & Services → Adaptive Cover Pro → ⋮ → Download Diagnostics. For the Dry Run / Debug Mode workflow around reproducing issues without moving covers, see Debug & Diagnostics.
The JSON contains:
-
meta— integration version, cover type, coordinator health -
solar— sun azimuth/elevation, gamma -
position— calculated position, control status, position explanation, delta/time thresholds, geometric calc details -
decision_trace— full per-handler decision chain -
time_window— operational hours state and configured defaults -
sun_validity— elevation, blind-spot, sunset-window flags, plus the derivedsun_state(hitting/in_fov_not_valid/outside_fov) -
climate— active temperature, indoor/outdoor, strategy, climate conditions -
last_action,last_skipped_action— most recent command + most recent skip -
covers— live cover entity states and capabilities -
manual_override_state— per-entity manual override state -
configuration— every option value the entry currently uses -
debug_info— event timeline, manual override history, cover-command states
Privacy: the snapshot contains entity IDs and position history but no credentials or location data, so it's safe to attach to public GitHub issues.
- Troubleshooting — symptom-driven walkthrough
- Debug & Diagnostics — Dry Run + log categories
- Entities — every entity the integration exposes, not just diagnostics
- How It Decides — pipeline priority order and what each handler does
🏠 Home · ✨ Features · 📰 What's New
🚀 Getting Started
- Installation
- Migrating from Custom Repository
- Migrating from Adaptive Cover
- First-Time Setup
- Cover Types
🧠 Core Concepts
📐 Cover Types
⚙️ Configuration
- Sun Tracking
- Position
- Position Matching
- Glare Zones
- Automation
- Custom Position
- Force Override
- Weather Safety
- Climate
- Templated Thresholds
- Blindspot
- Summary Screen
- Debug & Diagnostics
🔌 Entities & Services
- Entities
- Proxy Cover Entity
- Position Verification
- My Position Support (Somfy RTS)
- Runtime Configuration Services
🛠️ Operations
🔧 Advanced Use Cases
- Dynamic Temperature Thresholds
- Dynamic Tracking Window
- Bedroom Sleep Mode
- Handling Variable Cloud Cover
- Venetian Tilt-Only on Overcast Days
- Forecast-Based Shading
🎨 Dashboard
🧪 Testing & Simulation
📚 Reference
👩💻 For Developers