Coverage for custom_components/bouncie/__init__.py: 100%
44 statements
« prev ^ index » next coverage.py v7.2.4, created at 2026-06-18 16:22 +0000
« prev ^ index » next coverage.py v7.2.4, created at 2026-06-18 16:22 +0000
1"""The bouncie integration."""
2from __future__ import annotations
4import datetime
6from homeassistant.config_entries import ConfigEntry
7from homeassistant.const import CONF_SCAN_INTERVAL, Platform
8from homeassistant.core import HomeAssistant
9from homeassistant.helpers import config_validation as cv
10from homeassistant.helpers.typing import ConfigType
12from .const import DOMAIN, LOGGER, VEHICLE_MODEL_KEY
13from .coordinator import BouncieDataUpdateCoordinator
15PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.DEVICE_TRACKER]
16CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
19async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
20 """Set up this integration using YAML is not supported."""
21 return True
24async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
25 """Set up bouncie from a config entry."""
27 coordinator = BouncieDataUpdateCoordinator(
28 hass=hass,
29 logger=LOGGER,
30 config_entry=entry,
31 update_interval=datetime.timedelta(seconds=entry.data[CONF_SCAN_INTERVAL]),
32 )
33 await coordinator.async_config_entry_first_refresh()
34 hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
36 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
38 return True
41async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
42 """Unload a config entry."""
43 if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
44 hass.data[DOMAIN].pop(entry.entry_id)
46 return unload_ok
49def patch_missing_data(vehicle_info):
50 """Fill in missing data."""
51 if "mil" not in vehicle_info["stats"]:
52 vehicle_info["stats"]["mil"] = {
53 "milOn": "Not available",
54 "lastUpdated": "Not available",
55 }
56 if "battery" not in vehicle_info["stats"]:
57 vehicle_info["stats"]["battery"] = {
58 "status": "Not available",
59 "lastUpdated": "Not available",
60 }
61 else:
62 if "status" not in vehicle_info["stats"]["battery"]:
63 vehicle_info["stats"]["battery"]["status"] = "Not available"
64 if "lastUpdated" not in vehicle_info["stats"]["battery"]:
65 vehicle_info["stats"]["battery"]["lastUpdated"] = "Not available"
66 if "location" not in vehicle_info["stats"]:
67 vehicle_info["stats"]["location"] = {
68 "address": "Not available",
69 }
70 if "fuelLevel" not in vehicle_info["stats"]:
71 vehicle_info["stats"]["fuelLevel"] = -1
72 if "nickName" not in vehicle_info:
73 vehicle_info["nickName"] = (
74 str(vehicle_info[VEHICLE_MODEL_KEY]["year"])
75 + " "
76 + str(vehicle_info[VEHICLE_MODEL_KEY]["make"])
77 + " "
78 + str(vehicle_info[VEHICLE_MODEL_KEY]["name"])
79 )
80 if (
81 "qualifiedDtcList" not in vehicle_info["stats"]["mil"]
82 or len(vehicle_info["stats"]["mil"]["qualifiedDtcList"]) == 0
83 ):
84 vehicle_info["stats"]["mil"]["dtcCount"] = 0
85 vehicle_info["stats"]["mil"]["dtcDetails"] = "Not available"
86 else:
87 vehicle_info["stats"]["mil"]["dtcCount"] = len(vehicle_info["stats"]["mil"]["qualifiedDtcList"])
88 vehicle_info["stats"]["mil"]["dtcDetails"] = vehicle_info["stats"]["mil"]["qualifiedDtcList"]
90 return vehicle_info