Skip to main content

Live Data

By enabling live data when configuring the F1 Sensor, Home Assistant can react to live data from an ongoing session such as practice, qualifying, or race. These entities update shortly before, during, and shortly after a session. Outside session times, they become unavailable. The only exception is the Driver List sensor, which retains its last known state to support dashboard graphics even between sessions.

F1 Live Timing API

The data for these entities comes from the F1 Live Timing API, which is unofficial. There is no known official documentation, and the API may change without prior notice.


Reference: Enum Values

Use this section to understand the possible values for enum-type states and attributes across all live data sensors.

Tyre Compounds
ValueShortColorDescription
SOFTS#FF0000 (red)Soft compound - fastest, least durable
MEDIUMM#FFFF00 (yellow)Medium compound - balanced performance
HARDH#FFFFFF (white)Hard compound - slowest, most durable
INTERMEDIATEI#00FF00 (green)Intermediate - light rain conditions
WETW#0000FF (blue)Full wet - heavy rain conditions
Track Status
ValueDescription
CLEARNormal racing conditions, green flag
YELLOWYellow flag - caution, hazard on track
VSCVirtual Safety Car deployed
SCSafety Car deployed
REDRed flag - session stopped
Session Status
ValueDescription
prePre-session, typically 60-15 minutes before start
liveSession is active (lights out for race)
suspendedSession temporarily halted
breakBreak between session segments
finishedSession has finished
finalisedResults have been finalised
endedSession has ended

Typical transition flow: prelivesuspendedlivefinishedfinalisedended

Current Session Types
ValueDescription
Practice 1First practice session
Practice 2Second practice session
Practice 3Third practice session
QualifyingQualifying session
Sprint QualifyingSprint qualifying/shootout
SprintSprint race
RaceMain race
unknownSession type not determined
Live Timing Mode
ValueDescription
idleNo active session, connection inactive
liveConnected to live F1 timing feed
replayPlaying back recorded session data
Driver Status (in driver_positions)
ValueDescription
on_trackDriver is currently on track
pit_inDriver is in the pit lane
pit_outDriver has just exited pits
outDriver has retired or stopped
Straight Mode (2026 regulation)
ValueDescription
normal_gripNormal aerodynamic configuration permitted on straight sections
low_gripRestricted aerodynamic configuration on straight sections
disabledStraight mode system is not active

Entities Summary

EntityInfo
sensor.f1_session_statusCurrent session phase
sensor.f1_current_sessionCurrent ongoing session, like Practice 1, Qualification, Race
sensor.f1_session_time_elapsedTime elapsed in the current session (beta)
sensor.f1_session_time_remainingTime remaining in the current session (beta)
sensor.f1_track_statusCurrent track status
binary_sensor.f1_safety_carSafety Car (SC) or Virtual Safety Car (VSC) is active
sensor.f1_race_lap_countCurrent race lap number
sensor.f1_track_weatherCurrent on-track weather (air temp, track temp, rainfall, wind speed, etc.)
sensor.f1_driver_listShow list and details on all drivers, including team color, headshot URL etc
sensor.f1_pitstopsLive pit stop events and aggregated pit stop series per car
sensor.f1_team_radioLatest team radio message and rolling history
sensor.f1_current_tyresCurrent tyre compound per driver
sensor.f1_tyre_statisticsAggregated tyre statistics per compound
sensor.f1_driver_positionsDriver positions and lap times
sensor.f1_top_three_p1Dedicated sensors for current P1, P2 and P3
sensor.f1_race_controlRace Control messages feed (flags, incidents, key updates)
sensor.f1_track_limitsTrack limits violations per driver (deletions, warnings, penalties)
sensor.f1_investigationsActive steward investigations and pending penalties
binary_sensor.f1_formation_startIndicates when formation start procedure is ready
sensor.f1_championship_prediction_driversDrivers championship prediction (P1 and list)
sensor.f1_championship_prediction_teamsConstructors championship prediction (P1 and list)
binary_sensor.f1_overtake_modeON when track-wide overtake mode is enabled (2026 regulation, experimental)
sensor.f1_straight_modeActive aerodynamic straight mode state (2026 regulation, experimental)

Entities

All of these entities update only in relation to an active session, typically starting less than an hour before and continuing for a few minutes after the session ends. Outside these windows, the entities will be set to Unavailable (not updating and not providing new data).

Session Status

Semantic session lifecycle based on the live Session Status. The pre state usually occurs 60–15 minutes before a session begins. The sensor goes live when the session officially starts, for races, this means lights out, not the beginning of the formation lap.

State (enum)

  • One of: pre, live, suspended, break, finished, finalised, ended.

Example

live

Typical transitions
pre → live → suspended ↔ live → finished → finalised → ended
After finalised or ended, logic resets and next session begins at pre.

Attributes

AttributeTypeDescription
(none)No extra attributes

Current Session

Human-readable label for the active session. Only shows a state when sensor.f1_session_status is live

State (enum/string)

  • Practice 1, Practice 2, Practice 3, Qualifying, Sprint Qualifying, Sprint, Race, or unknown when inactive (e.g., outside live/eligible windows).

Example

Qualifying

Attribute

AttributeTypeDescription
typestringRaw Type from feed (Practice/Qualifying/Race)
namestringRaw Name (may carry “Sprint”/“Sprint Qualifying”)
numbernumberSession number (e.g., 1/2/3 for practice)
session_partnumberDetected session part (e.g., 1/2/3 for Q1/Q2/Q3) when available
meeting_keynumberMeeting key
meeting_namestringMeeting name
meeting_locationstringLocation
meeting_countrystringCountry
circuit_short_namestringCircuit short name
gmt_offsetstringEvent GMT offset
startstringSession start ISO‑8601
endstringSession end ISO‑8601
live_statusstringRaw SessionStatus message (Started, Finished, etc.)
activebooleanTrue when live running is active
last_labelstringLast resolved label when not active

Session Time Elapsed

Beta

This sensor is currently in beta. The behavior has not been verified across all session types, edge cases (red flags, suspensions, qualifying segments), and timing scenarios. Treat the values as indicative rather than definitive until further testing is complete.

sensor.f1_session_time_elapsed - How much of the scheduled session time has passed, based on the F1 ExtrapolatedClock feed. The clock advances in real time while a session is running and pauses during interruptions such as red flags or safety car delays.

