From 246bca1d010d95c8a929568800bf6919e58ba941 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 21 Jul 2023 14:28:34 -0500 Subject: [PATCH] fix: reduce entity creation code followup to #670 --- custom_components/tesla_custom/base.py | 35 +++----- .../tesla_custom/binary_sensor.py | 52 +++++------ custom_components/tesla_custom/button.py | 20 ++--- custom_components/tesla_custom/climate.py | 13 +-- custom_components/tesla_custom/cover.py | 8 +- .../tesla_custom/device_tracker.py | 4 +- custom_components/tesla_custom/lock.py | 4 +- custom_components/tesla_custom/number.py | 6 +- custom_components/tesla_custom/select.py | 18 ++-- custom_components/tesla_custom/sensor.py | 89 +++++++++---------- custom_components/tesla_custom/switch.py | 22 +++-- custom_components/tesla_custom/teslamate.py | 4 +- custom_components/tesla_custom/text.py | 13 ++- custom_components/tesla_custom/update.py | 9 +- 14 files changed, 128 insertions(+), 169 deletions(-) diff --git a/custom_components/tesla_custom/base.py b/custom_components/tesla_custom/base.py index 744110dd..464ca076 100644 --- a/custom_components/tesla_custom/base.py +++ b/custom_components/tesla_custom/base.py @@ -1,9 +1,9 @@ """Support for Tesla cars and energy sites.""" -from homeassistant.core import HomeAssistant, callback + +from homeassistant.core import callback from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.util import slugify -from homeassistant.util.unit_system import METRIC_SYSTEM, US_CUSTOMARY_SYSTEM from teslajsonpy.car import TeslaCar from teslajsonpy.const import RESOURCE_TYPE_BATTERY from teslajsonpy.energy import EnergySite @@ -12,22 +12,14 @@ from .const import ATTRIBUTION, DOMAIN -class TeslaBaseEntity(CoordinatorEntity): +class TeslaBaseEntity(CoordinatorEntity[TeslaDataUpdateCoordinator]): """Representation of a Tesla device.""" + type: str _attr_attribution = ATTRIBUTION _attr_has_entity_name = True _enabled_by_default: bool = True - type: str - - def __init__( - self, hass: HomeAssistant, coordinator: TeslaDataUpdateCoordinator - ) -> None: - """Initialise the Tesla device.""" - super().__init__(coordinator) - self._coordinator: TeslaDataUpdateCoordinator = coordinator - self.hass = hass - self._memorized_unique_id = None + _memorized_unique_id: str | None = None @callback def refresh(self) -> None: @@ -60,18 +52,12 @@ class TeslaCarEntity(TeslaBaseEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialise the Tesla car device.""" - super().__init__(hass, coordinator) + super().__init__(coordinator) self._car = car - self._unit_system = ( - METRIC_SYSTEM - if self.hass.config.units is METRIC_SYSTEM - else US_CUSTOMARY_SYSTEM - ) async def update_controller( self, *, wake_if_asleep: bool = False, force: bool = True, blocking: bool = True @@ -90,10 +76,10 @@ async def update_controller( ) return - await self._coordinator.controller.update( + await self.coordinator.controller.update( self._car.id, wake_if_asleep=wake_if_asleep, force=force ) - await self._coordinator.async_refresh() + await self.coordinator.async_refresh() @property def vehicle_name(self) -> str: @@ -128,7 +114,7 @@ def device_info(self) -> DeviceInfo: def assumed_state(self) -> bool: """Return whether the data is from an online vehicle.""" vin = self._car.vin - controller = self._coordinator.controller + controller = self.coordinator.controller return not controller.is_car_online(vin=vin) and ( controller.get_last_update_time(vin=vin) - controller.get_last_wake_up_time(vin=vin) @@ -141,12 +127,11 @@ class TeslaEnergyEntity(TeslaBaseEntity): def __init__( self, - hass: HomeAssistant, energysite: EnergySite, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialise the Tesla energy device.""" - super().__init__(hass, coordinator) + super().__init__(coordinator) self._energysite = energysite @property diff --git a/custom_components/tesla_custom/binary_sensor.py b/custom_components/tesla_custom/binary_sensor.py index 8abf31eb..f1277a51 100644 --- a/custom_components/tesla_custom/binary_sensor.py +++ b/custom_components/tesla_custom/binary_sensor.py @@ -24,22 +24,22 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarParkingBrake(hass, car, coordinator)) - entities.append(TeslaCarOnline(hass, car, coordinator)) - entities.append(TeslaCarAsleep(hass, car, coordinator)) - entities.append(TeslaCarChargerConnection(hass, car, coordinator)) - entities.append(TeslaCarCharging(hass, car, coordinator)) - entities.append(TeslaCarDoors(hass, car, coordinator)) - entities.append(TeslaCarWindows(hass, car, coordinator)) - entities.append(TeslaCarScheduledCharging(hass, car, coordinator)) - entities.append(TeslaCarScheduledDeparture(hass, car, coordinator)) - entities.append(TeslaCarUserPresent(hass, car, coordinator)) + entities.append(TeslaCarParkingBrake(car, coordinator)) + entities.append(TeslaCarOnline(car, coordinator)) + entities.append(TeslaCarAsleep(car, coordinator)) + entities.append(TeslaCarChargerConnection(car, coordinator)) + entities.append(TeslaCarCharging(car, coordinator)) + entities.append(TeslaCarDoors(car, coordinator)) + entities.append(TeslaCarWindows(car, coordinator)) + entities.append(TeslaCarScheduledCharging(car, coordinator)) + entities.append(TeslaCarScheduledDeparture(car, coordinator)) + entities.append(TeslaCarUserPresent(car, coordinator)) for energy_site_id, energysite in energysites.items(): coordinator = coordinators[energy_site_id] if energysite.resource_type == RESOURCE_TYPE_BATTERY: - entities.append(TeslaEnergyBatteryCharging(hass, energysite, coordinator)) - entities.append(TeslaEnergyGridStatus(hass, energysite, coordinator)) + entities.append(TeslaEnergyBatteryCharging(energysite, coordinator)) + entities.append(TeslaEnergyGridStatus(energysite, coordinator)) async_add_entities(entities, update_before_add=True) @@ -180,9 +180,7 @@ def extra_state_attributes(self): def _open_or_closed(self, door): """Return string of 'Open' or 'Closed' when passed a door integer state.""" - if door: - return "Open" - return "Closed" + return "Open" if door else "Closed" class TeslaCarWindows(TeslaCarEntity, BinarySensorEntity): @@ -201,11 +199,12 @@ def is_on(self): @property def extra_state_attributes(self): """Return device state attributes.""" + car = self._car return { - "Driver Front": self._open_or_closed(self._car.window_fd), - "Driver Rear": self._open_or_closed(self._car.window_rd), - "Passenger Front": self._open_or_closed(self._car.window_fp), - "Passenger Rear": self._open_or_closed(self._car.window_rp), + "Driver Front": self._open_or_closed(car.window_fd), + "Driver Rear": self._open_or_closed(car.window_rd), + "Passenger Front": self._open_or_closed(car.window_fp), + "Passenger Rear": self._open_or_closed(car.window_rp), } def _open_or_closed(self, window): @@ -261,16 +260,17 @@ def is_on(self): def extra_state_attributes(self): """Return device state attributes.""" # pylint: disable=protected-access - timestamp = self._car._vehicle_data.get("charge_state", {}).get( + car = self._car + timestamp = car._vehicle_data.get("charge_state", {}).get( "scheduled_departure_time" ) return { - "Departure time": self._car.scheduled_departure_time_minutes, - "Preconditioning enabled": self._car.is_preconditioning_enabled, - "Preconditioning weekdays only": self._car.is_preconditioning_weekday_only, - "Off peak charging enabled": self._car.is_off_peak_charging_enabled, - "Off peak charging weekdays only": self._car.is_off_peak_charging_weekday_only, - "End off peak time": self._car.off_peak_hours_end_time, + "Departure time": car.scheduled_departure_time_minutes, + "Preconditioning enabled": car.is_preconditioning_enabled, + "Preconditioning weekdays only": car.is_preconditioning_weekday_only, + "Off peak charging enabled": car.is_off_peak_charging_enabled, + "Off peak charging weekdays only": car.is_off_peak_charging_weekday_only, + "End off peak time": car.off_peak_hours_end_time, "Departure timestamp": timestamp, } diff --git a/custom_components/tesla_custom/button.py b/custom_components/tesla_custom/button.py index 40f673d2..c65698d7 100644 --- a/custom_components/tesla_custom/button.py +++ b/custom_components/tesla_custom/button.py @@ -22,13 +22,13 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarHorn(hass, car, coordinator)) - entities.append(TeslaCarFlashLights(hass, car, coordinator)) - entities.append(TeslaCarWakeUp(hass, car, coordinator)) - entities.append(TeslaCarForceDataUpdate(hass, car, coordinator)) - entities.append(TeslaCarTriggerHomelink(hass, car, coordinator)) - entities.append(TeslaCarRemoteStart(hass, car, coordinator)) - entities.append(TeslaCarEmissionsTest(hass, car, coordinator)) + entities.append(TeslaCarHorn(car, coordinator)) + entities.append(TeslaCarFlashLights(car, coordinator)) + entities.append(TeslaCarWakeUp(car, coordinator)) + entities.append(TeslaCarForceDataUpdate(car, coordinator)) + entities.append(TeslaCarTriggerHomelink(car, coordinator)) + entities.append(TeslaCarRemoteStart(car, coordinator)) + entities.append(TeslaCarEmissionsTest(car, coordinator)) async_add_entities(entities, update_before_add=True) @@ -97,12 +97,11 @@ class TeslaCarTriggerHomelink(TeslaCarEntity, ButtonEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialise Homelink button.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) # Entity is only enabled upon first install if garages have been paired to homelink self._enabled_by_default = self._car.homelink_device_count @@ -136,12 +135,11 @@ class TeslaCarEmissionsTest(TeslaCarEntity, ButtonEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialize emissions test button.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) self._enabled_by_default = self._car.pedestrian_speaker async def async_press(self) -> None: diff --git a/custom_components/tesla_custom/climate.py b/custom_components/tesla_custom/climate.py index 2ee0927e..08d6b674 100644 --- a/custom_components/tesla_custom/climate.py +++ b/custom_components/tesla_custom/climate.py @@ -36,14 +36,7 @@ async def async_setup_entry( coordinators = entry_data["coordinators"] cars = entry_data["cars"] - entities = [ - TeslaCarClimate( - hass, - car, - coordinators[vin], - ) - for vin, car in cars.items() - ] + entities = [TeslaCarClimate(car, coordinators[vin]) for vin, car in cars.items()] async_add_entities(entities, update_before_add=True) @@ -128,7 +121,7 @@ async def async_set_hvac_mode(self, hvac_mode): elif hvac_mode == HVAC_MODE_HEAT_COOL: await self._car.set_hvac_mode("on") # set_hvac_mode changes multiple states so refresh all entities - await self._coordinator.async_refresh() + await self.coordinator.async_refresh() @property def preset_mode(self): @@ -173,4 +166,4 @@ async def async_set_preset_mode(self, preset_mode: str) -> None: else: await self._car.set_climate_keeper_mode(KEEPER_MAP[preset_mode]) # max_defrost changes multiple states so refresh all entities - await self._coordinator.async_refresh() + await self.coordinator.async_refresh() diff --git a/custom_components/tesla_custom/cover.py b/custom_components/tesla_custom/cover.py index 7b2c453e..eac50c25 100644 --- a/custom_components/tesla_custom/cover.py +++ b/custom_components/tesla_custom/cover.py @@ -23,10 +23,10 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarChargerDoor(hass, car, coordinator)) - entities.append(TeslaCarFrunk(hass, car, coordinator)) - entities.append(TeslaCarTrunk(hass, car, coordinator)) - entities.append(TeslaCarWindows(hass, car, coordinator)) + entities.append(TeslaCarChargerDoor(car, coordinator)) + entities.append(TeslaCarFrunk(car, coordinator)) + entities.append(TeslaCarTrunk(car, coordinator)) + entities.append(TeslaCarWindows(car, coordinator)) async_add_entities(entities, update_before_add=True) diff --git a/custom_components/tesla_custom/device_tracker.py b/custom_components/tesla_custom/device_tracker.py index 2696c26e..c355416f 100644 --- a/custom_components/tesla_custom/device_tracker.py +++ b/custom_components/tesla_custom/device_tracker.py @@ -20,8 +20,8 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarLocation(hass, car, coordinator)) - entities.append(TeslaCarDestinationLocation(hass, car, coordinator)) + entities.append(TeslaCarLocation(car, coordinator)) + entities.append(TeslaCarDestinationLocation(car, coordinator)) async_add_entities(entities, update_before_add=True) diff --git a/custom_components/tesla_custom/lock.py b/custom_components/tesla_custom/lock.py index 4ff54334..89c7c6a7 100644 --- a/custom_components/tesla_custom/lock.py +++ b/custom_components/tesla_custom/lock.py @@ -19,8 +19,8 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarDoors(hass, car, coordinator)) - entities.append(TeslaCarChargePortLatch(hass, car, coordinator)) + entities.append(TeslaCarDoors(car, coordinator)) + entities.append(TeslaCarChargePortLatch(car, coordinator)) async_add_entities(entities, update_before_add=True) diff --git a/custom_components/tesla_custom/number.py b/custom_components/tesla_custom/number.py index d4d7c30d..9053bedb 100644 --- a/custom_components/tesla_custom/number.py +++ b/custom_components/tesla_custom/number.py @@ -24,13 +24,13 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarChargeLimit(hass, car, coordinator)) - entities.append(TeslaCarChargingAmps(hass, car, coordinator)) + entities.append(TeslaCarChargeLimit(car, coordinator)) + entities.append(TeslaCarChargingAmps(car, coordinator)) for energy_site_id, energysite in energysites.items(): coordinator = coordinators[energy_site_id] if energysite.resource_type == RESOURCE_TYPE_BATTERY: - entities.append(TeslaEnergyBackupReserve(hass, energysite, coordinator)) + entities.append(TeslaEnergyBackupReserve(energysite, coordinator)) async_add_entities(entities, update_before_add=True) diff --git a/custom_components/tesla_custom/select.py b/custom_components/tesla_custom/select.py index ba19e45c..55074bb9 100644 --- a/custom_components/tesla_custom/select.py +++ b/custom_components/tesla_custom/select.py @@ -85,10 +85,10 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarCabinOverheatProtection(hass, car, coordinator)) + entities.append(TeslaCarCabinOverheatProtection(car, coordinator)) if car.get_heated_steering_wheel_level() is not None: # Only add steering wheel select if we have a variable heated steering wheel - entities.append(TeslaCarHeatedSteeringWheel(hass, car, coordinator)) + entities.append(TeslaCarHeatedSteeringWheel(car, coordinator)) for seat_name in SEAT_ID_MAP: if "rear" in seat_name and not car.rear_seat_heaters: continue @@ -98,15 +98,15 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie car.third_row_seats == "None" or car.third_row_seats is None ): continue - entities.append(TeslaCarHeatedSeat(hass, car, coordinator, seat_name)) + entities.append(TeslaCarHeatedSeat(car, coordinator, seat_name)) for energy_site_id, energysite in energysites.items(): coordinator = coordinators[energy_site_id] if energysite.resource_type == RESOURCE_TYPE_BATTERY: - entities.append(TeslaEnergyOperationMode(hass, energysite, coordinator)) + entities.append(TeslaEnergyOperationMode(energysite, coordinator)) if energysite.resource_type == RESOURCE_TYPE_BATTERY and energysite.has_solar: - entities.append(TeslaEnergyExportRule(hass, energysite, coordinator)) - entities.append(TeslaEnergyGridCharging(hass, energysite, coordinator)) + entities.append(TeslaEnergyExportRule(energysite, coordinator)) + entities.append(TeslaEnergyGridCharging(energysite, coordinator)) async_add_entities(entities, update_before_add=True) @@ -118,13 +118,12 @@ class TeslaCarHeatedSeat(TeslaCarEntity, SelectEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, seat_name: str, ): """Initialize heated seat entity.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) self._seat_name = seat_name self.type = f"heated seat {seat_name}" if SEAT_ID_MAP[self._seat_name] < 2: @@ -192,12 +191,11 @@ class TeslaCarHeatedSteeringWheel(TeslaCarEntity, SelectEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ): """Initialize heated seat entity.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) self._enabled_by_default = self._car.steering_wheel_heater async def async_select_option(self, option: str, **kwargs): diff --git a/custom_components/tesla_custom/sensor.py b/custom_components/tesla_custom/sensor.py index 1c5985ba..3b6baa0a 100644 --- a/custom_components/tesla_custom/sensor.py +++ b/custom_components/tesla_custom/sensor.py @@ -62,23 +62,21 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarBattery(hass, car, coordinator)) - entities.append(TeslaCarChargerRate(hass, car, coordinator)) - entities.append(TeslaCarChargerEnergy(hass, car, coordinator)) - entities.append(TeslaCarChargerPower(hass, car, coordinator)) - entities.append(TeslaCarOdometer(hass, car, coordinator)) - entities.append(TeslaCarShiftState(hass, car, coordinator)) - entities.append(TeslaCarRange(hass, car, coordinator)) - entities.append(TeslaCarTemp(hass, car, coordinator)) - entities.append(TeslaCarTemp(hass, car, coordinator, inside=True)) - entities.append(TeslaCarTimeChargeComplete(hass, car, coordinator)) + entities.append(TeslaCarBattery(car, coordinator)) + entities.append(TeslaCarChargerRate(car, coordinator)) + entities.append(TeslaCarChargerEnergy(car, coordinator)) + entities.append(TeslaCarChargerPower(car, coordinator)) + entities.append(TeslaCarOdometer(car, coordinator)) + entities.append(TeslaCarShiftState(car, coordinator)) + entities.append(TeslaCarRange(car, coordinator)) + entities.append(TeslaCarTemp(car, coordinator)) + entities.append(TeslaCarTemp(car, coordinator, inside=True)) + entities.append(TeslaCarTimeChargeComplete(car, coordinator)) for tpms_sensor in TPMS_SENSORS: - entities.append( - TeslaCarTpmsPressureSensor(hass, car, coordinator, tpms_sensor) - ) - entities.append(TeslaCarArrivalTime(hass, car, coordinator)) - entities.append(TeslaCarDistanceToArrival(hass, car, coordinator)) - entities.append(TeslaCarDataUpdateTime(hass, car, coordinator)) + entities.append(TeslaCarTpmsPressureSensor(car, coordinator, tpms_sensor)) + entities.append(TeslaCarArrivalTime(car, coordinator)) + entities.append(TeslaCarDistanceToArrival(car, coordinator)) + entities.append(TeslaCarDataUpdateTime(car, coordinator)) for energy_site_id, energysite in energysites.items(): coordinator = coordinators[energy_site_id] @@ -88,20 +86,20 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie ): for sensor_type in SOLAR_SITE_SENSORS: entities.append( - TeslaEnergyPowerSensor(hass, energysite, coordinator, sensor_type) + TeslaEnergyPowerSensor(energysite, coordinator, sensor_type) ) elif energysite.resource_type == RESOURCE_TYPE_SOLAR: entities.append( - TeslaEnergyPowerSensor(hass, energysite, coordinator, "solar power") + TeslaEnergyPowerSensor(energysite, coordinator, "solar power") ) if energysite.resource_type == RESOURCE_TYPE_BATTERY: - entities.append(TeslaEnergyBattery(hass, energysite, coordinator)) - entities.append(TeslaEnergyBatteryRemaining(hass, energysite, coordinator)) - entities.append(TeslaEnergyBackupReserve(hass, energysite, coordinator)) + entities.append(TeslaEnergyBattery(energysite, coordinator)) + entities.append(TeslaEnergyBatteryRemaining(energysite, coordinator)) + entities.append(TeslaEnergyBackupReserve(energysite, coordinator)) for sensor_type in BATTERY_SITE_SENSORS: entities.append( - TeslaEnergyPowerSensor(hass, energysite, coordinator, sensor_type) + TeslaEnergyPowerSensor(energysite, coordinator, sensor_type) ) async_add_entities(entities, update_before_add=True) @@ -199,11 +197,12 @@ def native_value(self) -> int: @property def extra_state_attributes(self): """Return device state attributes.""" + car = self._car return { - "charger_amps_request": self._car.charge_current_request, - "charger_amps_actual": self._car.charger_actual_current, - "charger_volts": self._car.charger_voltage, - "charger_phases": self._car.charger_phases, + "charger_amps_request": car.charge_current_request, + "charger_amps_actual": car.charger_actual_current, + "charger_volts": car.charger_voltage, + "charger_phases": car.charger_phases, } @@ -300,10 +299,11 @@ class TeslaCarRange(TeslaCarEntity, SensorEntity): @property def native_value(self) -> float: """Return range.""" - range_value = self._car.battery_range + car = self._car + range_value = car.battery_range - if self._car.gui_range_display == "Ideal": - range_value = self._car.ideal_battery_range + if car.gui_range_display == "Ideal": + range_value = car.ideal_battery_range if range_value is None: return None @@ -341,14 +341,13 @@ class TeslaCarTemp(TeslaCarEntity, SensorEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, *, inside=False, ) -> None: """Initialize temp entity.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) self.inside = inside if inside is True: self.type += " (inside)" @@ -360,7 +359,6 @@ def native_value(self) -> float: """Return car temperature.""" if self.inside is True: return self._car.inside_temp - return self._car.outside_temp @@ -373,13 +371,12 @@ class TeslaEnergyPowerSensor(TeslaEnergyEntity, SensorEntity): def __init__( self, - hass: HomeAssistant, energysite: EnergySite, coordinator: TeslaDataUpdateCoordinator, sensor_type: str, ) -> None: """Initialize power sensor.""" - super().__init__(hass, energysite, coordinator) + super().__init__(energysite, coordinator) self.type = sensor_type if self.type == "solar power": self._attr_icon = "mdi:solar-power-variant" @@ -535,13 +532,12 @@ class TeslaCarTpmsPressureSensor(TeslaCarEntity, SensorEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, tpms_sensor: str, ) -> None: """Initialize TPMS Pressure sensor.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) self._tpms_sensor = tpms_sensor self.type = tpms_sensor @@ -601,18 +597,19 @@ def native_value(self) -> Optional[datetime]: @property def extra_state_attributes(self): """Return device state attributes.""" - if self._car.active_route_traffic_minutes_delay is None: + car = self._car + if car.active_route_traffic_minutes_delay is None: minutes = None else: - minutes = round(self._car.active_route_traffic_minutes_delay, 1) + minutes = round(car.active_route_traffic_minutes_delay, 1) return { - "Energy at arrival": self._car.active_route_energy_at_arrival, + "Energy at arrival": car.active_route_energy_at_arrival, "Minutes traffic delay": minutes, - "Destination": self._car.active_route_destination, + "Destination": car.active_route_destination, "Minutes to arrival": None - if self._car.active_route_minutes_to_arrival is None - else round(float(self._car.active_route_minutes_to_arrival), 2), + if car.active_route_minutes_to_arrival is None + else round(float(car.active_route_minutes_to_arrival), 2), } @@ -644,11 +641,9 @@ class TeslaCarDataUpdateTime(TeslaCarEntity, SensorEntity): @property def native_value(self) -> datetime: """Return the last data update time.""" - last_time = self._coordinator.controller.get_last_update_time(vin=self._car.vin) - - utc_tz = dt.get_time_zone("UTC") + last_time = self.coordinator.controller.get_last_update_time(vin=self._car.vin) if not isinstance(last_time, datetime): - date_obj = datetime.fromtimestamp(last_time, utc_tz) + date_obj = datetime.fromtimestamp(last_time, dt.UTC) else: - date_obj = last_time.replace(tzinfo=utc_tz) + date_obj = last_time.replace(tzinfo=dt.UTC) return date_obj diff --git a/custom_components/tesla_custom/switch.py b/custom_components/tesla_custom/switch.py index 0655ff79..8cde2890 100644 --- a/custom_components/tesla_custom/switch.py +++ b/custom_components/tesla_custom/switch.py @@ -22,11 +22,11 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarHeatedSteeringWheel(hass, car, coordinator)) - entities.append(TeslaCarSentryMode(hass, car, coordinator)) - entities.append(TeslaCarPolling(hass, car, coordinator)) - entities.append(TeslaCarCharger(hass, car, coordinator)) - entities.append(TeslaCarValetMode(hass, car, coordinator)) + entities.append(TeslaCarHeatedSteeringWheel(car, coordinator)) + entities.append(TeslaCarSentryMode(car, coordinator)) + entities.append(TeslaCarPolling(car, coordinator)) + entities.append(TeslaCarCharger(car, coordinator)) + entities.append(TeslaCarValetMode(car, coordinator)) async_add_entities(entities, update_before_add=True) @@ -39,12 +39,11 @@ class TeslaCarHeatedSteeringWheel(TeslaCarEntity, SwitchEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialize heated steering wheel entity.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) # Entity is disabled for cars with variable heated steering wheel. self._enabled_by_default = car.get_heated_steering_wheel_level() is not None @@ -79,7 +78,7 @@ class TeslaCarPolling(TeslaCarEntity, SwitchEntity): @property def is_on(self) -> bool | None: """Return True if updates available.""" - controller = self._coordinator.controller + controller = self.coordinator.controller get_updates = controller.get_updates(vin=self._car.vin) if get_updates is None: return None @@ -88,13 +87,13 @@ def is_on(self) -> bool | None: async def async_turn_on(self, **kwargs): """Send the on command.""" _LOGGER.debug("Enable polling: %s %s", self.name, self._car.vin) - self._coordinator.controller.set_updates(vin=self._car.vin, value=True) + self.coordinator.controller.set_updates(vin=self._car.vin, value=True) self.async_write_ha_state() async def async_turn_off(self, **kwargs): """Send the off command.""" _LOGGER.debug("Disable polling: %s %s", self.name, self._car.vin) - self._coordinator.controller.set_updates(vin=self._car.vin, value=False) + self.coordinator.controller.set_updates(vin=self._car.vin, value=False) self.async_write_ha_state() @@ -128,12 +127,11 @@ class TeslaCarSentryMode(TeslaCarEntity, SwitchEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, ) -> None: """Initialize sentry mode entity.""" - super().__init__(hass, car, coordinator) + super().__init__(car, coordinator) # Entity is only enabled upon first install if sentry mode is available self._enabled_by_default = self._car.sentry_mode_available diff --git a/custom_components/tesla_custom/teslamate.py b/custom_components/tesla_custom/teslamate.py index a12ed5e3..12dea06d 100644 --- a/custom_components/tesla_custom/teslamate.py +++ b/custom_components/tesla_custom/teslamate.py @@ -100,7 +100,7 @@ def cast_speed(speed: int) -> int: class TeslaMate: """TeslaMate Connector. - Manages connnections to MQTT topics exposed by TeslaMate. + Manages connections to MQTT topics exposed by TeslaMate. """ def __init__( @@ -108,7 +108,7 @@ def __init__( hass: HomeAssistant, coordinators: list["TeslaDataUpdateCoordinator"], cars: dict[str, TeslaCar], - ): + ) -> None: """Init Class.""" self.cars = cars self.hass = hass diff --git a/custom_components/tesla_custom/text.py b/custom_components/tesla_custom/text.py index 445d5c32..bebd5f1b 100644 --- a/custom_components/tesla_custom/text.py +++ b/custom_components/tesla_custom/text.py @@ -20,7 +20,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie for vin, car in cars.items(): coordinator = coordinators[vin] - entities.append(TeslaCarTeslaMateID(hass, car, coordinator, teslamate)) + entities.append(TeslaCarTeslaMateID(car, coordinator, teslamate)) async_add_entities(entities, update_before_add=True) @@ -36,14 +36,13 @@ class TeslaCarTeslaMateID(TeslaCarEntity, TextEntity): def __init__( self, - hass: HomeAssistant, car: TeslaCar, coordinator: TeslaDataUpdateCoordinator, teslamate: TeslaMate, ) -> None: """Initialize charge limit entity.""" - super().__init__(hass, car, coordinator) - self.teslsmate = teslamate + super().__init__(car, coordinator) + self.teslamate = teslamate self._state = None async def async_set_value(self, value: str) -> None: @@ -51,14 +50,14 @@ async def async_set_value(self, value: str) -> None: if value.strip() == "": value = None - await self.teslsmate.set_car_id(self._car.vin, value) - await self.teslsmate.watch_cars() + await self.teslamate.set_car_id(self._car.vin, value) + await self.teslamate.watch_cars() self.async_write_ha_state() async def async_update(self) -> None: """Update the entity.""" # Ignore manual update requests if the entity is disabled - self._state = await self.teslsmate.get_car_id(self._car.vin) + self._state = await self.teslamate.get_car_id(self._car.vin) @property def native_value(self) -> str: diff --git a/custom_components/tesla_custom/update.py b/custom_components/tesla_custom/update.py index 475a682e..458d4ee9 100644 --- a/custom_components/tesla_custom/update.py +++ b/custom_components/tesla_custom/update.py @@ -14,14 +14,7 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie coordinators = entry_data["coordinators"] cars = entry_data["cars"] - entities = [ - TeslaCarUpdate( - hass, - car, - coordinators[vin], - ) - for vin, car in cars.items() - ] + entities = [TeslaCarUpdate(car, coordinators[vin]) for vin, car in cars.items()] async_add_entities(entities, update_before_add=True)