Moved to uv and aiohttp

This commit is contained in:
2025-10-29 14:52:18 +01:00
parent 50e85f3d5b
commit 450d583421
11 changed files with 653 additions and 1086 deletions

View File

@@ -1,4 +1,4 @@
import requests
import aiohttp
from datetime import datetime, timedelta
from loguru import logger
@@ -20,7 +20,6 @@ class HttpClientException(ClientException):
return "["+str(self.http_code)+"] - " + self.message
class Client():
def __init__(self, username, api_key) -> None:
self.host = "https://api.rapt.io"
@@ -30,36 +29,40 @@ class Client():
self.expires_seconds = None
self.expires = None
def get_jwt_token(self):
url = "https://id.rapt.io/connect/token"
response = requests.post(url, data={
"client_id": "rapt-user",
"grant_type": "password",
"username": self.username,
"password": self.api_key
})
if response.status_code == 200:
response_json = response.json()
self.token = response_json["access_token"]
self.expires_seconds = response_json["expires_in"]
self.expires = datetime.now() + timedelta(seconds=self.expires_seconds)
logger.trace("Expires: " + str(self.expires))
else:
raise HttpClientException(response.reason, response.status_code)
async def get_jwt_token(self):
async with aiohttp.ClientSession() as session:
url = "https://id.rapt.io/connect/token"
async with session.post(url, data={
"client_id": "rapt-user",
"grant_type": "password",
"username": self.username,
"password": self.api_key
}) as response:
def get_auth_headers(self):
response_json = await response.json()
if response.status == 200:
self.token = response_json["access_token"]
self.expires_seconds = response_json["expires_in"]
self.expires = datetime.now() + timedelta(seconds=self.expires_seconds)
logger.trace("Expires: " + str(self.expires))
else:
raise HttpClientException(response.reason, response.status)
async def get_auth_headers(self):
#TODO: Check expiry
if self.expires is None or self.expires <= datetime.now():
self.get_jwt_token()
await self.get_jwt_token()
return {"Authorization": "Bearer {}".format(self.token)}
def get_json(self, url, parameters):
headers = self.get_auth_headers()
response = requests.get(self.host+url, headers=headers, params=parameters)
logger.trace(response.request.url)
if response.status_code == 200:
return response.json()
else:
raise HttpClientException(response.reason, response.status_code)
async def get_json(self, url, parameters):
headers = await self.get_auth_headers()
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, params=parameters) as response:
response_json = await response.json()
logger.trace(response.request_info.url)
if response.status == 200:
return response_json
else:
raise HttpClientException(response.reason, response.status)

View File

@@ -9,10 +9,10 @@ class FermentationChamber():
def __init__(self, client) -> None:
self.client = client
def get_fermentation_chambers(self) -> Optional[List[FermentationChamberModel]]:
async def get_fermentation_chambers(self) -> Optional[List[FermentationChamberModel]]:
logger.debug("## GET FERMENTATION CHAMBERS ##")
try:
response_json = self.client.get_json("/api/fermentationchambers/getfermentationchambers", None)
response_json = await self.client.get_json("/api/fermentationchambers/getfermentationchambers", None)
logger.trace(response_json)
fermentation_chambers_adapter = TypeAdapter(list[FermentationChamberModel])
return fermentation_chambers_adapter.validate_python(response_json)
@@ -20,13 +20,13 @@ class FermentationChamber():
#TODO: Handle Exception gracefully
return None
def get_fermentation_chamber(self, fermentation_chamber_id) -> Optional[FermentationChamberModel]:
async def get_fermentation_chamber(self, fermentation_chamber_id) -> Optional[FermentationChamberModel]:
logger.debug("## GET FERMENTATION CHAMBER ##")
params = {
"fermentationChamberId": fermentation_chamber_id
}
try:
response_json = self.client.get_json("/api/fermentationchambers/getfermentationchamber", params)
response_json = await self.client.get_json("/api/fermentationchambers/getfermentationchamber", params)
logger.trace(response_json)
return FermentationChamberModel.model_validate(response_json)
except ClientException:
@@ -34,7 +34,7 @@ class FermentationChamber():
return None
def get_telemetry(self, fermentation_chamber_id, start_date, end_date, profile_session_id) -> Optional[List[FermentationChamberTelemetryModel]]:
async def get_telemetry(self, fermentation_chamber_id, start_date, end_date, profile_session_id) -> Optional[List[FermentationChamberTelemetryModel]]:
logger.debug("## GET TELEMETRY ##")
params = {
"fermentationChamberId": fermentation_chamber_id,
@@ -43,7 +43,7 @@ class FermentationChamber():
"profileSessionId": profile_session_id
}
try:
response_json = self.client.get_json("/api/fermentationchambers/gettelemetry", params)
response_json = await self.client.get_json("/api/fermentationchambers/gettelemetry", params)
logger.trace(response_json)
fermentation_chambers_adapter = TypeAdapter(list[FermentationChamberTelemetryModel])
return fermentation_chambers_adapter.validate_python(response_json)

View File

@@ -9,10 +9,10 @@ class Hydrometer():
def __init__(self, client) -> None:
self.client = client
def get_hydrometers(self) -> Optional[List[HydrometerModel]]:
async def get_hydrometers(self) -> Optional[List[HydrometerModel]]:
logger.debug("## GET HYDROMETERS ##")
try:
response_json = self.client.get_json("/api/hydrometers/gethydrometers", None)
response_json = await self.client.get_json("/api/hydrometers/gethydrometers", None)
logger.trace(response_json)
hydrometers_adapter = TypeAdapter(list[HydrometerModel])
return hydrometers_adapter.validate_python(response_json)
@@ -20,13 +20,13 @@ class Hydrometer():
#TODO: Handle Exception gracefully
return None
def get_hydrometer(self, hydrometer_id) -> Optional[HydrometerModel]:
async def get_hydrometer(self, hydrometer_id) -> Optional[HydrometerModel]:
logger.debug("## GET HYDROMETER ##")
params = {
"hydrometerId": hydrometer_id
}
try:
response_json = self.client.get_json("/api/hydrometers/gethydrometer", params)
response_json = await self.client.get_json("/api/hydrometers/gethydrometer", params)
logger.trace(response_json)
return HydrometerModel.model_validate(response_json)
except ClientException:
@@ -34,7 +34,7 @@ class Hydrometer():
return None
def get_telemetry(self, hydrometer_id, start_date, end_date, profile_session_id) -> Optional[List[HydrometerTelemetryModel]]:
async def get_telemetry(self, hydrometer_id, start_date, end_date, profile_session_id) -> Optional[List[HydrometerTelemetryModel]]:
logger.debug("## GET TELEMETRY ##")
params = {
"hydrometerId": hydrometer_id,
@@ -43,7 +43,7 @@ class Hydrometer():
"profileSessionId": profile_session_id
}
try:
response_json = self.client.get_json("/api/hydrometers/gettelemetry", params)
response_json = await self.client.get_json("/api/hydrometers/gettelemetry", params)
logger.trace(response_json)
hydrometers_adapter = TypeAdapter(list[HydrometerTelemetryModel])
return hydrometers_adapter.validate_python(response_json)