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

1"""The bouncie integration.""" 

2from __future__ import annotations 

3 

4import datetime 

5 

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 

11 

12from .const import DOMAIN, LOGGER, VEHICLE_MODEL_KEY 

13from .coordinator import BouncieDataUpdateCoordinator 

14 

15PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.DEVICE_TRACKER] 

16CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) 

17 

18 

19async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: 

20 """Set up this integration using YAML is not supported.""" 

21 return True 

22 

23 

24async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: 

25 """Set up bouncie from a config entry.""" 

26 

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 

35 

36 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) 

37 

38 return True 

39 

40 

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) 

45 

46 return unload_ok 

47 

48 

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"] 

89 

90 return vehicle_info