Refactor Teslemetry integration (#112480)
* Refactor Teslemetry * Add abstractmethod * Remove unused timestamp const * Ruff * Fix * Update snapshots * ruff * Ruff * ruff * Lint * Fix tests * Fix tests and diag * Refix snapshot * Ruff * Fix * Fix bad merge * has as property * Remove _handle_coordinator_update * Test and error changes
This commit is contained in:
parent
11f5b48724
commit
1a4e416bf4
17 changed files with 562 additions and 323 deletions
|
@ -2,11 +2,12 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
from typing import Any, cast
|
||||
|
||||
from tesla_fleet_api.const import Scope
|
||||
|
||||
from homeassistant.components.climate import (
|
||||
ATTR_HVAC_MODE,
|
||||
ClimateEntity,
|
||||
ClimateEntityFeature,
|
||||
HVACMode,
|
||||
|
@ -17,10 +18,12 @@ from homeassistant.core import HomeAssistant
|
|||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
from .const import DOMAIN, TeslemetryClimateSide
|
||||
from .context import handle_command
|
||||
from .entity import TeslemetryVehicleEntity
|
||||
from .models import TeslemetryVehicleData
|
||||
|
||||
DEFAULT_MIN_TEMP = 15
|
||||
DEFAULT_MAX_TEMP = 28
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
||||
|
@ -38,8 +41,7 @@ class TeslemetryClimateEntity(TeslemetryVehicleEntity, ClimateEntity):
|
|||
"""Vehicle Location Climate Class."""
|
||||
|
||||
_attr_precision = PRECISION_HALVES
|
||||
_attr_min_temp = 15
|
||||
_attr_max_temp = 28
|
||||
|
||||
_attr_temperature_unit = UnitOfTemperature.CELSIUS
|
||||
_attr_hvac_modes = [HVACMode.HEAT_COOL, HVACMode.OFF]
|
||||
_attr_supported_features = (
|
||||
|
@ -67,68 +69,65 @@ class TeslemetryClimateEntity(TeslemetryVehicleEntity, ClimateEntity):
|
|||
side,
|
||||
)
|
||||
|
||||
@property
|
||||
def hvac_mode(self) -> HVACMode | None:
|
||||
"""Return hvac operation ie. heat, cool mode."""
|
||||
if self.get("climate_state_is_climate_on"):
|
||||
return HVACMode.HEAT_COOL
|
||||
return HVACMode.OFF
|
||||
def _async_update_attrs(self) -> None:
|
||||
"""Update the attributes of the entity."""
|
||||
value = self.get("climate_state_is_climate_on")
|
||||
if value is None:
|
||||
self._attr_hvac_mode = None
|
||||
elif value:
|
||||
self._attr_hvac_mode = HVACMode.HEAT_COOL
|
||||
else:
|
||||
self._attr_hvac_mode = HVACMode.OFF
|
||||
|
||||
@property
|
||||
def current_temperature(self) -> float | None:
|
||||
"""Return the current temperature."""
|
||||
return self.get("climate_state_inside_temp")
|
||||
|
||||
@property
|
||||
def target_temperature(self) -> float | None:
|
||||
"""Return the temperature we try to reach."""
|
||||
return self.get(f"climate_state_{self.key}_setting")
|
||||
|
||||
@property
|
||||
def max_temp(self) -> float:
|
||||
"""Return the maximum temperature."""
|
||||
return self.get("climate_state_max_avail_temp", self._attr_max_temp)
|
||||
|
||||
@property
|
||||
def min_temp(self) -> float:
|
||||
"""Return the minimum temperature."""
|
||||
return self.get("climate_state_min_avail_temp", self._attr_min_temp)
|
||||
|
||||
@property
|
||||
def preset_mode(self) -> str | None:
|
||||
"""Return the current preset mode."""
|
||||
return self.get("climate_state_climate_keeper_mode")
|
||||
self._attr_current_temperature = self.get("climate_state_inside_temp")
|
||||
self._attr_target_temperature = self.get(f"climate_state_{self.key}_setting")
|
||||
self._attr_preset_mode = self.get("climate_state_climate_keeper_mode")
|
||||
self._attr_min_temp = cast(
|
||||
float, self.get("climate_state_min_avail_temp", DEFAULT_MIN_TEMP)
|
||||
)
|
||||
self._attr_max_temp = cast(
|
||||
float, self.get("climate_state_max_avail_temp", DEFAULT_MAX_TEMP)
|
||||
)
|
||||
|
||||
async def async_turn_on(self) -> None:
|
||||
"""Set the climate state to on."""
|
||||
|
||||
self.raise_for_scope()
|
||||
with handle_command():
|
||||
await self.wake_up_if_asleep()
|
||||
await self.api.auto_conditioning_start()
|
||||
self.set(("climate_state_is_climate_on", True))
|
||||
await self.wake_up_if_asleep()
|
||||
await self.handle_command(self.api.auto_conditioning_start())
|
||||
|
||||
self._attr_hvac_mode = HVACMode.HEAT_COOL
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_turn_off(self) -> None:
|
||||
"""Set the climate state to off."""
|
||||
|
||||
self.raise_for_scope()
|
||||
with handle_command():
|
||||
await self.wake_up_if_asleep()
|
||||
await self.api.auto_conditioning_stop()
|
||||
self.set(
|
||||
("climate_state_is_climate_on", False),
|
||||
("climate_state_climate_keeper_mode", "off"),
|
||||
)
|
||||
await self.wake_up_if_asleep()
|
||||
await self.handle_command(self.api.auto_conditioning_stop())
|
||||
|
||||
self._attr_hvac_mode = HVACMode.OFF
|
||||
self._attr_preset_mode = self._attr_preset_modes[0]
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_set_temperature(self, **kwargs: Any) -> None:
|
||||
"""Set the climate temperature."""
|
||||
temp = kwargs[ATTR_TEMPERATURE]
|
||||
with handle_command():
|
||||
await self.wake_up_if_asleep()
|
||||
await self.api.set_temps(
|
||||
driver_temp=temp,
|
||||
passenger_temp=temp,
|
||||
)
|
||||
|
||||
self.set((f"climate_state_{self.key}_setting", temp))
|
||||
if temp := kwargs.get(ATTR_TEMPERATURE):
|
||||
await self.wake_up_if_asleep()
|
||||
await self.handle_command(
|
||||
self.api.set_temps(
|
||||
driver_temp=temp,
|
||||
passenger_temp=temp,
|
||||
)
|
||||
)
|
||||
self._attr_target_temperature = temp
|
||||
|
||||
if mode := kwargs.get(ATTR_HVAC_MODE):
|
||||
# Set HVAC mode will call write_ha_state
|
||||
await self.async_set_hvac_mode(mode)
|
||||
else:
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
|
||||
"""Set the climate mode and state."""
|
||||
|
@ -139,18 +138,15 @@ class TeslemetryClimateEntity(TeslemetryVehicleEntity, ClimateEntity):
|
|||
|
||||
async def async_set_preset_mode(self, preset_mode: str) -> None:
|
||||
"""Set the climate preset mode."""
|
||||
with handle_command():
|
||||
await self.wake_up_if_asleep()
|
||||
await self.api.set_climate_keeper_mode(
|
||||
await self.wake_up_if_asleep()
|
||||
await self.handle_command(
|
||||
self.api.set_climate_keeper_mode(
|
||||
climate_keeper_mode=self._attr_preset_modes.index(preset_mode)
|
||||
)
|
||||
self.set(
|
||||
(
|
||||
"climate_state_climate_keeper_mode",
|
||||
preset_mode,
|
||||
),
|
||||
(
|
||||
"climate_state_is_climate_on",
|
||||
preset_mode != self._attr_preset_modes[0],
|
||||
),
|
||||
)
|
||||
self._attr_preset_mode = preset_mode
|
||||
if preset_mode == self._attr_preset_modes[0]:
|
||||
self._attr_hvac_mode = HVACMode.OFF
|
||||
else:
|
||||
self._attr_hvac_mode = HVACMode.HEAT_COOL
|
||||
self.async_write_ha_state()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue