import requests
from typing import Dict, List, Optional
from datetime import datetime, timedelta
class I3XAPIClient:
def __init__(self, base_url: str, credentials: Dict[str, str]):
self.base_url = base_url
self.token = self._authenticate(credentials)
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {self.token}',
'Content-Type': 'application/json'
})
def _authenticate(self, credentials: Dict[str, str]) -> str:
response = requests.post(
f'{self.base_url}/auth/token',
json=credentials
)
response.raise_for_status()
return response.json()['access_token']
def get_objects(self, type_id: Optional[str] = None) -> List[Dict]:
params = {}
if type_id:
params['typeId'] = type_id
response = self.session.get(
f'{self.base_url}/objects',
params=params
)
response.raise_for_status()
return response.json()
def get_object_value(
self,
element_id: str,
max_depth: int = 1
) -> Dict:
response = self.session.post(
f'{self.base_url}/objects/value',
json={
'elementId': element_id,
'maxDepth': max_depth
}
)
response.raise_for_status()
return response.json()
def get_object_history(
self,
element_id: str,
start_time: Optional[datetime] = None,
end_time: Optional[datetime] = None
) -> Dict:
payload = {'elementId': element_id}
if start_time:
payload['startTime'] = start_time.isoformat() + 'Z'
if end_time:
payload['endTime'] = end_time.isoformat() + 'Z'
response = self.session.post(
f'{self.base_url}/objects/history',
json=payload
)
response.raise_for_status()
return response.json()
client = I3XAPIClient(
'https://api.i3x.dev/v0',
{'username': 'user', 'password': 'pass'}
)
objects = client.get_objects()
value = client.get_object_value(objects[0]['elementId'])
history = client.get_object_history(
objects[0]['elementId'],
start_time=datetime.now() - timedelta(hours=1)
)