diff --git a/myskoda/cli.py b/myskoda/cli.py index da685c94..c6854d41 100644 --- a/myskoda/cli.py +++ b/myskoda/cli.py @@ -13,9 +13,6 @@ from asyncclick.core import Context from termcolor import colored -from myskoda.models.mqtt import OperationName, OperationStatus -from myskoda.myskoda import MySkoda - from .event import Event, EventType, ServiceEventTopic from .models.charging import MaxChargeCurrent from .models.common import ( @@ -26,6 +23,8 @@ OnOffState, OpenState, ) +from .models.operation_request import OperationName, OperationStatus +from .myskoda import MySkoda @click.group() diff --git a/myskoda/event.py b/myskoda/event.py index 7e4e26aa..4de3f097 100644 --- a/myskoda/event.py +++ b/myskoda/event.py @@ -4,7 +4,8 @@ from enum import StrEnum from typing import Literal -from .models.mqtt import OperationRequest, ServiceEvent, ServiceEventCharging +from .models.operation_request import OperationRequest +from .models.service_event import ServiceEvent, ServiceEventCharging class ServiceEventTopic(StrEnum): diff --git a/myskoda/models/mqtt.py b/myskoda/models/operation_request.py similarity index 57% rename from myskoda/models/mqtt.py rename to myskoda/models/operation_request.py index 993439e7..b09833a1 100644 --- a/myskoda/models/mqtt.py +++ b/myskoda/models/operation_request.py @@ -1,8 +1,6 @@ -"""Models relaterd to the MQTT API.""" +"""Models for operation requests, returned by the MQTT broker.""" -from datetime import datetime from enum import StrEnum -from typing import Generic, TypeVar from pydantic import BaseModel, Field @@ -51,15 +49,6 @@ class OperationName(StrEnum): WINDOWS_HEATING = "windows-heating" -class ServiceEventName(StrEnum): - CHANGE_SOC = "change-soc" - CHANGE_ACCESS = "change-access" - CHANGE_LIGHTS = "change-lights" - CLIMATISATION_COMPLETED = "climatisation-completed" - CHANGE_REMAINING_TIME = "change-remaining-time" - CHANGE_CHARGE_MODE = "change-charge-mode" - - class OperationRequest(BaseModel): version: int trace_id: str = Field(None, alias="traceId") @@ -67,50 +56,3 @@ class OperationRequest(BaseModel): operation: OperationName status: OperationStatus error_code: str = Field(None, alias="errorCode") - - -class ServiceEventData(BaseModel): - user_id: str = Field(None, alias="userId") - vin: str - - -T = TypeVar("T", bound=ServiceEventData) - - -class ServiceEvent(BaseModel, Generic[T]): - version: int - trace_id: str = Field(None, alias="traceId") - timestamp: datetime = Field(None, alias="requestId") - producer: str - name: ServiceEventName - data: T - - -class ServiceEventChargingState(StrEnum): - CHARGING = "charging" - CHARGED_NOT_CONSERVING = "chargePurposeReachedAndNotConservationCharging" - NOT_READY = "notReadyForCharging" - READY = "readyForCharging" - - -class ServiceEventChargeMode(StrEnum): - HOME_STORAGE_CHARGING = "homeStorageCharging" - IMMEDIATE_DISCHARGING = "immediateDischarging" - ONLY_OWN_CURRENT = "onlyOwnCurrent" - PREFERRED_CHARGING_TIMES = "preferredChargingTimes" - TIMER_CHARGING_WITH_CLIMATISATION = "timerChargingWithClimatisation" - TIMER = "timer" - MANUAL = "manual" - OFF = "off" - - -class ServiceEventChargingData(ServiceEventData): - mode: ServiceEventChargeMode - state: ServiceEventChargingState - soc: int - charged_range: int = Field(None, alias="chargedRange") - time_to_finish: int | None = Field(None, alias="timeToFinish") - - -class ServiceEventCharging(ServiceEvent): - data: ServiceEventChargingData diff --git a/myskoda/models/service_event.py b/myskoda/models/service_event.py new file mode 100644 index 00000000..5848bc3b --- /dev/null +++ b/myskoda/models/service_event.py @@ -0,0 +1,63 @@ +"""Models related to service events from the MQTT broker.""" + +from datetime import datetime +from enum import StrEnum +from typing import Generic, TypeVar + +from pydantic import BaseModel, Field + + +class ServiceEventName(StrEnum): + CHANGE_SOC = "change-soc" + CHANGE_ACCESS = "change-access" + CHANGE_LIGHTS = "change-lights" + CLIMATISATION_COMPLETED = "climatisation-completed" + CHANGE_REMAINING_TIME = "change-remaining-time" + CHANGE_CHARGE_MODE = "change-charge-mode" + + +class ServiceEventData(BaseModel): + user_id: str = Field(None, alias="userId") + vin: str + + +T = TypeVar("T", bound=ServiceEventData) + + +class ServiceEvent(BaseModel, Generic[T]): + version: int + trace_id: str = Field(None, alias="traceId") + timestamp: datetime = Field(None, alias="requestId") + producer: str + name: ServiceEventName + data: T + + +class ServiceEventChargingState(StrEnum): + CHARGING = "charging" + CHARGED_NOT_CONSERVING = "chargePurposeReachedAndNotConservationCharging" + NOT_READY = "notReadyForCharging" + READY = "readyForCharging" + + +class ServiceEventChargeMode(StrEnum): + HOME_STORAGE_CHARGING = "homeStorageCharging" + IMMEDIATE_DISCHARGING = "immediateDischarging" + ONLY_OWN_CURRENT = "onlyOwnCurrent" + PREFERRED_CHARGING_TIMES = "preferredChargingTimes" + TIMER_CHARGING_WITH_CLIMATISATION = "timerChargingWithClimatisation" + TIMER = "timer" + MANUAL = "manual" + OFF = "off" + + +class ServiceEventChargingData(ServiceEventData): + mode: ServiceEventChargeMode + state: ServiceEventChargingState + soc: int + charged_range: int = Field(None, alias="chargedRange") + time_to_finish: int | None = Field(None, alias="timeToFinish") + + +class ServiceEventCharging(ServiceEvent): + data: ServiceEventChargingData diff --git a/myskoda/mqtt.py b/myskoda/mqtt.py index ce2ef0e0..22553ce7 100644 --- a/myskoda/mqtt.py +++ b/myskoda/mqtt.py @@ -28,7 +28,7 @@ EventOperation, EventType, ) -from .models.mqtt import OperationName, OperationRequest, OperationStatus +from .models.operation_request import OperationName, OperationRequest, OperationStatus from .models.user import User from .rest_api import RestApi diff --git a/myskoda/myskoda.py b/myskoda/myskoda.py index ae6910c6..78b12cc5 100644 --- a/myskoda/myskoda.py +++ b/myskoda/myskoda.py @@ -9,7 +9,7 @@ from aiohttp import ClientSession from .event import Event -from .models.mqtt import OperationName +from .models.operation_request import OperationName from .mqtt import Mqtt from .rest_api import RestApi