Async API client for Prana heat recovery ventilator.
Project description
Prana Local API Client
Prana Local API Client is a small asynchronous Python library to interact with a local HTTP API exposed by a Prana device. It uses aiohttp and provides a simple interface to read device state and send control commands.
Requirements
- Python 3.9+
- aiohttp
Install dependencies:
pip install aiohttp
Overview
Primary class: PranaLocalApiClient
Constructor:
PranaLocalApiClient(host: str, port: int = 80)
Behavior summary:
- Uses an aiohttp ClientSession. You can provide/retain a session by using the client as an async context manager (
async with) or let the client create and close a temporary session for each call. - Requests use a total timeout of 10 seconds.
- Non-200 HTTP responses raise
PranaApiUpdateFailed. - Network errors and timeouts raise
PranaApiCommunicationError.
API (async)
-
async def get_state() -> dict[str, Any] | None- GET /getState
- Returns parsed JSON when the server responds with
application/json. ReturnsNonefor responses without JSON body.
-
async def set_speed(speed: int, fan_type: str) -> None- POST /setSpeed
- JSON body:
{"speed": speed, "fanType": fan_type}
-
async def set_switch(switch_type: str, value: bool) -> None- POST /setSwitch
- JSON body:
{"switchType": switch_type, "value": value}
-
async def set_brightness(brightness: int) -> None- POST /setBrightness
- JSON body:
{"brightness": brightness}
Notes:
- All methods call a shared internal
_async_requestwhich handles creating/closing sessions when needed, error handling and JSON parsing.
Exceptions
The library exposes a small exception hierarchy in prana_local_api_client.exceptions:
PranaApiClientException— base exception class.PranaApiCommunicationError— network-level issues (wrapping aiohttp ClientError / timeout).PranaApiUpdateFailed(status: int)— HTTP request completed but device returned non-200 status.
Example of catching errors:
from prana_local_api_client.exceptions import PranaApiCommunicationError, PranaApiUpdateFailed
try:
state = await client.get_state()
except PranaApiUpdateFailed as e:
# HTTP-level error (server returned non-200)
print("Device returned error status:", getattr(e, "status", None))
except PranaApiCommunicationError as e:
# Network/timeout/etc.
print("Communication error:", e)
Usage examples
Using the client as a context manager (recommended when performing multiple requests):
import asyncio
from prana_local_api_client.prana_api_client import PranaLocalApiClient
async def main():
async with PranaLocalApiClient("192.168.1.100", 80) as client:
state = await client.get_state()
await client.set_speed(3, fan_type="main")
await client.set_switch("power", True)
await client.set_brightness(70)
asyncio.run(main())
Using the client without context manager (client will create and close a session per call):
from prana_local_api_client.prana_api_client import PranaLocalApiClient
import asyncio
async def short_run():
client = PranaLocalApiClient("192.168.1.100")
# session will be created internally for each call and closed afterwards
state = await client.get_state()
print(state)
asyncio.run(short_run())
Logging and debugging
The module uses a logger under its package name. Enable debugging in your application to see detailed logs:
import logging
logging.basicConfig(level=logging.DEBUG)
Timeouts and retries
- Default request timeout is 10 seconds (ClientTimeout(total=10)).
- This library does not implement automatic retries. If you need retries, implement them in your caller code (e.g., with tenacity) or wrap calls in retry logic.
Type hints
The client uses Python 3.9+ type hints (dict[str, Any]). Adjust your type checks accordingly.
Contributing
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prana_api_client-0.4.0.tar.gz.
File metadata
- Download URL: prana_api_client-0.4.0.tar.gz
- Upload date:
- Size: 4.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a34d5293c3f1e9b6cb8a3cb408d1da3666449f6e7cf30e9b9ad89b287969ee7a
|
|
| MD5 |
e78dd0361318ef236e0673ce65d63e17
|
|
| BLAKE2b-256 |
89bc0961d86e58cfec8b9b24bb9fd08df809ff8d6b8f3339bb9b43c1f151fb6a
|
File details
Details for the file prana_api_client-0.4.0-py3-none-any.whl.
File metadata
- Download URL: prana_api_client-0.4.0-py3-none-any.whl
- Upload date:
- Size: 5.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
527b30fe1cfebe962b3242cfa9cc3bd8ac3a4d3b7f6bce02bd4f3b3c1d63006a
|
|
| MD5 |
0b92cac14661b6e6ebfd3eb2d8ea4b97
|
|
| BLAKE2b-256 |
2b1a38ef3cdedc7b83e4835e0a68421b38226ea8784f95540f6408e5ab17cd55
|