BavarianData

Manual / Features

Entities & devices

One device per VIN#

Each VIN on your account becomes its own Home Assistant device. A separate integration-level “CarData Debug Device” carries the diagnostics entities (stream connection, quota, last-message timestamps).

Descriptor entities#

Every descriptor BMW streams becomes a native entity:

  • Streamed descriptors become sensors and binary sensors, named from a curated English title set (baked into the catalogue and the HA translations). Nine more languages ship too, using BMW’s own names for each field — open an issue or PR if a name looks off.
  • Numeric fields get sensible device classes; distances use device_class: distance, and odometer/mileage uses state_class: total_increasing so long-term statistics work.
  • Percentages are measurements with long-term statistics too, including those without a device class: the tank level in %, seat and steering-wheel heating, sunroof and door positions, preconditioning progress.
  • Every entity exposes its source timestamp plus its catalogue cluster and category as attributes — the dashboard card uses these to group values regardless of the user’s HA language.
  • A few descriptors are lists rather than single values — Condition Based Service (each service item with its due date) and Check Control messages (the warnings the car raised). Their state is the number of entries and the full list is in the items attribute, e.g. {{ state_attr('sensor.<car>_check_control_messages', 'items') }} in a template. A state of 0 means the car reported an empty list — or, for Check Control, that BMW reported no messages at all, which is how a cleared warning arrives. Check Control messages that have cleared stay in a resolved attribute (the last ten, newest first), each with last_reported and resolved_at.

The full field-per-cluster catalogue lives in telematics-fields.md.

Derived & diagnostic entities#

These aren’t sent by BMW — the integration derives them. They are named from the integration’s own translations (so they are named in your language too).

EntityWhat it is
Charged Energy (Total)Monotonic kWh counter (device_class: energy, state_class: total_increasing). Add to the Energy dashboard.
Charged Energy (Session)Resets at the start of each charging session.
Charging Energy (This Month)Monthly charged-energy total.
Charging Cost (This Month)Monthly cost — only once a price source is set.
Charging Cost (Last Session)Cost of the most recent session — only with a price source.
Charging Cost per 100 kmNeeds the odometer and two sessions to measure a distance. Not created for a plug-in hybrid.
Battery HealthLearned usable capacity (kWh), with vs-new %, sample count and a capacity-vs-mileage trend.
Real RangeHow far the car really goes from its current charge (km), from measured consumption and usable capacity — with the car’s own prediction and the difference as attributes. Not created for a plug-in hybrid.
Driving Distance (This Month)Monthly distance + business/private/commute split.
Trip in ProgressBinary sensor: on while a drive is under way, with the trip so far as attributes. Deliberately not a “moving” sensor — it lingers after an arrival; see Trips.
Tire ConditionBMW’s overall verdict on the mounted set, plus any upstream errors.
Tire Front Left / Front Right / Rear Left / Rear RightPer-wheel wear traffic light (green/yellow/red/grey), with the mileage until a change is due, defect status, season, dimension, tread pattern and fitting date as attributes.
API Quota RemainingDiagnostic: requests left in the 50/24 h window.
State-of-charge estimate / rateExtrapolated SoC helpers (need the Electric vehicle cluster).
Stream Connection StatusDiagnostic: MQTT connection state.
Last Message ReceivedDiagnostic: timestamp of the last stream payload.
Last Telematics API CallDiagnostic: timestamp of the last REST call.

The charging, state-of-charge, battery-health and real-range entities only exist for a car with a high-voltage battery; they appear once the car first sends battery data. A petrol or diesel car gets none of them. One that was given them by an earlier release has them removed on the first start after updating, because they could never hold a value — their old history may then be listed under Developer tools → Statistics, where it can be deleted.

The fuel in the tank (Range Tank level) is a volume sensor with long-term statistics. It takes the unit the car sends — liters, or gallons on a car that reports them — and Home Assistant converts it to your display unit like any other.