State

  • String: elapsed time formatted as H:MM:SS (e.g., 0:23:45), or unavailable when no data is available.

Example

0:23:45

Attributes

AttributeTypeDescription
session_typestringSession type (e.g., "Practice", "Qualifying", "Race")
session_namestringSession name (e.g., "Practice 1", "Race")
session_partnumberSession part, for example the qualifying segment (Q1/Q2/Q3)
session_statusstringCurrent session status from the feed
clock_phasestringClock state: idle, running, paused, or finished
clock_runningbooleanWhether the clock is actively counting
source_qualitystringData source reliability (see below)
session_start_utcstringISO‑8601 timestamp of the session start
reference_utcstringISO‑8601 timestamp used as the clock reference point
last_server_utcstringISO‑8601 timestamp of the last server heartbeat
value_secondsnumberElapsed time in whole seconds
formatted_hmsstringElapsed time formatted as H:MM:SS
clock_total_snumberTotal scheduled session duration in seconds, when known
clock_remaining_snumberRemaining time in seconds, when known

source_quality values

ValueDescription
officialClock data from ExtrapolatedClock with server heartbeat confirmation
official_no_heartbeatClock data from ExtrapolatedClock, but no heartbeat received yet
sessiondata_fallbackElapsed time estimated from session schedule data, not from the live clock feed
unavailableNo usable timing data available

Session Time Remaining

Beta

This sensor is currently in beta. The behavior has not been verified across all session types, edge cases (red flags, suspensions, qualifying segments), and timing scenarios. Treat the values as indicative rather than definitive until further testing is complete.

sensor.f1_session_time_remaining - How much scheduled session time is left, based on the F1 ExtrapolatedClock feed. Like the elapsed sensor, this clock pauses during interruptions and resumes when the session restarts.

State

  • String: remaining time formatted as H:MM:SS (e.g., 0:36:15), or unavailable when no data is available.

Example

0:36:15

Attributes

AttributeTypeDescription
session_typestringSession type (e.g., "Practice", "Qualifying", "Race")
session_namestringSession name (e.g., "Practice 1", "Race")
session_partnumberSession part, for example the qualifying segment (Q1/Q2/Q3)
session_statusstringCurrent session status from the feed
clock_phasestringClock state: idle, running, paused, or finished
clock_runningbooleanWhether the clock is actively counting
source_qualitystringData source reliability (see source_quality values above)
session_start_utcstringISO‑8601 timestamp of the session start
reference_utcstringISO‑8601 timestamp used as the clock reference point
last_server_utcstringISO‑8601 timestamp of the last server heartbeat
value_secondsnumberRemaining time in whole seconds
formatted_hmsstringRemaining time formatted as H:MM:SS
clock_total_snumberTotal scheduled session duration in seconds, when known
Session clock behavior

The session clock counts down the scheduled duration of the session. It does not account for race laps — in a race, the session ends when the leader completes the required number of laps, which may happen before or (rarely) after the scheduled time expires. Use sensor.f1_race_lap_count for lap-based progress.


Track Status

Current track status from the live feed. The state is often CLEAR even when no session is active.

State (enum)

  • One of: CLEAR, YELLOW, VSC, SC, RED.

Example

CLEAR

Attributes

AttributeTypeDescription
(none)No extra attributes

Safety Car

On while the Safety Car or Virtual Safety Car is in effect.

State (on/off)

  • on when track status is SC or VSC; otherwise off.

Example

on

Attributes

AttributeTypeDescription
track_statusstringNormalized track status (CLEAR, YELLOW, VSC, SC, RED)

Race Lap

Current lap and total laps during the race.

State

  • Integer: current lap, or unknown if none available or stale cleared.

Example

23

Attributes

AttributeTypeDescription
total_lapsnumberTotal laps when known; preserved across updates
Info

This sensor is active only during sprint and race sessions.


Track Weather

Live trackside weather from F1 Live Timing. Updates only in direct connection with a session, and remains unchanged otherwise.

State

  • Number: air temperature (°C), or unknown.

Example

18.6

Attributes

AttributeTypeDescription
air_temperaturenumberAir temperature (°C)
air_temperature_unitstring“celsius”
humiditynumber% RH
humidity_unitstring“%”
pressurenumberhPa
pressure_unitstring“hPa”
rainfallnumbermm
rainfall_unitstring“mm”
track_temperaturenumberTrack temperature (°C)
track_temperature_unitstring“celsius”
wind_speednumberm/s
wind_speed_unitstring“m/s”
wind_from_direction_degreesnumberWind direction (degrees)
wind_from_direction_unitstring“degrees”
measurement_inferredbooleanTrue if payload had no explicit timestamp
INFO

Updates approximately every minute during an active session.


Driver List

Live roster of drivers with identity and team information for the session.

State

  • Integer: number of drivers in the list.

Example

20

Attributes

AttributeTypeDescription
driverslistList of driver information, sorted by car number

Each entry in drivers contains:

FieldTypeDescription
racing_numberstringCar number
tlastringThree-letter abbreviation (driver code)
namestringFull name
first_namestringFirst name
last_namestringLast name
teamstringTeam name
team_colorstringTeam color as hex code (e.g., "#3671C6")
headshot_smallstringURL to small driver headshot image
headshot_largestringURL to large driver headshot image
referencestringExternal reference URL or ID
JSON Structure Example
{
"drivers": [
{
"racing_number": "1",
"tla": "VER",
"name": "Max VERSTAPPEN",
"first_name": "Max",
"last_name": "Verstappen",
"team": "Red Bull Racing",
"team_color": "#3671C6",
"headshot_small": "https://media.formula1.com/content/dam/fom-website/drivers/M/MAXVER01_Max_Verstappen/maxver01.png",
"headshot_large": "https://media.formula1.com/content/dam/fom-website/drivers/M/MAXVER01_Max_Verstappen/maxver01-large.png",
"reference": "max_verstappen"
},
{
"racing_number": "44",
"tla": "HAM",
"name": "Lewis HAMILTON",
"first_name": "Lewis",
"last_name": "Hamilton",
"team": "Ferrari",
"team_color": "#ED1131",
"headshot_small": "https://media.formula1.com/content/dam/fom-website/drivers/L/LEWHAM01_Lewis_Hamilton/lewham01.png",
"headshot_large": "https://media.formula1.com/content/dam/fom-website/drivers/L/LEWHAM01_Lewis_Hamilton/lewham01-large.png",
"reference": "lewis_hamilton"
}
]
}
Jinja2 Template Examples

