Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 53 additions & 27 deletions src/renault_api/kamereon/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,31 +70,51 @@
},
}

_DEFAULT_ENDPOINTS: dict[str, str] = {
"alerts": "/vehicles/{vin}/alerts",
"battery-status": "/kca/car-adapter/v2/cars/{vin}/battery-status",
"charge-history": "/kca/car-adapter/v1/cars/{vin}/charge-history",
"charge-mode": "/kca/car-adapter/v1/cars/{vin}/charge-mode",
"charge-schedule": "/kca/car-adapter/v1/cars/{vin}/charge-schedule",
"charges": "/kca/car-adapter/v1/cars/{vin}/charges",
"charging-settings": "/kca/car-adapter/v1/cars/{vin}/charging-settings",
"cockpit": "/kca/car-adapter/v1/cars/{vin}/cockpit",
"hvac-history": "/kca/car-adapter/v1/cars/{vin}/hvac-history",
"hvac-sessions": "/kca/car-adapter/v1/cars/{vin}/hvac-sessions",
"hvac-settings": "/kca/car-adapter/v1/cars/{vin}/hvac-settings",
"hvac-status": "/kca/car-adapter/v1/cars/{vin}/hvac-status",
"location": "/kca/car-adapter/v1/cars/{vin}/location",
"lock-status": "/kca/car-adapter/v1/cars/{vin}/lock-status",
"notification-settings": "/kca/car-adapter/v1/cars/{vin}/notification-settings",
"pressure": "/kca/car-adapter/v1/cars/{vin}/pressure",
"res-state": "/kca/car-adapter/v1/cars/{vin}/res-state",
"soc-levels": "/kcm/v1/vehicles/{vin}/ev/soc-levels",

@dataclass
class EndpointDefinition:
endpoint: str
mode: str = "default"


_DEFAULT_ENDPOINTS: dict[str, EndpointDefinition] = {
"actions/ac-start": EndpointDefinition(
"/kca/car-adapter/v1/cars/{vin}/actions/hvac-start"
),
"alerts": EndpointDefinition("/vehicles/{vin}/alerts"),
"battery-status": EndpointDefinition(
"/kca/car-adapter/v2/cars/{vin}/battery-status"
),
"charge-history": EndpointDefinition(
"/kca/car-adapter/v1/cars/{vin}/charge-history"
),
"charge-mode": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/charge-mode"),
"charge-schedule": EndpointDefinition(
"/kca/car-adapter/v1/cars/{vin}/charge-schedule"
),
"charges": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/charges"),
"charging-settings": EndpointDefinition(
"/kca/car-adapter/v1/cars/{vin}/charging-settings"
),
"cockpit": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/cockpit"),
"hvac-history": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/hvac-history"),
"hvac-sessions": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/hvac-sessions"),
"hvac-settings": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/hvac-settings"),
"hvac-status": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/hvac-status"),
"location": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/location"),
"lock-status": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/lock-status"),
"notification-settings": EndpointDefinition(
"/kca/car-adapter/v1/cars/{vin}/notification-settings"
),
"pressure": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/pressure"),
"res-state": EndpointDefinition("/kca/car-adapter/v1/cars/{vin}/res-state"),
"soc-levels": EndpointDefinition("/kcm/v1/vehicles/{vin}/ev/soc-levels"),
}
_KCM_ENDPOINTS: dict[str, str] = {
"charge-schedule": "/kcm/v1/vehicles/{vin}/ev/settings"
_KCM_ENDPOINTS: dict[str, EndpointDefinition] = {
"charge-schedule": EndpointDefinition("/kcm/v1/vehicles/{vin}/ev/settings")
}

_VEHICLE_ENDPOINTS: dict[str, dict[str, Optional[str]]] = {
_VEHICLE_ENDPOINTS: dict[str, dict[str, Optional[EndpointDefinition]]] = {
"R5E1VE": { # Renault 5 E-TECH
"charge-schedule": _KCM_ENDPOINTS["charge-schedule"],
},
Expand Down Expand Up @@ -142,7 +162,9 @@
_ALREADY_WARNED_VEHICLE_ENDPOINT: set[str] = set()


def get_model_endpoints(model_code: Optional[str]) -> Mapping[str, Optional[str]]:
def get_model_endpoints(
model_code: Optional[str],
) -> Mapping[str, Optional[EndpointDefinition]]:
"""Return model endpoints."""
if not model_code:
# Model code not available
Expand All @@ -153,14 +175,18 @@ def get_model_endpoints(model_code: Optional[str]) -> Mapping[str, Optional[str]
if model_code not in _ALREADY_WARNED_VEHICLE:
_ALREADY_WARNED_VEHICLE.add(model_code)
_LOGGER.warning(
"Model %s is not documented, using default endpoints", model_code
"Model %s is not documented, using default endpoints."
" Please open an issue in https://github.com/hacf-fr/renault-api",
model_code,
)
return _DEFAULT_ENDPOINTS

return _VEHICLE_ENDPOINTS[model_code]


def get_model_endpoint(model_code: Optional[str], endpoint: str) -> Optional[str]:
def get_model_endpoint(
model_code: Optional[str], endpoint: str
) -> Optional[EndpointDefinition]:
"""Return model endpoint"""
endpoints = get_model_endpoints(model_code)

Expand Down Expand Up @@ -364,11 +390,11 @@ def controls_action_via_kcm(self, action: str) -> bool:
).get(f"control-{action}-via-kcm", False)
return False

def get_endpoints(self) -> Mapping[str, Optional[str]]:
def get_endpoints(self) -> Mapping[str, Optional[EndpointDefinition]]:
"""Return model endpoints."""
return get_model_endpoints(self.get_model_code())

def get_endpoint(self, endpoint: str) -> Optional[str]:
def get_endpoint(self, endpoint: str) -> Optional[EndpointDefinition]:
"""Return model endpoint"""
return get_model_endpoint(self.get_model_code(), endpoint)

Expand Down
2 changes: 1 addition & 1 deletion src/renault_api/renault_vehicle.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ async def get_full_endpoint(self, endpoint: str) -> str:
if full_endpoint is None:
raise EndpointNotAvailableError(endpoint, details.get_model_code())

return ACCOUNT_ENDPOINT_ROOT + full_endpoint
return ACCOUNT_ENDPOINT_ROOT + full_endpoint.endpoint

async def _get_vehicle_data(
self, endpoint: str
Expand Down
59 changes: 30 additions & 29 deletions tests/__snapshots__/test_renault_vehicle.ambr
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,25 @@
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/duster.1.json]
dict({
'alerts': '/vehicles/{vin}/alerts',
'battery-status': '/kca/car-adapter/v2/cars/{vin}/battery-status',
'charge-history': '/kca/car-adapter/v1/cars/{vin}/charge-history',
'charge-mode': '/kca/car-adapter/v1/cars/{vin}/charge-mode',
'charge-schedule': '/kca/car-adapter/v1/cars/{vin}/charge-schedule',
'charges': '/kca/car-adapter/v1/cars/{vin}/charges',
'charging-settings': '/kca/car-adapter/v1/cars/{vin}/charging-settings',
'cockpit': '/kca/car-adapter/v1/cars/{vin}/cockpit',
'hvac-history': '/kca/car-adapter/v1/cars/{vin}/hvac-history',
'hvac-sessions': '/kca/car-adapter/v1/cars/{vin}/hvac-sessions',
'hvac-settings': '/kca/car-adapter/v1/cars/{vin}/hvac-settings',
'hvac-status': '/kca/car-adapter/v1/cars/{vin}/hvac-status',
'location': '/kca/car-adapter/v1/cars/{vin}/location',
'lock-status': '/kca/car-adapter/v1/cars/{vin}/lock-status',
'notification-settings': '/kca/car-adapter/v1/cars/{vin}/notification-settings',
'pressure': '/kca/car-adapter/v1/cars/{vin}/pressure',
'res-state': '/kca/car-adapter/v1/cars/{vin}/res-state',
'soc-levels': '/kcm/v1/vehicles/{vin}/ev/soc-levels',
'actions/ac-start': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/actions/hvac-start', mode='default'),
'alerts': EndpointDefinition(endpoint='/vehicles/{vin}/alerts', mode='default'),
'battery-status': EndpointDefinition(endpoint='/kca/car-adapter/v2/cars/{vin}/battery-status', mode='default'),
'charge-history': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-history', mode='default'),
'charge-mode': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-mode', mode='default'),
'charge-schedule': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-schedule', mode='default'),
'charges': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charges', mode='default'),
'charging-settings': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charging-settings', mode='default'),
'cockpit': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/cockpit', mode='default'),
'hvac-history': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-history', mode='default'),
'hvac-sessions': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-sessions', mode='default'),
'hvac-settings': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-settings', mode='default'),
'hvac-status': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-status', mode='default'),
'location': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/location', mode='default'),
'lock-status': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/lock-status', mode='default'),
'notification-settings': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/notification-settings', mode='default'),
'pressure': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/pressure', mode='default'),
'res-state': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/res-state', mode='default'),
'soc-levels': EndpointDefinition(endpoint='/kcm/v1/vehicles/{vin}/ev/soc-levels', mode='default'),
})
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/megane_e-tech.1.json]
Expand All @@ -48,7 +49,7 @@
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/renault_5.1.json]
dict({
'charge-schedule': '/kcm/v1/vehicles/{vin}/ev/settings',
'charge-schedule': EndpointDefinition(endpoint='/kcm/v1/vehicles/{vin}/ev/settings', mode='default'),
})
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/spring.1.json]
Expand All @@ -66,11 +67,11 @@
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/zoe_40.1.json]
dict({
'battery-status': '/kca/car-adapter/v2/cars/{vin}/battery-status',
'charge-mode': '/kca/car-adapter/v1/cars/{vin}/charge-mode',
'charge-schedule': '/kca/car-adapter/v1/cars/{vin}/charge-schedule',
'cockpit': '/kca/car-adapter/v1/cars/{vin}/cockpit',
'hvac-status': '/kca/car-adapter/v1/cars/{vin}/hvac-status',
'battery-status': EndpointDefinition(endpoint='/kca/car-adapter/v2/cars/{vin}/battery-status', mode='default'),
'charge-mode': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-mode', mode='default'),
'charge-schedule': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-schedule', mode='default'),
'cockpit': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/cockpit', mode='default'),
'hvac-status': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-status', mode='default'),
'location': None,
'lock-status': None,
'pressure': None,
Expand All @@ -80,11 +81,11 @@
# ---
# name: test_get_endpoints[tests/fixtures/kamereon/vehicles/zoe_40.2.json]
dict({
'battery-status': '/kca/car-adapter/v2/cars/{vin}/battery-status',
'charge-mode': '/kca/car-adapter/v1/cars/{vin}/charge-mode',
'charge-schedule': '/kca/car-adapter/v1/cars/{vin}/charge-schedule',
'cockpit': '/kca/car-adapter/v1/cars/{vin}/cockpit',
'hvac-status': '/kca/car-adapter/v1/cars/{vin}/hvac-status',
'battery-status': EndpointDefinition(endpoint='/kca/car-adapter/v2/cars/{vin}/battery-status', mode='default'),
'charge-mode': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-mode', mode='default'),
'charge-schedule': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/charge-schedule', mode='default'),
'cockpit': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/cockpit', mode='default'),
'hvac-status': EndpointDefinition(endpoint='/kca/car-adapter/v1/cars/{vin}/hvac-status', mode='default'),
'location': None,
'lock-status': None,
'pressure': None,
Expand Down
Loading