The tire entities only exist for wheels BMW actually reports. Many cars have no tire service record on file, in which case none are created — that is BMW having no data, not a fault. They are populated by the daily refresh and by bavariandata.fetch_tyre_diagnosis.

Because that data costs a request and is refreshed at most once a day, it is stored and restored across restarts — the sensors come back showing the last reading rather than unknown. Each carries a fetched_at attribute with the time of that fetch, so a day-old reading is recognisable as one.

Vehicle image#

Each VIN also gets an image entity holding BMW’s rendered picture of the car. It is cached and survives restarts, so it doesn’t burn quota on every boot; refresh it manually with bavariandata.fetch_vehicle_image.

Device tracker#

Each VIN gets a device_tracker (“car”) carrying the vehicle’s location from the GPS stream, usable on the HA map and in zone-based automations.

Which lock entity to use#

The car reports its central lock through two descriptors, and they behave very differently:

EntityDescriptorUpdates
Doors overall statevehicle.cabin.door.statusOn the stream — follows every lock/unlock within seconds
Doors lockvehicle.cabin.door.lock.statusREST only — BMW does not stream it, so it refreshes at most once per daily refresh and can sit on a stale value for days

Despite its name, Doors overall state is the one to automate on. Both carry the same values — Secured, Locked, Partially locked, Unlocked — and both appear in the automation editor’s state picker, so a condition can be selected from the dropdown rather than typed by hand. The dashboard card prefers the streamed one for its central-lock tile too, and falls back to Doors lock on cars that never stream it.

“Partially locked” (BMW’s SELECTIVE-LOCKED) means every door is locked except the driver’s — the state a car lands in after a remote unlock.

Per-door open/closed state is separate again, and streamed: the four Door state (…) binary sensors.

Entity names and your language#

Entity names follow Home Assistant’s own language setting. Eleven are shipped:

HA languageWhat you get
EnglishUS spellings — Tire pressure (front left), Tire Condition
English (UK)British spellings — Tyre pressure (front left), Tyre Condition
DeutschGemessener Reifendruck vorne links, Reifenzustand
FrançaisPression mesurée du pneu avant gauche, État des pneus
ItalianoPressione misurata pneumatico anteriore sinistro, Stato degli pneumatici
EspañolPresión medida del neumático delantero izquierdo, Estado de los neumáticos
NederlandsGemeten bandspanning linksvoor, Bandenconditie
PolskiZmierzone ciśnienie w oponach przód lewo, Stan opon
PortuguêsPressão do pneu medida no pneu dianteiro esquerdo, Estado dos pneus
ČeštinaZměřený tlak v pneumatice vpředu vlevo, Stav pneumatik
SvenskaUppmätt däcktryck vänster fram, Däckstatus

Outside English, the names of BMW’s fields are BMW’s own, from the catalogue BMW publishes in each language — so they match the wording in the BMW portal, not a translation of our English titles. The setup screens, options, services, repair notices, the month report and the dashboard card are translated too. Portuguese is European Portuguese; a Brazilian Portuguese install falls back to English in Home Assistant, while the card still shows Portuguese.

Switch under Profile → Language; the names change on the next reload. The bundled card follows the same setting.

Entity IDs never change with it. They are built once, from the descriptor BMW sends — sensor.<car>_tire_pressure_front_left — so automations, dashboards and templates keep working whichever language you pick, and a UK install still refers to tire in YAML. Only the display name is translated.

US English is the default because BMW’s own field names are US (vehicle.chassis.axle.row1.wheel.left.tire.pressure), so the name you read matches the ID you type. British English overrides only the words that actually differ and inherits everything else, which is why a new label appears in both without waiting for a translation.

Why some entities are “unavailable”#

Entities keep exposing their cluster/category attributes even when restored or unavailable, because the card’s cluster views depend on them. An entity may read unavailable until the car next streams that descriptor — trigger a lock/unlock in the MyBMW app to prompt an update.

Updated Edit this page on GitHub