Get a driver's headshot URL:

{% set drivers = state_attr('sensor.f1_driver_list', 'drivers') %}
{% set ver = drivers | selectattr('tla', 'eq', 'VER') | first %}
{% if ver %}
{{ ver.headshot_large }}
{% endif %}

Get team color for styling:

{% set drivers = state_attr('sensor.f1_driver_list', 'drivers') %}
{% set driver = drivers | selectattr('racing_number', 'eq', '44') | first %}
{% if driver %}
background-color: {{ driver.team_color }};
{% endif %}

List all drivers for a team:

{% set drivers = state_attr('sensor.f1_driver_list', 'drivers') %}
{% for d in drivers if d.team == 'Ferrari' %}
{{ d.name }} (#{{ d.racing_number }})
{% endfor %}

Create a driver lookup by TLA:

{% set drivers = state_attr('sensor.f1_driver_list', 'drivers') %}
{% set lookup = dict.from_keys(drivers | map(attribute='tla') | list, drivers) %}
{{ lookup.VER.name }} drives for {{ lookup.VER.team }}

Generate image elements for all drivers:

{% set drivers = state_attr('sensor.f1_driver_list', 'drivers') %}
{% for d in drivers %}
<img src="{{ d.headshot_small }}" alt="{{ d.name }}" style="border: 2px solid {{ d.team_color }}">
{% endfor %}
Headshot Images

The headshot URLs are provided by F1 and may change between sessions. This sensor retains its last known state between sessions to support dashboard graphics even when no session is active.


Pit Stops

sensor.f1_pitstops - Live pit stop information from the F1 Live Timing feed, aggregated per car.

State

  • Integer: total number of pit stops recorded in the current session, or 0 when none are available.

Example

7

Attributes

AttributeTypeDescription
carsobjectMap of racing numbers to pit stop details
last_updatestringISO‑8601 timestamp of the last received pit stop event

Each entry in cars (keyed by racing number) contains:

FieldTypeDescription
tlastringDriver code (TLA) when available
namestringDriver name when available
teamstringTeam name when available
countnumberNumber of pit stops recorded for the car
stopslistList of pit stops (most recent stops kept, best effort)

Each entry in stops contains:

FieldTypeDescription
lapnumberLap number when the stop happened
timestampstringTimestamp from the feed when available
pit_stop_timenumberStationary time (seconds), when available
pit_lane_timenumberTotal pit lane time (seconds), when available
pit_deltanumberEstimated loss vs a normal lap (seconds), when available
INFO

Active during race and sprint sessions.


Team Radio

Latest team radio clip with a rolling history, sourced from the Team Radio stream. This is a curated selection of radio traffic, similar to what is broadcast during TV coverage, not the full raw radio feed.

State

  • ISO‑8601 timestamp of the most recent radio clip, or unknown when none are available.

Example

2026-03-14T15:22:31Z

Attributes

AttributeTypeDescription
utcstringISO‑8601 timestamp of the radio clip
received_atstringISO‑8601 timestamp when Home Assistant received the message
racing_numberstringCar number of the driver (e.g., "1", "44")
pathstringRelative path to the audio file
clip_urlstringFull URL to the audio clip
sequencenumberMessage counter for deduplication
historylistRolling list of recent radio clips (up to 20), each with utc, racing_number, path, and clip_url
raw_messageobjectOriginal payload from the live feed
INFO

Updates during all live sessions when radio traffic is available.


Current Tyres

Shows the current tyre compound for each driver in the active session.

State

  • Integer: number of drivers with tyre information available.

Example

20

Attributes

AttributeTypeDescription
driverslistList of driver tyre information, sorted by car number

Each entry in drivers contains:

FieldTypeDescription
racing_numberstringCar number
tlastringThree-letter abbreviation (driver code)
team_colorstringTeam color as hex code (e.g., "#3671C6")
positionstringCurrent position in the session
compoundstringTyre compound name (e.g., "SOFT", "MEDIUM", "HARD", "INTERMEDIATE", "WET")
compound_shortstringSingle-letter abbreviation ("S", "M", "H", "I", "W")
compound_colorstringHex color code for the compound (e.g., "#FF0000" for soft)
newbooleanWhether the tyres are brand new
stint_lapsnumberNumber of laps on the current set
JSON Structure Example
{
"drivers": [
{
"racing_number": "1",
"tla": "VER",
"team_color": "#3671C6",
"position": "1",
"compound": "MEDIUM",
"compound_short": "M",
"compound_color": "#FFFF00",
"new": false,
"stint_laps": 15
},
{
"racing_number": "44",
"tla": "HAM",
"team_color": "#ED1131",
"position": "2",
"compound": "HARD",
"compound_short": "H",
"compound_color": "#FFFFFF",
"new": true,
"stint_laps": 3
},
{
"racing_number": "4",
"tla": "NOR",
"team_color": "#FF8000",
"position": "3",
"compound": "SOFT",
"compound_short": "S",
"compound_color": "#FF0000",
"new": true,
"stint_laps": 1
}
]
}
Jinja2 Template Examples

Get a driver's current tyre:

{% set drivers = state_attr('sensor.f1_current_tyres', 'drivers') %}
{% set ver = drivers | selectattr('tla', 'eq', 'VER') | first %}
{% if ver %}
VER on {{ ver.compound }} ({{ ver.stint_laps }} laps{% if ver.new %}, NEW{% endif %})
{% endif %}

Count drivers on each compound:

{% set drivers = state_attr('sensor.f1_current_tyres', 'drivers') %}
{% if drivers %}
SOFT: {{ drivers | selectattr('compound', 'eq', 'SOFT') | list | length }}
MEDIUM: {{ drivers | selectattr('compound', 'eq', 'MEDIUM') | list | length }}
HARD: {{ drivers | selectattr('compound', 'eq', 'HARD') | list | length }}
{% endif %}

List drivers on fresh tyres:

{% set drivers = state_attr('sensor.f1_current_tyres', 'drivers') %}
{% for d in drivers if d.new %}
{{ d.tla }} - fresh {{ d.compound }}
{% endfor %}

Find driver with most laps on current stint:

{% set drivers = state_attr('sensor.f1_current_tyres', 'drivers') %}
{% if drivers %}
{% set longest = drivers | sort(attribute='stint_laps', reverse=true) | first %}
{{ longest.tla }} has {{ longest.stint_laps }} laps on {{ longest.compound }}
{% endif %}

Create a tyre summary with colors:

{% set drivers = state_attr('sensor.f1_current_tyres', 'drivers') %}
{% for d in drivers | sort(attribute='position') %}
P{{ d.position }} {{ d.tla }}: {{ d.compound_short }} ({{ d.stint_laps }} laps)
{% endfor %}

Tyre Statistics

sensor.f1_tyre_statistics - Aggregated tyre performance statistics per compound, showing fastest times and usage across all drivers.

State

  • String: name of the fastest compound (e.g., "SOFT"), or unknown when not available.

Example

SOFT

Attributes

AttributeTypeDescription
fastest_timestringOverall fastest lap time across all compounds
fastest_time_secsnumberFastest lap time in seconds
deltasobjectTime delta to fastest for each compound (e.g., {"MEDIUM": "+0.342", "HARD": "+0.891"})
start_compoundslistList of compounds used at race start, one entry per driver with racing number and compound
compoundsobjectDetailed statistics per compound

Each entry in compounds (keyed by compound name) contains:

FieldTypeDescription
best_timeslistTop 3 fastest lap times on this compound
total_lapsnumberTotal laps completed on this compound
sets_usednumberNumber of new tyre sets used
sets_used_totalnumberTotal stints on this compound
compound_colorstringHex color code for the compound

Each entry in best_times contains:

FieldTypeDescription
timestringLap time (e.g., "1:31.234")
racing_numberstringCar number
tlastringDriver code

Each entry in start_compounds contains:

FieldTypeDescription
racing_numberstringCar number
compoundstringTyre compound used at race start
JSON Structure Example
{
"fastest_time": "1:31.234",
"fastest_time_secs": 91.234,
"deltas": {
"SOFT": "+0.000",
"MEDIUM": "+0.342",
"HARD": "+0.891"
},
"start_compounds": [
{ "racing_number": "1", "compound": "MEDIUM" },
{ "racing_number": "44", "compound": "HARD" },
{ "racing_number": "4", "compound": "MEDIUM" }
],
"compounds": {
"SOFT": {
"best_times": [
{ "time": "1:31.234", "racing_number": "1", "tla": "VER" },
{ "time": "1:31.456", "racing_number": "4", "tla": "NOR" },
{ "time": "1:31.567", "racing_number": "44", "tla": "HAM" }
],
"total_laps": 45,
"sets_used": 8,
"sets_used_total": 12,
"compound_color": "#FF0000"
},
"MEDIUM": {
"best_times": [
{ "time": "1:31.576", "racing_number": "1", "tla": "VER" },
{ "time": "1:31.789", "racing_number": "16", "tla": "LEC" }
],
"total_laps": 120,
"sets_used": 15,
"sets_used_total": 20,
"compound_color": "#FFFF00"
},
"HARD": {
"best_times": [
{ "time": "1:32.125", "racing_number": "63", "tla": "RUS" }
],
"total_laps": 80,
"sets_used": 6,
"sets_used_total": 8,
"compound_color": "#FFFFFF"
}
}
}
Jinja2 Template Examples

Get the fastest compound:

Fastest compound: {{ states('sensor.f1_tyre_statistics') }}

Get fastest time on a specific compound:

{% set compounds = state_attr('sensor.f1_tyre_statistics', 'compounds') %}
{% if compounds and compounds.SOFT %}
{% set best = compounds.SOFT.best_times | first %}
Fastest on SOFT: {{ best.time }} by {{ best.tla }}
{% endif %}

Show delta between compounds:

{% set deltas = state_attr('sensor.f1_tyre_statistics', 'deltas') %}
{% if deltas %}
MEDIUM vs SOFT: {{ deltas.MEDIUM | default('N/A') }}
HARD vs SOFT: {{ deltas.HARD | default('N/A') }}
{% endif %}

Count drivers who started on each compound:

{% set starts = state_attr('sensor.f1_tyre_statistics', 'start_compounds') %}
{% if starts %}
{% set mediums = starts | selectattr('compound', 'eq', 'MEDIUM') | list | length %}
{% set hards = starts | selectattr('compound', 'eq', 'HARD') | list | length %}
Started on MEDIUM: {{ mediums }}
Started on HARD: {{ hards }}
{% endif %}

Get total laps on all compounds:

{% set compounds = state_attr('sensor.f1_tyre_statistics', 'compounds') %}
{% if compounds %}
{% set total = namespace(laps=0) %}
{% for name, data in compounds.items() %}
{% set total.laps = total.laps + (data.total_laps | default(0)) %}
{% endfor %}
Total tyre laps recorded: {{ total.laps }}
{% endif %}
Compound Colors

Use the compound_color field to style your dashboard elements. The colors match the official Pirelli tyre colors: SOFT (red), MEDIUM (yellow), HARD (white), INTERMEDIATE (green), WET (blue).


Driver Positions

sensor.f1_driver_positions - Live driver positions and lap-by-lap timing data for all drivers in the session.

State

  • Integer: current lap number (leader's lap), or unknown when not available.

Example

45

Attributes

AttributeTypeDescription
driverslistList of drivers, sorted by position when available
total_lapsnumberTotal race distance in laps, when known
fastest_lapobjectFastest lap details during races and sprints; null in other session types

Each entry in drivers contains:

FieldTypeDescription
racing_numberstringCar number
tlastringThree-letter abbreviation (driver code)
namestringDriver's full name
teamstringTeam name
team_colorstringTeam color as hex code (e.g., "#3671C6")
grid_positionstringStarting grid position
current_positionstringCurrent position in the session
lapsobjectMap of lap numbers to lap times (e.g., {"1": "1:32.456", "2": "1:31.789"})
completed_lapsnumberNumber of laps completed by this driver
statusstringDriver status: on_track, pit_in, pit_out, or out
in_pitbooleanWhether driver is currently in pit lane
pit_outbooleanWhether driver just exited pits
retiredbooleanWhether driver has retired from the session
stoppedbooleanWhether driver has stopped on track
fastest_lapbooleanTrue if this driver currently holds fastest lap (race/sprint only)
fastest_lap_timestringFastest lap time (race/sprint only)
fastest_lap_time_secsnumberFastest lap time in seconds (race/sprint only)
fastest_lap_lapnumberLap number of the fastest lap (race/sprint only)
JSON Structure Example
{
"drivers": [
{
"racing_number": "1",
"tla": "VER",
"name": "Max Verstappen",
"team": "Red Bull Racing",
"team_color": "#3671C6",
"grid_position": "1",
"current_position": "1",
"laps": {
"1": "1:32.456",
"2": "1:31.789",
"3": "1:31.234"
},
"completed_laps": 45,
"status": "on_track",
"in_pit": false,
"pit_out": false,
"retired": false,
"stopped": false,
"fastest_lap": true,
"fastest_lap_time": "1:29.123",
"fastest_lap_time_secs": 89.123,
"fastest_lap_lap": 42
},
{
"racing_number": "44",
"tla": "HAM",
"name": "Lewis Hamilton",
"team": "Ferrari",
"team_color": "#ED1131",
"grid_position": "3",
"current_position": "2",
"laps": {
"1": "1:33.012",
"2": "1:31.567",
"3": "1:31.890"
},
"completed_laps": 45,
"status": "on_track",
"in_pit": false,
"pit_out": false,
"retired": false,
"stopped": false,
"fastest_lap": false,
"fastest_lap_time": null,
"fastest_lap_time_secs": null,
"fastest_lap_lap": null
}
],
"total_laps": 70,
"fastest_lap": {
"racing_number": "1",
"tla": "VER",
"name": "Max Verstappen",
"team": "Red Bull Racing",
"team_color": "#3671C6",
"lap": 42,
"time": "1:29.123",
"time_secs": 89.123
}
}
Jinja2 Template Examples

Get the race leader:

{% set drivers = state_attr('sensor.f1_driver_positions', 'drivers') %}
{% if drivers %}
{% set leader = drivers | selectattr('current_position', 'eq', '1') | first %}
{% if leader %}
Leader: {{ leader.tla }} ({{ leader.name }})
{% endif %}
{% endif %}

Get a specific driver by number:

{% set drivers = state_attr('sensor.f1_driver_positions', 'drivers') %}
{% set driver = drivers | selectattr('racing_number', 'eq', '44') | first %}
{% if driver %}
{{ driver.name }} is in P{{ driver.current_position }}
{% endif %}

Get driver's last lap time:

{% set drivers = state_attr('sensor.f1_driver_positions', 'drivers') %}
{% set driver = drivers | selectattr('racing_number', 'eq', '1') | first %}
{% if driver and driver.laps %}
{% set last_lap = driver.completed_laps | string %}
Last lap: {{ driver.laps.get(last_lap, 'N/A') }}
{% endif %}

List all drivers in pit lane:

{% set drivers = state_attr('sensor.f1_driver_positions', 'drivers') %}
{% for d in drivers if d.status == 'pit_in' %}
{{ d.tla }} is in the pits
{% endfor %}

Show race progress:

{% set current = states('sensor.f1_driver_positions') %}
{% set total = state_attr('sensor.f1_driver_positions', 'total_laps') %}
{% if current != 'unknown' and total %}
Lap {{ current }} of {{ total }}
{% endif %}

Get position changes from grid:

{% set drivers = state_attr('sensor.f1_driver_positions', 'drivers') %}
{% for d in drivers %}
{% set change = d.grid_position | int - d.current_position | int %}
{{ d.tla }}: {% if change > 0 %}+{% endif %}{{ change }}
{% endfor %}
info

Fastest lap details are only exposed during races and sprints. In practice and qualifying, fastest_lap is null and each driver has fastest_lap: false.


Top Three

Three dedicated sensors for the current P1, P2, and P3 positions: sensor.f1_top_three_p1, sensor.f1_top_three_p2, and sensor.f1_top_three_p3.

State

  • Driver TLA code (e.g., "VER", "HAM", "NOR"), or unknown when data is withheld or unavailable.

Example

VER

Attributes

AttributeTypeDescription
withheldbooleanWhether the position is currently withheld by broadcast rules
positionnumberPosition in the standings (1, 2, or 3)
racing_numberstringCar number
tlastringThree-letter abbreviation (driver code)
broadcast_namestringName as shown on broadcast
full_namestringDriver's full name
first_namestringDriver's first name
last_namestringDriver's last name
teamstringTeam name
team_colorstringTeam color as hex code (e.g., "#3671C6")
lap_timestringCurrent lap time when available
overall_fastestbooleanWhether this is the overall fastest lap
personal_fastestbooleanWhether this is the driver's personal best
last_update_tsstringISO‑8601 timestamp of the last update
INFO

Available during qualifying, sprint, and race sessions. When the broadcast withholds position data (common at session start), the withheld attribute will be true and the state will be unknown.


Race Control

Feed-style sensor exposing Race Control messages such as flags, incidents, and key session updates. This data is also sent on the event bus.

State

  • The latest Race Control message text (max 255 characters), or unknown when none are available.

Example

YELLOW FLAG IN TURN 4

Attributes

AttributeTypeDescription
utcstringISO‑8601 timestamp when the message was issued
received_atstringISO‑8601 timestamp when Home Assistant received it
categorystringType of message (e.g., "Flag", "SafetyCar", "Other")
flagstringFlag type when applicable (e.g., "YELLOW", "GREEN", "RED")
scopestringScope of the message (e.g., "Track", "Sector")
sectorstringTrack sector affected, if applicable
car_numberstringCar number involved, if applicable
messagestringFull message text
event_idstringComposite ID for deduplication
sequencenumberMessage counter
historylistRolling list of recent messages (up to 5), each with event_id, utc, category, flag, and message
raw_messageobjectOriginal payload from the live feed

Track Limits

sensor.f1_track_limits - Aggregated track limits violations per driver, including deleted lap times, black and white flag warnings, and penalties.

State

  • Integer: total number of track limit violations (deletions + warnings) in this session.

Example

12

Attributes

AttributeTypeDescription
by_driverobjectMap of driver TLAs to their violation data
total_deletionsnumberTotal count of deleted times/laps across all drivers
total_warningsnumberCount of BLACK AND WHITE flags issued for track limits
total_penaltiesnumberCount of track limits penalties issued
last_updatestringISO-8601 timestamp of last update

Each entry in by_driver (keyed by driver TLA) contains:

FieldTypeDescription
racing_numberstringCar number
deletionsnumberNumber of times/laps deleted for this driver
warningbooleanWhether a BLACK AND WHITE flag has been shown
penaltystringPenalty text if issued (e.g., "5 SECOND TIME PENALTY"), or null
violationslistDetailed list of all violations

Each entry in violations contains:

FieldTypeDescription
utcstringISO-8601 timestamp of the violation
lapnumberLap number when violation occurred
turnnumberTurn number where violation occurred (for deletions)
typestringViolation type: time_deleted, warning, or penalty
penaltystringPenalty text (only present when type is penalty)
JSON Structure Example
{
"by_driver": {
"HAM": {
"racing_number": "44",
"deletions": 3,
"warning": true,
"penalty": null,
"violations": [
{ "utc": "2025-12-07T13:09:47Z", "lap": 5, "turn": 1, "type": "time_deleted" },
{ "utc": "2025-12-07T13:40:05Z", "lap": 25, "turn": 1, "type": "time_deleted" },
{ "utc": "2025-12-07T13:43:05Z", "lap": 27, "turn": 1, "type": "time_deleted" },
{ "utc": "2025-12-07T13:48:58Z", "lap": 31, "turn": null, "type": "warning" }
]
},
"GAS": {
"racing_number": "10",
"deletions": 4,
"warning": true,
"penalty": "5 SECOND TIME PENALTY",
"violations": [
{ "utc": "2025-12-07T13:11:44Z", "lap": 6, "turn": 6, "type": "time_deleted" },
{ "utc": "2025-12-07T13:38:57Z", "lap": 24, "turn": 4, "type": "time_deleted" },
{ "utc": "2025-12-07T13:49:07Z", "lap": 31, "turn": null, "type": "warning" },
{ "utc": "2025-12-07T14:09:18Z", "lap": 44, "turn": 4, "type": "time_deleted" },
{ "utc": "2025-12-07T14:11:25Z", "lap": 46, "turn": null, "type": "penalty", "penalty": "5 SECOND TIME PENALTY" }
]
},
"LAW": {
"racing_number": "30",
"deletions": 4,
"warning": true,
"penalty": null,
"violations": [
{ "utc": "2025-12-07T13:10:33Z", "lap": 5, "turn": 1, "type": "time_deleted" },
{ "utc": "2025-12-07T13:14:11Z", "lap": 8, "turn": 1, "type": "time_deleted" },
{ "utc": "2025-12-07T13:34:40Z", "lap": 21, "turn": 7, "type": "time_deleted" },
{ "utc": "2025-12-07T13:37:38Z", "lap": 23, "turn": null, "type": "warning" }
]
}
},
"total_deletions": 11,
"total_warnings": 3,
"total_penalties": 1,
"last_update": "2025-12-07T14:11:25Z"
}
Jinja2 Template Examples

Get a driver's track limits count:

{% set by_driver = state_attr('sensor.f1_track_limits', 'by_driver') %}
{% set ham = by_driver.get('HAM') %}
{% if ham %}
HAM: {{ ham.deletions }} deletions{% if ham.warning %}, WARNING{% endif %}
{% endif %}

List drivers with warnings:

{% set by_driver = state_attr('sensor.f1_track_limits', 'by_driver') %}
{% for tla, data in by_driver.items() if data.warning %}
{{ tla }} (#{{ data.racing_number }}) - {{ data.deletions }} deletions
{% endfor %}

Find drivers at risk (3+ deletions, no warning yet):

{% set by_driver = state_attr('sensor.f1_track_limits', 'by_driver') %}
{% for tla, data in by_driver.items() if data.deletions >= 3 and not data.warning %}
{{ tla }}: {{ data.deletions }} deletions - at risk!
{% endfor %}

Get total session track limits:

{% set deletions = state_attr('sensor.f1_track_limits', 'total_deletions') %}
{% set warnings = state_attr('sensor.f1_track_limits', 'total_warnings') %}
{% set penalties = state_attr('sensor.f1_track_limits', 'total_penalties') %}
Deletions: {{ deletions }}, Warnings: {{ warnings }}, Penalties: {{ penalties }}

List drivers with penalties:

{% set by_driver = state_attr('sensor.f1_track_limits', 'by_driver') %}
{% for tla, data in by_driver.items() if data.penalty %}
{{ tla }}: {{ data.penalty }}
{% endfor %}
Track Limits Progression

The typical track limits progression is: 3 deleted lap times → BLACK AND WHITE flag warning → penalty on the next violation. Use the deletions count and warning flag to identify drivers at risk.


Investigations

sensor.f1_investigations - Active steward investigations and pending penalties. Shows only currently relevant information with automatic lifecycle management.

State

  • Integer: count of actionable items (noted incidents + under investigation + pending penalties).

Example

3

Attributes

AttributeTypeDescription
notedlistIncidents noted but not yet under investigation
under_investigationlistActive steward investigations
no_further_actionlistRecent NFI decisions (auto-expire after 5 minutes)
penaltieslistPenalties issued but not yet served
last_updatestringISO-8601 timestamp of last update

Each entry in noted and under_investigation contains:

FieldTypeDescription
utcstringISO-8601 timestamp when the incident was noted
lapnumberLap number when the incident occurred
driverslistDriver TLAs involved (sorted alphabetically)
racing_numberslistCar numbers involved
locationstringLocation such as "TURN 7", "PIT LANE" (or null)
reasonstringReason such as "CAUSING A COLLISION", "LEAVING THE TRACK AND GAINING AN ADVANTAGE" (or null)
after_racebooleanWhether the investigation will happen after the race (only in under_investigation)

Each entry in no_further_action contains the same fields plus:

FieldTypeDescription
nfi_utcstringISO-8601 timestamp when NFI was decided (used for auto-expiry)

Each entry in penalties contains:

FieldTypeDescription
driverstringDriver TLA who received the penalty
racing_numberstringCar number
penaltystringPenalty type (e.g., "5 SECOND TIME PENALTY", "DRIVE THROUGH PENALTY")
reasonstringReason for the penalty
utcstringISO-8601 timestamp when penalty was issued
lapnumberLap number when penalty was issued
JSON Structure Example
{
"noted": [
{
"utc": "2025-12-07T13:30:57Z",
"lap": 19,
"drivers": ["LEC", "RUS"],
"racing_numbers": ["16", "63"],
"location": "TURN 9",
"reason": "MOVING UNDER BRAKING"
}
],
"under_investigation": [
{
"utc": "2025-12-07T13:40:46Z",
"lap": 25,
"drivers": ["NOR", "TSU"],
"racing_numbers": ["4", "22"],
"location": "TURN 5",
"reason": "FORCING ANOTHER DRIVER OFF THE TRACK",
"after_race": false
}
],
"no_further_action": [
{
"utc": "2025-12-07T13:06:50Z",
"lap": 3,
"drivers": ["ALB", "HAM"],
"racing_numbers": ["23", "44"],
"location": "TURN 7",
"reason": "LEAVING THE TRACK AND GAINING AN ADVANTAGE",
"nfi_utc": "2025-12-07T13:12:53Z"
}
],
"penalties": [
{
"driver": "TSU",
"racing_number": "22",
"penalty": "5 SECOND TIME PENALTY",
"reason": "MORE THAN ONE CHANGE OF DIRECTION",
"utc": "2025-12-07T13:46:38Z",
"lap": 29
},
{
"driver": "ALB",
"racing_number": "23",
"penalty": "5 SECOND TIME PENALTY",
"reason": "SPEEDING IN THE PIT LANE",
"utc": "2025-12-07T14:00:05Z",
"lap": 38
}
],
"last_update": "2025-12-07T14:00:05Z"
}
Jinja2 Template Examples

Check if a driver is under investigation:

{% set investigations = state_attr('sensor.f1_investigations', 'under_investigation') %}
{% set ver_involved = investigations | selectattr('drivers', 'contains', 'VER') | list %}
{% if ver_involved | length > 0 %}
VER is under investigation!
{% endif %}

List all pending penalties:

{% set penalties = state_attr('sensor.f1_investigations', 'penalties') %}
{% for p in penalties %}
{{ p.driver }}: {{ p.penalty }} ({{ p.reason }})
{% endfor %}

Count active investigations:

{% set noted = state_attr('sensor.f1_investigations', 'noted') | length %}
{% set investigating = state_attr('sensor.f1_investigations', 'under_investigation') | length %}
Noted: {{ noted }}, Under Investigation: {{ investigating }}

Get post-race investigations:

{% set investigations = state_attr('sensor.f1_investigations', 'under_investigation') %}
{% for inv in investigations if inv.after_race %}
{{ inv.drivers | join(' vs ') }} - {{ inv.reason }} (after race)
{% endfor %}

Show recent NFI decisions:

{% set nfi = state_attr('sensor.f1_investigations', 'no_further_action') %}
{% for item in nfi %}
{{ item.drivers | join('/') }}: No Further Action ({{ item.reason }})
{% endfor %}

Create investigation summary:

{% set sensor = 'sensor.f1_investigations' %}
{% set total = states(sensor) | int %}
{% if total > 0 %}
{{ total }} active matter{{ 's' if total > 1 else '' }}:
{% set penalties = state_attr(sensor, 'penalties') %}
{% for p in penalties %}
- {{ p.driver }}: {{ p.penalty }}
{% endfor %}
{% else %}
No active investigations
{% endif %}
Incident Lifecycle
  • NOTED → Stays until escalated to UNDER INVESTIGATION, resolved as NFI, or penalized
  • UNDER INVESTIGATION → Stays until resolved as NFI or penalty issued
  • NO FURTHER ACTION → Auto-expires after 5 minutes of session time
  • PENALTY → Stays until PENALTY SERVED message received

Championship Prediction (Drivers)

Predicted Drivers Championship winner and points table, sourced from the live ChampionshipPrediction stream.

State

  • Predicted P1 driver TLA, or unknown when not available.

Example

VER

Attributes

AttributeTypeDescription
predicted_driver_p1objectThe driver currently predicted to lead the championship
driversobjectMap of all drivers keyed by racing number
last_updatestringISO-8601 timestamp of the last prediction update

The predicted_driver_p1 object contains:

FieldTypeDescription
racing_numberstringCar number
tlastringThree-letter abbreviation
pointsnumberPredicted final points
entryobjectFull entry data from the feed

Each entry in drivers (keyed by racing number) contains:

FieldTypeDescription
RacingNumberstringCar number
CurrentPositionnumberCurrent championship position
PredictedPositionnumberPredicted final position
CurrentPointsnumberCurrent points total
PredictedPointsnumberPredicted final points
JSON Structure Example
{
"predicted_driver_p1": {
"racing_number": "1",
"tla": "VER",
"points": 450,
"entry": {
"RacingNumber": "1",
"CurrentPosition": 1,
"PredictedPosition": 1,
"CurrentPoints": 350,
"PredictedPoints": 450
}
},
"drivers": {
"1": {
"RacingNumber": "1",
"CurrentPosition": 1,
"PredictedPosition": 1,
"CurrentPoints": 350,
"PredictedPoints": 450
},
"44": {
"RacingNumber": "44",
"CurrentPosition": 2,
"PredictedPosition": 2,
"CurrentPoints": 280,
"PredictedPoints": 380
},
"4": {
"RacingNumber": "4",
"CurrentPosition": 3,
"PredictedPosition": 3,
"CurrentPoints": 260,
"PredictedPoints": 350
}
},
"last_update": "2025-06-15T14:32:45Z"
}
Jinja2 Template Examples

Get predicted champion:

{% set p1 = state_attr('sensor.f1_championship_prediction_drivers', 'predicted_driver_p1') %}
{% if p1 %}
Predicted champion: {{ p1.tla }} with {{ p1.points }} points
{% endif %}

Show points gain prediction for a driver:

{% set drivers = state_attr('sensor.f1_championship_prediction_drivers', 'drivers') %}
{% set ver = drivers.get('1') %}
{% if ver %}
{% set gain = ver.PredictedPoints - ver.CurrentPoints %}
VER: {{ ver.CurrentPoints }} -> {{ ver.PredictedPoints }} (+{{ gain }})
{% endif %}

List drivers predicted to gain positions:

{% set drivers = state_attr('sensor.f1_championship_prediction_drivers', 'drivers') %}
{% for num, d in drivers.items() if d.PredictedPosition < d.CurrentPosition %}
#{{ num }}: P{{ d.CurrentPosition }} -> P{{ d.PredictedPosition }}
{% endfor %}

Calculate predicted gap to leader:

{% set p1 = state_attr('sensor.f1_championship_prediction_drivers', 'predicted_driver_p1') %}
{% set drivers = state_attr('sensor.f1_championship_prediction_drivers', 'drivers') %}
{% set ham = drivers.get('44') %}
{% if p1 and ham %}
Gap to leader: {{ p1.points - ham.PredictedPoints }} points
{% endif %}

Championship Prediction (Teams)

Predicted Constructors Championship winner and points table, sourced from the live ChampionshipPrediction stream.

State

  • Predicted P1 team name, or unknown when not available.

Example

Red Bull Racing

Attributes

AttributeTypeDescription
predicted_team_p1objectThe team currently predicted to lead the constructors' championship
teamsobjectMap of all teams keyed by team key
last_updatestringISO-8601 timestamp of the last prediction update

The predicted_team_p1 object contains:

FieldTypeDescription
team_keystringTeam identifier
team_namestringTeam display name
pointsnumberPredicted final points
entryobjectFull entry data from the feed

Each entry in teams (keyed by team key) contains:

FieldTypeDescription
TeamKeystringTeam identifier
TeamNamestringTeam display name
CurrentPositionnumberCurrent championship position
PredictedPositionnumberPredicted final position
CurrentPointsnumberCurrent points total
PredictedPointsnumberPredicted final points
JSON Structure Example
{
"predicted_team_p1": {
"team_key": "red_bull",
"team_name": "Red Bull Racing",
"points": 850,
"entry": {
"TeamKey": "red_bull",
"TeamName": "Red Bull Racing",
"CurrentPosition": 1,
"PredictedPosition": 1,
"CurrentPoints": 650,
"PredictedPoints": 850
}
},
"teams": {
"red_bull": {
"TeamKey": "red_bull",
"TeamName": "Red Bull Racing",
"CurrentPosition": 1,
"PredictedPosition": 1,
"CurrentPoints": 650,
"PredictedPoints": 850
},
"ferrari": {
"TeamKey": "ferrari",
"TeamName": "Ferrari",
"CurrentPosition": 2,
"PredictedPosition": 2,
"CurrentPoints": 520,
"PredictedPoints": 700
},
"mclaren": {
"TeamKey": "mclaren",
"TeamName": "McLaren",
"CurrentPosition": 3,
"PredictedPosition": 3,
"CurrentPoints": 480,
"PredictedPoints": 650
}
},
"last_update": "2025-06-15T14:32:45Z"
}
Jinja2 Template Examples

Get predicted constructors champion:

{% set p1 = state_attr('sensor.f1_championship_prediction_teams', 'predicted_team_p1') %}
{% if p1 %}
Predicted constructors champion: {{ p1.team_name }}
{% endif %}

Compare two teams:

{% set teams = state_attr('sensor.f1_championship_prediction_teams', 'teams') %}
{% set rb = teams.get('red_bull') %}
{% set ferrari = teams.get('ferrari') %}
{% if rb and ferrari %}
Gap: {{ rb.PredictedPoints - ferrari.PredictedPoints }} points
{% endif %}

List teams by predicted finish:

{% set teams = state_attr('sensor.f1_championship_prediction_teams', 'teams') %}
{% for key, t in teams.items() | sort(attribute='1.PredictedPosition') %}
P{{ t.PredictedPosition }}: {{ t.TeamName }} ({{ t.PredictedPoints }} pts)
{% endfor %}

Show teams predicted to change position:

{% set teams = state_attr('sensor.f1_championship_prediction_teams', 'teams') %}
{% for key, t in teams.items() if t.PredictedPosition != t.CurrentPosition %}
{{ t.TeamName }}: P{{ t.CurrentPosition }} -> P{{ t.PredictedPosition }}
{% endfor %}

Formation Start

Indicates when the formation start procedure is ready. Useful for triggering automations at race start.

State (on/off)

  • on when formation start procedure is ready; otherwise off.

Example

on

Attributes

AttributeTypeDescription
statusstringCurrent status (e.g., "ready", "waiting", "active")
scheduled_startstringISO‑8601 scheduled start time
formation_startstringISO‑8601 timestamp when formation start actually happened
delta_secondsnumberSeconds between scheduled and actual start
sourcestringHow the data was derived
session_typestringType of session (e.g., "Race", "Sprint")
session_namestringName of the session
errorstringError message if any issue occurred
INFO

Active only during race and sprint sessions.


Overtake Mode

Experimental — 2026 regulation

This sensor is based on data observed during 2026 pre-season testing. It should be considered experimental until confirmed against live race conditions. The exact message format from Formula 1 may be adjusted in a future update once the first race weekend has been evaluated.

binary_sensor.f1_overtake_mode - Indicates whether the track-wide overtake mode is currently enabled. This is a 2026 Formula 1 regulation feature that allows a driver who was within one second of the car ahead at the final corner detection point to deploy an additional 0.5 MJ of electrical energy on the following straight.

State (on/off)

  • on when overtake mode is enabled track-wide; otherwise off.

Example

on

Attributes

AttributeTypeDescription
straight_modestringCurrent straight mode state (normal_grip, low_grip, or disabled)
restoredbooleanTrue if the state was restored from history after a Home Assistant restart
INFO

Active only during sessions where the 2026 overtake mode regulation applies. The state is restored from history when Home Assistant restarts during an active session.


Straight Mode

Experimental — 2026 regulation

This sensor is based on data observed during 2026 pre-season testing. It should be considered experimental until confirmed against live race conditions. The exact message format from Formula 1 may be adjusted in a future update once the first race weekend has been evaluated.

sensor.f1_straight_mode - Shows the track-wide active aerodynamic permission for straight sections, broadcasted via Race Control messages. This is a 2026 Formula 1 regulation feature where the car's aerodynamic profile on designated straight sections of the circuit is regulated by the FIA.

State (enum)

  • One of: normal_grip, low_grip, disabled.
ValueDescription
normal_gripNormal aerodynamic configuration permitted on straight sections
low_gripRestricted aerodynamic configuration on straight sections
disabledStraight mode system is not active

Example

normal_grip

Attributes

AttributeTypeDescription
overtake_enabledbooleanWhether overtake mode is currently enabled
restoredbooleanTrue if the state was restored from history after a Home Assistant restart
INFO

Active only during sessions where the 2026 straight mode regulation applies. The state is restored from history when Home Assistant restarts during an active session.