Skip to main content

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. Returns None for 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_request which 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prana_api_client-0.4.0.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prana_api_client-0.4.0-py3-none-any.whl (5.7 kB view details)

Uploaded Python 3

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

Hashes for prana_api_client-0.4.0.tar.gz
Algorithm Hash digest
SHA256 a34d5293c3f1e9b6cb8a3cb408d1da3666449f6e7cf30e9b9ad89b287969ee7a
MD5 e78dd0361318ef236e0673ce65d63e17
BLAKE2b-256 89bc0961d86e58cfec8b9b24bb9fd08df809ff8d6b8f3339bb9b43c1f151fb6a

See more details on using hashes here.

File details

Details for the file prana_api_client-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for prana_api_client-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 527b30fe1cfebe962b3242cfa9cc3bd8ac3a4d3b7f6bce02bd4f3b3c1d63006a
MD5 0b92cac14661b6e6ebfd3eb2d8ea4b97
BLAKE2b-256 2b1a38ef3cdedc7b83e4835e0a68421b38226ea8784f95540f6408e5ab17cd55

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page