Skip to content

Commit

Permalink
split models and add abstract methods to base class
Browse files Browse the repository at this point in the history
  • Loading branch information
jschlyter committed Jun 25, 2024
1 parent 82e4f40 commit a280c61
Show file tree
Hide file tree
Showing 3 changed files with 183 additions and 104 deletions.
185 changes: 83 additions & 102 deletions chargeamps/base.py
Original file line number Diff line number Diff line change
@@ -1,104 +1,85 @@
"""Base class and data classes for ChargeAmps API"""
"""Base class for ChargeAmps API"""

from abc import ABCMeta
from dataclasses import dataclass
from abc import ABCMeta, abstractmethod
from datetime import datetime
from typing import List, Optional

from dataclasses_json import LetterCase, dataclass_json

from .utils import datetime_field


class ChargeAmpsClient(metaclass=ABCMeta): # noqa
pass


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointConnector:
charge_point_id: str
connector_id: int
type: str


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePoint:
id: str
name: str
password: str
type: str
is_loadbalanced: bool
firmware_version: str
hardware_version: str
connectors: List[ChargePointConnector]


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointMeasurement:
phase: str
current: float
voltage: float


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointConnectorStatus:
charge_point_id: str
connector_id: int
total_consumption_kwh: float
status: str
measurements: Optional[List[ChargePointMeasurement]]
start_time: Optional[datetime] = datetime_field()
end_time: Optional[datetime] = datetime_field()
session_id: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointStatus:
id: str
status: str
connector_statuses: List[ChargePointConnectorStatus]


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=False)
class ChargePointSettings:
id: str
dimmer: str
down_light: bool


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=False)
class ChargePointConnectorSettings:
charge_point_id: str
connector_id: int
mode: str
rfid_lock: bool
cable_lock: bool
max_current: Optional[float] = None


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargingSession:
id: str
charge_point_id: str
connector_id: int
session_type: str
total_consumption_kwh: float
start_time: Optional[datetime] = datetime_field()
end_time: Optional[datetime] = datetime_field()


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class StartAuth:
rfid_length: int
rfid_format: str
rfid: str
external_transaction_id: str
from typing import Optional

from .models import (
ChargePoint,
ChargePointConnectorSettings,
ChargePointSettings,
ChargePointStatus,
ChargingSession,
StartAuth,
)


class ChargeAmpsClient(metaclass=ABCMeta):
@abstractmethod
async def shutdown(self):
pass

@abstractmethod
async def get_chargepoints(self) -> list[ChargePoint]:
"""Get all owned chargepoints"""
pass

@abstractmethod
async def get_all_chargingsessions(
self,
charge_point_id: str,
start_time: Optional[datetime] = None,
end_time: Optional[datetime] = None,
) -> list[ChargingSession]:
"""Get all charging sessions"""
pass

@abstractmethod
async def get_chargingsession(
self, charge_point_id: str, session: int
) -> ChargingSession:
"""Get charging session"""
pass

@abstractmethod
async def get_chargepoint_status(self, charge_point_id: str) -> ChargePointStatus:
"""Get charge point status"""
pass

@abstractmethod
async def get_chargepoint_settings(
self, charge_point_id: str
) -> ChargePointSettings:
"""Get chargepoint settings"""
pass

@abstractmethod
async def set_chargepoint_settings(self, settings: ChargePointSettings) -> None:
"""Set chargepoint settings"""
pass

@abstractmethod
async def get_chargepoint_connector_settings(
self, charge_point_id: str, connector_id: int
) -> ChargePointConnectorSettings:
"""Get all owned chargepoints"""
pass

@abstractmethod
async def set_chargepoint_connector_settings(
self, settings: ChargePointConnectorSettings
) -> None:
"""Get all owned chargepoints"""
pass

@abstractmethod
async def remote_start(
self, charge_point_id: str, connector_id: int, start_auth: StartAuth
) -> None:
"""Remote start chargepoint"""
pass

@abstractmethod
async def remote_stop(self, charge_point_id: str, connector_id: int) -> None:
"""Remote stop chargepoint"""
pass
4 changes: 2 additions & 2 deletions chargeamps/external.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import jwt
from aiohttp import ClientResponse, ClientSession

from .base import (
ChargeAmpsClient,
from .base import ChargeAmpsClient
from .models import (
ChargePoint,
ChargePointConnectorSettings,
ChargePointSettings,
Expand Down
98 changes: 98 additions & 0 deletions chargeamps/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""Data classes for ChargeAmps API"""

from dataclasses import dataclass
from datetime import datetime

from dataclasses_json import LetterCase, dataclass_json

from .utils import datetime_field


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointConnector:
charge_point_id: str
connector_id: int
type: str


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePoint:
id: str
name: str
password: str
type: str
is_loadbalanced: bool
firmware_version: str
hardware_version: str
connectors: list[ChargePointConnector]


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointMeasurement:
phase: str
current: float
voltage: float


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointConnectorStatus:
charge_point_id: str
connector_id: int
total_consumption_kwh: float
status: str
measurements: list[ChargePointMeasurement] | None
start_time: datetime | None = datetime_field()
end_time: datetime | None = datetime_field()
session_id: str | None = None


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargePointStatus:
id: str
status: str
connector_statuses: list[ChargePointConnectorStatus]


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=False)
class ChargePointSettings:
id: str
dimmer: str
down_light: bool


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=False)
class ChargePointConnectorSettings:
charge_point_id: str
connector_id: int
mode: str
rfid_lock: bool
cable_lock: bool
max_current: float | None = None


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class ChargingSession:
id: str
charge_point_id: str
connector_id: int
session_type: str
total_consumption_kwh: float
start_time: datetime | None = datetime_field()
end_time: datetime | None = datetime_field()


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass(frozen=True)
class StartAuth:
rfid_length: int
rfid_format: str
rfid: str
external_transaction_id: str

0 comments on commit a280c61

Please sign in to comment.