Home Assistant Unofficial Reference 2024.12.1
diagnostics.py
Go to the documentation of this file.
1 """Diagnostics support for the BMW Connected Drive integration."""
2 
3 from __future__ import annotations
4 
5 from dataclasses import asdict
6 import json
7 from typing import TYPE_CHECKING, Any
8 
9 from bimmer_connected.utils import MyBMWJSONEncoder
10 
11 from homeassistant.components.diagnostics import async_redact_data
12 from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.device_registry import DeviceEntry
15 
16 from . import BMWConfigEntry
17 from .const import CONF_REFRESH_TOKEN
18 
19 if TYPE_CHECKING:
20  from bimmer_connected.vehicle import MyBMWVehicle
21 
22 
23 TO_REDACT_INFO = [CONF_USERNAME, CONF_PASSWORD, CONF_REFRESH_TOKEN]
24 TO_REDACT_DATA = [
25  "lat",
26  "latitude",
27  "lon",
28  "longitude",
29  "heading",
30  "vin",
31  "licensePlate",
32  "city",
33  "street",
34  "streetNumber",
35  "postalCode",
36  "phone",
37  "formatted",
38  "subtitle",
39 ]
40 
41 
42 def vehicle_to_dict(vehicle: MyBMWVehicle | None) -> dict:
43  """Convert a MyBMWVehicle to a dictionary using MyBMWJSONEncoder."""
44  retval: dict = json.loads(json.dumps(vehicle, cls=MyBMWJSONEncoder))
45  return retval
46 
47 
49  hass: HomeAssistant, config_entry: BMWConfigEntry
50 ) -> dict[str, Any]:
51  """Return diagnostics for a config entry."""
52  coordinator = config_entry.runtime_data.coordinator
53 
54  coordinator.account.config.log_responses = True
55  await coordinator.account.get_vehicles(force_init=True)
56 
57  diagnostics_data = {
58  "info": async_redact_data(config_entry.data, TO_REDACT_INFO),
59  "data": [
60  async_redact_data(vehicle_to_dict(vehicle), TO_REDACT_DATA)
61  for vehicle in coordinator.account.vehicles
62  ],
63  "fingerprint": async_redact_data(
64  [asdict(r) for r in coordinator.account.get_stored_responses()],
65  TO_REDACT_DATA,
66  ),
67  }
68 
69  coordinator.account.config.log_responses = False
70 
71  return diagnostics_data
72 
73 
75  hass: HomeAssistant, config_entry: BMWConfigEntry, device: DeviceEntry
76 ) -> dict[str, Any]:
77  """Return diagnostics for a device."""
78  coordinator = config_entry.runtime_data.coordinator
79 
80  coordinator.account.config.log_responses = True
81  await coordinator.account.get_vehicles(force_init=True)
82 
83  vin = next(iter(device.identifiers))[1]
84  vehicle = coordinator.account.get_vehicle(vin)
85 
86  diagnostics_data = {
87  "info": async_redact_data(config_entry.data, TO_REDACT_INFO),
88  "data": async_redact_data(vehicle_to_dict(vehicle), TO_REDACT_DATA),
89  # Always have to get the full fingerprint as the VIN is redacted beforehand by the library
90  "fingerprint": async_redact_data(
91  [asdict(r) for r in coordinator.account.get_stored_responses()],
92  TO_REDACT_DATA,
93  ),
94  }
95 
96  coordinator.account.config.log_responses = False
97 
98  return diagnostics_data
dict[str, Any] async_get_device_diagnostics(HomeAssistant hass, BMWConfigEntry config_entry, DeviceEntry device)
Definition: diagnostics.py:76
dict[str, Any] async_get_config_entry_diagnostics(HomeAssistant hass, BMWConfigEntry config_entry)
Definition: diagnostics.py:50
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
Definition: util.py:14