Attribute History
The Attribute History page displays historical data for any attribute with history tracking enabled. It provides charts, statistics, and analysis of how attribute values change over time.
Overview
Attribute History enables:
- Time-Series Charts: Visual representation of attribute changes
- Statistics: Count, first, and last for any attribute; min, max, and average for numeric ones
- Aggregation: No aggregation, 5-minute, hourly, or daily rollups
- Comparison: Multiple attributes on same chart
- Export: Download data as CSV
Selecting Data
System Target
Choose entity type to analyze:
- zone
- device
- subsystem
- variable
- monitor
- etc.
Target Object
Select specific entity:
- After choosing system target, dropdown populates with entities
- Example: Select zone → dropdown shows all zones
Once a target is selected, an open <name> link appears under the dropdown. It opens that record in a reference modal over the chart, so reading a spike and then checking the device or zone that produced it doesn't cost you the chart, the date window, or any series you have already added. Targets with no editor of their own (variable, monitor) show no link.
Attribute
Select which attribute to chart:
- Only shows attributes with history enabled
- Example: temperature, power, level, etc.
Chart Configuration
Date Range
Start Date: Beginning of historical period End Date: End of historical period
Quick Range Buttons:
- 1H - Last 1 hour
- 1D - Last 1 day
- 1W - Last 1 week
- 1M - Last 1 month
Aggregation
No Aggregation: Raw recorded data points
"Raw" means every row in the history table, which is not necessarily every value the device reported. Fast-polling analog values (power, energy, flow) are sampled with a deadband before they are stored — see History Deadband. Integer, string, and boolean attributes are stored on every change.
5 Minutes: Aggregate into 5-minute buckets
1 Hour: Aggregate by hour
- Average value per hour
1 Day: Aggregate by day
- Average value per day
Automatic aggregation only applies to numeric (int/float) attributes. A long date range on a bool, string, json, or date attribute stays on the raw path so the individual transitions are preserved — averaging a state value would throw away exactly what makes it readable. You can still pick a bucket size explicitly for those attributes; each bucket then charts its representative value rather than an average.
Chart Type
Line: Default, shows trends Bar: Good for discrete values Area: Emphasizes magnitude Scatter: Individual data points Heatmap (DoW × HoD): Averages bucketed by day-of-week × hour-of-day. Best for surfacing routines (when does HVAC run hardest, when is the room occupied). Requires numeric data.
Compare to Previous
Toggle to overlay the same attribute from the previous period of equal length. The overlay renders as a dashed series labeled previous: <attribute> with timestamps shifted forward so the prior week (or day, or month) lines up visually with the current window. Most useful for spotting week-over-week or day-over-day deviations.
Trigger Fires Overlay
When enabled, vertical markers appear on the chart at every point in the visible window where an attribute trigger fired for the displayed attribute. Marker colors:
- Green: trigger fired successfully
- Red: trigger fired but an action failed
- Grey (dashed): trigger conditions matched but the fire was skipped — usually because the day/hour mask blocked it or because the debounce window was still active
Marker data is sourced from the automation_history table — see Automation History below.
Automation History
GEM records every automation execution to an automation_history table, complementing the per-artifact summary rows used for reactive debugging:
- Triggers: every fire (and every condition-matching skip due to mask/debounce)
- Schedules: every cron fire, plus the macro it dispatched
- Macros: every run, with the upstream cause (
trigger/schedule/ui) preserved across nested macro calls so you can answer "what real-world event caused this?"
Rows include started_at, finished_at, status (success/failed/skipped), caused_by_type/caused_by_id, parent_run_id, and a context JSON with type-specific extras (the attribute that changed, the macro that ran, error messages, etc.). caused_by_* stays pinned to the root cause (the trigger, schedule, or UI action that started the chain), while parent_run_id records the immediate parent row — so a macro that runs another macro gets the calling macro's row id as its parent, building an edge-by-edge call graph.
Retention is configured under Data Retention with two windows:
- success days (default 14): how long to keep
success,skipped, anddebouncedrows - failure days (default 180): how long to keep
failedandabortedrows
A per-artifact cap of 10,000 rows also applies as a noisy-neighbor safety net — one chatty trigger can't drown the table even within the retention window.
Statistics Panel
Shows computed statistics for selected data:
- Min: Lowest value in range
- Max: Highest value in range
- Avg: Mean value
- Count: Number of data points
- First: First value in range
- Last: Most recent value in range
Min, Max, and Avg describe a magnitude, so they only appear for int and float attributes. With an aggregation selected, a bool, string, json, or date attribute shows just Count, First, and Last — printed as the stored value (true, armed, a timestamp) rather than as a rounded number. With No Aggregation, the panel is shown for numeric series only.
Non-Numeric Attributes
bool, string, and json attributes chart on a category axis: each distinct value gets its own line on the chart (disarmed, armed_home, armed_away) and the y-axis is labeled by value instead of by magnitude. That is the right way to read a state series — what you want from it is when it changed and what it changed to. (date values chart as timestamps, on a normal numeric axis.)
Earlier versions failed outright on these attributes: the statistics query asked the database for a minimum, maximum, and average of a boolean or text column, which it cannot compute, so the whole report errored and the chart reported "Failed to fetch aggregated data". Only int and float attributes charted at all. Nothing needs to be re-enabled — existing history rows chart correctly as soon as the page is reloaded.
Export
Click Export CSV to download the currently displayed data as a CSV file for external analysis.
Multiple Attributes
Compare multiple attributes on same chart:
- Select first attribute, add to chart
- Select different attribute, add to chart
- Both series display on same chart with independent colors
- Useful for correlation analysis
Examples:
- Temperature vs. setpoint
- Power consumption vs. outside temperature
- Multiple room temperatures
Common Use Cases
Temperature Monitoring
Track HVAC performance:
Configuration:
System Target: zone
Target: living_room_thermostat
Attribute: temperature
Date Range: Last 7 days
Aggregation: Hour
Analysis:
- Temperature stability
- HVAC cycle frequency
- Correlation with setpoint changes
- Energy efficiency
Energy Usage
Monitor power consumption:
Configuration:
System Target: device
Target: main_power_meter
Attribute: power_usage
Date Range: Last 30 days
Aggregation: Day
Analysis:
- Daily usage patterns
- Peak consumption times
- Day-of-week variations
- Month-over-month trends
Zone Usage Patterns
Understand room utilization:
Configuration:
System Target: zone
Target: conference_room_occupancy
Attribute: occupied
Date Range: Last 90 days
Aggregation: Day
Analysis:
- Room occupancy rates
- Busiest days
- Underutilized spaces
Sensor Trends
Monitor environmental sensors:
Configuration:
System Target: zone
Target: outdoor_sensor
Attribute: humidity
Date Range: Last year
Aggregation: Week
Analysis:
- Seasonal humidity patterns
- Irrigation scheduling
- Mold risk assessment
Storage and Performance
Attribute history is the highest-volume table in the system, and two mechanisms keep it usable:
- Deadband sampling on fast-moving analog values, so the table records signal rather than jitter. Configured with the
history_deadband_percentandhistory_deadband_max_intervalsystem attributes, or per attribute from Top Attribute History Writers — see History Deadband. - Indexes on
(system_target, target_id, name, timestamp)and ontimestamp, covering the per-series chart reads on this page, the "latest value" lookups, and the nightly retention prune. They are created automatically at startup; on a large existing table the first boot after upgrading spends a few seconds building them.
Retention is configured under Data Retention, and the nightly prune deletes in bounded batches so a large sweep doesn't block live attribute writes.
Related Documentation
- Attributes - Enabling history on attributes
- Zones - Zone attribute configuration
- Data Retention - Managing historical data retention