diff --git a/custom_components/tesla_custom/sensor.py b/custom_components/tesla_custom/sensor.py index 12dec02a..a15cda46 100644 --- a/custom_components/tesla_custom/sensor.py +++ b/custom_components/tesla_custom/sensor.py @@ -19,11 +19,11 @@ SPEED_MILES_PER_HOUR, TEMP_CELSIUS, TIME_HOURS, - PRESSURE_BAR, + UnitOfPressure, ) from homeassistant.core import HomeAssistant from homeassistant.helpers.icon import icon_for_battery_level -from homeassistant.util.unit_conversion import DistanceConverter +from homeassistant.util.unit_conversion import DistanceConverter, PressureConverter from homeassistant.util import dt from . import TeslaDataUpdateCoordinator @@ -37,10 +37,10 @@ BATTERY_SITE_SENSORS = SOLAR_SITE_SENSORS + ["battery power"] TPMS_SENSORS = { - "TPMS front left": 'tpms_pressure_fl', - "TPMS front right": 'tpms_pressure_fr', - "TPMS rear left": 'tpms_pressure_rl', - "TPMS rear right": 'tpms_pressure_rr', + "TPMS front left": "tpms_pressure_fl", + "TPMS front right": "tpms_pressure_fr", + "TPMS rear left": "tpms_pressure_rl", + "TPMS rear right": "tpms_pressure_rr", } TPMS_SENSOR_ATTR = { @@ -69,7 +69,9 @@ async def async_setup_entry(hass: HomeAssistant, config_entry, async_add_entitie entities.append(TeslaCarTemp(hass, car, coordinator, inside=True)) entities.append(TeslaCarTimeChargeComplete(hass, car, coordinator)) for tpms_sensor in TPMS_SENSORS: - entities.append(TeslaCarTpmsPressureSensor(hass, car, coordinator, tpms_sensor)) + entities.append( + TeslaCarTpmsPressureSensor(hass, car, coordinator, tpms_sensor) + ) for energysite in energysites.values(): if ( @@ -515,6 +517,7 @@ def native_value(self) -> Optional[datetime]: return self._value return None + class TeslaCarTpmsPressureSensor(TeslaCarEntity, SensorEntity): """Representation of the Tesla car TPMS Pressure sensor.""" @@ -531,19 +534,22 @@ def __init__( self.type = tpms_sensor self._attr_device_class = SensorDeviceClass.PRESSURE self._attr_state_class = SensorStateClass.MEASUREMENT - self._attr_native_unit_of_measurement = PRESSURE_BAR + self._attr_native_unit_of_measurement = UnitOfPressure.BAR + self._attr_suggested_unit_of_measurement = UnitOfPressure.PSI self._attr_icon = "mdi:gauge-full" @property def native_value(self) -> float: """Return TPMS Pressure.""" - return getattr(self._car, TPMS_SENSORS.get(self._tpms_sensor)) + return round(getattr(self._car, TPMS_SENSORS.get(self._tpms_sensor)), 2) @property def extra_state_attributes(self): """Return device state attributes.""" - timestamp = self._car._vehicle_data.get("vehicle_state", {}).get(TPMS_SENSOR_ATTR.get(self._tpms_sensor)) + timestamp = self._car._vehicle_data.get("vehicle_state", {}).get( + TPMS_SENSOR_ATTR.get(self._tpms_sensor) + ) return { "tpms_last_seen_pressure_timestamp": timestamp, - } \ No newline at end of file + } diff --git a/tests/mock_data/car.py b/tests/mock_data/car.py index bccba8bd..3d4c1f44 100644 --- a/tests/mock_data/car.py +++ b/tests/mock_data/car.py @@ -227,10 +227,10 @@ }, "summon_standby_mode_enabled": False, "timestamp": 1661641175268, - "tpms_pressure_fl": 2.4, - "tpms_pressure_fr": 2.575, - "tpms_pressure_rl": 2.6, - "tpms_pressure_rr": 2.7, + "tpms_pressure_fl": 2.40, + "tpms_pressure_fr": 2.58, + "tpms_pressure_rl": 2.62, + "tpms_pressure_rr": 2.71, "tpms_hard_warning_fl": False, "tpms_hard_warning_fr": False, "tpms_hard_warning_rl": False, diff --git a/tests/test_sensor.py b/tests/test_sensor.py index 64868b11..af6efba6 100644 --- a/tests/test_sensor.py +++ b/tests/test_sensor.py @@ -18,11 +18,15 @@ SPEED_MILES_PER_HOUR, STATE_UNKNOWN, TEMP_CELSIUS, - PRESSURE_BAR, + UnitOfPressure, ) from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er -from homeassistant.util.unit_conversion import DistanceConverter, SpeedConverter +from homeassistant.util.unit_conversion import ( + DistanceConverter, + SpeedConverter, + PressureConverter, +) from .common import setup_platform from .mock_data import car as car_mock_data @@ -386,13 +390,27 @@ async def test_tpms_pressure_sensor(hass: HomeAssistant) -> None: await setup_platform(hass, SENSOR_DOMAIN) state_fl = hass.states.get("sensor.my_model_s_tpms_front_left") + prec = ( + len(state_fl.state) - state_fl.state.index(".") - 1 + if "." in state_fl.state + else 0 + ) assert state_fl.state == str( - car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_fl"] + round( + PressureConverter.convert( + round( + car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_fl"], 2 + ), + UnitOfPressure.BAR, + UnitOfPressure.PSI, + ), + prec, + ), ) assert state_fl.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state_fl.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert state_fl.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_BAR + assert state_fl.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.PSI assert ( state_fl.attributes.get("tpms_last_seen_pressure_timestamp") @@ -402,13 +420,27 @@ async def test_tpms_pressure_sensor(hass: HomeAssistant) -> None: ) state_fr = hass.states.get("sensor.my_model_s_tpms_front_right") + prec = ( + len(state_fr.state) - state_fr.state.index(".") - 1 + if "." in state_fr.state + else 0 + ) assert state_fr.state == str( - car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_fr"] + round( + PressureConverter.convert( + round( + car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_fr"], 2 + ), + UnitOfPressure.BAR, + UnitOfPressure.PSI, + ), + prec, + ), ) assert state_fr.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state_fr.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert state_fr.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_BAR + assert state_fr.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.PSI assert ( state_fr.attributes.get("tpms_last_seen_pressure_timestamp") @@ -418,13 +450,27 @@ async def test_tpms_pressure_sensor(hass: HomeAssistant) -> None: ) state_rl = hass.states.get("sensor.my_model_s_tpms_rear_left") + prec = ( + len(state_rl.state) - state_rl.state.index(".") - 1 + if "." in state_rl.state + else 0 + ) assert state_rl.state == str( - car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_rl"] + round( + PressureConverter.convert( + round( + car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_rl"], 2 + ), + UnitOfPressure.BAR, + UnitOfPressure.PSI, + ), + prec, + ), ) assert state_rl.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state_rl.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert state_rl.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_BAR + assert state_rl.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.PSI assert ( state_rl.attributes.get("tpms_last_seen_pressure_timestamp") @@ -434,13 +480,27 @@ async def test_tpms_pressure_sensor(hass: HomeAssistant) -> None: ) state_rr = hass.states.get("sensor.my_model_s_tpms_rear_right") + prec = ( + len(state_rr.state) - state_rr.state.index(".") - 1 + if "." in state_rr.state + else 0 + ) assert state_rr.state == str( - car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_rr"] + round( + PressureConverter.convert( + round( + car_mock_data.VEHICLE_DATA["vehicle_state"]["tpms_pressure_rr"], 2 + ), + UnitOfPressure.BAR, + UnitOfPressure.PSI, + ), + prec, + ), ) assert state_rr.attributes.get(ATTR_DEVICE_CLASS) == SensorDeviceClass.PRESSURE assert state_rr.attributes.get(ATTR_STATE_CLASS) == SensorStateClass.MEASUREMENT - assert state_rr.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == PRESSURE_BAR + assert state_rr.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == UnitOfPressure.PSI assert ( state_rr.attributes.get("tpms_last_seen_pressure_timestamp")