Official Python SDK for the HVAKR API - HVAC load calculation and building analysis.
pip install hvakrfrom hvakr import HVAKRClient
# Initialize the client
client = HVAKRClient(access_token="your-access-token")
# List all projects
projects = client.list_projects()
print(projects) # {"ids": ["project-1", "project-2", ...]}
# Get a specific project
project = client.get_project("project-id")
print(project.name)
# Get expanded project with all subcollections
expanded = client.get_project("project-id", expand=True)
print(expanded.spaces)The SDK also provides an async client for use with asyncio:
import asyncio
from hvakr import AsyncHVAKRClient
async def main():
async with AsyncHVAKRClient(access_token="your-access-token") as client:
projects = await client.list_projects()
print(projects)
asyncio.run(main())Both clients provide the same methods. The async client methods are coroutines that must be awaited.
HVAKRClient(
access_token: str,
base_url: str = "https://api.hvakr.com",
version: str = "v0",
timeout: float = 30.0,
)access_token: Your HVAKR API access tokenbase_url: API base URL (default: "https://api.hvakr.com")version: API version (default: "v0")timeout: Request timeout in seconds (default: 30.0)
List all projects accessible to the authenticated user.
result = client.list_projects()
# Returns: {"ids": ["project-1", "project-2", ...]}Retrieve a project by ID.
# Get basic project data
project = client.get_project("project-id")
# Get expanded project with all subcollections
expanded = client.get_project("project-id", expand=True)Create a new project.
result = client.create_project({
"name": "My New Project",
"address": "123 Main St",
"latitude": 40.7128,
"longitude": -74.0060,
})
# Returns: {"id": "new-project-id"}Update an existing project.
result = client.update_project("project-id", {
"name": "Updated Project Name",
})Delete a project.
result = client.delete_project("project-id")Retrieve calculated outputs for a project.
# Get heating/cooling loads
loads = client.get_project_outputs("project-id", "loads")
# Get dry side graph
graph = client.get_project_outputs("project-id", "dryside_graph")
# Get register schedule
schedule = client.get_project_outputs("project-id", "register_schedule")Search for weather stations near a geographic location.
result = client.search_weather_stations(40.7128, -74.0060)
# Returns: {"weatherStationIds": ["station-1", "station-2", ...]}Retrieve detailed data for a specific weather station.
station = client.get_weather_station("station-id")
print(station.station) # Station name
print(station.climate_zone) # Climate zone
print(station.elevation) # ElevationThe SDK raises HVAKRClientError for API errors:
from hvakr import HVAKRClient, HVAKRClientError
client = HVAKRClient(access_token="your-token")
try:
project = client.get_project("invalid-id")
except HVAKRClientError as e:
print(f"Error {e.status_code}: {e.message}")
print(f"Details: {e.metadata}")The SDK is fully typed and exports Pydantic models for all API responses:
from hvakr import (
HVAKRClient,
Project,
ExpandedProject,
WeatherStationData,
APIProjectOutputLoads,
)
client = HVAKRClient(access_token="your-token")
# Type hints work with IDE autocompletion
project: Project = client.get_project("project-id")
expanded: ExpandedProject = client.get_project("project-id", expand=True)Both clients support context manager protocol for automatic cleanup:
# Sync client
with HVAKRClient(access_token="your-token") as client:
projects = client.list_projects()
# Async client
async with AsyncHVAKRClient(access_token="your-token") as client:
projects = await client.list_projects()# Clone the repository
git clone https://github.com/flowcircuits/hvakr-python.git
cd hvakr-python
# Install dependencies
pip install -e ".[dev]"# Run unit tests
pytest
# Run with coverage
pytest --cov=hvakr
# Run integration tests (requires HVAKR_API_TOKEN)
# Option 1: Use a .env file (recommended)
cp .env.example .env
# Edit .env and add your HVAKR_API_TOKEN
pytest -m integration
# Option 2: Set inline
HVAKR_API_TOKEN=your-token pytest -m integrationmypy src/hvakrruff check src tests
ruff format src testsMIT License - see LICENSE for details.