Skip to main content

Async Python client for QNAP NAS — replaces python-qnapstats

Project description

QNAP NAS Integration for Home Assistant

PyPI version Python 3.12+ License: MIT

Async Python client for QNAP NAS. Replaces the unmaintained python-qnapstats with a fully async, aiohttp-based library with typed models, proper exception handling, Container Station support, and graceful handling of unexpected API responses.

Why This Exists

python-qnapstats hasn't had a meaningful update in years. Fan sensor support and external drive support were added to the source repo but never published to PyPI. The library is synchronous, has no typed return values, and crashes on certain NAS models due to missing key handling.

This library fixes all of that.

Installation

pip install qnap-client

Quick Start

import asyncio
from qnap_client import QnapClient

async def main():
    async with QnapClient("192.168.1.100", 8080, "admin", "password") as client:
        data = await client.get_all()
        print(f"NAS: {data.system_info.name} ({data.system_info.model})")
        print(f"CPU: {data.system_info.cpu_usage_percent:.1f}%")
        print(f"Health: {data.system_health.status}")
        for vol in data.volumes:
            used_pct = vol.used_bytes / vol.total_bytes * 100
            print(f"Volume {vol.name}: {used_pct:.1f}% used")
        if data.firmware_update.latest_version:
            print(f"Firmware update available: {data.firmware_update.latest_version}")

asyncio.run(main())

API Reference

QnapClient

QnapClient(
    host: str,
    port: int,
    username: str,
    password: str,
    *,
    ssl: bool = False,
    verify_ssl: bool = True,
    timeout: int = 10,
    session: aiohttp.ClientSession | None = None,
)
Method Returns Description
login() None Authenticate and store session ID
logout() None Log out and clear session
get_system_info() SystemInfo CPU, memory, firmware version, uptime
get_system_health() SystemHealth Overall health status string
get_network_interfaces() list[NetworkInterface] Per-interface RX/TX rates
get_drive_health() list[DriveHealth] S.M.A.R.T. status + temperature per drive
get_volumes() list[VolumeStats] Storage volume usage
get_firmware_update() FirmwareUpdate Current + latest firmware version
get_fans() list[FanStatus] Fan speed RPM (empty list if unsupported)
get_external_drives() list[ExternalDrive] External USB/eSATA drives
get_all() NasData All of the above in parallel

ContainerStationClient

from qnap_client import ContainerStationClient

async with QnapClient(...) as client:
    cs = ContainerStationClient(client)
    containers = await cs.get_containers()
    await cs.stop_container(containers[0].id)
Method Returns Description
get_containers() list[Container] All containers with id, name, status, image, type
start_container(id, type) None Start a container
stop_container(id, type) None Stop a container
restart_container(id, type) None Restart a container
container_action(id, type, action) None Generic action (start/stop/restart)

Models

Model Fields
SystemInfo name, model, serial_number, firmware_version, uptime_seconds, cpu_usage_percent, memory_total_mb, memory_free_mb, memory_used_mb
SystemHealth status
NetworkInterface name, mac, ip, rx_bytes_per_sec, tx_bytes_per_sec
DriveHealth drive_number, model, health, temperature
VolumeStats name, total_bytes, used_bytes, free_bytes, status
FirmwareUpdate current_version, latest_version (None = up to date)
FanStatus fan_number, speed_rpm
ExternalDrive name, total_bytes, used_bytes, free_bytes
Container id, name, status, image, type
NasData All of the above combined

Exceptions

Exception When
QnapError Base exception
QnapAuthError Bad credentials or session expired
QnapConnectionError NAS unreachable
QnapTimeoutError Request timed out
QnapAPIError Unexpected or malformed API response

HTTPS / Self-Signed Certificates

client = QnapClient("nas.local", 443, "admin", "password", ssl=True, verify_ssl=False)

Home Assistant Integration

This library is the backing library for the QNAP NAS Integration for Home Assistant.

Contributing

PRs welcome. This library is actively maintained. If your QNAP model returns unexpected data, open an issue with the raw API response and we'll fix it.

License

MIT

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

qnap_client-1.0.3.tar.gz (12.3 kB view details)

Uploaded Source

Built Distribution

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

qnap_client-1.0.3-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file qnap_client-1.0.3.tar.gz.

File metadata

  • Download URL: qnap_client-1.0.3.tar.gz
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for qnap_client-1.0.3.tar.gz
Algorithm Hash digest
SHA256 1958906b1bf8ca40570b71c7114cbb29b28f7246ac8249967a916c9575fa1335
MD5 00a583ec9fc5cdf78849efa6558ed6bd
BLAKE2b-256 ffff62443c238ff3dfdbbc8cfdd8978a3da5845005bd97d2a89d38644389e9b6

See more details on using hashes here.

File details

Details for the file qnap_client-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: qnap_client-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for qnap_client-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 fb3d326cd4156777541bd5de17aef1460082c13bcaef2a3a2a2d941b03235314
MD5 e7c9e646ed1bad1d5a4899c625ff5f4d
BLAKE2b-256 9d2c04c90765422f71b7451e16570ec771c02a4dff25fbd7064d05110e7288ed

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