Add electric vehicle sensors to Mazda integration (#64099)

This commit is contained in:
Brandon Rothweiler 2022-01-15 14:05:06 -05:00 committed by GitHub
parent 9d0b73bd99
commit bc17616720
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 186 additions and 10 deletions

View file

@ -4,7 +4,12 @@ from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_UNIT_SYSTEM_IMPERIAL,
@ -54,6 +59,20 @@ def _get_distance_unit(unit_system):
return LENGTH_KILOMETERS
def _fuel_remaining_percentage_supported(data):
"""Determine if fuel remaining percentage is supported."""
return (not data["isElectric"]) and (
data["status"]["fuelRemainingPercent"] is not None
)
def _fuel_distance_remaining_supported(data):
"""Determine if fuel distance remaining is supported."""
return (not data["isElectric"]) and (
data["status"]["fuelDistanceRemainingKm"] is not None
)
def _front_left_tire_pressure_supported(data):
"""Determine if front left tire pressure is supported."""
return data["status"]["tirePressure"]["frontLeftTirePressurePsi"] is not None
@ -74,6 +93,22 @@ def _rear_right_tire_pressure_supported(data):
return data["status"]["tirePressure"]["rearRightTirePressurePsi"] is not None
def _ev_charge_level_supported(data):
"""Determine if charge level is supported."""
return (
data["isElectric"]
and data["evStatus"]["chargeInfo"]["batteryLevelPercentage"] is not None
)
def _ev_remaining_range_supported(data):
"""Determine if remaining range is supported."""
return (
data["isElectric"]
and data["evStatus"]["chargeInfo"]["drivingRangeKm"] is not None
)
def _fuel_distance_remaining_value(data, unit_system):
"""Get the fuel distance remaining value."""
return round(
@ -106,13 +141,28 @@ def _rear_right_tire_pressure_value(data, unit_system):
return round(data["status"]["tirePressure"]["rearRightTirePressurePsi"])
def _ev_charge_level_value(data, unit_system):
"""Get the charge level value."""
return round(data["evStatus"]["chargeInfo"]["batteryLevelPercentage"])
def _ev_remaining_range_value(data, unit_system):
"""Get the remaining range value."""
return round(
unit_system.length(
data["evStatus"]["chargeInfo"]["drivingRangeKm"], LENGTH_KILOMETERS
)
)
SENSOR_ENTITIES = [
MazdaSensorEntityDescription(
key="fuel_remaining_percentage",
name_suffix="Fuel Remaining Percentage",
icon="mdi:gas-station",
native_unit_of_measurement=PERCENTAGE,
is_supported=lambda data: data["status"]["fuelRemainingPercent"] is not None,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_fuel_remaining_percentage_supported,
value=lambda data, unit_system: data["status"]["fuelRemainingPercent"],
),
MazdaSensorEntityDescription(
@ -120,7 +170,8 @@ SENSOR_ENTITIES = [
name_suffix="Fuel Distance Remaining",
icon="mdi:gas-station",
unit=_get_distance_unit,
is_supported=lambda data: data["status"]["fuelDistanceRemainingKm"] is not None,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_fuel_distance_remaining_supported,
value=_fuel_distance_remaining_value,
),
MazdaSensorEntityDescription(
@ -128,6 +179,7 @@ SENSOR_ENTITIES = [
name_suffix="Odometer",
icon="mdi:speedometer",
unit=_get_distance_unit,
state_class=SensorStateClass.TOTAL_INCREASING,
is_supported=lambda data: data["status"]["odometerKm"] is not None,
value=_odometer_value,
),
@ -136,6 +188,7 @@ SENSOR_ENTITIES = [
name_suffix="Front Left Tire Pressure",
icon="mdi:car-tire-alert",
native_unit_of_measurement=PRESSURE_PSI,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_front_left_tire_pressure_supported,
value=_front_left_tire_pressure_value,
),
@ -144,6 +197,7 @@ SENSOR_ENTITIES = [
name_suffix="Front Right Tire Pressure",
icon="mdi:car-tire-alert",
native_unit_of_measurement=PRESSURE_PSI,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_front_right_tire_pressure_supported,
value=_front_right_tire_pressure_value,
),
@ -152,6 +206,7 @@ SENSOR_ENTITIES = [
name_suffix="Rear Left Tire Pressure",
icon="mdi:car-tire-alert",
native_unit_of_measurement=PRESSURE_PSI,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_rear_left_tire_pressure_supported,
value=_rear_left_tire_pressure_value,
),
@ -160,9 +215,28 @@ SENSOR_ENTITIES = [
name_suffix="Rear Right Tire Pressure",
icon="mdi:car-tire-alert",
native_unit_of_measurement=PRESSURE_PSI,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_rear_right_tire_pressure_supported,
value=_rear_right_tire_pressure_value,
),
MazdaSensorEntityDescription(
key="ev_charge_level",
name_suffix="Charge Level",
device_class=SensorDeviceClass.BATTERY,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_ev_charge_level_supported,
value=_ev_charge_level_value,
),
MazdaSensorEntityDescription(
key="ev_remaining_range",
name_suffix="Remaining Range",
icon="mdi:ev-station",
unit=_get_distance_unit,
state_class=SensorStateClass.MEASUREMENT,
is_supported=_ev_remaining_range_supported,
value=_ev_remaining_range_value,
),
]